From bc94649007f91a7087f45390b5a86a59dc15343d Mon Sep 17 00:00:00 2001 From: Hariharan Devarajan Date: Thu, 6 Nov 2025 16:34:57 -0800 Subject: [PATCH 1/6] feat: arg parsing improvements and lustre configurations 1. Enhance argument parsing and logging, add UTF-8 character removal, and update dependency handling 2. Tested Lustre configurations 3. Improved validation case to handle all cases 4. reduced logging to avoid blowing up log files --- .vscode/settings.json | 3 - CMakeLists.txt | 6 +- cmake/modules/datacrumbs-utils.cmake | 9 +- etc/datacrumbs/configs/lead.yaml | 33 +++- .../data/probes-exclusion-haridev-lead.json | 2 +- etc/datacrumbs/data/probes-haridev-lead.json | 2 +- .../data/probes-invalid-haridev-lead.json | 2 +- notes.MD | 23 ++- scripts/datacrumbs/datacrumbs_args.in | 38 +++-- scripts/datacrumbs/datacrumbs_compose.in | 2 +- .../datacrumbs/datacrumbs_create_log_dir.in | 16 +- .../datacrumbs/datacrumbs_run_validator.in | 8 + scripts/datacrumbs/datacrumbs_utility.in | 77 +++++----- .../common/configuration_manager.cpp | 4 +- src/datacrumbs/common/logging.h | 39 ++++- src/datacrumbs/common/utils.h | 61 ++++++++ src/datacrumbs/composable/CMakeLists.txt.in | 43 +++++- .../explorer/mechanism/elf_capture.cpp | 2 +- .../server/process/event_processor.cpp | 11 +- src/datacrumbs/validator/probe_validator.cpp | 144 ++++++++++++++++-- valgrind.supp | 34 +++++ 21 files changed, 469 insertions(+), 90 deletions(-) create mode 100644 valgrind.supp diff --git a/.vscode/settings.json b/.vscode/settings.json index 4048a73d..6d343ec1 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,4 @@ { - "cmake.configureArgs": [ - "-DCMAKE_PREFIX_PATH=/home/cc/datacrumbs/dependency/.spack-env/view" - ], "editor.formatOnSave": true, "files.associations": { "string": "cpp", diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f26e1fc..77277f42 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -795,15 +795,15 @@ if(NOT DATACRUMBS_INCLUSION_PATH STREQUAL "NONE") set(DATACRUMBS_VARS ${DATACRUMBS_VARS} --inclusion_path ${DATACRUMBS_INCLUSION_PATH}) endif() -add_test(NAME datacrumbs_start COMMAND ${DATACRUMBS_PATH}/datacrumbs start ${DATACRUMBS_HOST} ${DATACRUMBS_VARS}) +add_test(NAME datacrumbs_start COMMAND ${DATACRUMBCMAKE_RUNTIME_OUTPUT_DIRECTORYS_PATH}/datacrumbs start ${DATACRUMBS_HOST} ${DATACRUMBS_VARS}) set_tests_properties(datacrumbs_start PROPERTIES DEPENDS datacrumbs_pretest) set_tests_properties(datacrumbs_start PROPERTIES DEPENDS ${PROJECT_NAME}) -add_test(NAME datacrumbs_run COMMAND ${DATACRUMBS_PATH}/datacrumbs run ${DATACRUMBS_HOST} ${DATACRUMBS_VARS}) +add_test(NAME datacrumbs_run COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/datacrumbs run ${DATACRUMBS_HOST} ${DATACRUMBS_VARS}) set_tests_properties(datacrumbs_run PROPERTIES DEPENDS datacrumbs_pretest) set_tests_properties(datacrumbs_run PROPERTIES DEPENDS ${PROJECT_NAME}) -add_test(NAME datacrumbs_stop COMMAND ${DATACRUMBS_PATH}/datacrumbs stop ${DATACRUMBS_HOST} ${DATACRUMBS_VARS}) +add_test(NAME datacrumbs_stop COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/datacrumbs stop ${DATACRUMBS_HOST} ${DATACRUMBS_VARS}) set_tests_properties(datacrumbs_stop PROPERTIES DEPENDS datacrumbs_pretest) set_tests_properties(datacrumbs_stop PROPERTIES DEPENDS ${PROJECT_NAME}) diff --git a/cmake/modules/datacrumbs-utils.cmake b/cmake/modules/datacrumbs-utils.cmake index 8653cdd4..eb68d0a1 100644 --- a/cmake/modules/datacrumbs-utils.cmake +++ b/cmake/modules/datacrumbs-utils.cmake @@ -31,6 +31,8 @@ macro(include_dependencies) message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] libbpf version 1.0.0 or newer is required, but found ${LIBBPF_VERSION}") endif() + set(PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}) + # include all links if(LIBBPF_FOUND) include_directories(${LIBBPF_INCLUDEDIR}) @@ -94,7 +96,7 @@ macro(include_dependencies) if(json-c_FOUND) get_filename_component(json-c_INCLUDE_DIR "${json-c_DIR}/../../../include" ABSOLUTE) get_filename_component(json-c_LIBRARY_DIR "${json-c_DIR}/../../" ABSOLUTE) - include_directories(json-c::json-c) + include_directories(${json-c_INCLUDE_DIR}) list(APPEND DEPENDENCY_LIBRARY_DIRS ${json-c_LIBRARY_DIR}) set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -ljson-c) else() @@ -105,7 +107,7 @@ macro(include_dependencies) include_directories(${ZLIB_INCLUDE_DIRS}) get_filename_component(ZLIB_LIBRARY_DIRS "${ZLIB_LIBRARIES}/../" ABSOLUTE) list(APPEND DEPENDENCY_LIBRARY_DIRS ${ZLIB_LIBRARY_DIRS}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} ZLIB::ZLIB) + set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -lz) else() message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] zlib is needed for ${PROJECT_NAME} build") endif() @@ -119,11 +121,13 @@ macro(include_dependencies) if(MPI_CXX_LIBRARIES) # If MPI_CXX_LIBRARIES is a list, get parent dir of each library set(MPI_CXX_LIBRARY_DIR "") + foreach(_lib ${MPI_CXX_LIBRARIES}) get_filename_component(_lib_dir "${_lib}" DIRECTORY) get_filename_component(_lib_dir "${_lib_dir}" ABSOLUTE) list(APPEND MPI_CXX_LIBRARY_DIR "${_lib_dir}") endforeach() + list(REMOVE_DUPLICATES MPI_CXX_LIBRARY_DIR) else() get_filename_component(MPI_CXX_LIBRARY_DIR "${MPI_CXX_LIBRARIES}" DIRECTORY) @@ -152,6 +156,7 @@ macro(include_dependencies) string(REPLACE ";" ":" DEPENDENCY_LIBRARY_DIRS_COLON "${DEPENDENCY_LIBRARY_DIRS}") set(CMAKE_INSTALL_RPATH "${DEPENDENCY_LIBRARY_DIRS}") set(CMAKE_BUILD_RPATH "${DEPENDENCY_LIBRARY_DIRS}") + # print_all_variables() endmacro(include_dependencies) diff --git a/etc/datacrumbs/configs/lead.yaml b/etc/datacrumbs/configs/lead.yaml index 1b0528d3..16c5f971 100755 --- a/etc/datacrumbs/configs/lead.yaml +++ b/etc/datacrumbs/configs/lead.yaml @@ -20,7 +20,28 @@ capture_probes: probe: kprobe type: binary file: /usr/lib/modules/5.14.0-570.55.1.1toss.t5.x86_64/weak-updates/lustre/fs/lustre.ko - - name: mpiio + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + - name: mdc + probe: kprobe + type: binary + file: /usr/lib/modules/5.14.0-570.55.1.1toss.t5.x86_64/weak-updates/lustre/fs/mdc.ko + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + - name: mgc + probe: kprobe + type: binary + file: /usr/lib/modules/5.14.0-570.55.1.1toss.t5.x86_64/weak-updates/lustre/fs/mgc.ko + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + - name: osc + probe: kprobe + type: binary + file: /usr/lib/modules/5.14.0-570.55.1.1toss.t5.x86_64/weak-updates/lustre/fs/osc.ko + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + - name: ptlrpc + probe: kprobe + type: binary + file: /usr/lib/modules/5.14.0-570.55.1.1toss.t5.x86_64/weak-updates/lustre/fs/ptlrpc.ko + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + - name: mpi probe: uprobe type: binary file: /opt/toss/openmpi/4.1/gnu/lib/libmpi.so @@ -29,4 +50,12 @@ capture_probes: probe: uprobe type: binary file: /home/haridev/software/ior/install/bin/ior - regex: .* \ No newline at end of file + regex: .* + - name: iomap + probe: kprobe + type: ksym + regex: ^iomap(?!.*cold).* + - name: xfs + probe: kprobe + type: ksym + regex: ^xfs(?!.*cold).* \ No newline at end of file diff --git a/etc/datacrumbs/data/probes-exclusion-haridev-lead.json b/etc/datacrumbs/data/probes-exclusion-haridev-lead.json index cb5c8f92..f80a1fce 100644 --- a/etc/datacrumbs/data/probes-exclusion-haridev-lead.json +++ b/etc/datacrumbs/data/probes-exclusion-haridev-lead.json @@ -1 +1 @@ -[{"type":4,"name":"custom1","functions":[],"bpf_path":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c","start_event_id":100000,"process_header":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h","event_type":2},{"type":0,"name":"sys","functions":["fork","sys","ioctl","newfstatat","ni_syscall","old_mmap","old_select","io_getevents","io_getevents_time32","io_pgetevents","io_pgetevents_time32","epoll_create1","epoll_ctl","epoll_pwait","epoll_pwait2","ioprio_set","ioprio_get","umount","mount","pivot_root","chroot","vhangup","pipe2","quotactl","quotactl_fd","getdents64","pselect6","pselect6_time32","ppoll","ppoll_time32","signalfd4","vmsplice","splice","tee","timerfd_create","timerfd_settime","timerfd_gettime","timerfd_gettime32","timerfd_settime32","utimensat","utimensat_time32","acct","capget","capset","personality","waitid","set_tid_address","unshare","futex","futex_time32","get_robust_list","set_robust_list","futex_waitv","futex_wake","futex_wait","futex_requeue","nanosleep","nanosleep_time32","getitimer","setitimer","kexec_load","init_module","delete_module","timer_create","timer_gettime","timer_getoverrun","timer_settime","timer_delete","clock_settime","clock_gettime","clock_getres","clock_nanosleep","timer_gettime32","timer_settime32","clock_settime32","clock_gettime32","clock_getres_time32","clock_nanosleep_time32","syslog","ptrace","sched_setparam","sched_setscheduler","sched_getscheduler","sched_getparam","sched_setaffinity","sched_getaffinity","sched_yield","sched_get_priority_max","sched_get_priority_min","sched_rr_get_interval","sched_rr_get_interval_time32","restart_syscall","kill","tkill","tgkill","sigaltstack","rt_sigsuspend","rt_sigaction","rt_sigprocmask","rt_sigpending","rt_sigtimedwait","rt_sigtimedwait_time32","rt_sigqueueinfo","setpriority","getpriority","reboot","setregid","setgid","setreuid","setuid","setresuid","getresuid","setresgid","getresgid","setfsuid","setfsgid","times","setpgid","getpgid","getsid","setsid","getgroups","setgroups","newuname","sethostname","setdomainname","getrlimit","setrlimit","getrusage","umask","prctl","getcpu","gettimeofday","settimeofday","adjtimex","adjtimex_time32","getpid","getppid","getuid","geteuid","getgid","getegid","gettid","sysinfo","mq_open","mq_unlink","mq_timedsend","mq_timedreceive","mq_notify","mq_getsetattr","mq_timedreceive_time32","mq_timedsend_time32","msgget","old_msgctl","msgctl","msgrcv","msgsnd","semget","semctl","old_semctl","semtimedop","semtimedop_time32","semop","shmget","old_shmctl","shmctl","shmat","shmdt","socket","socketpair","bind","listen","accept","connect","getsockname","getpeername","sendto","recvfrom","setsockopt","getsockopt","shutdown","sendmsg","recvmsg","readahead","brk","add_key","request_key","keyctl","clone","clone3","execve","swapon","swapoff","get_mempolicy","set_mempolicy","rt_tgsigqueueinfo","perf_event_open","accept4","recvmmsg","recvmmsg_time32","wait4","prlimit64","name_to_handle_at","open_by_handle_at","clock_adjtime","clock_adjtime32","setns","sendmmsg","kcmp","finit_module","sched_setattr","sched_getattr","renameat2","seccomp","getrandom","memfd_create","bpf","execveat","userfaultfd","membarrier","mlock2","pkey_mprotect","pkey_alloc","pkey_free","rseq","open_tree","move_mount","mount_setattr","fsopen","fsconfig","fsmount","fspick","pidfd_send_signal","pidfd_getfd","landlock_create_ruleset","landlock_add_rule","landlock_restrict_self","memfd_secret","set_mempolicy_home_node","cachestat","map_shadow_stack","ioperm","pciconfig_read","pciconfig_write","pciconfig_iobase","spu_run","spu_create","chmod","chown","lchown","epoll_create","eventfd","signalfd","sendfile","alarm","getpgrp","pause","time","time32","futimesat_time32","utime32","utimes_time32","select","poll","epoll_wait","recv","send","oldumount","uselib","stime","stime32","sigpending","sigprocmask","sgetmask","ssetmask","signal","nice","kexec_file_load","waitpid","socketcall","old_readdir","gethostname","uname","olduname","ipc"]},{"type":2,"name":"libc","functions":["fnmatch@@GLIBC_2.2.5","sched_getaffinity@@GLIBC_2.3.4","getgrnam_r@@GLIBC_2.2.5","sysctl@GLIBC_2.2.5","forkpty@@GLIBC_2.34","getpwnam_r@@GLIBC_2.2.5","getgrgid_r@@GLIBC_2.2.5","openpty@@GLIBC_2.34","fdetach@GLIBC_2.2.5","gai_error@GLIBC_2.2.5","res_send@@GLIBC_2.34","putmsg@GLIBC_2.2.5","fmemopen@GLIBC_2.2.5","forkpty@GLIBC_2.2.5","getpwuid_r@@GLIBC_2.2.5","res_mailok@@GLIBC_2.34","getspnam_r@@GLIBC_2.2.5","quick_exit@@GLIBC_2.24","logwtmp@@GLIBC_2.34","logout@@GLIBC_2.34","fopencookie@@GLIBC_2.2.5","gai_cancel@@GLIBC_2.34","glob64@GLIBC_2.2.5","getgrent_r@@GLIBC_2.2.5","_getopt_internal_r","frexpf128","res_search@@GLIBC_2.34","_nl_select_era_entry","finitef128_do_not_use","copysignf32x","gai_error@@GLIBC_2.34","copysignf32","getmsg@GLIBC_2.2.5","_nl_get_walt_digit","_create_xid","sstk@GLIBC_2.2.5","_nl_cleanup_time","_itoa_word","_nl_unload_domain","_getopt_long_r","getspent_r@@GLIBC_2.2.5","_getopt_long_only_r","_option_is_end","_IO_str_count","_nl_cleanup_ctype","_des_crypt","_getopt_internal","_openchild","re_string_realloc_buffers","context_reuse","hex2bin","x_putint32","x_getpostn","gai_suspend@@GLIBC_2.34","duplicate_node","bin2hex","tr_break@GLIBC_2.2.5","_nl_init_era_entries.part.0","exec_comm","gethostbyname2_r@@GLIBC_2.2.5","_nl_make_l10nflist.localalias","_nl_find_msg","gethostent_r@@GLIBC_2.2.5","start_thread","get_kernel_syms@GLIBC_2.2.5","get_scope","add_prefixlist","match_prefix","in6aicmp","fini","exchange","parse_branch","parse_expression","authdes_nextverf","re_search_internal","gr_map_free","merge_state_with_log","until_short","get_subexp_sub","clean_state_log_if_needed","canon_doc_option","extend_buffers","check_arrival_expand_ecl_sub","check_node_accept_bytes","sub_epsilon_src_nodes","harmless","pmap_rmtcall@GLIBC_2.2.5","merge_state_array","re_acquire_state_context","w_addword","check_dst_limits","check_halt_state_context","context_send_common","utf8_encode.part.0","build_charclass","pop_fail_stack","time_ifunc","match_ctx_clean","re_dfa_add_node","free_charset","build_upper_buffer","re_node_set_add_intersect","free_state","search_cur_bkref_entry","re_node_set_compare","print_and_abort","internal_getgrouplist","clear_once_control","send_vc","shm_open@GLIBC_2.2.5","fstab_init","lio_listio64@@GLIBC_2.34","_nl_init_alt_digit","parse_rule","free_tree","parse_offset","decode_name","argp_hol","x_putbytes","strcspn_ifunc","ext_match","compute_change","ranged_convert","ydhms_diff","name_to_database_index","binary_hnok","memchr_ifunc","get_mnt_entry","end_pattern","str_append","ptrlist_add__","critical_factorization","argp_doc","gethosts","read_alias_file","authnone_validate","ldexpf32","memcmp_ifunc","strrchr_ifunc","strncat_ifunc","strlen_ifunc","gai_suspend@GLIBC_2.2.5","strcpy_ifunc","re_string_context_at","_int_realloc","next_line","sysmalloc","arena_get_retry","arena_get2.part.0","fetch_number","register_state","des_setparity@GLIBC_2.2.5","ptmalloc_init.part.0","process_long_option","internal_fallocate64","build_wcs_upper_buffer","try_file","get_locked_global","key_call_socket","read_conf_file.isra.0","change_sigmask","check_arrival_expand_ecl","resolv_conf_matches","calc_eclosure_iter","arg_bool","duplicate_node_closure","strspn_ifunc","fts_build","prefixcmp","get_nprocs_cpu_online","initshells","fstab_free","add_request_to_runlist","duplicate_tree","tdestroy_recurse","strpbrk_ifunc","peek_token","glob@GLIBC_2.2.5","argp_args_levels.isra.0","strcmp_ifunc","array_add__","x_setpostn","authdes_refresh","fstab_convert","create_token_tree","realpath_stk","authdes_marshal","check_arrival","fts_alloc.isra.0","internal_fnmatch","x_putlong","expand_bkref_cache","msgctl@@GLIBC_2.2.5","pmap_getport@GLIBC_2.2.5","quick_exit@GLIBC_2.10","authnone_verf","get_next_alias","freeres","sock_eq","hol_cousin_cluster_cmp.isra.0","ftw_dir","check_node_accept","decide_maybe_mmap","vtimes_one.part.0","internal_addseverity","build_trtable","adjust_wide_data","getaliasbyname_r@@GLIBC_2.2.5","alloc_perturb","_nl_get_era_entry","scalbnf64x","print_header","set_binding_values.part.0","get_nproc_stat","update_cur_sifted_state","authdes_destroy","walker","strncpy_ifunc","helper_thread","parse_dollars","authnone_create@GLIBC_2.2.5","scalbnf128","tzset_internal","locked_vfxprintf","wcsrchr_ifunc","_Unwind_GetCFA","get_free_list","new_do_write","wait_on_socket","frexpf32","find_derivation","option_alloc","detach_arena.part.0","_int_malloc","buffer_free","sched_setaffinity@@GLIBC_2.3.4","register_file","key_gendes@GLIBC_2.2.5","skip","send_dg","_res_hconf_trim_domain","gethostbyname3_context","authnone_create_once","decrement_at_index.part.0","lower_subexp","scalbnf32","strncmp_ifunc","isinff128_do_not_use","nrl_domainname","freecache","hol_entry_short_iterate","authdes_pk_create@GLIBC_2.2.5","do_system","getpwent_r@@GLIBC_2.2.5","gethostbyname_r@@GLIBC_2.2.5","unwind_stop","create_thread","_IO_wstrn_overflow","token.part.0","wcsncmp_ifunc","find_module_idx","indent_to","hack_digit","open_socket","getttyname_r","_IO_obstack_xsputn","reopen","peek_token_bracket","fts_sort","asctime_internal","maybe_init","alias_compare","fts_stat.isra.0","ecb_crypt@GLIBC_2.2.5","time_syscall","add_module","sift_states_backward","do_release_shlib","do_release_all","new_composite_name","memset_ifunc","x_destroy","free_category","re_compile_internal","msort_with_tmp.part.0","fmemopen@@GLIBC_2.22","free_dfa_content","try_nocreate","strcat_ifunc","_IO_cookie_read","_IO_cookie_seek","space","_IO_cookie_close","parse_reg_exp","fts_palloc","_IO_fopencookie","_IO_str_finish","_nl_expand_alias","copysignf128","_IO_default_seekpos","_int_free","getpmsg@GLIBC_2.2.5","_IO_getwc","build_charclass_op","rtime@GLIBC_2.2.5","unlock","uselib@GLIBC_2.2.5","bdflush@GLIBC_2.2.5","derivation_compare","object_compare","_res_hconf_init","sched_setaffinity@GLIBC_2.3.3","internal_fnwmatch","_argp_input","end_wpattern","ext_wmatch","pcmp","_nl_archive_subfreeres","check_dst_limits_calc_pos_1","_option_is_short","try_dir","argp_default_parser","pmap_getmaps@GLIBC_2.2.5","_seterr_reply@GLIBC_2.2.5","matches_last_entry","parse_backtick","aio_fsync64@@GLIBC_2.34","perror_internal","maybe_script_execute","add_alias2.part.0","authdes_create@GLIBC_2.2.5","munmap_chunk","hst_map_free","_nl_get_alt_digit","re_node_set_init_union","gai_cancel@GLIBC_2.2.5","usage_argful_short_opt","re_acquire_state","copysignf64x","getpublickey@GLIBC_2.2.5","ldexpf64","check_one_fd","re_compile_fastmap_iter","_nl_parse_alt_digit","authdes_getucred@GLIBC_2.2.5","modff128","_Unwind_ForcedUnwind","re_node_set_merge","check_subexp_matching_top","_nl_explode_name","isnanf128_do_not_use","ftw_startup","key_get_conv@GLIBC_2.2.5","_nl_postload_ctype","scalbnf64","re_search_stub","fattach@GLIBC_2.2.5","hol_entry_qcmp","w_addmem","eval_expr_multdiv","cfree@GLIBC_2.2.5"],"binary_path":"/usr/lib64/libc.so.6"},{"type":2,"name":"hdf5","functions":["H5SL_above","H5SL_add","H5SL_below:0x2794b0","H5SL_close:0x27a240","H5SL_count:0x26f830","H5SL_create:0x26f680","H5SL_destroy:0x27a170","H5SL_find:0x278e80","H5SL_first:0x27a020","H5SL_free:0x27a120","H5SL_greater:0x2788a0","H5SL_init:0x26f5c0","H5SL_insert:0x26f840","H5SL_item:0x27a060","H5SL_iterate:0x27a070","H5SL_last:0x27a050","H5SL_less:0x278260","H5SL_next:0x27a030","H5SL_prev:0x27a040","H5SL_release:0x27a0c0","H5SL_remove:0x26f8f0","H5SL_remove_first:0x2776f0","H5SL_search:0x277c10","H5SL_term_package:0x26f600","H5SM__get_index:0x27b480","H5SM__get_mesg_count_test:0x281610","H5SM__list_free:0x27f4f0","H5SM__message_compare:0x2811c0","H5SM__message_decode:0x281500","H5SM__message_encode:0x2813b0","H5SM__table_free:0x27f4b0","H5SM_can_share:0x27b940","H5SM_delete:0x27d490","H5SM_get_fheap_addr:0x27b780","H5SM_get_info:0x27e590","H5SM_get_refcount:0x27ed00","H5SM_ih_size:0x27ff50","H5SM_init:0x27ada0","H5SM_list_debug:0x27f990","H5SM_reconstitute:0x27ece0","H5SM_table_debug:0x27f530","H5SM_try_share:0x27bc00","H5SM_type_shared:0x27b580","H5T__alloc:0x2831b0","H5T__array_create:0x290bf0","H5T__bit_copy:0x2917f0","H5T__bit_dec:0x2928f0","H5T__bit_find:0x2920e0","H5T__bit_get_d:0x291d20","H5T__bit_inc:0x2927d0","H5T__bit_neg:0x292a00","H5T__bit_set:0x291db0","H5T__bit_set_d:0x291d70","H5T__bit_shift:0x291eb0","H5T__commit:0x294900","H5T__commit_anon:0x2950e0","H5T__commit_named:0x293640","H5T__conv_array:0x301480","H5T__conv_b_b:0x2fc5d0","H5T__conv_double_float:0x2f3330","H5T__conv_double_int:0x2ef570","H5T__conv_double_ldouble:0x2f3b30","H5T__conv_double_llong:0x2f1e10","H5T__conv_double_long:0x2f08f0","H5T__conv_double_schar:0x2ece10","H5T__conv_double_short:0x2ee170","H5T__conv_double_uchar:0x2ed7c0","H5T__conv_double_uint:0x2eff20","H5T__conv_double_ullong:0x2f2780","H5T__conv_double_ulong:0x2f1260","H5T__conv_double_ushort:0x2eeb70","H5T__conv_enum:0x2ff6f0","H5T__conv_enum_numeric:0x2ffce0","H5T__conv_f_f:0x2e2430","H5T__conv_f_i:0x2e43e0","H5T__conv_float_double:0x2ec590","H5T__conv_float_int:0x2e86a0","H5T__conv_float_ldouble:0x2ec9c0","H5T__conv_float_llong:0x2eae70","H5T__conv_float_long:0x2e9750","H5T__conv_float_schar:0x2e5fa0","H5T__conv_float_short:0x2e72f0","H5T__conv_float_uchar:0x2e6940","H5T__conv_float_uint:0x2e8ed0","H5T__conv_float_ullong:0x2eb8c0","H5T__conv_float_ulong:0x2ea1a0","H5T__conv_float_ushort:0x2e7cc0","H5T__conv_i_f:0x299b60","H5T__conv_i_i:0x298db0","H5T__conv_int_double:0x2b45f0","H5T__conv_int_float:0x2b3340","H5T__conv_int_ldouble:0x2b5b30","H5T__conv_int_llong:0x2b2900","H5T__conv_int_long:0x2b1ec0","H5T__conv_int_schar:0x2afdc0","H5T__conv_int_short:0x2b0be0","H5T__conv_int_uchar:0x2b04a0","H5T__conv_int_uint:0x2b1a80","H5T__conv_int_ullong:0x2b2d40","H5T__conv_int_ulong:0x2b2300","H5T__conv_int_ushort:0x2b1330","H5T__conv_ldouble_double:0x2fb570","H5T__conv_ldouble_float:0x2fad20","H5T__conv_ldouble_int:0x2f6960","H5T__conv_ldouble_llong:0x2f95a0","H5T__conv_ldouble_long:0x2f7e20","H5T__conv_ldouble_schar:0x2f3f80","H5T__conv_ldouble_short:0x2f5450","H5T__conv_ldouble_uchar:0x2f49e0","H5T__conv_ldouble_uint:0x2f7390","H5T__conv_ldouble_ullong:0x2fa010","H5T__conv_ldouble_ulong:0x2f8890","H5T__conv_ldouble_ushort:0x2f5ea0","H5T__conv_llong_double:0x2d56f0","H5T__conv_llong_float:0x2d3690","H5T__conv_llong_int:0x2d1cc0","H5T__conv_llong_ldouble:0x2d73e0","H5T__conv_llong_long:0x2d2b80","H5T__conv_llong_schar:0x2cff90","H5T__conv_llong_short:0x2d0df0","H5T__conv_llong_uchar:0x2d06a0","H5T__conv_llong_uint:0x2d2450","H5T__conv_llong_ullong:0x2d3220","H5T__conv_llong_ulong:0x2d2da0","H5T__conv_llong_ushort:0x2d1560","H5T__conv_long_double:0x2c3250","H5T__conv_long_float:0x2c11f0","H5T__conv_long_int:0x2bf820","H5T__conv_long_ldouble:0x2c4f40","H5T__conv_long_llong:0x2c0b50","H5T__conv_long_schar:0x2bdaf0","H5T__conv_long_short:0x2be950","H5T__conv_long_uchar:0x2be200","H5T__conv_long_uint:0x2bffb0","H5T__conv_long_ullong:0x2c0d70","H5T__conv_long_ulong:0x2c06e0","H5T__conv_long_ushort:0x2bf0c0","H5T__conv_noop:0x297600","H5T__conv_order:0x297670","H5T__conv_order_opt:0x297900","H5T__conv_ref:0x2fe7c0","H5T__conv_s_s:0x2fbdc0","H5T__conv_schar_double:0x29e6c0","H5T__conv_schar_float:0x29dc80","H5T__conv_schar_int:0x29be30","H5T__conv_schar_ldouble:0x29f100","H5T__conv_schar_llong:0x29d250","H5T__conv_schar_long:0x29c820","H5T__conv_schar_short:0x29b400","H5T__conv_schar_uchar:0x29afe0","H5T__conv_schar_uint:0x29c260","H5T__conv_schar_ullong:0x29d6a0","H5T__conv_schar_ulong:0x29cc70","H5T__conv_schar_ushort:0x29b850","H5T__conv_short_double:0x2a8260","H5T__conv_short_float:0x2a71e0","H5T__conv_short_int:0x2a5340","H5T__conv_short_ldouble:0x2a92e0","H5T__conv_short_llong:0x2a6790","H5T__conv_short_long:0x2a5d40","H5T__conv_short_schar:0x2a40a0","H5T__conv_short_uchar:0x2a47b0","H5T__conv_short_uint:0x2a5770","H5T__conv_short_ullong:0x2a6be0","H5T__conv_short_ulong:0x2a6190","H5T__conv_short_ushort:0x2a4ef0","H5T__conv_struct:0x2fd780","H5T__conv_struct_opt:0x2fdf30","H5T__conv_struct_subset:0x2fd770","H5T__conv_uchar_double:0x2a2bf0","H5T__conv_uchar_float:0x2a21b0","H5T__conv_uchar_int:0x2a0850","H5T__conv_uchar_ldouble:0x2a3630","H5T__conv_uchar_llong:0x2a1930","H5T__conv_uchar_long:0x2a10b0","H5T__conv_uchar_schar:0x29fb80","H5T__conv_uchar_short:0x29ffd0","H5T__conv_uchar_uint:0x2a0c80","H5T__conv_uchar_ullong:0x2a1d70","H5T__conv_uchar_ulong:0x2a14f0","H5T__conv_uchar_ushort:0x2a0410","H5T__conv_uint_double:0x2bb070","H5T__conv_uint_float:0x2b9e40","H5T__conv_uint_int:0x2b88e0","H5T__conv_uint_ldouble:0x2bc5a0","H5T__conv_uint_llong:0x2b95c0","H5T__conv_uint_long:0x2b8d40","H5T__conv_uint_schar:0x2b7080","H5T__conv_uint_short:0x2b7c90","H5T__conv_uint_uchar:0x2b7670","H5T__conv_uint_ullong:0x2b9a00","H5T__conv_uint_ulong:0x2b9180","H5T__conv_uint_ushort:0x2b82b0","H5T__conv_ullong_double:0x2de570","H5T__conv_ullong_float:0x2dc420","H5T__conv_ullong_int:0x2dacb0","H5T__conv_ullong_ldouble:0x2e0360","H5T__conv_ullong_llong:0x2dbf80","H5T__conv_ullong_long:0x2db880","H5T__conv_ullong_schar:0x2d9430","H5T__conv_ullong_short:0x2da050","H5T__conv_ullong_uchar:0x2d9a40","H5T__conv_ullong_uint:0x2db290","H5T__conv_ullong_ulong:0x2dbd30","H5T__conv_ullong_ushort:0x2da680","H5T__conv_ulong_double:0x2cc0d0","H5T__conv_ulong_float:0x2c9f80","H5T__conv_ulong_int:0x2c8810","H5T__conv_ulong_ldouble:0x2cdec0","H5T__conv_ulong_llong:0x2c9880","H5T__conv_ulong_long:0x2c93e0","H5T__conv_ulong_schar:0x2c6f90","H5T__conv_ulong_short:0x2c7bb0","H5T__conv_ulong_uchar:0x2c75a0","H5T__conv_ulong_uint:0x2c8df0","H5T__conv_ulong_ullong:0x2c9d30","H5T__conv_ulong_ushort:0x2c81e0","H5T__conv_ushort_double:0x2add40","H5T__conv_ushort_float:0x2acd10","H5T__conv_ushort_int:0x2ab3b0","H5T__conv_ushort_ldouble:0x2aed70","H5T__conv_ushort_llong:0x2ac490","H5T__conv_ushort_long:0x2abc10","H5T__conv_ushort_schar:0x2aa310","H5T__conv_ushort_short:0x2aaf10","H5T__conv_ushort_uchar:0x2aa910","H5T__conv_ushort_uint:0x2ab7e0","H5T__conv_ushort_ullong:0x2ac8d0","H5T__conv_ushort_ulong:0x2ac050","H5T__conv_vlen:0x300080","H5T__create:0x28abf0","H5T__enum_create:0x302dd0","H5T__enum_insert:0x303040","H5T__free:0x283af0","H5T__get_array_dims:0x2911b0","H5T__get_array_ndims:0x291050","H5T__get_create_plist:0x294720","H5T__get_member_name:0x3040c0","H5T__get_member_size:0x296610","H5T__get_member_value:0x303450","H5T__get_path_table_npaths:0x290ba0","H5T__init_native_float_types:0x306040","H5T__init_native_internal:0x309e00","H5T__insert:0x2967f0","H5T__open_name:0x295770","H5T__print_path_stats:0x302060","H5T__ref_reclaim:0x30d890","H5T__ref_set_loc:0x30d430","H5T__reverse_order:0x296ef0","H5T__sort_name:0x3047c0","H5T__sort_value:0x304520","H5T__update_packed:0x296780","H5T__upgrade_version:0x2909b0","H5T__visit:0x30dc90","H5T__vlen_create:0x30e520","H5T__vlen_reclaim:0x30ea90","H5T__vlen_set_loc:0x30e820","H5T_already_vol_managed:0x295cf0","H5T_close:0x283d10","H5T_close_real:0x2832c0","H5T_cmp:0x2840a0","H5T_construct_datatype:0x295930","H5T_convert:0x285ab0","H5T_convert_committed_datatype:0x285fa0","H5T_convert_with_ctx:0x2859d0","H5T_copy:0x286f50","H5T_copy_reopen:0x28a200","H5T_debug:0x302070","H5T_decode:0x2864e0","H5T_detect_class:0x2825a0","H5T_encode:0x282cc0","H5T_get_actual_type:0x295b00","H5T_get_class:0x282450","H5T_get_force_conv:0x296ee0","H5T_get_member_offset:0x296140","H5T_get_member_type:0x2965a0","H5T_get_named_type:0x295af0","H5T_get_nmembers:0x303f20","H5T_get_offset:0x30a280","H5T_get_order:0x30ae70","H5T_get_precision:0x30bd20","H5T_get_ref_type:0x2860e0","H5T_get_sign:0x304aa0","H5T_get_size:0x284090","H5T_get_super:0x289e80","H5T_init:0x28b230","H5T_invoke_vol_optional:0x295d00","H5T_is_immutable:0x285f60","H5T_is_named:0x285f70","H5T_is_numeric_with_unusual_unused_bits:0x290bb0","H5T_is_relocatable:0x2908a0","H5T_is_sensible:0x286100","H5T_is_variable_str:0x282800","H5T_is_vl_storage:0x2908e0","H5T_link:0x293ce0","H5T_lock:0x282fc0","H5T_nameof:0x285ed0","H5T_noop_conv:0x285880","H5T_oloc:0x285e40","H5T_open:0x295190","H5T_own_vol_obj:0x290b20","H5T_patch_file:0x290ae0","H5T_patch_vlen_file:0x290b00","H5T_path_bkg:0x2859c0","H5T_path_compound_subset:0x285990","H5T_path_find:0x2885b0","H5T_path_noop:0x285840","H5T_reclaim:0x296e40","H5T_reclaim_cb:0x296db0","H5T_restore_refresh_state:0x295c10","H5T_save_refresh_state:0x295b20","H5T_set_loc:0x286130","H5T_set_version:0x290a20","H5T_term_package:0x281fa0","H5T_top_term_package:0x283500","H5T_unregister:0x284d00","H5T_update_shared:0x2948d0","H5T_vlen_reclaim_elmt:0x30ed60","H5S__extent_copy_real:0x236cc0","H5S__extent_release:0x236670","H5S__get_diminfo_status_test:0x26cc70","H5S__get_rebuild_status_test:0x26cbe0","H5S__hyper_get_op_gen:0x249670","H5S__hyper_project_intersection:0x255f70","H5S__hyper_rebuild:0x250d80","H5S__internal_consistency_test:0x26ccd0","H5S__modify_select:0x25e1a0","H5S__sel_iter_close_cb:0x26c030","H5S__verify_offsets:0x26cd90","Nflock:0x61f30","Pflock:0x61ee0"]},{"type":1,"name":"bio","functions":["bio_get_last_bvec","bio_will_gap","bio_integrity_init"]},{"type":3,"name":"python","functions":[],"binary_path":"/usr/lib64/libpython3.9.so","provider":"python"},{"type":1,"name":"xfs","functions":["xfs_dir2_block_addname","xfs_dir2_block_getdents","xfs_dir2_block_log_leaf","xfs_dir2_block_lookup","xfs_dir2_block_lookup_int","xfs_dir2_block_removename","xfs_dir2_block_replace","xfs_dir2_block_sfsize","xfs_dir2_block_sort","xfs_dir2_block_to_leaf","xfs_dir2_block_to_sf","xfs_dir2_compname","xfs_dir2_data_bestfree_p","xfs_dir2_data_entry_tag_p","xfs_dir2_data_freefind","xfs_dir2_data_freeinsert","xfs_dir2_data_freeremove.constprop.0","xfs_dir2_data_freescan","xfs_dir2_data_get_ftype","xfs_dir2_data_log_entry","xfs_dir2_data_log_header","xfs_dir2_data_log_unused","xfs_dir2_data_make_free","xfs_dir2_data_put_ftype","xfs_dir2_data_use_free","xfs_dir2_free_hdr_from_disk","xfs_dir2_free_hdr_to_disk.isra.0","xfs_dir2_free_log_bests.isra.0","xfs_dir2_free_read","xfs_dir2_grow_inode","xfs_dir2_hashname","xfs_dir2_isblock","xfs_dir2_isleaf","xfs_dir2_leaf_addname","xfs_dir2_leaf_getdents","xfs_dir2_leaf_hdr_from_disk","xfs_dir2_leaf_hdr_to_disk","xfs_dir2_leaf_lasthash","xfs_dir2_leaf_lookup","xfs_dir2_leaf_lookup_int","xfs_dir2_leaf_readbuf","xfs_dir2_leaf_removename","xfs_dir2_leaf_replace","xfs_dir2_leaf_search_hash","xfs_dir2_leaf_to_block","xfs_dir2_leaf_to_node","xfs_dir2_leaf_trim_data","xfs_dir2_leafn_add","xfs_dir2_leafn_lookup_for_addname","xfs_dir2_leafn_lookup_for_entry","xfs_dir2_leafn_lookup_int","xfs_dir2_leafn_order","xfs_dir2_leafn_rebalance.constprop.0","xfs_dir2_leafn_remove","xfs_dir2_leafn_split","xfs_dir2_leafn_toosmall","xfs_dir2_leafn_unbalance","xfs_dir2_namecheck","xfs_dir2_node_add_datablk","xfs_dir2_node_addname","xfs_dir2_node_addname_int","xfs_dir2_node_find_freeblk","xfs_dir2_node_lookup","xfs_dir2_node_removename","xfs_dir2_node_replace","xfs_dir2_node_to_leaf","xfs_dir2_node_trim_free","xfs_dir2_sf_addname","xfs_dir2_sf_addname_easy","xfs_dir2_sf_addname_hard","xfs_dir2_sf_create","xfs_dir2_sf_entsize","xfs_dir2_sf_get_ftype","xfs_dir2_sf_get_ino","xfs_dir2_sf_get_parent_ino","xfs_dir2_sf_getdents.isra.0","xfs_dir2_sf_lookup","xfs_dir2_sf_nextentry","xfs_dir2_sf_put_ftype","xfs_dir2_sf_put_ino","xfs_dir2_sf_put_parent_ino","xfs_dir2_sf_removename","xfs_dir2_sf_replace","xfs_dir2_sf_to_block","xfs_dir2_sf_toino4","xfs_dir2_sf_toino8","xfs_dir2_sf_verify","xfs_dir2_shrink_inode","xfs_dir3_block_init","xfs_dir3_block_read","xfs_dir3_block_read_verify","xfs_dir3_block_verify","xfs_dir3_block_write_verify","xfs_dir3_data_end_offset","xfs_dir3_data_init","xfs_dir3_data_read","xfs_dir3_data_read_verify","xfs_dir3_data_reada_verify","xfs_dir3_data_readahead","xfs_dir3_data_verify","xfs_dir3_data_write_verify","xfs_dir3_free_get_buf","xfs_dir3_free_read_verify","xfs_dir3_free_verify","xfs_dir3_free_write_verify","xfs_dir3_get_dtype","xfs_dir3_leaf_check_int","xfs_dir3_leaf_compact","xfs_dir3_leaf_compact_x1","xfs_dir3_leaf_find_entry","xfs_dir3_leaf_find_stale","xfs_dir3_leaf_get_buf","xfs_dir3_leaf_init","xfs_dir3_leaf_log_bests.isra.0","xfs_dir3_leaf_log_ents","xfs_dir3_leaf_log_header","xfs_dir3_leaf_log_tail.isra.0","xfs_dir3_leaf_read","xfs_dir3_leaf_read_verify","xfs_dir3_leaf_verify","xfs_dir3_leaf_write_verify","xfs_dir3_leafn_moveents","xfs_dir3_leafn_moveents.part.0","xfs_dir3_leafn_read","xfs_dir_canenter","xfs_dir_cilookup_result","xfs_dir_createname","xfs_dir_fsync","xfs_dir_init","xfs_dir_ino_validate","xfs_dir_isempty","xfs_dir_lookup","xfs_dir_open","xfs_rmaproot_init","xfs_sb_from_disk","xfs_sb_get_secondary","xfs_sb_good_version","xfs_sb_mount_common","xfs_sb_quiet_read_verify","xfs_sb_quota_from_disk","xfs_sb_read_secondary","xfs_sb_read_verify","xfs_sb_to_disk","xfs_sb_validate_fsb_count","xfs_sb_version_to_features","xfs_sb_write_verify","xfs_sbblock_init","xfs_sbversion_add_attr2","xfs_seek_iomap_begin","xfs_setsize_buftarg_early","xfs_dir_removename","xfs_dir_replace","xfs_dir_startup","xfs_imap_lookup","xfs_imap_valid.part.0","xfs_inobt_first_free_inode","xfs_inobt_get_maxrecs","xfs_inobt_get_minrecs","xfs_inobt_init_key_from_rec","xfs_inobt_init_ptr_from_cur","xfs_inobt_insert","xfs_inobt_insert_sprec","xfs_inobt_maxlevels_ondisk","xfs_inobt_update.isra.0","xfs_dialloc_ag","xfs_dialloc_ag_finobt_near","xfs_dialloc_ag_finobt_newino.isra.0","xfs_dialloc_ag_inobt","xfs_dialloc_ag_update_inobt","xfs_difree_finobt","xfs_difree_inobt","xfs_difree_inode_chunk.isra.0","xfs_dinode_verify.part.0","xfs_dinode_verify_fork","xfs_btree_afakeroot_set_root","xfs_btree_bload","xfs_btree_bload_compute_geometry","xfs_btree_bload_desired_npb","xfs_btree_bload_drop_buf","xfs_btree_bload_ensure_slack","xfs_btree_bload_leaf","xfs_btree_bload_level_geometry","xfs_btree_bload_max_npb","xfs_btree_bload_node","xfs_btree_bload_prep_block","xfs_btree_block_change_owner","xfs_btree_buf_to_ptr.isra.0","xfs_btree_calc_size","xfs_btree_change_owner","xfs_btree_check_block","xfs_btree_check_lptr","xfs_btree_check_sblock","xfs_btree_check_sptr","xfs_btree_commit_afakeroot","xfs_btree_commit_ifakeroot","xfs_btree_compute_maxlevels","xfs_btree_copy_keys","xfs_btree_copy_ptrs","xfs_btree_copy_recs","xfs_btree_count_blocks","xfs_btree_count_blocks_helper","xfs_btree_dec_cursor","xfs_btree_decrement","xfs_btree_del_cursor","xfs_btree_delete","xfs_btree_delrec","xfs_btree_destroy_cur_caches","xfs_btree_diff_two_ptrs","xfs_btree_dup_cursor","xfs_btree_fakeroot_alloc_block","xfs_btree_fakeroot_dup_cursor","xfs_btree_fakeroot_free_block","xfs_btree_fakeroot_init_ptr_from_cur","xfs_btree_firstrec","xfs_btree_free_block","xfs_btree_get_block","xfs_btree_get_buf_block","xfs_btree_get_iroot","xfs_btree_get_keys","xfs_btree_get_leaf_keys","xfs_btree_get_leaf_keys.cold","xfs_btree_get_node_keys","xfs_btree_get_rec","xfs_btree_get_sibling","xfs_btree_goto_left_edge","xfs_btree_has_more_records","xfs_btree_has_records","xfs_btree_has_records_helper","xfs_btree_high_key_addr","xfs_btree_high_key_from_key","xfs_btree_high_key_offset","xfs_btree_ifork_ptr","xfs_btree_increment","xfs_btree_init_block","xfs_btree_init_block_cur","xfs_btree_init_block_int","xfs_btree_insert","xfs_btree_insrec","xfs_btree_is_lastrec","xfs_btree_key_addr","xfs_btree_key_offset","xfs_btree_kill_iroot","xfs_btree_kill_root","xfs_btree_lastrec","xfs_btree_lblock_calc_crc","xfs_btree_lblock_v5hdr_verify","xfs_btree_lblock_verify","xfs_btree_lblock_verify_crc","xfs_btree_log_block","xfs_btree_log_keys","xfs_btree_log_ptrs","xfs_btree_log_recs","xfs_btree_lookup","xfs_btree_lookup_get_block","xfs_btree_lshift","xfs_btree_magic","xfs_btree_make_block_unfull","xfs_btree_new_iroot","xfs_btree_new_root","xfs_btree_offsets","xfs_btree_overlapped_query_range","xfs_btree_ptr_addr","xfs_btree_ptr_is_null","xfs_btree_ptr_offset","xfs_btree_ptr_to_daddr","xfs_btree_query_all","xfs_btree_query_range","xfs_btree_read_buf_block","xfs_btree_read_bufl","xfs_btree_reada_bufl","xfs_btree_reada_bufs","xfs_btree_readahead.isra.0","xfs_btree_readahead_lblock.isra.0","xfs_btree_readahead_ptr.constprop.0","xfs_btree_readahead_sblock.isra.0","xfs_btree_rec_addr","xfs_btree_rec_offset","xfs_btree_rshift","xfs_btree_sblock_calc_crc","xfs_btree_sblock_v5hdr_verify","xfs_btree_sblock_verify","xfs_btree_sblock_verify_crc","xfs_btree_set_ptr_null","xfs_btree_set_refs","xfs_btree_set_sibling","xfs_btree_setbuf","xfs_btree_shift_keys","xfs_btree_shift_ptrs","xfs_btree_shift_recs","xfs_btree_simple_query_range","xfs_btree_space_to_height","xfs_btree_split","xfs_btree_split_worker","xfs_btree_stage_afakeroot","xfs_btree_stage_ifakeroot","xfs_btree_update","xfs_btree_update_keys","xfs_btree_updkeys_force.constprop.0","xfs_btree_visit_block","xfs_btree_visit_blocks","xfs_defer_add","xfs_defer_add_barrier","xfs_defer_barrier_abort_intent","xfs_defer_barrier_cancel_item","xfs_defer_barrier_create_done","xfs_defer_barrier_create_intent","xfs_defer_barrier_finish_item","xfs_defer_cancel","xfs_defer_cancel_recovery","xfs_defer_create_intent.part.0","xfs_defer_create_intents","xfs_defer_destroy_item_caches","xfs_defer_drain_free","xfs_defer_drain_init","xfs_defer_extent_free","xfs_defer_finish","xfs_defer_finish_noroll","xfs_defer_finish_one","xfs_defer_finish_recovery","xfs_defer_item_pause","xfs_defer_item_unpause","xfs_defer_move","xfs_defer_ops_capture_abort","xfs_defer_ops_capture_and_commit","xfs_defer_ops_continue","xfs_defer_pending_abort_list","xfs_defer_pending_cancel_work","xfs_defer_relog","xfs_defer_resources_rele","xfs_defer_restore_resources","xfs_defer_save_resources","xfs_defer_start_recovery","xfs_defer_trans_abort","xfs_defer_trans_roll","xfs_blockgc_clear_iflag","xfs_blockgc_flush_all","xfs_blockgc_free_dquots","xfs_blockgc_free_quota","xfs_blockgc_free_space","xfs_blockgc_set_iflag","xfs_blockgc_start","xfs_blockgc_stop","xfs_blockgc_worker","xfs_bmap_add_attrfork_btree.constprop.0","xfs_bmap_add_attrfork_extents.constprop.0","xfs_bmap_add_attrfork_local.constprop.0","xfs_bmap_add_extent_delay_real","xfs_bmap_add_extent_hole_delay.constprop.0","xfs_bmap_add_extent_hole_real","xfs_bmap_btalloc","xfs_bmap_btalloc_at_eof","xfs_bmap_btalloc_best_length","xfs_bmap_btree_to_extents","xfs_bmap_del_extent_real","xfs_bmap_extents_to_btree","xfs_bmap_extsize_align.part.0","xfs_bmap_forkoff_reset","xfs_bmap_isaeof","xfs_bmap_local_to_extents.constprop.0","xfs_bmap_shift_update_extent.constprop.0","xfs_bmap_worst_indlen.isra.0","xfs_bmapi_allocate","xfs_bmapi_convert_unwritten","xfs_bmapi_finish","xfs_bmapi_trim_map.constprop.0","xfs_bmapi_update_map.constprop.0","xfs_bmbt_init_common","xfs_bmbt_init_high_key_from_rec","xfs_bmbt_init_key_from_rec","xfs_bmbt_init_ptr_from_cur","xfs_bmbt_init_rec_from_cur","xfs_bmbt_key_diff","xfs_bmbt_keys_contiguous","xfs_bmbt_keys_inorder","xfs_bmbt_lookup_eq","xfs_bmbt_lookup_first","xfs_bmbt_read_verify","xfs_bmbt_recs_inorder","xfs_bmbt_update","xfs_bmbt_update_cursor","xfs_bmbt_verify","xfs_bmbt_write_verify","xfs_bmse_can_merge","xfs_bmse_merge.constprop.0","xfs_bnobt_diff_two_keys","xfs_bnobt_init_high_key_from_rec","xfs_bnobt_key_diff","xfs_bnobt_keys_inorder","xfs_bnobt_recs_inorder","xfs_bnoroot_init","xfs_buf_lookup.constprop.0","xfs_acl_from_disk","xfs_acl_from_disk","xfs_acl_to_disk","xfs_acl_to_disk","xfs_add_incompat_log_feature","xfs_add_incompat_log_feature","xfs_ag_block_count","xfs_ag_extend_space","xfs_ag_extend_space","xfs_ag_geom_health","xfs_ag_get_geometry","xfs_ag_get_geometry","xfs_ag_init_headers","xfs_ag_mark_healthy","xfs_ag_mark_healthy","xfs_ag_mark_sick","xfs_ag_mark_sick","xfs_ag_measure_sickness","xfs_ag_measure_sickness","xfs_ag_resv_alloc_extent","xfs_ag_resv_alloc_extent","xfs_ag_resv_critical","xfs_ag_resv_free","xfs_ag_resv_free","xfs_ag_resv_free_extent","xfs_ag_resv_free_extent","xfs_ag_resv_init","xfs_ag_resv_init","xfs_ag_resv_needed","xfs_ag_resv_needed","xfs_ag_resv_rmapbt_alloc","xfs_ag_resv_rmapbt_alloc","xfs_ag_shrink_space","xfs_agf_read_verify","xfs_agf_verify","xfs_agf_write_verify","xfs_agfl_free_finish_item","xfs_agfl_read_verify","xfs_agfl_size","xfs_agfl_size","xfs_agfl_verify","xfs_agfl_walk","xfs_agfl_walk","xfs_agfl_write_verify","xfs_agi_read_verify","xfs_agi_verify","xfs_agi_write_verify","xfs_agiblock_init","xfs_agino_range","xfs_ail_delete_one","xfs_ail_min_lsn","xfs_ail_push","xfs_ail_push_all","xfs_ail_push_all_sync","xfs_ail_update_finish","xfs_allocbt_alloc_block","xfs_allocbt_calc_size","xfs_allocbt_calc_size","xfs_allocbt_commit_staged_btree","xfs_allocbt_commit_staged_btree","xfs_allocbt_destroy_cur_cache","xfs_allocbt_destroy_cur_cache","xfs_allocbt_dup_cursor","xfs_allocbt_free_block","xfs_allocbt_get_maxrecs","xfs_allocbt_get_minrecs","xfs_allocbt_init_common","xfs_allocbt_init_cursor","xfs_allocbt_init_cursor","xfs_allocbt_init_key_from_rec","xfs_allocbt_init_ptr_from_cur","xfs_allocbt_init_rec_from_cur","xfs_allocbt_keys_contiguous","xfs_allocbt_maxlevels_ondisk","xfs_allocbt_maxlevels_ondisk","xfs_allocbt_maxrecs","xfs_allocbt_maxrecs","xfs_allocbt_read_verify","xfs_allocbt_set_root","xfs_allocbt_stage_cursor","xfs_allocbt_stage_cursor","xfs_allocbt_update_lastrec","xfs_allocbt_verify","xfs_allocbt_write_verify","xfs_ascii_ci_compname","xfs_ascii_ci_compname","xfs_ascii_ci_compname.part.0","xfs_ascii_ci_hashname","xfs_ascii_ci_hashname","xfs_attr3_leaf_add","xfs_attr3_leaf_add","xfs_attr3_leaf_add_work","xfs_attr3_leaf_clearflag","xfs_attr3_leaf_compact","xfs_attr3_leaf_create","xfs_attr3_leaf_figure_balance.isra.0","xfs_attr3_leaf_flipflags","xfs_attr3_leaf_flipflags","xfs_attr3_leaf_getvalue","xfs_attr3_leaf_hdr_from_disk","xfs_attr3_leaf_hdr_from_disk","xfs_attr3_leaf_hdr_to_disk","xfs_attr3_leaf_hdr_to_disk","xfs_attr3_leaf_inactive","xfs_attr3_leaf_inactive","xfs_attr3_leaf_list_int","xfs_attr3_leaf_list_int","xfs_attr3_leaf_lookup_int","xfs_attr3_leaf_lookup_int","xfs_attr3_leaf_moveents.constprop.0","xfs_attr3_leaf_order.isra.0","xfs_attr3_leaf_read","xfs_attr3_leaf_read","xfs_attr3_leaf_read_verify","xfs_attr3_leaf_rebalance.constprop.0","xfs_attr3_leaf_remove","xfs_attr3_leaf_remove","xfs_attr3_leaf_setflag","xfs_attr3_leaf_setflag","xfs_attr3_leaf_split","xfs_attr3_leaf_split","xfs_attr3_leaf_to_node","xfs_attr3_leaf_to_node","xfs_attr3_leaf_to_shortform","xfs_attr3_leaf_to_shortform","xfs_attr3_leaf_toosmall","xfs_attr3_leaf_toosmall","xfs_attr3_leaf_try_add","xfs_attr3_leaf_unbalance","xfs_attr3_leaf_unbalance","xfs_attr3_leaf_verify","xfs_attr3_leaf_write_verify","xfs_attr3_node_inactive","xfs_attr3_rmt_blocks","xfs_attr3_rmt_blocks","xfs_attr3_rmt_hdr_set","xfs_attr3_rmt_read_verify","xfs_attr3_rmt_stale","xfs_attr3_rmt_verify","xfs_attr3_rmt_verify_struct","xfs_attr3_rmt_write_verify","xfs_attr3_root_inactive","xfs_attr_abort_intent","xfs_attr_calc_size","xfs_attr_cancel_item","xfs_attr_change","xfs_attr_change","xfs_attr_copy_value","xfs_attr_copy_value.part.0","xfs_attr_create_done","xfs_attr_create_intent","xfs_attr_defer_add","xfs_attr_finish_item","xfs_attr_fork_remove","xfs_attr_fork_remove","xfs_attr_get","xfs_attr_get","xfs_attr_get_ilocked","xfs_attr_get_ilocked","xfs_attr_inactive","xfs_attr_intent_destroy_cache","xfs_attr_intent_destroy_cache","xfs_attr_is_leaf","xfs_attr_is_leaf","xfs_attr_leaf_get","xfs_attr_leaf_hasname","xfs_attr_leaf_lasthash","xfs_attr_leaf_lasthash","xfs_attr_leaf_list","xfs_attr_leaf_newentsize","xfs_attr_leaf_newentsize","xfs_attr_leaf_order","xfs_attr_leaf_order","xfs_attr_leaf_removename","xfs_attr_list","xfs_attr_list","xfs_attr_list_ilocked","xfs_attr_list_ilocked","xfs_attr_log_item.constprop.0","xfs_attr_match.part.0","xfs_attr_multi_by_handle","xfs_attr_namecheck","xfs_attr_namecheck","xfs_attr_node_addname","xfs_attr_node_addname_find_attr","xfs_attr_node_get","xfs_attr_node_list","xfs_attr_node_list","xfs_attr_node_list_lookup","xfs_attr_node_list_lookup","xfs_attr_node_lookup.constprop.0","xfs_attr_node_remove_attr.isra.0","xfs_attr_put_listent","xfs_attr_recover_work","xfs_attr_relog_intent","xfs_attr_rmt_find_hole","xfs_attr_rmt_find_hole","xfs_attr_rmtval_copyin.constprop.0","xfs_attr_rmtval_copyout","xfs_attr_rmtval_find_space","xfs_attr_rmtval_find_space","xfs_attr_rmtval_get","xfs_attr_rmtval_get","xfs_attr_rmtval_invalidate","xfs_attr_rmtval_invalidate","xfs_attr_rmtval_remove","xfs_attr_rmtval_remove","xfs_attr_rmtval_set_blk","xfs_attr_rmtval_set_blk","xfs_attr_rmtval_set_value","xfs_attr_rmtval_set_value","xfs_attr_rmtval_stale","xfs_attr_rmtval_stale","xfs_attr_set","xfs_attr_set","xfs_attr_set_iter","xfs_attr_set_iter","xfs_attr_sf_findname","xfs_attr_sf_removename","xfs_attr_shortform_add","xfs_attr_shortform_add","xfs_attr_shortform_addname","xfs_attr_shortform_allfit","xfs_attr_shortform_allfit","xfs_attr_shortform_bytesfit","xfs_attr_shortform_bytesfit","xfs_attr_shortform_compare","xfs_attr_shortform_compare","xfs_attr_shortform_create","xfs_attr_shortform_create","xfs_attr_shortform_getvalue","xfs_attr_shortform_getvalue","xfs_attr_shortform_list","xfs_attr_shortform_list","xfs_attr_shortform_to_leaf","xfs_attr_shortform_to_leaf","xfs_attr_shortform_verify","xfs_attr_shortform_verify","xfs_attr_try_sf_addname","xfs_attrd_item_format","xfs_attrd_item_free","xfs_attrd_item_intent","xfs_attrd_item_release","xfs_attrd_item_size","xfs_attri_init","xfs_attri_item_format","xfs_attri_item_free","xfs_attri_item_match","xfs_attri_item_release","xfs_attri_item_size","xfs_attri_item_unpin","xfs_attri_log_nameval_alloc","xfs_attri_recover_work","xfs_attri_release","xfs_attrlist_by_handle","xfs_attrmulti_attr_get","xfs_attrmulti_attr_set","xfs_attrmulti_by_handle","xfs_bitmap_empty","xfs_blkdev_get.constprop.0","xfs_bmap_add_attrfork","xfs_bmap_add_extent_unwritten_real","xfs_bmap_adjacent","xfs_bmap_alloc_account","xfs_bmap_btalloc_low_space","xfs_bmap_can_insert_extents","xfs_bmap_collapse_extents","xfs_bmap_complain_bad_rec","xfs_bmap_compute_attr_offset","xfs_bmap_compute_maxlevels","xfs_bmap_count_blocks","xfs_bmap_count_leaves","xfs_bmap_del_extent_cow","xfs_bmap_del_extent_delay","xfs_bmap_extsize_align","xfs_bmap_finish_one","xfs_bmap_first_unused","xfs_bmap_insert_extents","xfs_bmap_intent_destroy_cache","xfs_bmap_last_before","xfs_bmap_last_extent","xfs_bmap_last_offset","xfs_bmap_local_to_extents_empty","xfs_bmap_longest_free_extent","xfs_bmap_map_extent","xfs_bmap_punch_delalloc_range","xfs_bmap_recover_work","xfs_bmap_relog_intent","xfs_bmap_split_extent","xfs_bmap_trim_cow","xfs_bmap_unmap_extent","xfs_bmap_update_abort_intent","xfs_bmap_update_cancel_item","xfs_bmap_update_create_done","xfs_bmap_update_create_intent","xfs_bmap_update_diff_items","xfs_bmap_update_finish_item","xfs_bmap_update_get_group","xfs_bmap_update_log_item.constprop.0","xfs_bmap_validate_extent","xfs_bmap_validate_extent_raw","xfs_bmapi_convert_delalloc","xfs_bmapi_minleft","xfs_bmapi_read","xfs_bmapi_remap","xfs_bmapi_reserve_delalloc","xfs_bmapi_write","xfs_bmbt_alloc_block","xfs_bmbt_calc_size","xfs_bmbt_calc_size","xfs_bmbt_change_owner","xfs_bmbt_change_owner","xfs_bmbt_commit_staged_btree","xfs_bmbt_destroy_cur_cache","xfs_bmbt_destroy_cur_cache","xfs_bmbt_diff_two_keys","xfs_bmbt_disk_get_all","xfs_bmbt_disk_get_all","xfs_bmbt_disk_get_blockcount","xfs_bmbt_disk_get_blockcount","xfs_bmbt_disk_get_startoff","xfs_bmbt_disk_get_startoff","xfs_bmbt_disk_set_all","xfs_bmbt_disk_set_all","xfs_bmbt_dup_cursor","xfs_bmbt_free_block","xfs_bmbt_get_dmaxrecs","xfs_bmbt_get_maxrecs","xfs_bmbt_get_maxrecs","xfs_bmbt_get_minrecs","xfs_bmbt_init_cursor","xfs_bmbt_maxlevels_ondisk","xfs_bmbt_maxrecs","xfs_bmbt_stage_cursor","xfs_bmbt_to_bmdr","xfs_bmbt_to_iomap","xfs_bmdr_maxrecs","xfs_bmdr_to_bmbt","xfs_break_dax_layouts","xfs_break_layouts","xfs_break_leased_layouts","xfs_bstime_store_compat","xfs_bud_item_format","xfs_bud_item_intent","xfs_bud_item_release","xfs_bud_item_size","xfs_buftarg_drain","xfs_buftarg_wait","xfs_bui_copy_format","xfs_bui_init","xfs_bui_item_format","xfs_bui_item_free","xfs_bui_item_match","xfs_bui_item_release","xfs_bui_item_size","xfs_bui_item_unpin","xfs_bui_release","xfs_bulk_ireq_setup","xfs_bulkstat","xfs_bulkstat_fmt","xfs_bulkstat_health","xfs_bulkstat_iwalk","xfs_bulkstat_one","xfs_bulkstat_one_int","xfs_bulkstat_to_bstat","xfs_calc_addafork_reservation","xfs_calc_attrinval_reservation","xfs_calc_attrrm_reservation","xfs_calc_attrsetm_reservation.isra.0","xfs_calc_attrsetrt_reservation.isra.0","xfs_calc_buf_res","xfs_calc_clear_agi_bucket_reservation.isra.0","xfs_calc_create_resv_modify","xfs_calc_create_tmpfile_reservation","xfs_calc_dquots_per_chunk","xfs_calc_finobt_res","xfs_calc_growdata_reservation","xfs_calc_growrtalloc_reservation","xfs_calc_growrtfree_reservation","xfs_calc_growrtzero_reservation.isra.0","xfs_calc_ichange_reservation.isra.0","xfs_calc_icreate_reservation","xfs_calc_icreate_resv_alloc","xfs_calc_ifree_reservation","xfs_calc_inobt_res","xfs_calc_inode_chunk_res","xfs_calc_inode_res.isra.0","xfs_calc_itruncate_reservation","xfs_calc_itruncate_reservation_minlogsize","xfs_calc_iunlink_add_reservation.isra.0","xfs_calc_iunlink_remove_reservation.isra.0","xfs_calc_link_reservation","xfs_calc_mkdir_reservation","xfs_calc_qm_dqalloc_reservation","xfs_calc_qm_dqalloc_reservation_minlogsize","xfs_calc_qm_setqlim_reservation","xfs_calc_remove_reservation","xfs_calc_rename_reservation","xfs_calc_swrite_reservation.isra.0","xfs_calc_symlink_reservation","xfs_calc_write_reservation","xfs_calc_write_reservation_minlogsize","xfs_can_free_eofblocks","xfs_check_sizes","xfs_check_summary_counts","xfs_cil_prepare_item","xfs_cleanup_inode.isra.0","xfs_cleanup_procfs","xfs_clear_incompat_log_features","xfs_collapse_file_space","xfs_compat_attrlist_by_handle","xfs_compat_attrmulti_by_handle","xfs_compat_growfs_data_copyin","xfs_compat_growfs_rt_copyin","xfs_compat_handlereq_copyin","xfs_compat_handlereq_to_dentry.isra.0","xfs_compat_ioc_fsbulkstat.isra.0","xfs_compat_ioc_fsgeometry_v1","xfs_compute_rextslog","xfs_contig_bits","xfs_corruption_error","xfs_create","xfs_create_tmpfile","xfs_cross_rename","xfs_cud_item_format","xfs_cud_item_intent","xfs_cud_item_release","xfs_cud_item_size","xfs_cui_copy_format","xfs_cui_init","xfs_cui_item_format","xfs_cui_item_free","xfs_cui_item_match","xfs_cui_item_release","xfs_cui_item_size","xfs_cui_item_unpin","xfs_cui_release","xfs_dax_failure_fn","xfs_dax_notify_ddev_failure","xfs_dax_notify_failure","xfs_debugfs_mkdir","xfs_default_attroffset","xfs_default_resblks","xfs_deprecated_dointvec_minmax","xfs_deprecated_dointvec_minmax.cold","xfs_destroy_caches","xfs_destroy_mount_workqueues","xfs_destroy_workqueues","xfs_dev_is_read_only","xfs_dialloc","xfs_diflags_to_iflags","xfs_difree","xfs_dinode_calc_crc","xfs_dinode_verify","xfs_dqblk_repair","xfs_dqblk_verify","xfs_dqlock2","xfs_dquot_alloc","xfs_dquot_disk_alloc","xfs_dquot_disk_read","xfs_dquot_from_disk","xfs_dquot_from_disk_ts","xfs_dquot_set_grace_period","xfs_dquot_set_prealloc_limits","xfs_dquot_set_timeout","xfs_dquot_to_disk","xfs_dquot_to_disk_ts","xfs_dquot_verify","xfs_drain_wait_disable","xfs_drain_wait_enable","xfs_droplink","xfs_efd_item_format","xfs_efd_item_free","xfs_efd_item_intent","xfs_efd_item_release","xfs_efd_item_size","xfs_efi_copy_format","xfs_efi_init","xfs_efi_item_format","xfs_efi_item_free","xfs_efi_item_match","xfs_efi_item_release","xfs_efi_item_size","xfs_efi_item_unpin","xfs_efi_release","xfs_end_io","xfs_eof_alignment","xfs_error_get_cfg","xfs_error_report","xfs_error_sysfs_del","xfs_error_sysfs_init","xfs_file_compat_ioctl","xfs_file_ioctl","xfs_fileattr_get","xfs_fileattr_set","xfs_filestream_create_association","xfs_filestream_deassociate","xfs_filestream_lookup_association","xfs_filestream_mount","xfs_filestream_pick_ag","xfs_filestream_select_ag","xfs_filestream_unmount","xfs_fill_fsxattr","xfs_fill_statvfs_from_dquot","xfs_find_handle","xfs_find_trim_cow_extent","xfs_finish_flags","xfs_finobt_alloc_block","xfs_finobt_calc_reserves","xfs_finobt_free_block","xfs_finobt_set_root","xfs_flags2diflags","xfs_flags2diflags2.isra.0","xfs_flush_inodes","xfs_flush_inodes_worker","xfs_flush_unmap_range","xfs_force_summary_recalc","xfs_forget_acl","xfs_free_agfl_block","xfs_free_buftarg","xfs_free_eofblocks","xfs_free_extent_fix_freelist","xfs_free_extent_later","xfs_free_file_space","xfs_free_perag","xfs_free_unused_perag_range","xfs_freesb","xfs_fsb_to_db","xfs_fsbulkstat_one_fmt","xfs_fsbulkstat_one_fmt_compat","xfs_fsinumbers_fmt","xfs_fsinumbers_fmt_compat","xfs_fsmap_owner_to_rmap","xfs_fsmap_to_internal","xfs_fsop_geom_health","xfs_fstrm_free_func","xfs_generic_create","xfs_get_acl","xfs_get_cowextsz_hint","xfs_get_extsz_hint","xfs_getbmap","xfs_getbmap_report_hole","xfs_getfsmap","xfs_getfsmap_check_keys","xfs_getfsmap_datadev_bnobt","xfs_getfsmap_datadev_bnobt_helper","xfs_getfsmap_datadev_bnobt_query","xfs_getfsmap_datadev_helper","xfs_getfsmap_datadev_rmapbt","xfs_getfsmap_datadev_rmapbt_query","xfs_getfsmap_dev_compare","xfs_getfsmap_helper","xfs_getfsmap_is_shared","xfs_getfsmap_is_valid_device.isra.0","xfs_getfsmap_logdev","xfs_growfs_data","xfs_growfs_data_private.isra.0","xfs_growfs_log","xfs_handle_acceptable","xfs_handle_to_dentry","xfs_handlereq_to_dentry.isra.0","xfs_has_finobt","xfs_has_reflink","xfs_has_rmapbt","xfs_health_unmount","xfs_hex_dump","xfs_ialloc_calc_rootino","xfs_ialloc_check_shrink","xfs_ialloc_count_inodes","xfs_ialloc_has_inodes_at_extent","xfs_ialloc_inode_init","xfs_ialloc_log_agi","xfs_ialloc_read_agi","xfs_ialloc_setup_geometry","xfs_iallocbt_calc_size","xfs_iallocbt_maxlevels_ondisk","xfs_icount_range","xfs_icreate_item_format","xfs_icreate_item_release","xfs_icreate_item_size","xfs_icreate_log","xfs_icwalk","xfs_icwalk_ag","xfs_icwalk_match","xfs_icwalk_match_id","xfs_icwalk_match_id_union","xfs_idata_realloc","xfs_idestroy_fork","xfs_iext_count","xfs_iext_count_may_overflow","xfs_iext_count_upgrade","xfs_iext_destroy","xfs_iext_destroy_node","xfs_iext_first","xfs_iext_get_extent","xfs_iext_insert","xfs_iext_insert_node.constprop.0","xfs_iext_insert_raw","xfs_iext_last","xfs_iext_lookup_extent","xfs_iext_lookup_extent_before","xfs_iext_next","xfs_iext_prev","xfs_iext_rebalance_leaf","xfs_iext_remove","xfs_iext_remove_node","xfs_iext_state_to_fork","xfs_iext_update_extent","xfs_iext_update_node.constprop.0.isra.0","xfs_iextents_copy","xfs_iformat_attr_fork","xfs_iformat_btree","xfs_iformat_data_fork","xfs_iformat_extents","xfs_iformat_local","xfs_ifree","xfs_ifree_cluster","xfs_iget","xfs_iget_cache_hit","xfs_iget_cache_miss","xfs_iget_check_free_state","xfs_iget_recycle","xfs_ilock","xfs_ilock2_io_mmap","xfs_ilock_attr_map_shared","xfs_ilock_data_map_shared","xfs_ilock_demote","xfs_ilock_nowait","xfs_imap","xfs_imap_to_bp","xfs_inactive","xfs_inactive_ifree","xfs_inactive_symlink","xfs_inactive_symlink_rmt","xfs_inactive_truncate","xfs_init_attr_trans","xfs_init_fs_context","xfs_init_local_fork","xfs_init_mount_workqueues","xfs_init_new_inode","xfs_init_procfs","xfs_initialize_perag","xfs_initialize_perag_data","xfs_initxattrs","xfs_inobt_alloc_block","xfs_inobt_btrec_to_irec","xfs_inobt_check_irec","xfs_inobt_commit_staged_btree","xfs_inobt_cur","xfs_inobt_destroy_cur_cache","xfs_inobt_diff_two_keys","xfs_inobt_dup_cursor","xfs_inobt_free_block","xfs_inobt_get_rec","xfs_inobt_init_common","xfs_inobt_init_cursor","xfs_inobt_init_high_key_from_rec","xfs_inobt_init_rec_from_cur","xfs_inobt_insert_rec","xfs_inobt_irec_to_allocmask","xfs_inobt_key_diff","xfs_inobt_keys_contiguous","xfs_inobt_keys_inorder","xfs_inobt_lookup","xfs_inobt_maxrecs","xfs_inobt_read_verify","xfs_inobt_rec_freecount","xfs_inobt_recs_inorder","xfs_inobt_set_root","xfs_inobt_stage_cursor","xfs_inobt_verify","xfs_inobt_walk","xfs_inobt_write_verify","xfs_inodegc_flush","xfs_inodegc_init_percpu","xfs_inodegc_push","xfs_inodegc_queue","xfs_inodegc_queue_all","xfs_inodegc_register_shrinker","xfs_inodegc_set_reclaimable","xfs_inodegc_shrinker_count","xfs_inodegc_shrinker_scan","xfs_inodegc_start","xfs_inodegc_stop","xfs_inodegc_worker","xfs_insert_file_space","xfs_internal_inum","xfs_inumbers","xfs_inumbers_fmt","xfs_inumbers_to_inogrp","xfs_inumbers_walk","xfs_ioc_ag_geometry","xfs_ioc_attr_list","xfs_ioc_attr_put_listent","xfs_ioc_attrmulti_one","xfs_ioc_bulkstat.constprop.0.isra.0","xfs_ioc_fsbulkstat.isra.0","xfs_ioc_fsgeometry","xfs_ioc_fsgetxattra","xfs_ioc_getbmap","xfs_ioc_getfsmap","xfs_ioc_inumbers.constprop.0","xfs_ioc_scrub_metadata","xfs_ioc_setlabel","xfs_ioc_setlabel.cold","xfs_ioc_swapext","xfs_ioc_trim","xfs_ioctl32_bstat_copyin","xfs_ioctl32_bstime_copyin","xfs_ioctl_setattr_xflags","xfs_ip2xflags","xfs_iread_extents","xfs_irele","xfs_iroot_realloc","xfs_itruncate_extents_flags","xfs_iunlink","xfs_iunlink_item_precommit","xfs_iunlink_item_release","xfs_iunlink_item_sort","xfs_iunlink_log_dinode","xfs_iunlink_log_inode","xfs_iunlink_reload_next.isra.0","xfs_iunlink_remove","xfs_iunlink_remove_inode","xfs_iunlink_update_bucket.isra.0","xfs_iunlock","xfs_iunlock2_io_mmap","xfs_iunlock2_remapping","xfs_iunpin_wait","xfs_iwalk","xfs_iwalk_adjust_start","xfs_iwalk_ag","xfs_iwalk_ag_recs","xfs_iwalk_ag_start.constprop.0","xfs_iwalk_ag_work","xfs_iwalk_alloc","xfs_iwalk_free","xfs_iwalk_ichunk_ra","xfs_iwalk_run_callbacks","xfs_iwalk_threaded","xfs_kill_sb","xfs_link","xfs_lock_inodes.constprop.0","xfs_lock_two_inodes","xfs_log_calc_max_attrsetm_res","xfs_log_calc_minimum_size","xfs_log_calc_unit_res","xfs_log_check_lsn","xfs_log_clean","xfs_log_dinode_to_disk","xfs_log_force","xfs_log_force_inode","xfs_log_force_seq","xfs_log_get_max_trans_res","xfs_log_item_in_current_chkpt","xfs_log_item_init","xfs_log_mount","xfs_log_mount_cancel","xfs_log_mount_finish","xfs_log_need_covered.isra.0","xfs_log_quiesce","xfs_log_regrant","xfs_log_reserve","xfs_log_sb","xfs_log_space_wake","xfs_log_ticket_get","xfs_log_ticket_put","xfs_log_ticket_regrant","xfs_log_ticket_ungrant","xfs_log_unmount","xfs_log_unmount_write","xfs_log_work_queue","xfs_log_worker","xfs_log_writable","xfs_lookup","xfs_mod_delalloc","xfs_mod_freecounter","xfs_mode_to_ftype","xfs_mount_free","xfs_mount_reset_sbqflags","xfs_mountfs","xfs_next_bit","xfs_open_by_handle","xfs_open_devices","xfs_panic_mask_proc_handler","xfs_perag_clear_inode_tag","xfs_perag_get","xfs_perag_get_tag","xfs_perag_grab","xfs_perag_grab_tag","xfs_perag_hold","xfs_perag_intent_busy","xfs_perag_intent_drain","xfs_perag_intent_get","xfs_perag_intent_hold","xfs_perag_intent_put","xfs_perag_intent_rele","xfs_perag_put","xfs_perag_rele","xfs_perag_set_inode_tag","xfs_prealloc_blocks","xfs_prep_free_cowblocks","xfs_prepare_shift","xfs_printk_level","xfs_pwork_destroy","xfs_pwork_init","xfs_pwork_poll","xfs_pwork_queue","xfs_pwork_work","xfs_qm_adjust_dqlimits","xfs_qm_adjust_dqtimers","xfs_qm_destroy_quotainfo","xfs_qm_destroy_quotainos","xfs_qm_dqattach","xfs_qm_dqattach_locked","xfs_qm_dqattach_one","xfs_qm_dqdestroy","xfs_qm_dqdetach","xfs_qm_dqflush","xfs_qm_dqfree_one","xfs_qm_dqget","xfs_qm_dqget_cache_lookup","xfs_qm_dqget_checks","xfs_qm_dqget_inode","xfs_qm_dqget_next","xfs_qm_dqget_uncached","xfs_qm_dqpurge","xfs_qm_dqput","xfs_qm_dqread","xfs_qm_dqrele","xfs_qm_dqunpin_wait","xfs_qm_dquot_isolate","xfs_qm_dquot_logitem_committing","xfs_qm_dquot_logitem_format","xfs_qm_dquot_logitem_init","xfs_qm_dquot_logitem_pin","xfs_qm_dquot_logitem_push","xfs_qm_dquot_logitem_release","xfs_qm_dquot_logitem_size","xfs_qm_dquot_logitem_unpin","xfs_qm_dquot_walk.isra.0","xfs_qm_dqusage_adjust","xfs_qm_exit","xfs_qm_fill_state","xfs_qm_flush_one","xfs_qm_id_for_quotatype","xfs_qm_init_dquot_blk","xfs_qm_init_quotainfo","xfs_qm_init_quotainos","xfs_qm_init_timelimits","xfs_qm_mount_quotas","xfs_qm_need_dqattach","xfs_qm_newmount","xfs_qm_qino_alloc","xfs_qm_quotacheck","xfs_qm_quotacheck_dqadjust.constprop.0","xfs_qm_reset_dqcounts.constprop.0","xfs_qm_reset_dqcounts_all","xfs_qm_reset_dqcounts_buf","xfs_qm_scall_getquota","xfs_qm_scall_getquota_fill_qc.constprop.0","xfs_qm_scall_getquota_next","xfs_qm_scall_quotaoff","xfs_qm_scall_quotaon","xfs_qm_scall_setqlim","xfs_qm_scall_trunc_qfile","xfs_qm_scall_trunc_qfiles","xfs_qm_set_defquota","xfs_qm_shrink_count","xfs_qm_shrink_scan","xfs_qm_statvfs","xfs_qm_unmount","xfs_qm_unmount_quotas","xfs_qm_vop_chown","xfs_qm_vop_create_dqattach","xfs_qm_vop_dqalloc","xfs_qm_vop_rename_dqattach","xfs_quota_calc_throttle","xfs_quota_disable","xfs_quota_enable","xfs_quota_flags","xfs_quota_need_throttle","xfs_quota_type","xfs_quota_warn","xfs_readsb","xfs_reclaim_inode","xfs_reclaim_inodes","xfs_reclaim_inodes_count","xfs_reclaim_inodes_nr","xfs_reclaim_work_queue","xfs_reclaim_worker","xfs_recover_inode_owner_change","xfs_refc_block","xfs_refcount_adjust","xfs_refcount_adjust_cow","xfs_refcount_adjust_cow_extents","xfs_refcount_adjust_extents","xfs_refcount_alloc_cow_extent","xfs_refcount_btrec_to_irec","xfs_refcount_check_irec","xfs_refcount_decrease_extent","xfs_refcount_delete","xfs_refcount_find_left_extents","xfs_refcount_find_right_extents","xfs_refcount_find_shared","xfs_refcount_finish_one","xfs_refcount_finish_one_cleanup","xfs_refcount_free_cow_extent","xfs_refcount_get_rec","xfs_refcount_has_records","xfs_refcount_increase_extent","xfs_refcount_insert","xfs_refcount_intent_destroy_cache","xfs_refcount_lookup_eq","xfs_refcount_lookup_ge","xfs_refcount_lookup_le","xfs_refcount_merge_center_extents","xfs_refcount_merge_extents","xfs_refcount_merge_left_extent","xfs_refcount_merge_right_extent","xfs_refcount_query_range","xfs_refcount_query_range_helper","xfs_refcount_recover_cow_leftovers","xfs_refcount_recover_extent","xfs_refcount_recover_work","xfs_refcount_relog_intent","xfs_refcount_split_extent","xfs_refcount_still_have_space","xfs_refcount_update","xfs_refcount_update_abort_intent","xfs_refcount_update_cancel_item","xfs_refcount_update_create_done","xfs_refcount_update_create_intent","xfs_refcount_update_diff_items","xfs_refcount_update_finish_item","xfs_refcount_update_get_group","xfs_refcount_update_log_item.constprop.0","xfs_refcountbt_alloc_block","xfs_refcountbt_calc_reserves","xfs_refcountbt_calc_size","xfs_refcountbt_commit_staged_btree","xfs_refcountbt_compute_maxlevels","xfs_refcountbt_destroy_cur_cache","xfs_refcountbt_diff_two_keys","xfs_refcountbt_dup_cursor","xfs_refcountbt_free_block","xfs_refcountbt_get_maxrecs","xfs_refcountbt_get_minrecs","xfs_refcountbt_init_common","xfs_refcountbt_init_cursor","xfs_refcountbt_init_high_key_from_rec","xfs_refcountbt_init_key_from_rec","xfs_refcountbt_init_ptr_from_cur","xfs_refcountbt_init_rec_from_cur","xfs_refcountbt_key_diff","xfs_refcountbt_keys_contiguous","xfs_refcountbt_keys_inorder","xfs_refcountbt_max_size","xfs_refcountbt_maxlevels_ondisk","xfs_refcountbt_maxrecs","xfs_refcountbt_read_verify","xfs_refcountbt_recs_inorder","xfs_refcountbt_set_root","xfs_refcountbt_stage_cursor","xfs_refcountbt_verify","xfs_refcountbt_write_verify","xfs_reflink_allocate_cow","xfs_reflink_cancel_cow_blocks","xfs_reflink_cancel_cow_range","xfs_reflink_clear_inode_flag","xfs_reflink_convert_cow","xfs_reflink_convert_cow_locked","xfs_reflink_convert_unwritten.isra.0","xfs_reflink_end_cow","xfs_reflink_end_cow_extent","xfs_reflink_fill_cow_hole","xfs_reflink_find_shared","xfs_reflink_inode_has_shared_extents","xfs_reflink_recover_cow","xfs_reflink_remap_blocks","xfs_reflink_remap_extent","xfs_reflink_remap_prep","xfs_reflink_set_inode_flag","xfs_reflink_trim_around_shared","xfs_reflink_try_clear_inode_flag","xfs_reflink_unshare","xfs_reflink_update_dest","xfs_reinit_percpu_counters","xfs_rmap_alloc","xfs_rmap_alloc_extent","xfs_rmap_btrec_to_irec","xfs_rmap_check_irec","xfs_rmap_compare","xfs_rmap_convert","xfs_rmap_convert_extent","xfs_rmap_convert_shared","xfs_rmap_count_owners","xfs_rmap_count_owners_helper","xfs_rmap_delete","xfs_rmap_find_left_neighbor","xfs_rmap_find_left_neighbor_helper","xfs_rmap_finish_one","xfs_rmap_finish_one_cleanup","xfs_rmap_free","xfs_rmap_free_extent","xfs_rmap_get_rec","xfs_rmap_has_other_keys","xfs_rmap_has_records","xfs_rmap_insert","xfs_rmap_intent_destroy_cache","xfs_rmap_lookup_eq","xfs_rmap_lookup_le","xfs_rmap_lookup_le_range","xfs_rmap_lookup_le_range_helper","xfs_rmap_map","xfs_rmap_map_extent","xfs_rmap_map_raw","xfs_rmap_map_shared","xfs_rmap_query_all","xfs_rmap_query_range","xfs_rmap_query_range_helper","xfs_rmap_recover_work","xfs_rmap_relog_intent","xfs_rmap_unmap","xfs_rmap_unmap_extent","xfs_rmap_unmap_shared","xfs_rmap_update","xfs_rmap_update_abort_intent","xfs_rmap_update_cancel_item","xfs_rmap_update_create_done","xfs_rmap_update_create_intent","xfs_rmap_update_diff_items","xfs_rmap_update_finish_item","xfs_rmap_update_get_group","xfs_rmap_update_log_item.constprop.0","xfs_rmapbt_alloc_block","xfs_rmapbt_calc_reserves","xfs_rmapbt_calc_size","xfs_rmapbt_commit_staged_btree","xfs_rmapbt_compute_maxlevels","xfs_rmapbt_destroy_cur_cache","xfs_rmapbt_diff_two_keys","xfs_rmapbt_dup_cursor","xfs_rmapbt_free_block","xfs_rmapbt_get_maxrecs","xfs_rmapbt_get_minrecs","xfs_rmapbt_init_cursor","xfs_rmapbt_init_high_key_from_rec","xfs_rmapbt_init_key_from_rec","xfs_rmapbt_init_ptr_from_cur","xfs_rmapbt_init_rec_from_cur","xfs_rmapbt_key_diff","xfs_rmapbt_keys_contiguous","xfs_rmapbt_keys_inorder","xfs_rmapbt_max_size","xfs_rmapbt_maxlevels_ondisk","xfs_rmapbt_maxrecs","xfs_rmapbt_read_verify","xfs_rmapbt_recs_inorder","xfs_rmapbt_set_root","xfs_rmapbt_stage_cursor","xfs_rmapbt_verify","xfs_rmapbt_write_verify","xfs_rt_mark_healthy","xfs_rt_mark_sick","xfs_rt_measure_sickness","xfs_rud_item_format","xfs_rud_item_intent","xfs_rud_item_release","xfs_rud_item_size","xfs_rui_copy_format","xfs_rui_init","xfs_rui_item_format","xfs_rui_item_free","xfs_rui_item_match","xfs_rui_item_release","xfs_rui_item_size","xfs_rui_item_unpin","xfs_rui_release","xfs_rw_bdev","xfs_save_resvblks","xfs_scrub_metadata","xfs_set_acl","xfs_set_inode_alloc","xfs_set_low_space_thresholds","xfs_setattr_nonsize","xfs_setattr_size","xfs_setfilesize","xfs_setsize_buftarg","xfs_setup_devices","xfs_setup_inode","xfs_setup_iops","xfs_shutdown_devices","xfs_sort_for_rename.constprop.0","xfs_stats_clear_proc_handler","xfs_stats_clearall","xfs_stats_format","xfs_swap_change_owner","xfs_swap_extent_forks.constprop.0","xfs_swap_extent_rmap","xfs_swap_extents","xfs_swap_extents_check_format","xfs_symlink","xfs_symlink_blocks","xfs_symlink_hdr_ok","xfs_symlink_hdr_set","xfs_symlink_local_to_remote","xfs_symlink_read_verify","xfs_symlink_shortform_verify","xfs_symlink_verify","xfs_symlink_write_verify","xfs_sync_sb","xfs_sync_sb_buf","xfs_sysctl_register","xfs_sysctl_unregister","xfs_sysfs_del.constprop.0","xfs_sysfs_object_show","xfs_sysfs_object_store","xfs_sysfs_release","xfs_trans_add_item","xfs_trans_ail_cursor_clear.constprop.0","xfs_trans_ail_cursor_done","xfs_trans_ail_cursor_first","xfs_trans_ail_cursor_init","xfs_trans_ail_cursor_last","xfs_trans_ail_cursor_next","xfs_trans_ail_delete","xfs_trans_ail_destroy","xfs_trans_ail_init","xfs_trans_ail_insert","xfs_trans_ail_update_bulk","xfs_trans_alloc","xfs_trans_alloc_dir","xfs_trans_alloc_dqinfo","xfs_trans_alloc_empty","xfs_trans_alloc_ichange","xfs_trans_alloc_icreate","xfs_trans_alloc_inode","xfs_trans_apply_dquot_deltas","xfs_trans_apply_sb_deltas","xfs_trans_bhold","xfs_trans_bhold_release","xfs_trans_binval","xfs_trans_bjoin","xfs_trans_brelse","xfs_trans_buf_copy_type","xfs_trans_buf_is_dirty","xfs_trans_buf_item_match","xfs_trans_buf_set_type","xfs_trans_cancel","xfs_trans_commit","xfs_trans_committed_bulk","xfs_trans_del_item","xfs_fs_eofblocks_from_user","xfs_trans_dirty_buf","xfs_trans_dqjoin","xfs_trans_dqlockedjoin","xfs_trans_dqresv","xfs_trans_dquot_buf","xfs_trans_dup","xfs_trans_dup_dqinfo","xfs_trans_free","xfs_trans_free_dqinfo","xfs_trans_free_items","xfs_trans_get_buf_map","xfs_trans_get_dqtrx","xfs_trans_getsb","xfs_trans_ichgtime","xfs_trans_ijoin","xfs_trans_init","xfs_trans_inode_alloc_buf","xfs_trans_inode_buf","xfs_trans_log_buf","xfs_trans_log_dquot","xfs_trans_log_inode","xfs_trans_mod_dquot","xfs_trans_mod_dquot.part.0","xfs_trans_mod_dquot_byino","xfs_trans_mod_sb","xfs_trans_ordered_buf","xfs_trans_precommit_sort","xfs_trans_read_buf_map","xfs_trans_reserve","xfs_trans_reserve_more","xfs_trans_reserve_more_inode","xfs_trans_reserve_quota_bydquots","xfs_trans_reserve_quota_icreate","xfs_trans_reserve_quota_nblks","xfs_trans_resv_calc","xfs_trans_roll","xfs_trans_roll_inode","xfs_trans_run_precommits","xfs_trans_stale_inode_buf","xfs_trans_unreserve_and_mod_dquots","xfs_trans_unreserve_and_mod_sb","xfs_trim_extent","xfs_trim_gather_extents","xfs_trim_should_stop","xfs_truncate_page","xfs_unmount_flush_inodes","xfs_unmountfs","xfs_update_alignment","xfs_update_secondary_sbs","xfs_uuid_mount","xfs_uuid_table_free","xfs_uuid_unmount","xfs_validate_ag_length","xfs_validate_new_dalign","xfs_validate_sb_common","xfs_validate_sb_read","xfs_validate_sb_write.isra.0","xfs_validate_stripe_geometry","xfs_verifier_error","xfs_verify_dablk","xfs_verify_dir_ino","xfs_verify_fileext","xfs_verify_fileoff","xfs_verify_fsbext","xfs_verify_fsbno","xfs_verify_icount","xfs_verify_ino","xfs_verify_magic","xfs_verify_magic16","xfs_verify_rtbext","xfs_verify_rtbno","xfs_vn_ci_lookup","xfs_vn_create","xfs_vn_fiemap","xfs_vn_get_link","xfs_vn_getattr","xfs_vn_link","xfs_vn_listxattr","xfs_vn_lookup","xfs_vn_mkdir","xfs_vn_mknod","xfs_vn_rename","xfs_vn_setattr","xfs_vn_setattr_size","xfs_vn_symlink","xfs_vn_tmpfile","xfs_vn_unlink","xfs_vn_update_time","xfs_xattr_get","xfs_xattr_put_listent","xfs_xattr_set","xfs_zero_extent","xfs_zero_range","xfsaild","xfsaild_push"]},{"type":1,"name":"ext4","functions":["ext4_exit_fs","ext4_acl_from_disk","ext4_acl_to_disk.constprop.0","ext4_acquire_dquot","ext4_add_dirent_to_inline","ext4_add_entry","ext4_add_nondir","ext4_apply_options","ext4_attr_show","ext4_attr_store","ext4_begin_enable_verity","ext4_bg_has_super","ext4_bg_num_gdb","ext4_bio_write_page.cold","ext4_break_layouts","ext4_buffered_write_iter","ext4_cache_extents","ext4_calculate_overhead","ext4_can_extents_be_merged.constprop.0","ext4_can_truncate","ext4_change_inode_journal_flag","ext4_check_all_de","ext4_check_blockref","ext4_check_descriptors","ext4_check_feature_compatibility","ext4_check_opt_consistency","ext4_check_quota_consistency.isra.0","ext4_chunk_trans_blocks","ext4_claim_free_clusters","ext4_clear_blocks","ext4_clear_inode","ext4_clear_inode_es","ext4_clear_journal_err","ext4_clear_request_list","ext4_clu_mapped","ext4_collapse_range","ext4_commit_super","ext4_compat_ioctl","ext4_convert_inline_data","ext4_convert_inline_data_nolock","ext4_convert_inline_data_to_extent","ext4_convert_meta_bg","ext4_convert_unwritten_extents","ext4_convert_unwritten_io_end_vec","ext4_count_dirs","ext4_count_free","ext4_count_free_clusters","ext4_count_free_inodes","ext4_create","ext4_create_inline_data","ext4_cross_rename","ext4_datasem_ensure_credits","ext4_dax_fault","ext4_dax_huge_fault","ext4_dax_write_iter","ext4_dax_writepages","ext4_decode_error","ext4_delete_entry","ext4_delete_inline_entry","ext4_destroy_inline_data","ext4_destroy_inline_data_nolock","ext4_destroy_inode","ext4_destroy_system_zone","ext4_dir_llseek","ext4_dirblock_csum_verify","ext4_discard_allocated_blocks","ext4_discard_preallocations","ext4_discard_work","ext4_do_update_inode.isra.0","ext4_do_writepages","ext4_double_down_write_data_sem","ext4_double_up_write_data_sem","ext4_drop_inode","ext4_dx_add_entry","ext4_dx_csum","ext4_dx_find_entry","ext4_dx_readdir","ext4_empty_dir","ext4_enable_quotas","ext4_encrypted_get_link","ext4_encrypted_symlink_getattr","ext4_end_bitmap_read","ext4_end_enable_verity","ext4_es_cache_extent","ext4_es_can_be_merged.isra.0","ext4_es_can_be_merged.isra.0.cold","ext4_es_count","ext4_es_delayed_clu","ext4_es_find_extent_range","ext4_es_free_extent","ext4_es_init_tree","ext4_es_insert_delayed_block","ext4_es_insert_extent","ext4_es_is_delayed","ext4_es_is_delayed","ext4_es_is_delonly","ext4_es_is_delonly","ext4_es_is_mapped","ext4_es_lookup_extent","ext4_es_register_shrinker","ext4_es_remove_extent","ext4_es_scan","ext4_es_scan_clu","ext4_es_scan_range","ext4_es_unregister_shrinker","ext4_evict_ea_inode","ext4_evict_inode","ext4_expand_extra_isize","ext4_expand_extra_isize_ea","ext4_expand_inode_array","ext4_fc_add_dentry_tlv","ext4_fc_add_tlv","ext4_fc_cleanup","ext4_fc_commit","ext4_fc_del","ext4_fc_destroy_dentry_cache","ext4_fc_free","ext4_fc_info_show","ext4_fc_init","ext4_fc_init_inode","ext4_fc_mark_ineligible","ext4_fc_perform_commit","ext4_fc_record_modified_inode.isra.0","ext4_fc_record_regions","ext4_fc_replay","ext4_fc_replay_add_range.constprop.0","ext4_fc_replay_check_excluded","ext4_fc_replay_cleanup","ext4_fc_replay_del_range.constprop.0","ext4_fc_replay_inode","ext4_fc_replay_link_internal.isra.0","ext4_fc_replay_scan.isra.0","ext4_fc_reserve_space","ext4_fc_set_bitmaps_and_counters","ext4_fc_start_update","ext4_fc_stop_update","ext4_fc_submit_bh","ext4_fc_track_create","ext4_fc_track_inode","ext4_fc_track_link","ext4_fc_track_range","ext4_fc_track_template.isra.0","ext4_fc_track_unlink","ext4_fc_update_stats","ext4_fc_wait_committing_inode","ext4_fc_write_inode","ext4_fc_write_inode_data","ext4_fc_write_tail","ext4_feat_release","ext4_feature_set_ok","ext4_fill_flex_info","ext4_fill_raw_inode","ext4_fill_super","ext4_flex_group_add","ext4_fname_free_filename","ext4_fname_from_fscrypt_name","ext4_fname_prepare_lookup","ext4_fname_setup_filename","ext4_force_commit","ext4_force_shutdown","ext4_freeze","ext4_fsmap_from_internal","ext4_fsmap_to_internal","ext4_generic_delete_entry","ext4_generic_write_checks","ext4_geometry_check","ext4_get_acl","ext4_get_bitmap.isra.0","ext4_get_block","ext4_get_block_unwritten","ext4_get_branch","ext4_get_context","ext4_get_dev_journal","ext4_get_dquots","ext4_get_dummy_policy","ext4_get_es_cache","ext4_get_fc_inode_loc","ext4_get_first_dir_block.constprop.0","ext4_get_first_inline_block","ext4_get_group_desc","ext4_get_group_info","ext4_get_group_no_and_offset","ext4_get_group_number","ext4_get_ino_and_lblk_bits","ext4_get_inode_loc","ext4_get_inode_usage","ext4_get_io_end","ext4_get_journal_inode","ext4_get_link","ext4_get_max_inline_size","ext4_get_max_inline_size.part.0","ext4_get_parent","ext4_get_projid","ext4_get_reserved_space","ext4_get_tree","ext4_get_verity_descriptor","ext4_get_verity_descriptor_location.constprop.0","ext4_getattr","ext4_getblk","ext4_getblk.cold","ext4_getfsmap","ext4_getfsmap_compare","ext4_getfsmap_datadev","ext4_getfsmap_datadev_helper","ext4_getfsmap_dev_compare","ext4_getfsmap_find_fixed_metadata","ext4_getfsmap_format","ext4_getfsmap_free_fixed_metadata","ext4_getfsmap_helper","ext4_getfsmap_is_valid_device.isra.0","ext4_getfsmap_logdev","ext4_group_add","ext4_group_add_blocks","ext4_group_desc_csum","ext4_group_desc_csum_set","ext4_group_desc_csum_verify","ext4_group_desc_init","ext4_group_extend","ext4_group_extend_no_check","ext4_group_extend_no_check.cold","ext4_handle_dirty_dirblock","ext4_handle_dirty_dx_node","ext4_handle_error","ext4_handle_error.cold","ext4_handle_inode_extension","ext4_has_free_clusters","ext4_has_stable_inodes","ext4_htree_fill_tree","ext4_htree_free_dir_info","ext4_htree_next_block","ext4_htree_store_dirent","ext4_inc_count","ext4_ind_map_blocks","ext4_ind_map_blocks.cold","ext4_ind_migrate","ext4_ind_remove_space","ext4_ind_trans_blocks","ext4_ind_truncate","ext4_ind_truncate_ensure_credits","ext4_init_acl","ext4_init_block_bitmap","ext4_init_block_bitmap.cold","ext4_init_dot_dotdot","ext4_init_fs_context","ext4_init_inode_table","ext4_init_io_end","ext4_init_journal_params","ext4_init_metadata_csum","ext4_init_new_dir","ext4_init_orphan_info","ext4_init_pending_tree","ext4_init_security","ext4_init_symlink_block","ext4_initialize_dirent_tail","ext4_initxattrs","ext4_inline_data_iomap","ext4_inline_data_truncate","ext4_inlinedir_to_tree","ext4_inode_attach_jinode","ext4_inode_bitmap","ext4_inode_bitmap_csum_set","ext4_inode_bitmap_csum_verify","ext4_inode_bitmap_set","ext4_inode_block_valid","ext4_inode_csum","ext4_inode_csum_set","ext4_inode_extension_cleanup","ext4_inode_is_fast_symlink","ext4_inode_journal_mode","ext4_inode_table","ext4_inode_table_set","ext4_inode_to_goal_block","ext4_insert_dentry","ext4_insert_range","ext4_invalidate_folio","ext4_ioc_getfsmap","ext4_ioctl","ext4_ioctl_get_encryption_pwsalt","ext4_ioctl_getuuid","ext4_ioctl_group_add","ext4_ioctl_setflags","ext4_ioctl_setproject","ext4_is_pending","ext4_issue_zeroout","ext4_itable_unused_count","ext4_itable_unused_set","ext4_jbd2_inode_add_write.part.0","ext4_kill_sb","ext4_kvfree_array_rcu","ext4_last_io_end_vec","ext4_lazyinit_thread","ext4_lazyinit_thread.part.0","ext4_link","ext4_list_backups","ext4_listxattr","ext4_llseek","ext4_load_and_init_journal","ext4_load_journal","ext4_load_super","ext4_lookup","ext4_lookup.part.0","ext4_map_blocks","ext4_mb_add_groupinfo","ext4_mb_alloc_groupinfo","ext4_mb_check_limits","ext4_mb_choose_next_group_cr0.constprop.0","ext4_mb_choose_next_group_cr1.constprop.0","ext4_mb_clear_bb","ext4_mb_collect_stats","ext4_mb_complex_scan_group","ext4_mb_discard_group_preallocations","ext4_mb_discard_lg_preallocations","ext4_mb_discard_preallocations_should_retry","ext4_mb_find_by_goal","ext4_mb_free_metadata","ext4_mb_generate_buddy","ext4_mb_generate_from_pa","ext4_mb_good_group","ext4_mb_good_group_nolock","ext4_mb_init","ext4_mb_init.cold","ext4_mb_init_backend","ext4_mb_init_cache","ext4_mb_init_group","ext4_mb_initialize_context","ext4_mb_load_buddy_gfp","ext4_mb_mark_bb","ext4_mb_mark_diskspace_used","ext4_mb_mark_pa_deleted","ext4_mb_new_blocks","ext4_mb_new_blocks_simple","ext4_mb_new_blocks_simple.cold","ext4_mb_new_group_pa","ext4_mb_new_inode_pa","ext4_mb_normalize_request.constprop.0","ext4_mb_pa_adjust_overlap.constprop.0","ext4_mb_pa_callback","ext4_mb_pa_put_free","ext4_mb_prefetch","ext4_mb_prefetch_fini","ext4_mb_regular_allocator","ext4_mb_release","ext4_mb_release_context.isra.0","ext4_mb_release_group_pa.isra.0","ext4_mb_release_inode_pa.isra.0","ext4_mb_scan_aligned","ext4_mb_seq_groups_next","ext4_mb_seq_groups_show","ext4_mb_seq_groups_start","ext4_mb_seq_groups_stop","ext4_mb_seq_structs_summary_next","ext4_mb_seq_structs_summary_show","ext4_mb_seq_structs_summary_start","ext4_mb_seq_structs_summary_stop","ext4_mb_simple_scan_group","ext4_mb_try_best_found","ext4_mb_unload_buddy","ext4_mb_use_best_found","ext4_mb_use_inode_pa","ext4_mb_use_preallocated.constprop.0","ext4_mpage_readpages","ext4_multi_mount_protect","ext4_new_meta_blocks","ext4_nfs_commit_metadata","ext4_nfs_get_inode","ext4_nonda_switch","ext4_normal_submit_inode_data_buffers","ext4_notify_error_sysfs","ext4_num_base_meta_clusters","ext4_num_overhead_clusters","ext4_orphan_add","ext4_orphan_add.cold","ext4_orphan_cleanup","ext4_orphan_del","ext4_orphan_file_add","ext4_orphan_file_block_trigger","ext4_orphan_file_empty","ext4_orphan_get","ext4_page_mkwrite","ext4_parse_param","ext4_prepare_inline_data","ext4_process_freed_data","ext4_process_orphan","ext4_punch_hole","ext4_put_io_end","ext4_put_io_end_defer","ext4_put_super","ext4_put_super.cold","ext4_quota_off","ext4_quota_on","ext4_quota_read","ext4_quota_write","ext4_rcu_ptr_callback","ext4_reconfigure","ext4_register_li_request","ext4_register_sysfs","ext4_release_dir","ext4_release_dquot","ext4_release_file","ext4_release_folio","ext4_release_orphan_info","ext4_release_system_zone","ext4_remove_blocks","ext4_remove_pending","ext4_rename","ext4_rename2","ext4_rename_dir_finish","ext4_rename_dir_prepare.part.0.constprop.0","ext4_rereserve_cluster","ext4_reserve_inode_write","ext4_reset_inode_seed","ext4_resetent","ext4_resize_begin","ext4_resize_end","ext4_resize_fs","ext4_rmdir","ext4_rmdir.part.0","ext4_run_li_request","ext4_sample_last_mounted","ext4_sb_block_valid","ext4_sb_bread","ext4_sb_bread_unmovable","ext4_sb_breadahead_unmovable","ext4_sb_release","ext4_sb_setlabel","ext4_sb_setuuid","ext4_search_dir","ext4_seq_es_shrinker_info_show","ext4_seq_mb_stats_show","ext4_seq_options_show","ext4_set_acl","ext4_set_aops","ext4_set_context","ext4_set_def_opts","ext4_set_inode_flags","ext4_set_iomap","ext4_setattr","ext4_setent","ext4_setup_new_descs","ext4_setup_next_flex_gd","ext4_setup_super","ext4_setup_super.cold","ext4_setup_system_zone","ext4_setup_system_zone.cold","ext4_should_retry_alloc","ext4_show_options","ext4_shutdown","ext4_split_convert_extents","ext4_split_extent","ext4_split_extent_at","ext4_stop_mmpd","ext4_superblock_csum","ext4_superblock_csum_set","ext4_sync_file.cold","ext4_try_add_inline_entry","ext4_try_create_inline_dir","ext4_try_merge_freed_extent.part.0","ext4_try_to_trim_range","ext4_try_to_write_inline_data","ext4_unregister_li_request","ext4_unregister_sysfs","ext4_update_backup_sb","ext4_update_bh_state","ext4_update_dir_count","ext4_update_disksize_before_punch","ext4_update_dx_flag","ext4_update_dynamic_rev","ext4_update_final_de","ext4_update_inline_data","ext4_update_overhead","ext4_update_primary_sb","ext4_update_super","ext4_update_super","ext4_update_super.cold","ext4_update_superblocks_fn","ext4_used_dirs_count","ext4_used_dirs_set","ext4_valid_block_bitmap","ext4_validate_block_bitmap.part.0","ext4_wait_block_bitmap","ext4_walk_page_buffers","ext4_write_inode.cold","ext4_xattr_block_csum","ext4_xattr_block_csum_set","ext4_xattr_block_find","ext4_xattr_block_get","ext4_xattr_block_set","ext4_xattr_cmp","ext4_xattr_create_cache","ext4_xattr_delete_inode","ext4_xattr_destroy_cache","ext4_xattr_free_space","ext4_xattr_get","ext4_xattr_get_block","ext4_xattr_hurd_get","ext4_xattr_hurd_list","ext4_xattr_hurd_set","ext4_xattr_ibody_find","ext4_xattr_ibody_get","ext4_xattr_ibody_set","ext4_xattr_inode_array_free","ext4_xattr_inode_cache_find","ext4_xattr_inode_create","ext4_xattr_inode_dec_ref_all","ext4_xattr_inode_free_quota","ext4_xattr_inode_get","ext4_xattr_inode_get.cold","ext4_xattr_inode_iget","ext4_xattr_inode_inc_ref_all","ext4_xattr_inode_lookup_create","ext4_xattr_inode_read","ext4_xattr_inode_update_ref","ext4_xattr_inode_write","ext4_xattr_list_entries","ext4_xattr_move_to_block","ext4_xattr_release_block","ext4_xattr_security_get","ext4_xattr_security_set","ext4_xattr_set","ext4_xattr_set_credits","ext4_xattr_set_entry","ext4_xattr_set_handle","ext4_xattr_shift_entries","ext4_xattr_trusted_get","ext4_xattr_trusted_list","ext4_xattr_trusted_set","ext4_xattr_user_get","ext4_xattr_user_list","ext4_xattr_user_set","ext4_xattr_value_same.isra.0","ext4_zero_partial_blocks","ext4_zero_range","ext4fs_dirhash"]},{"type":1,"name":"iomap","functions":["iomap_init","iomap_iter_advance","iomap_iter_done"]},{"type":1,"name":"iov","functions":["iov_iter_alignment","iov_iter_advance","iov_iter_init"]},{"type":2,"name":"test_posix","functions":[],"binary_path":"/home/haridev/datacrumbs/build/bin/df_tracer_test"},{"type":1,"name":"os_page_cache","functions":["filemap_write_and_wait_range","fault_in_readable","filemap_get_entry","folio_unlock","__filemap_add_folio","__filemap_fdatawrite_range","__filemap_get_folio","__filemap_remove_folio","__filemap_set_wb_err","__folio_cancel_dirty","__folio_lock","__folio_lock_killable","__folio_lock_or_retry","__folio_mark_dirty","__page_cache_alloc","__readahead_batch","__readahead_folio","__set_page_dirty","__set_page_dirty_nobuffers","find_get_page","find_get_page_flags","find_lock_page","find_or_create_page","find_subpage","i_blocks_per_folio","i_blocks_per_page","inode_drain_writes","linear_page_index","lock_page","noop_dirty_folio","page_cache_alloc","page_cache_async_ra","page_cache_async_readahead","page_cache_next_miss","page_cache_prev_miss","page_cache_ra_unbounded","page_cache_sync_ra","page_cache_sync_readahead","page_file_mapping","page_file_offset","page_mapping","page_mkwrite_check_truncate","page_offset","page_to_pgoff","pagecache_get_page","read_cache_folio","read_cache_page","read_cache_page_gfp","read_mapping_folio","read_mapping_page","readahead_batch_length","readahead_count","readahead_expand","readahead_folio","readahead_gfp_mask","readahead_index","readahead_length","readahead_page","readahead_pos","replace_page_cache_folio","swapcache_mapping","trylock_page","unlock_page","wait_for_stable_page","wait_on_page_locked","wait_on_page_writeback","wake_page_match","write_inode_now"]},{"type":1,"name":"shm","functions":["shmem_init"]},{"type":1,"name":"fscache","functions":["fscache_update_aux"]},{"type":2,"name":"ior","functions":["_dl_relocate_static_pie","_fini","_init","_start"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/ior-3.3.0-ip47j26fw7xxfftdzjvy2h36phgcuypv/bin/ior","include_offsets":false}] +[{"type":4,"name":"custom1","functions":[],"bpf_path":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c","start_event_id":100000,"process_header":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h","event_type":2},{"type":0,"name":"sys","functions":["fork","sys","ioctl","newfstatat","ni_syscall","old_mmap","old_select","io_getevents","io_getevents_time32","io_pgetevents","io_pgetevents_time32","epoll_create1","epoll_ctl","epoll_pwait","epoll_pwait2","ioprio_set","ioprio_get","umount","mount","pivot_root","chroot","vhangup","pipe2","quotactl","quotactl_fd","getdents64","pselect6","pselect6_time32","ppoll","ppoll_time32","signalfd4","vmsplice","splice","tee","timerfd_create","timerfd_settime","timerfd_gettime","timerfd_gettime32","timerfd_settime32","utimensat","utimensat_time32","acct","capget","capset","personality","waitid","set_tid_address","unshare","futex","futex_time32","get_robust_list","set_robust_list","futex_waitv","futex_wake","futex_wait","futex_requeue","nanosleep","nanosleep_time32","getitimer","setitimer","kexec_load","init_module","delete_module","timer_create","timer_gettime","timer_getoverrun","timer_settime","timer_delete","clock_settime","clock_gettime","clock_getres","clock_nanosleep","timer_gettime32","timer_settime32","clock_settime32","clock_gettime32","clock_getres_time32","clock_nanosleep_time32","syslog","ptrace","sched_setparam","sched_setscheduler","sched_getscheduler","sched_getparam","sched_setaffinity","sched_getaffinity","sched_yield","sched_get_priority_max","sched_get_priority_min","sched_rr_get_interval","sched_rr_get_interval_time32","restart_syscall","kill","tkill","tgkill","sigaltstack","rt_sigsuspend","rt_sigaction","rt_sigprocmask","rt_sigpending","rt_sigtimedwait","rt_sigtimedwait_time32","rt_sigqueueinfo","setpriority","getpriority","reboot","setregid","setgid","setreuid","setuid","setresuid","getresuid","setresgid","getresgid","setfsuid","setfsgid","times","setpgid","getpgid","getsid","setsid","getgroups","setgroups","newuname","sethostname","setdomainname","getrlimit","setrlimit","getrusage","umask","prctl","getcpu","gettimeofday","settimeofday","adjtimex","adjtimex_time32","getpid","getppid","getuid","geteuid","getgid","getegid","gettid","sysinfo","mq_open","mq_unlink","mq_timedsend","mq_timedreceive","mq_notify","mq_getsetattr","mq_timedreceive_time32","mq_timedsend_time32","msgget","old_msgctl","msgctl","msgrcv","msgsnd","semget","semctl","old_semctl","semtimedop","semtimedop_time32","semop","shmget","old_shmctl","shmctl","shmat","shmdt","socket","socketpair","bind","listen","accept","connect","getsockname","getpeername","sendto","recvfrom","setsockopt","getsockopt","shutdown","sendmsg","recvmsg","readahead","brk","add_key","request_key","keyctl","clone","clone3","execve","swapon","swapoff","get_mempolicy","set_mempolicy","rt_tgsigqueueinfo","perf_event_open","accept4","recvmmsg","recvmmsg_time32","wait4","prlimit64","name_to_handle_at","open_by_handle_at","clock_adjtime","clock_adjtime32","setns","sendmmsg","kcmp","finit_module","sched_setattr","sched_getattr","renameat2","seccomp","getrandom","memfd_create","bpf","execveat","userfaultfd","membarrier","mlock2","pkey_mprotect","pkey_alloc","pkey_free","rseq","open_tree","move_mount","mount_setattr","fsopen","fsconfig","fsmount","fspick","pidfd_send_signal","pidfd_getfd","landlock_create_ruleset","landlock_add_rule","landlock_restrict_self","memfd_secret","set_mempolicy_home_node","cachestat","map_shadow_stack","ioperm","pciconfig_read","pciconfig_write","pciconfig_iobase","spu_run","spu_create","chmod","chown","lchown","epoll_create","eventfd","signalfd","sendfile","alarm","getpgrp","pause","time","time32","futimesat_time32","utime32","utimes_time32","select","poll","epoll_wait","recv","send","oldumount","uselib","stime","stime32","sigpending","sigprocmask","sgetmask","ssetmask","signal","nice","kexec_file_load","waitpid","socketcall","old_readdir","gethostname","uname","olduname","ipc"]},{"type":2,"name":"libc","functions":["fnmatch@@GLIBC_2.2.5","sched_getaffinity@@GLIBC_2.3.4","getgrnam_r@@GLIBC_2.2.5","sysctl@GLIBC_2.2.5","forkpty@@GLIBC_2.34","getpwnam_r@@GLIBC_2.2.5","getgrgid_r@@GLIBC_2.2.5","openpty@@GLIBC_2.34","fdetach@GLIBC_2.2.5","gai_error@GLIBC_2.2.5","res_send@@GLIBC_2.34","putmsg@GLIBC_2.2.5","fmemopen@GLIBC_2.2.5","forkpty@GLIBC_2.2.5","getpwuid_r@@GLIBC_2.2.5","res_mailok@@GLIBC_2.34","getspnam_r@@GLIBC_2.2.5","quick_exit@@GLIBC_2.24","logwtmp@@GLIBC_2.34","logout@@GLIBC_2.34","fopencookie@@GLIBC_2.2.5","gai_cancel@@GLIBC_2.34","glob64@GLIBC_2.2.5","getgrent_r@@GLIBC_2.2.5","_getopt_internal_r","frexpf128","res_search@@GLIBC_2.34","_nl_select_era_entry","finitef128_do_not_use","copysignf32x","gai_error@@GLIBC_2.34","copysignf32","getmsg@GLIBC_2.2.5","_nl_get_walt_digit","_create_xid","sstk@GLIBC_2.2.5","_nl_cleanup_time","_itoa_word","_nl_unload_domain","_getopt_long_r","getspent_r@@GLIBC_2.2.5","_getopt_long_only_r","_option_is_end","_IO_str_count","_nl_cleanup_ctype","_des_crypt","_getopt_internal","_openchild","re_string_realloc_buffers","context_reuse","hex2bin","x_putint32","x_getpostn","gai_suspend@@GLIBC_2.34","duplicate_node","bin2hex","tr_break@GLIBC_2.2.5","_nl_init_era_entries.part.0","exec_comm","gethostbyname2_r@@GLIBC_2.2.5","_nl_make_l10nflist.localalias","_nl_find_msg","gethostent_r@@GLIBC_2.2.5","start_thread","get_kernel_syms@GLIBC_2.2.5","get_scope","add_prefixlist","match_prefix","in6aicmp","fini","exchange","parse_branch","parse_expression","authdes_nextverf","re_search_internal","gr_map_free","merge_state_with_log","until_short","get_subexp_sub","clean_state_log_if_needed","canon_doc_option","extend_buffers","check_arrival_expand_ecl_sub","check_node_accept_bytes","sub_epsilon_src_nodes","harmless","pmap_rmtcall@GLIBC_2.2.5","merge_state_array","re_acquire_state_context","w_addword","check_dst_limits","check_halt_state_context","context_send_common","utf8_encode.part.0","build_charclass","pop_fail_stack","time_ifunc","match_ctx_clean","re_dfa_add_node","free_charset","build_upper_buffer","re_node_set_add_intersect","free_state","search_cur_bkref_entry","re_node_set_compare","print_and_abort","internal_getgrouplist","clear_once_control","send_vc","shm_open@GLIBC_2.2.5","fstab_init","lio_listio64@@GLIBC_2.34","_nl_init_alt_digit","parse_rule","free_tree","parse_offset","decode_name","argp_hol","x_putbytes","strcspn_ifunc","ext_match","compute_change","ranged_convert","ydhms_diff","name_to_database_index","binary_hnok","memchr_ifunc","get_mnt_entry","end_pattern","str_append","ptrlist_add__","critical_factorization","argp_doc","gethosts","read_alias_file","authnone_validate","ldexpf32","memcmp_ifunc","strrchr_ifunc","strncat_ifunc","strlen_ifunc","gai_suspend@GLIBC_2.2.5","strcpy_ifunc","re_string_context_at","_int_realloc","next_line","sysmalloc","arena_get_retry","arena_get2.part.0","fetch_number","register_state","des_setparity@GLIBC_2.2.5","ptmalloc_init.part.0","process_long_option","internal_fallocate64","build_wcs_upper_buffer","try_file","get_locked_global","key_call_socket","read_conf_file.isra.0","change_sigmask","check_arrival_expand_ecl","resolv_conf_matches","calc_eclosure_iter","arg_bool","duplicate_node_closure","strspn_ifunc","fts_build","prefixcmp","get_nprocs_cpu_online","initshells","fstab_free","add_request_to_runlist","duplicate_tree","tdestroy_recurse","strpbrk_ifunc","peek_token","glob@GLIBC_2.2.5","argp_args_levels.isra.0","strcmp_ifunc","array_add__","x_setpostn","authdes_refresh","fstab_convert","create_token_tree","realpath_stk","authdes_marshal","check_arrival","fts_alloc.isra.0","internal_fnmatch","x_putlong","expand_bkref_cache","msgctl@@GLIBC_2.2.5","pmap_getport@GLIBC_2.2.5","quick_exit@GLIBC_2.10","authnone_verf","get_next_alias","freeres","sock_eq","hol_cousin_cluster_cmp.isra.0","ftw_dir","check_node_accept","decide_maybe_mmap","vtimes_one.part.0","internal_addseverity","build_trtable","adjust_wide_data","getaliasbyname_r@@GLIBC_2.2.5","alloc_perturb","_nl_get_era_entry","scalbnf64x","print_header","set_binding_values.part.0","get_nproc_stat","update_cur_sifted_state","authdes_destroy","walker","strncpy_ifunc","helper_thread","parse_dollars","authnone_create@GLIBC_2.2.5","scalbnf128","tzset_internal","locked_vfxprintf","wcsrchr_ifunc","_Unwind_GetCFA","get_free_list","new_do_write","wait_on_socket","frexpf32","find_derivation","option_alloc","detach_arena.part.0","_int_malloc","buffer_free","sched_setaffinity@@GLIBC_2.3.4","register_file","key_gendes@GLIBC_2.2.5","skip","send_dg","_res_hconf_trim_domain","gethostbyname3_context","authnone_create_once","decrement_at_index.part.0","lower_subexp","scalbnf32","strncmp_ifunc","isinff128_do_not_use","nrl_domainname","freecache","hol_entry_short_iterate","authdes_pk_create@GLIBC_2.2.5","do_system","getpwent_r@@GLIBC_2.2.5","gethostbyname_r@@GLIBC_2.2.5","unwind_stop","create_thread","_IO_wstrn_overflow","token.part.0","wcsncmp_ifunc","find_module_idx","indent_to","hack_digit","open_socket","getttyname_r","_IO_obstack_xsputn","reopen","peek_token_bracket","fts_sort","asctime_internal","maybe_init","alias_compare","fts_stat.isra.0","ecb_crypt@GLIBC_2.2.5","time_syscall","add_module","sift_states_backward","do_release_shlib","do_release_all","new_composite_name","memset_ifunc","x_destroy","free_category","re_compile_internal","msort_with_tmp.part.0","fmemopen@@GLIBC_2.22","free_dfa_content","try_nocreate","strcat_ifunc","_IO_cookie_read","_IO_cookie_seek","space","_IO_cookie_close","parse_reg_exp","fts_palloc","_IO_fopencookie","_IO_str_finish","_nl_expand_alias","copysignf128","_IO_default_seekpos","_int_free","getpmsg@GLIBC_2.2.5","_IO_getwc","build_charclass_op","rtime@GLIBC_2.2.5","unlock","uselib@GLIBC_2.2.5","bdflush@GLIBC_2.2.5","derivation_compare","object_compare","_res_hconf_init","sched_setaffinity@GLIBC_2.3.3","internal_fnwmatch","_argp_input","end_wpattern","ext_wmatch","pcmp","_nl_archive_subfreeres","check_dst_limits_calc_pos_1","_option_is_short","try_dir","argp_default_parser","pmap_getmaps@GLIBC_2.2.5","_seterr_reply@GLIBC_2.2.5","matches_last_entry","parse_backtick","aio_fsync64@@GLIBC_2.34","perror_internal","maybe_script_execute","add_alias2.part.0","authdes_create@GLIBC_2.2.5","munmap_chunk","hst_map_free","_nl_get_alt_digit","re_node_set_init_union","gai_cancel@GLIBC_2.2.5","usage_argful_short_opt","re_acquire_state","copysignf64x","getpublickey@GLIBC_2.2.5","ldexpf64","check_one_fd","re_compile_fastmap_iter","_nl_parse_alt_digit","authdes_getucred@GLIBC_2.2.5","modff128","_Unwind_ForcedUnwind","re_node_set_merge","check_subexp_matching_top","_nl_explode_name","isnanf128_do_not_use","ftw_startup","key_get_conv@GLIBC_2.2.5","_nl_postload_ctype","scalbnf64","re_search_stub","fattach@GLIBC_2.2.5","hol_entry_qcmp","w_addmem","eval_expr_multdiv","cfree@GLIBC_2.2.5"],"binary_path":"/usr/lib64/libc.so.6"},{"type":2,"name":"hdf5","functions":["H5SL_above","H5SL_add","H5SL_below:0x2794b0","H5SL_close:0x27a240","H5SL_count:0x26f830","H5SL_create:0x26f680","H5SL_destroy:0x27a170","H5SL_find:0x278e80","H5SL_first:0x27a020","H5SL_free:0x27a120","H5SL_greater:0x2788a0","H5SL_init:0x26f5c0","H5SL_insert:0x26f840","H5SL_item:0x27a060","H5SL_iterate:0x27a070","H5SL_last:0x27a050","H5SL_less:0x278260","H5SL_next:0x27a030","H5SL_prev:0x27a040","H5SL_release:0x27a0c0","H5SL_remove:0x26f8f0","H5SL_remove_first:0x2776f0","H5SL_search:0x277c10","H5SL_term_package:0x26f600","H5SM__get_index:0x27b480","H5SM__get_mesg_count_test:0x281610","H5SM__list_free:0x27f4f0","H5SM__message_compare:0x2811c0","H5SM__message_decode:0x281500","H5SM__message_encode:0x2813b0","H5SM__table_free:0x27f4b0","H5SM_can_share:0x27b940","H5SM_delete:0x27d490","H5SM_get_fheap_addr:0x27b780","H5SM_get_info:0x27e590","H5SM_get_refcount:0x27ed00","H5SM_ih_size:0x27ff50","H5SM_init:0x27ada0","H5SM_list_debug:0x27f990","H5SM_reconstitute:0x27ece0","H5SM_table_debug:0x27f530","H5SM_try_share:0x27bc00","H5SM_type_shared:0x27b580","H5T__alloc:0x2831b0","H5T__array_create:0x290bf0","H5T__bit_copy:0x2917f0","H5T__bit_dec:0x2928f0","H5T__bit_find:0x2920e0","H5T__bit_get_d:0x291d20","H5T__bit_inc:0x2927d0","H5T__bit_neg:0x292a00","H5T__bit_set:0x291db0","H5T__bit_set_d:0x291d70","H5T__bit_shift:0x291eb0","H5T__commit:0x294900","H5T__commit_anon:0x2950e0","H5T__commit_named:0x293640","H5T__conv_array:0x301480","H5T__conv_b_b:0x2fc5d0","H5T__conv_double_float:0x2f3330","H5T__conv_double_int:0x2ef570","H5T__conv_double_ldouble:0x2f3b30","H5T__conv_double_llong:0x2f1e10","H5T__conv_double_long:0x2f08f0","H5T__conv_double_schar:0x2ece10","H5T__conv_double_short:0x2ee170","H5T__conv_double_uchar:0x2ed7c0","H5T__conv_double_uint:0x2eff20","H5T__conv_double_ullong:0x2f2780","H5T__conv_double_ulong:0x2f1260","H5T__conv_double_ushort:0x2eeb70","H5T__conv_enum:0x2ff6f0","H5T__conv_enum_numeric:0x2ffce0","H5T__conv_f_f:0x2e2430","H5T__conv_f_i:0x2e43e0","H5T__conv_float_double:0x2ec590","H5T__conv_float_int:0x2e86a0","H5T__conv_float_ldouble:0x2ec9c0","H5T__conv_float_llong:0x2eae70","H5T__conv_float_long:0x2e9750","H5T__conv_float_schar:0x2e5fa0","H5T__conv_float_short:0x2e72f0","H5T__conv_float_uchar:0x2e6940","H5T__conv_float_uint:0x2e8ed0","H5T__conv_float_ullong:0x2eb8c0","H5T__conv_float_ulong:0x2ea1a0","H5T__conv_float_ushort:0x2e7cc0","H5T__conv_i_f:0x299b60","H5T__conv_i_i:0x298db0","H5T__conv_int_double:0x2b45f0","H5T__conv_int_float:0x2b3340","H5T__conv_int_ldouble:0x2b5b30","H5T__conv_int_llong:0x2b2900","H5T__conv_int_long:0x2b1ec0","H5T__conv_int_schar:0x2afdc0","H5T__conv_int_short:0x2b0be0","H5T__conv_int_uchar:0x2b04a0","H5T__conv_int_uint:0x2b1a80","H5T__conv_int_ullong:0x2b2d40","H5T__conv_int_ulong:0x2b2300","H5T__conv_int_ushort:0x2b1330","H5T__conv_ldouble_double:0x2fb570","H5T__conv_ldouble_float:0x2fad20","H5T__conv_ldouble_int:0x2f6960","H5T__conv_ldouble_llong:0x2f95a0","H5T__conv_ldouble_long:0x2f7e20","H5T__conv_ldouble_schar:0x2f3f80","H5T__conv_ldouble_short:0x2f5450","H5T__conv_ldouble_uchar:0x2f49e0","H5T__conv_ldouble_uint:0x2f7390","H5T__conv_ldouble_ullong:0x2fa010","H5T__conv_ldouble_ulong:0x2f8890","H5T__conv_ldouble_ushort:0x2f5ea0","H5T__conv_llong_double:0x2d56f0","H5T__conv_llong_float:0x2d3690","H5T__conv_llong_int:0x2d1cc0","H5T__conv_llong_ldouble:0x2d73e0","H5T__conv_llong_long:0x2d2b80","H5T__conv_llong_schar:0x2cff90","H5T__conv_llong_short:0x2d0df0","H5T__conv_llong_uchar:0x2d06a0","H5T__conv_llong_uint:0x2d2450","H5T__conv_llong_ullong:0x2d3220","H5T__conv_llong_ulong:0x2d2da0","H5T__conv_llong_ushort:0x2d1560","H5T__conv_long_double:0x2c3250","H5T__conv_long_float:0x2c11f0","H5T__conv_long_int:0x2bf820","H5T__conv_long_ldouble:0x2c4f40","H5T__conv_long_llong:0x2c0b50","H5T__conv_long_schar:0x2bdaf0","H5T__conv_long_short:0x2be950","H5T__conv_long_uchar:0x2be200","H5T__conv_long_uint:0x2bffb0","H5T__conv_long_ullong:0x2c0d70","H5T__conv_long_ulong:0x2c06e0","H5T__conv_long_ushort:0x2bf0c0","H5T__conv_noop:0x297600","H5T__conv_order:0x297670","H5T__conv_order_opt:0x297900","H5T__conv_ref:0x2fe7c0","H5T__conv_s_s:0x2fbdc0","H5T__conv_schar_double:0x29e6c0","H5T__conv_schar_float:0x29dc80","H5T__conv_schar_int:0x29be30","H5T__conv_schar_ldouble:0x29f100","H5T__conv_schar_llong:0x29d250","H5T__conv_schar_long:0x29c820","H5T__conv_schar_short:0x29b400","H5T__conv_schar_uchar:0x29afe0","H5T__conv_schar_uint:0x29c260","H5T__conv_schar_ullong:0x29d6a0","H5T__conv_schar_ulong:0x29cc70","H5T__conv_schar_ushort:0x29b850","H5T__conv_short_double:0x2a8260","H5T__conv_short_float:0x2a71e0","H5T__conv_short_int:0x2a5340","H5T__conv_short_ldouble:0x2a92e0","H5T__conv_short_llong:0x2a6790","H5T__conv_short_long:0x2a5d40","H5T__conv_short_schar:0x2a40a0","H5T__conv_short_uchar:0x2a47b0","H5T__conv_short_uint:0x2a5770","H5T__conv_short_ullong:0x2a6be0","H5T__conv_short_ulong:0x2a6190","H5T__conv_short_ushort:0x2a4ef0","H5T__conv_struct:0x2fd780","H5T__conv_struct_opt:0x2fdf30","H5T__conv_struct_subset:0x2fd770","H5T__conv_uchar_double:0x2a2bf0","H5T__conv_uchar_float:0x2a21b0","H5T__conv_uchar_int:0x2a0850","H5T__conv_uchar_ldouble:0x2a3630","H5T__conv_uchar_llong:0x2a1930","H5T__conv_uchar_long:0x2a10b0","H5T__conv_uchar_schar:0x29fb80","H5T__conv_uchar_short:0x29ffd0","H5T__conv_uchar_uint:0x2a0c80","H5T__conv_uchar_ullong:0x2a1d70","H5T__conv_uchar_ulong:0x2a14f0","H5T__conv_uchar_ushort:0x2a0410","H5T__conv_uint_double:0x2bb070","H5T__conv_uint_float:0x2b9e40","H5T__conv_uint_int:0x2b88e0","H5T__conv_uint_ldouble:0x2bc5a0","H5T__conv_uint_llong:0x2b95c0","H5T__conv_uint_long:0x2b8d40","H5T__conv_uint_schar:0x2b7080","H5T__conv_uint_short:0x2b7c90","H5T__conv_uint_uchar:0x2b7670","H5T__conv_uint_ullong:0x2b9a00","H5T__conv_uint_ulong:0x2b9180","H5T__conv_uint_ushort:0x2b82b0","H5T__conv_ullong_double:0x2de570","H5T__conv_ullong_float:0x2dc420","H5T__conv_ullong_int:0x2dacb0","H5T__conv_ullong_ldouble:0x2e0360","H5T__conv_ullong_llong:0x2dbf80","H5T__conv_ullong_long:0x2db880","H5T__conv_ullong_schar:0x2d9430","H5T__conv_ullong_short:0x2da050","H5T__conv_ullong_uchar:0x2d9a40","H5T__conv_ullong_uint:0x2db290","H5T__conv_ullong_ulong:0x2dbd30","H5T__conv_ullong_ushort:0x2da680","H5T__conv_ulong_double:0x2cc0d0","H5T__conv_ulong_float:0x2c9f80","H5T__conv_ulong_int:0x2c8810","H5T__conv_ulong_ldouble:0x2cdec0","H5T__conv_ulong_llong:0x2c9880","H5T__conv_ulong_long:0x2c93e0","H5T__conv_ulong_schar:0x2c6f90","H5T__conv_ulong_short:0x2c7bb0","H5T__conv_ulong_uchar:0x2c75a0","H5T__conv_ulong_uint:0x2c8df0","H5T__conv_ulong_ullong:0x2c9d30","H5T__conv_ulong_ushort:0x2c81e0","H5T__conv_ushort_double:0x2add40","H5T__conv_ushort_float:0x2acd10","H5T__conv_ushort_int:0x2ab3b0","H5T__conv_ushort_ldouble:0x2aed70","H5T__conv_ushort_llong:0x2ac490","H5T__conv_ushort_long:0x2abc10","H5T__conv_ushort_schar:0x2aa310","H5T__conv_ushort_short:0x2aaf10","H5T__conv_ushort_uchar:0x2aa910","H5T__conv_ushort_uint:0x2ab7e0","H5T__conv_ushort_ullong:0x2ac8d0","H5T__conv_ushort_ulong:0x2ac050","H5T__conv_vlen:0x300080","H5T__create:0x28abf0","H5T__enum_create:0x302dd0","H5T__enum_insert:0x303040","H5T__free:0x283af0","H5T__get_array_dims:0x2911b0","H5T__get_array_ndims:0x291050","H5T__get_create_plist:0x294720","H5T__get_member_name:0x3040c0","H5T__get_member_size:0x296610","H5T__get_member_value:0x303450","H5T__get_path_table_npaths:0x290ba0","H5T__init_native_float_types:0x306040","H5T__init_native_internal:0x309e00","H5T__insert:0x2967f0","H5T__open_name:0x295770","H5T__print_path_stats:0x302060","H5T__ref_reclaim:0x30d890","H5T__ref_set_loc:0x30d430","H5T__reverse_order:0x296ef0","H5T__sort_name:0x3047c0","H5T__sort_value:0x304520","H5T__update_packed:0x296780","H5T__upgrade_version:0x2909b0","H5T__visit:0x30dc90","H5T__vlen_create:0x30e520","H5T__vlen_reclaim:0x30ea90","H5T__vlen_set_loc:0x30e820","H5T_already_vol_managed:0x295cf0","H5T_close:0x283d10","H5T_close_real:0x2832c0","H5T_cmp:0x2840a0","H5T_construct_datatype:0x295930","H5T_convert:0x285ab0","H5T_convert_committed_datatype:0x285fa0","H5T_convert_with_ctx:0x2859d0","H5T_copy:0x286f50","H5T_copy_reopen:0x28a200","H5T_debug:0x302070","H5T_decode:0x2864e0","H5T_detect_class:0x2825a0","H5T_encode:0x282cc0","H5T_get_actual_type:0x295b00","H5T_get_class:0x282450","H5T_get_force_conv:0x296ee0","H5T_get_member_offset:0x296140","H5T_get_member_type:0x2965a0","H5T_get_named_type:0x295af0","H5T_get_nmembers:0x303f20","H5T_get_offset:0x30a280","H5T_get_order:0x30ae70","H5T_get_precision:0x30bd20","H5T_get_ref_type:0x2860e0","H5T_get_sign:0x304aa0","H5T_get_size:0x284090","H5T_get_super:0x289e80","H5T_init:0x28b230","H5T_invoke_vol_optional:0x295d00","H5T_is_immutable:0x285f60","H5T_is_named:0x285f70","H5T_is_numeric_with_unusual_unused_bits:0x290bb0","H5T_is_relocatable:0x2908a0","H5T_is_sensible:0x286100","H5T_is_variable_str:0x282800","H5T_is_vl_storage:0x2908e0","H5T_link:0x293ce0","H5T_lock:0x282fc0","H5T_nameof:0x285ed0","H5T_noop_conv:0x285880","H5T_oloc:0x285e40","H5T_open:0x295190","H5T_own_vol_obj:0x290b20","H5T_patch_file:0x290ae0","H5T_patch_vlen_file:0x290b00","H5T_path_bkg:0x2859c0","H5T_path_compound_subset:0x285990","H5T_path_find:0x2885b0","H5T_path_noop:0x285840","H5T_reclaim:0x296e40","H5T_reclaim_cb:0x296db0","H5T_restore_refresh_state:0x295c10","H5T_save_refresh_state:0x295b20","H5T_set_loc:0x286130","H5T_set_version:0x290a20","H5T_term_package:0x281fa0","H5T_top_term_package:0x283500","H5T_unregister:0x284d00","H5T_update_shared:0x2948d0","H5T_vlen_reclaim_elmt:0x30ed60","H5S__extent_copy_real:0x236cc0","H5S__extent_release:0x236670","H5S__get_diminfo_status_test:0x26cc70","H5S__get_rebuild_status_test:0x26cbe0","H5S__hyper_get_op_gen:0x249670","H5S__hyper_project_intersection:0x255f70","H5S__hyper_rebuild:0x250d80","H5S__internal_consistency_test:0x26ccd0","H5S__modify_select:0x25e1a0","H5S__sel_iter_close_cb:0x26c030","H5S__verify_offsets:0x26cd90","Nflock:0x61f30","Pflock:0x61ee0"]},{"type":1,"name":"bio","functions":["bio_get_last_bvec","bio_will_gap","bio_integrity_init"]},{"type":3,"name":"python","functions":[],"binary_path":"/usr/lib64/libpython3.9.so","provider":"python"},{"type":1,"name":"xfs","functions":[]},{"type":1,"name":"ext4","functions":[]},{"type":1,"name":"iomap","functions":[]},{"type":1,"name":"iov","functions":[]},{"type":2,"name":"test_posix","functions":[],"binary_path":"/home/haridev/datacrumbs/build/bin/df_tracer_test"},{"type":1,"name":"os_page_cache","functions":[]},{"type":1,"name":"shm","functions":["shmem_init"]},{"type":1,"name":"fscache","functions":["fscache_update_aux"]},{"type":2,"name":"ior","functions":[],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/ior-3.3.0-ip47j26fw7xxfftdzjvy2h36phgcuypv/bin/ior","include_offsets":false},{"type":1,"name":"lustre","functions":[]},{"type":1,"name":"osc","functions":["osc_queue_async_io","osc_quota_chkdq"]},{"type":1,"name":"ptlrpc","functions":["ldlm_lock_decref_internal","ldlm_lock_decref","ldlm_lock_addref_internal_nolock","ldlm_lock_match_with_skip","ldlm_lock_addref"]}] diff --git a/etc/datacrumbs/data/probes-haridev-lead.json b/etc/datacrumbs/data/probes-haridev-lead.json index 66ddfbe3..4f67dd3c 100644 --- a/etc/datacrumbs/data/probes-haridev-lead.json +++ b/etc/datacrumbs/data/probes-haridev-lead.json @@ -1 +1 @@ -[{"type":4,"name":"custom1","functions":["openat","read","write","close","fallocate","fdatasync","flock","fsync","ftruncate","lseek","pread64","preadv","preadv2","pwrite64","pwritev","pwritev2","readahead","readv","writev","open","openat2"],"bpf_path":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c","start_event_id":100000,"process_header":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h","event_type":2},{"type":0,"name":"sys","functions":["access","chdir","close","close_range","copy_file_range","creat","dup","dup2","dup3","eventfd2","exit","exit_group","faccessat","faccessat2","fadvise64","fadvise64_64","fallocate","fanotify_init","fanotify_mark","fchdir","fchmod","fchmodat","fchmodat2","fchown","fchownat","fcntl","fdatasync","fgetxattr","flistxattr","flock","fremovexattr","fsetxattr","fstat","fstatfs","fstatfs64","fsync","ftruncate","getcwd","getdents","getxattr","inotify_add_watch","inotify_init","inotify_init1","inotify_rm_watch","io_cancel","io_destroy","io_setup","io_submit","io_uring_enter","io_uring_register","io_uring_setup","lgetxattr","link","linkat","listxattr","llistxattr","llseek","lremovexattr","lseek","lsetxattr","lstat","madvise","mbind","migrate_pages","mincore","mkdir","mkdirat","mknod","mknodat","mlock","mlockall","mmap_pgoff","move_pages","mprotect","mremap","msync","munlock","munlockall","munmap","newfstat","newlstat","newstat","open","openat","openat2","pidfd_open","pipe","pread64","preadv","preadv2","process_madvise","process_mrelease","process_vm_readv","process_vm_writev","pwrite64","pwritev","pwritev2","read","readlink","readlinkat","readv","remap_file_pages","removexattr","rename","renameat","rmdir","sendfile64","setxattr","stat","statfs","statfs64","statx","symlink","symlinkat","sync","sync_file_range","sync_file_range2","syncfs","sysfs","truncate","unlink","unlinkat","ustat","vfork","write","writev"]},{"type":2,"name":"libc","functions":["__GI___fork","__GI___register_atfork","__GI___vfork","__GI_forkpty","__dyn_pthread_atfork","__fork","__forkpty","__libc_fork","__libc_unwind_link_after_fork","__libc_vfork","__malloc_fork_lock_parent","__malloc_fork_unlock_child","__malloc_fork_unlock_parent","__mq_notify_fork_subprocess","__nss_database_fork_prepare_parent","__nss_database_fork_subprocess","__register_atfork","__run_postfork_handlers","__run_prefork_handlers","__timer_fork_subprocess","__unregister_atfork","__vfork","fork","pthread_atfork@GLIBC_2.2.5","vfork"],"binary_path":"/usr/lib64/libc.so.6","include_offsets":false},{"type":2,"name":"hdf5","functions":["H5AC__broadcast_clean_list_cb","H5AC__check_if_write_permitted","H5AC__copy_candidate_list_to_buffer.constprop.0","H5AC__copy_candidate_list_to_buffer_cb","H5AC__flush_entries","H5AC__log_cleaned_entry","H5AC__log_deleted_entry","H5AC__log_dirtied_entry","H5AC__log_flushed_entry","H5AC__log_inserted_entry","H5AC__log_moved_entry","H5AC__propagate_flushed_and_still_clean_entries_list","H5AC__proxy_entry_add_child_cb","H5AC__proxy_entry_free_icr","H5AC__proxy_entry_image_len","H5AC__proxy_entry_notify","H5AC__proxy_entry_remove_child_cb","H5AC__proxy_entry_serialize","H5AC__receive_haddr_list","H5AC__run_sync_point","H5AC__set_sync_point_done_callback","H5AC__set_write_done_callback","H5AC_add_candidate","H5AC_cache_image_pending","H5AC_cork","H5AC_create","H5AC_create_flush_dependency","H5AC_dest","H5AC_destroy_flush_dependency","H5AC_evict","H5AC_evict_tagged_metadata","H5AC_expunge_entry","H5AC_expunge_tag_type_metadata","H5AC_flush","H5AC_flush_tagged_metadata","H5AC_get_cache_auto_resize_config","H5AC_get_cache_flush_in_progress","H5AC_get_cache_hit_rate","H5AC_get_cache_size","H5AC_get_entry_ring","H5AC_get_entry_status","H5AC_get_mdc_image_info","H5AC_get_tag","H5AC_ignore_tags","H5AC_init","H5AC_insert_entry","H5AC_load_cache_image_on_next_protect","H5AC_mark_entry_clean","H5AC_mark_entry_dirty","H5AC_mark_entry_serialized","H5AC_mark_entry_unserialized","H5AC_move_entry","H5AC_pin_protected_entry","H5AC_prep_for_file_close","H5AC_prep_for_file_flush","H5AC_protect","H5AC_proxy_entry_add_child","H5AC_proxy_entry_add_parent","H5AC_proxy_entry_create","H5AC_proxy_entry_dest","H5AC_proxy_entry_remove_child","H5AC_proxy_entry_remove_parent","H5AC_remove_entry","H5AC_reset_cache_hit_rate_stats","H5AC_resize_entry","H5AC_retag_copied_metadata","H5AC_secure_from_file_flush","H5AC_set_cache_auto_resize_config","H5AC_set_ring","H5AC_stats","H5AC_tag","H5AC_term_package","H5AC_unpin_entry","H5AC_unprotect","H5AC_unsettle_entry_ring","H5AC_unsettle_ring","H5AC_validate_cache_image_config","H5AC_validate_config","H5A__attr_cmp_corder_dec","H5A__attr_cmp_corder_inc","H5A__attr_cmp_name_dec","H5A__attr_cmp_name_inc","H5A__attr_copy_file","H5A__attr_iterate_table","H5A__attr_post_copy_file","H5A__attr_release_table","H5A__close","H5A__close_cb","H5A__compact_build_table","H5A__compact_build_table_cb","H5A__copy","H5A__create","H5A__create_api_common","H5A__create_by_name","H5A__create_by_name_api_common","H5A__delete_by_idx","H5A__delete_by_name","H5A__dense_btree2_corder_compare","H5A__dense_btree2_corder_debug","H5A__dense_btree2_corder_decode","H5A__dense_btree2_corder_encode","H5A__dense_btree2_corder_store","H5A__dense_btree2_name_compare","H5A__dense_btree2_name_debug","H5A__dense_btree2_name_decode","H5A__dense_btree2_name_encode","H5A__dense_btree2_name_store","H5A__dense_build_table","H5A__dense_build_table_cb","H5A__dense_copy_fh_cb","H5A__dense_create","H5A__dense_delete","H5A__dense_delete_bt2_cb","H5A__dense_exists","H5A__dense_fh_name_cmp","H5A__dense_fnd_cb","H5A__dense_insert","H5A__dense_iterate","H5A__dense_iterate_bt2_cb","H5A__dense_open","H5A__dense_post_copy_file_all","H5A__dense_post_copy_file_cb","H5A__dense_remove","H5A__dense_remove_bt2_cb","H5A__dense_remove_by_idx","H5A__dense_remove_by_idx_bt2_cb","H5A__dense_rename","H5A__dense_write","H5A__dense_write_bt2_cb","H5A__dense_write_bt2_cb2","H5A__exists_by_name","H5A__get_ainfo","H5A__get_create_plist","H5A__get_info","H5A__get_name","H5A__get_shared_rc_test","H5A__get_type","H5A__is_shared_test","H5A__iterate","H5A__iterate_old","H5A__open","H5A__open_by_idx","H5A__open_by_name","H5A__open_common:0x6a920","H5A__open_common:0x76bf0","H5A__read","H5A__rename_by_name","H5A__set_version","H5A__shared_free","H5A__write","H5A_get_space","H5A_init","H5A_nameof","H5A_oloc","H5A_term_package","H5A_top_term_package","H5A_type","H5Aclose","H5Aclose_async","H5Acreate1","H5Acreate2","H5Acreate_async","H5Acreate_by_name","H5Acreate_by_name_async","H5Adelete","H5Adelete_by_idx","H5Adelete_by_name","H5Aexists","H5Aexists_async","H5Aexists_by_name","H5Aexists_by_name_async","H5Aget_create_plist","H5Aget_info","H5Aget_info_by_idx","H5Aget_info_by_name","H5Aget_name","H5Aget_name_by_idx","H5Aget_num_attrs","H5Aget_space","H5Aget_storage_size","H5Aget_type","H5Aiterate1","H5Aiterate2","H5Aiterate_by_name","H5Aopen","H5Aopen_async","H5Aopen_by_idx","H5Aopen_by_idx_async","H5Aopen_by_name","H5Aopen_by_name_async","H5Aopen_idx","H5Aopen_name","H5Aread","H5Aread_async","H5Arename","H5Arename_async","H5Arename_by_name","H5Arename_by_name_async","H5Awrite","H5Awrite_async","H5B2__cache_hdr_deserialize","H5B2__cache_hdr_free_icr","H5B2__cache_hdr_get_initial_load_size","H5B2__cache_hdr_image_len","H5B2__cache_hdr_notify","H5B2__cache_hdr_serialize","H5B2__cache_hdr_verify_chksum","H5B2__cache_int_deserialize","H5B2__cache_int_free_icr","H5B2__cache_int_get_initial_load_size","H5B2__cache_int_image_len","H5B2__cache_int_notify","H5B2__cache_int_serialize","H5B2__cache_int_verify_chksum","H5B2__cache_leaf_deserialize","H5B2__cache_leaf_free_icr","H5B2__cache_leaf_get_initial_load_size","H5B2__cache_leaf_image_len","H5B2__cache_leaf_notify","H5B2__cache_leaf_serialize","H5B2__cache_leaf_verify_chksum","H5B2__create_flush_depend","H5B2__create_internal","H5B2__create_leaf","H5B2__delete_node","H5B2__delete_node.localalias","H5B2__destroy_flush_depend","H5B2__get_node_depth_test","H5B2__get_node_info_test","H5B2__get_root_addr_test","H5B2__hdr_alloc","H5B2__hdr_create","H5B2__hdr_debug","H5B2__hdr_decr","H5B2__hdr_delete","H5B2__hdr_dirty","H5B2__hdr_free","H5B2__hdr_fuse_decr","H5B2__hdr_fuse_incr","H5B2__hdr_incr","H5B2__hdr_init","H5B2__hdr_protect","H5B2__hdr_unprotect","H5B2__insert","H5B2__insert_internal","H5B2__insert_internal.localalias","H5B2__insert_leaf","H5B2__int_debug","H5B2__internal_free","H5B2__iterate_node","H5B2__iterate_node.localalias","H5B2__leaf_debug","H5B2__leaf_free","H5B2__locate_record","H5B2__merge2","H5B2__merge3","H5B2__neighbor_internal","H5B2__neighbor_internal.localalias","H5B2__neighbor_leaf","H5B2__node_size","H5B2__node_size.localalias","H5B2__protect_internal","H5B2__protect_leaf","H5B2__redistribute2","H5B2__redistribute3","H5B2__remove_internal","H5B2__remove_internal.localalias","H5B2__remove_internal_by_idx","H5B2__remove_internal_by_idx.localalias","H5B2__remove_leaf","H5B2__remove_leaf_by_idx","H5B2__shadow_internal","H5B2__shadow_leaf","H5B2__split1","H5B2__split_root","H5B2__swap_leaf","H5B2__test2_compare","H5B2__test2_debug","H5B2__test2_decode","H5B2__test2_encode","H5B2__test2_store","H5B2__test_compare","H5B2__test_crt_context","H5B2__test_debug","H5B2__test_decode","H5B2__test_dst_context","H5B2__test_encode","H5B2__test_store","H5B2__update_flush_depend","H5B2__update_internal","H5B2__update_internal.localalias","H5B2__update_leaf","H5B2_close","H5B2_create","H5B2_delete","H5B2_depend","H5B2_find","H5B2_get_addr","H5B2_get_nrec","H5B2_index","H5B2_insert","H5B2_iterate","H5B2_modify","H5B2_neighbor","H5B2_open","H5B2_patch_file","H5B2_remove","H5B2_remove_by_idx","H5B2_size","H5B2_stat_info","H5B2_update","H5B__cache_deserialize","H5B__cache_free_icr","H5B__cache_get_initial_load_size","H5B__cache_image_len","H5B__cache_serialize","H5B__get_info_helper","H5B__insert_helper","H5B__iterate_helper","H5B__node_dest","H5B__remove_helper","H5B__verify_structure","H5B_create","H5B_debug","H5B_delete","H5B_delete.localalias","H5B_find","H5B_find.localalias","H5B_get_info","H5B_insert","H5B_iterate","H5B_remove","H5B_shared_free","H5B_shared_new","H5B_valid","H5CX__pop_common","H5CX_free_state","H5CX_get_actual_selection_io_mode","H5CX_get_bkgr_buf","H5CX_get_bkgr_buf_type","H5CX_get_btree_split_ratios","H5CX_get_coll_metadata_read","H5CX_get_data_transform","H5CX_get_dset_min_ohdr_flag","H5CX_get_dt_conv_cb","H5CX_get_dxpl","H5CX_get_encoding","H5CX_get_err_detect","H5CX_get_ext_file_prefix","H5CX_get_filter_cb","H5CX_get_intermediate_group","H5CX_get_io_xfer_mode","H5CX_get_lapl","H5CX_get_libver_bounds","H5CX_get_max_temp_buf","H5CX_get_modify_write_buf","H5CX_get_mpi_coll_datatypes","H5CX_get_mpi_file_flushing","H5CX_get_mpio_chunk_opt_mode","H5CX_get_mpio_chunk_opt_num","H5CX_get_mpio_chunk_opt_ratio","H5CX_get_mpio_coll_opt","H5CX_get_mpio_global_no_coll_cause","H5CX_get_mpio_local_no_coll_cause","H5CX_get_mpio_rank0_bcast","H5CX_get_nlinks","H5CX_get_no_selection_io_cause","H5CX_get_ohdr_flags","H5CX_get_ring","H5CX_get_selection_io_mode","H5CX_get_tag","H5CX_get_tconv_buf","H5CX_get_vds_prefix","H5CX_get_vec_size","H5CX_get_vlen_alloc_info","H5CX_get_vol_connector_prop","H5CX_get_vol_wrap_ctx","H5CX_init","H5CX_is_def_dxpl","H5CX_pop","H5CX_push","H5CX_push_special","H5CX_pushed","H5CX_restore_state","H5CX_retrieve_state","H5CX_set_actual_selection_io_mode","H5CX_set_apl","H5CX_set_coll_metadata_read","H5CX_set_dcpl","H5CX_set_dxpl","H5CX_set_io_xfer_mode","H5CX_set_lapl","H5CX_set_lcpl","H5CX_set_libver_bounds","H5CX_set_loc","H5CX_set_mpi_coll_datatypes","H5CX_set_mpi_file_flushing","H5CX_set_mpio_actual_chunk_opt","H5CX_set_mpio_actual_io_mode","H5CX_set_mpio_coll_opt","H5CX_set_mpio_global_no_coll_cause","H5CX_set_mpio_local_no_coll_cause","H5CX_set_mpio_rank0_bcast","H5CX_set_nlinks","H5CX_set_no_selection_io_cause","H5CX_set_ring","H5CX_set_tag","H5CX_set_vlen_alloc_info","H5CX_set_vol_connector_prop","H5CX_set_vol_wrap_ctx","H5CX_term_package","H5C__auto_adjust_cache_size","H5C__autoadjust__ageout__remove_all_markers","H5C__autoadjust__ageout__remove_excess_markers","H5C__epoch_marker_deserialize","H5C__epoch_marker_free_icr","H5C__epoch_marker_fsf_size","H5C__epoch_marker_get_final_load_size","H5C__epoch_marker_get_initial_load_size","H5C__epoch_marker_image_len","H5C__epoch_marker_notify","H5C__epoch_marker_pre_serialize","H5C__epoch_marker_serialize","H5C__epoch_marker_verify_chksum","H5C__evict_tagged_entries_cb","H5C__expunge_tag_type_metadata_cb","H5C__flash_increase_cache_size","H5C__flush_invalidate_cache","H5C__flush_ring","H5C__flush_single_entry","H5C__flush_tagged_entries_cb","H5C__generate_cache_image","H5C__generate_image","H5C__get_cache_image_config","H5C__image_entry_cmp","H5C__image_stats","H5C__iter_tagged_entries","H5C__iter_tagged_entries_real","H5C__json_tear_down_logging","H5C__json_write_create_cache_log_msg","H5C__json_write_create_fd_log_msg","H5C__json_write_destroy_cache_log_msg","H5C__json_write_destroy_fd_log_msg","H5C__json_write_evict_cache_log_msg","H5C__json_write_expunge_entry_log_msg","H5C__json_write_flush_cache_log_msg","H5C__json_write_insert_entry_log_msg","H5C__json_write_mark_entry_clean_log_msg","H5C__json_write_mark_entry_dirty_log_msg","H5C__json_write_mark_serialized_entry_log_msg","H5C__json_write_mark_unserialized_entry_log_msg","H5C__json_write_move_entry_log_msg","H5C__json_write_pin_entry_log_msg","H5C__json_write_protect_entry_log_msg","H5C__json_write_remove_entry_log_msg","H5C__json_write_resize_entry_log_msg","H5C__json_write_set_cache_config_log_msg","H5C__json_write_start_log_msg","H5C__json_write_stop_log_msg","H5C__json_write_unpin_entry_log_msg","H5C__json_write_unprotect_entry_log_msg","H5C__load_cache_image","H5C__log_json_set_up","H5C__log_trace_set_up","H5C__make_space_in_cache","H5C__pin_entry_from_client.part.0","H5C__prefetched_entry_deserialize","H5C__prefetched_entry_free_icr","H5C__prefetched_entry_fsf_size","H5C__prefetched_entry_get_final_load_size","H5C__prefetched_entry_get_initial_load_size","H5C__prefetched_entry_image_len","H5C__prefetched_entry_notify","H5C__prefetched_entry_pre_serialize","H5C__prefetched_entry_serialize","H5C__prefetched_entry_verify_chksum","H5C__prep_for_file_close__compute_fd_heights_real","H5C__prep_image_for_file_close","H5C__serialize_cache","H5C__serialize_single_entry","H5C__tag_entry","H5C__trace_tear_down_logging","H5C__trace_write_create_fd_log_msg","H5C__trace_write_destroy_fd_log_msg","H5C__trace_write_expunge_entry_log_msg","H5C__trace_write_flush_cache_log_msg","H5C__trace_write_insert_entry_log_msg","H5C__trace_write_mark_entry_clean_log_msg","H5C__trace_write_mark_entry_dirty_log_msg","H5C__trace_write_mark_serialized_entry_log_msg","H5C__trace_write_mark_unserialized_entry_log_msg","H5C__trace_write_move_entry_log_msg","H5C__trace_write_pin_entry_log_msg","H5C__trace_write_protect_entry_log_msg","H5C__trace_write_remove_entry_log_msg","H5C__trace_write_resize_entry_log_msg","H5C__trace_write_set_cache_config_log_msg","H5C__trace_write_unpin_entry_log_msg","H5C__trace_write_unprotect_entry_log_msg","H5C__unpin_entry_from_client","H5C__untag_entry","H5C__verify_cork_tag_test","H5C__verify_cork_tag_test_cb","H5C__verify_len_eoa.isra.0","H5C_apply_candidate_list","H5C_cache_image_pending","H5C_cache_image_status","H5C_clear_coll_entries","H5C_construct_candidate_list__clean_cache","H5C_construct_candidate_list__min_clean","H5C_cork","H5C_create","H5C_create_flush_dependency","H5C_def_auto_resize_rpt_fcn","H5C_dest","H5C_destroy_flush_dependency","H5C_evict","H5C_evict_tagged_entries","H5C_expunge_entry","H5C_expunge_tag_type_metadata","H5C_flush_cache","H5C_flush_tagged_entries","H5C_flush_to_min_clean","H5C_get_aux_ptr","H5C_get_cache_auto_resize_config","H5C_get_cache_flush_in_progress","H5C_get_cache_hit_rate","H5C_get_cache_size","H5C_get_entry_ring","H5C_get_entry_status","H5C_get_evictions_enabled","H5C_get_ignore_tags","H5C_get_logging_status","H5C_get_mdc_image_info","H5C_get_num_objs_corked","H5C_get_tag","H5C_ignore_tags","H5C_insert_entry","H5C_load_cache_image_on_next_protect","H5C_log_set_up","H5C_log_tear_down","H5C_log_write_create_cache_msg","H5C_log_write_create_fd_msg","H5C_log_write_destroy_cache_msg","H5C_log_write_destroy_fd_msg","H5C_log_write_evict_cache_msg","H5C_log_write_expunge_entry_msg","H5C_log_write_flush_cache_msg","H5C_log_write_insert_entry_msg","H5C_log_write_mark_entry_clean_msg","H5C_log_write_mark_entry_dirty_msg","H5C_log_write_mark_serialized_entry_msg","H5C_log_write_mark_unserialized_entry_msg","H5C_log_write_move_entry_msg","H5C_log_write_pin_entry_msg","H5C_log_write_protect_entry_msg","H5C_log_write_remove_entry_msg","H5C_log_write_resize_entry_msg","H5C_log_write_set_cache_config_msg","H5C_log_write_unpin_entry_msg","H5C_log_write_unprotect_entry_msg","H5C_mark_entries_as_clean","H5C_mark_entry_clean","H5C_mark_entry_dirty","H5C_mark_entry_serialized","H5C_mark_entry_unserialized","H5C_move_entry","H5C_pin_protected_entry","H5C_prep_for_file_close","H5C_protect","H5C_remove_entry","H5C_reset_cache_hit_rate_stats","H5C_resize_entry","H5C_retag_entries","H5C_set_cache_auto_resize_config","H5C_set_cache_image_config","H5C_set_evictions_enabled","H5C_set_prefix","H5C_set_slist_enabled","H5C_start_logging","H5C_stats","H5C_stats__reset","H5C_stop_logging","H5C_unpin_entry","H5C_unprotect","H5C_unsettle_entry_ring","H5C_unsettle_ring","H5C_validate_cache_image_config","H5C_validate_resize_config","H5D__alloc_storage","H5D__append_flush_setup.part.0","H5D__bt2_compare","H5D__bt2_crt_context","H5D__bt2_dst_context","H5D__bt2_filt_debug","H5D__bt2_filt_decode","H5D__bt2_filt_encode","H5D__bt2_found_cb","H5D__bt2_idx_close","H5D__bt2_idx_copy_setup","H5D__bt2_idx_copy_shutdown","H5D__bt2_idx_create","H5D__bt2_idx_delete","H5D__bt2_idx_dest","H5D__bt2_idx_dump","H5D__bt2_idx_get_addr","H5D__bt2_idx_init","H5D__bt2_idx_insert","H5D__bt2_idx_is_open","H5D__bt2_idx_is_space_alloc","H5D__bt2_idx_iterate","H5D__bt2_idx_iterate_cb","H5D__bt2_idx_load_metadata","H5D__bt2_idx_open","H5D__bt2_idx_remove","H5D__bt2_idx_reset","H5D__bt2_idx_size","H5D__bt2_mod_cb","H5D__bt2_remove_cb","H5D__bt2_store","H5D__bt2_unfilt_debug","H5D__bt2_unfilt_decode","H5D__bt2_unfilt_encode","H5D__btree2_idx_depend","H5D__btree_cmp2","H5D__btree_cmp3","H5D__btree_debug_key","H5D__btree_decode_key","H5D__btree_encode_key","H5D__btree_found","H5D__btree_get_shared","H5D__btree_idx_close","H5D__btree_idx_copy_setup","H5D__btree_idx_copy_shutdown","H5D__btree_idx_create","H5D__btree_idx_delete","H5D__btree_idx_dest","H5D__btree_idx_dump","H5D__btree_idx_get_addr","H5D__btree_idx_init","H5D__btree_idx_insert","H5D__btree_idx_is_open","H5D__btree_idx_is_space_alloc","H5D__btree_idx_iterate","H5D__btree_idx_iterate_cb","H5D__btree_idx_load_metadata","H5D__btree_idx_open","H5D__btree_idx_remove","H5D__btree_idx_reset","H5D__btree_idx_size","H5D__btree_insert","H5D__btree_new_node","H5D__btree_remove","H5D__btree_shared_create","H5D__btree_shared_free","H5D__build_file_prefix.isra.0","H5D__cache_dataspace_info","H5D__chunk_addrmap","H5D__chunk_addrmap_cb","H5D__chunk_allocate","H5D__chunk_allocated","H5D__chunk_allocated_cb","H5D__chunk_bh_info","H5D__chunk_cache_evict","H5D__chunk_cache_evict.constprop.0","H5D__chunk_cacheable","H5D__chunk_cmp_coll_fill_info","H5D__chunk_construct","H5D__chunk_copy","H5D__chunk_copy_cb","H5D__chunk_create","H5D__chunk_delete","H5D__chunk_dest","H5D__chunk_direct_read","H5D__chunk_direct_write","H5D__chunk_dump_index","H5D__chunk_dump_index_cb","H5D__chunk_file_alloc","H5D__chunk_flush","H5D__chunk_flush_entry","H5D__chunk_flush_entry.constprop.0","H5D__chunk_format_convert","H5D__chunk_format_convert_cb","H5D__chunk_get_offset_copy","H5D__chunk_index_empty","H5D__chunk_index_empty_cb","H5D__chunk_init","H5D__chunk_io_init","H5D__chunk_io_term","H5D__chunk_is_data_cached","H5D__chunk_is_partial_edge_chunk","H5D__chunk_is_space_alloc","H5D__chunk_iter","H5D__chunk_iter_cb","H5D__chunk_lock.constprop.0","H5D__chunk_lookup","H5D__chunk_mdio_init","H5D__chunk_mem_alloc","H5D__chunk_mem_free","H5D__chunk_mem_realloc","H5D__chunk_mem_xfree","H5D__chunk_prune_by_extent","H5D__chunk_read","H5D__chunk_set_info","H5D__chunk_set_info_real","H5D__chunk_set_sizes","H5D__chunk_unlock.constprop.0","H5D__chunk_update_cache","H5D__chunk_update_old_edge_chunks","H5D__chunk_write","H5D__close_cb","H5D__cmp_chunk_redistribute_info","H5D__cmp_chunk_redistribute_info_orig_owner","H5D__cmp_filtered_collective_io_info_entry","H5D__cmp_piece_addr","H5D__collective_read","H5D__collective_write","H5D__compact_construct","H5D__compact_copy","H5D__compact_dest","H5D__compact_fill","H5D__compact_flush","H5D__compact_init","H5D__compact_io_init","H5D__compact_iovv_memmanage_cb","H5D__compact_is_space_alloc","H5D__compact_readvv","H5D__compact_writevv","H5D__compound_opt_read","H5D__contig_alloc","H5D__contig_check","H5D__contig_construct","H5D__contig_copy","H5D__contig_delete","H5D__contig_fill","H5D__contig_flush","H5D__contig_init","H5D__contig_io_init","H5D__contig_io_term","H5D__contig_is_data_cached","H5D__contig_is_space_alloc","H5D__contig_mdio_init","H5D__contig_read","H5D__contig_readvv","H5D__contig_readvv_cb","H5D__contig_readvv_sieve_cb","H5D__contig_write","H5D__contig_writevv","H5D__contig_writevv_cb","H5D__contig_writevv_sieve_cb","H5D__create","H5D__create_named","H5D__current_cache_size_test","H5D__earray_crt_context","H5D__earray_crt_dbg_context","H5D__earray_debug","H5D__earray_decode","H5D__earray_dst_context","H5D__earray_dst_dbg_context","H5D__earray_encode","H5D__earray_fill","H5D__earray_filt_debug","H5D__earray_filt_decode","H5D__earray_filt_encode","H5D__earray_filt_fill","H5D__earray_idx_close","H5D__earray_idx_copy_setup","H5D__earray_idx_copy_shutdown","H5D__earray_idx_create","H5D__earray_idx_delete","H5D__earray_idx_delete_cb","H5D__earray_idx_depend","H5D__earray_idx_dest","H5D__earray_idx_dump","H5D__earray_idx_get_addr","H5D__earray_idx_init","H5D__earray_idx_insert","H5D__earray_idx_is_open","H5D__earray_idx_is_space_alloc","H5D__earray_idx_iterate","H5D__earray_idx_iterate_cb","H5D__earray_idx_load_metadata","H5D__earray_idx_open","H5D__earray_idx_remove","H5D__earray_idx_reset","H5D__earray_idx_resize","H5D__earray_idx_size","H5D__efl_bh_info","H5D__efl_construct","H5D__efl_init","H5D__efl_io_init","H5D__efl_is_space_alloc","H5D__efl_readvv","H5D__efl_readvv_cb","H5D__efl_writevv","H5D__efl_writevv_cb","H5D__farray_crt_context","H5D__farray_crt_dbg_context","H5D__farray_debug","H5D__farray_decode","H5D__farray_dst_context","H5D__farray_dst_dbg_context","H5D__farray_encode","H5D__farray_fill","H5D__farray_filt_debug","H5D__farray_filt_decode","H5D__farray_filt_encode","H5D__farray_filt_fill","H5D__farray_idx_close","H5D__farray_idx_copy_setup","H5D__farray_idx_copy_shutdown","H5D__farray_idx_create","H5D__farray_idx_delete","H5D__farray_idx_delete_cb","H5D__farray_idx_depend","H5D__farray_idx_dest","H5D__farray_idx_dump","H5D__farray_idx_get_addr","H5D__farray_idx_init","H5D__farray_idx_insert","H5D__farray_idx_is_open","H5D__farray_idx_is_space_alloc","H5D__farray_idx_iterate","H5D__farray_idx_iterate_cb","H5D__farray_idx_load_metadata","H5D__farray_idx_open","H5D__farray_idx_remove","H5D__farray_idx_reset","H5D__farray_idx_size","H5D__fill","H5D__fill_init","H5D__fill_refill_vl","H5D__fill_term","H5D__flush","H5D__flush_all_cb","H5D__flush_real","H5D__flush_sieve_buf","H5D__format_convert","H5D__free_piece_info","H5D__gather_file","H5D__gather_mem","H5D__get_chunk_info","H5D__get_chunk_info_by_coord","H5D__get_chunk_info_by_coord_cb","H5D__get_chunk_info_cb","H5D__get_chunk_storage_size","H5D__get_num_chunks","H5D__get_num_chunks_cb","H5D__get_offset","H5D__get_space","H5D__get_space_status","H5D__get_storage_size","H5D__get_type","H5D__init_storage","H5D__inter_collective_io","H5D__ioinfo_adjust","H5D__layout_compact_dirty_test","H5D__layout_contig_size_test","H5D__layout_idx_type_test","H5D__layout_meta_size","H5D__layout_oh_create","H5D__layout_oh_read","H5D__layout_oh_write","H5D__layout_set_io_ops","H5D__layout_set_latest_indexing","H5D__layout_set_version","H5D__layout_type_test","H5D__layout_version_test","H5D__link_chunk_filtered_collective_io","H5D__link_piece_collective_io.constprop.0","H5D__mark","H5D__mpio_collective_filtered_chunk_read.constprop.0","H5D__mpio_collective_filtered_chunk_reinsert","H5D__mpio_collective_filtered_chunk_update","H5D__mpio_collective_filtered_vec_io","H5D__mpio_get_chunk_alloc_info_types.constprop.0","H5D__mpio_get_no_coll_cause_strings","H5D__mpio_opt_possible","H5D__mpio_redistribute_shared_chunks","H5D__mpio_select_read","H5D__mpio_select_write","H5D__mpio_share_chunk_modification_data.constprop.0","H5D__multi_chunk_collective_io","H5D__multi_chunk_filtered_collective_io.constprop.0","H5D__new","H5D__none_idx_close","H5D__none_idx_copy_setup","H5D__none_idx_create","H5D__none_idx_delete","H5D__none_idx_dump","H5D__none_idx_get_addr","H5D__none_idx_is_open","H5D__none_idx_is_space_alloc","H5D__none_idx_iterate","H5D__none_idx_load_metadata","H5D__none_idx_open","H5D__none_idx_remove","H5D__none_idx_reset","H5D__none_idx_size","H5D__nonexistent_readvv","H5D__nonexistent_readvv_cb","H5D__open_name","H5D__piece_file_cb","H5D__piece_io","H5D__piece_mem_cb","H5D__read","H5D__read_api_common","H5D__read_api_common.constprop.0","H5D__refresh","H5D__scatgath_read","H5D__scatgath_read_select","H5D__scatgath_write","H5D__scatgath_write_select","H5D__scatter_file","H5D__scatter_mem","H5D__select_io","H5D__select_read","H5D__select_write","H5D__set_extent","H5D__single_idx_close","H5D__single_idx_copy_setup","H5D__single_idx_create","H5D__single_idx_delete","H5D__single_idx_dump","H5D__single_idx_get_addr","H5D__single_idx_init","H5D__single_idx_insert","H5D__single_idx_is_open","H5D__single_idx_is_space_alloc","H5D__single_idx_iterate","H5D__single_idx_load_metadata","H5D__single_idx_open","H5D__single_idx_remove","H5D__single_idx_reset","H5D__single_idx_size","H5D__typeinfo_init","H5D__typeinfo_init_phase2","H5D__typeinfo_init_phase3.part.0","H5D__virtual_build_source_name.part.0","H5D__virtual_copy","H5D__virtual_copy_layout","H5D__virtual_copy_parsed_name","H5D__virtual_delete","H5D__virtual_flush","H5D__virtual_hold_source_dset_files","H5D__virtual_init","H5D__virtual_io_init","H5D__virtual_is_data_cached","H5D__virtual_is_space_alloc","H5D__virtual_open_source_dset","H5D__virtual_post_io","H5D__virtual_pre_io.isra.0","H5D__virtual_read","H5D__virtual_read_one","H5D__virtual_refresh_source_dset","H5D__virtual_refresh_source_dsets","H5D__virtual_release_source_dset_files","H5D__virtual_reset_layout","H5D__virtual_set_extent_unlim","H5D__virtual_store_layout","H5D__virtual_str_append","H5D__virtual_write","H5D__virtual_write_one","H5D__vlen_get_buf_size","H5D__vlen_get_buf_size_alloc","H5D__vlen_get_buf_size_cb","H5D__vlen_get_buf_size_gen","H5D__vlen_get_buf_size_gen_cb","H5D__write","H5D__write_api_common","H5D__write_api_common.constprop.0","H5D_btree_debug","H5D_chunk_idx_reset","H5D_close","H5D_close.localalias","H5D_flush_all","H5D_get_access_plist","H5D_get_create_plist","H5D_get_dcpl_id","H5D_init","H5D_mult_refresh_close","H5D_mult_refresh_reopen","H5D_nameof","H5D_oloc","H5D_open","H5D_select_io_mem","H5D_term_package","H5D_top_term_package","H5D_virtual_check_mapping_post","H5D_virtual_check_mapping_pre","H5D_virtual_check_min_dims","H5D_virtual_free_parsed_name","H5D_virtual_parse_source_name","H5D_virtual_update_min_dims","H5Dchunk_iter","H5Dclose","H5Dclose_async","H5Dcreate1","H5Dcreate2","H5Dcreate_anon","H5Dcreate_async","H5Ddebug","H5Dextend","H5Dfill","H5Dflush","H5Dformat_convert","H5Dgather","H5Dget_access_plist","H5Dget_chunk_index_type","H5Dget_chunk_info","H5Dget_chunk_info_by_coord","H5Dget_chunk_storage_size","H5Dget_create_plist","H5Dget_num_chunks","H5Dget_offset","H5Dget_space","H5Dget_space_async","H5Dget_space_status","H5Dget_storage_size","H5Dget_type","H5Diterate","H5Dopen1","H5Dopen2","H5Dopen_async","H5Dread","H5Dread_async","H5Dread_chunk","H5Dread_multi","H5Dread_multi_async","H5Drefresh","H5Dscatter","H5Dset_extent","H5Dset_extent_async","H5Dvlen_get_buf_size","H5Dvlen_reclaim","H5Dwrite","H5Dwrite_async","H5Dwrite_chunk","H5Dwrite_multi","H5Dwrite_multi_async","H5EA__cache_dblk_page_deserialize","H5EA__cache_dblk_page_free_icr","H5EA__cache_dblk_page_get_initial_load_size","H5EA__cache_dblk_page_image_len","H5EA__cache_dblk_page_notify","H5EA__cache_dblk_page_serialize","H5EA__cache_dblk_page_verify_chksum","H5EA__cache_dblock_deserialize","H5EA__cache_dblock_free_icr","H5EA__cache_dblock_fsf_size","H5EA__cache_dblock_get_initial_load_size","H5EA__cache_dblock_image_len","H5EA__cache_dblock_notify","H5EA__cache_dblock_serialize","H5EA__cache_dblock_verify_chksum","H5EA__cache_hdr_deserialize","H5EA__cache_hdr_free_icr","H5EA__cache_hdr_get_initial_load_size","H5EA__cache_hdr_image_len","H5EA__cache_hdr_notify","H5EA__cache_hdr_serialize","H5EA__cache_hdr_verify_chksum","H5EA__cache_iblock_deserialize","H5EA__cache_iblock_free_icr","H5EA__cache_iblock_get_initial_load_size","H5EA__cache_iblock_image_len","H5EA__cache_iblock_notify","H5EA__cache_iblock_serialize","H5EA__cache_iblock_verify_chksum","H5EA__cache_sblock_deserialize","H5EA__cache_sblock_free_icr","H5EA__cache_sblock_get_initial_load_size","H5EA__cache_sblock_image_len","H5EA__cache_sblock_notify","H5EA__cache_sblock_serialize","H5EA__cache_sblock_verify_chksum","H5EA__cmp_cparam_test","H5EA__create_flush_depend","H5EA__dblk_page_alloc","H5EA__dblk_page_create","H5EA__dblk_page_dest","H5EA__dblk_page_protect","H5EA__dblk_page_unprotect","H5EA__dblock_alloc","H5EA__dblock_create","H5EA__dblock_debug","H5EA__dblock_delete","H5EA__dblock_dest","H5EA__dblock_protect","H5EA__dblock_sblk_idx","H5EA__dblock_unprotect","H5EA__destroy_flush_depend","H5EA__get_cparam_test","H5EA__hdr_alloc","H5EA__hdr_alloc_elmts","H5EA__hdr_create","H5EA__hdr_debug","H5EA__hdr_decr","H5EA__hdr_delete","H5EA__hdr_dest","H5EA__hdr_free_elmts","H5EA__hdr_fuse_decr","H5EA__hdr_fuse_incr","H5EA__hdr_incr","H5EA__hdr_init","H5EA__hdr_modified","H5EA__hdr_protect","H5EA__hdr_unprotect","H5EA__iblock_alloc","H5EA__iblock_create","H5EA__iblock_debug","H5EA__iblock_delete","H5EA__iblock_dest","H5EA__iblock_protect","H5EA__iblock_unprotect","H5EA__lookup_elmt.constprop.0.isra.0","H5EA__sblock_alloc","H5EA__sblock_create","H5EA__sblock_debug","H5EA__sblock_delete","H5EA__sblock_dest","H5EA__sblock_protect","H5EA__sblock_unprotect","H5EA__test_crt_context","H5EA__test_crt_dbg_context","H5EA__test_debug","H5EA__test_decode","H5EA__test_dst_context","H5EA__test_dst_dbg_context","H5EA__test_encode","H5EA__test_fill","H5EA_close","H5EA_create","H5EA_delete","H5EA_depend","H5EA_get","H5EA_get_addr","H5EA_get_nelmts","H5EA_get_stats","H5EA_iterate","H5EA_open","H5EA_patch_file","H5EA_set","H5ES__cancel","H5ES__cancel_cb","H5ES__close_cb","H5ES__close_failed_cb","H5ES__create","H5ES__event_completed","H5ES__event_free","H5ES__event_new","H5ES__get_err_info","H5ES__get_err_info_cb","H5ES__get_requests","H5ES__get_requests_cb","H5ES__insert_request","H5ES__list_append","H5ES__list_count","H5ES__list_iterate","H5ES__list_remove","H5ES__op_complete","H5ES__wait","H5ES__wait_cb","H5ES_init","H5ES_insert","H5ES_term_package","H5EScancel","H5ESclose","H5EScreate","H5ESfree_err_info","H5ESget_count","H5ESget_err_count","H5ESget_err_info","H5ESget_err_status","H5ESget_op_counter","H5ESget_requests","H5ESinsert_request","H5ESregister_complete_func","H5ESregister_insert_func","H5ESwait","H5E__append_stack","H5E__clear_entries","H5E__clear_stack","H5E__close_msg","H5E__close_msg_cb","H5E__close_stack","H5E__create_msg","H5E__get_auto","H5E__get_class_name","H5E__get_current_stack","H5E__get_msg","H5E__get_num","H5E__pop","H5E__print","H5E__print2","H5E__push_stack","H5E__register_class","H5E__set_auto","H5E__set_current_stack","H5E__set_default_auto","H5E__unregister_class","H5E__walk","H5E__walk1_cb","H5E__walk2_cb","H5E_clear_stack","H5E_dump_api_stack","H5E_init","H5E_pause_stack","H5E_printf_stack","H5E_resume_stack","H5E_term_package","H5Eappend_stack","H5Eauto_is_v2","H5Eclear1","H5Eclear2","H5Eclose_msg","H5Eclose_stack","H5Ecreate_msg","H5Ecreate_stack","H5Eget_auto1","H5Eget_auto2","H5Eget_class_name","H5Eget_current_stack","H5Eget_major","H5Eget_minor","H5Eget_msg","H5Eget_num","H5Eis_paused","H5Epause_stack","H5Epop","H5Eprint1","H5Eprint2","H5Epush1","H5Epush2","H5Eregister_class","H5Eresume_stack","H5Eset_auto1","H5Eset_auto2","H5Eset_current_stack","H5Eunregister_class","H5Ewalk1","H5Ewalk2","H5FA__cache_dblk_page_deserialize","H5FA__cache_dblk_page_free_icr","H5FA__cache_dblk_page_get_initial_load_size","H5FA__cache_dblk_page_image_len","H5FA__cache_dblk_page_notify","H5FA__cache_dblk_page_serialize","H5FA__cache_dblk_page_verify_chksum","H5FA__cache_dblock_deserialize","H5FA__cache_dblock_free_icr","H5FA__cache_dblock_fsf_size","H5FA__cache_dblock_get_initial_load_size","H5FA__cache_dblock_image_len","H5FA__cache_dblock_notify","H5FA__cache_dblock_serialize","H5FA__cache_dblock_verify_chksum","H5FA__cache_hdr_deserialize","H5FA__cache_hdr_free_icr","H5FA__cache_hdr_get_initial_load_size","H5FA__cache_hdr_image_len","H5FA__cache_hdr_notify","H5FA__cache_hdr_serialize","H5FA__cache_hdr_verify_chksum","H5FA__cmp_cparam_test","H5FA__create_flush_depend","H5FA__dblk_page_alloc","H5FA__dblk_page_create","H5FA__dblk_page_dest","H5FA__dblk_page_protect","H5FA__dblk_page_unprotect","H5FA__dblock_alloc","H5FA__dblock_create","H5FA__dblock_debug","H5FA__dblock_delete","H5FA__dblock_dest","H5FA__dblock_protect","H5FA__dblock_unprotect","H5FA__destroy_flush_depend","H5FA__get_cparam_test","H5FA__hdr_alloc","H5FA__hdr_create","H5FA__hdr_debug","H5FA__hdr_decr","H5FA__hdr_delete","H5FA__hdr_dest","H5FA__hdr_fuse_decr","H5FA__hdr_fuse_incr","H5FA__hdr_incr","H5FA__hdr_init","H5FA__hdr_modified","H5FA__hdr_protect","H5FA__hdr_unprotect","H5FA__test_crt_context","H5FA__test_crt_dbg_context","H5FA__test_debug","H5FA__test_decode","H5FA__test_dst_context","H5FA__test_encode","H5FA__test_fill","H5FA_close","H5FA_create","H5FA_delete","H5FA_depend","H5FA_get","H5FA_get_addr","H5FA_get_nelmts","H5FA_get_stats","H5FA_iterate","H5FA_open","H5FA_patch_file","H5FA_set","H5FD__alloc_real","H5FD__copy_plist","H5FD__core_close","H5FD__core_cmp","H5FD__core_delete","H5FD__core_fapl_get","H5FD__core_flush","H5FD__core_flush.part.0","H5FD__core_get_eoa","H5FD__core_get_eof","H5FD__core_get_handle","H5FD__core_lock","H5FD__core_open","H5FD__core_query","H5FD__core_read","H5FD__core_set_eoa","H5FD__core_term","H5FD__core_truncate","H5FD__core_unlock","H5FD__core_write","H5FD__core_write_to_bstore","H5FD__extend","H5FD__family_close","H5FD__family_cmp","H5FD__family_delete","H5FD__family_fapl_copy","H5FD__family_fapl_free","H5FD__family_fapl_get","H5FD__family_flush","H5FD__family_get_default_config","H5FD__family_get_default_printf_filename","H5FD__family_get_eoa","H5FD__family_get_eof","H5FD__family_get_handle","H5FD__family_lock","H5FD__family_open","H5FD__family_query","H5FD__family_read","H5FD__family_sb_decode","H5FD__family_sb_encode","H5FD__family_sb_size","H5FD__family_set_eoa","H5FD__family_term","H5FD__family_truncate","H5FD__family_unlock","H5FD__family_write","H5FD__free_cls","H5FD__free_real","H5FD__get_driver_cb","H5FD__log_alloc","H5FD__log_close","H5FD__log_cmp","H5FD__log_delete","H5FD__log_fapl_copy","H5FD__log_fapl_free","H5FD__log_fapl_get","H5FD__log_free","H5FD__log_get_eoa","H5FD__log_get_eof","H5FD__log_get_handle","H5FD__log_lock","H5FD__log_open","H5FD__log_query","H5FD__log_read","H5FD__log_set_eoa","H5FD__log_term","H5FD__log_truncate","H5FD__log_unlock","H5FD__log_write","H5FD__mpio_close","H5FD__mpio_ctl","H5FD__mpio_delete","H5FD__mpio_flush","H5FD__mpio_get_eoa","H5FD__mpio_get_eof","H5FD__mpio_get_handle","H5FD__mpio_open","H5FD__mpio_query","H5FD__mpio_read","H5FD__mpio_read_selection","H5FD__mpio_read_vector","H5FD__mpio_set_eoa","H5FD__mpio_term","H5FD__mpio_truncate","H5FD__mpio_vector_build_types.constprop.0","H5FD__mpio_write","H5FD__mpio_write_selection","H5FD__mpio_write_vector","H5FD__onion_archival_index_find","H5FD__onion_archival_index_is_valid","H5FD__onion_archival_index_list_sort_cmp","H5FD__onion_close","H5FD__onion_ctl","H5FD__onion_get_eoa","H5FD__onion_get_eof","H5FD__onion_header_decode","H5FD__onion_header_encode","H5FD__onion_history_decode","H5FD__onion_history_encode","H5FD__onion_ingest_header","H5FD__onion_ingest_history","H5FD__onion_ingest_revision_record","H5FD__onion_merge_revision_index_into_archival_index","H5FD__onion_open","H5FD__onion_read","H5FD__onion_revision_index_destroy","H5FD__onion_revision_index_find","H5FD__onion_revision_index_init","H5FD__onion_revision_index_insert","H5FD__onion_revision_record_decode","H5FD__onion_revision_record_encode","H5FD__onion_sb_decode","H5FD__onion_sb_encode","H5FD__onion_sb_size","H5FD__onion_set_eoa","H5FD__onion_term","H5FD__onion_write","H5FD__onion_write_final_history","H5FD__onion_write_header","H5FD__onion_write_history","H5FD__read_selection_translate","H5FD__sec2_close","H5FD__sec2_cmp","H5FD__sec2_ctl","H5FD__sec2_delete","H5FD__sec2_get_eoa","H5FD__sec2_get_eof","H5FD__sec2_get_handle","H5FD__sec2_lock","H5FD__sec2_open","H5FD__sec2_query","H5FD__sec2_read","H5FD__sec2_set_eoa","H5FD__sec2_term","H5FD__sec2_truncate","H5FD__sec2_unlock","H5FD__sec2_write","H5FD__selection_build_types.constprop.0","H5FD__sort_io_req_real.constprop.0","H5FD__splitter_alloc","H5FD__splitter_close","H5FD__splitter_cmp","H5FD__splitter_ctl","H5FD__splitter_delete","H5FD__splitter_fapl_copy","H5FD__splitter_fapl_free","H5FD__splitter_fapl_get","H5FD__splitter_flush","H5FD__splitter_free","H5FD__splitter_get_default_wo_path.constprop.0","H5FD__splitter_get_eoa","H5FD__splitter_get_eof","H5FD__splitter_get_handle","H5FD__splitter_get_type_map","H5FD__splitter_lock","H5FD__splitter_log_error.part.0.isra.0","H5FD__splitter_open","H5FD__splitter_populate_config","H5FD__splitter_query","H5FD__splitter_read","H5FD__splitter_sb_decode","H5FD__splitter_sb_encode","H5FD__splitter_sb_size","H5FD__splitter_set_eoa","H5FD__splitter_term","H5FD__splitter_truncate","H5FD__splitter_unlock","H5FD__splitter_write","H5FD__srt_tmp_cmp","H5FD__supports_swmr_test","H5FD__write_selection_translate","H5FD_alloc","H5FD_check_plugin_load","H5FD_close","H5FD_cmp","H5FD_core_init","H5FD_ctl","H5FD_delete","H5FD_driver_query","H5FD_family_init","H5FD_fapl_get","H5FD_flush","H5FD_free","H5FD_free_driver_info","H5FD_get_base_addr","H5FD_get_class","H5FD_get_class.localalias","H5FD_get_driver_id_by_name","H5FD_get_driver_id_by_value","H5FD_get_eoa","H5FD_get_eof","H5FD_get_feature_flags","H5FD_get_fileno","H5FD_get_fs_type_map","H5FD_get_maxaddr","H5FD_get_mpio_atomicity","H5FD_get_vfd_handle","H5FD_init","H5FD_is_driver_registered_by_name","H5FD_is_driver_registered_by_value","H5FD_locate_signature","H5FD_lock","H5FD_log_init","H5FD_mpi_MPIOff_to_haddr","H5FD_mpi_get_comm","H5FD_mpi_get_file_sync_required","H5FD_mpi_get_info","H5FD_mpi_get_rank","H5FD_mpi_get_size","H5FD_mpi_haddr_to_MPIOff","H5FD_mpio_init","H5FD_multi_alloc","H5FD_multi_close","H5FD_multi_cmp","H5FD_multi_ctl","H5FD_multi_delete","H5FD_multi_fapl_copy","H5FD_multi_fapl_free","H5FD_multi_fapl_get","H5FD_multi_flush","H5FD_multi_free","H5FD_multi_get_eoa","H5FD_multi_get_eof","H5FD_multi_get_handle","H5FD_multi_get_type_map","H5FD_multi_init","H5FD_multi_lock","H5FD_multi_open","H5FD_multi_populate_config","H5FD_multi_query","H5FD_multi_read","H5FD_multi_sb_decode","H5FD_multi_sb_decode.part.0","H5FD_multi_sb_encode","H5FD_multi_sb_size","H5FD_multi_set_eoa","H5FD_multi_term","H5FD_multi_truncate","H5FD_multi_unlock","H5FD_multi_write","H5FD_onion_init","H5FD_open","H5FD_read","H5FD_read_from_selection","H5FD_read_selection","H5FD_read_selection_id","H5FD_read_vector","H5FD_read_vector_from_selection","H5FD_register","H5FD_register_driver_by_name","H5FD_register_driver_by_value","H5FD_sb_encode","H5FD_sb_load","H5FD_sb_size","H5FD_sec2_init","H5FD_set_base_addr","H5FD_set_eoa","H5FD_set_feature_flags","H5FD_set_mpio_atomicity","H5FD_set_paged_aggr","H5FD_sort_selection_io_req","H5FD_sort_vector_io_req","H5FD_split_populate_config.constprop.0","H5FD_splitter_init","H5FD_stdio_alloc","H5FD_stdio_close","H5FD_stdio_cmp","H5FD_stdio_delete","H5FD_stdio_flush","H5FD_stdio_get_eoa","H5FD_stdio_get_eof","H5FD_stdio_get_handle","H5FD_stdio_init","H5FD_stdio_lock","H5FD_stdio_open","H5FD_stdio_query","H5FD_stdio_read","H5FD_stdio_set_eoa","H5FD_stdio_term","H5FD_stdio_truncate","H5FD_stdio_unlock","H5FD_stdio_write","H5FD_term_package","H5FD_truncate","H5FD_try_extend","H5FD_unlock","H5FD_write","H5FD_write_from_selection","H5FD_write_selection","H5FD_write_selection_id","H5FD_write_vector","H5FD_write_vector_from_selection","H5FDalloc","H5FDclose","H5FDcmp","H5FDctl","H5FDdelete","H5FDdriver_query","H5FDflush","H5FDfree","H5FDget_eoa","H5FDget_eof","H5FDget_vfd_handle","H5FDis_driver_registered_by_name","H5FDis_driver_registered_by_value","H5FDlock","H5FDonion_get_revision_count","H5FDopen","H5FDperform_init","H5FDquery","H5FDread","H5FDread_from_selection","H5FDread_selection","H5FDread_vector","H5FDread_vector_from_selection","H5FDregister","H5FDset_eoa","H5FDtruncate","H5FDunlock","H5FDunregister","H5FDwrite","H5FDwrite_from_selection","H5FDwrite_selection","H5FDwrite_vector","H5FDwrite_vector_from_selection","H5FL__blk_create_list.part.0","H5FL__blk_gc_list","H5FL_arr_calloc","H5FL_arr_free","H5FL_arr_malloc","H5FL_arr_realloc","H5FL_blk_calloc","H5FL_blk_free","H5FL_blk_free_block_avail","H5FL_blk_malloc","H5FL_blk_realloc","H5FL_fac_calloc","H5FL_fac_free","H5FL_fac_init","H5FL_fac_malloc","H5FL_fac_term","H5FL_garbage_coll","H5FL_get_free_list_sizes","H5FL_reg_calloc","H5FL_reg_free","H5FL_reg_malloc","H5FL_seq_calloc","H5FL_seq_free","H5FL_seq_malloc","H5FL_seq_realloc","H5FL_set_free_list_limits","H5FL_term_package","H5FO_create","H5FO_delete","H5FO_dest","H5FO_insert","H5FO_mark","H5FO_marked","H5FO_opened","H5FO_top_count","H5FO_top_create","H5FO_top_decr","H5FO_top_dest","H5FO_top_incr","H5FS__cache_hdr_deserialize","H5FS__cache_hdr_free_icr","H5FS__cache_hdr_get_initial_load_size","H5FS__cache_hdr_image_len","H5FS__cache_hdr_notify","H5FS__cache_hdr_pre_serialize","H5FS__cache_hdr_serialize","H5FS__cache_hdr_verify_chksum","H5FS__cache_sinfo_deserialize","H5FS__cache_sinfo_free_icr","H5FS__cache_sinfo_get_initial_load_size","H5FS__cache_sinfo_image_len","H5FS__cache_sinfo_notify","H5FS__cache_sinfo_pre_serialize","H5FS__cache_sinfo_serialize","H5FS__cache_sinfo_verify_chksum","H5FS__cmp_cparam_test","H5FS__create_flush_depend","H5FS__decr","H5FS__destroy_flush_depend","H5FS__dirty","H5FS__get_cparam_test","H5FS__hdr_dest","H5FS__incr","H5FS__iterate_node_cb","H5FS__iterate_sect_cb","H5FS__new","H5FS__sect_init_cls.part.0","H5FS__sect_link","H5FS__sect_merge","H5FS__sect_node_new.part.0","H5FS__sect_remove_real","H5FS__sect_unlink_rest","H5FS__sinfo_dest","H5FS__sinfo_free_node_cb","H5FS__sinfo_free_sect_cb","H5FS__sinfo_lock","H5FS__sinfo_new","H5FS__sinfo_serialize_node_cb","H5FS__sinfo_serialize_sect_cb","H5FS__sinfo_unlock","H5FS__size_node_decr.isra.0","H5FS_alloc_hdr","H5FS_alloc_sect","H5FS_close","H5FS_create","H5FS_debug","H5FS_delete","H5FS_free","H5FS_get_sect_count","H5FS_open","H5FS_sect_add","H5FS_sect_change_class","H5FS_sect_debug","H5FS_sect_find","H5FS_sect_iterate","H5FS_sect_remove","H5FS_sect_stats","H5FS_sect_try_extend","H5FS_sect_try_merge","H5FS_sect_try_shrink_eoa","H5FS_sects_debug","H5FS_size","H5FS_stat_info","H5FS_vfd_alloc_hdr_and_section_info_if_needed","H5F_Kvalue","H5F__accum_adjust","H5F__accum_flush","H5F__accum_free","H5F__accum_read","H5F__accum_reset","H5F__accum_write","H5F__alloc","H5F__build_actual_name","H5F__build_name","H5F__cache_drvrinfo_deserialize","H5F__cache_drvrinfo_free_icr","H5F__cache_drvrinfo_get_final_load_size","H5F__cache_drvrinfo_get_initial_load_size","H5F__cache_drvrinfo_image_len","H5F__cache_drvrinfo_serialize","H5F__cache_superblock_deserialize","H5F__cache_superblock_free_icr","H5F__cache_superblock_get_final_load_size","H5F__cache_superblock_get_initial_load_size","H5F__cache_superblock_image_len","H5F__cache_superblock_serialize","H5F__cache_superblock_verify_chksum","H5F__check_cached_stab_test","H5F__close","H5F__close_cb","H5F__close_mounts","H5F__create_api_common","H5F__delete","H5F__dest","H5F__efc_create","H5F__efc_destroy","H5F__efc_max_nfiles","H5F__efc_open","H5F__efc_open_file","H5F__efc_release","H5F__efc_release_real","H5F__efc_try_close","H5F__efc_try_close_tag1.isra.0","H5F__efc_try_close_tag2.isra.0","H5F__evict_cache_entries","H5F__flush","H5F__flush_api_common","H5F__flush_mounts_recurse","H5F__flush_phase2","H5F__format_convert","H5F__free","H5F__get_all_count_cb","H5F__get_all_ids_cb","H5F__get_cont_info","H5F__get_file_image","H5F__get_info","H5F__get_max_eof_eoa","H5F__get_maxaddr_test","H5F__get_mpi_atomicity","H5F__get_objects_cb","H5F__get_sbe_addr_test","H5F__get_sohm_mesg_count_test","H5F__is_hdf5","H5F__mount_count_ids","H5F__mount_count_ids_recurse","H5F__new","H5F__open_api_common","H5F__parse_file_lock_env_var","H5F__post_open","H5F__post_open_api_common","H5F__reopen","H5F__reopen_api_common","H5F__reparse_file_lock_variable_test","H5F__same_file_test","H5F__set_base_addr","H5F__set_eoa","H5F__set_libver_bounds","H5F__set_mpi_atomicity","H5F__set_paged_aggr","H5F__sfile_add","H5F__sfile_remove","H5F__sfile_search","H5F__start_swmr_write","H5F__super_ext_close","H5F__super_ext_create","H5F__super_ext_open","H5F__super_ext_remove_msg","H5F__super_ext_write_msg","H5F__super_free","H5F__super_init","H5F__super_read","H5F__super_size","H5F__superblock_prefix_decode","H5F__try_extend","H5F__update_super_ext_driver_msg","H5F_addr_decode","H5F_addr_decode_len","H5F_addr_encode","H5F_addr_encode_len","H5F_block_read","H5F_block_write","H5F_coll_md_read","H5F_cwfs_add","H5F_cwfs_advance_heap","H5F_cwfs_find_free_heap","H5F_cwfs_remove_heap","H5F_debug","H5F_decr_nopen_objs","H5F_efc_close","H5F_eoa_dirty","H5F_fake_alloc","H5F_fake_free","H5F_file_id_exists","H5F_flush_mounts","H5F_flush_tagged_metadata","H5F_gc_ref","H5F_get_access_plist","H5F_get_actual_name","H5F_get_alignment","H5F_get_base_addr","H5F_get_checksums","H5F_get_coll_metadata_reads","H5F_get_driver_id","H5F_get_eoa","H5F_get_evict_on_close","H5F_get_extpath","H5F_get_fc_degree","H5F_get_fcpl","H5F_get_file_id","H5F_get_fileno","H5F_get_high_bound","H5F_get_id","H5F_get_intent","H5F_get_low_bound","H5F_get_metadata_read_retry_info","H5F_get_min_dset_ohdr","H5F_get_nmounts","H5F_get_nopen_objs","H5F_get_nrefs","H5F_get_null_fsm_addr","H5F_get_obj_count","H5F_get_obj_ids","H5F_get_open_name","H5F_get_parent","H5F_get_pgend_meta_thres","H5F_get_point_of_no_return","H5F_get_read_attempts","H5F_get_rfic_flags","H5F_get_shared","H5F_get_sohm_addr","H5F_get_sohm_nindexes","H5F_get_sohm_vers","H5F_get_threshold","H5F_get_use_file_locking","H5F_get_vfd_handle","H5F_get_vol_cls","H5F_get_vol_obj","H5F_grp_btree_shared","H5F_has_feature","H5F_has_vector_select_io","H5F_incr_nopen_objs","H5F_init","H5F_is_mount","H5F_is_tmp_addr","H5F_mdc_log_location","H5F_mount","H5F_mpi_get_comm","H5F_mpi_get_file_block_type","H5F_mpi_get_info","H5F_mpi_get_rank","H5F_mpi_get_size","H5F_mpi_retrieve_comm","H5F_object_flush_cb","H5F_open","H5F_prefix_open_file","H5F_rdcc_nbytes","H5F_rdcc_nslots","H5F_rdcc_w0","H5F_same_shared","H5F_set_coll_metadata_reads","H5F_set_grp_btree_shared","H5F_set_min_dset_ohdr","H5F_set_retries","H5F_set_sohm_addr","H5F_set_sohm_nindexes","H5F_set_sohm_vers","H5F_set_store_msg_crt_idx","H5F_sfile_assert_num","H5F_shared_block_read","H5F_shared_block_write","H5F_shared_coll_md_read","H5F_shared_get_coll_metadata_reads","H5F_shared_get_eoa","H5F_shared_get_file_driver","H5F_shared_get_intent","H5F_shared_get_mpi_file_sync_required","H5F_shared_has_feature","H5F_shared_mpi_get_size","H5F_shared_select_read","H5F_shared_select_write","H5F_shared_vector_read","H5F_shared_vector_write","H5F_sieve_buf_size","H5F_sizeof_addr","H5F_sizeof_size","H5F_start_mdc_log_on_access","H5F_store_msg_crt_idx","H5F_super_dirty","H5F_sym_leaf_k","H5F_term_package","H5F_track_metadata_read_retries","H5F_traverse_mount","H5F_try_close","H5F_try_close.localalias","H5F_unmount","H5F_use_mdc_logging","H5F_use_tmp_space","H5Fclear_elink_file_cache","H5Fclose","H5Fclose_async","H5Fcreate","H5Fcreate_async","H5Fdelete","H5Fflush","H5Fflush_async","H5Fformat_convert","H5Fget_access_plist","H5Fget_create_plist","H5Fget_dset_no_attrs_hint","H5Fget_eoa","H5Fget_file_image","H5Fget_fileno","H5Fget_filesize","H5Fget_free_sections","H5Fget_freespace","H5Fget_info1","H5Fget_info2","H5Fget_intent","H5Fget_mdc_config","H5Fget_mdc_hit_rate","H5Fget_mdc_image_info","H5Fget_mdc_logging_status","H5Fget_mdc_size","H5Fget_metadata_read_retry_info","H5Fget_mpi_atomicity","H5Fget_name","H5Fget_obj_count","H5Fget_obj_ids","H5Fget_page_buffering_stats","H5Fget_vfd_handle","H5Fincrement_filesize","H5Fis_accessible","H5Fis_hdf5","H5Fmount","H5Fopen","H5Fopen_async","H5Freopen","H5Freopen_async","H5Freset_mdc_hit_rate_stats","H5Freset_page_buffering_stats","H5Fset_dset_no_attrs_hint","H5Fset_latest_format","H5Fset_libver_bounds","H5Fset_mdc_config","H5Fset_mpi_atomicity","H5Fstart_mdc_logging","H5Fstart_swmr_write","H5Fstop_mdc_logging","H5Funmount","H5G__cache_node_deserialize","H5G__cache_node_free_icr","H5G__cache_node_get_initial_load_size","H5G__cache_node_image_len","H5G__cache_node_serialize","H5G__close_cb","H5G__common_path","H5G__compact_build_table_cb","H5G__compact_get_name_by_idx","H5G__compact_insert","H5G__compact_iterate","H5G__compact_lookup","H5G__compact_lookup_by_idx","H5G__compact_lookup_cb","H5G__compact_remove","H5G__compact_remove_by_idx","H5G__compact_remove_common_cb","H5G__component","H5G__create","H5G__create_named","H5G__dense_btree2_corder_compare","H5G__dense_btree2_corder_debug","H5G__dense_btree2_corder_decode","H5G__dense_btree2_corder_encode","H5G__dense_btree2_corder_store","H5G__dense_btree2_name_compare","H5G__dense_btree2_name_debug","H5G__dense_btree2_name_decode","H5G__dense_btree2_name_encode","H5G__dense_btree2_name_store","H5G__dense_build_table","H5G__dense_build_table_cb","H5G__dense_create","H5G__dense_delete","H5G__dense_fh_name_cmp","H5G__dense_get_name_by_idx","H5G__dense_get_name_by_idx_bt2_cb","H5G__dense_get_name_by_idx_fh_cb","H5G__dense_insert","H5G__dense_iterate","H5G__dense_iterate_bt2_cb","H5G__dense_iterate_fh_cb","H5G__dense_lookup","H5G__dense_lookup_by_idx","H5G__dense_lookup_by_idx_bt2_cb","H5G__dense_lookup_by_idx_fh_cb","H5G__dense_lookup_cb","H5G__dense_remove","H5G__dense_remove_bt2_cb","H5G__dense_remove_by_idx","H5G__dense_remove_by_idx_bt2_cb","H5G__dense_remove_by_idx_fh_cb","H5G__dense_remove_fh_cb","H5G__ent_copy","H5G__ent_debug","H5G__ent_decode_vec","H5G__ent_encode_vec","H5G__ent_reset","H5G__ent_to_link","H5G__free_visit_visited","H5G__get_info_by_idx","H5G__get_info_by_name","H5G__get_name_by_addr_cb","H5G__get_objinfo","H5G__get_objinfo_cb","H5G__has_links_test","H5G__has_stab_test","H5G__is_empty_test","H5G__is_new_dense_test","H5G__iterate_cb","H5G__lheap_size_test","H5G__link_cmp_corder_dec","H5G__link_cmp_corder_inc","H5G__link_cmp_name_dec","H5G__link_cmp_name_inc","H5G__link_iterate_table","H5G__link_name_replace","H5G__link_release_table","H5G__link_sort_table","H5G__link_to_ent","H5G__link_to_loc","H5G__loc_addr","H5G__loc_addr_cb","H5G__loc_exists_cb","H5G__loc_find_by_idx_cb","H5G__loc_find_cb","H5G__loc_get_comment_cb","H5G__loc_info_cb","H5G__loc_insert","H5G__loc_native_info_cb","H5G__loc_set_comment_cb","H5G__name_init","H5G__name_replace_cb","H5G__new_dense_info_test","H5G__node_build_table","H5G__node_by_idx","H5G__node_cmp2","H5G__node_cmp3","H5G__node_copy","H5G__node_create","H5G__node_debug_key","H5G__node_decode_key","H5G__node_encode_key","H5G__node_found","H5G__node_free","H5G__node_get_shared","H5G__node_init","H5G__node_insert","H5G__node_iterate","H5G__node_iterate_size","H5G__node_remove","H5G__node_sumup","H5G__obj_compact_to_dense_cb","H5G__obj_create","H5G__obj_create_real","H5G__obj_get_linfo","H5G__obj_info","H5G__obj_iterate","H5G__obj_lookup","H5G__obj_remove_update_linfo","H5G__obj_stab_to_new_cb","H5G__open_name","H5G__stab_bh_size","H5G__stab_count","H5G__stab_create","H5G__stab_create_components","H5G__stab_delete","H5G__stab_get_name_by_idx","H5G__stab_get_name_by_idx_cb","H5G__stab_insert","H5G__stab_insert_real","H5G__stab_iterate","H5G__stab_lookup","H5G__stab_lookup_by_idx","H5G__stab_lookup_by_idx_cb","H5G__stab_lookup_cb","H5G__stab_remove","H5G__stab_remove_by_idx","H5G__stab_valid","H5G__traverse_real","H5G__traverse_slink_cb","H5G__traverse_special","H5G__user_path_test","H5G__verify_cached_stab_test","H5G__verify_cached_stabs_test","H5G__verify_cached_stabs_test_cb","H5G__visit_cb","H5G_build_fullpath_refstr_str","H5G_close","H5G_ent_decode","H5G_ent_encode","H5G_fileof","H5G_get_create_plist","H5G_get_gcpl_id","H5G_get_name","H5G_get_name_by_addr","H5G_get_shared_count","H5G_init","H5G_iterate","H5G_link_to_info","H5G_loc","H5G_loc_copy","H5G_loc_exists","H5G_loc_find","H5G_loc_find_by_idx","H5G_loc_free","H5G_loc_get_comment","H5G_loc_info","H5G_loc_native_info","H5G_loc_real","H5G_loc_reset","H5G_loc_set_comment","H5G_map_obj_type","H5G_mkroot","H5G_mount","H5G_mounted","H5G_name_copy","H5G_name_free","H5G_name_replace","H5G_name_reset","H5G_name_set","H5G_nameof","H5G_node_close","H5G_node_debug","H5G_normalize","H5G_obj_get_name_by_idx","H5G_obj_insert","H5G_obj_insert.localalias","H5G_obj_lookup_by_idx","H5G_obj_remove","H5G_obj_remove_by_idx","H5G_oloc","H5G_open","H5G_root_free","H5G_root_loc","H5G_rootof","H5G_term_package","H5G_top_term_package","H5G_traverse","H5G_unmount","H5G_visit","H5Gclose","H5Gclose_async","H5Gcreate1","H5Gcreate2","H5Gcreate_anon","H5Gcreate_async","H5Gflush","H5Gget_comment","H5Gget_create_plist","H5Gget_info","H5Gget_info_async","H5Gget_info_by_idx","H5Gget_info_by_idx_async","H5Gget_info_by_name","H5Gget_info_by_name_async","H5Gget_linkval","H5Gget_num_objs","H5Gget_objinfo","H5Gget_objname_by_idx","H5Gget_objtype_by_idx","H5Giterate","H5Glink","H5Glink2","H5Gmove","H5Gmove2","H5Gopen1","H5Gopen2","H5Gopen_async","H5Grefresh","H5Gset_comment","H5Gunlink","H5HF__cache_dblock_deserialize","H5HF__cache_dblock_free_icr","H5HF__cache_dblock_fsf_size","H5HF__cache_dblock_get_initial_load_size","H5HF__cache_dblock_image_len","H5HF__cache_dblock_notify","H5HF__cache_dblock_pre_serialize","H5HF__cache_dblock_serialize","H5HF__cache_dblock_verify_chksum","H5HF__cache_hdr_deserialize","H5HF__cache_hdr_free_icr","H5HF__cache_hdr_get_final_load_size","H5HF__cache_hdr_get_initial_load_size","H5HF__cache_hdr_image_len","H5HF__cache_hdr_pre_serialize","H5HF__cache_hdr_serialize","H5HF__cache_hdr_verify_chksum","H5HF__cache_iblock_deserialize","H5HF__cache_iblock_free_icr","H5HF__cache_iblock_get_initial_load_size","H5HF__cache_iblock_image_len","H5HF__cache_iblock_notify","H5HF__cache_iblock_pre_serialize","H5HF__cache_iblock_serialize","H5HF__cache_iblock_verify_chksum","H5HF__dtable_dest","H5HF__dtable_init","H5HF__dtable_lookup","H5HF__dtable_size_to_row","H5HF__dtable_size_to_rows","H5HF__dtable_span_size","H5HF__hdr_adj_free","H5HF__hdr_adjust_heap","H5HF__hdr_alloc","H5HF__hdr_create","H5HF__hdr_decr","H5HF__hdr_delete","H5HF__hdr_dirty","H5HF__hdr_empty","H5HF__hdr_finish_init","H5HF__hdr_finish_init_phase1","H5HF__hdr_finish_init_phase2","H5HF__hdr_free","H5HF__hdr_fuse_decr","H5HF__hdr_fuse_incr","H5HF__hdr_inc_alloc","H5HF__hdr_inc_iter","H5HF__hdr_incr","H5HF__hdr_protect","H5HF__hdr_reset_iter","H5HF__hdr_reverse_iter","H5HF__hdr_skip_blocks","H5HF__hdr_start_iter","H5HF__hdr_update_iter","H5HF__huge_bt2_crt_context","H5HF__huge_bt2_dir_compare","H5HF__huge_bt2_dir_debug","H5HF__huge_bt2_dir_decode","H5HF__huge_bt2_dir_encode","H5HF__huge_bt2_dir_remove","H5HF__huge_bt2_dir_store","H5HF__huge_bt2_dst_context","H5HF__huge_bt2_filt_dir_compare","H5HF__huge_bt2_filt_dir_debug","H5HF__huge_bt2_filt_dir_decode","H5HF__huge_bt2_filt_dir_encode","H5HF__huge_bt2_filt_dir_found","H5HF__huge_bt2_filt_dir_remove","H5HF__huge_bt2_filt_dir_store","H5HF__huge_bt2_filt_indir_compare","H5HF__huge_bt2_filt_indir_debug","H5HF__huge_bt2_filt_indir_decode","H5HF__huge_bt2_filt_indir_encode","H5HF__huge_bt2_filt_indir_found","H5HF__huge_bt2_filt_indir_remove","H5HF__huge_bt2_filt_indir_store","H5HF__huge_bt2_indir_compare","H5HF__huge_bt2_indir_debug","H5HF__huge_bt2_indir_decode","H5HF__huge_bt2_indir_encode","H5HF__huge_bt2_indir_found","H5HF__huge_bt2_indir_remove","H5HF__huge_bt2_indir_store","H5HF__huge_delete","H5HF__huge_get_obj_len","H5HF__huge_get_obj_off","H5HF__huge_init","H5HF__huge_insert","H5HF__huge_op","H5HF__huge_op_real","H5HF__huge_read","H5HF__huge_remove","H5HF__huge_term","H5HF__huge_write","H5HF__iblock_decr","H5HF__iblock_dirty","H5HF__iblock_incr","H5HF__man_dblock_create","H5HF__man_dblock_delete","H5HF__man_dblock_dest","H5HF__man_dblock_destroy","H5HF__man_dblock_locate","H5HF__man_dblock_new","H5HF__man_dblock_protect","H5HF__man_get_obj_len","H5HF__man_get_obj_off","H5HF__man_iblock_alloc_row","H5HF__man_iblock_attach","H5HF__man_iblock_create","H5HF__man_iblock_delete","H5HF__man_iblock_delete.localalias","H5HF__man_iblock_dest","H5HF__man_iblock_detach","H5HF__man_iblock_detach.localalias","H5HF__man_iblock_entry_addr","H5HF__man_iblock_parent_info","H5HF__man_iblock_protect","H5HF__man_iblock_root_create","H5HF__man_iblock_root_double","H5HF__man_iblock_size","H5HF__man_iblock_size.localalias","H5HF__man_iblock_unprotect","H5HF__man_insert","H5HF__man_iter_curr","H5HF__man_iter_down","H5HF__man_iter_init","H5HF__man_iter_next","H5HF__man_iter_ready","H5HF__man_iter_reset","H5HF__man_iter_set_entry","H5HF__man_iter_start_entry","H5HF__man_iter_start_offset","H5HF__man_iter_up","H5HF__man_op","H5HF__man_op_real","H5HF__man_read","H5HF__man_remove","H5HF__man_write","H5HF__op_read","H5HF__op_write","H5HF__sect_indirect_add","H5HF__sect_indirect_decr","H5HF__sect_indirect_first","H5HF__sect_indirect_free","H5HF__sect_indirect_init_cls","H5HF__sect_indirect_init_rows","H5HF__sect_indirect_new","H5HF__sect_indirect_reduce","H5HF__sect_indirect_revive","H5HF__sect_indirect_serialize","H5HF__sect_indirect_shrink","H5HF__sect_indirect_term_cls","H5HF__sect_indirect_valid.isra.0","H5HF__sect_row_can_merge","H5HF__sect_row_can_shrink","H5HF__sect_row_debug","H5HF__sect_row_deserialize","H5HF__sect_row_first.part.0","H5HF__sect_row_free","H5HF__sect_row_get_iblock","H5HF__sect_row_init_cls","H5HF__sect_row_merge","H5HF__sect_row_reduce","H5HF__sect_row_revive","H5HF__sect_row_serialize","H5HF__sect_row_shrink","H5HF__sect_row_term_cls","H5HF__sect_row_valid","H5HF__sect_single_add","H5HF__sect_single_can_merge","H5HF__sect_single_can_shrink","H5HF__sect_single_dblock_info","H5HF__sect_single_deserialize","H5HF__sect_single_free","H5HF__sect_single_full_dblock","H5HF__sect_single_merge","H5HF__sect_single_new","H5HF__sect_single_reduce","H5HF__sect_single_revive","H5HF__sect_single_shrink","H5HF__sect_single_valid","H5HF__space_add","H5HF__space_close","H5HF__space_create_root","H5HF__space_create_root_cb","H5HF__space_delete","H5HF__space_find","H5HF__space_remove","H5HF__space_revert_root","H5HF__space_revert_root_cb","H5HF__space_sect_change_class","H5HF__space_size","H5HF__space_start","H5HF__tiny_get_obj_len","H5HF__tiny_init","H5HF__tiny_insert","H5HF__tiny_op","H5HF__tiny_read","H5HF__tiny_remove","H5HF_close","H5HF_cmp_cparam_test","H5HF_create","H5HF_dblock_debug","H5HF_dblock_debug_cb","H5HF_delete","H5HF_get_cparam_test","H5HF_get_dblock_free_test","H5HF_get_dblock_size_test","H5HF_get_dtable_max_drows_test","H5HF_get_dtable_width_test","H5HF_get_heap_addr","H5HF_get_huge_info_test","H5HF_get_iblock_max_drows_test","H5HF_get_id_len","H5HF_get_id_off_test","H5HF_get_id_type_test","H5HF_get_max_root_rows","H5HF_get_obj_len","H5HF_get_obj_off","H5HF_get_tiny_info_test","H5HF_hdr_debug","H5HF_hdr_print","H5HF_iblock_debug","H5HF_iblock_print","H5HF_iblock_print.localalias","H5HF_id_print","H5HF_insert","H5HF_op","H5HF_open","H5HF_read","H5HF_remove","H5HF_sects_debug","H5HF_sects_debug_cb","H5HF_size","H5HF_stat_info","H5HF_write","H5HG__cache_heap_deserialize","H5HG__cache_heap_free_icr","H5HG__cache_heap_get_final_load_size","H5HG__cache_heap_get_initial_load_size","H5HG__cache_heap_image_len","H5HG__cache_heap_serialize","H5HG__free","H5HG__protect","H5HG_debug","H5HG_extend","H5HG_get_addr","H5HG_get_free_size","H5HG_get_obj_size","H5HG_get_size","H5HG_insert","H5HG_link","H5HG_read","H5HG_remove","H5HL__cache_datablock_deserialize","H5HL__cache_datablock_free_icr","H5HL__cache_datablock_get_initial_load_size","H5HL__cache_datablock_image_len","H5HL__cache_datablock_notify","H5HL__cache_datablock_serialize","H5HL__cache_prefix_deserialize","H5HL__cache_prefix_free_icr","H5HL__cache_prefix_get_final_load_size","H5HL__cache_prefix_get_initial_load_size","H5HL__cache_prefix_image_len","H5HL__cache_prefix_serialize","H5HL__dblk_dest","H5HL__dblk_new","H5HL__dblk_realloc","H5HL__dec_rc","H5HL__dest","H5HL__fl_deserialize","H5HL__fl_serialize","H5HL__hdr_deserialize","H5HL__inc_rc","H5HL__minimize_heap_space","H5HL__new","H5HL__prfx_dest","H5HL__prfx_new","H5HL_create","H5HL_debug","H5HL_delete","H5HL_get_size","H5HL_heap_get_size","H5HL_heapsize","H5HL_insert","H5HL_offset_into","H5HL_protect","H5HL_remove","H5HL_unprotect","H5I__destroy_type","H5I__find_id","H5I__get_name_test","H5I__get_type_ref","H5I__inc_type_ref","H5I__iterate_pub_cb","H5I__register","H5I__remove_common","H5I__remove_verify","H5I__search_cb","H5I_clear_type","H5I_dec_app_ref","H5I_dec_app_ref_always_close","H5I_dec_app_ref_always_close_async","H5I_dec_app_ref_async","H5I_dec_ref","H5I_dec_type_ref","H5I_dump_ids_for_type","H5I_find_id","H5I_get_ref","H5I_get_type","H5I_inc_ref","H5I_is_file_object","H5I_iterate","H5I_nmembers","H5I_object","H5I_object_verify","H5I_register","H5I_register_type","H5I_register_using_existing_id","H5I_remove","H5I_subst","H5I_term_package","H5Iclear_type","H5Idec_ref","H5Idec_type_ref","H5Idestroy_type","H5Iget_file_id","H5Iget_name","H5Iget_ref","H5Iget_type","H5Iget_type_ref","H5Iinc_ref","H5Iinc_type_ref","H5Iis_valid","H5Iiterate","H5Inmembers","H5Iobject_verify","H5Iregister","H5Iregister_future","H5Iregister_type","H5Iremove_verify","H5Isearch","H5Itype_exists","H5L__create_hard","H5L__create_hard_api_common","H5L__create_real","H5L__create_soft","H5L__create_soft_api_common","H5L__create_ud","H5L__delete","H5L__delete_by_idx","H5L__delete_by_idx_cb","H5L__delete_cb","H5L__exists","H5L__exists_final_cb","H5L__exists_inter_cb","H5L__extern_query","H5L__extern_traverse","H5L__get_info_by_idx","H5L__get_info_by_idx_cb","H5L__get_info_cb","H5L__get_name_by_idx","H5L__get_name_by_idx_cb","H5L__get_val","H5L__get_val_by_idx","H5L__get_val_by_idx_cb","H5L__get_val_cb","H5L__iterate2_shim","H5L__link_cb","H5L__link_copy_file","H5L__move","H5L__move_cb","H5L__move_dest_cb","H5L_exists_tolerant","H5L_find_class","H5L_get_info","H5L_get_ocrt_info","H5L_init","H5L_is_registered","H5L_iterate","H5L_link","H5L_link_object","H5L_register","H5L_register_external","H5L_term_package","H5L_unregister","H5Lcopy","H5Lcreate_external","H5Lcreate_hard","H5Lcreate_hard_async","H5Lcreate_soft","H5Lcreate_soft_async","H5Lcreate_ud","H5Ldelete","H5Ldelete_async","H5Ldelete_by_idx","H5Ldelete_by_idx_async","H5Lexists","H5Lexists_async","H5Lget_info1","H5Lget_info2","H5Lget_info_by_idx1","H5Lget_info_by_idx2","H5Lget_name_by_idx","H5Lget_val","H5Lget_val_by_idx","H5Lis_registered","H5Literate1","H5Literate2","H5Literate_async","H5Literate_by_name1","H5Literate_by_name2","H5Lmove","H5Lregister","H5Lunpack_elink_val","H5Lunregister","H5Lvisit1","H5Lvisit2","H5Lvisit_by_name1","H5Lvisit_by_name2","H5MF__add_sect","H5MF__aggr_absorb","H5MF__aggr_alloc","H5MF__aggr_can_absorb","H5MF__aggr_query","H5MF__aggr_try_extend","H5MF__aggrs_try_shrink_eoa","H5MF__alloc_to_fs_type","H5MF__close_delete_fstype","H5MF__close_shrink_eoa","H5MF__find_sect","H5MF__fsm_is_self_referential","H5MF__fsm_type_is_self_referential","H5MF__open_fstype","H5MF__sect_deserialize","H5MF__sect_free","H5MF__sect_large_can_merge","H5MF__sect_large_can_shrink","H5MF__sect_large_merge","H5MF__sect_large_shrink","H5MF__sect_new","H5MF__sect_simple_can_merge","H5MF__sect_simple_can_shrink","H5MF__sect_simple_merge","H5MF__sect_simple_shrink","H5MF__sect_small_add","H5MF__sect_small_can_merge","H5MF__sect_small_merge","H5MF__sect_split","H5MF__sect_valid","H5MF__sects_cb","H5MF__sects_debug_cb","H5MF__start_fstype","H5MF_aggr_vfd_alloc","H5MF_alloc","H5MF_alloc_tmp","H5MF_close","H5MF_free_aggrs","H5MF_get_free_sections","H5MF_get_freespace","H5MF_init_merge_flags","H5MF_sects_debug","H5MF_settle_meta_data_fsm","H5MF_settle_raw_data_fsm","H5MF_try_close","H5MF_try_extend","H5MF_try_shrink","H5MF_xfree","H5MM_realloc","H5MM_strdup","H5MM_strndup","H5MM_xfree","H5MM_xfree_const","H5MM_xstrdup","H5M__close_cb","H5M_init","H5M_term_package","H5M_top_term_package","H5O__add_gap.constprop.0","H5O__ainfo_copy","H5O__ainfo_copy_file","H5O__ainfo_debug","H5O__ainfo_decode","H5O__ainfo_delete","H5O__ainfo_encode","H5O__ainfo_free","H5O__ainfo_post_copy_file","H5O__ainfo_pre_copy_file","H5O__ainfo_size","H5O__alloc","H5O__alloc_chunk","H5O__alloc_find_best_null","H5O__alloc_msgs","H5O__alloc_null","H5O__are_mdc_flushes_disabled","H5O__attr_bh_info","H5O__attr_copy","H5O__attr_count_real","H5O__attr_create","H5O__attr_delete","H5O__attr_dense_info_test","H5O__attr_exists","H5O__attr_exists_cb","H5O__attr_find_opened_attr","H5O__attr_free","H5O__attr_get_crt_index","H5O__attr_iterate","H5O__attr_link","H5O__attr_open_by_idx","H5O__attr_open_by_idx_cb","H5O__attr_open_by_name","H5O__attr_open_cb","H5O__attr_pre_copy_file","H5O__attr_remove","H5O__attr_remove_by_idx","H5O__attr_remove_cb","H5O__attr_remove_update","H5O__attr_rename","H5O__attr_rename_chk_cb","H5O__attr_rename_mod_cb","H5O__attr_reset","H5O__attr_set_crt_index","H5O__attr_shared_copy_file","H5O__attr_shared_debug","H5O__attr_shared_decode","H5O__attr_shared_delete","H5O__attr_shared_encode","H5O__attr_shared_link","H5O__attr_shared_post_copy_file","H5O__attr_shared_size","H5O__attr_to_dense_cb","H5O__attr_update_shared","H5O__attr_write","H5O__attr_write_cb","H5O__btreek_copy","H5O__btreek_debug","H5O__btreek_decode","H5O__btreek_encode","H5O__btreek_size","H5O__cache_chk_deserialize","H5O__cache_chk_free_icr","H5O__cache_chk_get_initial_load_size","H5O__cache_chk_image_len","H5O__cache_chk_notify","H5O__cache_chk_serialize","H5O__cache_chk_verify_chksum","H5O__cache_deserialize","H5O__cache_free_icr","H5O__cache_get_final_load_size","H5O__cache_get_initial_load_size","H5O__cache_image_len","H5O__cache_notify","H5O__cache_serialize","H5O__cache_verify_chksum","H5O__check_msg_marked_test","H5O__chunk_add","H5O__chunk_delete","H5O__chunk_deserialize","H5O__chunk_dest","H5O__chunk_protect","H5O__chunk_resize","H5O__chunk_serialize","H5O__chunk_unprotect","H5O__chunk_update_idx","H5O__condense_header","H5O__cont_debug","H5O__cont_decode","H5O__cont_delete","H5O__cont_encode","H5O__cont_free","H5O__cont_size","H5O__copy","H5O__copy_api_common","H5O__copy_comm_dt_cmp","H5O__copy_free_addrmap_cb","H5O__copy_free_comm_dt_cb","H5O__copy_header_real","H5O__copy_obj_by_ref","H5O__copy_search_comm_dt_attr_cb","H5O__copy_search_comm_dt_cb","H5O__copy_search_comm_dt_check","H5O__debug_real","H5O__dec_rc","H5O__delete_mesg","H5O__disable_mdc_flushes","H5O__drvinfo_copy","H5O__drvinfo_debug","H5O__drvinfo_decode","H5O__drvinfo_encode","H5O__drvinfo_reset","H5O__drvinfo_size","H5O__dset_bh_info","H5O__dset_create","H5O__dset_flush","H5O__dset_free_copy_file_udata","H5O__dset_get_copy_file_udata","H5O__dset_get_oloc","H5O__dset_isa","H5O__dset_open","H5O__dtype_can_share","H5O__dtype_copy","H5O__dtype_create","H5O__dtype_debug.isra.0","H5O__dtype_decode_helper","H5O__dtype_encode_helper","H5O__dtype_encode_helper.cold","H5O__dtype_free","H5O__dtype_get_oloc","H5O__dtype_isa","H5O__dtype_open","H5O__dtype_pre_copy_file","H5O__dtype_reset","H5O__dtype_set_share","H5O__dtype_shared_copy_file","H5O__dtype_shared_debug","H5O__dtype_shared_decode","H5O__dtype_shared_delete","H5O__dtype_shared_encode","H5O__dtype_shared_link","H5O__dtype_shared_post_copy_file","H5O__dtype_shared_size","H5O__dtype_size.isra.0","H5O__efl_copy","H5O__efl_copy_file","H5O__efl_debug","H5O__efl_decode","H5O__efl_encode","H5O__efl_reset","H5O__efl_size","H5O__eliminate_gap","H5O__enable_mdc_flushes","H5O__expunge_chunks_test","H5O__fill_copy","H5O__fill_debug.constprop.0","H5O__fill_free","H5O__fill_new_shared_copy_file","H5O__fill_new_shared_debug","H5O__fill_new_shared_decode","H5O__fill_new_shared_delete","H5O__fill_new_shared_encode","H5O__fill_new_shared_link","H5O__fill_new_shared_post_copy_file","H5O__fill_new_shared_size","H5O__fill_pre_copy_file","H5O__fill_reset","H5O__fill_shared_copy_file","H5O__fill_shared_debug","H5O__fill_shared_decode","H5O__fill_shared_delete","H5O__fill_shared_encode","H5O__fill_shared_link","H5O__fill_shared_post_copy_file","H5O__fill_shared_size","H5O__flush_msgs","H5O__free","H5O__free_visit_visited","H5O__fsinfo_copy","H5O__fsinfo_debug","H5O__fsinfo_decode","H5O__fsinfo_encode","H5O__fsinfo_free","H5O__fsinfo_size","H5O__get_hdr_info_real","H5O__get_info_old","H5O__get_rc_test","H5O__ginfo_copy","H5O__ginfo_debug","H5O__ginfo_decode","H5O__ginfo_encode","H5O__ginfo_free","H5O__ginfo_size","H5O__group_bh_info","H5O__group_create","H5O__group_free_copy_file_udata","H5O__group_get_copy_file_udata","H5O__group_get_oloc","H5O__group_isa","H5O__group_open","H5O__inc_rc","H5O__is_attr_dense_test","H5O__is_attr_empty_test","H5O__iterate1_adapter","H5O__layout_copy","H5O__layout_copy_file","H5O__layout_debug","H5O__layout_decode","H5O__layout_delete","H5O__layout_encode","H5O__layout_free","H5O__layout_pre_copy_file","H5O__layout_reset","H5O__layout_reset.part.0","H5O__layout_size","H5O__linfo_copy","H5O__linfo_copy.part.0","H5O__linfo_copy_file","H5O__linfo_debug","H5O__linfo_decode","H5O__linfo_delete","H5O__linfo_encode","H5O__linfo_free","H5O__linfo_post_copy_file","H5O__linfo_post_copy_file_cb","H5O__linfo_size","H5O__link_copy","H5O__link_copy_file","H5O__link_debug","H5O__link_decode","H5O__link_encode","H5O__link_free","H5O__link_oh","H5O__link_post_copy_file","H5O__link_pre_copy_file","H5O__link_reset","H5O__link_size","H5O__mdci_copy","H5O__mdci_debug","H5O__mdci_decode","H5O__mdci_delete","H5O__mdci_encode","H5O__mdci_free","H5O__mdci_size","H5O__msg_alloc","H5O__msg_append_real","H5O__msg_copy_file","H5O__msg_count_real","H5O__msg_free_mesg","H5O__msg_get_chunkno_test","H5O__msg_iterate_real","H5O__msg_move_to_new_chunk_test","H5O__msg_remove_cb","H5O__msg_remove_real","H5O__msg_write_real","H5O__mtime_copy","H5O__mtime_debug","H5O__mtime_decode","H5O__mtime_encode","H5O__mtime_free","H5O__mtime_new_decode","H5O__mtime_new_encode","H5O__mtime_new_size","H5O__mtime_size","H5O__name_copy","H5O__name_debug","H5O__name_decode","H5O__name_encode","H5O__name_reset","H5O__name_size","H5O__num_attrs_test","H5O__obj_class","H5O__obj_class_real","H5O__open_by_addr","H5O__open_by_idx","H5O__pline_copy","H5O__pline_free","H5O__pline_pre_copy_file","H5O__pline_reset","H5O__pline_shared_copy_file","H5O__pline_shared_debug","H5O__pline_shared_decode","H5O__pline_shared_delete","H5O__pline_shared_encode","H5O__pline_shared_link","H5O__pline_shared_post_copy_file","H5O__pline_shared_size","H5O__prefix_deserialize","H5O__refcount_copy","H5O__refcount_debug","H5O__refcount_decode","H5O__refcount_encode","H5O__refcount_free","H5O__refcount_pre_copy_file","H5O__refcount_size","H5O__release_mesg","H5O__remove_empty_chunks","H5O__sdspace_copy","H5O__sdspace_free","H5O__sdspace_pre_copy_file","H5O__sdspace_reset","H5O__sdspace_shared_copy_file","H5O__sdspace_shared_debug","H5O__sdspace_shared_decode","H5O__sdspace_shared_delete","H5O__sdspace_shared_encode","H5O__sdspace_shared_link","H5O__sdspace_shared_post_copy_file","H5O__sdspace_shared_size","H5O__shared_copy_file","H5O__shared_debug","H5O__shared_decode","H5O__shared_delete","H5O__shared_encode","H5O__shared_link","H5O__shared_post_copy_file","H5O__shared_size","H5O__shmesg_copy","H5O__shmesg_debug","H5O__shmesg_decode","H5O__shmesg_encode","H5O__shmesg_size","H5O__stab_copy","H5O__stab_copy_file","H5O__stab_debug","H5O__stab_decode","H5O__stab_delete","H5O__stab_encode","H5O__stab_free","H5O__stab_post_copy_file","H5O__stab_size","H5O__unknown_free","H5O__visit","H5O__visit_cb","H5O_apply_ohdr","H5O_attr_iterate_real","H5O_close","H5O_copy_expand_ref","H5O_copy_header_map","H5O_create","H5O_create_ohdr","H5O_debug","H5O_debug_id","H5O_dec_rc_by_loc","H5O_delete","H5O_efl_total_size","H5O_fill_convert","H5O_fill_reset_dyn","H5O_fill_set_version","H5O_flush","H5O_flush_common","H5O_fsinfo_check_version","H5O_fsinfo_set_version","H5O_get_create_plist","H5O_get_hdr_info","H5O_get_info","H5O_get_loc","H5O_get_native_info","H5O_get_nlinks","H5O_get_oh_addr","H5O_get_oh_flags","H5O_get_oh_mtime","H5O_get_oh_version","H5O_get_proxy","H5O_get_rc_and_type","H5O_has_chksum","H5O_init","H5O_link","H5O_link_delete","H5O_loc_copy","H5O_loc_copy_deep","H5O_loc_copy_shallow","H5O_loc_free","H5O_loc_hold_file","H5O_loc_reset","H5O_msg_append_oh","H5O_msg_can_share","H5O_msg_can_share_in_ohdr","H5O_msg_copy","H5O_msg_count","H5O_msg_create","H5O_msg_decode","H5O_msg_delete","H5O_msg_encode","H5O_msg_exists","H5O_msg_exists_oh","H5O_msg_flush","H5O_msg_free","H5O_msg_free_real","H5O_msg_get_crt_index","H5O_msg_get_flags","H5O_msg_is_shared","H5O_msg_iterate","H5O_msg_raw_size","H5O_msg_read","H5O_msg_read_oh","H5O_msg_remove","H5O_msg_remove_op","H5O_msg_reset","H5O_msg_reset_share","H5O_msg_set_share","H5O_msg_size_f","H5O_msg_size_oh","H5O_msg_write","H5O_msg_write_oh","H5O_obj_create","H5O_obj_type","H5O_open","H5O_open_by_loc","H5O_open_name","H5O_pin","H5O_pline_set_version","H5O_protect","H5O_refresh_metadata","H5O_refresh_metadata_reopen","H5O_set_shared","H5O_touch","H5O_touch_oh","H5O_unpin","H5O_unprotect","H5Oare_mdc_flushes_disabled","H5Oclose","H5Oclose_async","H5Ocopy","H5Ocopy_async","H5Odecr_refcount","H5Odisable_mdc_flushes","H5Oenable_mdc_flushes","H5Oexists_by_name","H5Oflush","H5Oflush_async","H5Oget_comment","H5Oget_comment_by_name","H5Oget_info1","H5Oget_info2","H5Oget_info3","H5Oget_info_by_idx1","H5Oget_info_by_idx2","H5Oget_info_by_idx3","H5Oget_info_by_name1","H5Oget_info_by_name2","H5Oget_info_by_name3","H5Oget_info_by_name_async","H5Oget_native_info","H5Oget_native_info_by_idx","H5Oget_native_info_by_name","H5Oincr_refcount","H5Olink","H5Oopen","H5Oopen_async","H5Oopen_by_addr","H5Oopen_by_idx","H5Oopen_by_idx_async","H5Oopen_by_token","H5Orefresh","H5Orefresh_async","H5Oset_comment","H5Oset_comment_by_name","H5Otoken_cmp","H5Otoken_from_str","H5Otoken_to_str","H5Ovisit1","H5Ovisit2","H5Ovisit3","H5Ovisit_by_name1","H5Ovisit_by_name2","H5Ovisit_by_name3","H5PB__dest_cb","H5PB__flush_cb","H5PB__make_space","H5PB_add_new_page","H5PB_create","H5PB_dest","H5PB_enabled","H5PB_flush","H5PB_get_stats","H5PB_print_stats","H5PB_read","H5PB_remove_entry","H5PB_reset_stats","H5PB_update_entry","H5PB_write","H5PL__add_plugin","H5PL__append_path","H5PL__close","H5PL__close_path_table","H5PL__close_plugin_cache","H5PL__create_path_table","H5PL__create_plugin_cache","H5PL__find_plugin_in_cache","H5PL__find_plugin_in_path_table","H5PL__get_num_paths","H5PL__get_path","H5PL__get_plugin_control_mask","H5PL__insert_at","H5PL__insert_path","H5PL__open","H5PL__path_table_iterate","H5PL__prepend_path","H5PL__remove_path","H5PL__replace_path","H5PL__set_plugin_control_mask","H5PL_init","H5PL_iterate","H5PL_load","H5PL_term_package","H5PLappend","H5PLget","H5PLget_loading_state","H5PLinsert","H5PLprepend","H5PLremove","H5PLreplace","H5PLset_loading_state","H5PLsize","H5P__access_class","H5P__access_class.localalias","H5P__add_prop","H5P__class_get","H5P__class_set","H5P__close_class","H5P__close_class_cb","H5P__close_list_cb","H5P__cmp_class","H5P__cmp_plist","H5P__cmp_plist_cb","H5P__cmp_prop.part.0","H5P__copy_merge_comm_dt_list","H5P__copy_pclass","H5P__copy_prop_pclass","H5P__copy_prop_plist","H5P__create_class","H5P__create_prop","H5P__dacc_reg_prop","H5P__dacc_vds_view_dec","H5P__dacc_vds_view_enc","H5P__dapl_efile_pref_close","H5P__dapl_efile_pref_cmp","H5P__dapl_efile_pref_copy","H5P__dapl_efile_pref_dec","H5P__dapl_efile_pref_del","H5P__dapl_efile_pref_enc","H5P__dapl_efile_pref_get","H5P__dapl_efile_pref_set","H5P__dapl_vds_file_pref_close","H5P__dapl_vds_file_pref_cmp","H5P__dapl_vds_file_pref_copy","H5P__dapl_vds_file_pref_dec","H5P__dapl_vds_file_pref_del","H5P__dapl_vds_file_pref_enc","H5P__dapl_vds_file_pref_get","H5P__dapl_vds_file_pref_set","H5P__dcrt_ext_file_list_close","H5P__dcrt_ext_file_list_cmp","H5P__dcrt_ext_file_list_copy","H5P__dcrt_ext_file_list_dec","H5P__dcrt_ext_file_list_del","H5P__dcrt_ext_file_list_enc","H5P__dcrt_ext_file_list_get","H5P__dcrt_ext_file_list_set","H5P__dcrt_fill_value_close","H5P__dcrt_fill_value_copy","H5P__dcrt_fill_value_dec","H5P__dcrt_fill_value_del","H5P__dcrt_fill_value_enc","H5P__dcrt_fill_value_get","H5P__dcrt_fill_value_set","H5P__dcrt_layout_close","H5P__dcrt_layout_cmp","H5P__dcrt_layout_copy","H5P__dcrt_layout_dec","H5P__dcrt_layout_del","H5P__dcrt_layout_enc","H5P__dcrt_layout_get","H5P__dcrt_layout_set","H5P__dcrt_reg_prop","H5P__decode","H5P__decode_bool","H5P__decode_chunk_cache_nbytes","H5P__decode_chunk_cache_nslots","H5P__decode_coll_md_read_flag_t","H5P__decode_double","H5P__decode_hsize_t","H5P__decode_size_t","H5P__decode_uint64_t","H5P__decode_uint8_t","H5P__decode_unsigned","H5P__do_prop_cb1","H5P__dup_prop","H5P__dxfr_bkgr_buf_type_dec","H5P__dxfr_bkgr_buf_type_enc","H5P__dxfr_btree_split_ratio_dec","H5P__dxfr_btree_split_ratio_enc","H5P__dxfr_dset_io_hyp_sel_close","H5P__dxfr_dset_io_hyp_sel_cmp","H5P__dxfr_dset_io_hyp_sel_copy","H5P__dxfr_edc_dec","H5P__dxfr_edc_enc","H5P__dxfr_io_xfer_mode_dec","H5P__dxfr_io_xfer_mode_enc","H5P__dxfr_modify_write_buf_dec","H5P__dxfr_modify_write_buf_enc","H5P__dxfr_mpio_chunk_opt_hard_dec","H5P__dxfr_mpio_chunk_opt_hard_enc","H5P__dxfr_mpio_collective_opt_dec","H5P__dxfr_mpio_collective_opt_enc","H5P__dxfr_reg_prop","H5P__dxfr_selection_io_mode_dec","H5P__dxfr_selection_io_mode_enc","H5P__dxfr_xform_close","H5P__dxfr_xform_cmp","H5P__dxfr_xform_copy","H5P__dxfr_xform_dec","H5P__dxfr_xform_del","H5P__dxfr_xform_enc","H5P__dxfr_xform_get","H5P__dxfr_xform_set","H5P__encode","H5P__encode_bool","H5P__encode_cb","H5P__encode_chunk_cache_nbytes","H5P__encode_chunk_cache_nslots","H5P__encode_coll_md_read_flag_t","H5P__encode_double","H5P__encode_hsize_t","H5P__encode_size_t","H5P__encode_uint64_t","H5P__encode_uint8_t","H5P__encode_unsigned","H5P__exist_pclass","H5P__facc_cache_config_cmp","H5P__facc_cache_config_dec","H5P__facc_cache_config_enc","H5P__facc_cache_image_config_cmp","H5P__facc_cache_image_config_dec","H5P__facc_cache_image_config_enc","H5P__facc_fclose_degree_dec","H5P__facc_fclose_degree_enc","H5P__facc_file_driver_close","H5P__facc_file_driver_cmp","H5P__facc_file_driver_copy","H5P__facc_file_driver_create","H5P__facc_file_driver_del","H5P__facc_file_driver_get","H5P__facc_file_driver_set","H5P__facc_file_image_info_close","H5P__facc_file_image_info_cmp","H5P__facc_file_image_info_copy","H5P__facc_file_image_info_del","H5P__facc_file_image_info_get","H5P__facc_file_image_info_set","H5P__facc_libver_type_dec","H5P__facc_libver_type_enc","H5P__facc_mdc_log_location_close","H5P__facc_mdc_log_location_cmp","H5P__facc_mdc_log_location_copy","H5P__facc_mdc_log_location_dec","H5P__facc_mdc_log_location_del","H5P__facc_mdc_log_location_enc","H5P__facc_mpi_comm_close","H5P__facc_mpi_comm_cmp","H5P__facc_mpi_comm_copy","H5P__facc_mpi_comm_del","H5P__facc_mpi_comm_get","H5P__facc_mpi_comm_set","H5P__facc_mpi_info_close","H5P__facc_mpi_info_cmp","H5P__facc_mpi_info_copy","H5P__facc_mpi_info_del","H5P__facc_mpi_info_get","H5P__facc_mpi_info_set","H5P__facc_multi_type_dec","H5P__facc_multi_type_enc","H5P__facc_reg_prop","H5P__facc_set_def_driver","H5P__facc_vol_close","H5P__facc_vol_cmp","H5P__facc_vol_copy","H5P__facc_vol_create","H5P__facc_vol_del","H5P__facc_vol_get","H5P__facc_vol_set","H5P__fcrt_btree_rank_dec","H5P__fcrt_btree_rank_enc","H5P__fcrt_fspace_strategy_dec","H5P__fcrt_fspace_strategy_enc","H5P__fcrt_reg_prop","H5P__fcrt_shmsg_index_minsize_dec","H5P__fcrt_shmsg_index_minsize_enc","H5P__fcrt_shmsg_index_types_dec","H5P__fcrt_shmsg_index_types_enc","H5P__find_prop_plist","H5P__fmnt_reg_prop","H5P__free_del_name_cb","H5P__free_prop_cb","H5P__gcrt_group_info_dec","H5P__gcrt_group_info_enc","H5P__gcrt_link_info_dec","H5P__gcrt_link_info_enc","H5P__gcrt_reg_prop","H5P__get_cb","H5P__get_class_parent","H5P__get_class_path","H5P__get_class_path.localalias","H5P__get_class_path_test","H5P__get_filter","H5P__get_nprops_plist","H5P__get_size_pclass","H5P__get_size_plist","H5P__iterate_cb","H5P__iterate_pclass","H5P__iterate_pclass_cb","H5P__iterate_plist","H5P__iterate_plist_cb","H5P__iterate_plist_pclass_cb","H5P__lacc_elink_fapl_close","H5P__lacc_elink_fapl_cmp","H5P__lacc_elink_fapl_copy","H5P__lacc_elink_fapl_dec","H5P__lacc_elink_fapl_del","H5P__lacc_elink_fapl_enc","H5P__lacc_elink_fapl_get","H5P__lacc_elink_fapl_set","H5P__lacc_elink_pref_close","H5P__lacc_elink_pref_cmp","H5P__lacc_elink_pref_copy","H5P__lacc_elink_pref_dec","H5P__lacc_elink_pref_del","H5P__lacc_elink_pref_enc","H5P__lacc_elink_pref_get","H5P__lacc_elink_pref_set","H5P__lacc_reg_prop","H5P__lcrt_reg_prop","H5P__macc_reg_prop","H5P__mcrt_reg_prop","H5P__new_plist_of_type","H5P__ocpy_merge_comm_dt_list_close","H5P__ocpy_merge_comm_dt_list_cmp","H5P__ocpy_merge_comm_dt_list_copy","H5P__ocpy_merge_comm_dt_list_dec","H5P__ocpy_merge_comm_dt_list_del","H5P__ocpy_merge_comm_dt_list_enc","H5P__ocpy_merge_comm_dt_list_enc.cold","H5P__ocpy_merge_comm_dt_list_get","H5P__ocpy_merge_comm_dt_list_set","H5P__ocpy_reg_prop","H5P__ocrt_pipeline_close","H5P__ocrt_pipeline_cmp","H5P__ocrt_pipeline_copy","H5P__ocrt_pipeline_dec","H5P__ocrt_pipeline_del","H5P__ocrt_pipeline_enc","H5P__ocrt_pipeline_get","H5P__ocrt_pipeline_set","H5P__ocrt_reg_prop","H5P__open_class_path","H5P__open_class_path_cb","H5P__open_class_path_test","H5P__register","H5P__register_real","H5P__set_layout","H5P__strcrt_char_encoding_dec","H5P__strcrt_char_encoding_enc","H5P__strcrt_reg_prop","H5P__unregister","H5P_class_isa","H5P_close","H5P_copy_plist","H5P_create_id","H5P_exist_plist","H5P_fill_value_cmp","H5P_fill_value_defined","H5P_filter_in_pline","H5P_get","H5P_get_class","H5P_get_class_name","H5P_get_fill_value","H5P_get_filter_by_id","H5P_get_nprops_pclass","H5P_get_plist_id","H5P_ignore_cmp","H5P_init_phase1","H5P_init_phase2","H5P_insert","H5P_is_fill_value_defined","H5P_isa_class","H5P_modify_filter","H5P_object_verify","H5P_peek","H5P_peek_driver","H5P_peek_driver_config_str","H5P_peek_driver_info","H5P_poke","H5P_remove","H5P_reset_vol_class","H5P_set","H5P_set_driver","H5P_set_driver_by_name","H5P_set_driver_by_value","H5P_set_vlen_mem_manager","H5P_set_vol","H5P_term_package","H5Padd_merge_committed_dtype_path","H5Pall_filters_avail","H5Pclose","H5Pclose_class","H5Pcopy","H5Pcopy_prop","H5Pcreate","H5Pcreate_class","H5Pdecode","H5Pencode1","H5Pencode2","H5Pequal","H5Pexist","H5Pfill_value_defined","H5Pfree_merge_committed_dtype_paths","H5Pget","H5Pget_actual_selection_io_mode","H5Pget_alignment","H5Pget_all_coll_metadata_ops","H5Pget_alloc_time","H5Pget_append_flush","H5Pget_attr_creation_order","H5Pget_attr_phase_change","H5Pget_btree_ratios","H5Pget_buffer","H5Pget_cache","H5Pget_char_encoding","H5Pget_chunk","H5Pget_chunk_cache","H5Pget_chunk_opts","H5Pget_class","H5Pget_class_name","H5Pget_class_parent","H5Pget_coll_metadata_write","H5Pget_copy_object","H5Pget_core_write_tracking","H5Pget_create_intermediate_group","H5Pget_data_transform","H5Pget_driver","H5Pget_driver_config_str","H5Pget_driver_info","H5Pget_dset_no_attrs_hint","H5Pget_dxpl_mpio","H5Pget_edc_check","H5Pget_efile_prefix","H5Pget_elink_acc_flags","H5Pget_elink_cb","H5Pget_elink_fapl","H5Pget_elink_file_cache_size","H5Pget_elink_prefix","H5Pget_est_link_info","H5Pget_evict_on_close","H5Pget_external","H5Pget_external_count","H5Pget_family_offset","H5Pget_fapl_core","H5Pget_fapl_family","H5Pget_fapl_mpio","H5Pget_fapl_multi","H5Pget_fapl_onion","H5Pget_fapl_splitter","H5Pget_fclose_degree","H5Pget_file_image","H5Pget_file_image_callbacks","H5Pget_file_locking","H5Pget_file_space","H5Pget_file_space_page_size","H5Pget_file_space_strategy","H5Pget_fill_time","H5Pget_fill_value","H5Pget_filter1","H5Pget_filter2","H5Pget_filter_by_id1","H5Pget_filter_by_id2","H5Pget_gc_references","H5Pget_hyper_vector_size","H5Pget_istore_k","H5Pget_layout","H5Pget_libver_bounds","H5Pget_link_creation_order","H5Pget_link_phase_change","H5Pget_local_heap_size_hint","H5Pget_mcdt_search_cb","H5Pget_mdc_config","H5Pget_mdc_image_config","H5Pget_mdc_log_options","H5Pget_meta_block_size","H5Pget_metadata_read_attempts","H5Pget_modify_write_buf","H5Pget_mpi_params","H5Pget_mpio_actual_chunk_opt_mode","H5Pget_mpio_actual_io_mode","H5Pget_mpio_no_collective_cause","H5Pget_multi_type","H5Pget_nfilters","H5Pget_nlinks","H5Pget_no_selection_io_cause","H5Pget_nprops","H5Pget_obj_track_times","H5Pget_object_flush_cb","H5Pget_page_buffer_size","H5Pget_preserve","H5Pget_relax_file_integrity_checks","H5Pget_selection_io","H5Pget_shared_mesg_index","H5Pget_shared_mesg_nindexes","H5Pget_shared_mesg_phase_change","H5Pget_sieve_buf_size","H5Pget_size","H5Pget_sizes","H5Pget_small_data_block_size","H5Pget_sym_k","H5Pget_type_conv_cb","H5Pget_userblock","H5Pget_version","H5Pget_virtual_count","H5Pget_virtual_dsetname","H5Pget_virtual_filename","H5Pget_virtual_prefix","H5Pget_virtual_printf_gap","H5Pget_virtual_srcspace","H5Pget_virtual_view","H5Pget_virtual_vspace","H5Pget_vlen_mem_manager","H5Pget_vol_cap_flags","H5Pget_vol_id","H5Pget_vol_info","H5Pinsert1","H5Pinsert2","H5Pisa_class","H5Piterate","H5Pmodify_filter","H5Pregister1","H5Pregister2","H5Premove","H5Premove_filter","H5Pset","H5Pset_alignment","H5Pset_all_coll_metadata_ops","H5Pset_alloc_time","H5Pset_append_flush","H5Pset_attr_creation_order","H5Pset_attr_phase_change","H5Pset_btree_ratios","H5Pset_buffer","H5Pset_cache","H5Pset_char_encoding","H5Pset_chunk","H5Pset_chunk_cache","H5Pset_chunk_opts","H5Pset_coll_metadata_write","H5Pset_copy_object","H5Pset_core_write_tracking","H5Pset_create_intermediate_group","H5Pset_data_transform","H5Pset_dataset_io_hyperslab_selection","H5Pset_deflate","H5Pset_driver","H5Pset_driver_by_name","H5Pset_driver_by_value","H5Pset_dset_no_attrs_hint","H5Pset_dxpl_mpio","H5Pset_dxpl_mpio_chunk_opt","H5Pset_dxpl_mpio_chunk_opt_num","H5Pset_dxpl_mpio_chunk_opt_ratio","H5Pset_dxpl_mpio_collective_opt","H5Pset_edc_check","H5Pset_efile_prefix","H5Pset_elink_acc_flags","H5Pset_elink_cb","H5Pset_elink_fapl","H5Pset_elink_file_cache_size","H5Pset_elink_prefix","H5Pset_est_link_info","H5Pset_evict_on_close","H5Pset_external","H5Pset_family_offset","H5Pset_fapl_core","H5Pset_fapl_family","H5Pset_fapl_log","H5Pset_fapl_mpio","H5Pset_fapl_multi","H5Pset_fapl_onion","H5Pset_fapl_sec2","H5Pset_fapl_split","H5Pset_fapl_splitter","H5Pset_fapl_stdio","H5Pset_fclose_degree","H5Pset_file_image","H5Pset_file_image_callbacks","H5Pset_file_locking","H5Pset_file_space","H5Pset_file_space_page_size","H5Pset_file_space_strategy","H5Pset_fill_time","H5Pset_fill_value","H5Pset_filter","H5Pset_filter_callback","H5Pset_fletcher32","H5Pset_gc_references","H5Pset_hyper_vector_size","H5Pset_istore_k","H5Pset_layout","H5Pset_libver_bounds","H5Pset_link_creation_order","H5Pset_link_phase_change","H5Pset_local_heap_size_hint","H5Pset_mcdt_search_cb","H5Pset_mdc_config","H5Pset_mdc_image_config","H5Pset_mdc_log_options","H5Pset_meta_block_size","H5Pset_metadata_read_attempts","H5Pset_modify_write_buf","H5Pset_mpi_params","H5Pset_multi_type","H5Pset_nbit","H5Pset_nlinks","H5Pset_obj_track_times","H5Pset_object_flush_cb","H5Pset_page_buffer_size","H5Pset_preserve","H5Pset_relax_file_integrity_checks","H5Pset_scaleoffset","H5Pset_selection_io","H5Pset_shared_mesg_index","H5Pset_shared_mesg_nindexes","H5Pset_shared_mesg_phase_change","H5Pset_shuffle","H5Pset_sieve_buf_size","H5Pset_sizes","H5Pset_small_data_block_size","H5Pset_sym_k","H5Pset_szip","H5Pset_type_conv_cb","H5Pset_userblock","H5Pset_virtual","H5Pset_virtual_prefix","H5Pset_virtual_printf_gap","H5Pset_virtual_view","H5Pset_vlen_mem_manager","H5Pset_vol","H5Punregister","H5RS__prepare_for_append","H5RS__resize_for_append.part.0","H5RS_acat","H5RS_ancat","H5RS_aputc","H5RS_asprintf_cat","H5RS_cmp","H5RS_create","H5RS_decr","H5RS_dup","H5RS_get_count","H5RS_get_str","H5RS_incr","H5RS_len","H5RS_wrap","H5R__copy","H5R__create_attr","H5R__create_object","H5R__create_region","H5R__decode","H5R__decode_heap","H5R__decode_string","H5R__decode_token_compat","H5R__decode_token_obj_compat","H5R__decode_token_region_compat","H5R__destroy","H5R__encode","H5R__encode_heap","H5R__encode_token_obj_compat","H5R__equal","H5R__get_attr_name","H5R__get_file_name","H5R__get_loc_id","H5R__get_obj_token","H5R__get_region","H5R__get_type","H5R__open_attr_api_common","H5R__open_object_api_common","H5R__open_region_api_common","H5R__reopen_file","H5R__set_loc_id","H5R__set_obj_token","H5R_init","H5Rcopy","H5Rcreate","H5Rcreate_attr","H5Rcreate_object","H5Rcreate_region","H5Rdereference1","H5Rdereference2","H5Rdestroy","H5Requal","H5Rget_attr_name","H5Rget_file_name","H5Rget_name","H5Rget_obj_name","H5Rget_obj_type1","H5Rget_obj_type2","H5Rget_obj_type3","H5Rget_region","H5Rget_type","H5Ropen_attr","H5Ropen_attr_async","H5Ropen_object","H5Ropen_object_async","H5Ropen_region","H5Ropen_region_async","H5SL__insert_common","H5SL__insert_common.cold","H5SL__release_common","H5SL_below","H5SL_close","H5SL_count","H5SL_create","H5SL_destroy","H5SL_find","H5SL_find.cold","H5SL_first","H5SL_free","H5SL_greater","H5SL_init","H5SL_insert","H5SL_item","H5SL_iterate","H5SL_last","H5SL_less","H5SL_next","H5SL_prev","H5SL_release","H5SL_remove","H5SL_remove.cold","H5SL_remove_first","H5SL_search","H5SL_search.cold","H5SL_term_package","H5SM__bt2_convert_to_list_op","H5SM__bt2_crt_context","H5SM__bt2_debug","H5SM__bt2_dst_context","H5SM__bt2_store","H5SM__cache_list_deserialize","H5SM__cache_list_free_icr","H5SM__cache_list_get_initial_load_size","H5SM__cache_list_image_len","H5SM__cache_list_serialize","H5SM__cache_list_verify_chksum","H5SM__cache_table_deserialize","H5SM__cache_table_free_icr","H5SM__cache_table_get_initial_load_size","H5SM__cache_table_image_len","H5SM__cache_table_serialize","H5SM__cache_table_verify_chksum","H5SM__compare_cb","H5SM__compare_iter_op","H5SM__create_list","H5SM__decr_ref","H5SM__delete_index","H5SM__get_index","H5SM__get_mesg_count_test","H5SM__get_refcount_bt2_cb","H5SM__incr_ref","H5SM__list_free","H5SM__message_compare","H5SM__message_decode","H5SM__message_encode","H5SM__read_iter_op","H5SM__read_mesg","H5SM__read_mesg_fh_cb","H5SM__table_free","H5SM_can_share","H5SM_delete","H5SM_get_fheap_addr","H5SM_get_info","H5SM_get_refcount","H5SM_ih_size","H5SM_init","H5SM_list_debug","H5SM_reconstitute","H5SM_table_debug","H5SM_try_share","H5SM_type_shared","H5S__all_adjust_s","H5S__all_adjust_u","H5S__all_bounds","H5S__all_copy","H5S__all_deserialize","H5S__all_intersect_block","H5S__all_is_contiguous","H5S__all_is_regular","H5S__all_is_single","H5S__all_is_valid","H5S__all_iter_block","H5S__all_iter_coords","H5S__all_iter_get_seq_list","H5S__all_iter_has_next_block","H5S__all_iter_init","H5S__all_iter_nelmts","H5S__all_iter_next","H5S__all_iter_next_block","H5S__all_iter_release","H5S__all_offset","H5S__all_project_scalar","H5S__all_project_simple","H5S__all_release","H5S__all_serial_size","H5S__all_serialize","H5S__all_shape_same","H5S__all_unlim_dim","H5S__check_internal_consistency","H5S__check_spans_overlap","H5S__check_spans_tail_ptr","H5S__close_cb","H5S__combine_select","H5S__copy_pnt_list","H5S__extent_copy_real","H5S__extent_release","H5S__fill_in_new_space","H5S__fill_in_select","H5S__generate_hyperslab","H5S__get_diminfo_status_test","H5S__get_rebuild_status_test","H5S__get_select_hyper_blocklist","H5S__hyper_add_disjoint_spans","H5S__hyper_add_span_element_helper.constprop.0","H5S__hyper_adjust_s","H5S__hyper_adjust_s_helper.constprop.0","H5S__hyper_adjust_u","H5S__hyper_adjust_u_helper.constprop.0","H5S__hyper_append_span","H5S__hyper_append_span.constprop.0","H5S__hyper_bounds","H5S__hyper_clip_spans.constprop.0","H5S__hyper_cmp_spans.part.0","H5S__hyper_coord_to_span","H5S__hyper_copy","H5S__hyper_copy_span_helper.part.0","H5S__hyper_deserialize","H5S__hyper_free_span_info","H5S__hyper_generate_spans","H5S__hyper_get_op_gen","H5S__hyper_get_version_enc_size","H5S__hyper_intersect_block","H5S__hyper_intersect_block_helper.constprop.0","H5S__hyper_is_contiguous","H5S__hyper_is_regular","H5S__hyper_is_single","H5S__hyper_is_valid","H5S__hyper_iter_block","H5S__hyper_iter_coords","H5S__hyper_iter_get_seq_list","H5S__hyper_iter_get_seq_list_opt","H5S__hyper_iter_get_seq_list_single","H5S__hyper_iter_has_next_block","H5S__hyper_iter_init","H5S__hyper_iter_nelmts","H5S__hyper_iter_next","H5S__hyper_iter_next_block","H5S__hyper_iter_release","H5S__hyper_make_spans","H5S__hyper_merge_spans_helper","H5S__hyper_new_span.part.0","H5S__hyper_new_span_info.part.0","H5S__hyper_num_elem_non_unlim","H5S__hyper_offset","H5S__hyper_proj_int_build_proj","H5S__hyper_proj_int_iterate","H5S__hyper_project_intersection","H5S__hyper_project_scalar","H5S__hyper_project_simple","H5S__hyper_rebuild","H5S__hyper_rebuild_helper","H5S__hyper_release","H5S__hyper_serial_size","H5S__hyper_serialize","H5S__hyper_serialize_helper","H5S__hyper_shape_same","H5S__hyper_span_blocklist","H5S__hyper_span_nblocks_helper.constprop.0","H5S__hyper_spans_nelem_helper.part.0.constprop.0","H5S__hyper_spans_shape_same","H5S__hyper_spans_shape_same_helper","H5S__hyper_unlim_dim","H5S__hyper_update_diminfo","H5S__internal_consistency_test","H5S__modify_select","H5S__mpio_create_point_datatype","H5S__mpio_reg_hyper_type","H5S__mpio_span_hyper_type","H5S__none_adjust_s","H5S__none_adjust_u","H5S__none_bounds","H5S__none_copy","H5S__none_deserialize","H5S__none_intersect_block","H5S__none_is_contiguous","H5S__none_is_regular","H5S__none_is_single","H5S__none_is_valid","H5S__none_iter_block","H5S__none_iter_coords","H5S__none_iter_get_seq_list","H5S__none_iter_has_next_block","H5S__none_iter_init","H5S__none_iter_nelmts","H5S__none_iter_next","H5S__none_iter_next_block","H5S__none_iter_release","H5S__none_offset","H5S__none_project_scalar","H5S__none_project_simple","H5S__none_release","H5S__none_serial_size","H5S__none_serialize","H5S__none_shape_same","H5S__none_unlim_dim","H5S__obtain_datatype.constprop.0","H5S__point_adjust_s","H5S__point_adjust_u","H5S__point_bounds","H5S__point_copy","H5S__point_deserialize","H5S__point_get_version_enc_size","H5S__point_intersect_block","H5S__point_is_contiguous","H5S__point_is_regular","H5S__point_is_single","H5S__point_is_valid","H5S__point_iter_block","H5S__point_iter_coords","H5S__point_iter_get_seq_list","H5S__point_iter_has_next_block","H5S__point_iter_init","H5S__point_iter_nelmts","H5S__point_iter_next","H5S__point_iter_next_block","H5S__point_iter_release","H5S__point_offset","H5S__point_project_scalar","H5S__point_project_simple","H5S__point_release","H5S__point_serial_size","H5S__point_serialize","H5S__point_shape_same","H5S__point_unlim_dim","H5S__sel_iter_close_cb","H5S__set_regular_hyperslab","H5S__verify_offsets","H5S_append","H5S_close","H5S_combine_hyperslab","H5S_copy","H5S_create","H5S_create_simple","H5S_debug","H5S_decode","H5S_encode","H5S_extent_copy","H5S_extent_equal","H5S_extent_get_dims","H5S_extent_nelem","H5S_get_npoints_max","H5S_get_select_bounds","H5S_get_select_npoints","H5S_get_select_num_elem_non_unlim","H5S_get_select_offset","H5S_get_select_type","H5S_get_select_unlim_dim","H5S_get_simple_extent","H5S_get_simple_extent_dims","H5S_get_simple_extent_ndims","H5S_get_simple_extent_npoints","H5S_get_simple_extent_type","H5S_has_extent","H5S_hyper_add_span_element","H5S_hyper_clip_unlim","H5S_hyper_denormalize_offset","H5S_hyper_get_clip_extent","H5S_hyper_get_clip_extent_match","H5S_hyper_get_first_inc_block","H5S_hyper_get_unlim_block","H5S_hyper_normalize_offset","H5S_init","H5S_mpio_space_type","H5S_read","H5S_sel_iter_close","H5S_select_adjust_s","H5S_select_adjust_u","H5S_select_all","H5S_select_construct_projection","H5S_select_contig_block","H5S_select_copy","H5S_select_deserialize","H5S_select_elements","H5S_select_fill","H5S_select_hyperslab","H5S_select_hyperslab.localalias","H5S_select_intersect_block","H5S_select_is_contiguous","H5S_select_is_regular","H5S_select_is_single","H5S_select_iter_coords","H5S_select_iter_get_seq_list","H5S_select_iter_init","H5S_select_iter_nelmts","H5S_select_iter_next","H5S_select_iter_release","H5S_select_iterate","H5S_select_none","H5S_select_offset","H5S_select_project_intersection","H5S_select_project_scalar","H5S_select_project_simple","H5S_select_release","H5S_select_serial_size","H5S_select_serialize","H5S_select_shape_same","H5S_select_subtract","H5S_select_valid","H5S_set_extent","H5S_set_extent_real","H5S_set_extent_simple","H5S_set_version","H5S_term_package","H5S_top_term_package","H5S_write","H5Sclose","H5Scombine_hyperslab","H5Scombine_select","H5Scopy","H5Screate","H5Screate_simple","H5Sdecode","H5Sencode1","H5Sencode2","H5Sextent_copy","H5Sextent_equal","H5Sget_regular_hyperslab","H5Sget_select_bounds","H5Sget_select_elem_npoints","H5Sget_select_elem_pointlist","H5Sget_select_hyper_blocklist","H5Sget_select_hyper_nblocks","H5Sget_select_npoints","H5Sget_select_type","H5Sget_simple_extent_dims","H5Sget_simple_extent_ndims","H5Sget_simple_extent_npoints","H5Sget_simple_extent_type","H5Sis_regular_hyperslab","H5Sis_simple","H5Smodify_select","H5Soffset_simple","H5Ssel_iter_close","H5Ssel_iter_create","H5Ssel_iter_get_seq_list","H5Ssel_iter_reset","H5Sselect_adjust","H5Sselect_all","H5Sselect_copy","H5Sselect_elements","H5Sselect_hyperslab","H5Sselect_intersect_block","H5Sselect_none","H5Sselect_project_intersection","H5Sselect_shape_same","H5Sselect_valid","H5Sset_extent_none","H5Sset_extent_simple","H5T__alloc","H5T__array_create","H5T__bit_cmp.constprop.0","H5T__bit_copy","H5T__bit_dec","H5T__bit_find","H5T__bit_get_d","H5T__bit_inc","H5T__bit_neg","H5T__bit_set","H5T__bit_set_d","H5T__bit_shift","H5T__close_cb","H5T__commit","H5T__commit_anon","H5T__commit_api_common","H5T__commit_named","H5T__complete_copy","H5T__conv_array","H5T__conv_b_b","H5T__conv_double_float","H5T__conv_double_int","H5T__conv_double_ldouble","H5T__conv_double_ldouble.cold","H5T__conv_double_llong","H5T__conv_double_long","H5T__conv_double_schar","H5T__conv_double_short","H5T__conv_double_uchar","H5T__conv_double_uint","H5T__conv_double_ullong","H5T__conv_double_ulong","H5T__conv_double_ushort","H5T__conv_enum","H5T__conv_enum_free.part.0","H5T__conv_enum_init","H5T__conv_enum_numeric","H5T__conv_f_f","H5T__conv_f_i","H5T__conv_float_double","H5T__conv_float_double.cold","H5T__conv_float_int","H5T__conv_float_ldouble","H5T__conv_float_ldouble.cold","H5T__conv_float_llong","H5T__conv_float_long","H5T__conv_float_schar","H5T__conv_float_short","H5T__conv_float_uchar","H5T__conv_float_uint","H5T__conv_float_ullong","H5T__conv_float_ulong","H5T__conv_float_ushort","H5T__conv_i_f","H5T__conv_i_i","H5T__conv_int_double","H5T__conv_int_float","H5T__conv_int_ldouble","H5T__conv_int_llong","H5T__conv_int_llong.cold","H5T__conv_int_long","H5T__conv_int_long.cold","H5T__conv_int_schar","H5T__conv_int_short","H5T__conv_int_uchar","H5T__conv_int_uint","H5T__conv_int_ullong","H5T__conv_int_ulong","H5T__conv_int_ushort","H5T__conv_ldouble_double","H5T__conv_ldouble_float","H5T__conv_ldouble_int","H5T__conv_ldouble_llong","H5T__conv_ldouble_long","H5T__conv_ldouble_schar","H5T__conv_ldouble_short","H5T__conv_ldouble_uchar","H5T__conv_ldouble_uint","H5T__conv_ldouble_ullong","H5T__conv_ldouble_ulong","H5T__conv_ldouble_ushort","H5T__conv_llong_double","H5T__conv_llong_float","H5T__conv_llong_int","H5T__conv_llong_ldouble","H5T__conv_llong_long","H5T__conv_llong_schar","H5T__conv_llong_short","H5T__conv_llong_uchar","H5T__conv_llong_uint","H5T__conv_llong_ullong","H5T__conv_llong_ulong","H5T__conv_llong_ushort","H5T__conv_long_double","H5T__conv_long_float","H5T__conv_long_int","H5T__conv_long_ldouble","H5T__conv_long_llong","H5T__conv_long_schar","H5T__conv_long_short","H5T__conv_long_uchar","H5T__conv_long_uint","H5T__conv_long_ullong","H5T__conv_long_ulong","H5T__conv_long_ushort","H5T__conv_noop","H5T__conv_order","H5T__conv_order_opt","H5T__conv_ref","H5T__conv_s_s","H5T__conv_schar_double","H5T__conv_schar_float","H5T__conv_schar_int","H5T__conv_schar_int.cold","H5T__conv_schar_ldouble","H5T__conv_schar_llong","H5T__conv_schar_llong.cold","H5T__conv_schar_long","H5T__conv_schar_long.cold","H5T__conv_schar_short","H5T__conv_schar_short.cold","H5T__conv_schar_uchar","H5T__conv_schar_uint","H5T__conv_schar_ullong","H5T__conv_schar_ulong","H5T__conv_schar_ushort","H5T__conv_short_double","H5T__conv_short_float","H5T__conv_short_int","H5T__conv_short_int.cold","H5T__conv_short_ldouble","H5T__conv_short_llong","H5T__conv_short_llong.cold","H5T__conv_short_long","H5T__conv_short_long.cold","H5T__conv_short_schar","H5T__conv_short_uchar","H5T__conv_short_uint","H5T__conv_short_ullong","H5T__conv_short_ulong","H5T__conv_short_ushort","H5T__conv_struct","H5T__conv_struct_free","H5T__conv_struct_init","H5T__conv_struct_opt","H5T__conv_struct_subset","H5T__conv_uchar_double","H5T__conv_uchar_float","H5T__conv_uchar_int","H5T__conv_uchar_int.cold","H5T__conv_uchar_ldouble","H5T__conv_uchar_llong","H5T__conv_uchar_llong.cold","H5T__conv_uchar_long","H5T__conv_uchar_long.cold","H5T__conv_uchar_schar","H5T__conv_uchar_short","H5T__conv_uchar_short.cold","H5T__conv_uchar_uint","H5T__conv_uchar_uint.cold","H5T__conv_uchar_ullong","H5T__conv_uchar_ullong.cold","H5T__conv_uchar_ulong","H5T__conv_uchar_ulong.cold","H5T__conv_uchar_ushort","H5T__conv_uchar_ushort.cold","H5T__conv_uint_double","H5T__conv_uint_float","H5T__conv_uint_int","H5T__conv_uint_ldouble","H5T__conv_uint_llong","H5T__conv_uint_llong.cold","H5T__conv_uint_long","H5T__conv_uint_long.cold","H5T__conv_uint_schar","H5T__conv_uint_short","H5T__conv_uint_uchar","H5T__conv_uint_ullong","H5T__conv_uint_ullong.cold","H5T__conv_uint_ulong","H5T__conv_uint_ulong.cold","H5T__conv_uint_ushort","H5T__conv_ullong_double","H5T__conv_ullong_float","H5T__conv_ullong_int","H5T__conv_ullong_ldouble","H5T__conv_ullong_llong","H5T__conv_ullong_long","H5T__conv_ullong_schar","H5T__conv_ullong_short","H5T__conv_ullong_uchar","H5T__conv_ullong_uint","H5T__conv_ullong_ulong","H5T__conv_ullong_ushort","H5T__conv_ulong_double","H5T__conv_ulong_float","H5T__conv_ulong_int","H5T__conv_ulong_ldouble","H5T__conv_ulong_llong","H5T__conv_ulong_long","H5T__conv_ulong_schar","H5T__conv_ulong_short","H5T__conv_ulong_uchar","H5T__conv_ulong_uint","H5T__conv_ulong_ullong","H5T__conv_ulong_ushort","H5T__conv_ushort_double","H5T__conv_ushort_float","H5T__conv_ushort_int","H5T__conv_ushort_int.cold","H5T__conv_ushort_ldouble","H5T__conv_ushort_llong","H5T__conv_ushort_llong.cold","H5T__conv_ushort_long","H5T__conv_ushort_long.cold","H5T__conv_ushort_schar","H5T__conv_ushort_short","H5T__conv_ushort_uchar","H5T__conv_ushort_uint","H5T__conv_ushort_uint.cold","H5T__conv_ushort_ullong","H5T__conv_ushort_ullong.cold","H5T__conv_ushort_ulong","H5T__conv_ushort_ulong.cold","H5T__conv_vlen","H5T__conv_vlen_nested_free","H5T__copy_all","H5T__copy_transient","H5T__create","H5T__detect_vlen_ref","H5T__enum_create","H5T__enum_insert","H5T__free","H5T__get_array_dims","H5T__get_array_ndims","H5T__get_create_plist","H5T__get_member_name","H5T__get_member_size","H5T__get_member_value","H5T__get_native_type","H5T__get_path_table_npaths","H5T__init_native_float_types","H5T__init_native_internal","H5T__initiate_copy","H5T__insert","H5T__open_api_common","H5T__open_name","H5T__pack","H5T__path_find_real","H5T__path_free","H5T__print_path_stats","H5T__ref_disk_getsize","H5T__ref_disk_isnull","H5T__ref_disk_read","H5T__ref_disk_setnull","H5T__ref_disk_write","H5T__ref_dsetreg_disk_getsize","H5T__ref_dsetreg_disk_isnull","H5T__ref_dsetreg_disk_read","H5T__ref_mem_getsize","H5T__ref_mem_isnull","H5T__ref_mem_read","H5T__ref_mem_setnull","H5T__ref_mem_write","H5T__ref_obj_disk_getsize","H5T__ref_obj_disk_isnull","H5T__ref_obj_disk_read","H5T__ref_reclaim","H5T__ref_set_loc","H5T__register","H5T__register_int","H5T__reverse_order","H5T__set_offset","H5T__set_order","H5T__set_precision","H5T__set_size","H5T__sort_name","H5T__sort_value","H5T__unlock_cb","H5T__update_packed","H5T__upgrade_version","H5T__upgrade_version_cb","H5T__visit","H5T__visit.localalias","H5T__vlen_create","H5T__vlen_disk_delete","H5T__vlen_disk_delete.part.0","H5T__vlen_disk_getlen","H5T__vlen_disk_isnull","H5T__vlen_disk_read","H5T__vlen_disk_setnull","H5T__vlen_disk_write","H5T__vlen_mem_seq_getlen","H5T__vlen_mem_seq_getptr","H5T__vlen_mem_seq_isnull","H5T__vlen_mem_seq_read","H5T__vlen_mem_seq_setnull","H5T__vlen_mem_seq_write","H5T__vlen_mem_str_getlen","H5T__vlen_mem_str_getptr","H5T__vlen_mem_str_isnull","H5T__vlen_mem_str_read","H5T__vlen_mem_str_setnull","H5T__vlen_mem_str_write","H5T__vlen_reclaim","H5T__vlen_set_loc","H5T_already_vol_managed","H5T_close","H5T_close_real","H5T_cmp","H5T_cmp.localalias","H5T_construct_datatype","H5T_convert","H5T_convert_committed_datatype","H5T_convert_with_ctx","H5T_copy","H5T_copy_reopen","H5T_debug","H5T_debug.cold","H5T_debug.localalias","H5T_decode","H5T_detect_class","H5T_detect_class.localalias","H5T_encode","H5T_get_actual_type","H5T_get_class","H5T_get_force_conv","H5T_get_member_offset","H5T_get_member_type","H5T_get_named_type","H5T_get_nmembers","H5T_get_offset","H5T_get_order","H5T_get_order.localalias","H5T_get_precision","H5T_get_ref_type","H5T_get_sign","H5T_get_size","H5T_get_super","H5T_init","H5T_invoke_vol_optional","H5T_is_immutable","H5T_is_named","H5T_is_numeric_with_unusual_unused_bits","H5T_is_relocatable","H5T_is_sensible","H5T_is_variable_str","H5T_is_vl_storage","H5T_link","H5T_lock","H5T_nameof","H5T_noop_conv","H5T_oloc","H5T_open","H5T_own_vol_obj","H5T_patch_file","H5T_patch_vlen_file","H5T_path_bkg","H5T_path_compound_subset","H5T_path_find","H5T_path_match_find_type_with_volobj","H5T_path_noop","H5T_reclaim","H5T_reclaim_cb","H5T_restore_refresh_state","H5T_save_refresh_state","H5T_set_loc","H5T_set_loc.localalias","H5T_set_version","H5T_term_package","H5T_top_term_package","H5T_unregister","H5T_update_shared","H5T_vlen_reclaim_elmt","H5Tarray_create1","H5Tarray_create2","H5Tclose","H5Tclose_async","H5Tcommit1","H5Tcommit2","H5Tcommit_anon","H5Tcommit_async","H5Tcommitted","H5Tcompiler_conv","H5Tconvert","H5Tcopy","H5Tcreate","H5Tdecode","H5Tdetect_class","H5Tencode","H5Tenum_create","H5Tenum_insert","H5Tenum_nameof","H5Tenum_valueof","H5Tequal","H5Tfind","H5Tflush","H5Tget_array_dims1","H5Tget_array_dims2","H5Tget_array_ndims","H5Tget_class","H5Tget_create_plist","H5Tget_cset","H5Tget_ebias","H5Tget_fields","H5Tget_inpad","H5Tget_member_class","H5Tget_member_index","H5Tget_member_name","H5Tget_member_offset","H5Tget_member_type","H5Tget_member_value","H5Tget_native_type","H5Tget_nmembers","H5Tget_norm","H5Tget_offset","H5Tget_order","H5Tget_pad","H5Tget_precision","H5Tget_sign","H5Tget_size","H5Tget_strpad","H5Tget_super","H5Tget_tag","H5Tinsert","H5Tis_variable_str","H5Tlock","H5Topen1","H5Topen2","H5Topen_async","H5Tpack","H5Treclaim","H5Trefresh","H5Tregister","H5Tset_cset","H5Tset_ebias","H5Tset_fields","H5Tset_inpad","H5Tset_norm","H5Tset_offset","H5Tset_order","H5Tset_pad","H5Tset_precision","H5Tset_sign","H5Tset_size","H5Tset_strpad","H5Tset_tag","H5Tunregister","H5Tvlen_create","H5UC_create","H5UC_decr","H5VL__connector_str_to_info","H5VL__file_open_find_connector_cb","H5VL__find_opt_operation","H5VL__free_cls","H5VL__get_connector_cb","H5VL__get_connector_id","H5VL__get_connector_id_by_name","H5VL__get_connector_id_by_value","H5VL__get_connector_name","H5VL__is_connector_registered_by_name","H5VL__is_connector_registered_by_value","H5VL__is_default_conn","H5VL__native_attr_close","H5VL__native_attr_create","H5VL__native_attr_get","H5VL__native_attr_open","H5VL__native_attr_optional","H5VL__native_attr_read","H5VL__native_attr_specific","H5VL__native_attr_write","H5VL__native_blob_get","H5VL__native_blob_put","H5VL__native_blob_specific","H5VL__native_dataset_close","H5VL__native_dataset_create","H5VL__native_dataset_get","H5VL__native_dataset_io_cleanup","H5VL__native_dataset_io_setup","H5VL__native_dataset_open","H5VL__native_dataset_optional","H5VL__native_dataset_read","H5VL__native_dataset_specific","H5VL__native_dataset_write","H5VL__native_datatype_close","H5VL__native_datatype_commit","H5VL__native_datatype_get","H5VL__native_datatype_open","H5VL__native_datatype_specific","H5VL__native_file_close","H5VL__native_file_create","H5VL__native_file_get","H5VL__native_file_open","H5VL__native_file_optional","H5VL__native_file_specific","H5VL__native_get_file_addr_len","H5VL__native_group_close","H5VL__native_group_create","H5VL__native_group_get","H5VL__native_group_open","H5VL__native_group_optional","H5VL__native_group_specific","H5VL__native_introspect_get_cap_flags","H5VL__native_introspect_get_conn_cls","H5VL__native_introspect_opt_query","H5VL__native_link_copy","H5VL__native_link_create","H5VL__native_link_get","H5VL__native_link_move","H5VL__native_link_specific","H5VL__native_object_copy","H5VL__native_object_get","H5VL__native_object_open","H5VL__native_object_optional","H5VL__native_object_specific","H5VL__native_str_to_token","H5VL__native_term","H5VL__native_token_cmp","H5VL__native_token_to_str","H5VL__num_opt_operation","H5VL__peek_connector_id_by_name","H5VL__peek_connector_id_by_value","H5VL__register_connector","H5VL__register_connector_by_class","H5VL__register_connector_by_name","H5VL__register_connector_by_value","H5VL__register_opt_operation","H5VL__reparse_def_vol_conn_variable_test","H5VL__set_def_conn","H5VL__term_opt_operation","H5VL__term_opt_operation_cb","H5VL__unregister_opt_operation","H5VL__wrap_obj","H5VL_attr_close","H5VL_attr_create","H5VL_attr_get","H5VL_attr_open","H5VL_attr_optional","H5VL_attr_read","H5VL_attr_specific","H5VL_attr_write","H5VL_blob_get","H5VL_blob_optional","H5VL_blob_put","H5VL_blob_specific","H5VL_check_plugin_load","H5VL_cmp_connector_cls","H5VL_cmp_connector_info","H5VL_conn_copy","H5VL_conn_dec_rc","H5VL_conn_free","H5VL_conn_inc_rc","H5VL_copy_connector_info","H5VL_create_object","H5VL_create_object_using_vol_id","H5VL_dataset_close","H5VL_dataset_create","H5VL_dataset_get","H5VL_dataset_open","H5VL_dataset_optional","H5VL_dataset_read","H5VL_dataset_specific","H5VL_dataset_write","H5VL_datatype_close","H5VL_datatype_commit","H5VL_datatype_get","H5VL_datatype_open","H5VL_datatype_optional","H5VL_datatype_optional_op","H5VL_datatype_specific","H5VL_dec_vol_wrapper","H5VL_file_close","H5VL_file_create","H5VL_file_get","H5VL_file_is_same","H5VL_file_open","H5VL_file_optional","H5VL_file_specific","H5VL_finish_lib_state","H5VL_free_connector_info","H5VL_free_lib_state","H5VL_free_object","H5VL_free_wrap_ctx","H5VL_get_cap_flags","H5VL_get_wrap_ctx","H5VL_group_close","H5VL_group_create","H5VL_group_get","H5VL_group_open","H5VL_group_optional","H5VL_group_specific","H5VL_inc_vol_wrapper","H5VL_init_phase1","H5VL_init_phase2","H5VL_introspect_get_cap_flags","H5VL_introspect_get_conn_cls","H5VL_introspect_opt_query","H5VL_link_copy","H5VL_link_create","H5VL_link_get","H5VL_link_move","H5VL_link_optional","H5VL_link_specific","H5VL_native_addr_to_token","H5VL_native_get_file_addr_len","H5VL_native_get_file_struct","H5VL_native_register","H5VL_native_token_to_addr","H5VL_new_connector","H5VL_object","H5VL_object_copy","H5VL_object_data","H5VL_object_get","H5VL_object_inc_rc","H5VL_object_is_native","H5VL_object_open","H5VL_object_optional","H5VL_object_specific","H5VL_object_unwrap","H5VL_object_verify","H5VL_optional","H5VL_pass_through_attr_close","H5VL_pass_through_attr_create","H5VL_pass_through_attr_get","H5VL_pass_through_attr_open","H5VL_pass_through_attr_optional","H5VL_pass_through_attr_read","H5VL_pass_through_attr_specific","H5VL_pass_through_attr_write","H5VL_pass_through_blob_get","H5VL_pass_through_blob_optional","H5VL_pass_through_blob_put","H5VL_pass_through_blob_specific","H5VL_pass_through_dataset_close","H5VL_pass_through_dataset_create","H5VL_pass_through_dataset_get","H5VL_pass_through_dataset_open","H5VL_pass_through_dataset_optional","H5VL_pass_through_dataset_read","H5VL_pass_through_dataset_specific","H5VL_pass_through_dataset_write","H5VL_pass_through_datatype_close","H5VL_pass_through_datatype_commit","H5VL_pass_through_datatype_get","H5VL_pass_through_datatype_open","H5VL_pass_through_datatype_optional","H5VL_pass_through_datatype_specific","H5VL_pass_through_file_close","H5VL_pass_through_file_create","H5VL_pass_through_file_get","H5VL_pass_through_file_open","H5VL_pass_through_file_optional","H5VL_pass_through_file_specific","H5VL_pass_through_free_wrap_ctx","H5VL_pass_through_get_object","H5VL_pass_through_get_wrap_ctx","H5VL_pass_through_group_close","H5VL_pass_through_group_create","H5VL_pass_through_group_get","H5VL_pass_through_group_open","H5VL_pass_through_group_optional","H5VL_pass_through_group_specific","H5VL_pass_through_info_cmp","H5VL_pass_through_info_copy","H5VL_pass_through_info_free","H5VL_pass_through_info_to_str","H5VL_pass_through_init","H5VL_pass_through_introspect_get_cap_flags","H5VL_pass_through_introspect_get_conn_cls","H5VL_pass_through_introspect_opt_query","H5VL_pass_through_link_copy","H5VL_pass_through_link_create","H5VL_pass_through_link_get","H5VL_pass_through_link_move","H5VL_pass_through_link_optional","H5VL_pass_through_link_specific","H5VL_pass_through_object_copy","H5VL_pass_through_object_get","H5VL_pass_through_object_open","H5VL_pass_through_object_optional","H5VL_pass_through_object_specific","H5VL_pass_through_optional","H5VL_pass_through_register","H5VL_pass_through_request_cancel","H5VL_pass_through_request_free","H5VL_pass_through_request_notify","H5VL_pass_through_request_optional","H5VL_pass_through_request_specific","H5VL_pass_through_request_wait","H5VL_pass_through_str_to_info","H5VL_pass_through_term","H5VL_pass_through_token_cmp","H5VL_pass_through_token_from_str","H5VL_pass_through_token_to_str","H5VL_pass_through_unwrap_object","H5VL_pass_through_wrap_object","H5VL_register","H5VL_register_using_existing_id","H5VL_register_using_vol_id","H5VL_request_cancel","H5VL_request_free","H5VL_request_notify","H5VL_request_optional","H5VL_request_specific","H5VL_request_wait","H5VL_reset_vol_wrapper","H5VL_restore_lib_state","H5VL_retrieve_lib_state","H5VL_set_vol_wrapper","H5VL_setup_acc_args","H5VL_setup_args","H5VL_setup_idx_args","H5VL_setup_loc_args","H5VL_setup_name_args","H5VL_setup_self_args","H5VL_setup_token_args","H5VL_start_lib_state","H5VL_term_package","H5VL_token_cmp","H5VL_token_from_str","H5VL_token_to_str","H5VL_unwrap_object","H5VL_vol_object","H5VL_vol_object_verify","H5VL_wrap_object","H5VL_wrap_register","H5VLattr_close","H5VLattr_create","H5VLattr_get","H5VLattr_open","H5VLattr_optional","H5VLattr_optional_op","H5VLattr_read","H5VLattr_specific","H5VLattr_write","H5VLblob_get","H5VLblob_optional","H5VLblob_put","H5VLblob_specific","H5VLclose","H5VLcmp_connector_cls","H5VLcmp_connector_info","H5VLconnector_info_to_str","H5VLconnector_str_to_info","H5VLcopy_connector_info","H5VLdataset_close","H5VLdataset_create","H5VLdataset_get","H5VLdataset_open","H5VLdataset_optional","H5VLdataset_optional_op","H5VLdataset_read","H5VLdataset_specific","H5VLdataset_write","H5VLdatatype_close","H5VLdatatype_commit","H5VLdatatype_get","H5VLdatatype_open","H5VLdatatype_optional","H5VLdatatype_optional_op","H5VLdatatype_specific","H5VLfile_close","H5VLfile_create","H5VLfile_get","H5VLfile_open","H5VLfile_optional","H5VLfile_optional_op","H5VLfile_specific","H5VLfind_opt_operation","H5VLfinish_lib_state","H5VLfree_connector_info","H5VLfree_lib_state","H5VLfree_wrap_ctx","H5VLget_cap_flags","H5VLget_connector_id","H5VLget_connector_id_by_name","H5VLget_connector_id_by_value","H5VLget_connector_name","H5VLget_file_type","H5VLget_object","H5VLget_value","H5VLget_wrap_ctx","H5VLgroup_close","H5VLgroup_create","H5VLgroup_get","H5VLgroup_open","H5VLgroup_optional","H5VLgroup_optional_op","H5VLgroup_specific","H5VLinitialize","H5VLintrospect_get_cap_flags","H5VLintrospect_get_conn_cls","H5VLintrospect_opt_query","H5VLis_connector_registered_by_name","H5VLis_connector_registered_by_value","H5VLlink_copy","H5VLlink_create","H5VLlink_get","H5VLlink_move","H5VLlink_optional","H5VLlink_optional_op","H5VLlink_specific","H5VLnative_addr_to_token","H5VLnative_token_to_addr","H5VLobject","H5VLobject_copy","H5VLobject_get","H5VLobject_is_native","H5VLobject_open","H5VLobject_optional","H5VLobject_optional_op","H5VLobject_specific","H5VLoptional","H5VLpeek_connector_id_by_name","H5VLpeek_connector_id_by_value","H5VLquery_optional","H5VLregister_connector","H5VLregister_connector_by_name","H5VLregister_connector_by_value","H5VLregister_opt_operation","H5VLrequest_cancel","H5VLrequest_free","H5VLrequest_notify","H5VLrequest_optional","H5VLrequest_optional_op","H5VLrequest_specific","H5VLrequest_wait","H5VLrestore_lib_state","H5VLretrieve_lib_state","H5VLstart_lib_state","H5VLterminate","H5VLtoken_cmp","H5VLtoken_from_str","H5VLtoken_to_str","H5VLunregister_connector","H5VLunregister_opt_operation","H5VLunwrap_object","H5VLwrap_object","H5VLwrap_register","H5VM_array_calc","H5VM_array_calc_pre","H5VM_array_down","H5VM_array_fill","H5VM_array_offset","H5VM_array_offset_pre","H5VM_chunk_index","H5VM_chunk_index_scaled","H5VM_chunk_scaled","H5VM_hyper_copy","H5VM_hyper_eq","H5VM_hyper_fill","H5VM_hyper_stride","H5VM_memcpyvv","H5VM_opvv","H5VM_stride_copy","H5VM_stride_copy.part.0","H5VM_stride_copy_s","H5VM_stride_fill","H5WB_actual","H5WB_actual_clear","H5WB_unwrap","H5WB_wrap","H5Z__calc_parms_array","H5Z__calc_parms_compound","H5Z__can_apply_nbit","H5Z__can_apply_scaleoffset","H5Z__check_unregister_dset_cb","H5Z__check_unregister_group_cb","H5Z__do_op","H5Z__filter_deflate","H5Z__filter_fletcher32","H5Z__filter_nbit","H5Z__filter_scaleoffset","H5Z__filter_shuffle","H5Z__flush_file_cb","H5Z__get_token","H5Z__nbit_compress_one_array","H5Z__nbit_compress_one_atomic","H5Z__nbit_compress_one_compound","H5Z__nbit_decompress_one_array","H5Z__nbit_decompress_one_atomic","H5Z__nbit_decompress_one_compound","H5Z__new_node.part.0","H5Z__parse_expression","H5Z__parse_factor","H5Z__parse_term","H5Z__prelude_callback","H5Z__prepare_prelude_callback_dcpl","H5Z__scaleoffset_get_type","H5Z__scaleoffset_postdecompress_i","H5Z__scaleoffset_precompress_fd","H5Z__set_local_nbit","H5Z__set_local_scaleoffset","H5Z__set_local_shuffle","H5Z__set_parms_array","H5Z__set_parms_atomic","H5Z__set_parms_compound","H5Z__unregister","H5Z__xform_copy_tree.isra.0","H5Z__xform_destroy_parse_tree.part.0","H5Z__xform_eval_full","H5Z__xform_reduce_tree","H5Z_all_filters_avail","H5Z_append","H5Z_can_apply","H5Z_can_apply_direct","H5Z_delete","H5Z_filter_avail","H5Z_filter_in_pline","H5Z_filter_info","H5Z_find","H5Z_get_filter_info","H5Z_ignore_filters","H5Z_init","H5Z_modify","H5Z_pipeline","H5Z_register","H5Z_set_local","H5Z_set_local_direct","H5Z_term_package","H5Z_xform_copy","H5Z_xform_create","H5Z_xform_destroy","H5Z_xform_eval","H5Z_xform_extract_xform_str","H5Z_xform_noop","H5Zfilter_avail","H5Zget_filter_info","H5Zregister","H5Zunregister","H5__debug_mask","H5__mpi_delete_cb","H5_bandwidth","H5_basename","H5_buffer_dump","H5_build_extpath","H5_checksum_crc","H5_checksum_fletcher32","H5_checksum_lookup3","H5_checksum_metadata","H5_combine_path","H5_default_vfd_init","H5_dirname","H5_get_option","H5_get_time","H5_hash_string","H5_init_library","H5_make_time","H5_mpi_comm_cmp","H5_mpi_comm_dup","H5_mpi_comm_free","H5_mpi_get_bigio_count","H5_mpi_info_cmp","H5_mpi_info_dup","H5_mpi_info_free","H5_mpi_set_bigio_count","H5_mpio_create_large_type","H5_mpio_gatherv_alloc","H5_mpio_gatherv_alloc_simple","H5_mpio_get_file_sync_required","H5_nanosleep","H5_now","H5_now_usec","H5_strcasestr","H5_term_library","H5_term_library.part.0","H5_timer_get_time_string","H5_timer_get_times","H5_timer_get_total_times","H5_timer_init","H5_timer_start","H5_timer_stop","H5_trace","H5_trace_args","H5allocate_memory","H5atclose","H5check_version","H5close","H5dont_atexit","H5free_memory","H5garbage_collect","H5get_free_list_sizes","H5get_libversion","H5is_library_terminating","H5is_library_threadsafe","H5open","H5resize_memory","H5set_free_list_limits","Nflock","Pflock","__do_global_dtors_aux","atexit","compute_next","deregister_tm_clones","frame_dummy","open_members","register_tm_clones"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/hdf5-1.14.5-ul6ejhuh527dwwbgwi3ij6soj2pikw2u/lib/libhdf5.so","include_offsets":false},{"type":1,"name":"bio","functions":["bio_add_folio","bio_add_folio_nofail","bio_add_hw_folio","bio_add_hw_page","bio_add_page","bio_add_pc_page","bio_add_zone_append_page","bio_alloc_bioset","bio_alloc_cache_prune.constprop.0","bio_alloc_clone","bio_alloc_irq_cache_splice","bio_alloc_map_data","bio_alloc_rescue","bio_associate_blkg","bio_associate_blkg_from_css","bio_associate_blkg_from_page.isra.0","bio_attempt_back_merge","bio_attempt_discard_merge","bio_attempt_front_merge","bio_await_chain","bio_blkcg_css","bio_chain","bio_chain_and_submit","bio_chain_endio","bio_check_pages_dirty","bio_clone_blkg_association","bio_copy_data","bio_copy_data_iter","bio_copy_from_iter","bio_copy_kern_endio","bio_copy_kern_endio_read","bio_copy_user_iov","bio_cpu_dead","bio_dirty_fn","bio_end_io_acct_remapped","bio_endio","bio_free","bio_free_pages","bio_get_page","bio_init","bio_init_clone","bio_integrity_add_page","bio_integrity_advance","bio_integrity_alloc","bio_integrity_clone","bio_integrity_copy_user","bio_integrity_free","bio_integrity_init_user","bio_integrity_map_user","bio_integrity_prep","bio_integrity_prep.cold","bio_integrity_trim","bio_integrity_unmap_user","bio_integrity_unpin_bvec","bio_integrity_verify_fn","bio_iov_bvec_set","bio_iov_iter_get_pages","bio_kmalloc","bio_map_kern_endio","bio_map_user_iov","bio_next_page","bio_poll","bio_post_read_processing","bio_put","bio_reset","bio_set_pages_dirty","bio_split","bio_split_discard","bio_split_rw","bio_split_rw_at","bio_split_to_limits","bio_split_write_zeroes","bio_split_zone_append","bio_start_io_acct","bio_submit_split.part.0","bio_to_wbt_flags","bio_trim","bio_uninit","bio_wait_end_io","bioset_exit","bioset_init","bioset_integrity_create","bioset_integrity_free","biovec_init_pool"]},{"type":3,"name":"python","functions":["function__entry"],"binary_path":"/usr/lib64/libpython3.9.so","provider":"python"},{"type":1,"name":"os_page_cache","functions":["add_to_page_cache_lru","clear_page_dirty_for_io","delete_from_page_cache_batch","end_page_writeback","fault_in_safe_writeable","fault_in_subpage_writeable","fault_in_writeable","filemap_add_folio","filemap_alloc_folio","filemap_check_errors","filemap_fdatawait_keep_errors","filemap_fdatawait_range","filemap_fdatawait_range_keep_errors","filemap_fdatawrite","filemap_fdatawrite_range","filemap_fdatawrite_wbc","filemap_flush","filemap_get_folios","filemap_get_folios_contig","filemap_get_folios_tag","filemap_range_has_page","filemap_range_has_writeback","filemap_release_folio","filemap_remove_folio","folio_account_cleaned","folio_add_wait_queue","folio_clear_dirty_for_io","folio_end_private_2","folio_end_writeback","folio_invalidate","folio_mapping","folio_wait_bit","folio_wait_bit_killable","folio_wait_private_2","folio_wait_private_2_killable","folio_wait_stable","folio_wait_writeback","folio_wait_writeback_killable","grab_cache_page_write_begin","invalidate_inode_pages2","invalidate_inode_pages2_range","invalidate_mapping_pages","kiocb_invalidate_pages","kiocb_invalidate_post_direct_write","kiocb_write_and_wait","mapping_read_folio_gfp","mapping_seek_hole_data"]},{"type":1,"name":"shm","functions":["shmem_charge","shmem_file_setup","shmem_file_setup_with_mnt","shmem_get_folio","shmem_get_unmapped_area","shmem_init_fs_context","shmem_kernel_file_setup","shmem_lock","shmem_partial_swap_usage","shmem_read_folio_gfp","shmem_read_mapping_page_gfp","shmem_swap_usage","shmem_truncate_range","shmem_uncharge","shmem_unlock_mapping","shmem_unuse","shmem_zero_setup"]},{"type":1,"name":"fscache","functions":["__fscache_acquire_cookie","__fscache_acquire_volume","__fscache_begin_read_operation","__fscache_begin_write_operation","__fscache_clear_page_bits","__fscache_invalidate","__fscache_relinquish_cookie","__fscache_relinquish_volume","__fscache_resize_cookie","__fscache_unuse_cookie","__fscache_use_cookie","__fscache_write_to_cache"]},{"type":1,"name":"xfs","functions":["xfs_agfblock_init","xfs_agflblock_init","xfs_align_sparse_ino.isra.0","xfs_alloc_ag_max_usable","xfs_alloc_ag_vextent_exact","xfs_alloc_ag_vextent_locality","xfs_alloc_ag_vextent_near","xfs_alloc_ag_vextent_size","xfs_alloc_ag_vextent_small","xfs_alloc_btrec_to_irec","xfs_alloc_buftarg","xfs_alloc_cancel_autoreap","xfs_alloc_check_irec","xfs_alloc_cntbt_iter","xfs_alloc_commit_autoreap","xfs_alloc_compute_aligned","xfs_alloc_compute_diff","xfs_alloc_compute_maxlevels","xfs_alloc_cur_check","xfs_alloc_cur_finish","xfs_alloc_file_space","xfs_alloc_fix_freelist","xfs_alloc_fix_len","xfs_alloc_fixup_trees","xfs_alloc_get_freelist","xfs_alloc_get_rec","xfs_alloc_has_records","xfs_alloc_log_agf","xfs_alloc_longest_free_extent","xfs_alloc_lookup_eq","xfs_alloc_lookup_ge","xfs_alloc_lookup_le","xfs_alloc_min_freelist","xfs_alloc_put_freelist","xfs_alloc_query_all","xfs_alloc_query_range","xfs_alloc_query_range_helper","xfs_alloc_read_agf","xfs_alloc_read_agfl","xfs_alloc_schedule_autoreap","xfs_alloc_set_aside","xfs_alloc_space_available","xfs_alloc_update","xfs_alloc_update_counters","xfs_alloc_vextent_check_args","xfs_alloc_vextent_exact_bno","xfs_alloc_vextent_finish","xfs_alloc_vextent_first_ag","xfs_alloc_vextent_iterate_ags.constprop.0","xfs_alloc_vextent_near_bno","xfs_alloc_vextent_prepare_ag","xfs_alloc_vextent_start_ag","xfs_alloc_vextent_this_ag","xfs_alloc_walk_iter","xfs_allocfree_block_count","xfs_attr_leaf_entsize","xfs_attr_leaf_try_add","xfs_attr_restore_rmt_blk","xfs_btroot_init","xfs_buf_alert_ratelimited","xfs_buf_alloc_pages","xfs_buf_cmp","xfs_buf_corruption_error","xfs_buf_delwri_cancel","xfs_buf_delwri_pushbuf","xfs_buf_delwri_queue","xfs_buf_delwri_queue_here","xfs_buf_delwri_submit","xfs_buf_delwri_submit_buffers","xfs_buf_delwri_submit_nowait","xfs_buf_dquot_io_fail","xfs_buf_dquot_iodone","xfs_buf_find_insert.constprop.0","xfs_buf_find_lock","xfs_buf_free","xfs_buf_free_callback","xfs_buf_free_pages","xfs_buf_get_map","xfs_buf_get_uncached","xfs_buf_hash_destroy","xfs_buf_hash_init","xfs_buf_hold","xfs_buf_inode_io_fail","xfs_buf_inode_iodone","xfs_buf_ioapply_map","xfs_buf_ioend","xfs_buf_ioend_fail","xfs_buf_ioend_handle_error","xfs_buf_ioend_work","xfs_buf_ioerror_alert","xfs_buf_iowait","xfs_buf_item_committed","xfs_buf_item_committing","xfs_buf_item_dirty_format","xfs_buf_item_done","xfs_buf_item_format","xfs_buf_item_format_segment","xfs_buf_item_free","xfs_buf_item_free_format","xfs_buf_item_get_format","xfs_buf_item_init","xfs_buf_item_log","xfs_buf_item_pin","xfs_buf_item_push","xfs_buf_item_put","xfs_buf_item_release","xfs_buf_item_relse","xfs_buf_item_size","xfs_buf_item_size_segment.isra.0","xfs_buf_item_unpin","xfs_buf_lock","xfs_buf_log_check_iovec","xfs_buf_log_overhead","xfs_buf_offset","xfs_buf_read_map","xfs_buf_read_uncached","xfs_buf_readahead_map","xfs_buf_rele","xfs_buf_reverify","xfs_buf_set_ref","xfs_buf_stale","xfs_buf_trylock","xfs_buf_unlock","xfs_buf_verifier_error","xfs_buf_wait_unpin","xfs_buf_zero","xfs_buffered_write_delalloc_punch","xfs_buffered_write_iomap_begin","xfs_buffered_write_iomap_end","xfs_buftarg_drain_rele","xfs_buftarg_isolate","xfs_buftarg_shrink_count","xfs_buftarg_shrink_scan","xfs_bunmapi","xfs_bunmapi_range","xfs_bwrite","xfs_cntbt_diff_two_keys","xfs_cntbt_init_high_key_from_rec","xfs_cntbt_key_diff","xfs_cntbt_keys_inorder","xfs_cntbt_recs_inorder","xfs_cntroot_init","xfs_da3_blk_link","xfs_da3_blk_unlink.isra.0","xfs_da3_blkinfo_verify","xfs_da3_fixhashpath","xfs_da3_join","xfs_da3_node_add","xfs_da3_node_create","xfs_da3_node_hdr_from_disk","xfs_da3_node_hdr_to_disk","xfs_da3_node_lasthash.isra.0","xfs_da3_node_lookup_int","xfs_da3_node_order.isra.0","xfs_da3_node_read","xfs_da3_node_read_mapped","xfs_da3_node_read_verify","xfs_da3_node_rebalance.constprop.0","xfs_da3_node_remove","xfs_da3_node_set_type","xfs_da3_node_split","xfs_da3_node_toosmall","xfs_da3_node_unbalance","xfs_da3_node_verify","xfs_da3_node_verify_struct","xfs_da3_node_write_verify","xfs_da3_path_shift","xfs_da3_root_join","xfs_da3_root_split","xfs_da3_split","xfs_da3_swap_lastblock","xfs_da_buf_copy","xfs_da_compname","xfs_da_get_buf","xfs_da_grow_inode","xfs_da_grow_inode_int","xfs_da_hashname","xfs_da_mount","xfs_da_read_buf","xfs_da_reada_buf","xfs_da_shrink_inode","xfs_da_state_alloc","xfs_da_state_free","xfs_da_state_kill_altpath","xfs_da_state_reset","xfs_da_unmount","xfs_dabuf_map.constprop.0","xfs_dax_write_iomap_end","xfs_dax_writepages","xfs_dio_write_end_io","xfs_direct_write_iomap_begin","xfs_discard_endio","xfs_discard_endio_work","xfs_discard_extents","xfs_discard_folio","xfs_do_force_shutdown","xfs_dquot_buf_read_verify","xfs_dquot_buf_readahead_verify","xfs_dquot_buf_verify","xfs_dquot_buf_verify_crc.isra.0","xfs_dquot_buf_verify_struct","xfs_dquot_buf_write_verify","xfs_end_ioend","xfs_extent_busy_ag_cmp","xfs_extent_busy_clear","xfs_extent_busy_clear_one","xfs_extent_busy_flush","xfs_extent_busy_insert","xfs_extent_busy_insert_discard","xfs_extent_busy_insert_list","xfs_extent_busy_list_empty","xfs_extent_busy_reuse","xfs_extent_busy_search","xfs_extent_busy_trim","xfs_extent_busy_update_extent","xfs_extent_busy_wait_all","xfs_extent_free_abort_intent","xfs_extent_free_cancel_item","xfs_extent_free_create_done","xfs_extent_free_create_intent","xfs_extent_free_diff_items","xfs_extent_free_finish_item","xfs_extent_free_get_group","xfs_extent_free_log_item.constprop.0","xfs_extent_free_recover_work","xfs_extent_free_relog_intent","xfs_extfree_intent_destroy_cache","xfs_file_buffered_read","xfs_file_buffered_write","xfs_file_dax_read","xfs_file_dax_write","xfs_file_dio_read","xfs_file_dio_write_aligned","xfs_file_dio_write_unaligned","xfs_file_fadvise","xfs_file_fallocate","xfs_file_fsync","xfs_file_llseek","xfs_file_mmap","xfs_file_open","xfs_file_read_iter","xfs_file_readdir","xfs_file_release","xfs_file_remap_range","xfs_file_write_checks","xfs_file_write_iter","xfs_filemap_fault","xfs_filemap_huge_fault","xfs_filemap_page_mkwrite","xfs_filemap_pfn_mkwrite","xfs_finobt_init_ptr_from_cur","xfs_free_ag_extent","xfs_freesp_init_recs.isra.0","xfs_fs_alloc_inode","xfs_fs_commit_blocks","xfs_fs_destroy_inode","xfs_fs_dirty_inode","xfs_fs_drop_inode","xfs_fs_encode_fh","xfs_fs_fh_to_dentry","xfs_fs_fh_to_parent","xfs_fs_fill_super","xfs_fs_free","xfs_fs_free_cached_objects","xfs_fs_freeze","xfs_fs_geometry","xfs_fs_get_dqblk","xfs_fs_get_nextdqblk","xfs_fs_get_parent","xfs_fs_get_quota_state","xfs_fs_get_tree","xfs_fs_get_uuid","xfs_fs_goingdown","xfs_fs_inode_init_once","xfs_fs_map_blocks","xfs_fs_mark_healthy","xfs_fs_mark_sick","xfs_fs_measure_sickness","xfs_fs_nfs_commit_metadata","xfs_fs_nr_cached_objects","xfs_fs_parse_param","xfs_fs_put_super","xfs_fs_reconfigure","xfs_fs_reserve_ag_blocks","xfs_fs_rm_xquota","xfs_fs_set_dqblk","xfs_fs_set_info","xfs_fs_show_options","xfs_fs_shutdown","xfs_fs_statfs","xfs_fs_sync_fs","xfs_fs_unfreeze","xfs_fs_unreserve_ag_blocks","xfs_fs_validate_params","xfs_fs_writable","xfs_ialloc_ag_alloc","xfs_ialloc_count_inodes_rec","xfs_ialloc_count_ondisk","xfs_ialloc_get_rec","xfs_ialloc_next_rec","xfs_iflush","xfs_iflush_abort","xfs_iflush_cluster","xfs_iflush_fork","xfs_iflush_shutdown_abort","xfs_ifork_init_attr","xfs_ifork_init_cow","xfs_ifork_verify_local_attr","xfs_ifork_verify_local_data","xfs_ifork_zap_attr","xfs_ifork_zapped","xfs_ilock_for_iomap","xfs_ilock_iocb_for_write","xfs_inode_alloc","xfs_inode_buf_read_verify","xfs_inode_buf_readahead_verify","xfs_inode_buf_verify","xfs_inode_buf_write_verify","xfs_inode_clear_cowblocks_tag","xfs_inode_clear_eofblocks_tag","xfs_inode_free","xfs_inode_free_callback","xfs_inode_free_cowblocks","xfs_inode_free_eofblocks.constprop.0","xfs_inode_from_disk","xfs_inode_from_disk_ts","xfs_inode_hasattr","xfs_inode_inherit_flags","xfs_inode_init_security","xfs_inode_item_attr_fork_size","xfs_inode_item_committed","xfs_inode_item_committing","xfs_inode_item_data_fork_size","xfs_inode_item_destroy","xfs_inode_item_format","xfs_inode_item_format_attr_fork","xfs_inode_item_format_convert","xfs_inode_item_format_data_fork","xfs_inode_item_init","xfs_inode_item_pin","xfs_inode_item_precommit","xfs_inode_item_push","xfs_inode_item_release","xfs_inode_item_size","xfs_inode_item_sort","xfs_inode_item_unpin","xfs_inode_mark_healthy","xfs_inode_mark_reclaimable","xfs_inode_mark_sick","xfs_inode_measure_sickness","xfs_inode_near_dquot_enforcement","xfs_inode_needs_inactive","xfs_inode_reload_unlinked","xfs_inode_reload_unlinked_bucket","xfs_inode_set_cowblocks_tag","xfs_inode_set_eofblocks_tag","xfs_inode_to_disk","xfs_inode_to_log_dinode","xfs_inode_validate_cowextsize","xfs_inode_validate_extsize","xfs_inode_verifier_error","xfs_iomap_eof_align_last_fsb","xfs_iomap_inode_sequence","xfs_iomap_prealloc_size.constprop.0.isra.0","xfs_iomap_swapfile_activate","xfs_iomap_valid","xfs_iomap_write_direct","xfs_iomap_write_unwritten","xfs_iread_bmbt_block","xfs_lookup_get_search_key","xfs_map_blocks","xfs_mru_cache_create","xfs_mru_cache_delete","xfs_mru_cache_destroy","xfs_mru_cache_done","xfs_mru_cache_init","xfs_mru_cache_insert","xfs_mru_cache_lookup","xfs_mru_cache_remove","xfs_mru_cache_uninit","xfs_nfs_get_inode.isra.0","xfs_prepare_ioend","xfs_read_agf","xfs_read_agi","xfs_read_iomap_begin","xfs_readdir","xfs_readlink","xfs_readlink_bmap_ilocked","xfs_readlink_by_handle","xfs_release","xfs_remove","xfs_rename","xfs_reserve_blocks","xfs_restore_resvblks","xfs_vm_bmap","xfs_vm_read_folio","xfs_vm_readahead","xfs_vm_writepages","xfs_xattr_iomap_begin"]},{"type":1,"name":"ext4","functions":["ext4_alloc_branch","ext4_alloc_da_blocks","ext4_alloc_file_blocks.isra.0","ext4_alloc_flex_bg_array","ext4_alloc_group_tables","ext4_alloc_inode","ext4_alloc_io_end_vec","ext4_append","ext4_block_bitmap","ext4_block_bitmap_csum_set","ext4_block_bitmap_csum_verify","ext4_block_bitmap_set","ext4_block_to_path","ext4_block_write_begin","ext4_block_zero_page_range","ext4_bmap","ext4_bread","ext4_bread_batch","ext4_da_convert_inline_data_to_extent","ext4_da_get_block_prep","ext4_da_map_blocks.constprop.0","ext4_da_release_space","ext4_da_reserve_space","ext4_da_update_reserve_space","ext4_da_write_begin","ext4_da_write_end","ext4_da_write_inline_data_begin","ext4_dio_alignment","ext4_dio_write_checks","ext4_dio_write_end_io","ext4_dio_write_iter","ext4_dirty_folio","ext4_dirty_inode","ext4_end_buffer_io_sync","ext4_end_io_rsv_work","ext4_exit_es","ext4_exit_mballoc","ext4_exit_pageio","ext4_exit_pending","ext4_exit_post_read_processing","ext4_exit_sysfs","ext4_exit_system_zone","ext4_ext_calc_credits_for_single_extent","ext4_ext_check_inode","ext4_ext_clear_bb","ext4_ext_convert_to_initialized","ext4_ext_correct_indexes","ext4_ext_find_goal","ext4_ext_get_access","ext4_ext_grow_indepth","ext4_ext_handle_unwritten_extents","ext4_ext_index_trans_blocks","ext4_ext_init","ext4_ext_insert_extent","ext4_ext_insert_index","ext4_ext_map_blocks","ext4_ext_migrate","ext4_ext_next_allocated_block","ext4_ext_precache","ext4_ext_precache.part.0","ext4_ext_release","ext4_ext_remove_space","ext4_ext_replay_set_iblocks","ext4_ext_replay_shrink_inode","ext4_ext_replay_update_ex","ext4_ext_rm_idx","ext4_ext_rm_leaf","ext4_ext_search_left","ext4_ext_search_right","ext4_ext_shift_extents","ext4_ext_shift_path_extents","ext4_ext_split","ext4_ext_swap_inode_data","ext4_ext_tree_init","ext4_ext_truncate","ext4_ext_try_to_merge","ext4_ext_try_to_merge_right","ext4_ext_try_to_merge_up","ext4_extent_block_csum_set","ext4_fallocate","ext4_fh_to_dentry","ext4_fh_to_parent","ext4_fiemap","ext4_file_getattr","ext4_file_mmap","ext4_file_open","ext4_file_read_iter","ext4_file_write_iter","ext4_fileattr_get","ext4_fileattr_set","ext4_find_dest_de","ext4_find_entry","ext4_find_extent","ext4_find_inline_data_nolock","ext4_find_inline_entry","ext4_find_shared","ext4_finish_convert_inline_dir","ext4_free_blocks","ext4_free_blocks_simple.isra.0","ext4_free_branches","ext4_free_clusters_after_init","ext4_free_data","ext4_free_ext_path","ext4_free_group_clusters","ext4_free_group_clusters_set","ext4_free_in_core_inode","ext4_free_inode","ext4_free_inodes_count","ext4_free_inodes_set","ext4_free_link","ext4_io_submit","ext4_io_submit_init","ext4_iomap_begin","ext4_iomap_begin_report","ext4_iomap_end","ext4_iomap_overwrite_begin","ext4_iomap_swap_activate","ext4_iomap_xattr_begin","ext4_journal_abort_handle.constprop.0","ext4_journal_bmap","ext4_journal_check_start","ext4_journal_commit_callback","ext4_journal_finish_inode_data_buffers","ext4_journal_submit_inode_data_buffers","ext4_journalled_dirty_folio","ext4_journalled_invalidate_folio","ext4_journalled_submit_inode_data_buffers","ext4_journalled_write_end","ext4_journalled_write_inline_data","ext4_journalled_writepage_callback","ext4_journalled_zero_new_buffers","ext4_mark_bitmap_end","ext4_mark_bitmap_end.part.0","ext4_mark_dquot_dirty","ext4_mark_group_bitmap_corrupted","ext4_mark_iloc_dirty","ext4_mark_inode_used","ext4_mark_recovery_complete.constprop.0","ext4_mballoc_query_range","ext4_meta_trans_blocks","ext4_mkdir","ext4_mknod","ext4_move_extents","ext4_read_bh","ext4_read_bh_lock","ext4_read_bh_nowait","ext4_read_block_bitmap","ext4_read_block_bitmap_nowait","ext4_read_folio","ext4_read_inline_data.part.0.isra.0","ext4_read_inline_dir","ext4_read_inline_link","ext4_read_inline_page","ext4_read_inode_bitmap","ext4_read_merkle_tree_page","ext4_readahead","ext4_readdir","ext4_readpage_inline","ext4_release_io_end","ext4_statfs","ext4_swap_extents","ext4_symlink","ext4_sync_file","ext4_sync_fs","ext4_tmpfile","ext4_trim_all_free","ext4_trim_fs","ext4_truncate","ext4_unfreeze","ext4_unlink","ext4_write_begin","ext4_write_dquot","ext4_write_end","ext4_write_info","ext4_write_inline_data","ext4_write_inline_data_end","ext4_write_inode","ext4_write_merkle_tree_block","ext4_writepage","ext4_writepage_cb","ext4_writepage_trans_blocks","ext4_writepages"]},{"type":1,"name":"iomap","functions":["iomap_add_to_ioend","iomap_adjust_read_range.isra.0","iomap_bmap","iomap_dio_complete","iomap_dio_complete_work","iomap_dio_deferred_complete","iomap_dio_inline_iter","iomap_dio_rw","iomap_dio_zero","iomap_dirty_folio","iomap_do_writepage","iomap_fiemap","iomap_file_buffered_write","iomap_file_buffered_write_punch_delalloc","iomap_file_unshare","iomap_finish_ioend","iomap_finish_ioends","iomap_get_folio","iomap_invalidate_folio","iomap_ioend_compare","iomap_ioend_try_merge","iomap_is_partially_uptodate","iomap_iter","iomap_page_mkwrite","iomap_read_end_io","iomap_read_folio","iomap_read_folio_sync","iomap_read_inline_data","iomap_readahead","iomap_readpage_iter","iomap_release_folio","iomap_seek_data","iomap_seek_hole","iomap_sort_ioends","iomap_submit_ioend","iomap_swapfile_activate","iomap_swapfile_add_extent","iomap_swapfile_fail","iomap_swapfile_iter","iomap_to_bh","iomap_to_fiemap","iomap_truncate_page","iomap_unshare_iter","iomap_write_begin","iomap_write_delalloc_release","iomap_write_end","iomap_write_iter","iomap_writepage_map","iomap_writepages","iomap_zero_iter","iomap_zero_range"]},{"type":2,"name":"mpi","functions":["MPIX_Comm_ack_failed","MPIX_Comm_ack_failed.cold","MPIX_Comm_agree","MPIX_Comm_agree.cold","MPIX_Comm_failure_ack","MPIX_Comm_failure_ack.cold","MPIX_Comm_failure_get_acked","MPIX_Comm_failure_get_acked.cold","MPIX_Comm_get_failed","MPIX_Comm_get_failed.cold","MPIX_Comm_iagree","MPIX_Comm_iagree.cold","MPIX_Comm_is_revoked","MPIX_Comm_revoke","MPIX_Comm_revoke.cold","MPIX_Comm_shrink","MPIX_Comm_shrink.cold","MPIX_Query_cuda_support","MPIX_Query_rocm_support","MPI_AINT_ADD_F90","MPI_AINT_DIFF_F90","MPI_Abort","MPI_Accumulate","MPI_Add_error_class","MPI_Add_error_code","MPI_Add_error_string","MPI_Address","MPI_Allgather","MPI_Allgather_init","MPI_Allgatherv","MPI_Allgatherv_init","MPI_Alloc_mem","MPI_Allreduce","MPI_Allreduce_init","MPI_Alltoall","MPI_Alltoall_init","MPI_Alltoallv","MPI_Alltoallv_init","MPI_Alltoallw","MPI_Alltoallw_init","MPI_Attr_delete","MPI_Attr_get","MPI_Attr_put","MPI_Barrier","MPI_Barrier_init","MPI_Bcast","MPI_Bcast_init","MPI_Bsend","MPI_Bsend_init","MPI_Buffer_attach","MPI_Buffer_detach","MPI_COMM_DUP_FN","MPI_COMM_NULL_COPY_FN","MPI_COMM_NULL_DELETE_FN","MPI_CONVERSION_FN_NULL","MPI_Cancel","MPI_Cart_coords","MPI_Cart_create","MPI_Cart_get","MPI_Cart_map","MPI_Cart_rank","MPI_Cart_shift","MPI_Cart_sub","MPI_Cartdim_get","MPI_Close_port","MPI_Comm_accept","MPI_Comm_c2f","MPI_Comm_call_errhandler","MPI_Comm_compare","MPI_Comm_connect","MPI_Comm_create","MPI_Comm_create_errhandler","MPI_Comm_create_from_group","MPI_Comm_create_group","MPI_Comm_create_keyval","MPI_Comm_delete_attr","MPI_Comm_disconnect","MPI_Comm_dup","MPI_Comm_dup_with_info","MPI_Comm_f2c","MPI_Comm_free","MPI_Comm_free_keyval","MPI_Comm_get_attr","MPI_Comm_get_errhandler","MPI_Comm_get_info","MPI_Comm_get_name","MPI_Comm_get_parent","MPI_Comm_group","MPI_Comm_idup","MPI_Comm_idup_with_info","MPI_Comm_join","MPI_Comm_rank","MPI_Comm_remote_group","MPI_Comm_remote_size","MPI_Comm_set_attr","MPI_Comm_set_errhandler","MPI_Comm_set_info","MPI_Comm_set_name","MPI_Comm_size","MPI_Comm_spawn","MPI_Comm_spawn_multiple","MPI_Comm_split","MPI_Comm_split_type","MPI_Comm_test_inter","MPI_Compare_and_swap","MPI_DUP_FN","MPI_Dims_create","MPI_Dist_graph_create","MPI_Dist_graph_create_adjacent","MPI_Dist_graph_neighbors","MPI_Dist_graph_neighbors_count","MPI_Errhandler_c2f","MPI_Errhandler_create","MPI_Errhandler_f2c","MPI_Errhandler_free","MPI_Errhandler_get","MPI_Errhandler_set","MPI_Error_class","MPI_Error_string","MPI_Exscan","MPI_Exscan_init","MPI_Fetch_and_op","MPI_File_c2f","MPI_File_call_errhandler","MPI_File_close","MPI_File_create_errhandler","MPI_File_delete","MPI_File_f2c","MPI_File_get_amode","MPI_File_get_atomicity","MPI_File_get_byte_offset","MPI_File_get_errhandler","MPI_File_get_group","MPI_File_get_info","MPI_File_get_position","MPI_File_get_position_shared","MPI_File_get_size","MPI_File_get_type_extent","MPI_File_get_view","MPI_File_iread","MPI_File_iread_all","MPI_File_iread_at","MPI_File_iread_at_all","MPI_File_iread_shared","MPI_File_iwrite","MPI_File_iwrite_all","MPI_File_iwrite_at","MPI_File_iwrite_at_all","MPI_File_iwrite_shared","MPI_File_open","MPI_File_preallocate","MPI_File_read","MPI_File_read_all","MPI_File_read_all_begin","MPI_File_read_all_end","MPI_File_read_at","MPI_File_read_at_all","MPI_File_read_at_all_begin","MPI_File_read_at_all_end","MPI_File_read_ordered","MPI_File_read_ordered_begin","MPI_File_read_ordered_end","MPI_File_read_shared","MPI_File_seek","MPI_File_seek_shared","MPI_File_set_atomicity","MPI_File_set_errhandler","MPI_File_set_info","MPI_File_set_size","MPI_File_set_view","MPI_File_sync","MPI_File_write","MPI_File_write_all","MPI_File_write_all_begin","MPI_File_write_all_end","MPI_File_write_at","MPI_File_write_at_all","MPI_File_write_at_all_begin","MPI_File_write_at_all_end","MPI_File_write_ordered","MPI_File_write_ordered_begin","MPI_File_write_ordered_end","MPI_File_write_shared","MPI_Finalize","MPI_Finalized","MPI_Free_mem","MPI_Gather","MPI_Gather_init","MPI_Gatherv","MPI_Gatherv_init","MPI_Get","MPI_Get_accumulate","MPI_Get_address","MPI_Get_count","MPI_Get_elements","MPI_Get_elements_x","MPI_Get_library_version","MPI_Get_processor_name","MPI_Get_version","MPI_Graph_create","MPI_Graph_get","MPI_Graph_map","MPI_Graph_neighbors","MPI_Graph_neighbors_count","MPI_Graphdims_get","MPI_Grequest_complete","MPI_Grequest_start","MPI_Group_c2f","MPI_Group_compare","MPI_Group_difference","MPI_Group_excl","MPI_Group_f2c","MPI_Group_free","MPI_Group_from_session_pset","MPI_Group_incl","MPI_Group_intersection","MPI_Group_range_excl","MPI_Group_range_incl","MPI_Group_rank","MPI_Group_size","MPI_Group_translate_ranks","MPI_Group_union","MPI_Iallgather","MPI_Iallgatherv","MPI_Iallreduce","MPI_Ialltoall","MPI_Ialltoallv","MPI_Ialltoallw","MPI_Ibarrier","MPI_Ibcast","MPI_Ibsend","MPI_Iexscan","MPI_Igather","MPI_Igatherv","MPI_Improbe","MPI_Imrecv","MPI_Ineighbor_allgather","MPI_Ineighbor_allgatherv","MPI_Ineighbor_alltoall","MPI_Ineighbor_alltoallv","MPI_Ineighbor_alltoallw","MPI_Info_c2f","MPI_Info_create","MPI_Info_create_env","MPI_Info_delete","MPI_Info_dup","MPI_Info_f2c","MPI_Info_free","MPI_Info_get","MPI_Info_get_nkeys","MPI_Info_get_nthkey","MPI_Info_get_string","MPI_Info_get_valuelen","MPI_Info_set","MPI_Init","MPI_Init_thread","MPI_Initialized","MPI_Intercomm_create","MPI_Intercomm_create_from_groups","MPI_Intercomm_merge","MPI_Iprobe","MPI_Irecv","MPI_Ireduce","MPI_Ireduce_scatter","MPI_Ireduce_scatter_block","MPI_Irsend","MPI_Is_thread_main","MPI_Iscan","MPI_Iscatter","MPI_Iscatterv","MPI_Isend","MPI_Isendrecv","MPI_Isendrecv_replace","MPI_Issend","MPI_Keyval_create","MPI_Keyval_free","MPI_Lookup_name","MPI_Message_c2f","MPI_Message_f2c","MPI_Mprobe","MPI_Mrecv","MPI_NULL_COPY_FN","MPI_NULL_DELETE_FN","MPI_Neighbor_allgather","MPI_Neighbor_allgather_init","MPI_Neighbor_allgatherv","MPI_Neighbor_allgatherv_init","MPI_Neighbor_alltoall","MPI_Neighbor_alltoall_init","MPI_Neighbor_alltoallv","MPI_Neighbor_alltoallv_init","MPI_Neighbor_alltoallw","MPI_Neighbor_alltoallw_init","MPI_Op_c2f","MPI_Op_commutative","MPI_Op_create","MPI_Op_f2c","MPI_Op_free","MPI_Open_port","MPI_Pack","MPI_Pack_external","MPI_Pack_external_size","MPI_Pack_size","MPI_Parrived","MPI_Pcontrol","MPI_Pready","MPI_Pready_list","MPI_Pready_range","MPI_Precv_init","MPI_Probe","MPI_Psend_init","MPI_Publish_name","MPI_Put","MPI_Query_thread","MPI_Raccumulate","MPI_Recv","MPI_Recv_init","MPI_Reduce","MPI_Reduce_init","MPI_Reduce_local","MPI_Reduce_scatter","MPI_Reduce_scatter_block","MPI_Reduce_scatter_block_init","MPI_Reduce_scatter_init","MPI_Register_datarep","MPI_Request_c2f","MPI_Request_f2c","MPI_Request_free","MPI_Request_get_status","MPI_Rget","MPI_Rget_accumulate","MPI_Rput","MPI_Rsend","MPI_Rsend_init","MPI_Scan","MPI_Scan_init","MPI_Scatter","MPI_Scatter_init","MPI_Scatterv","MPI_Scatterv_init","MPI_Send","MPI_Send_init","MPI_Sendrecv","MPI_Sendrecv_replace","MPI_Session_c2f","MPI_Session_call_errhandler","MPI_Session_create_errhandler","MPI_Session_f2c","MPI_Session_finalize","MPI_Session_get_errhandler","MPI_Session_get_info","MPI_Session_get_nth_pset","MPI_Session_get_num_psets","MPI_Session_get_pset_info","MPI_Session_init","MPI_Session_set_errhandler","MPI_Session_set_info","MPI_Ssend","MPI_Ssend_init","MPI_Start","MPI_Startall","MPI_Status_c2f","MPI_Status_c2f08","MPI_Status_f082c","MPI_Status_f082f","MPI_Status_f2c","MPI_Status_f2f08","MPI_Status_set_cancelled","MPI_Status_set_elements","MPI_Status_set_elements_x","MPI_TYPE_DUP_FN","MPI_TYPE_NULL_COPY_FN","MPI_TYPE_NULL_DELETE_FN","MPI_T_category_changed","MPI_T_category_get_categories","MPI_T_category_get_cvars","MPI_T_category_get_index","MPI_T_category_get_info","MPI_T_category_get_num","MPI_T_category_get_pvars","MPI_T_cvar_get_index","MPI_T_cvar_get_info","MPI_T_cvar_get_num","MPI_T_cvar_handle_alloc","MPI_T_cvar_handle_free","MPI_T_cvar_read","MPI_T_cvar_write","MPI_T_enum_get_info","MPI_T_enum_get_item","MPI_T_finalize","MPI_T_init_thread","MPI_T_pvar_get_index","MPI_T_pvar_get_info","MPI_T_pvar_get_num","MPI_T_pvar_handle_alloc","MPI_T_pvar_handle_free","MPI_T_pvar_read","MPI_T_pvar_readreset","MPI_T_pvar_reset","MPI_T_pvar_session_create","MPI_T_pvar_session_free","MPI_T_pvar_start","MPI_T_pvar_stop","MPI_T_pvar_write","MPI_Test","MPI_Test_cancelled","MPI_Testall","MPI_Testany","MPI_Testsome","MPI_Topo_test","MPI_Type_c2f","MPI_Type_commit","MPI_Type_contiguous","MPI_Type_create_darray","MPI_Type_create_f90_complex","MPI_Type_create_f90_integer","MPI_Type_create_f90_real","MPI_Type_create_hindexed","MPI_Type_create_hindexed_block","MPI_Type_create_hvector","MPI_Type_create_indexed_block","MPI_Type_create_keyval","MPI_Type_create_resized","MPI_Type_create_struct","MPI_Type_create_subarray","MPI_Type_delete_attr","MPI_Type_dup","MPI_Type_extent","MPI_Type_f2c","MPI_Type_free","MPI_Type_free_keyval","MPI_Type_get_attr","MPI_Type_get_contents","MPI_Type_get_envelope","MPI_Type_get_extent","MPI_Type_get_extent_x","MPI_Type_get_name","MPI_Type_get_true_extent","MPI_Type_get_true_extent_x","MPI_Type_hindexed","MPI_Type_hvector","MPI_Type_indexed","MPI_Type_lb","MPI_Type_match_size","MPI_Type_set_attr","MPI_Type_set_name","MPI_Type_size","MPI_Type_size_x","MPI_Type_struct","MPI_Type_ub","MPI_Type_vector","MPI_Unpack","MPI_Unpack_external","MPI_Unpublish_name","MPI_WIN_DUP_FN","MPI_WIN_NULL_COPY_FN","MPI_WIN_NULL_DELETE_FN","MPI_WTICK_F90","MPI_WTIME_F90","MPI_Wait","MPI_Waitall","MPI_Waitany","MPI_Waitsome","MPI_Win_allocate","MPI_Win_allocate_shared","MPI_Win_attach","MPI_Win_c2f","MPI_Win_call_errhandler","MPI_Win_complete","MPI_Win_create","MPI_Win_create_dynamic","MPI_Win_create_errhandler","MPI_Win_create_keyval","MPI_Win_delete_attr","MPI_Win_detach","MPI_Win_f2c","MPI_Win_fence","MPI_Win_flush","MPI_Win_flush_all","MPI_Win_flush_local","MPI_Win_flush_local_all","MPI_Win_free","MPI_Win_free_keyval","MPI_Win_get_attr","MPI_Win_get_errhandler","MPI_Win_get_group","MPI_Win_get_info","MPI_Win_get_name","MPI_Win_lock","MPI_Win_lock_all","MPI_Win_post","MPI_Win_set_attr","MPI_Win_set_errhandler","MPI_Win_set_info","MPI_Win_set_name","MPI_Win_shared_query","MPI_Win_start","MPI_Win_sync","MPI_Win_test","MPI_Win_unlock","MPI_Win_unlock_all","MPI_Win_wait","MPI_Wtick","MPI_Wtime","NBC_Comm_neighbors","NBC_Comm_neighbors_count","NBC_Error","NBC_Error.constprop.0:0x12d820","NBC_Error.constprop.0:0x12e380","NBC_Error.constprop.0:0x12ee10","NBC_Error.constprop.0:0x130de0","NBC_Error.constprop.0:0x138c20","NBC_Error.constprop.0:0x13a930","NBC_Error.constprop.0:0x13bee0","NBC_Init_comm","NBC_Progress","NBC_Return_handle","NBC_Sched_barrier","NBC_Sched_commit","NBC_Sched_copy","NBC_Sched_local_recv","NBC_Sched_local_send","NBC_Sched_op","NBC_Sched_recv","NBC_Sched_send","NBC_Sched_unpack","NBC_Schedule_request","NBC_Start","NBC_Start_round","OMPI_Affinity_str","OMPI_Affinity_str.cold","OMPI_C_MPI_COMM_DUP_FN","OMPI_C_MPI_COMM_NULL_COPY_FN","OMPI_C_MPI_COMM_NULL_DELETE_FN","OMPI_C_MPI_DUP_FN","OMPI_C_MPI_NULL_COPY_FN","OMPI_C_MPI_NULL_DELETE_FN","OMPI_C_MPI_TYPE_DUP_FN","OMPI_C_MPI_TYPE_NULL_COPY_FN","OMPI_C_MPI_TYPE_NULL_DELETE_FN","OMPI_C_MPI_WIN_DUP_FN","OMPI_C_MPI_WIN_NULL_COPY_FN","OMPI_C_MPI_WIN_NULL_DELETE_FN","OMPI_TEST_FORTRAN_CONSTANTS","PMPIX_Comm_ack_failed","PMPIX_Comm_ack_failed.cold","PMPIX_Comm_agree","PMPIX_Comm_agree.cold","PMPIX_Comm_failure_ack","PMPIX_Comm_failure_ack.cold","PMPIX_Comm_failure_get_acked","PMPIX_Comm_failure_get_acked.cold","PMPIX_Comm_get_failed","PMPIX_Comm_get_failed.cold","PMPIX_Comm_iagree","PMPIX_Comm_iagree.cold","PMPIX_Comm_is_revoked","PMPIX_Comm_revoke","PMPIX_Comm_revoke.cold","PMPIX_Comm_shrink","PMPIX_Comm_shrink.cold","PMPI_Abort","PMPI_Accumulate","PMPI_Accumulate.cold","PMPI_Add_error_class","PMPI_Add_error_class.cold","PMPI_Add_error_code","PMPI_Add_error_code.cold","PMPI_Add_error_string","PMPI_Address","PMPI_Allgather","PMPI_Allgather.cold","PMPI_Allgather_init","PMPI_Allgather_init.cold","PMPI_Allgatherv","PMPI_Allgatherv.cold","PMPI_Allgatherv_init","PMPI_Allgatherv_init.cold","PMPI_Alloc_mem","PMPI_Allreduce","PMPI_Allreduce.cold","PMPI_Allreduce_init","PMPI_Allreduce_init.cold","PMPI_Alltoall","PMPI_Alltoall.cold","PMPI_Alltoall_init","PMPI_Alltoall_init.cold","PMPI_Alltoallv","PMPI_Alltoallv.cold","PMPI_Alltoallv_init","PMPI_Alltoallv_init.cold","PMPI_Alltoallw","PMPI_Alltoallw.cold","PMPI_Alltoallw_init","PMPI_Alltoallw_init.cold","PMPI_Attr_delete","PMPI_Attr_get","PMPI_Attr_get.cold","PMPI_Attr_put","PMPI_Barrier","PMPI_Barrier.cold","PMPI_Barrier_init","PMPI_Barrier_init.cold","PMPI_Bcast","PMPI_Bcast.cold","PMPI_Bcast_init","PMPI_Bcast_init.cold","PMPI_Bsend","PMPI_Bsend.cold","PMPI_Bsend_init","PMPI_Bsend_init.cold","PMPI_Buffer_attach","PMPI_Buffer_detach","PMPI_Cancel","PMPI_Cancel.cold","PMPI_Cart_coords","PMPI_Cart_coords.cold","PMPI_Cart_create","PMPI_Cart_create.cold","PMPI_Cart_get","PMPI_Cart_get.cold","PMPI_Cart_map","PMPI_Cart_map.cold","PMPI_Cart_rank","PMPI_Cart_rank.cold","PMPI_Cart_shift","PMPI_Cart_shift.cold","PMPI_Cart_sub","PMPI_Cart_sub.cold","PMPI_Cartdim_get","PMPI_Cartdim_get.cold","PMPI_Close_port","PMPI_Close_port.cold","PMPI_Comm_accept","PMPI_Comm_accept.cold","PMPI_Comm_c2f","PMPI_Comm_call_errhandler","PMPI_Comm_call_errhandler.cold","PMPI_Comm_compare","PMPI_Comm_compare.cold","PMPI_Comm_connect","PMPI_Comm_connect.cold","PMPI_Comm_create","PMPI_Comm_create.cold","PMPI_Comm_create_errhandler","PMPI_Comm_create_from_group","PMPI_Comm_create_group","PMPI_Comm_create_group.cold","PMPI_Comm_create_keyval","PMPI_Comm_delete_attr","PMPI_Comm_disconnect","PMPI_Comm_dup","PMPI_Comm_dup.cold","PMPI_Comm_dup_with_info","PMPI_Comm_dup_with_info.cold","PMPI_Comm_f2c","PMPI_Comm_free","PMPI_Comm_free.cold","PMPI_Comm_free_keyval","PMPI_Comm_get_attr","PMPI_Comm_get_errhandler","PMPI_Comm_get_info","PMPI_Comm_get_name","PMPI_Comm_get_parent","PMPI_Comm_group","PMPI_Comm_group.cold","PMPI_Comm_idup","PMPI_Comm_idup.cold","PMPI_Comm_idup_with_info","PMPI_Comm_idup_with_info.cold","PMPI_Comm_join","PMPI_Comm_join.cold","PMPI_Comm_rank","PMPI_Comm_remote_group","PMPI_Comm_remote_size","PMPI_Comm_set_attr","PMPI_Comm_set_errhandler","PMPI_Comm_set_info","PMPI_Comm_set_name","PMPI_Comm_set_name.cold","PMPI_Comm_size","PMPI_Comm_spawn","PMPI_Comm_spawn.cold","PMPI_Comm_spawn_multiple","PMPI_Comm_spawn_multiple.cold","PMPI_Comm_split","PMPI_Comm_split.cold","PMPI_Comm_split_type","PMPI_Comm_split_type.cold","PMPI_Comm_test_inter","PMPI_Compare_and_swap","PMPI_Compare_and_swap.cold","PMPI_Dims_create","PMPI_Dist_graph_create","PMPI_Dist_graph_create.cold","PMPI_Dist_graph_create_adjacent","PMPI_Dist_graph_create_adjacent.cold","PMPI_Dist_graph_neighbors","PMPI_Dist_graph_neighbors.cold","PMPI_Dist_graph_neighbors_count","PMPI_Dist_graph_neighbors_count.cold","PMPI_Errhandler_c2f","PMPI_Errhandler_create","PMPI_Errhandler_f2c","PMPI_Errhandler_free","PMPI_Errhandler_get","PMPI_Errhandler_set","PMPI_Error_class","PMPI_Error_class.cold","PMPI_Error_string","PMPI_Error_string.cold","PMPI_Exscan","PMPI_Exscan.cold","PMPI_Exscan_init","PMPI_Exscan_init.cold","PMPI_Fetch_and_op","PMPI_Fetch_and_op.cold","PMPI_File_c2f","PMPI_File_call_errhandler","PMPI_File_call_errhandler.cold","PMPI_File_close","PMPI_File_close.cold","PMPI_File_create_errhandler","PMPI_File_delete","PMPI_File_delete.cold","PMPI_File_f2c","PMPI_File_get_amode","PMPI_File_get_amode.cold","PMPI_File_get_atomicity","PMPI_File_get_atomicity.cold","PMPI_File_get_byte_offset","PMPI_File_get_byte_offset.cold","PMPI_File_get_errhandler","PMPI_File_get_group","PMPI_File_get_group.cold","PMPI_File_get_info","PMPI_File_get_info.cold","PMPI_File_get_position","PMPI_File_get_position.cold","PMPI_File_get_position_shared","PMPI_File_get_position_shared.cold","PMPI_File_get_size","PMPI_File_get_size.cold","PMPI_File_get_type_extent","PMPI_File_get_type_extent.cold","PMPI_File_get_view","PMPI_File_get_view.cold","PMPI_File_iread","PMPI_File_iread.cold","PMPI_File_iread_all","PMPI_File_iread_all.cold","PMPI_File_iread_at","PMPI_File_iread_at.cold","PMPI_File_iread_at_all","PMPI_File_iread_at_all.cold","PMPI_File_iread_shared","PMPI_File_iread_shared.cold","PMPI_File_iwrite","PMPI_File_iwrite.cold","PMPI_File_iwrite_all","PMPI_File_iwrite_all.cold","PMPI_File_iwrite_at","PMPI_File_iwrite_at.cold","PMPI_File_iwrite_at_all","PMPI_File_iwrite_at_all.cold","PMPI_File_iwrite_shared","PMPI_File_iwrite_shared.cold","PMPI_File_open","PMPI_File_open.cold","PMPI_File_preallocate","PMPI_File_preallocate.cold","PMPI_File_read","PMPI_File_read.cold","PMPI_File_read_all","PMPI_File_read_all.cold","PMPI_File_read_all_begin","PMPI_File_read_all_begin.cold","PMPI_File_read_all_end","PMPI_File_read_all_end.cold","PMPI_File_read_at","PMPI_File_read_at.cold","PMPI_File_read_at_all","PMPI_File_read_at_all.cold","PMPI_File_read_at_all_begin","PMPI_File_read_at_all_begin.cold","PMPI_File_read_at_all_end","PMPI_File_read_at_all_end.cold","PMPI_File_read_ordered","PMPI_File_read_ordered.cold","PMPI_File_read_ordered_begin","PMPI_File_read_ordered_begin.cold","PMPI_File_read_ordered_end","PMPI_File_read_ordered_end.cold","PMPI_File_read_shared","PMPI_File_read_shared.cold","PMPI_File_seek","PMPI_File_seek.cold","PMPI_File_seek_shared","PMPI_File_seek_shared.cold","PMPI_File_set_atomicity","PMPI_File_set_atomicity.cold","PMPI_File_set_errhandler","PMPI_File_set_info","PMPI_File_set_info.cold","PMPI_File_set_size","PMPI_File_set_size.cold","PMPI_File_set_view","PMPI_File_set_view.cold","PMPI_File_sync","PMPI_File_sync.cold","PMPI_File_write","PMPI_File_write.cold","PMPI_File_write_all","PMPI_File_write_all.cold","PMPI_File_write_all_begin","PMPI_File_write_all_begin.cold","PMPI_File_write_all_end","PMPI_File_write_all_end.cold","PMPI_File_write_at","PMPI_File_write_at.cold","PMPI_File_write_at_all","PMPI_File_write_at_all.cold","PMPI_File_write_at_all_begin","PMPI_File_write_at_all_begin.cold","PMPI_File_write_at_all_end","PMPI_File_write_at_all_end.cold","PMPI_File_write_ordered","PMPI_File_write_ordered.cold","PMPI_File_write_ordered_begin","PMPI_File_write_ordered_begin.cold","PMPI_File_write_ordered_end","PMPI_File_write_ordered_end.cold","PMPI_File_write_shared","PMPI_File_write_shared.cold","PMPI_Finalize","PMPI_Finalized","PMPI_Free_mem","PMPI_Gather","PMPI_Gather.cold","PMPI_Gather_init","PMPI_Gather_init.cold","PMPI_Gatherv","PMPI_Gatherv.cold","PMPI_Gatherv_init","PMPI_Gatherv_init.cold","PMPI_Get","PMPI_Get.cold","PMPI_Get_accumulate","PMPI_Get_accumulate.cold","PMPI_Get_address","PMPI_Get_count","PMPI_Get_elements","PMPI_Get_elements_x","PMPI_Get_library_version","PMPI_Get_processor_name","PMPI_Get_version","PMPI_Graph_create","PMPI_Graph_create.cold","PMPI_Graph_get","PMPI_Graph_get.cold","PMPI_Graph_map","PMPI_Graph_map.cold","PMPI_Graph_neighbors","PMPI_Graph_neighbors.cold","PMPI_Graph_neighbors_count","PMPI_Graph_neighbors_count.cold","PMPI_Graphdims_get","PMPI_Graphdims_get.cold","PMPI_Grequest_complete","PMPI_Grequest_start","PMPI_Grequest_start.cold","PMPI_Group_c2f","PMPI_Group_compare","PMPI_Group_difference","PMPI_Group_difference.cold","PMPI_Group_excl","PMPI_Group_excl.cold","PMPI_Group_f2c","PMPI_Group_free","PMPI_Group_free.cold","PMPI_Group_from_session_pset","PMPI_Group_from_session_pset.cold","PMPI_Group_incl","PMPI_Group_incl.cold","PMPI_Group_intersection","PMPI_Group_intersection.cold","PMPI_Group_range_excl","PMPI_Group_range_excl.cold","PMPI_Group_range_incl","PMPI_Group_range_incl.cold","PMPI_Group_rank","PMPI_Group_size","PMPI_Group_translate_ranks","PMPI_Group_translate_ranks.cold","PMPI_Group_union","PMPI_Group_union.cold","PMPI_Iallgather","PMPI_Iallgather.cold","PMPI_Iallgatherv","PMPI_Iallgatherv.cold","PMPI_Iallreduce","PMPI_Iallreduce.cold","PMPI_Ialltoall","PMPI_Ialltoall.cold","PMPI_Ialltoallv","PMPI_Ialltoallv.cold","PMPI_Ialltoallw","PMPI_Ialltoallw.cold","PMPI_Ibarrier","PMPI_Ibarrier.cold","PMPI_Ibcast","PMPI_Ibcast.cold","PMPI_Ibsend","PMPI_Ibsend.cold","PMPI_Iexscan","PMPI_Iexscan.cold","PMPI_Igather","PMPI_Igather.cold","PMPI_Igatherv","PMPI_Igatherv.cold","PMPI_Improbe","PMPI_Improbe.cold","PMPI_Imrecv","PMPI_Imrecv.cold","PMPI_Ineighbor_allgather","PMPI_Ineighbor_allgather.cold","PMPI_Ineighbor_allgatherv","PMPI_Ineighbor_allgatherv.cold","PMPI_Ineighbor_alltoall","PMPI_Ineighbor_alltoall.cold","PMPI_Ineighbor_alltoallv","PMPI_Ineighbor_alltoallv.cold","PMPI_Ineighbor_alltoallw","PMPI_Ineighbor_alltoallw.cold","PMPI_Info_c2f","PMPI_Info_create","PMPI_Info_create_env","PMPI_Info_create_env.cold","PMPI_Info_delete","PMPI_Info_delete.cold","PMPI_Info_dup","PMPI_Info_dup.cold","PMPI_Info_f2c","PMPI_Info_free","PMPI_Info_free.cold","PMPI_Info_get","PMPI_Info_get.cold","PMPI_Info_get_nkeys","PMPI_Info_get_nkeys.cold","PMPI_Info_get_nthkey","PMPI_Info_get_nthkey.cold","PMPI_Info_get_string","PMPI_Info_get_string.cold","PMPI_Info_get_valuelen","PMPI_Info_get_valuelen.cold","PMPI_Info_set","PMPI_Info_set.cold","PMPI_Init","PMPI_Init.cold","PMPI_Init_thread","PMPI_Init_thread.cold","PMPI_Initialized","PMPI_Intercomm_create","PMPI_Intercomm_create.cold","PMPI_Intercomm_create_from_groups","PMPI_Intercomm_merge","PMPI_Intercomm_merge.cold","PMPI_Iprobe","PMPI_Iprobe.cold","PMPI_Irecv","PMPI_Irecv.cold","PMPI_Ireduce","PMPI_Ireduce.cold","PMPI_Ireduce_scatter","PMPI_Ireduce_scatter.cold","PMPI_Ireduce_scatter_block","PMPI_Ireduce_scatter_block.cold","PMPI_Irsend","PMPI_Irsend.cold","PMPI_Is_thread_main","PMPI_Iscan","PMPI_Iscan.cold","PMPI_Iscatter","PMPI_Iscatter.cold","PMPI_Iscatterv","PMPI_Iscatterv.cold","PMPI_Isend","PMPI_Isend.cold","PMPI_Isendrecv","PMPI_Isendrecv.cold","PMPI_Isendrecv_replace","PMPI_Isendrecv_replace.cold","PMPI_Issend","PMPI_Issend.cold","PMPI_Keyval_create","PMPI_Keyval_free","PMPI_Lookup_name","PMPI_Lookup_name.cold","PMPI_Message_c2f","PMPI_Message_f2c","PMPI_Mprobe","PMPI_Mprobe.cold","PMPI_Mrecv","PMPI_Mrecv.cold","PMPI_Neighbor_allgather","PMPI_Neighbor_allgather.cold","PMPI_Neighbor_allgather_init","PMPI_Neighbor_allgather_init.cold","PMPI_Neighbor_allgatherv","PMPI_Neighbor_allgatherv.cold","PMPI_Neighbor_allgatherv_init","PMPI_Neighbor_allgatherv_init.cold","PMPI_Neighbor_alltoall","PMPI_Neighbor_alltoall.cold","PMPI_Neighbor_alltoall_init","PMPI_Neighbor_alltoall_init.cold","PMPI_Neighbor_alltoallv","PMPI_Neighbor_alltoallv.cold","PMPI_Neighbor_alltoallv_init","PMPI_Neighbor_alltoallv_init.cold","PMPI_Neighbor_alltoallw","PMPI_Neighbor_alltoallw.cold","PMPI_Neighbor_alltoallw_init","PMPI_Neighbor_alltoallw_init.cold","PMPI_Op_c2f","PMPI_Op_commutative","PMPI_Op_create","PMPI_Op_f2c","PMPI_Op_free","PMPI_Open_port","PMPI_Open_port.cold","PMPI_Pack","PMPI_Pack.cold","PMPI_Pack_external","PMPI_Pack_external.cold","PMPI_Pack_external_size","PMPI_Pack_external_size.cold","PMPI_Pack_size","PMPI_Parrived","PMPI_Parrived.cold","PMPI_Pcontrol","PMPI_Pready","PMPI_Pready.cold","PMPI_Pready_list","PMPI_Pready_list.cold","PMPI_Pready_range","PMPI_Pready_range.cold","PMPI_Precv_init","PMPI_Precv_init.cold","PMPI_Probe","PMPI_Probe.cold","PMPI_Psend_init","PMPI_Psend_init.cold","PMPI_Publish_name","PMPI_Publish_name.cold","PMPI_Put","PMPI_Put.cold","PMPI_Query_thread","PMPI_Raccumulate","PMPI_Raccumulate.cold","PMPI_Recv","PMPI_Recv.cold","PMPI_Recv_init","PMPI_Recv_init.cold","PMPI_Reduce","PMPI_Reduce.cold","PMPI_Reduce_init","PMPI_Reduce_init.cold","PMPI_Reduce_local","PMPI_Reduce_local.cold","PMPI_Reduce_scatter","PMPI_Reduce_scatter.cold","PMPI_Reduce_scatter_block","PMPI_Reduce_scatter_block.cold","PMPI_Reduce_scatter_block_init","PMPI_Reduce_scatter_block_init.cold","PMPI_Reduce_scatter_init","PMPI_Reduce_scatter_init.cold","PMPI_Register_datarep","PMPI_Register_datarep.cold","PMPI_Request_c2f","PMPI_Request_f2c","PMPI_Request_free","PMPI_Request_free.cold","PMPI_Request_get_status","PMPI_Rget","PMPI_Rget.cold","PMPI_Rget_accumulate","PMPI_Rget_accumulate.cold","PMPI_Rput","PMPI_Rput.cold","PMPI_Rsend","PMPI_Rsend.cold","PMPI_Rsend_init","PMPI_Rsend_init.cold","PMPI_Scan","PMPI_Scan.cold","PMPI_Scan_init","PMPI_Scan_init.cold","PMPI_Scatter","PMPI_Scatter.cold","PMPI_Scatter_init","PMPI_Scatter_init.cold","PMPI_Scatterv","PMPI_Scatterv.cold","PMPI_Scatterv_init","PMPI_Scatterv_init.cold","PMPI_Send","PMPI_Send.cold","PMPI_Send_init","PMPI_Send_init.cold","PMPI_Sendrecv","PMPI_Sendrecv.cold","PMPI_Sendrecv_replace","PMPI_Sendrecv_replace.cold","PMPI_Session_c2f","PMPI_Session_call_errhandler","PMPI_Session_call_errhandler.cold","PMPI_Session_create_errhandler","PMPI_Session_f2c","PMPI_Session_finalize","PMPI_Session_finalize.cold","PMPI_Session_get_errhandler","PMPI_Session_get_errhandler.cold","PMPI_Session_get_info","PMPI_Session_get_nth_pset","PMPI_Session_get_nth_pset.cold","PMPI_Session_get_num_psets","PMPI_Session_get_num_psets.cold","PMPI_Session_get_pset_info","PMPI_Session_get_pset_info.cold","PMPI_Session_init","PMPI_Session_init.cold","PMPI_Session_set_errhandler","PMPI_Session_set_info","PMPI_Ssend","PMPI_Ssend.cold","PMPI_Ssend_init","PMPI_Ssend_init.cold","PMPI_Start","PMPI_Start.cold","PMPI_Startall","PMPI_Status_c2f","PMPI_Status_c2f08","PMPI_Status_f082c","PMPI_Status_f082f","PMPI_Status_f2c","PMPI_Status_f2f08","PMPI_Status_set_cancelled","PMPI_Status_set_elements","PMPI_Status_set_elements_x","PMPI_T_category_changed","PMPI_T_category_get_categories","PMPI_T_category_get_cvars","PMPI_T_category_get_index","PMPI_T_category_get_info","PMPI_T_category_get_num","PMPI_T_category_get_pvars","PMPI_T_cvar_get_index","PMPI_T_cvar_get_info","PMPI_T_cvar_get_num","PMPI_T_cvar_handle_alloc","PMPI_T_cvar_handle_free","PMPI_T_cvar_read","PMPI_T_cvar_write","PMPI_T_enum_get_info","PMPI_T_enum_get_item","PMPI_T_finalize","PMPI_T_init_thread","PMPI_T_pvar_get_index","PMPI_T_pvar_get_info","PMPI_T_pvar_get_num","PMPI_T_pvar_handle_alloc","PMPI_T_pvar_handle_free","PMPI_T_pvar_read","PMPI_T_pvar_readreset","PMPI_T_pvar_reset","PMPI_T_pvar_session_create","PMPI_T_pvar_session_free","PMPI_T_pvar_start","PMPI_T_pvar_stop","PMPI_T_pvar_write","PMPI_Test","PMPI_Test_cancelled","PMPI_Testall","PMPI_Testany","PMPI_Testsome","PMPI_Topo_test","PMPI_Type_c2f","PMPI_Type_commit","PMPI_Type_commit.cold","PMPI_Type_contiguous","PMPI_Type_contiguous.cold","PMPI_Type_create_darray","PMPI_Type_create_darray.cold","PMPI_Type_create_f90_complex","PMPI_Type_create_f90_complex.cold","PMPI_Type_create_f90_integer","PMPI_Type_create_f90_integer.cold","PMPI_Type_create_f90_real","PMPI_Type_create_f90_real.cold","PMPI_Type_create_hindexed","PMPI_Type_create_hindexed.cold","PMPI_Type_create_hindexed_block","PMPI_Type_create_hindexed_block.cold","PMPI_Type_create_hvector","PMPI_Type_create_hvector.cold","PMPI_Type_create_indexed_block","PMPI_Type_create_indexed_block.cold","PMPI_Type_create_keyval","PMPI_Type_create_keyval.cold","PMPI_Type_create_resized","PMPI_Type_create_resized.cold","PMPI_Type_create_struct","PMPI_Type_create_struct.cold","PMPI_Type_create_subarray","PMPI_Type_create_subarray.cold","PMPI_Type_delete_attr","PMPI_Type_dup","PMPI_Type_dup.cold","PMPI_Type_extent","PMPI_Type_f2c","PMPI_Type_free","PMPI_Type_free_keyval","PMPI_Type_get_attr","PMPI_Type_get_contents","PMPI_Type_get_envelope","PMPI_Type_get_envelope.cold","PMPI_Type_get_extent","PMPI_Type_get_extent_x","PMPI_Type_get_name","PMPI_Type_get_true_extent","PMPI_Type_get_true_extent_x","PMPI_Type_hindexed","PMPI_Type_hvector","PMPI_Type_indexed","PMPI_Type_indexed.cold","PMPI_Type_lb","PMPI_Type_match_size","PMPI_Type_set_attr","PMPI_Type_set_name","PMPI_Type_size","PMPI_Type_size_x","PMPI_Type_struct","PMPI_Type_ub","PMPI_Type_vector","PMPI_Type_vector.cold","PMPI_Unpack","PMPI_Unpack.cold","PMPI_Unpack_external","PMPI_Unpack_external.cold","PMPI_Unpublish_name","PMPI_Unpublish_name.cold","PMPI_Wait","PMPI_Waitall","PMPI_Waitany","PMPI_Waitsome","PMPI_Win_allocate","PMPI_Win_allocate_shared","PMPI_Win_allocate_shared.cold","PMPI_Win_attach","PMPI_Win_attach.cold","PMPI_Win_c2f","PMPI_Win_call_errhandler","PMPI_Win_call_errhandler.cold","PMPI_Win_complete","PMPI_Win_complete.cold","PMPI_Win_create","PMPI_Win_create_dynamic","PMPI_Win_create_errhandler","PMPI_Win_create_keyval","PMPI_Win_delete_attr","PMPI_Win_detach","PMPI_Win_detach.cold","PMPI_Win_f2c","PMPI_Win_fence","PMPI_Win_fence.cold","PMPI_Win_flush","PMPI_Win_flush.cold","PMPI_Win_flush_all","PMPI_Win_flush_all.cold","PMPI_Win_flush_local","PMPI_Win_flush_local.cold","PMPI_Win_flush_local_all","PMPI_Win_flush_local_all.cold","PMPI_Win_free","PMPI_Win_free.cold","PMPI_Win_free_keyval","PMPI_Win_get_attr","PMPI_Win_get_errhandler","PMPI_Win_get_group","PMPI_Win_get_group.cold","PMPI_Win_get_info","PMPI_Win_get_info.cold","PMPI_Win_get_name","PMPI_Win_get_name.cold","PMPI_Win_lock","PMPI_Win_lock.cold","PMPI_Win_lock_all","PMPI_Win_lock_all.cold","PMPI_Win_post","PMPI_Win_post.cold","PMPI_Win_set_attr","PMPI_Win_set_errhandler","PMPI_Win_set_info","PMPI_Win_set_info.cold","PMPI_Win_set_name","PMPI_Win_set_name.cold","PMPI_Win_shared_query","PMPI_Win_shared_query.cold","PMPI_Win_start","PMPI_Win_start.cold","PMPI_Win_sync","PMPI_Win_sync.cold","PMPI_Win_test","PMPI_Win_test.cold","PMPI_Win_unlock","PMPI_Win_unlock.cold","PMPI_Win_unlock_all","PMPI_Win_unlock_all.cold","PMPI_Win_wait","PMPI_Win_wait.cold","PMPI_Wtick","PMPI_Wtime","PQ_adjustElementKey","PQ_adjustKey","PQ_decreaseElementKey","PQ_decreaseKey","PQ_delete","PQ_deleteElement","PQ_deleteMax","PQ_deleteMaxElement","PQ_exit","PQ_findMaxElement","PQ_findMaxKey","PQ_free","PQ_increaseElementKey","PQ_increaseKey","PQ_init","PQ_insert","PQ_insertElement","PQ_isEmpty","V_OUTPUT_ERR","__SENDER_BASED_METHOD_COPY","__do_global_dtors_aux","__muldc3","__mulsc3","__mulxc3","__ompi_datatype_allocate","__ompi_datatype_create_from_args","__ompi_datatype_create_from_packed_description.isra.0","__ompi_datatype_pack_description.isra.0","__ompi_datatype_release","_convert_process_name_to_string:0x84d30","_convert_process_name_to_string:0x88400","_convert_string_to_jobid","_convert_string_to_process_name:0x84b80","_convert_string_to_process_name:0x88410","_jobid_print_for_opal","_mca_topo_base_select.part.0","_process_name_compare:0x849c0","_process_name_compare:0x88420","_process_name_print_for_opal:0x84790","_process_name_print_for_opal:0x88450","_release_fn","_vpid_print_for_opal","adapt_close","adapt_constant_reduce_context_construct","adapt_constant_reduce_context_destruct","adapt_module_construct","adapt_module_destruct","adapt_module_enable","adapt_open","adapt_register","alloc_window","append_frag_to_list","attr_subsys_construct","attr_subsys_construct.cold","attr_subsys_destruct","attribute_key_value_construct","avail_coll_compare","avail_io_compare:0x179350","avail_io_compare:0x1799d0","avail_op_compare","avx_component_close","avx_component_init_query","avx_component_op_query","avx_component_open","avx_component_register","backend_abort_aggregate","backend_abort_no_aggregate","basic_register","block","bootstrap_comm","btl_bandwidth_compare","btl_exclusivity_compare","btl_latency_sort_fn","buffer_cleanup","build_level_topology","build_level_topology.cold","build_process_tab_id","check","check_file","check_one_component","close_component","coll_base_comm_construct","coll_base_comm_destruct","coll_base_module_construct","coll_base_module_destruct","comm_method_string","compFunc","compare_attr_sequence","compare_ints","compare_pmix_proc","compare_ranks:0x1da9b0","compare_ranks:0x1ea3b0","compare_uint16_ts","complete_objs_callback","complete_vecs_callback","component_finalize","component_init","component_open","component_query","component_register","component_select","compute_gain","config_window","construct_peers","cost_calc","create_comm","create_dumb_tree","create_threads","create_win","cset2mapstr.constprop.0","cset2str.constprop.0","datatype_duplicate.isra.0","dbl_cmp_inc","delete_group_list","delete_query","delete_select","depth_first","deregister_tm_clones","destruct_topology_cache","dfs","display_sol","distance","dpm_convert.constprop.0","dpm_convert.constprop.1","dynamic_gen2_register","dynamic_register","era_agreement_comm_specific_constructor","era_agreement_comm_specific_destructor","era_agreement_info_constructor","era_agreement_info_destructor","era_bounce_event_cb","era_cb_fn","era_cb_fn.cold","era_check_status","era_combine_agreement_values","era_combine_agreement_values.cold","era_create_agreement_info","era_create_agreement_info.cold","era_decide","era_error_event_cb","era_iagree_req_complete_cb","era_iagree_req_complete_cb.cold","era_iagree_req_free","era_mark_process_failed","era_merge_new_dead_list","era_next_child","era_on_comm_rank_failure","era_tree_fn_binary","era_tree_fn_star","era_tree_fn_string","era_tree_remove_node","era_update_return_value","era_value_constructor","era_value_destructor","evhandler_dereg_callbk","evhandler_reg_callbk:0x7c580","evhandler_reg_callbk:0x884c0","f1","f2","fast_group","fd_event_cb","fd_heartbeat_rdma_cb","fd_heartbeat_recv_cb","fd_heartbeat_request.isra.0","fd_heartbeat_request_cb","fd_heartbeat_send.isra.0","fd_progress","fence_cbfunc","fence_release:0x820f0","fence_release:0x884b0","file_constructor","file_destructor","file_query","file_unquery","fill_null_pointers","fragment_sent_cb","frame_dummy","free_constraint_tree","free_list_child","free_objs_callback","free_tab_child","free_vecs_callback","ftagree_close","ftagree_register","generate_random_sol.isra.0","generate_work_units.constprop.0","generate_work_units.part.0","get_algorithm","get_dynamic_rule","get_module","get_print_name_buffer","get_rsrc_exists","group_list_asc","group_list_dsc","group_list_id","han_close","han_module_enable","han_open","han_register","hash_asc","hb_itor_search","ibcast_request_fini.isra.0","icompar","individual_register:0x16eff0","individual_register:0x21a490","info_constructor","info_destructor","init_by_array","init_query:0x17b980","init_query:0x21f830","init_query:0x233dc0","inter_register","io_base_request_constructor","ireduce_request_fini.isra.0","kpartition_build_level_topology.isra.0","libnbc_close","libnbc_comm_query","libnbc_init_query","libnbc_module_construct","libnbc_module_destruct","libnbc_module_enable","libnbc_open","libnbc_register","list_all_possible_groups","list_all_possible_groups.cold","lockedfile_register","match_one","mca_bml_base_btl_array_construct","mca_bml_base_btl_array_destruct","mca_bml_base_btl_array_reserve","mca_bml_base_close","mca_bml_base_endpoint_construct","mca_bml_base_endpoint_destruct","mca_bml_base_init","mca_bml_base_inited","mca_bml_base_open","mca_bml_base_register","mca_bml_r2_add_btl","mca_bml_r2_add_btls","mca_bml_r2_add_proc","mca_bml_r2_add_procs","mca_bml_r2_allocate_endpoint","mca_bml_r2_component_close","mca_bml_r2_component_fini","mca_bml_r2_component_init","mca_bml_r2_component_open","mca_bml_r2_component_register","mca_bml_r2_compute_endpoint_metrics","mca_bml_r2_compute_endpoint_metrics.cold","mca_bml_r2_del_btl","mca_bml_r2_del_proc_btl","mca_bml_r2_del_procs","mca_bml_r2_del_procs.cold","mca_bml_r2_endpoint_add_btl","mca_bml_r2_finalize","mca_bml_r2_register","mca_bml_r2_register_error","mca_coll_base_alltoall_intra_basic_inplace","mca_coll_base_alltoallv_intra_basic_inplace","mca_coll_base_colltype_to_str","mca_coll_base_comm_select","mca_coll_base_comm_unselect","mca_coll_base_find_available","mca_coll_base_name_to_colltype","mca_coll_base_reduce_local","mca_coll_basic_allgather_inter","mca_coll_basic_allgatherv_inter","mca_coll_basic_allreduce_inter","mca_coll_basic_allreduce_intra","mca_coll_basic_alltoall_inter","mca_coll_basic_alltoallv_inter","mca_coll_basic_alltoallw_inter","mca_coll_basic_alltoallw_intra","mca_coll_basic_alltoallw_intra_inplace.constprop.0","mca_coll_basic_barrier_inter_lin","mca_coll_basic_barrier_intra_log","mca_coll_basic_bcast_lin_inter","mca_coll_basic_bcast_log_inter","mca_coll_basic_bcast_log_intra","mca_coll_basic_comm_query","mca_coll_basic_exscan_inter","mca_coll_basic_exscan_intra","mca_coll_basic_gather_inter","mca_coll_basic_gatherv_inter","mca_coll_basic_gatherv_intra","mca_coll_basic_init_query","mca_coll_basic_module_enable","mca_coll_basic_neighbor_allgather","mca_coll_basic_neighbor_allgatherv","mca_coll_basic_neighbor_alltoall","mca_coll_basic_neighbor_alltoallv","mca_coll_basic_neighbor_alltoallw","mca_coll_basic_reduce_lin_inter","mca_coll_basic_reduce_log_inter","mca_coll_basic_reduce_log_intra","mca_coll_basic_reduce_scatter_block_inter","mca_coll_basic_reduce_scatter_block_intra","mca_coll_basic_reduce_scatter_inter","mca_coll_basic_reduce_scatter_intra","mca_coll_basic_scan_intra","mca_coll_basic_scatter_inter","mca_coll_basic_scatterv_inter","mca_coll_basic_scatterv_intra","mca_coll_ftagree_comm_query","mca_coll_ftagree_construct","mca_coll_ftagree_era_comm_finalize","mca_coll_ftagree_era_comm_init","mca_coll_ftagree_era_finalize","mca_coll_ftagree_era_init","mca_coll_ftagree_era_inter","mca_coll_ftagree_era_intra","mca_coll_ftagree_eta_intra","mca_coll_ftagree_iera_intra","mca_coll_ftagree_iera_intra.cold","mca_coll_ftagree_init_query","mca_coll_ftagree_module_construct","mca_coll_ftagree_module_destruct","mca_coll_ftagree_module_enable","mca_coll_han_algorithm_id_is_valid","mca_coll_han_algorithm_id_to_fn","mca_coll_han_algorithm_id_to_name","mca_coll_han_algorithm_name_to_id","mca_coll_han_allgather_intra","mca_coll_han_allgather_intra_dynamic","mca_coll_han_allgather_intra_simple","mca_coll_han_allgather_lb_task","mca_coll_han_allgather_lg_task","mca_coll_han_allgather_uag_task","mca_coll_han_allgatherv_intra_dynamic","mca_coll_han_allreduce_intra","mca_coll_han_allreduce_intra_dynamic","mca_coll_han_allreduce_intra_simple","mca_coll_han_allreduce_reproducible","mca_coll_han_allreduce_reproducible_decision","mca_coll_han_allreduce_t0_task","mca_coll_han_allreduce_t1_task","mca_coll_han_allreduce_t2_task","mca_coll_han_allreduce_t3_task","mca_coll_han_barrier_intra_dynamic","mca_coll_han_barrier_intra_simple","mca_coll_han_bcast_intra","mca_coll_han_bcast_intra_dynamic","mca_coll_han_bcast_intra_simple","mca_coll_han_bcast_t0_task","mca_coll_han_bcast_t1_task","mca_coll_han_comm_create","mca_coll_han_comm_create_new","mca_coll_han_comm_query","mca_coll_han_component_name_to_id","mca_coll_han_dump_dynamic_rules","mca_coll_han_free_algorithms","mca_coll_han_free_dynamic_rules","mca_coll_han_gather_intra","mca_coll_han_gather_intra_dynamic","mca_coll_han_gather_intra_simple","mca_coll_han_gather_lg_task","mca_coll_han_gather_ug_task","mca_coll_han_get_all_coll_modules","mca_coll_han_init_algorithms","mca_coll_han_init_dynamic_rules","mca_coll_han_init_query","mca_coll_han_is_coll_dynamic_implemented","mca_coll_han_module_construct","mca_coll_han_module_destruct","mca_coll_han_module_disable","mca_coll_han_reduce_intra","mca_coll_han_reduce_intra_dynamic","mca_coll_han_reduce_intra_simple","mca_coll_han_reduce_reproducible","mca_coll_han_reduce_reproducible_decision","mca_coll_han_reduce_t0_task","mca_coll_han_reduce_t1_task","mca_coll_han_scatter_intra","mca_coll_han_scatter_intra_dynamic","mca_coll_han_scatter_intra_simple","mca_coll_han_scatter_ls_task","mca_coll_han_scatter_us_task","mca_coll_han_topo_init","mca_coll_han_topo_lvl_name_to_id","mca_coll_han_topo_lvl_to_str","mca_coll_inter_allgather_inter","mca_coll_inter_allgatherv_inter","mca_coll_inter_allreduce_inter","mca_coll_inter_bcast_inter","mca_coll_inter_comm_query","mca_coll_inter_gather_inter","mca_coll_inter_gatherv_inter","mca_coll_inter_init_query","mca_coll_inter_module_construct","mca_coll_inter_module_destruct","mca_coll_inter_module_enable","mca_coll_inter_reduce_inter","mca_coll_inter_scatter_inter","mca_coll_inter_scatterv_inter","mca_coll_monitoring_allgather","mca_coll_monitoring_allgatherv","mca_coll_monitoring_allreduce","mca_coll_monitoring_alltoall","mca_coll_monitoring_alltoallv","mca_coll_monitoring_alltoallw","mca_coll_monitoring_barrier","mca_coll_monitoring_bcast","mca_coll_monitoring_component_close","mca_coll_monitoring_component_init","mca_coll_monitoring_component_open","mca_coll_monitoring_component_query","mca_coll_monitoring_component_register","mca_coll_monitoring_exscan","mca_coll_monitoring_gather","mca_coll_monitoring_gatherv","mca_coll_monitoring_iallgather","mca_coll_monitoring_iallgatherv","mca_coll_monitoring_iallreduce","mca_coll_monitoring_ialltoall","mca_coll_monitoring_ialltoallv","mca_coll_monitoring_ialltoallw","mca_coll_monitoring_ibarrier","mca_coll_monitoring_ibcast","mca_coll_monitoring_iexscan","mca_coll_monitoring_igather","mca_coll_monitoring_igatherv","mca_coll_monitoring_ineighbor_allgather","mca_coll_monitoring_ineighbor_allgatherv","mca_coll_monitoring_ineighbor_alltoall","mca_coll_monitoring_ineighbor_alltoallv","mca_coll_monitoring_ineighbor_alltoallw","mca_coll_monitoring_ireduce","mca_coll_monitoring_ireduce_scatter","mca_coll_monitoring_ireduce_scatter_block","mca_coll_monitoring_iscan","mca_coll_monitoring_iscatter","mca_coll_monitoring_iscatterv","mca_coll_monitoring_module_disable","mca_coll_monitoring_module_enable","mca_coll_monitoring_neighbor_allgather","mca_coll_monitoring_neighbor_allgatherv","mca_coll_monitoring_neighbor_alltoall","mca_coll_monitoring_neighbor_alltoallv","mca_coll_monitoring_neighbor_alltoallw","mca_coll_monitoring_reduce","mca_coll_monitoring_reduce_scatter","mca_coll_monitoring_reduce_scatter_block","mca_coll_monitoring_scan","mca_coll_monitoring_scatter","mca_coll_monitoring_scatterv","mca_coll_self_allgather_intra","mca_coll_self_allgatherv_intra","mca_coll_self_allreduce_intra","mca_coll_self_alltoall_intra","mca_coll_self_alltoallv_intra","mca_coll_self_alltoallw_intra","mca_coll_self_barrier_intra","mca_coll_self_bcast_intra","mca_coll_self_comm_query","mca_coll_self_exscan_intra","mca_coll_self_gather_intra","mca_coll_self_gatherv_intra","mca_coll_self_init_query","mca_coll_self_module_enable","mca_coll_self_reduce_intra","mca_coll_self_reduce_scatter_intra","mca_coll_self_scan_intra","mca_coll_self_scatter_intra","mca_coll_self_scatterv_intra","mca_coll_sm_allreduce_intra","mca_coll_sm_barrier_intra","mca_coll_sm_bcast_intra","mca_coll_sm_comm_query","mca_coll_sm_init_query","mca_coll_sm_module_construct","mca_coll_sm_module_destruct","mca_coll_sm_module_disable","mca_coll_sm_reduce_intra","mca_coll_sync_bcast","mca_coll_sync_comm_query","mca_coll_sync_exscan","mca_coll_sync_gather","mca_coll_sync_gatherv","mca_coll_sync_init_query","mca_coll_sync_module_construct","mca_coll_sync_module_destruct","mca_coll_sync_module_enable","mca_coll_sync_reduce","mca_coll_sync_reduce_scatter","mca_coll_sync_scan","mca_coll_sync_scatter","mca_coll_sync_scatterv","mca_coll_task_constructor","mca_coll_task_destructor","mca_coll_tuned_module_construct","mca_comm_cid_context_alloc","mca_comm_cid_context_construct","mca_comm_cid_context_destruct","mca_common_monitoring_add_procs","mca_common_monitoring_coll_a2a","mca_common_monitoring_coll_a2o","mca_common_monitoring_coll_cache_name","mca_common_monitoring_coll_cond_release","mca_common_monitoring_coll_finalize","mca_common_monitoring_coll_flush","mca_common_monitoring_coll_flush_all","mca_common_monitoring_coll_get_a2a_count","mca_common_monitoring_coll_get_a2a_size","mca_common_monitoring_coll_get_a2o_count","mca_common_monitoring_coll_get_a2o_size","mca_common_monitoring_coll_get_o2a_count","mca_common_monitoring_coll_get_o2a_size","mca_common_monitoring_coll_messages_notify","mca_common_monitoring_coll_new","mca_common_monitoring_coll_o2a","mca_common_monitoring_coll_release","mca_common_monitoring_coll_reset","mca_common_monitoring_comm_size_notify","mca_common_monitoring_finalize","mca_common_monitoring_flush.part.0","mca_common_monitoring_get_coll_count","mca_common_monitoring_get_coll_size","mca_common_monitoring_get_flush","mca_common_monitoring_get_osc_recv_count","mca_common_monitoring_get_osc_recv_size","mca_common_monitoring_get_osc_sent_count","mca_common_monitoring_get_osc_sent_size","mca_common_monitoring_get_pml_count","mca_common_monitoring_get_pml_size","mca_common_monitoring_init","mca_common_monitoring_notify_flush","mca_common_monitoring_output","mca_common_monitoring_record_coll","mca_common_monitoring_record_osc","mca_common_monitoring_record_pml","mca_common_monitoring_register","mca_common_monitoring_set_flush","mca_common_ompio_alloc_buf","mca_common_ompio_base_file_read_all","mca_common_ompio_buffer_alloc_fini","mca_common_ompio_buffer_alloc_init","mca_common_ompio_buffer_alloc_seg","mca_common_ompio_buffer_free_seg","mca_common_ompio_build_io_array","mca_common_ompio_cart_based_grouping","mca_common_ompio_check_gpu_buf","mca_common_ompio_create_groups","mca_common_ompio_create_incomplete_file_handle","mca_common_ompio_decode_datatype","mca_common_ompio_empty_print_queue","mca_common_ompio_file_close","mca_common_ompio_file_delete","mca_common_ompio_file_get_position","mca_common_ompio_file_get_size","mca_common_ompio_file_iread","mca_common_ompio_file_iread_all","mca_common_ompio_file_iread_at","mca_common_ompio_file_iread_at_all","mca_common_ompio_file_iwrite","mca_common_ompio_file_iwrite_all","mca_common_ompio_file_iwrite_at","mca_common_ompio_file_iwrite_at_all","mca_common_ompio_file_open","mca_common_ompio_file_read","mca_common_ompio_file_read_all","mca_common_ompio_file_read_all.part.0","mca_common_ompio_file_read_at","mca_common_ompio_file_read_at_all","mca_common_ompio_file_read_pipelined","mca_common_ompio_file_write","mca_common_ompio_file_write_all","mca_common_ompio_file_write_all.part.0","mca_common_ompio_file_write_at","mca_common_ompio_file_write_at_all","mca_common_ompio_file_write_pipelined","mca_common_ompio_finalize_initial_grouping","mca_common_ompio_finalize_split","mca_common_ompio_forced_grouping","mca_common_ompio_full_print_queue","mca_common_ompio_fview_based_grouping","mca_common_ompio_initialize_print_queue","mca_common_ompio_merge_groups","mca_common_ompio_merge_initial_groups","mca_common_ompio_prepare_to_group","mca_common_ompio_print_time_info","mca_common_ompio_progress","mca_common_ompio_register_print_entry","mca_common_ompio_register_progress","mca_common_ompio_release_buf","mca_common_ompio_request_alloc","mca_common_ompio_request_cancel","mca_common_ompio_request_construct","mca_common_ompio_request_destruct","mca_common_ompio_request_fini","mca_common_ompio_request_free","mca_common_ompio_request_init","mca_common_ompio_retain_initial_groups","mca_common_ompio_set_aggregator_props","mca_common_ompio_set_callbacks","mca_common_ompio_set_explicit_offset","mca_common_ompio_set_file_defaults","mca_common_ompio_set_view","mca_common_ompio_simple_grouping","mca_common_ompio_split_a_group","mca_common_ompio_split_initial_groups","mca_common_ompio_unregister_print_entry","mca_fbtl_base_check_atomicity","mca_fbtl_base_file_select","mca_fbtl_base_file_unselect","mca_fbtl_base_find_available","mca_fbtl_posix_check_atomicity","mca_fbtl_posix_component_file_query","mca_fbtl_posix_component_file_unquery","mca_fbtl_posix_component_init_query","mca_fbtl_posix_ipreadv","mca_fbtl_posix_ipwritev","mca_fbtl_posix_lock","mca_fbtl_posix_module_finalize","mca_fbtl_posix_module_init","mca_fbtl_posix_preadv","mca_fbtl_posix_progress","mca_fbtl_posix_pwritev","mca_fbtl_posix_request_free","mca_fbtl_posix_unlock","mca_fcoll_base_component_lookup","mca_fcoll_base_file_select","mca_fcoll_base_file_unselect","mca_fcoll_base_find_available","mca_fcoll_base_query_table","mca_fcoll_dynamic_component_file_query","mca_fcoll_dynamic_component_file_unquery","mca_fcoll_dynamic_component_init_query","mca_fcoll_dynamic_file_read_all","mca_fcoll_dynamic_file_write_all","mca_fcoll_dynamic_gen2_break_file_view","mca_fcoll_dynamic_gen2_component_file_query","mca_fcoll_dynamic_gen2_component_file_unquery","mca_fcoll_dynamic_gen2_component_init_query","mca_fcoll_dynamic_gen2_file_read_all","mca_fcoll_dynamic_gen2_file_write_all","mca_fcoll_dynamic_gen2_get_configuration","mca_fcoll_dynamic_gen2_module_finalize","mca_fcoll_dynamic_gen2_module_init","mca_fcoll_dynamic_gen2_split_iov_array","mca_fcoll_dynamic_module_finalize","mca_fcoll_dynamic_module_init","mca_fcoll_individual_component_file_query","mca_fcoll_individual_component_file_unquery","mca_fcoll_individual_component_init_query","mca_fcoll_individual_file_read_all","mca_fcoll_individual_file_write_all","mca_fcoll_individual_module_finalize","mca_fcoll_individual_module_init","mca_fcoll_vulcan_break_file_view","mca_fcoll_vulcan_component_file_query","mca_fcoll_vulcan_component_file_unquery","mca_fcoll_vulcan_component_init_query","mca_fcoll_vulcan_file_read_all","mca_fcoll_vulcan_file_write_all","mca_fcoll_vulcan_get_configuration","mca_fcoll_vulcan_module_finalize","mca_fcoll_vulcan_module_init","mca_fcoll_vulcan_split_iov_array","mca_fs_base_file_close","mca_fs_base_file_delete","mca_fs_base_file_get_size","mca_fs_base_file_select","mca_fs_base_file_set_size","mca_fs_base_file_sync","mca_fs_base_file_unselect","mca_fs_base_find_available","mca_fs_base_get_file_amode","mca_fs_base_get_file_perm","mca_fs_base_get_fstype","mca_fs_base_get_mpi_err","mca_fs_base_get_parent_dir","mca_fs_base_get_real_filename.constprop.0","mca_fs_ufs_component_file_query","mca_fs_ufs_component_file_unquery","mca_fs_ufs_component_init_query","mca_fs_ufs_file_open","mca_fs_ufs_module_finalize","mca_fs_ufs_module_init","mca_io_base_delete","mca_io_base_delete.cold","mca_io_base_file_select","mca_io_base_file_select.cold","mca_io_base_file_select.localalias","mca_io_base_find_available","mca_io_base_open","mca_io_base_register_datarep","mca_io_ompio_file_close","mca_io_ompio_file_get_amode","mca_io_ompio_file_get_atomicity","mca_io_ompio_file_get_byte_offset","mca_io_ompio_file_get_position","mca_io_ompio_file_get_position_shared","mca_io_ompio_file_get_size","mca_io_ompio_file_get_type_extent","mca_io_ompio_file_get_view","mca_io_ompio_file_iread","mca_io_ompio_file_iread_all","mca_io_ompio_file_iread_at","mca_io_ompio_file_iread_at_all","mca_io_ompio_file_iread_shared","mca_io_ompio_file_iwrite","mca_io_ompio_file_iwrite_all","mca_io_ompio_file_iwrite_at","mca_io_ompio_file_iwrite_at_all","mca_io_ompio_file_iwrite_shared","mca_io_ompio_file_open","mca_io_ompio_file_preallocate","mca_io_ompio_file_read","mca_io_ompio_file_read_all","mca_io_ompio_file_read_all_begin","mca_io_ompio_file_read_all_end","mca_io_ompio_file_read_at","mca_io_ompio_file_read_at_all","mca_io_ompio_file_read_at_all_begin","mca_io_ompio_file_read_at_all_end","mca_io_ompio_file_read_ordered","mca_io_ompio_file_read_ordered_begin","mca_io_ompio_file_read_ordered_end","mca_io_ompio_file_read_shared","mca_io_ompio_file_seek","mca_io_ompio_file_seek_shared","mca_io_ompio_file_set_atomicity","mca_io_ompio_file_set_size","mca_io_ompio_file_set_view","mca_io_ompio_file_sync","mca_io_ompio_file_write","mca_io_ompio_file_write_all","mca_io_ompio_file_write_all_begin","mca_io_ompio_file_write_all_end","mca_io_ompio_file_write_at","mca_io_ompio_file_write_at_all","mca_io_ompio_file_write_at_all_begin","mca_io_ompio_file_write_at_all_end","mca_io_ompio_file_write_ordered","mca_io_ompio_file_write_ordered_begin","mca_io_ompio_file_write_ordered_end","mca_io_ompio_file_write_shared","mca_io_ompio_get_mca_parameter_value","mca_monitoring_coll_construct","mca_monitoring_coll_destruct","mca_osc_monitoring_component_finish","mca_osc_monitoring_component_init","mca_osc_monitoring_component_query","mca_osc_monitoring_component_register","mca_osc_monitoring_component_select","mca_part_base_close","mca_part_base_finalize","mca_part_base_open","mca_part_base_precv_request_construct","mca_part_base_prequest_construct","mca_part_base_progress","mca_part_base_psend_request_construct","mca_part_base_register","mca_part_base_select","mca_part_base_select.cold","mca_part_persist_component_close","mca_part_persist_component_fini","mca_part_persist_component_init","mca_part_persist_component_open","mca_part_persist_component_register","mca_part_persist_free:0x1ee0d0","mca_part_persist_free:0x1ee3e0","mca_part_persist_parrived","mca_part_persist_pready","mca_part_persist_precv_init","mca_part_persist_precv_request_construct","mca_part_persist_progress","mca_part_persist_psend_init","mca_part_persist_psend_request_construct","mca_part_persist_request_construct","mca_part_persist_request_destruct","mca_part_persist_start:0x1ed610","mca_part_persist_start:0x1edf30","mca_part_persist_start:0x1ee240","mca_pml_base_bsend_attach","mca_pml_base_bsend_detach","mca_pml_base_bsend_fini","mca_pml_base_bsend_init","mca_pml_base_bsend_request_alloc","mca_pml_base_bsend_request_alloc_buf","mca_pml_base_bsend_request_fini","mca_pml_base_bsend_request_free","mca_pml_base_bsend_request_start","mca_pml_base_close","mca_pml_base_finalize","mca_pml_base_open","mca_pml_base_pml_check_selected","mca_pml_base_pml_check_selected_impl","mca_pml_base_pml_selected","mca_pml_base_progress","mca_pml_base_recv_request_construct","mca_pml_base_recv_request_destruct","mca_pml_base_register","mca_pml_base_request_construct","mca_pml_base_revoke_comm","mca_pml_base_select","mca_pml_base_select.cold","mca_pml_base_send_request_construct","mca_pml_base_send_request_destruct","mca_pml_bsend_alloc_segment","mca_pml_cm_add_comm","mca_pml_cm_add_procs","mca_pml_cm_cancel","mca_pml_cm_component_close","mca_pml_cm_component_fini","mca_pml_cm_component_init","mca_pml_cm_component_open","mca_pml_cm_component_register","mca_pml_cm_del_comm","mca_pml_cm_del_procs","mca_pml_cm_dump","mca_pml_cm_enable","mca_pml_cm_improbe","mca_pml_cm_imrecv","mca_pml_cm_iprobe","mca_pml_cm_irecv","mca_pml_cm_irecv_init","mca_pml_cm_isend","mca_pml_cm_isend_init","mca_pml_cm_mprobe","mca_pml_cm_mrecv","mca_pml_cm_probe","mca_pml_cm_recv","mca_pml_cm_recv_fast_completion","mca_pml_cm_recv_request_completion","mca_pml_cm_recv_request_construct","mca_pml_cm_recv_request_free","mca_pml_cm_request_construct","mca_pml_cm_request_destruct","mca_pml_cm_send","mca_pml_cm_send_request_completion","mca_pml_cm_send_request_construct","mca_pml_cm_send_request_free","mca_pml_cm_start","mca_pml_monitoring_add_comm","mca_pml_monitoring_add_procs","mca_pml_monitoring_component_finish","mca_pml_monitoring_component_init","mca_pml_monitoring_component_open","mca_pml_monitoring_del_comm","mca_pml_monitoring_del_procs","mca_pml_monitoring_dump","mca_pml_monitoring_enable","mca_pml_monitoring_improbe","mca_pml_monitoring_imrecv","mca_pml_monitoring_iprobe","mca_pml_monitoring_irecv","mca_pml_monitoring_irecv_init","mca_pml_monitoring_isend","mca_pml_monitoring_isend_init","mca_pml_monitoring_mprobe","mca_pml_monitoring_mrecv","mca_pml_monitoring_probe","mca_pml_monitoring_recv","mca_pml_monitoring_revoke_comm","mca_pml_monitoring_send","mca_pml_monitoring_start","mca_pml_ob1_accelerator_add_ipc_support","mca_pml_ob1_accelerator_fini","mca_pml_ob1_accelerator_init","mca_pml_ob1_accelerator_need_buffers","mca_pml_ob1_add_comm","mca_pml_ob1_add_procs","mca_pml_ob1_com_btl_comp","mca_pml_ob1_comm_construct","mca_pml_ob1_comm_destruct","mca_pml_ob1_comm_init_size","mca_pml_ob1_comm_proc_construct","mca_pml_ob1_comm_proc_destruct","mca_pml_ob1_comm_size_notify","mca_pml_ob1_component_close","mca_pml_ob1_component_fini","mca_pml_ob1_component_init","mca_pml_ob1_component_open","mca_pml_ob1_component_register","mca_pml_ob1_control_completion","mca_pml_ob1_copy_frag_completion","mca_pml_ob1_del_comm","mca_pml_ob1_del_procs","mca_pml_ob1_dump","mca_pml_ob1_dump_cant_match","mca_pml_ob1_dump_frag_list","mca_pml_ob1_dump_hdr","mca_pml_ob1_enable","mca_pml_ob1_enable_progress","mca_pml_ob1_error_handler","mca_pml_ob1_frag_completion","mca_pml_ob1_get_dtoh_stream","mca_pml_ob1_get_htod_stream","mca_pml_ob1_get_posted_recvq_size","mca_pml_ob1_get_unex_msgq_size","mca_pml_ob1_handle_cid","mca_pml_ob1_improbe","mca_pml_ob1_imrecv","mca_pml_ob1_imrecv.cold","mca_pml_ob1_iprobe","mca_pml_ob1_irecv","mca_pml_ob1_irecv_init","mca_pml_ob1_isend","mca_pml_ob1_isend_init","mca_pml_ob1_match_completion_free","mca_pml_ob1_merge_cant_match","mca_pml_ob1_mprobe","mca_pml_ob1_mrecv","mca_pml_ob1_mrecv.cold","mca_pml_ob1_peer_create","mca_pml_ob1_probe","mca_pml_ob1_process_pending_packets","mca_pml_ob1_process_pending_rdma","mca_pml_ob1_progress","mca_pml_ob1_progress_one_htod_event","mca_pml_ob1_put_completion:0x2057a0","mca_pml_ob1_put_completion:0x20bf00","mca_pml_ob1_rdma_btls","mca_pml_ob1_rdma_btls.cold","mca_pml_ob1_rdma_cuda_btls","mca_pml_ob1_rdma_cuda_btls.cold","mca_pml_ob1_rdma_frag_constructor","mca_pml_ob1_rdma_pipeline_btls","mca_pml_ob1_rdma_pipeline_btls.cold","mca_pml_ob1_rdma_pipeline_btls_count","mca_pml_ob1_rdma_pipeline_btls_count.cold","mca_pml_ob1_record_htod_event","mca_pml_ob1_recv","mca_pml_ob1_recv_ctl_completion","mca_pml_ob1_recv_frag_callback_ack","mca_pml_ob1_recv_frag_callback_cid","mca_pml_ob1_recv_frag_callback_fin","mca_pml_ob1_recv_frag_callback_frag","mca_pml_ob1_recv_frag_callback_match","mca_pml_ob1_recv_frag_callback_put","mca_pml_ob1_recv_frag_callback_rget","mca_pml_ob1_recv_frag_callback_rndv","mca_pml_ob1_recv_frag_match.isra.0","mca_pml_ob1_recv_frag_match_proc.isra.0","mca_pml_ob1_recv_req_start","mca_pml_ob1_recv_request_ack.isra.0","mca_pml_ob1_recv_request_ack_send_btl","mca_pml_ob1_recv_request_cancel","mca_pml_ob1_recv_request_construct","mca_pml_ob1_recv_request_destruct","mca_pml_ob1_recv_request_frag_copy_finished","mca_pml_ob1_recv_request_frag_copy_start","mca_pml_ob1_recv_request_free","mca_pml_ob1_recv_request_get_frag","mca_pml_ob1_recv_request_get_frag_failed","mca_pml_ob1_recv_request_matched_probe","mca_pml_ob1_recv_request_process_pending","mca_pml_ob1_recv_request_progress_frag","mca_pml_ob1_recv_request_progress_match","mca_pml_ob1_recv_request_progress_rget","mca_pml_ob1_recv_request_progress_rget.cold","mca_pml_ob1_recv_request_progress_rndv","mca_pml_ob1_recv_request_put_frag","mca_pml_ob1_recv_request_schedule_once","mca_pml_ob1_revoke_comm","mca_pml_ob1_revoke_comm.localalias","mca_pml_ob1_rget_completion:0x204ec0","mca_pml_ob1_rget_completion:0x209c10","mca_pml_ob1_rndv_completion","mca_pml_ob1_seg_alloc","mca_pml_ob1_seg_free","mca_pml_ob1_send","mca_pml_ob1_send_cid","mca_pml_ob1_send_control_any","mca_pml_ob1_send_control_btl","mca_pml_ob1_send_ctl_completion","mca_pml_ob1_send_fin","mca_pml_ob1_send_inline.constprop.0","mca_pml_ob1_send_request_cancel","mca_pml_ob1_send_request_construct","mca_pml_ob1_send_request_copy_in_out","mca_pml_ob1_send_request_destruct","mca_pml_ob1_send_request_free","mca_pml_ob1_send_request_process_pending","mca_pml_ob1_send_request_put","mca_pml_ob1_send_request_put_frag","mca_pml_ob1_send_request_put_frag_failed","mca_pml_ob1_send_request_schedule_once","mca_pml_ob1_send_request_start_accelerator","mca_pml_ob1_send_request_start_buffered","mca_pml_ob1_send_request_start_copy","mca_pml_ob1_send_request_start_prepare","mca_pml_ob1_send_request_start_rdma","mca_pml_ob1_send_request_start_rndv","mca_pml_ob1_send_request_start_seq.constprop.0","mca_pml_ob1_set_allow_overtake","mca_pml_ob1_start","mca_pml_v_component_close","mca_pml_v_component_finalize","mca_pml_v_component_init","mca_pml_v_component_open","mca_pml_v_component_parasite_close","mca_pml_v_component_parasite_finalize","mca_pml_v_component_register","mca_pml_v_enable","mca_sharedfp_base_close","mca_sharedfp_base_file_select","mca_sharedfp_base_file_unselect","mca_sharedfp_base_find_available","mca_sharedfp_base_open","mca_sharedfp_individual_assign_globaloffset","mca_sharedfp_individual_collaborate_data","mca_sharedfp_individual_component_file_query","mca_sharedfp_individual_component_file_unquery","mca_sharedfp_individual_component_init_query","mca_sharedfp_individual_create_buff","mca_sharedfp_individual_file_close","mca_sharedfp_individual_file_open","mca_sharedfp_individual_get_position","mca_sharedfp_individual_get_timestamps_and_reclengths","mca_sharedfp_individual_getoffset","mca_sharedfp_individual_gettime","mca_sharedfp_individual_insert_headnode","mca_sharedfp_individual_insert_metadata","mca_sharedfp_individual_iread","mca_sharedfp_individual_iwrite","mca_sharedfp_individual_module_finalize","mca_sharedfp_individual_module_init","mca_sharedfp_individual_read","mca_sharedfp_individual_read_ordered","mca_sharedfp_individual_read_ordered_begin","mca_sharedfp_individual_read_ordered_end","mca_sharedfp_individual_seek","mca_sharedfp_individual_sort_timestamps","mca_sharedfp_individual_write","mca_sharedfp_individual_write_metadata_file","mca_sharedfp_individual_write_ordered","mca_sharedfp_individual_write_ordered_begin","mca_sharedfp_individual_write_ordered_end","mca_sharedfp_lockedfile_component_file_query","mca_sharedfp_lockedfile_component_file_unquery","mca_sharedfp_lockedfile_component_init_query","mca_sharedfp_lockedfile_file_close","mca_sharedfp_lockedfile_file_open","mca_sharedfp_lockedfile_get_position","mca_sharedfp_lockedfile_iread","mca_sharedfp_lockedfile_iwrite","mca_sharedfp_lockedfile_module_finalize","mca_sharedfp_lockedfile_module_init","mca_sharedfp_lockedfile_read","mca_sharedfp_lockedfile_read_ordered","mca_sharedfp_lockedfile_read_ordered.cold","mca_sharedfp_lockedfile_read_ordered_begin","mca_sharedfp_lockedfile_read_ordered_begin.cold","mca_sharedfp_lockedfile_read_ordered_end","mca_sharedfp_lockedfile_request_position","mca_sharedfp_lockedfile_seek","mca_sharedfp_lockedfile_write","mca_sharedfp_lockedfile_write_ordered","mca_sharedfp_lockedfile_write_ordered.cold","mca_sharedfp_lockedfile_write_ordered_begin","mca_sharedfp_lockedfile_write_ordered_begin.cold","mca_sharedfp_lockedfile_write_ordered_end","mca_sharedfp_sm_component_file_query","mca_sharedfp_sm_component_file_unquery","mca_sharedfp_sm_component_init_query","mca_sharedfp_sm_file_close","mca_sharedfp_sm_file_open","mca_sharedfp_sm_get_position","mca_sharedfp_sm_iread","mca_sharedfp_sm_iwrite","mca_sharedfp_sm_module_finalize","mca_sharedfp_sm_module_init","mca_sharedfp_sm_read","mca_sharedfp_sm_read_ordered","mca_sharedfp_sm_read_ordered.cold","mca_sharedfp_sm_read_ordered_begin","mca_sharedfp_sm_read_ordered_begin.cold","mca_sharedfp_sm_read_ordered_end","mca_sharedfp_sm_request_position","mca_sharedfp_sm_seek","mca_sharedfp_sm_write","mca_sharedfp_sm_write_ordered","mca_sharedfp_sm_write_ordered.cold","mca_sharedfp_sm_write_ordered_begin","mca_sharedfp_sm_write_ordered_begin.cold","mca_sharedfp_sm_write_ordered_end","mca_topo_base_cart_coords","mca_topo_base_cart_create","mca_topo_base_cart_get","mca_topo_base_cart_map","mca_topo_base_cart_rank","mca_topo_base_cart_shift","mca_topo_base_cart_sub","mca_topo_base_cartdim_get","mca_topo_base_close","mca_topo_base_comm_cart_2_2_0_construct","mca_topo_base_comm_cart_2_2_0_destruct","mca_topo_base_comm_dist_graph_2_2_0_construct","mca_topo_base_comm_dist_graph_2_2_0_destruct","mca_topo_base_comm_graph_2_2_0_construct","mca_topo_base_comm_graph_2_2_0_destruct","mca_topo_base_comm_select","mca_topo_base_dist_graph_create","mca_topo_base_dist_graph_create_adjacent","mca_topo_base_dist_graph_distribute","mca_topo_base_dist_graph_neighbors","mca_topo_base_dist_graph_neighbors_count","mca_topo_base_find_available","mca_topo_base_graph_create","mca_topo_base_graph_get","mca_topo_base_graph_map","mca_topo_base_graph_neighbors","mca_topo_base_graph_neighbors_count","mca_topo_base_graphdims_get","mca_topo_base_group_select","mca_topo_base_lazy_init","mca_topo_base_module_construct","mca_topo_base_module_destruct","mca_topo_base_neighbor_count","mca_topo_base_open","mca_topo_basic_query","mca_topo_treematch_component_register","mca_topo_treematch_dist_graph_create","mca_topo_treematch_dist_graph_create.cold","mca_topo_treematch_query","mca_vprotocol_base_close","mca_vprotocol_base_open","mca_vprotocol_base_parasite","mca_vprotocol_base_request_parasite","mca_vprotocol_base_select","mca_vprotocol_base_set_include_list","mca_vprotocol_pessimist_add_comm","mca_vprotocol_pessimist_add_procs","mca_vprotocol_pessimist_component_close","mca_vprotocol_pessimist_component_finalize","mca_vprotocol_pessimist_component_init","mca_vprotocol_pessimist_component_open","mca_vprotocol_pessimist_component_register","mca_vprotocol_pessimist_del_comm","mca_vprotocol_pessimist_del_procs","mca_vprotocol_pessimist_dump","mca_vprotocol_pessimist_enable","mca_vprotocol_pessimist_iprobe","mca_vprotocol_pessimist_irecv","mca_vprotocol_pessimist_isend","mca_vprotocol_pessimist_isend.cold","mca_vprotocol_pessimist_probe","mca_vprotocol_pessimist_recv","mca_vprotocol_pessimist_request_free","mca_vprotocol_pessimist_send","mca_vprotocol_pessimist_send.cold","mca_vprotocol_pessimist_start","mca_vprotocol_pessimist_test","mca_vprotocol_pessimist_test_all","mca_vprotocol_pessimist_test_any","mca_vprotocol_pessimist_test_some","mca_vprotocol_pessimist_wait_any","mca_vprotocol_pessimist_wait_some","model_callback","module_constructor","module_constructor_1_0_0","mpi_aint_add_f90","mpi_aint_add_f90_","mpi_aint_add_f90__","mpi_aint_diff_f90","mpi_aint_diff_f90_","mpi_aint_diff_f90__","mpi_comm_dup_fn","mpi_comm_dup_fn_","mpi_comm_dup_fn__","mpi_comm_null_copy_fn","mpi_comm_null_copy_fn_","mpi_comm_null_copy_fn__","mpi_comm_null_delete_fn","mpi_comm_null_delete_fn_","mpi_comm_null_delete_fn__","mpi_conversion_fn_null","mpi_conversion_fn_null_","mpi_conversion_fn_null__","mpi_conversion_fn_null_f","mpi_dup_fn","mpi_dup_fn_","mpi_dup_fn__","mpi_null_copy_fn","mpi_null_copy_fn_","mpi_null_copy_fn__","mpi_null_delete_fn","mpi_null_delete_fn_","mpi_null_delete_fn__","mpi_type_dup_fn","mpi_type_dup_fn_","mpi_type_dup_fn__","mpi_type_null_copy_fn","mpi_type_null_copy_fn_","mpi_type_null_copy_fn__","mpi_type_null_delete_fn","mpi_type_null_delete_fn_","mpi_type_null_delete_fn__","mpi_win_dup_fn","mpi_win_dup_fn_","mpi_win_dup_fn__","mpi_win_null_copy_fn","mpi_win_null_copy_fn_","mpi_win_null_copy_fn__","mpi_win_null_delete_fn","mpi_win_null_delete_fn_","mpi_win_null_delete_fn__","mpi_wtick_f90","mpi_wtick_f90_","mpi_wtick_f90__","mpi_wtime_f90","mpi_wtime_f90_","mpi_wtime_f90__","msg_down","msg_down.cold","msg_up","mycompar","myfn","nb_leaves","nb_lines","nbc_allgather_init","nbc_allgather_inter_init","nbc_allgatherv_init","nbc_allgatherv_inter_init","nbc_allreduce_init","nbc_allreduce_init.cold","nbc_allreduce_inter_init","nbc_alltoall_init","nbc_alltoall_inter_init","nbc_alltoallv_init","nbc_alltoallv_inter_init","nbc_alltoallw_init","nbc_alltoallw_inter_init","nbc_barrier_init","nbc_barrier_inter_init","nbc_bcast_init","nbc_bcast_inter_init","nbc_exscan_init","nbc_gather_init","nbc_gather_inter_init","nbc_gatherv_init","nbc_gatherv_inter_init","nbc_neighbor_allgather_init","nbc_neighbor_allgatherv_init","nbc_neighbor_alltoall_init","nbc_neighbor_alltoallv_init","nbc_neighbor_alltoallw_init","nbc_reduce_init","nbc_reduce_inter_init","nbc_reduce_scatter_block_init","nbc_reduce_scatter_block_inter_init","nbc_reduce_scatter_init","nbc_reduce_scatter_inter_init","nbc_req_constructor","nbc_scan_init","nbc_scatter_init","nbc_scatter_inter_init","nbc_scatterv_init","nbc_scatterv_inter_init","nbc_schedule_constructor","nbc_schedule_destructor","next_bucket_elem","node_height","node_mheight","node_pathlen","ompi_attr_copy_all","ompi_attr_create_keyval","ompi_attr_create_keyval_aint","ompi_attr_create_keyval_fint","ompi_attr_create_keyval_impl","ompi_attr_create_predefined_keyvals","ompi_attr_delete","ompi_attr_delete_all","ompi_attr_delete_impl","ompi_attr_delete_predefined_keyvals_for_wm","ompi_attr_free_keyval","ompi_attr_free_predefined","ompi_attr_get_aint","ompi_attr_get_aint.cold","ompi_attr_get_c","ompi_attr_get_c.cold","ompi_attr_get_fint","ompi_attr_get_fint.cold","ompi_attr_get_ref","ompi_attr_put_ref","ompi_attr_set_aint","ompi_attr_set_c","ompi_attr_set_fint","ompi_attr_set_int","ompi_attr_set_predefined_keyvals_for_wm","ompi_attribute_keyval_construct","ompi_attribute_keyval_destruct","ompi_coll_adapt_bcast","ompi_coll_adapt_comm_query","ompi_coll_adapt_ibcast","ompi_coll_adapt_ibcast_fini","ompi_coll_adapt_ibcast_register","ompi_coll_adapt_init_query","ompi_coll_adapt_ireduce","ompi_coll_adapt_ireduce_fini","ompi_coll_adapt_ireduce_register","ompi_coll_adapt_module_cached_topology","ompi_coll_adapt_reduce","ompi_coll_adapt_request_free","ompi_coll_base_agree_noft","ompi_coll_base_allgather_intra_basic_linear","ompi_coll_base_allgather_intra_bruck","ompi_coll_base_allgather_intra_neighborexchange","ompi_coll_base_allgather_intra_recursivedoubling","ompi_coll_base_allgather_intra_ring","ompi_coll_base_allgather_intra_sparbit","ompi_coll_base_allgather_intra_two_procs","ompi_coll_base_allgatherv_intra_basic_default","ompi_coll_base_allgatherv_intra_bruck","ompi_coll_base_allgatherv_intra_neighborexchange","ompi_coll_base_allgatherv_intra_ring","ompi_coll_base_allgatherv_intra_sparbit","ompi_coll_base_allgatherv_intra_two_procs","ompi_coll_base_allreduce_intra_basic_linear","ompi_coll_base_allreduce_intra_nonoverlapping","ompi_coll_base_allreduce_intra_recursivedoubling","ompi_coll_base_allreduce_intra_redscat_allgather","ompi_coll_base_allreduce_intra_ring","ompi_coll_base_allreduce_intra_ring_segmented","ompi_coll_base_alltoall_intra_basic_linear","ompi_coll_base_alltoall_intra_bruck","ompi_coll_base_alltoall_intra_linear_sync","ompi_coll_base_alltoall_intra_pairwise","ompi_coll_base_alltoall_intra_two_procs","ompi_coll_base_alltoallv_intra_basic_linear","ompi_coll_base_alltoallv_intra_pairwise","ompi_coll_base_barrier_intra_basic_linear","ompi_coll_base_barrier_intra_bruck","ompi_coll_base_barrier_intra_doublering","ompi_coll_base_barrier_intra_recursivedoubling","ompi_coll_base_barrier_intra_tree","ompi_coll_base_barrier_intra_two_procs","ompi_coll_base_bcast_intra_basic_linear","ompi_coll_base_bcast_intra_binomial","ompi_coll_base_bcast_intra_bintree","ompi_coll_base_bcast_intra_chain","ompi_coll_base_bcast_intra_generic","ompi_coll_base_bcast_intra_knomial","ompi_coll_base_bcast_intra_pipeline","ompi_coll_base_bcast_intra_scatter_allgather","ompi_coll_base_bcast_intra_scatter_allgather_ring","ompi_coll_base_bcast_intra_split_bintree","ompi_coll_base_comm_get_reqs","ompi_coll_base_exscan_intra_linear","ompi_coll_base_exscan_intra_recursivedoubling","ompi_coll_base_file_getnext_long","ompi_coll_base_file_getnext_size_t","ompi_coll_base_file_getnext_string","ompi_coll_base_file_peek_next_char_is","ompi_coll_base_file_peek_next_char_isdigit","ompi_coll_base_gather_intra_basic_linear","ompi_coll_base_gather_intra_binomial","ompi_coll_base_gather_intra_linear_sync","ompi_coll_base_iagree_noft","ompi_coll_base_reduce_generic","ompi_coll_base_reduce_intra_basic_linear","ompi_coll_base_reduce_intra_binary","ompi_coll_base_reduce_intra_binomial","ompi_coll_base_reduce_intra_chain","ompi_coll_base_reduce_intra_in_order_binary","ompi_coll_base_reduce_intra_pipeline","ompi_coll_base_reduce_intra_redscat_gather","ompi_coll_base_reduce_scatter_block_basic_linear","ompi_coll_base_reduce_scatter_block_intra_butterfly","ompi_coll_base_reduce_scatter_block_intra_recursivedoubling","ompi_coll_base_reduce_scatter_block_intra_recursivehalving","ompi_coll_base_reduce_scatter_intra_basic_recursivehalving","ompi_coll_base_reduce_scatter_intra_butterfly","ompi_coll_base_reduce_scatter_intra_nonoverlapping","ompi_coll_base_reduce_scatter_intra_ring","ompi_coll_base_retain_datatypes","ompi_coll_base_retain_datatypes_w","ompi_coll_base_retain_op","ompi_coll_base_scan_intra_linear","ompi_coll_base_scan_intra_recursivedoubling","ompi_coll_base_scatter_intra_basic_linear","ompi_coll_base_scatter_intra_binomial","ompi_coll_base_scatter_intra_linear_nb","ompi_coll_base_sendrecv_actual","ompi_coll_base_topo_build_bmtree","ompi_coll_base_topo_build_chain","ompi_coll_base_topo_build_in_order_bintree","ompi_coll_base_topo_build_in_order_bmtree","ompi_coll_base_topo_build_kmtree","ompi_coll_base_topo_build_tree","ompi_coll_base_topo_destroy_tree","ompi_coll_base_topo_dump_tree","ompi_coll_han_reorder_gather","ompi_coll_han_request_free","ompi_coll_libnbc_allgather_init","ompi_coll_libnbc_allgather_inter_init","ompi_coll_libnbc_allgatherv_init","ompi_coll_libnbc_allgatherv_inter_init","ompi_coll_libnbc_allreduce_init","ompi_coll_libnbc_allreduce_inter_init","ompi_coll_libnbc_alltoall_init","ompi_coll_libnbc_alltoall_inter_init","ompi_coll_libnbc_alltoallv_init","ompi_coll_libnbc_alltoallv_inter_init","ompi_coll_libnbc_alltoallw_init","ompi_coll_libnbc_alltoallw_inter_init","ompi_coll_libnbc_barrier_init","ompi_coll_libnbc_barrier_inter_init","ompi_coll_libnbc_bcast_init","ompi_coll_libnbc_bcast_inter_init","ompi_coll_libnbc_dict_destroy","ompi_coll_libnbc_dict_itor_destroy","ompi_coll_libnbc_dict_long_cmp","ompi_coll_libnbc_dict_ptr_cmp","ompi_coll_libnbc_dict_str_cmp","ompi_coll_libnbc_dict_uint_cmp","ompi_coll_libnbc_dict_ulong_cmp","ompi_coll_libnbc_exscan_init","ompi_coll_libnbc_gather_init","ompi_coll_libnbc_gather_inter_init","ompi_coll_libnbc_gatherv_init","ompi_coll_libnbc_gatherv_inter_init","ompi_coll_libnbc_hb_dict_itor_new","ompi_coll_libnbc_hb_dict_new","ompi_coll_libnbc_hb_itor_cdata","ompi_coll_libnbc_hb_itor_data","ompi_coll_libnbc_hb_itor_destroy","ompi_coll_libnbc_hb_itor_first","ompi_coll_libnbc_hb_itor_invalidate","ompi_coll_libnbc_hb_itor_key","ompi_coll_libnbc_hb_itor_last","ompi_coll_libnbc_hb_itor_new","ompi_coll_libnbc_hb_itor_next","ompi_coll_libnbc_hb_itor_nextn","ompi_coll_libnbc_hb_itor_prev","ompi_coll_libnbc_hb_itor_prevn","ompi_coll_libnbc_hb_itor_set_data","ompi_coll_libnbc_hb_itor_valid","ompi_coll_libnbc_hb_tree_count","ompi_coll_libnbc_hb_tree_destroy","ompi_coll_libnbc_hb_tree_empty","ompi_coll_libnbc_hb_tree_height","ompi_coll_libnbc_hb_tree_insert","ompi_coll_libnbc_hb_tree_max","ompi_coll_libnbc_hb_tree_mheight","ompi_coll_libnbc_hb_tree_min","ompi_coll_libnbc_hb_tree_new","ompi_coll_libnbc_hb_tree_pathlen","ompi_coll_libnbc_hb_tree_probe","ompi_coll_libnbc_hb_tree_remove","ompi_coll_libnbc_hb_tree_search","ompi_coll_libnbc_hb_tree_walk","ompi_coll_libnbc_iallgather","ompi_coll_libnbc_iallgather_inter","ompi_coll_libnbc_iallgatherv","ompi_coll_libnbc_iallgatherv_inter","ompi_coll_libnbc_iallreduce","ompi_coll_libnbc_iallreduce_inter","ompi_coll_libnbc_ialltoall","ompi_coll_libnbc_ialltoall_inter","ompi_coll_libnbc_ialltoallv","ompi_coll_libnbc_ialltoallv_inter","ompi_coll_libnbc_ialltoallw","ompi_coll_libnbc_ialltoallw_inter","ompi_coll_libnbc_ibarrier","ompi_coll_libnbc_ibarrier_inter","ompi_coll_libnbc_ibcast","ompi_coll_libnbc_ibcast_inter","ompi_coll_libnbc_iexscan","ompi_coll_libnbc_igather","ompi_coll_libnbc_igather_inter","ompi_coll_libnbc_igatherv","ompi_coll_libnbc_igatherv_inter","ompi_coll_libnbc_ineighbor_allgather","ompi_coll_libnbc_ineighbor_allgatherv","ompi_coll_libnbc_ineighbor_alltoall","ompi_coll_libnbc_ineighbor_alltoallv","ompi_coll_libnbc_ineighbor_alltoallw","ompi_coll_libnbc_ireduce","ompi_coll_libnbc_ireduce_inter","ompi_coll_libnbc_ireduce_scatter","ompi_coll_libnbc_ireduce_scatter_block","ompi_coll_libnbc_ireduce_scatter_block_inter","ompi_coll_libnbc_ireduce_scatter_inter","ompi_coll_libnbc_iscan","ompi_coll_libnbc_iscatter","ompi_coll_libnbc_iscatter_inter","ompi_coll_libnbc_iscatterv","ompi_coll_libnbc_iscatterv_inter","ompi_coll_libnbc_neighbor_allgather_init","ompi_coll_libnbc_neighbor_allgatherv_init","ompi_coll_libnbc_neighbor_alltoall_init","ompi_coll_libnbc_neighbor_alltoallv_init","ompi_coll_libnbc_neighbor_alltoallw_init","ompi_coll_libnbc_progress","ompi_coll_libnbc_reduce_init","ompi_coll_libnbc_reduce_inter_init","ompi_coll_libnbc_reduce_scatter_block_init","ompi_coll_libnbc_reduce_scatter_block_inter_init","ompi_coll_libnbc_reduce_scatter_init","ompi_coll_libnbc_reduce_scatter_inter_init","ompi_coll_libnbc_scan_init","ompi_coll_libnbc_scatter_init","ompi_coll_libnbc_scatter_inter_init","ompi_coll_libnbc_scatterv_init","ompi_coll_libnbc_scatterv_inter_init","ompi_coll_sm_lazy_enable","ompi_coll_tuned_allgather_intra_check_forced_init","ompi_coll_tuned_allgather_intra_dec_dynamic","ompi_coll_tuned_allgather_intra_dec_fixed","ompi_coll_tuned_allgather_intra_do_this","ompi_coll_tuned_allgatherv_intra_check_forced_init","ompi_coll_tuned_allgatherv_intra_dec_dynamic","ompi_coll_tuned_allgatherv_intra_dec_fixed","ompi_coll_tuned_allgatherv_intra_do_this","ompi_coll_tuned_allreduce_intra_check_forced_init","ompi_coll_tuned_allreduce_intra_dec_dynamic","ompi_coll_tuned_allreduce_intra_dec_fixed","ompi_coll_tuned_allreduce_intra_do_this","ompi_coll_tuned_alltoall_intra_check_forced_init","ompi_coll_tuned_alltoall_intra_dec_dynamic","ompi_coll_tuned_alltoall_intra_dec_fixed","ompi_coll_tuned_alltoall_intra_do_this","ompi_coll_tuned_alltoallv_intra_check_forced_init","ompi_coll_tuned_alltoallv_intra_dec_dynamic","ompi_coll_tuned_alltoallv_intra_dec_fixed","ompi_coll_tuned_alltoallv_intra_do_this","ompi_coll_tuned_barrier_intra_check_forced_init","ompi_coll_tuned_barrier_intra_dec_dynamic","ompi_coll_tuned_barrier_intra_dec_fixed","ompi_coll_tuned_barrier_intra_do_this","ompi_coll_tuned_bcast_intra_check_forced_init","ompi_coll_tuned_bcast_intra_dec_dynamic","ompi_coll_tuned_bcast_intra_dec_fixed","ompi_coll_tuned_bcast_intra_do_this","ompi_coll_tuned_comm_query","ompi_coll_tuned_dump_alg_rule","ompi_coll_tuned_dump_all_rules","ompi_coll_tuned_dump_com_rule","ompi_coll_tuned_dump_msg_rule","ompi_coll_tuned_exscan_intra_check_forced_init","ompi_coll_tuned_exscan_intra_dec_dynamic","ompi_coll_tuned_exscan_intra_do_this","ompi_coll_tuned_forced_getvalues.isra.0","ompi_coll_tuned_free_all_rules","ompi_coll_tuned_free_coms_in_alg_rule","ompi_coll_tuned_free_msg_rules_in_com_rule","ompi_coll_tuned_gather_intra_check_forced_init","ompi_coll_tuned_gather_intra_dec_dynamic","ompi_coll_tuned_gather_intra_dec_fixed","ompi_coll_tuned_gather_intra_do_this","ompi_coll_tuned_get_com_rule_ptr","ompi_coll_tuned_get_target_method_params","ompi_coll_tuned_init_query","ompi_coll_tuned_mk_alg_rules","ompi_coll_tuned_mk_com_rules","ompi_coll_tuned_mk_msg_rules","ompi_coll_tuned_read_rules_config_file","ompi_coll_tuned_reduce_intra_check_forced_init","ompi_coll_tuned_reduce_intra_dec_dynamic","ompi_coll_tuned_reduce_intra_dec_fixed","ompi_coll_tuned_reduce_intra_do_this","ompi_coll_tuned_reduce_scatter_block_intra_check_forced_init","ompi_coll_tuned_reduce_scatter_block_intra_dec_dynamic","ompi_coll_tuned_reduce_scatter_block_intra_dec_fixed","ompi_coll_tuned_reduce_scatter_block_intra_do_this","ompi_coll_tuned_reduce_scatter_intra_check_forced_init","ompi_coll_tuned_reduce_scatter_intra_dec_dynamic","ompi_coll_tuned_reduce_scatter_intra_dec_fixed","ompi_coll_tuned_reduce_scatter_intra_do_this","ompi_coll_tuned_scan_intra_check_forced_init","ompi_coll_tuned_scan_intra_dec_dynamic","ompi_coll_tuned_scan_intra_do_this","ompi_coll_tuned_scatter_intra_check_forced_init","ompi_coll_tuned_scatter_intra_dec_dynamic","ompi_coll_tuned_scatter_intra_dec_fixed","ompi_coll_tuned_scatter_intra_do_this","ompi_comm_ack_failed_internal","ompi_comm_activate","ompi_comm_activate_nb","ompi_comm_activate_nb_complete","ompi_comm_allgather_emulate_intra","ompi_comm_allreduce_bridged_reduce_complete","ompi_comm_allreduce_bridged_xchng_complete","ompi_comm_allreduce_context_construct","ompi_comm_allreduce_context_destruct","ompi_comm_allreduce_getnextcid","ompi_comm_allreduce_group_broadcast","ompi_comm_allreduce_group_nb","ompi_comm_allreduce_group_recv_complete","ompi_comm_allreduce_inter_bcast","ompi_comm_allreduce_inter_leader_exchange","ompi_comm_allreduce_inter_leader_reduce","ompi_comm_allreduce_inter_nb","ompi_comm_allreduce_intra_bridge_nb","ompi_comm_allreduce_intra_nb","ompi_comm_allreduce_intra_pmix_nb","ompi_comm_allreduce_pmix_reduce_complete","ompi_comm_assert_subscribe","ompi_comm_checkcid","ompi_comm_cid_init","ompi_comm_compare","ompi_comm_construct","ompi_comm_create","ompi_comm_create_from_group","ompi_comm_create_group","ompi_comm_create_w_info","ompi_comm_destruct","ompi_comm_determine_first","ompi_comm_determine_first_auto","ompi_comm_dump","ompi_comm_dup","ompi_comm_dup_fn_f","ompi_comm_dup_with_info","ompi_comm_enable","ompi_comm_failure_ack_internal","ompi_comm_failure_detector_finalize","ompi_comm_failure_detector_init","ompi_comm_failure_detector_register_params","ompi_comm_failure_detector_start","ompi_comm_failure_get_acked_internal","ompi_comm_failure_propagate","ompi_comm_failure_propagator_finalize","ompi_comm_failure_propagator_init","ompi_comm_failure_propagator_local","ompi_comm_failure_propagator_register_params","ompi_comm_finalize","ompi_comm_free","ompi_comm_free.localalias","ompi_comm_ft_allreduce_agree_completion","ompi_comm_ft_allreduce_inter_nb","ompi_comm_ft_allreduce_intra_nb","ompi_comm_ft_allreduce_intra_pmix_nb","ompi_comm_get_failed_internal","ompi_comm_get_remote_cid_from_pmix","ompi_comm_get_rprocs","ompi_comm_group","ompi_comm_idup","ompi_comm_idup_getcid","ompi_comm_idup_with_info","ompi_comm_idup_with_info_activate","ompi_comm_idup_with_info_finish","ompi_comm_init","ompi_comm_init_mpi3","ompi_comm_is_proc_active","ompi_comm_ishrink_check_activate","ompi_comm_ishrink_check_agree","ompi_comm_ishrink_check_cid","ompi_comm_ishrink_check_setrank","ompi_comm_ishrink_internal","ompi_comm_nextcid","ompi_comm_nextcid_check_flag","ompi_comm_nextcid_nb","ompi_comm_null_copy_fn_f","ompi_comm_null_delete_fn_f","ompi_comm_print_cid","ompi_comm_rbcast_bmg","ompi_comm_rbcast_bml_recv_cb","ompi_comm_rbcast_finalize","ompi_comm_rbcast_init","ompi_comm_rbcast_n2","ompi_comm_rbcast_null","ompi_comm_rbcast_register_cb_type","ompi_comm_rbcast_register_params","ompi_comm_rbcast_send_msg","ompi_comm_rbcast_unregister_cb_type","ompi_comm_request_cancel","ompi_comm_request_construct","ompi_comm_request_destruct","ompi_comm_request_fini","ompi_comm_request_free","ompi_comm_request_get","ompi_comm_request_init","ompi_comm_request_progress","ompi_comm_request_progress.cold","ompi_comm_request_return","ompi_comm_request_schedule_append","ompi_comm_request_schedule_append_w_flags","ompi_comm_request_start","ompi_comm_revoke_finalize","ompi_comm_revoke_init","ompi_comm_revoke_internal","ompi_comm_revoke_local","ompi_comm_set","ompi_comm_set_active_poll","ompi_comm_set_allow_overtake","ompi_comm_set_exact_length","ompi_comm_set_lazy_barrier","ompi_comm_set_name","ompi_comm_set_nb","ompi_comm_set_no_any_source","ompi_comm_set_no_any_tag","ompi_comm_set_rank_failed","ompi_comm_shrink_internal","ompi_comm_split","ompi_comm_split_type","ompi_comm_split_type_core","ompi_comm_split_type_get_part.constprop.0","ompi_comm_split_verify","ompi_comm_split_with_info","ompi_comm_start_detector","ompi_datatype_copy_args","ompi_datatype_create","ompi_datatype_create_contiguous","ompi_datatype_create_darray","ompi_datatype_create_from_packed_description","ompi_datatype_create_hindexed","ompi_datatype_create_hindexed_block","ompi_datatype_create_hvector","ompi_datatype_create_indexed","ompi_datatype_create_indexed_block","ompi_datatype_create_struct","ompi_datatype_create_subarray","ompi_datatype_create_vector","ompi_datatype_default_convertors_fini","ompi_datatype_default_convertors_init","ompi_datatype_destroy","ompi_datatype_dump","ompi_datatype_duplicate","ompi_datatype_finalize","ompi_datatype_get_args","ompi_datatype_get_elements","ompi_datatype_get_pack_description","ompi_datatype_get_single_predefined_type_from_args","ompi_datatype_get_single_predefined_type_from_args.localalias","ompi_datatype_init","ompi_datatype_init.cold","ompi_datatype_match_size","ompi_datatype_match_size.cold","ompi_datatype_pack_description_length","ompi_datatype_pack_external","ompi_datatype_pack_external_size","ompi_datatype_print_args","ompi_datatype_release_args","ompi_datatype_set_args","ompi_datatype_sndrcv","ompi_datatype_unpack_external","ompi_debugger_setup_dlls","ompi_dpm_close_port","ompi_dpm_connect_accept","ompi_dpm_disconnect","ompi_dpm_dyn_finalize","ompi_dpm_dyn_init","ompi_dpm_init","ompi_dpm_mark_dyncomm","ompi_dpm_open_port","ompi_dpm_spawn","ompi_dup_fn_f","ompi_errcode_get_mpi_code.part.0","ompi_errcode_get_mpi_code.part.0.cold","ompi_errcode_intern_construct","ompi_errcode_intern_destruct","ompi_errcode_intern_finalize","ompi_errcode_intern_init","ompi_errhandler_callback","ompi_errhandler_construct","ompi_errhandler_create","ompi_errhandler_destruct","ompi_errhandler_event_cb","ompi_errhandler_finalize","ompi_errhandler_free","ompi_errhandler_init","ompi_errhandler_invoke","ompi_errhandler_proc_failed_internal","ompi_errhandler_registration_callback","ompi_errhandler_request_invoke","ompi_errhandler_request_invoke.cold","ompi_fcoll_base_coll_allgather_array","ompi_fcoll_base_coll_allgatherv_array","ompi_fcoll_base_coll_bcast_array","ompi_fcoll_base_coll_gather_array","ompi_fcoll_base_coll_gatherv_array","ompi_fcoll_base_coll_scatterv_array","ompi_fcoll_base_sort_iovec","ompi_file_close","ompi_file_finalize","ompi_file_init","ompi_file_open","ompi_fortran_argv_blank_f2c","ompi_fortran_argv_count_f2c","ompi_fortran_multiple_argvs_f2c","ompi_fortran_string_c2f","ompi_fortran_string_f2c","ompi_grequest_cancel","ompi_grequest_complete","ompi_grequest_construct","ompi_grequest_destruct","ompi_grequest_free","ompi_grequest_invoke_query","ompi_grequest_start","ompi_group_allocate","ompi_group_allocate_bmap","ompi_group_allocate_plist_w_procs","ompi_group_allocate_sporadic","ompi_group_allocate_strided","ompi_group_calc_bmap","ompi_group_calc_plist","ompi_group_calc_sporadic","ompi_group_calc_strided","ompi_group_compare","ompi_group_construct","ompi_group_count_local_peers","ompi_group_decrement_proc_count","ompi_group_dense_overlap","ompi_group_destruct","ompi_group_difference","ompi_group_div_ceil","ompi_group_dump","ompi_group_excl","ompi_group_finalize","ompi_group_flatten","ompi_group_free","ompi_group_from_pset","ompi_group_have_remote_peers","ompi_group_incl","ompi_group_incl_bmap","ompi_group_incl_plist","ompi_group_incl_spor","ompi_group_incl_strided","ompi_group_increment_proc_count","ompi_group_init","ompi_group_intersection","ompi_group_minloc","ompi_group_overlap","ompi_group_range_excl","ompi_group_range_incl","ompi_group_to_proc_name_array","ompi_group_translate_ranks","ompi_group_translate_ranks_bmap","ompi_group_translate_ranks_bmap_reverse","ompi_group_translate_ranks_sporadic","ompi_group_translate_ranks_sporadic_reverse","ompi_group_translate_ranks_strided","ompi_group_translate_ranks_strided_reverse","ompi_group_union","ompi_hook_base_close","ompi_hook_base_deregister_callbacks","ompi_hook_base_mpi_finalize_bottom","ompi_hook_base_mpi_finalize_top","ompi_hook_base_mpi_finalized_bottom","ompi_hook_base_mpi_finalized_top","ompi_hook_base_mpi_init_bottom","ompi_hook_base_mpi_init_error","ompi_hook_base_mpi_init_thread_bottom","ompi_hook_base_mpi_init_thread_top","ompi_hook_base_mpi_init_top","ompi_hook_base_mpi_init_top_post_opal","ompi_hook_base_mpi_initialized_bottom","ompi_hook_base_mpi_initialized_top","ompi_hook_base_open","ompi_hook_base_register","ompi_hook_base_register_callbacks","ompi_hook_comm_method_component_close","ompi_hook_comm_method_component_open","ompi_hook_comm_method_component_register","ompi_hook_comm_method_mpi_finalize_top","ompi_hook_comm_method_mpi_init_bottom","ompi_info_allocate","ompi_info_close_components","ompi_info_delete","ompi_info_dup","ompi_info_free","ompi_info_get","ompi_info_get_bool","ompi_info_get_nkeys","ompi_info_get_nthkey","ompi_info_get_value_enum","ompi_info_get_valuelen","ompi_info_register_framework_params","ompi_info_register_types","ompi_info_set","ompi_info_set_value_enum","ompi_info_show_ompi_version","ompi_init_preconnect_mpi","ompi_initial_errhandler_init","ompi_instance_construct","ompi_instance_destruct","ompi_instance_get_nth_pset","ompi_instance_get_num_psets","ompi_instance_get_num_psets_complete","ompi_instance_get_pset_info","ompi_instance_group_pmix_pset","ompi_instance_group_shared","ompi_instance_print_error.part.0","ompi_instance_refresh_pmix_psets","ompi_intercomm_create","ompi_intercomm_create_from_groups","ompi_interlib_declare","ompi_io_ompio_generate_current_file_view","ompi_io_ompio_generate_current_file_view.cold","ompi_io_ompio_sort_offlen","ompi_isendrecv_complete_func","ompi_isendrecv_context_constructor","ompi_isendrecv_context_destructor","ompi_isendrecv_replace_complete_func","ompi_message_constructor","ompi_message_finalize","ompi_message_init","ompi_mirror_perm","ompi_mpi_abort","ompi_mpi_dynamics_disable","ompi_mpi_dynamics_finalize","ompi_mpi_dynamics_is_enabled","ompi_mpi_errclass_add","ompi_mpi_errcode_add","ompi_mpi_errcode_construct","ompi_mpi_errcode_destruct","ompi_mpi_errcode_finalize","ompi_mpi_errcode_init","ompi_mpi_errnum_add_string","ompi_mpi_errors_abort_comm_handler","ompi_mpi_errors_abort_file_handler","ompi_mpi_errors_abort_win_handler","ompi_mpi_errors_are_fatal_comm_handler","ompi_mpi_errors_are_fatal_file_handler","ompi_mpi_errors_are_fatal_instance_handler","ompi_mpi_errors_are_fatal_win_handler","ompi_mpi_errors_return_comm_handler","ompi_mpi_errors_return_file_handler","ompi_mpi_errors_return_instance_handler","ompi_mpi_errors_return_win_handler","ompi_mpi_finalize","ompi_mpi_init","ompi_mpi_instance_cleanup_pml","ompi_mpi_instance_finalize","ompi_mpi_instance_finalize_common","ompi_mpi_instance_init","ompi_mpi_instance_init_common","ompi_mpi_instance_release","ompi_mpi_instance_retain","ompi_mpi_register_params","ompi_mpi_thread_level","ompi_mpiext_fini","ompi_mpiext_init","ompi_mpiinfo_finalize","ompi_mpiinfo_init","ompi_mpiinfo_init_env","ompi_mpit_lock","ompi_mpit_unlock","ompi_mtl_base_close","ompi_mtl_base_select","ompi_null_copy_fn_f","ompi_null_delete_fn_f","ompi_op_avx_2buff_add_double_avx","ompi_op_avx_2buff_add_double_avx2","ompi_op_avx_2buff_add_double_avx512","ompi_op_avx_2buff_add_float_avx","ompi_op_avx_2buff_add_float_avx2","ompi_op_avx_2buff_add_float_avx512","ompi_op_avx_2buff_band_int16_t_avx","ompi_op_avx_2buff_band_int16_t_avx2","ompi_op_avx_2buff_band_int16_t_avx512","ompi_op_avx_2buff_band_int32_t_avx","ompi_op_avx_2buff_band_int32_t_avx2","ompi_op_avx_2buff_band_int32_t_avx512","ompi_op_avx_2buff_band_int64_t_avx","ompi_op_avx_2buff_band_int64_t_avx2","ompi_op_avx_2buff_band_int64_t_avx512","ompi_op_avx_2buff_band_int8_t_avx","ompi_op_avx_2buff_band_int8_t_avx2","ompi_op_avx_2buff_band_int8_t_avx512","ompi_op_avx_2buff_band_uint16_t_avx","ompi_op_avx_2buff_band_uint16_t_avx2","ompi_op_avx_2buff_band_uint16_t_avx512","ompi_op_avx_2buff_band_uint32_t_avx","ompi_op_avx_2buff_band_uint32_t_avx2","ompi_op_avx_2buff_band_uint32_t_avx512","ompi_op_avx_2buff_band_uint64_t_avx","ompi_op_avx_2buff_band_uint64_t_avx2","ompi_op_avx_2buff_band_uint64_t_avx512","ompi_op_avx_2buff_band_uint8_t_avx","ompi_op_avx_2buff_band_uint8_t_avx2","ompi_op_avx_2buff_band_uint8_t_avx512","ompi_op_avx_2buff_bor_int16_t_avx","ompi_op_avx_2buff_bor_int16_t_avx2","ompi_op_avx_2buff_bor_int16_t_avx512","ompi_op_avx_2buff_bor_int32_t_avx","ompi_op_avx_2buff_bor_int32_t_avx2","ompi_op_avx_2buff_bor_int32_t_avx512","ompi_op_avx_2buff_bor_int64_t_avx","ompi_op_avx_2buff_bor_int64_t_avx2","ompi_op_avx_2buff_bor_int64_t_avx512","ompi_op_avx_2buff_bor_int8_t_avx","ompi_op_avx_2buff_bor_int8_t_avx2","ompi_op_avx_2buff_bor_int8_t_avx512","ompi_op_avx_2buff_bor_uint16_t_avx","ompi_op_avx_2buff_bor_uint16_t_avx2","ompi_op_avx_2buff_bor_uint16_t_avx512","ompi_op_avx_2buff_bor_uint32_t_avx","ompi_op_avx_2buff_bor_uint32_t_avx2","ompi_op_avx_2buff_bor_uint32_t_avx512","ompi_op_avx_2buff_bor_uint64_t_avx","ompi_op_avx_2buff_bor_uint64_t_avx2","ompi_op_avx_2buff_bor_uint64_t_avx512","ompi_op_avx_2buff_bor_uint8_t_avx","ompi_op_avx_2buff_bor_uint8_t_avx2","ompi_op_avx_2buff_bor_uint8_t_avx512","ompi_op_avx_2buff_bxor_int16_t_avx","ompi_op_avx_2buff_bxor_int16_t_avx2","ompi_op_avx_2buff_bxor_int16_t_avx512","ompi_op_avx_2buff_bxor_int32_t_avx","ompi_op_avx_2buff_bxor_int32_t_avx2","ompi_op_avx_2buff_bxor_int32_t_avx512","ompi_op_avx_2buff_bxor_int64_t_avx","ompi_op_avx_2buff_bxor_int64_t_avx2","ompi_op_avx_2buff_bxor_int64_t_avx512","ompi_op_avx_2buff_bxor_int8_t_avx","ompi_op_avx_2buff_bxor_int8_t_avx2","ompi_op_avx_2buff_bxor_int8_t_avx512","ompi_op_avx_2buff_bxor_uint16_t_avx","ompi_op_avx_2buff_bxor_uint16_t_avx2","ompi_op_avx_2buff_bxor_uint16_t_avx512","ompi_op_avx_2buff_bxor_uint32_t_avx","ompi_op_avx_2buff_bxor_uint32_t_avx2","ompi_op_avx_2buff_bxor_uint32_t_avx512","ompi_op_avx_2buff_bxor_uint64_t_avx","ompi_op_avx_2buff_bxor_uint64_t_avx2","ompi_op_avx_2buff_bxor_uint64_t_avx512","ompi_op_avx_2buff_bxor_uint8_t_avx","ompi_op_avx_2buff_bxor_uint8_t_avx2","ompi_op_avx_2buff_bxor_uint8_t_avx512","ompi_op_avx_2buff_max_double_avx","ompi_op_avx_2buff_max_double_avx2","ompi_op_avx_2buff_max_double_avx512","ompi_op_avx_2buff_max_float_avx","ompi_op_avx_2buff_max_float_avx2","ompi_op_avx_2buff_max_float_avx512","ompi_op_avx_2buff_max_int16_t_avx","ompi_op_avx_2buff_max_int16_t_avx2","ompi_op_avx_2buff_max_int16_t_avx512","ompi_op_avx_2buff_max_int32_t_avx","ompi_op_avx_2buff_max_int32_t_avx2","ompi_op_avx_2buff_max_int32_t_avx512","ompi_op_avx_2buff_max_int64_t_avx512","ompi_op_avx_2buff_max_int8_t_avx","ompi_op_avx_2buff_max_int8_t_avx2","ompi_op_avx_2buff_max_int8_t_avx512","ompi_op_avx_2buff_max_uint16_t_avx","ompi_op_avx_2buff_max_uint16_t_avx2","ompi_op_avx_2buff_max_uint16_t_avx512","ompi_op_avx_2buff_max_uint32_t_avx","ompi_op_avx_2buff_max_uint32_t_avx2","ompi_op_avx_2buff_max_uint32_t_avx512","ompi_op_avx_2buff_max_uint64_t_avx512","ompi_op_avx_2buff_max_uint8_t_avx","ompi_op_avx_2buff_max_uint8_t_avx2","ompi_op_avx_2buff_max_uint8_t_avx512","ompi_op_avx_2buff_min_double_avx","ompi_op_avx_2buff_min_double_avx2","ompi_op_avx_2buff_min_double_avx512","ompi_op_avx_2buff_min_float_avx","ompi_op_avx_2buff_min_float_avx2","ompi_op_avx_2buff_min_float_avx512","ompi_op_avx_2buff_min_int16_t_avx","ompi_op_avx_2buff_min_int16_t_avx2","ompi_op_avx_2buff_min_int16_t_avx512","ompi_op_avx_2buff_min_int32_t_avx","ompi_op_avx_2buff_min_int32_t_avx2","ompi_op_avx_2buff_min_int32_t_avx512","ompi_op_avx_2buff_min_int64_t_avx512","ompi_op_avx_2buff_min_int8_t_avx","ompi_op_avx_2buff_min_int8_t_avx2","ompi_op_avx_2buff_min_int8_t_avx512","ompi_op_avx_2buff_min_uint16_t_avx","ompi_op_avx_2buff_min_uint16_t_avx2","ompi_op_avx_2buff_min_uint16_t_avx512","ompi_op_avx_2buff_min_uint32_t_avx","ompi_op_avx_2buff_min_uint32_t_avx2","ompi_op_avx_2buff_min_uint32_t_avx512","ompi_op_avx_2buff_min_uint64_t_avx512","ompi_op_avx_2buff_min_uint8_t_avx","ompi_op_avx_2buff_min_uint8_t_avx2","ompi_op_avx_2buff_min_uint8_t_avx512","ompi_op_avx_2buff_mul_double_avx","ompi_op_avx_2buff_mul_double_avx2","ompi_op_avx_2buff_mul_double_avx512","ompi_op_avx_2buff_mul_float_avx","ompi_op_avx_2buff_mul_float_avx2","ompi_op_avx_2buff_mul_float_avx512","ompi_op_avx_2buff_prod_int16_t_avx","ompi_op_avx_2buff_prod_int16_t_avx2","ompi_op_avx_2buff_prod_int16_t_avx512","ompi_op_avx_2buff_prod_int32_t_avx","ompi_op_avx_2buff_prod_int32_t_avx2","ompi_op_avx_2buff_prod_int32_t_avx512","ompi_op_avx_2buff_prod_int64_t_avx512","ompi_op_avx_2buff_prod_int8_t_avx","ompi_op_avx_2buff_prod_int8_t_avx2","ompi_op_avx_2buff_prod_int8_t_avx512","ompi_op_avx_2buff_prod_uint16_t_avx","ompi_op_avx_2buff_prod_uint16_t_avx2","ompi_op_avx_2buff_prod_uint16_t_avx512","ompi_op_avx_2buff_prod_uint32_t_avx","ompi_op_avx_2buff_prod_uint32_t_avx2","ompi_op_avx_2buff_prod_uint32_t_avx512","ompi_op_avx_2buff_prod_uint64_t_avx512","ompi_op_avx_2buff_prod_uint8_t_avx","ompi_op_avx_2buff_prod_uint8_t_avx2","ompi_op_avx_2buff_prod_uint8_t_avx512","ompi_op_avx_2buff_sum_int16_t_avx","ompi_op_avx_2buff_sum_int16_t_avx2","ompi_op_avx_2buff_sum_int16_t_avx512","ompi_op_avx_2buff_sum_int32_t_avx","ompi_op_avx_2buff_sum_int32_t_avx2","ompi_op_avx_2buff_sum_int32_t_avx512","ompi_op_avx_2buff_sum_int64_t_avx","ompi_op_avx_2buff_sum_int64_t_avx2","ompi_op_avx_2buff_sum_int64_t_avx512","ompi_op_avx_2buff_sum_int8_t_avx","ompi_op_avx_2buff_sum_int8_t_avx2","ompi_op_avx_2buff_sum_int8_t_avx512","ompi_op_avx_2buff_sum_uint16_t_avx","ompi_op_avx_2buff_sum_uint16_t_avx2","ompi_op_avx_2buff_sum_uint16_t_avx512","ompi_op_avx_2buff_sum_uint32_t_avx","ompi_op_avx_2buff_sum_uint32_t_avx2","ompi_op_avx_2buff_sum_uint32_t_avx512","ompi_op_avx_2buff_sum_uint64_t_avx","ompi_op_avx_2buff_sum_uint64_t_avx2","ompi_op_avx_2buff_sum_uint64_t_avx512","ompi_op_avx_2buff_sum_uint8_t_avx","ompi_op_avx_2buff_sum_uint8_t_avx2","ompi_op_avx_2buff_sum_uint8_t_avx512","ompi_op_avx_3buff_add_double_avx","ompi_op_avx_3buff_add_double_avx2","ompi_op_avx_3buff_add_double_avx512","ompi_op_avx_3buff_add_float_avx","ompi_op_avx_3buff_add_float_avx2","ompi_op_avx_3buff_add_float_avx512","ompi_op_avx_3buff_and_int16_t_avx","ompi_op_avx_3buff_and_int16_t_avx2","ompi_op_avx_3buff_and_int16_t_avx512","ompi_op_avx_3buff_and_int32_t_avx","ompi_op_avx_3buff_and_int32_t_avx2","ompi_op_avx_3buff_and_int32_t_avx512","ompi_op_avx_3buff_and_int64_t_avx","ompi_op_avx_3buff_and_int64_t_avx2","ompi_op_avx_3buff_and_int64_t_avx512","ompi_op_avx_3buff_and_int8_t_avx","ompi_op_avx_3buff_and_int8_t_avx2","ompi_op_avx_3buff_and_int8_t_avx512","ompi_op_avx_3buff_and_uint16_t_avx","ompi_op_avx_3buff_and_uint16_t_avx2","ompi_op_avx_3buff_and_uint16_t_avx512","ompi_op_avx_3buff_and_uint32_t_avx","ompi_op_avx_3buff_and_uint32_t_avx2","ompi_op_avx_3buff_and_uint32_t_avx512","ompi_op_avx_3buff_and_uint64_t_avx","ompi_op_avx_3buff_and_uint64_t_avx2","ompi_op_avx_3buff_and_uint64_t_avx512","ompi_op_avx_3buff_and_uint8_t_avx","ompi_op_avx_3buff_and_uint8_t_avx2","ompi_op_avx_3buff_and_uint8_t_avx512","ompi_op_avx_3buff_max_double_avx","ompi_op_avx_3buff_max_double_avx2","ompi_op_avx_3buff_max_double_avx512","ompi_op_avx_3buff_max_float_avx","ompi_op_avx_3buff_max_float_avx2","ompi_op_avx_3buff_max_float_avx512","ompi_op_avx_3buff_max_int16_t_avx","ompi_op_avx_3buff_max_int16_t_avx2","ompi_op_avx_3buff_max_int16_t_avx512","ompi_op_avx_3buff_max_int32_t_avx","ompi_op_avx_3buff_max_int32_t_avx2","ompi_op_avx_3buff_max_int32_t_avx512","ompi_op_avx_3buff_max_int64_t_avx512","ompi_op_avx_3buff_max_int8_t_avx","ompi_op_avx_3buff_max_int8_t_avx2","ompi_op_avx_3buff_max_int8_t_avx512","ompi_op_avx_3buff_max_uint16_t_avx","ompi_op_avx_3buff_max_uint16_t_avx2","ompi_op_avx_3buff_max_uint16_t_avx512","ompi_op_avx_3buff_max_uint32_t_avx","ompi_op_avx_3buff_max_uint32_t_avx2","ompi_op_avx_3buff_max_uint32_t_avx512","ompi_op_avx_3buff_max_uint64_t_avx512","ompi_op_avx_3buff_max_uint8_t_avx","ompi_op_avx_3buff_max_uint8_t_avx2","ompi_op_avx_3buff_max_uint8_t_avx512","ompi_op_avx_3buff_min_double_avx","ompi_op_avx_3buff_min_double_avx2","ompi_op_avx_3buff_min_double_avx512","ompi_op_avx_3buff_min_float_avx","ompi_op_avx_3buff_min_float_avx2","ompi_op_avx_3buff_min_float_avx512","ompi_op_avx_3buff_min_int16_t_avx","ompi_op_avx_3buff_min_int16_t_avx2","ompi_op_avx_3buff_min_int16_t_avx512","ompi_op_avx_3buff_min_int32_t_avx","ompi_op_avx_3buff_min_int32_t_avx2","ompi_op_avx_3buff_min_int32_t_avx512","ompi_op_avx_3buff_min_int64_t_avx512","ompi_op_avx_3buff_min_int8_t_avx","ompi_op_avx_3buff_min_int8_t_avx2","ompi_op_avx_3buff_min_int8_t_avx512","ompi_op_avx_3buff_min_uint16_t_avx","ompi_op_avx_3buff_min_uint16_t_avx2","ompi_op_avx_3buff_min_uint16_t_avx512","ompi_op_avx_3buff_min_uint32_t_avx","ompi_op_avx_3buff_min_uint32_t_avx2","ompi_op_avx_3buff_min_uint32_t_avx512","ompi_op_avx_3buff_min_uint64_t_avx512","ompi_op_avx_3buff_min_uint8_t_avx","ompi_op_avx_3buff_min_uint8_t_avx2","ompi_op_avx_3buff_min_uint8_t_avx512","ompi_op_avx_3buff_mul_double_avx","ompi_op_avx_3buff_mul_double_avx2","ompi_op_avx_3buff_mul_double_avx512","ompi_op_avx_3buff_mul_float_avx","ompi_op_avx_3buff_mul_float_avx2","ompi_op_avx_3buff_mul_float_avx512","ompi_op_avx_3buff_or_int16_t_avx","ompi_op_avx_3buff_or_int16_t_avx2","ompi_op_avx_3buff_or_int16_t_avx512","ompi_op_avx_3buff_or_int32_t_avx","ompi_op_avx_3buff_or_int32_t_avx2","ompi_op_avx_3buff_or_int32_t_avx512","ompi_op_avx_3buff_or_int64_t_avx","ompi_op_avx_3buff_or_int64_t_avx2","ompi_op_avx_3buff_or_int64_t_avx512","ompi_op_avx_3buff_or_int8_t_avx","ompi_op_avx_3buff_or_int8_t_avx2","ompi_op_avx_3buff_or_int8_t_avx512","ompi_op_avx_3buff_or_uint16_t_avx","ompi_op_avx_3buff_or_uint16_t_avx2","ompi_op_avx_3buff_or_uint16_t_avx512","ompi_op_avx_3buff_or_uint32_t_avx","ompi_op_avx_3buff_or_uint32_t_avx2","ompi_op_avx_3buff_or_uint32_t_avx512","ompi_op_avx_3buff_or_uint64_t_avx","ompi_op_avx_3buff_or_uint64_t_avx2","ompi_op_avx_3buff_or_uint64_t_avx512","ompi_op_avx_3buff_or_uint8_t_avx","ompi_op_avx_3buff_or_uint8_t_avx2","ompi_op_avx_3buff_or_uint8_t_avx512","ompi_op_avx_3buff_prod_int16_t_avx","ompi_op_avx_3buff_prod_int16_t_avx2","ompi_op_avx_3buff_prod_int16_t_avx512","ompi_op_avx_3buff_prod_int32_t_avx","ompi_op_avx_3buff_prod_int32_t_avx2","ompi_op_avx_3buff_prod_int32_t_avx512","ompi_op_avx_3buff_prod_int64_t_avx512","ompi_op_avx_3buff_prod_int8_t_avx","ompi_op_avx_3buff_prod_int8_t_avx2","ompi_op_avx_3buff_prod_int8_t_avx512","ompi_op_avx_3buff_prod_uint16_t_avx","ompi_op_avx_3buff_prod_uint16_t_avx2","ompi_op_avx_3buff_prod_uint16_t_avx512","ompi_op_avx_3buff_prod_uint32_t_avx","ompi_op_avx_3buff_prod_uint32_t_avx2","ompi_op_avx_3buff_prod_uint32_t_avx512","ompi_op_avx_3buff_prod_uint64_t_avx512","ompi_op_avx_3buff_prod_uint8_t_avx","ompi_op_avx_3buff_prod_uint8_t_avx2","ompi_op_avx_3buff_prod_uint8_t_avx512","ompi_op_avx_3buff_sum_int16_t_avx","ompi_op_avx_3buff_sum_int16_t_avx2","ompi_op_avx_3buff_sum_int16_t_avx512","ompi_op_avx_3buff_sum_int32_t_avx","ompi_op_avx_3buff_sum_int32_t_avx2","ompi_op_avx_3buff_sum_int32_t_avx512","ompi_op_avx_3buff_sum_int64_t_avx","ompi_op_avx_3buff_sum_int64_t_avx2","ompi_op_avx_3buff_sum_int64_t_avx512","ompi_op_avx_3buff_sum_int8_t_avx","ompi_op_avx_3buff_sum_int8_t_avx2","ompi_op_avx_3buff_sum_int8_t_avx512","ompi_op_avx_3buff_sum_uint16_t_avx","ompi_op_avx_3buff_sum_uint16_t_avx2","ompi_op_avx_3buff_sum_uint16_t_avx512","ompi_op_avx_3buff_sum_uint32_t_avx","ompi_op_avx_3buff_sum_uint32_t_avx2","ompi_op_avx_3buff_sum_uint32_t_avx512","ompi_op_avx_3buff_sum_uint64_t_avx","ompi_op_avx_3buff_sum_uint64_t_avx2","ompi_op_avx_3buff_sum_uint64_t_avx512","ompi_op_avx_3buff_sum_uint8_t_avx","ompi_op_avx_3buff_sum_uint8_t_avx2","ompi_op_avx_3buff_sum_uint8_t_avx512","ompi_op_avx_3buff_xor_int16_t_avx","ompi_op_avx_3buff_xor_int16_t_avx2","ompi_op_avx_3buff_xor_int16_t_avx512","ompi_op_avx_3buff_xor_int32_t_avx","ompi_op_avx_3buff_xor_int32_t_avx2","ompi_op_avx_3buff_xor_int32_t_avx512","ompi_op_avx_3buff_xor_int64_t_avx","ompi_op_avx_3buff_xor_int64_t_avx2","ompi_op_avx_3buff_xor_int64_t_avx512","ompi_op_avx_3buff_xor_int8_t_avx","ompi_op_avx_3buff_xor_int8_t_avx2","ompi_op_avx_3buff_xor_int8_t_avx512","ompi_op_avx_3buff_xor_uint16_t_avx","ompi_op_avx_3buff_xor_uint16_t_avx2","ompi_op_avx_3buff_xor_uint16_t_avx512","ompi_op_avx_3buff_xor_uint32_t_avx","ompi_op_avx_3buff_xor_uint32_t_avx2","ompi_op_avx_3buff_xor_uint32_t_avx512","ompi_op_avx_3buff_xor_uint64_t_avx","ompi_op_avx_3buff_xor_uint64_t_avx2","ompi_op_avx_3buff_xor_uint64_t_avx512","ompi_op_avx_3buff_xor_uint8_t_avx","ompi_op_avx_3buff_xor_uint8_t_avx2","ompi_op_avx_3buff_xor_uint8_t_avx512","ompi_op_base_2buff_band_byte","ompi_op_base_2buff_band_fortran_integer","ompi_op_base_2buff_band_fortran_integer1","ompi_op_base_2buff_band_fortran_integer2","ompi_op_base_2buff_band_fortran_integer4","ompi_op_base_2buff_band_fortran_integer8","ompi_op_base_2buff_band_int16_t","ompi_op_base_2buff_band_int32_t","ompi_op_base_2buff_band_int64_t","ompi_op_base_2buff_band_int8_t","ompi_op_base_2buff_band_long","ompi_op_base_2buff_band_uint16_t","ompi_op_base_2buff_band_uint32_t","ompi_op_base_2buff_band_uint64_t","ompi_op_base_2buff_band_uint8_t","ompi_op_base_2buff_band_unsigned_long","ompi_op_base_2buff_bor_byte","ompi_op_base_2buff_bor_fortran_integer","ompi_op_base_2buff_bor_fortran_integer1","ompi_op_base_2buff_bor_fortran_integer2","ompi_op_base_2buff_bor_fortran_integer4","ompi_op_base_2buff_bor_fortran_integer8","ompi_op_base_2buff_bor_int16_t","ompi_op_base_2buff_bor_int32_t","ompi_op_base_2buff_bor_int64_t","ompi_op_base_2buff_bor_int8_t","ompi_op_base_2buff_bor_long","ompi_op_base_2buff_bor_uint16_t","ompi_op_base_2buff_bor_uint32_t","ompi_op_base_2buff_bor_uint64_t","ompi_op_base_2buff_bor_uint8_t","ompi_op_base_2buff_bor_unsigned_long","ompi_op_base_2buff_bxor_byte","ompi_op_base_2buff_bxor_fortran_integer","ompi_op_base_2buff_bxor_fortran_integer1","ompi_op_base_2buff_bxor_fortran_integer2","ompi_op_base_2buff_bxor_fortran_integer4","ompi_op_base_2buff_bxor_fortran_integer8","ompi_op_base_2buff_bxor_int16_t","ompi_op_base_2buff_bxor_int32_t","ompi_op_base_2buff_bxor_int64_t","ompi_op_base_2buff_bxor_int8_t","ompi_op_base_2buff_bxor_long","ompi_op_base_2buff_bxor_uint16_t","ompi_op_base_2buff_bxor_uint32_t","ompi_op_base_2buff_bxor_uint64_t","ompi_op_base_2buff_bxor_uint8_t","ompi_op_base_2buff_bxor_unsigned_long","ompi_op_base_2buff_land_bool","ompi_op_base_2buff_land_fortran_logical","ompi_op_base_2buff_land_int16_t","ompi_op_base_2buff_land_int32_t","ompi_op_base_2buff_land_int64_t","ompi_op_base_2buff_land_int8_t","ompi_op_base_2buff_land_long","ompi_op_base_2buff_land_uint16_t","ompi_op_base_2buff_land_uint32_t","ompi_op_base_2buff_land_uint64_t","ompi_op_base_2buff_land_uint8_t","ompi_op_base_2buff_land_unsigned_long","ompi_op_base_2buff_lor_bool","ompi_op_base_2buff_lor_fortran_logical","ompi_op_base_2buff_lor_int16_t","ompi_op_base_2buff_lor_int32_t","ompi_op_base_2buff_lor_int64_t","ompi_op_base_2buff_lor_int8_t","ompi_op_base_2buff_lor_long","ompi_op_base_2buff_lor_uint16_t","ompi_op_base_2buff_lor_uint32_t","ompi_op_base_2buff_lor_uint64_t","ompi_op_base_2buff_lor_uint8_t","ompi_op_base_2buff_lor_unsigned_long","ompi_op_base_2buff_lxor_bool","ompi_op_base_2buff_lxor_fortran_logical","ompi_op_base_2buff_lxor_int16_t","ompi_op_base_2buff_lxor_int32_t","ompi_op_base_2buff_lxor_int64_t","ompi_op_base_2buff_lxor_int8_t","ompi_op_base_2buff_lxor_long","ompi_op_base_2buff_lxor_uint16_t","ompi_op_base_2buff_lxor_uint32_t","ompi_op_base_2buff_lxor_uint64_t","ompi_op_base_2buff_lxor_uint8_t","ompi_op_base_2buff_lxor_unsigned_long","ompi_op_base_2buff_max_double","ompi_op_base_2buff_max_float","ompi_op_base_2buff_max_fortran_double_precision","ompi_op_base_2buff_max_fortran_integer","ompi_op_base_2buff_max_fortran_integer1","ompi_op_base_2buff_max_fortran_integer2","ompi_op_base_2buff_max_fortran_integer4","ompi_op_base_2buff_max_fortran_integer8","ompi_op_base_2buff_max_fortran_real","ompi_op_base_2buff_max_fortran_real16","ompi_op_base_2buff_max_fortran_real4","ompi_op_base_2buff_max_fortran_real8","ompi_op_base_2buff_max_int16_t","ompi_op_base_2buff_max_int32_t","ompi_op_base_2buff_max_int64_t","ompi_op_base_2buff_max_int8_t","ompi_op_base_2buff_max_long","ompi_op_base_2buff_max_long_double","ompi_op_base_2buff_max_uint16_t","ompi_op_base_2buff_max_uint32_t","ompi_op_base_2buff_max_uint64_t","ompi_op_base_2buff_max_uint8_t","ompi_op_base_2buff_max_unsigned_long","ompi_op_base_2buff_maxloc_2double_precision","ompi_op_base_2buff_maxloc_2int","ompi_op_base_2buff_maxloc_2integer","ompi_op_base_2buff_maxloc_2real","ompi_op_base_2buff_maxloc_double_int","ompi_op_base_2buff_maxloc_float_int","ompi_op_base_2buff_maxloc_long_double_int","ompi_op_base_2buff_maxloc_long_int","ompi_op_base_2buff_maxloc_short_int","ompi_op_base_2buff_min_double","ompi_op_base_2buff_min_float","ompi_op_base_2buff_min_fortran_double_precision","ompi_op_base_2buff_min_fortran_integer","ompi_op_base_2buff_min_fortran_integer1","ompi_op_base_2buff_min_fortran_integer2","ompi_op_base_2buff_min_fortran_integer4","ompi_op_base_2buff_min_fortran_integer8","ompi_op_base_2buff_min_fortran_real","ompi_op_base_2buff_min_fortran_real16","ompi_op_base_2buff_min_fortran_real4","ompi_op_base_2buff_min_fortran_real8","ompi_op_base_2buff_min_int16_t","ompi_op_base_2buff_min_int32_t","ompi_op_base_2buff_min_int64_t","ompi_op_base_2buff_min_int8_t","ompi_op_base_2buff_min_long","ompi_op_base_2buff_min_long_double","ompi_op_base_2buff_min_uint16_t","ompi_op_base_2buff_min_uint32_t","ompi_op_base_2buff_min_uint64_t","ompi_op_base_2buff_min_uint8_t","ompi_op_base_2buff_min_unsigned_long","ompi_op_base_2buff_minloc_2double_precision","ompi_op_base_2buff_minloc_2int","ompi_op_base_2buff_minloc_2integer","ompi_op_base_2buff_minloc_2real","ompi_op_base_2buff_minloc_double_int","ompi_op_base_2buff_minloc_float_int","ompi_op_base_2buff_minloc_long_double_int","ompi_op_base_2buff_minloc_long_int","ompi_op_base_2buff_minloc_short_int","ompi_op_base_2buff_prod_c_double_complex","ompi_op_base_2buff_prod_c_float_complex","ompi_op_base_2buff_prod_c_long_double_complex","ompi_op_base_2buff_prod_double","ompi_op_base_2buff_prod_float","ompi_op_base_2buff_prod_fortran_double_precision","ompi_op_base_2buff_prod_fortran_integer","ompi_op_base_2buff_prod_fortran_integer1","ompi_op_base_2buff_prod_fortran_integer2","ompi_op_base_2buff_prod_fortran_integer4","ompi_op_base_2buff_prod_fortran_integer8","ompi_op_base_2buff_prod_fortran_real","ompi_op_base_2buff_prod_fortran_real16","ompi_op_base_2buff_prod_fortran_real4","ompi_op_base_2buff_prod_fortran_real8","ompi_op_base_2buff_prod_int16_t","ompi_op_base_2buff_prod_int32_t","ompi_op_base_2buff_prod_int64_t","ompi_op_base_2buff_prod_int8_t","ompi_op_base_2buff_prod_long","ompi_op_base_2buff_prod_long_double","ompi_op_base_2buff_prod_uint16_t","ompi_op_base_2buff_prod_uint32_t","ompi_op_base_2buff_prod_uint64_t","ompi_op_base_2buff_prod_uint8_t","ompi_op_base_2buff_prod_unsigned_long","ompi_op_base_2buff_sum_c_double_complex","ompi_op_base_2buff_sum_c_float_complex","ompi_op_base_2buff_sum_c_long_double_complex","ompi_op_base_2buff_sum_double","ompi_op_base_2buff_sum_float","ompi_op_base_2buff_sum_fortran_double_precision","ompi_op_base_2buff_sum_fortran_integer","ompi_op_base_2buff_sum_fortran_integer1","ompi_op_base_2buff_sum_fortran_integer2","ompi_op_base_2buff_sum_fortran_integer4","ompi_op_base_2buff_sum_fortran_integer8","ompi_op_base_2buff_sum_fortran_real","ompi_op_base_2buff_sum_fortran_real16","ompi_op_base_2buff_sum_fortran_real4","ompi_op_base_2buff_sum_fortran_real8","ompi_op_base_2buff_sum_int16_t","ompi_op_base_2buff_sum_int32_t","ompi_op_base_2buff_sum_int64_t","ompi_op_base_2buff_sum_int8_t","ompi_op_base_2buff_sum_long","ompi_op_base_2buff_sum_long_double","ompi_op_base_2buff_sum_uint16_t","ompi_op_base_2buff_sum_uint32_t","ompi_op_base_2buff_sum_uint64_t","ompi_op_base_2buff_sum_uint8_t","ompi_op_base_2buff_sum_unsigned_long","ompi_op_base_3buff_band_byte","ompi_op_base_3buff_band_fortran_integer","ompi_op_base_3buff_band_fortran_integer1","ompi_op_base_3buff_band_fortran_integer2","ompi_op_base_3buff_band_fortran_integer4","ompi_op_base_3buff_band_fortran_integer8","ompi_op_base_3buff_band_int16_t","ompi_op_base_3buff_band_int32_t","ompi_op_base_3buff_band_int64_t","ompi_op_base_3buff_band_int8_t","ompi_op_base_3buff_band_long","ompi_op_base_3buff_band_uint16_t","ompi_op_base_3buff_band_uint32_t","ompi_op_base_3buff_band_uint64_t","ompi_op_base_3buff_band_uint8_t","ompi_op_base_3buff_band_unsigned_long","ompi_op_base_3buff_bor_byte","ompi_op_base_3buff_bor_fortran_integer","ompi_op_base_3buff_bor_fortran_integer1","ompi_op_base_3buff_bor_fortran_integer2","ompi_op_base_3buff_bor_fortran_integer4","ompi_op_base_3buff_bor_fortran_integer8","ompi_op_base_3buff_bor_int16_t","ompi_op_base_3buff_bor_int32_t","ompi_op_base_3buff_bor_int64_t","ompi_op_base_3buff_bor_int8_t","ompi_op_base_3buff_bor_long","ompi_op_base_3buff_bor_uint16_t","ompi_op_base_3buff_bor_uint32_t","ompi_op_base_3buff_bor_uint64_t","ompi_op_base_3buff_bor_uint8_t","ompi_op_base_3buff_bor_unsigned_long","ompi_op_base_3buff_bxor_byte","ompi_op_base_3buff_bxor_fortran_integer","ompi_op_base_3buff_bxor_fortran_integer1","ompi_op_base_3buff_bxor_fortran_integer2","ompi_op_base_3buff_bxor_fortran_integer4","ompi_op_base_3buff_bxor_fortran_integer8","ompi_op_base_3buff_bxor_int16_t","ompi_op_base_3buff_bxor_int32_t","ompi_op_base_3buff_bxor_int64_t","ompi_op_base_3buff_bxor_int8_t","ompi_op_base_3buff_bxor_long","ompi_op_base_3buff_bxor_uint16_t","ompi_op_base_3buff_bxor_uint32_t","ompi_op_base_3buff_bxor_uint64_t","ompi_op_base_3buff_bxor_uint8_t","ompi_op_base_3buff_bxor_unsigned_long","ompi_op_base_3buff_land_bool","ompi_op_base_3buff_land_fortran_logical","ompi_op_base_3buff_land_int16_t","ompi_op_base_3buff_land_int32_t","ompi_op_base_3buff_land_int64_t","ompi_op_base_3buff_land_int8_t","ompi_op_base_3buff_land_long","ompi_op_base_3buff_land_uint16_t","ompi_op_base_3buff_land_uint32_t","ompi_op_base_3buff_land_uint64_t","ompi_op_base_3buff_land_uint8_t","ompi_op_base_3buff_land_unsigned_long","ompi_op_base_3buff_lor_bool","ompi_op_base_3buff_lor_fortran_logical","ompi_op_base_3buff_lor_int16_t","ompi_op_base_3buff_lor_int32_t","ompi_op_base_3buff_lor_int64_t","ompi_op_base_3buff_lor_int8_t","ompi_op_base_3buff_lor_long","ompi_op_base_3buff_lor_uint16_t","ompi_op_base_3buff_lor_uint32_t","ompi_op_base_3buff_lor_uint64_t","ompi_op_base_3buff_lor_uint8_t","ompi_op_base_3buff_lor_unsigned_long","ompi_op_base_3buff_lxor_bool","ompi_op_base_3buff_lxor_fortran_logical","ompi_op_base_3buff_lxor_int16_t","ompi_op_base_3buff_lxor_int32_t","ompi_op_base_3buff_lxor_int64_t","ompi_op_base_3buff_lxor_int8_t","ompi_op_base_3buff_lxor_long","ompi_op_base_3buff_lxor_uint16_t","ompi_op_base_3buff_lxor_uint32_t","ompi_op_base_3buff_lxor_uint64_t","ompi_op_base_3buff_lxor_uint8_t","ompi_op_base_3buff_lxor_unsigned_long","ompi_op_base_3buff_max_double","ompi_op_base_3buff_max_float","ompi_op_base_3buff_max_fortran_double_precision","ompi_op_base_3buff_max_fortran_integer","ompi_op_base_3buff_max_fortran_integer1","ompi_op_base_3buff_max_fortran_integer2","ompi_op_base_3buff_max_fortran_integer4","ompi_op_base_3buff_max_fortran_integer8","ompi_op_base_3buff_max_fortran_real","ompi_op_base_3buff_max_fortran_real16","ompi_op_base_3buff_max_fortran_real4","ompi_op_base_3buff_max_fortran_real8","ompi_op_base_3buff_max_int16_t","ompi_op_base_3buff_max_int32_t","ompi_op_base_3buff_max_int64_t","ompi_op_base_3buff_max_int8_t","ompi_op_base_3buff_max_long","ompi_op_base_3buff_max_long_double","ompi_op_base_3buff_max_uint16_t","ompi_op_base_3buff_max_uint32_t","ompi_op_base_3buff_max_uint64_t","ompi_op_base_3buff_max_uint8_t","ompi_op_base_3buff_max_unsigned_long","ompi_op_base_3buff_maxloc_2double_precision","ompi_op_base_3buff_maxloc_2int","ompi_op_base_3buff_maxloc_2integer","ompi_op_base_3buff_maxloc_2real","ompi_op_base_3buff_maxloc_double_int","ompi_op_base_3buff_maxloc_float_int","ompi_op_base_3buff_maxloc_long_double_int","ompi_op_base_3buff_maxloc_long_int","ompi_op_base_3buff_maxloc_short_int","ompi_op_base_3buff_min_double","ompi_op_base_3buff_min_float","ompi_op_base_3buff_min_fortran_double_precision","ompi_op_base_3buff_min_fortran_integer","ompi_op_base_3buff_min_fortran_integer1","ompi_op_base_3buff_min_fortran_integer2","ompi_op_base_3buff_min_fortran_integer4","ompi_op_base_3buff_min_fortran_integer8","ompi_op_base_3buff_min_fortran_real","ompi_op_base_3buff_min_fortran_real16","ompi_op_base_3buff_min_fortran_real4","ompi_op_base_3buff_min_fortran_real8","ompi_op_base_3buff_min_int16_t","ompi_op_base_3buff_min_int32_t","ompi_op_base_3buff_min_int64_t","ompi_op_base_3buff_min_int8_t","ompi_op_base_3buff_min_long","ompi_op_base_3buff_min_long_double","ompi_op_base_3buff_min_uint16_t","ompi_op_base_3buff_min_uint32_t","ompi_op_base_3buff_min_uint64_t","ompi_op_base_3buff_min_uint8_t","ompi_op_base_3buff_min_unsigned_long","ompi_op_base_3buff_minloc_2double_precision","ompi_op_base_3buff_minloc_2int","ompi_op_base_3buff_minloc_2integer","ompi_op_base_3buff_minloc_2real","ompi_op_base_3buff_minloc_double_int","ompi_op_base_3buff_minloc_float_int","ompi_op_base_3buff_minloc_long_double_int","ompi_op_base_3buff_minloc_long_int","ompi_op_base_3buff_minloc_short_int","ompi_op_base_3buff_prod_c_double_complex","ompi_op_base_3buff_prod_c_float_complex","ompi_op_base_3buff_prod_c_long_double_complex","ompi_op_base_3buff_prod_double","ompi_op_base_3buff_prod_float","ompi_op_base_3buff_prod_fortran_double_precision","ompi_op_base_3buff_prod_fortran_integer","ompi_op_base_3buff_prod_fortran_integer1","ompi_op_base_3buff_prod_fortran_integer2","ompi_op_base_3buff_prod_fortran_integer4","ompi_op_base_3buff_prod_fortran_integer8","ompi_op_base_3buff_prod_fortran_real","ompi_op_base_3buff_prod_fortran_real16","ompi_op_base_3buff_prod_fortran_real4","ompi_op_base_3buff_prod_fortran_real8","ompi_op_base_3buff_prod_int16_t","ompi_op_base_3buff_prod_int32_t","ompi_op_base_3buff_prod_int64_t","ompi_op_base_3buff_prod_int8_t","ompi_op_base_3buff_prod_long","ompi_op_base_3buff_prod_long_double","ompi_op_base_3buff_prod_uint16_t","ompi_op_base_3buff_prod_uint32_t","ompi_op_base_3buff_prod_uint64_t","ompi_op_base_3buff_prod_uint8_t","ompi_op_base_3buff_prod_unsigned_long","ompi_op_base_3buff_sum_c_double_complex","ompi_op_base_3buff_sum_c_float_complex","ompi_op_base_3buff_sum_c_long_double_complex","ompi_op_base_3buff_sum_double","ompi_op_base_3buff_sum_float","ompi_op_base_3buff_sum_fortran_double_precision","ompi_op_base_3buff_sum_fortran_integer","ompi_op_base_3buff_sum_fortran_integer1","ompi_op_base_3buff_sum_fortran_integer2","ompi_op_base_3buff_sum_fortran_integer4","ompi_op_base_3buff_sum_fortran_integer8","ompi_op_base_3buff_sum_fortran_real","ompi_op_base_3buff_sum_fortran_real16","ompi_op_base_3buff_sum_fortran_real4","ompi_op_base_3buff_sum_fortran_real8","ompi_op_base_3buff_sum_int16_t","ompi_op_base_3buff_sum_int32_t","ompi_op_base_3buff_sum_int64_t","ompi_op_base_3buff_sum_int8_t","ompi_op_base_3buff_sum_long","ompi_op_base_3buff_sum_long_double","ompi_op_base_3buff_sum_uint16_t","ompi_op_base_3buff_sum_uint32_t","ompi_op_base_3buff_sum_uint64_t","ompi_op_base_3buff_sum_uint8_t","ompi_op_base_3buff_sum_unsigned_long","ompi_op_base_find_available","ompi_op_base_op_select","ompi_op_construct","ompi_op_create_user","ompi_op_destruct","ompi_op_finalize","ompi_op_init","ompi_op_reduce:0x103bf0","ompi_op_reduce:0x105a40","ompi_op_reduce:0x109a40","ompi_op_reduce:0x11a690","ompi_op_reduce:0x11d440","ompi_op_reduce:0x128cd0","ompi_op_reduce:0x153a70","ompi_op_reduce:0x15a800","ompi_op_reduce:0x15ce80","ompi_op_reduce:0x15ed30","ompi_op_reduce:0x1642a0","ompi_op_reduce:0x1c2ff0","ompi_op_reduce:0x1ce8e0","ompi_op_reduce:0x1e8750","ompi_op_reduce:0x5eb80","ompi_op_reduce:0xef780","ompi_op_reduce:0xf6ab0","ompi_op_reduce:0xfc2b0","ompi_op_reduce:0xff940","ompi_op_set_java_callback","ompi_osc_base_finalize","ompi_osc_base_find_available","ompi_osc_base_get_primitive_type_info","ompi_osc_base_process_op","ompi_osc_base_select","ompi_osc_base_set_memory_alignment","ompi_osc_base_sndrcv_op","ompi_osc_get_data_blocking","ompi_osc_get_data_complete","ompi_osc_module_add_peer","ompi_osc_monitoring_portals4_accumulate","ompi_osc_monitoring_portals4_attach","ompi_osc_monitoring_portals4_compare_and_swap","ompi_osc_monitoring_portals4_complete","ompi_osc_monitoring_portals4_detach","ompi_osc_monitoring_portals4_fence","ompi_osc_monitoring_portals4_fetch_and_op","ompi_osc_monitoring_portals4_flush","ompi_osc_monitoring_portals4_flush_all","ompi_osc_monitoring_portals4_flush_local","ompi_osc_monitoring_portals4_flush_local_all","ompi_osc_monitoring_portals4_free","ompi_osc_monitoring_portals4_get","ompi_osc_monitoring_portals4_get_accumulate","ompi_osc_monitoring_portals4_lock","ompi_osc_monitoring_portals4_lock_all","ompi_osc_monitoring_portals4_post","ompi_osc_monitoring_portals4_put","ompi_osc_monitoring_portals4_raccumulate","ompi_osc_monitoring_portals4_rget","ompi_osc_monitoring_portals4_rget_accumulate","ompi_osc_monitoring_portals4_rput","ompi_osc_monitoring_portals4_set_template","ompi_osc_monitoring_portals4_start","ompi_osc_monitoring_portals4_sync","ompi_osc_monitoring_portals4_test","ompi_osc_monitoring_portals4_unlock","ompi_osc_monitoring_portals4_unlock_all","ompi_osc_monitoring_portals4_wait","ompi_osc_monitoring_rdma_accumulate","ompi_osc_monitoring_rdma_attach","ompi_osc_monitoring_rdma_compare_and_swap","ompi_osc_monitoring_rdma_complete","ompi_osc_monitoring_rdma_detach","ompi_osc_monitoring_rdma_fence","ompi_osc_monitoring_rdma_fetch_and_op","ompi_osc_monitoring_rdma_flush","ompi_osc_monitoring_rdma_flush_all","ompi_osc_monitoring_rdma_flush_local","ompi_osc_monitoring_rdma_flush_local_all","ompi_osc_monitoring_rdma_free","ompi_osc_monitoring_rdma_get","ompi_osc_monitoring_rdma_get_accumulate","ompi_osc_monitoring_rdma_lock","ompi_osc_monitoring_rdma_lock_all","ompi_osc_monitoring_rdma_post","ompi_osc_monitoring_rdma_put","ompi_osc_monitoring_rdma_raccumulate","ompi_osc_monitoring_rdma_rget","ompi_osc_monitoring_rdma_rget_accumulate","ompi_osc_monitoring_rdma_rput","ompi_osc_monitoring_rdma_set_template","ompi_osc_monitoring_rdma_start","ompi_osc_monitoring_rdma_sync","ompi_osc_monitoring_rdma_test","ompi_osc_monitoring_rdma_unlock","ompi_osc_monitoring_rdma_unlock_all","ompi_osc_monitoring_rdma_wait","ompi_osc_monitoring_sm_accumulate","ompi_osc_monitoring_sm_attach","ompi_osc_monitoring_sm_compare_and_swap","ompi_osc_monitoring_sm_complete","ompi_osc_monitoring_sm_detach","ompi_osc_monitoring_sm_fence","ompi_osc_monitoring_sm_fetch_and_op","ompi_osc_monitoring_sm_flush","ompi_osc_monitoring_sm_flush_all","ompi_osc_monitoring_sm_flush_local","ompi_osc_monitoring_sm_flush_local_all","ompi_osc_monitoring_sm_free","ompi_osc_monitoring_sm_get","ompi_osc_monitoring_sm_get_accumulate","ompi_osc_monitoring_sm_lock","ompi_osc_monitoring_sm_lock_all","ompi_osc_monitoring_sm_post","ompi_osc_monitoring_sm_put","ompi_osc_monitoring_sm_raccumulate","ompi_osc_monitoring_sm_rget","ompi_osc_monitoring_sm_rget_accumulate","ompi_osc_monitoring_sm_rput","ompi_osc_monitoring_sm_set_template","ompi_osc_monitoring_sm_start","ompi_osc_monitoring_sm_sync","ompi_osc_monitoring_sm_test","ompi_osc_monitoring_sm_unlock","ompi_osc_monitoring_sm_unlock_all","ompi_osc_monitoring_sm_wait","ompi_osc_monitoring_ucx_accumulate","ompi_osc_monitoring_ucx_attach","ompi_osc_monitoring_ucx_compare_and_swap","ompi_osc_monitoring_ucx_complete","ompi_osc_monitoring_ucx_detach","ompi_osc_monitoring_ucx_fence","ompi_osc_monitoring_ucx_fetch_and_op","ompi_osc_monitoring_ucx_flush","ompi_osc_monitoring_ucx_flush_all","ompi_osc_monitoring_ucx_flush_local","ompi_osc_monitoring_ucx_flush_local_all","ompi_osc_monitoring_ucx_free","ompi_osc_monitoring_ucx_get","ompi_osc_monitoring_ucx_get_accumulate","ompi_osc_monitoring_ucx_lock","ompi_osc_monitoring_ucx_lock_all","ompi_osc_monitoring_ucx_post","ompi_osc_monitoring_ucx_put","ompi_osc_monitoring_ucx_raccumulate","ompi_osc_monitoring_ucx_rget","ompi_osc_monitoring_ucx_rget_accumulate","ompi_osc_monitoring_ucx_rput","ompi_osc_monitoring_ucx_set_template","ompi_osc_monitoring_ucx_start","ompi_osc_monitoring_ucx_sync","ompi_osc_monitoring_ucx_test","ompi_osc_monitoring_ucx_unlock","ompi_osc_monitoring_ucx_unlock_all","ompi_osc_monitoring_ucx_wait","ompi_osc_rdma_accumulate","ompi_osc_rdma_add_attachment","ompi_osc_rdma_atomic_complete","ompi_osc_rdma_attach","ompi_osc_rdma_btl_op.constprop.0","ompi_osc_rdma_cas_put_complete","ompi_osc_rdma_check_posts","ompi_osc_rdma_compare_and_swap","ompi_osc_rdma_compare_and_swap.cold","ompi_osc_rdma_complete_atomic","ompi_osc_rdma_component_finalize","ompi_osc_rdma_component_init","ompi_osc_rdma_component_query","ompi_osc_rdma_component_register","ompi_osc_rdma_component_select","ompi_osc_rdma_demand_lock_peer","ompi_osc_rdma_detach","ompi_osc_rdma_fence_atomic","ompi_osc_rdma_fetch_and_op","ompi_osc_rdma_find_dynamic_region","ompi_osc_rdma_flush","ompi_osc_rdma_flush_all","ompi_osc_rdma_flush_local","ompi_osc_rdma_flush_local_all","ompi_osc_rdma_frag_alloc","ompi_osc_rdma_frag_alloc.constprop.0:0x1dafc0","ompi_osc_rdma_frag_alloc.constprop.0:0x1dd090","ompi_osc_rdma_frag_alloc.constprop.0:0x1e0770","ompi_osc_rdma_free","ompi_osc_rdma_gacc_amo.constprop.0","ompi_osc_rdma_gacc_master","ompi_osc_rdma_gacc_master_cleanup","ompi_osc_rdma_gacc_master_cleanup.cold","ompi_osc_rdma_get","ompi_osc_rdma_get_accumulate","ompi_osc_rdma_get_complete","ompi_osc_rdma_get_contig","ompi_osc_rdma_get_partial","ompi_osc_rdma_get_peers","ompi_osc_rdma_handle_fini","ompi_osc_rdma_handle_init","ompi_osc_rdma_initialize_region.isra.0","ompi_osc_rdma_lock_all_atomic","ompi_osc_rdma_lock_atomic","ompi_osc_rdma_lock_atomic_internal","ompi_osc_rdma_lock_release_exclusive.constprop.0.isra.0","ompi_osc_rdma_lock_release_exclusive.constprop.0.isra.0.cold","ompi_osc_rdma_master_noncontig","ompi_osc_rdma_new_peer","ompi_osc_rdma_new_peer.cold","ompi_osc_rdma_peer_accumulate_cleanup","ompi_osc_rdma_peer_accumulate_cleanup.cold","ompi_osc_rdma_peer_basic_construct","ompi_osc_rdma_peer_basic_destruct","ompi_osc_rdma_peer_btl_endpoint","ompi_osc_rdma_peer_construct","ompi_osc_rdma_peer_destruct","ompi_osc_rdma_peer_dynamic_construct","ompi_osc_rdma_peer_dynamic_destruct","ompi_osc_rdma_peer_lookup","ompi_osc_rdma_peer_setup","ompi_osc_rdma_pending_op_construct","ompi_osc_rdma_pending_op_destruct","ompi_osc_rdma_post_atomic","ompi_osc_rdma_put","ompi_osc_rdma_put_complete","ompi_osc_rdma_put_complete_flush","ompi_osc_rdma_put_contig","ompi_osc_rdma_pvar_read","ompi_osc_rdma_raccumulate","ompi_osc_rdma_release_peers","ompi_osc_rdma_request_complete:0x1c62b0","ompi_osc_rdma_request_complete:0x1cee10","ompi_osc_rdma_rget","ompi_osc_rdma_rget_accumulate","ompi_osc_rdma_rget_accumulate_internal","ompi_osc_rdma_rget_accumulate_internal.cold","ompi_osc_rdma_rput","ompi_osc_rdma_set_no_lock_info","ompi_osc_rdma_start_atomic","ompi_osc_rdma_sync","ompi_osc_rdma_sync_allocate","ompi_osc_rdma_sync_constructor","ompi_osc_rdma_sync_destructor","ompi_osc_rdma_sync_pscw_peer","ompi_osc_rdma_sync_return","ompi_osc_rdma_test_atomic","ompi_osc_rdma_unlock_all_atomic","ompi_osc_rdma_unlock_all_atomic.cold","ompi_osc_rdma_unlock_atomic","ompi_osc_rdma_unlock_atomic.cold","ompi_osc_rdma_wait_atomic","ompi_osc_sm_accumulate","ompi_osc_sm_attach","ompi_osc_sm_compare_and_swap","ompi_osc_sm_complete","ompi_osc_sm_detach","ompi_osc_sm_fence","ompi_osc_sm_fetch_and_op","ompi_osc_sm_flush","ompi_osc_sm_flush_all","ompi_osc_sm_flush_local","ompi_osc_sm_flush_local_all","ompi_osc_sm_free","ompi_osc_sm_get","ompi_osc_sm_get_accumulate","ompi_osc_sm_get_info","ompi_osc_sm_group_ranks","ompi_osc_sm_lock","ompi_osc_sm_lock_all","ompi_osc_sm_post","ompi_osc_sm_put","ompi_osc_sm_raccumulate","ompi_osc_sm_rget","ompi_osc_sm_rget_accumulate","ompi_osc_sm_rput","ompi_osc_sm_set_info","ompi_osc_sm_shared_query","ompi_osc_sm_start","ompi_osc_sm_sync","ompi_osc_sm_test","ompi_osc_sm_unlock","ompi_osc_sm_unlock_all","ompi_osc_sm_wait","ompi_pmix_print_id","ompi_pmix_print_name","ompi_pmix_snprintf_jobid","ompi_pml_ob1_append_frag_to_ordered_list","ompi_pml_ob1_check_cantmatch_for_match","ompi_pml_v_output_close","ompi_pml_v_output_open","ompi_proc_all","ompi_proc_allocate","ompi_proc_compare_vid","ompi_proc_complete_init","ompi_proc_complete_init_single","ompi_proc_construct","ompi_proc_destruct","ompi_proc_finalize","ompi_proc_find","ompi_proc_find_and_add","ompi_proc_for_name","ompi_proc_get_allocated","ompi_proc_init","ompi_proc_lookup","ompi_proc_pack","ompi_proc_refresh","ompi_proc_self","ompi_proc_unpack","ompi_proc_world","ompi_proc_world_size","ompi_rbcast_bml_send_complete_cb","ompi_report_comm_methods","ompi_request_check_same_instance","ompi_request_construct","ompi_request_default_test","ompi_request_default_test_all","ompi_request_default_test_any","ompi_request_default_test_some","ompi_request_default_wait","ompi_request_default_wait_all","ompi_request_default_wait_any","ompi_request_default_wait_some","ompi_request_destruct","ompi_request_empty_free","ompi_request_finalize","ompi_request_init","ompi_request_is_failed_fn","ompi_request_null_cancel","ompi_request_null_free","ompi_request_persistent_noop_create","ompi_request_persistent_noop_free","ompi_request_wait_completion:0x1f3e20","ompi_request_wait_completion:0x1f56c0","ompi_request_wait_completion:0x1f7c70","ompi_request_wait_completion:0x212b80","ompi_request_wait_completion:0x5d7f0","ompi_rounddown","ompi_rte_abort","ompi_rte_abort_peers","ompi_rte_breakpoint","ompi_rte_compare_name_fields","ompi_rte_convert_process_name_to_string","ompi_rte_convert_string_to_process_name","ompi_rte_finalize","ompi_rte_init","ompi_rte_wait_for_debugger","ompi_seq_tracker_check_duplicate","ompi_seq_tracker_construct","ompi_seq_tracker_copy","ompi_seq_tracker_destruct","ompi_seq_tracker_insert","ompi_set_group_rank","ompi_show_all_mca_params","ompi_test_fortran_constants","ompi_test_fortran_constants_","ompi_test_fortran_constants__","ompi_test_fortran_constants_f","ompi_type_dup_fn_f","ompi_type_null_copy_fn_f","ompi_type_null_delete_fn_f","ompi_vprotocol_pessimist_delivery_replay","ompi_vprotocol_pessimist_event_logger_connect","ompi_vprotocol_pessimist_event_logger_connect.cold","ompi_vprotocol_pessimist_event_logger_disconnect","ompi_vprotocol_pessimist_matching_replay","ompi_vprotocol_pessimist_sender_based_alloc","ompi_vprotocol_pessimist_sender_based_finalize","ompi_vprotocol_pessimist_sender_based_init","ompi_win_allocate","ompi_win_allocate_shared","ompi_win_construct","ompi_win_create","ompi_win_create_dynamic","ompi_win_destruct","ompi_win_dup_fn_f","ompi_win_finalize","ompi_win_free","ompi_win_get_name","ompi_win_group","ompi_win_init","ompi_win_null_copy_fn_f","ompi_win_null_delete_fn_f","ompi_win_set_name","ompit_opal_to_mpit_error","ompit_var_type_to_datatype","opal_free_list_wait","opal_free_list_wait.constprop.0:0x1f8730","opal_free_list_wait.constprop.0:0x1fbad0","open_component","optimize_arity","partial_aggregate_aff_mat","partial_exhaustive_search","partial_update_val","rankkeycompare","recurs_select_independent_groups","recv_cb:0x1613b0","recv_cb:0x1647d0","recv_request_pml_complete","reduce_inorder","register_component:0x1686b0","register_component:0x175430","register_component:0x17baa0","register_datarep","register_tm_clones","release_objs_callback","release_vecs_callback","request_cancel:0x127800","request_cancel:0x1da890","request_construct:0x127810","request_construct:0x1da8a0","request_free:0x127b50","request_free:0x1da910","request_start","result_request","retreive_size","retreive_size.cold","save_ptr","select_independent_groups","self_register","send_cb:0x160b60","send_cb:0x163f50","send_msg","send_msg.cold","send_request_pml_complete","set_handler_default","set_value","shuffle_init.constprop.0:0x16bb70","shuffle_init.constprop.0:0x16f180","sm_close","sm_module_enable","sm_register:0x108080","sm_register:0x215be0","sync_register","tab_cmp","tgt_to_tm","thread_loop","tm_bucket_grouping","tm_build_affinity_mat","tm_build_synthetic_topology","tm_build_tree_from_topology","tm_calloc","tm_close_verbose_file","tm_complete_obj_weight","tm_compute_mapping","tm_compute_nb_leaves_from_level","tm_create_work","tm_destroy_work","tm_display_arity","tm_display_other_heuristics","tm_display_solution","tm_display_tab","tm_display_topology","tm_enable_oversubscribing","tm_fiboTreeDel","tm_fiboTreeExit","tm_fiboTreeFree","tm_fiboTreeInit","tm_fiboTreeMin","tm_fill_tab","tm_finalize","tm_free","tm_free_affinity_mat","tm_free_solution","tm_free_topology","tm_free_tree","tm_genrand_int31","tm_genrand_int32","tm_genrand_real1","tm_genrand_real2","tm_genrand_real3","tm_genrand_res53","tm_get_exhaustive_search_flag","tm_get_greedy_flag","tm_get_local_topology_with_hwloc","tm_get_local_topology_with_hwloc.cold","tm_get_nb_threads","tm_get_numbering","tm_get_time","tm_get_verbose_level","tm_get_verbose_output","tm_in_tab","tm_init_genrand","tm_intCIV_get","tm_intCIV_init","tm_intCIV_isInitialized","tm_intCIV_set","tm_int_cmp_inc","tm_kPartitioning","tm_kpartition","tm_kpartition.cold","tm_kpartition_build_tree_from_topology","tm_load_aff_mat","tm_load_topology","tm_load_topology.cold","tm_malloc","tm_map_MPIPP","tm_map_Packed","tm_map_RR","tm_map_topology","tm_mem_check","tm_nb_processing_units","tm_new_affinity_mat","tm_open_verbose_file","tm_optimize_topology","tm_print_1D_tab","tm_realloc","tm_set_exhaustive_search_flag","tm_set_greedy_flag","tm_set_max_nb_threads","tm_set_node","tm_set_numbering","tm_set_verbose_level","tm_submit_work","tm_terminate_thread_pool","tm_test_main","tm_time_diff","tm_topology_add_binding_constraints","tm_topology_set_binding_constraints","tm_try_add_edge","tm_update_val","tm_wait_work_completion","treematch_module_constructor","treematch_module_destructor","tuned_close","tuned_module_enable","tuned_open","tuned_register","vprotocol_pessimist_delivery_log","vprotocol_pessimist_request_construct","vprotocol_pessimist_request_no_free","vulcan_register","weighted_degree_dsc","write_init","write_init.constprop.0"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/openmpi-5.0.7-y6xplmqxukxsuvvwnv2jqvztli5rhevm/lib/libmpi.so.40","include_offsets":false},{"type":2,"name":"ior","functions":["AllocResults","CheckFileSize","CheckForOutliers","CheckRunSettings","CompareBuffers","CountErrors","CreateTest","CurrentTimeString","DUMMY_Close","DUMMY_Create","DUMMY_Delete","DUMMY_Fsync","DUMMY_GetFileSize","DUMMY_Open","DUMMY_Sync","DUMMY_Xfer","DUMMY_access","DUMMY_check_params","DUMMY_getVersion","DUMMY_mkdir","DUMMY_options","DUMMY_rmdir","DUMMY_stat","DUMMY_statfs","DecodeDirective","DelaySecs","DestroyTest","DestroyTests","DisplayFreespace","DisplayOutliers","DistributeHints","DumpBuffer","ExtractHint","FailMessage","FillBuffer","FillIncompressibleBuffer","FreeResults","GetNumNodes","GetNumTasks","GetNumTasksOnNode0","GetOffsetArrayRandom","GetOffsetArraySequential","GetPlatformName","GetTestFileName","GetTimeStamp","HDF5_Access","HDF5_Close","HDF5_Create","HDF5_Delete","HDF5_Fsync","HDF5_GetFileSize","HDF5_GetVersion","HDF5_Open","HDF5_Xfer","HDF5_options","HogMemory","HumanReadable","InitTests","MMAP_Close","MMAP_Create","MMAP_Fsync","MMAP_Open","MMAP_Xfer","MMAP_options","MPIIO_Access","MPIIO_Close","MPIIO_Create","MPIIO_Delete","MPIIO_Fsync","MPIIO_GetFileSize","MPIIO_GetVersion","MPIIO_Open","MPIIO_Xfer","NodeMemoryStringToBytes","POSIX_Close","POSIX_Create","POSIX_Delete","POSIX_Fsync","POSIX_GetFileSize","POSIX_Mknod","POSIX_Open","POSIX_Sync","POSIX_Xfer","POSIX_options","PPDouble","ParseCommandLine","ParseFileName","ParseLine","PrependDir","PrintArrayEnd","PrintArrayNamedStart","PrintArrayStart","PrintEndSection","PrintHeader","PrintIndent","PrintKeyVal","PrintKeyValDouble","PrintKeyValEnd","PrintKeyValInt","PrintKeyValStart","PrintLongSummaryAllTests","PrintLongSummaryHeader","PrintLongSummaryOneOperation","PrintLongSummaryOneTest","PrintNamedArrayStart","PrintNamedSectionStart","PrintNextToken","PrintReducedResult","PrintRemoveTiming","PrintRepeatEnd","PrintRepeatStart","PrintShortSummary","PrintStartSection","PrintTableHeader","PrintTestEnds","PrintTimestamp","QueryNodeMapping","ReadConfigScript","ReadStoneWallingIterations","ReduceIterResults","Regex","RemoveFile","SeedRandGen","SetHints","SetupDataSet","ShowFileSystemSize","ShowHints","ShowSetup","ShowTestEnd","ShowTestStart","StoreStoneWallingIterations","StringToBytes","TestIoSys","TimeDeviation","ValidateTests","WriteOrRead","WriteOrReadSingle","WriteTimes","XferBuffersFree","XferBuffersSetup","__do_global_dtors_aux","aiori_count","aiori_default","aiori_finalize","aiori_get_version","aiori_initialize","aiori_posix_access","aiori_posix_mkdir","aiori_posix_rmdir","aiori_posix_stat","aiori_posix_statfs","aiori_select","aiori_supported_apis","airoi_create_all_module_options","airoi_update_module_options","aligned_buffer_alloc","aligned_buffer_free","bw_ops_values","bw_values","contains_only","createGlobalOptions","decodeDirectiveWrapper","deregister_tm_clones","file_hits_histogram","frame_dummy","init_IOR_Param_t","init_clock","init_or_fini","init_or_fini_internal","ior_main","ior_mmap_file","ior_run","main","malloc_and_touch","mean_of_array_of_doubles","ops_values","option_parse","option_parse_key_value","option_parse_str","option_parse_token","option_print_current","option_print_help","print_current_option_section","print_help_section","print_option_value","print_value","register_tm_clones","safeMalloc","set_o_direct_flag","string_to_bytes","test_time_elapsed","updateParsedOptions"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/ior-3.3.0-ip47j26fw7xxfftdzjvy2h36phgcuypv/bin/ior","include_offsets":false}] +[{"type":4,"name":"custom1","functions":["openat","read","write","close","fallocate","fdatasync","flock","fsync","ftruncate","lseek","pread64","preadv","preadv2","pwrite64","pwritev","pwritev2","readahead","readv","writev","open","openat2"],"bpf_path":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c","start_event_id":100000,"process_header":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h","event_type":2},{"type":0,"name":"sys","functions":["access","chdir","close","close_range","copy_file_range","creat","dup","dup2","dup3","eventfd2","exit","exit_group","faccessat","faccessat2","fadvise64","fadvise64_64","fallocate","fanotify_init","fanotify_mark","fchdir","fchmod","fchmodat","fchmodat2","fchown","fchownat","fcntl","fdatasync","fgetxattr","flistxattr","flock","fremovexattr","fsetxattr","fstat","fstatfs","fstatfs64","fsync","ftruncate","getcwd","getdents","getxattr","inotify_add_watch","inotify_init","inotify_init1","inotify_rm_watch","io_cancel","io_destroy","io_setup","io_submit","io_uring_enter","io_uring_register","io_uring_setup","lgetxattr","link","linkat","listxattr","llistxattr","llseek","lremovexattr","lseek","lsetxattr","lstat","madvise","mbind","migrate_pages","mincore","mkdir","mkdirat","mknod","mknodat","mlock","mlockall","mmap_pgoff","move_pages","mprotect","mremap","msync","munlock","munlockall","munmap","newfstat","newlstat","newstat","open","openat","openat2","pidfd_open","pipe","pread64","preadv","preadv2","process_madvise","process_mrelease","process_vm_readv","process_vm_writev","pwrite64","pwritev","pwritev2","read","readlink","readlinkat","readv","remap_file_pages","removexattr","rename","renameat","rmdir","sendfile64","setxattr","stat","statfs","statfs64","statx","symlink","symlinkat","sync","sync_file_range","sync_file_range2","syncfs","sysfs","truncate","unlink","unlinkat","ustat","vfork","write","writev"]},{"type":2,"name":"libc","functions":["__GI___fork","__GI___register_atfork","__GI___vfork","__GI_forkpty","__dyn_pthread_atfork","__fork","__forkpty","__libc_fork","__libc_unwind_link_after_fork","__libc_vfork","__malloc_fork_lock_parent","__malloc_fork_unlock_child","__malloc_fork_unlock_parent","__mq_notify_fork_subprocess","__nss_database_fork_prepare_parent","__nss_database_fork_subprocess","__register_atfork","__run_postfork_handlers","__run_prefork_handlers","__timer_fork_subprocess","__unregister_atfork","__vfork","fork","pthread_atfork@GLIBC_2.2.5","vfork"],"binary_path":"/usr/lib64/libc.so.6","include_offsets":false},{"type":2,"name":"hdf5","functions":["H5AC__broadcast_clean_list_cb","H5AC__check_if_write_permitted","H5AC__copy_candidate_list_to_buffer.constprop.0","H5AC__copy_candidate_list_to_buffer_cb","H5AC__flush_entries","H5AC__log_cleaned_entry","H5AC__log_deleted_entry","H5AC__log_dirtied_entry","H5AC__log_flushed_entry","H5AC__log_inserted_entry","H5AC__log_moved_entry","H5AC__propagate_flushed_and_still_clean_entries_list","H5AC__proxy_entry_add_child_cb","H5AC__proxy_entry_free_icr","H5AC__proxy_entry_image_len","H5AC__proxy_entry_notify","H5AC__proxy_entry_remove_child_cb","H5AC__proxy_entry_serialize","H5AC__receive_haddr_list","H5AC__run_sync_point","H5AC__set_sync_point_done_callback","H5AC__set_write_done_callback","H5AC_add_candidate","H5AC_cache_image_pending","H5AC_cork","H5AC_create","H5AC_create_flush_dependency","H5AC_dest","H5AC_destroy_flush_dependency","H5AC_evict","H5AC_evict_tagged_metadata","H5AC_expunge_entry","H5AC_expunge_tag_type_metadata","H5AC_flush","H5AC_flush_tagged_metadata","H5AC_get_cache_auto_resize_config","H5AC_get_cache_flush_in_progress","H5AC_get_cache_hit_rate","H5AC_get_cache_size","H5AC_get_entry_ring","H5AC_get_entry_status","H5AC_get_mdc_image_info","H5AC_get_tag","H5AC_ignore_tags","H5AC_init","H5AC_insert_entry","H5AC_load_cache_image_on_next_protect","H5AC_mark_entry_clean","H5AC_mark_entry_dirty","H5AC_mark_entry_serialized","H5AC_mark_entry_unserialized","H5AC_move_entry","H5AC_pin_protected_entry","H5AC_prep_for_file_close","H5AC_prep_for_file_flush","H5AC_protect","H5AC_proxy_entry_add_child","H5AC_proxy_entry_add_parent","H5AC_proxy_entry_create","H5AC_proxy_entry_dest","H5AC_proxy_entry_remove_child","H5AC_proxy_entry_remove_parent","H5AC_remove_entry","H5AC_reset_cache_hit_rate_stats","H5AC_resize_entry","H5AC_retag_copied_metadata","H5AC_secure_from_file_flush","H5AC_set_cache_auto_resize_config","H5AC_set_ring","H5AC_stats","H5AC_tag","H5AC_term_package","H5AC_unpin_entry","H5AC_unprotect","H5AC_unsettle_entry_ring","H5AC_unsettle_ring","H5AC_validate_cache_image_config","H5AC_validate_config","H5A__attr_cmp_corder_dec","H5A__attr_cmp_corder_inc","H5A__attr_cmp_name_dec","H5A__attr_cmp_name_inc","H5A__attr_copy_file","H5A__attr_iterate_table","H5A__attr_post_copy_file","H5A__attr_release_table","H5A__close","H5A__close_cb","H5A__compact_build_table","H5A__compact_build_table_cb","H5A__copy","H5A__create","H5A__create_api_common","H5A__create_by_name","H5A__create_by_name_api_common","H5A__delete_by_idx","H5A__delete_by_name","H5A__dense_btree2_corder_compare","H5A__dense_btree2_corder_debug","H5A__dense_btree2_corder_decode","H5A__dense_btree2_corder_encode","H5A__dense_btree2_corder_store","H5A__dense_btree2_name_compare","H5A__dense_btree2_name_debug","H5A__dense_btree2_name_decode","H5A__dense_btree2_name_encode","H5A__dense_btree2_name_store","H5A__dense_build_table","H5A__dense_build_table_cb","H5A__dense_copy_fh_cb","H5A__dense_create","H5A__dense_delete","H5A__dense_delete_bt2_cb","H5A__dense_exists","H5A__dense_fh_name_cmp","H5A__dense_fnd_cb","H5A__dense_insert","H5A__dense_iterate","H5A__dense_iterate_bt2_cb","H5A__dense_open","H5A__dense_post_copy_file_all","H5A__dense_post_copy_file_cb","H5A__dense_remove","H5A__dense_remove_bt2_cb","H5A__dense_remove_by_idx","H5A__dense_remove_by_idx_bt2_cb","H5A__dense_rename","H5A__dense_write","H5A__dense_write_bt2_cb","H5A__dense_write_bt2_cb2","H5A__exists_by_name","H5A__get_ainfo","H5A__get_create_plist","H5A__get_info","H5A__get_name","H5A__get_shared_rc_test","H5A__get_type","H5A__is_shared_test","H5A__iterate","H5A__iterate_old","H5A__open","H5A__open_by_idx","H5A__open_by_name","H5A__open_common:0x6a920","H5A__open_common:0x76bf0","H5A__read","H5A__rename_by_name","H5A__set_version","H5A__shared_free","H5A__write","H5A_get_space","H5A_init","H5A_nameof","H5A_oloc","H5A_term_package","H5A_top_term_package","H5A_type","H5Aclose","H5Aclose_async","H5Acreate1","H5Acreate2","H5Acreate_async","H5Acreate_by_name","H5Acreate_by_name_async","H5Adelete","H5Adelete_by_idx","H5Adelete_by_name","H5Aexists","H5Aexists_async","H5Aexists_by_name","H5Aexists_by_name_async","H5Aget_create_plist","H5Aget_info","H5Aget_info_by_idx","H5Aget_info_by_name","H5Aget_name","H5Aget_name_by_idx","H5Aget_num_attrs","H5Aget_space","H5Aget_storage_size","H5Aget_type","H5Aiterate1","H5Aiterate2","H5Aiterate_by_name","H5Aopen","H5Aopen_async","H5Aopen_by_idx","H5Aopen_by_idx_async","H5Aopen_by_name","H5Aopen_by_name_async","H5Aopen_idx","H5Aopen_name","H5Aread","H5Aread_async","H5Arename","H5Arename_async","H5Arename_by_name","H5Arename_by_name_async","H5Awrite","H5Awrite_async","H5B2__cache_hdr_deserialize","H5B2__cache_hdr_free_icr","H5B2__cache_hdr_get_initial_load_size","H5B2__cache_hdr_image_len","H5B2__cache_hdr_notify","H5B2__cache_hdr_serialize","H5B2__cache_hdr_verify_chksum","H5B2__cache_int_deserialize","H5B2__cache_int_free_icr","H5B2__cache_int_get_initial_load_size","H5B2__cache_int_image_len","H5B2__cache_int_notify","H5B2__cache_int_serialize","H5B2__cache_int_verify_chksum","H5B2__cache_leaf_deserialize","H5B2__cache_leaf_free_icr","H5B2__cache_leaf_get_initial_load_size","H5B2__cache_leaf_image_len","H5B2__cache_leaf_notify","H5B2__cache_leaf_serialize","H5B2__cache_leaf_verify_chksum","H5B2__create_flush_depend","H5B2__create_internal","H5B2__create_leaf","H5B2__delete_node","H5B2__delete_node.localalias","H5B2__destroy_flush_depend","H5B2__get_node_depth_test","H5B2__get_node_info_test","H5B2__get_root_addr_test","H5B2__hdr_alloc","H5B2__hdr_create","H5B2__hdr_debug","H5B2__hdr_decr","H5B2__hdr_delete","H5B2__hdr_dirty","H5B2__hdr_free","H5B2__hdr_fuse_decr","H5B2__hdr_fuse_incr","H5B2__hdr_incr","H5B2__hdr_init","H5B2__hdr_protect","H5B2__hdr_unprotect","H5B2__insert","H5B2__insert_internal","H5B2__insert_internal.localalias","H5B2__insert_leaf","H5B2__int_debug","H5B2__internal_free","H5B2__iterate_node","H5B2__iterate_node.localalias","H5B2__leaf_debug","H5B2__leaf_free","H5B2__locate_record","H5B2__merge2","H5B2__merge3","H5B2__neighbor_internal","H5B2__neighbor_internal.localalias","H5B2__neighbor_leaf","H5B2__node_size","H5B2__node_size.localalias","H5B2__protect_internal","H5B2__protect_leaf","H5B2__redistribute2","H5B2__redistribute3","H5B2__remove_internal","H5B2__remove_internal.localalias","H5B2__remove_internal_by_idx","H5B2__remove_internal_by_idx.localalias","H5B2__remove_leaf","H5B2__remove_leaf_by_idx","H5B2__shadow_internal","H5B2__shadow_leaf","H5B2__split1","H5B2__split_root","H5B2__swap_leaf","H5B2__test2_compare","H5B2__test2_debug","H5B2__test2_decode","H5B2__test2_encode","H5B2__test2_store","H5B2__test_compare","H5B2__test_crt_context","H5B2__test_debug","H5B2__test_decode","H5B2__test_dst_context","H5B2__test_encode","H5B2__test_store","H5B2__update_flush_depend","H5B2__update_internal","H5B2__update_internal.localalias","H5B2__update_leaf","H5B2_close","H5B2_create","H5B2_delete","H5B2_depend","H5B2_find","H5B2_get_addr","H5B2_get_nrec","H5B2_index","H5B2_insert","H5B2_iterate","H5B2_modify","H5B2_neighbor","H5B2_open","H5B2_patch_file","H5B2_remove","H5B2_remove_by_idx","H5B2_size","H5B2_stat_info","H5B2_update","H5B__cache_deserialize","H5B__cache_free_icr","H5B__cache_get_initial_load_size","H5B__cache_image_len","H5B__cache_serialize","H5B__get_info_helper","H5B__insert_helper","H5B__iterate_helper","H5B__node_dest","H5B__remove_helper","H5B__verify_structure","H5B_create","H5B_debug","H5B_delete","H5B_delete.localalias","H5B_find","H5B_find.localalias","H5B_get_info","H5B_insert","H5B_iterate","H5B_remove","H5B_shared_free","H5B_shared_new","H5B_valid","H5CX__pop_common","H5CX_free_state","H5CX_get_actual_selection_io_mode","H5CX_get_bkgr_buf","H5CX_get_bkgr_buf_type","H5CX_get_btree_split_ratios","H5CX_get_coll_metadata_read","H5CX_get_data_transform","H5CX_get_dset_min_ohdr_flag","H5CX_get_dt_conv_cb","H5CX_get_dxpl","H5CX_get_encoding","H5CX_get_err_detect","H5CX_get_ext_file_prefix","H5CX_get_filter_cb","H5CX_get_intermediate_group","H5CX_get_io_xfer_mode","H5CX_get_lapl","H5CX_get_libver_bounds","H5CX_get_max_temp_buf","H5CX_get_modify_write_buf","H5CX_get_mpi_coll_datatypes","H5CX_get_mpi_file_flushing","H5CX_get_mpio_chunk_opt_mode","H5CX_get_mpio_chunk_opt_num","H5CX_get_mpio_chunk_opt_ratio","H5CX_get_mpio_coll_opt","H5CX_get_mpio_global_no_coll_cause","H5CX_get_mpio_local_no_coll_cause","H5CX_get_mpio_rank0_bcast","H5CX_get_nlinks","H5CX_get_no_selection_io_cause","H5CX_get_ohdr_flags","H5CX_get_ring","H5CX_get_selection_io_mode","H5CX_get_tag","H5CX_get_tconv_buf","H5CX_get_vds_prefix","H5CX_get_vec_size","H5CX_get_vlen_alloc_info","H5CX_get_vol_connector_prop","H5CX_get_vol_wrap_ctx","H5CX_init","H5CX_is_def_dxpl","H5CX_pop","H5CX_push","H5CX_push_special","H5CX_pushed","H5CX_restore_state","H5CX_retrieve_state","H5CX_set_actual_selection_io_mode","H5CX_set_apl","H5CX_set_coll_metadata_read","H5CX_set_dcpl","H5CX_set_dxpl","H5CX_set_io_xfer_mode","H5CX_set_lapl","H5CX_set_lcpl","H5CX_set_libver_bounds","H5CX_set_loc","H5CX_set_mpi_coll_datatypes","H5CX_set_mpi_file_flushing","H5CX_set_mpio_actual_chunk_opt","H5CX_set_mpio_actual_io_mode","H5CX_set_mpio_coll_opt","H5CX_set_mpio_global_no_coll_cause","H5CX_set_mpio_local_no_coll_cause","H5CX_set_mpio_rank0_bcast","H5CX_set_nlinks","H5CX_set_no_selection_io_cause","H5CX_set_ring","H5CX_set_tag","H5CX_set_vlen_alloc_info","H5CX_set_vol_connector_prop","H5CX_set_vol_wrap_ctx","H5CX_term_package","H5C__auto_adjust_cache_size","H5C__autoadjust__ageout__remove_all_markers","H5C__autoadjust__ageout__remove_excess_markers","H5C__epoch_marker_deserialize","H5C__epoch_marker_free_icr","H5C__epoch_marker_fsf_size","H5C__epoch_marker_get_final_load_size","H5C__epoch_marker_get_initial_load_size","H5C__epoch_marker_image_len","H5C__epoch_marker_notify","H5C__epoch_marker_pre_serialize","H5C__epoch_marker_serialize","H5C__epoch_marker_verify_chksum","H5C__evict_tagged_entries_cb","H5C__expunge_tag_type_metadata_cb","H5C__flash_increase_cache_size","H5C__flush_invalidate_cache","H5C__flush_ring","H5C__flush_single_entry","H5C__flush_tagged_entries_cb","H5C__generate_cache_image","H5C__generate_image","H5C__get_cache_image_config","H5C__image_entry_cmp","H5C__image_stats","H5C__iter_tagged_entries","H5C__iter_tagged_entries_real","H5C__json_tear_down_logging","H5C__json_write_create_cache_log_msg","H5C__json_write_create_fd_log_msg","H5C__json_write_destroy_cache_log_msg","H5C__json_write_destroy_fd_log_msg","H5C__json_write_evict_cache_log_msg","H5C__json_write_expunge_entry_log_msg","H5C__json_write_flush_cache_log_msg","H5C__json_write_insert_entry_log_msg","H5C__json_write_mark_entry_clean_log_msg","H5C__json_write_mark_entry_dirty_log_msg","H5C__json_write_mark_serialized_entry_log_msg","H5C__json_write_mark_unserialized_entry_log_msg","H5C__json_write_move_entry_log_msg","H5C__json_write_pin_entry_log_msg","H5C__json_write_protect_entry_log_msg","H5C__json_write_remove_entry_log_msg","H5C__json_write_resize_entry_log_msg","H5C__json_write_set_cache_config_log_msg","H5C__json_write_start_log_msg","H5C__json_write_stop_log_msg","H5C__json_write_unpin_entry_log_msg","H5C__json_write_unprotect_entry_log_msg","H5C__load_cache_image","H5C__log_json_set_up","H5C__log_trace_set_up","H5C__make_space_in_cache","H5C__pin_entry_from_client.part.0","H5C__prefetched_entry_deserialize","H5C__prefetched_entry_free_icr","H5C__prefetched_entry_fsf_size","H5C__prefetched_entry_get_final_load_size","H5C__prefetched_entry_get_initial_load_size","H5C__prefetched_entry_image_len","H5C__prefetched_entry_notify","H5C__prefetched_entry_pre_serialize","H5C__prefetched_entry_serialize","H5C__prefetched_entry_verify_chksum","H5C__prep_for_file_close__compute_fd_heights_real","H5C__prep_image_for_file_close","H5C__serialize_cache","H5C__serialize_single_entry","H5C__tag_entry","H5C__trace_tear_down_logging","H5C__trace_write_create_fd_log_msg","H5C__trace_write_destroy_fd_log_msg","H5C__trace_write_expunge_entry_log_msg","H5C__trace_write_flush_cache_log_msg","H5C__trace_write_insert_entry_log_msg","H5C__trace_write_mark_entry_clean_log_msg","H5C__trace_write_mark_entry_dirty_log_msg","H5C__trace_write_mark_serialized_entry_log_msg","H5C__trace_write_mark_unserialized_entry_log_msg","H5C__trace_write_move_entry_log_msg","H5C__trace_write_pin_entry_log_msg","H5C__trace_write_protect_entry_log_msg","H5C__trace_write_remove_entry_log_msg","H5C__trace_write_resize_entry_log_msg","H5C__trace_write_set_cache_config_log_msg","H5C__trace_write_unpin_entry_log_msg","H5C__trace_write_unprotect_entry_log_msg","H5C__unpin_entry_from_client","H5C__untag_entry","H5C__verify_cork_tag_test","H5C__verify_cork_tag_test_cb","H5C__verify_len_eoa.isra.0","H5C_apply_candidate_list","H5C_cache_image_pending","H5C_cache_image_status","H5C_clear_coll_entries","H5C_construct_candidate_list__clean_cache","H5C_construct_candidate_list__min_clean","H5C_cork","H5C_create","H5C_create_flush_dependency","H5C_def_auto_resize_rpt_fcn","H5C_dest","H5C_destroy_flush_dependency","H5C_evict","H5C_evict_tagged_entries","H5C_expunge_entry","H5C_expunge_tag_type_metadata","H5C_flush_cache","H5C_flush_tagged_entries","H5C_flush_to_min_clean","H5C_get_aux_ptr","H5C_get_cache_auto_resize_config","H5C_get_cache_flush_in_progress","H5C_get_cache_hit_rate","H5C_get_cache_size","H5C_get_entry_ring","H5C_get_entry_status","H5C_get_evictions_enabled","H5C_get_ignore_tags","H5C_get_logging_status","H5C_get_mdc_image_info","H5C_get_num_objs_corked","H5C_get_tag","H5C_ignore_tags","H5C_insert_entry","H5C_load_cache_image_on_next_protect","H5C_log_set_up","H5C_log_tear_down","H5C_log_write_create_cache_msg","H5C_log_write_create_fd_msg","H5C_log_write_destroy_cache_msg","H5C_log_write_destroy_fd_msg","H5C_log_write_evict_cache_msg","H5C_log_write_expunge_entry_msg","H5C_log_write_flush_cache_msg","H5C_log_write_insert_entry_msg","H5C_log_write_mark_entry_clean_msg","H5C_log_write_mark_entry_dirty_msg","H5C_log_write_mark_serialized_entry_msg","H5C_log_write_mark_unserialized_entry_msg","H5C_log_write_move_entry_msg","H5C_log_write_pin_entry_msg","H5C_log_write_protect_entry_msg","H5C_log_write_remove_entry_msg","H5C_log_write_resize_entry_msg","H5C_log_write_set_cache_config_msg","H5C_log_write_unpin_entry_msg","H5C_log_write_unprotect_entry_msg","H5C_mark_entries_as_clean","H5C_mark_entry_clean","H5C_mark_entry_dirty","H5C_mark_entry_serialized","H5C_mark_entry_unserialized","H5C_move_entry","H5C_pin_protected_entry","H5C_prep_for_file_close","H5C_protect","H5C_remove_entry","H5C_reset_cache_hit_rate_stats","H5C_resize_entry","H5C_retag_entries","H5C_set_cache_auto_resize_config","H5C_set_cache_image_config","H5C_set_evictions_enabled","H5C_set_prefix","H5C_set_slist_enabled","H5C_start_logging","H5C_stats","H5C_stats__reset","H5C_stop_logging","H5C_unpin_entry","H5C_unprotect","H5C_unsettle_entry_ring","H5C_unsettle_ring","H5C_validate_cache_image_config","H5C_validate_resize_config","H5D__alloc_storage","H5D__append_flush_setup.part.0","H5D__bt2_compare","H5D__bt2_crt_context","H5D__bt2_dst_context","H5D__bt2_filt_debug","H5D__bt2_filt_decode","H5D__bt2_filt_encode","H5D__bt2_found_cb","H5D__bt2_idx_close","H5D__bt2_idx_copy_setup","H5D__bt2_idx_copy_shutdown","H5D__bt2_idx_create","H5D__bt2_idx_delete","H5D__bt2_idx_dest","H5D__bt2_idx_dump","H5D__bt2_idx_get_addr","H5D__bt2_idx_init","H5D__bt2_idx_insert","H5D__bt2_idx_is_open","H5D__bt2_idx_is_space_alloc","H5D__bt2_idx_iterate","H5D__bt2_idx_iterate_cb","H5D__bt2_idx_load_metadata","H5D__bt2_idx_open","H5D__bt2_idx_remove","H5D__bt2_idx_reset","H5D__bt2_idx_size","H5D__bt2_mod_cb","H5D__bt2_remove_cb","H5D__bt2_store","H5D__bt2_unfilt_debug","H5D__bt2_unfilt_decode","H5D__bt2_unfilt_encode","H5D__btree2_idx_depend","H5D__btree_cmp2","H5D__btree_cmp3","H5D__btree_debug_key","H5D__btree_decode_key","H5D__btree_encode_key","H5D__btree_found","H5D__btree_get_shared","H5D__btree_idx_close","H5D__btree_idx_copy_setup","H5D__btree_idx_copy_shutdown","H5D__btree_idx_create","H5D__btree_idx_delete","H5D__btree_idx_dest","H5D__btree_idx_dump","H5D__btree_idx_get_addr","H5D__btree_idx_init","H5D__btree_idx_insert","H5D__btree_idx_is_open","H5D__btree_idx_is_space_alloc","H5D__btree_idx_iterate","H5D__btree_idx_iterate_cb","H5D__btree_idx_load_metadata","H5D__btree_idx_open","H5D__btree_idx_remove","H5D__btree_idx_reset","H5D__btree_idx_size","H5D__btree_insert","H5D__btree_new_node","H5D__btree_remove","H5D__btree_shared_create","H5D__btree_shared_free","H5D__build_file_prefix.isra.0","H5D__cache_dataspace_info","H5D__chunk_addrmap","H5D__chunk_addrmap_cb","H5D__chunk_allocate","H5D__chunk_allocated","H5D__chunk_allocated_cb","H5D__chunk_bh_info","H5D__chunk_cache_evict","H5D__chunk_cache_evict.constprop.0","H5D__chunk_cacheable","H5D__chunk_cmp_coll_fill_info","H5D__chunk_construct","H5D__chunk_copy","H5D__chunk_copy_cb","H5D__chunk_create","H5D__chunk_delete","H5D__chunk_dest","H5D__chunk_direct_read","H5D__chunk_direct_write","H5D__chunk_dump_index","H5D__chunk_dump_index_cb","H5D__chunk_file_alloc","H5D__chunk_flush","H5D__chunk_flush_entry","H5D__chunk_flush_entry.constprop.0","H5D__chunk_format_convert","H5D__chunk_format_convert_cb","H5D__chunk_get_offset_copy","H5D__chunk_index_empty","H5D__chunk_index_empty_cb","H5D__chunk_init","H5D__chunk_io_init","H5D__chunk_io_term","H5D__chunk_is_data_cached","H5D__chunk_is_partial_edge_chunk","H5D__chunk_is_space_alloc","H5D__chunk_iter","H5D__chunk_iter_cb","H5D__chunk_lock.constprop.0","H5D__chunk_lookup","H5D__chunk_mdio_init","H5D__chunk_mem_alloc","H5D__chunk_mem_free","H5D__chunk_mem_realloc","H5D__chunk_mem_xfree","H5D__chunk_prune_by_extent","H5D__chunk_read","H5D__chunk_set_info","H5D__chunk_set_info_real","H5D__chunk_set_sizes","H5D__chunk_unlock.constprop.0","H5D__chunk_update_cache","H5D__chunk_update_old_edge_chunks","H5D__chunk_write","H5D__close_cb","H5D__cmp_chunk_redistribute_info","H5D__cmp_chunk_redistribute_info_orig_owner","H5D__cmp_filtered_collective_io_info_entry","H5D__cmp_piece_addr","H5D__collective_read","H5D__collective_write","H5D__compact_construct","H5D__compact_copy","H5D__compact_dest","H5D__compact_fill","H5D__compact_flush","H5D__compact_init","H5D__compact_io_init","H5D__compact_iovv_memmanage_cb","H5D__compact_is_space_alloc","H5D__compact_readvv","H5D__compact_writevv","H5D__compound_opt_read","H5D__contig_alloc","H5D__contig_check","H5D__contig_construct","H5D__contig_copy","H5D__contig_delete","H5D__contig_fill","H5D__contig_flush","H5D__contig_init","H5D__contig_io_init","H5D__contig_io_term","H5D__contig_is_data_cached","H5D__contig_is_space_alloc","H5D__contig_mdio_init","H5D__contig_read","H5D__contig_readvv","H5D__contig_readvv_cb","H5D__contig_readvv_sieve_cb","H5D__contig_write","H5D__contig_writevv","H5D__contig_writevv_cb","H5D__contig_writevv_sieve_cb","H5D__create","H5D__create_named","H5D__current_cache_size_test","H5D__earray_crt_context","H5D__earray_crt_dbg_context","H5D__earray_debug","H5D__earray_decode","H5D__earray_dst_context","H5D__earray_dst_dbg_context","H5D__earray_encode","H5D__earray_fill","H5D__earray_filt_debug","H5D__earray_filt_decode","H5D__earray_filt_encode","H5D__earray_filt_fill","H5D__earray_idx_close","H5D__earray_idx_copy_setup","H5D__earray_idx_copy_shutdown","H5D__earray_idx_create","H5D__earray_idx_delete","H5D__earray_idx_delete_cb","H5D__earray_idx_depend","H5D__earray_idx_dest","H5D__earray_idx_dump","H5D__earray_idx_get_addr","H5D__earray_idx_init","H5D__earray_idx_insert","H5D__earray_idx_is_open","H5D__earray_idx_is_space_alloc","H5D__earray_idx_iterate","H5D__earray_idx_iterate_cb","H5D__earray_idx_load_metadata","H5D__earray_idx_open","H5D__earray_idx_remove","H5D__earray_idx_reset","H5D__earray_idx_resize","H5D__earray_idx_size","H5D__efl_bh_info","H5D__efl_construct","H5D__efl_init","H5D__efl_io_init","H5D__efl_is_space_alloc","H5D__efl_readvv","H5D__efl_readvv_cb","H5D__efl_writevv","H5D__efl_writevv_cb","H5D__farray_crt_context","H5D__farray_crt_dbg_context","H5D__farray_debug","H5D__farray_decode","H5D__farray_dst_context","H5D__farray_dst_dbg_context","H5D__farray_encode","H5D__farray_fill","H5D__farray_filt_debug","H5D__farray_filt_decode","H5D__farray_filt_encode","H5D__farray_filt_fill","H5D__farray_idx_close","H5D__farray_idx_copy_setup","H5D__farray_idx_copy_shutdown","H5D__farray_idx_create","H5D__farray_idx_delete","H5D__farray_idx_delete_cb","H5D__farray_idx_depend","H5D__farray_idx_dest","H5D__farray_idx_dump","H5D__farray_idx_get_addr","H5D__farray_idx_init","H5D__farray_idx_insert","H5D__farray_idx_is_open","H5D__farray_idx_is_space_alloc","H5D__farray_idx_iterate","H5D__farray_idx_iterate_cb","H5D__farray_idx_load_metadata","H5D__farray_idx_open","H5D__farray_idx_remove","H5D__farray_idx_reset","H5D__farray_idx_size","H5D__fill","H5D__fill_init","H5D__fill_refill_vl","H5D__fill_term","H5D__flush","H5D__flush_all_cb","H5D__flush_real","H5D__flush_sieve_buf","H5D__format_convert","H5D__free_piece_info","H5D__gather_file","H5D__gather_mem","H5D__get_chunk_info","H5D__get_chunk_info_by_coord","H5D__get_chunk_info_by_coord_cb","H5D__get_chunk_info_cb","H5D__get_chunk_storage_size","H5D__get_num_chunks","H5D__get_num_chunks_cb","H5D__get_offset","H5D__get_space","H5D__get_space_status","H5D__get_storage_size","H5D__get_type","H5D__init_storage","H5D__inter_collective_io","H5D__ioinfo_adjust","H5D__layout_compact_dirty_test","H5D__layout_contig_size_test","H5D__layout_idx_type_test","H5D__layout_meta_size","H5D__layout_oh_create","H5D__layout_oh_read","H5D__layout_oh_write","H5D__layout_set_io_ops","H5D__layout_set_latest_indexing","H5D__layout_set_version","H5D__layout_type_test","H5D__layout_version_test","H5D__link_chunk_filtered_collective_io","H5D__link_piece_collective_io.constprop.0","H5D__mark","H5D__mpio_collective_filtered_chunk_read.constprop.0","H5D__mpio_collective_filtered_chunk_reinsert","H5D__mpio_collective_filtered_chunk_update","H5D__mpio_collective_filtered_vec_io","H5D__mpio_get_chunk_alloc_info_types.constprop.0","H5D__mpio_get_no_coll_cause_strings","H5D__mpio_opt_possible","H5D__mpio_redistribute_shared_chunks","H5D__mpio_select_read","H5D__mpio_select_write","H5D__mpio_share_chunk_modification_data.constprop.0","H5D__multi_chunk_collective_io","H5D__multi_chunk_filtered_collective_io.constprop.0","H5D__new","H5D__none_idx_close","H5D__none_idx_copy_setup","H5D__none_idx_create","H5D__none_idx_delete","H5D__none_idx_dump","H5D__none_idx_get_addr","H5D__none_idx_is_open","H5D__none_idx_is_space_alloc","H5D__none_idx_iterate","H5D__none_idx_load_metadata","H5D__none_idx_open","H5D__none_idx_remove","H5D__none_idx_reset","H5D__none_idx_size","H5D__nonexistent_readvv","H5D__nonexistent_readvv_cb","H5D__open_name","H5D__piece_file_cb","H5D__piece_io","H5D__piece_mem_cb","H5D__read","H5D__read_api_common","H5D__read_api_common.constprop.0","H5D__refresh","H5D__scatgath_read","H5D__scatgath_read_select","H5D__scatgath_write","H5D__scatgath_write_select","H5D__scatter_file","H5D__scatter_mem","H5D__select_io","H5D__select_read","H5D__select_write","H5D__set_extent","H5D__single_idx_close","H5D__single_idx_copy_setup","H5D__single_idx_create","H5D__single_idx_delete","H5D__single_idx_dump","H5D__single_idx_get_addr","H5D__single_idx_init","H5D__single_idx_insert","H5D__single_idx_is_open","H5D__single_idx_is_space_alloc","H5D__single_idx_iterate","H5D__single_idx_load_metadata","H5D__single_idx_open","H5D__single_idx_remove","H5D__single_idx_reset","H5D__single_idx_size","H5D__typeinfo_init","H5D__typeinfo_init_phase2","H5D__typeinfo_init_phase3.part.0","H5D__virtual_build_source_name.part.0","H5D__virtual_copy","H5D__virtual_copy_layout","H5D__virtual_copy_parsed_name","H5D__virtual_delete","H5D__virtual_flush","H5D__virtual_hold_source_dset_files","H5D__virtual_init","H5D__virtual_io_init","H5D__virtual_is_data_cached","H5D__virtual_is_space_alloc","H5D__virtual_open_source_dset","H5D__virtual_post_io","H5D__virtual_pre_io.isra.0","H5D__virtual_read","H5D__virtual_read_one","H5D__virtual_refresh_source_dset","H5D__virtual_refresh_source_dsets","H5D__virtual_release_source_dset_files","H5D__virtual_reset_layout","H5D__virtual_set_extent_unlim","H5D__virtual_store_layout","H5D__virtual_str_append","H5D__virtual_write","H5D__virtual_write_one","H5D__vlen_get_buf_size","H5D__vlen_get_buf_size_alloc","H5D__vlen_get_buf_size_cb","H5D__vlen_get_buf_size_gen","H5D__vlen_get_buf_size_gen_cb","H5D__write","H5D__write_api_common","H5D__write_api_common.constprop.0","H5D_btree_debug","H5D_chunk_idx_reset","H5D_close","H5D_close.localalias","H5D_flush_all","H5D_get_access_plist","H5D_get_create_plist","H5D_get_dcpl_id","H5D_init","H5D_mult_refresh_close","H5D_mult_refresh_reopen","H5D_nameof","H5D_oloc","H5D_open","H5D_select_io_mem","H5D_term_package","H5D_top_term_package","H5D_virtual_check_mapping_post","H5D_virtual_check_mapping_pre","H5D_virtual_check_min_dims","H5D_virtual_free_parsed_name","H5D_virtual_parse_source_name","H5D_virtual_update_min_dims","H5Dchunk_iter","H5Dclose","H5Dclose_async","H5Dcreate1","H5Dcreate2","H5Dcreate_anon","H5Dcreate_async","H5Ddebug","H5Dextend","H5Dfill","H5Dflush","H5Dformat_convert","H5Dgather","H5Dget_access_plist","H5Dget_chunk_index_type","H5Dget_chunk_info","H5Dget_chunk_info_by_coord","H5Dget_chunk_storage_size","H5Dget_create_plist","H5Dget_num_chunks","H5Dget_offset","H5Dget_space","H5Dget_space_async","H5Dget_space_status","H5Dget_storage_size","H5Dget_type","H5Diterate","H5Dopen1","H5Dopen2","H5Dopen_async","H5Dread","H5Dread_async","H5Dread_chunk","H5Dread_multi","H5Dread_multi_async","H5Drefresh","H5Dscatter","H5Dset_extent","H5Dset_extent_async","H5Dvlen_get_buf_size","H5Dvlen_reclaim","H5Dwrite","H5Dwrite_async","H5Dwrite_chunk","H5Dwrite_multi","H5Dwrite_multi_async","H5EA__cache_dblk_page_deserialize","H5EA__cache_dblk_page_free_icr","H5EA__cache_dblk_page_get_initial_load_size","H5EA__cache_dblk_page_image_len","H5EA__cache_dblk_page_notify","H5EA__cache_dblk_page_serialize","H5EA__cache_dblk_page_verify_chksum","H5EA__cache_dblock_deserialize","H5EA__cache_dblock_free_icr","H5EA__cache_dblock_fsf_size","H5EA__cache_dblock_get_initial_load_size","H5EA__cache_dblock_image_len","H5EA__cache_dblock_notify","H5EA__cache_dblock_serialize","H5EA__cache_dblock_verify_chksum","H5EA__cache_hdr_deserialize","H5EA__cache_hdr_free_icr","H5EA__cache_hdr_get_initial_load_size","H5EA__cache_hdr_image_len","H5EA__cache_hdr_notify","H5EA__cache_hdr_serialize","H5EA__cache_hdr_verify_chksum","H5EA__cache_iblock_deserialize","H5EA__cache_iblock_free_icr","H5EA__cache_iblock_get_initial_load_size","H5EA__cache_iblock_image_len","H5EA__cache_iblock_notify","H5EA__cache_iblock_serialize","H5EA__cache_iblock_verify_chksum","H5EA__cache_sblock_deserialize","H5EA__cache_sblock_free_icr","H5EA__cache_sblock_get_initial_load_size","H5EA__cache_sblock_image_len","H5EA__cache_sblock_notify","H5EA__cache_sblock_serialize","H5EA__cache_sblock_verify_chksum","H5EA__cmp_cparam_test","H5EA__create_flush_depend","H5EA__dblk_page_alloc","H5EA__dblk_page_create","H5EA__dblk_page_dest","H5EA__dblk_page_protect","H5EA__dblk_page_unprotect","H5EA__dblock_alloc","H5EA__dblock_create","H5EA__dblock_debug","H5EA__dblock_delete","H5EA__dblock_dest","H5EA__dblock_protect","H5EA__dblock_sblk_idx","H5EA__dblock_unprotect","H5EA__destroy_flush_depend","H5EA__get_cparam_test","H5EA__hdr_alloc","H5EA__hdr_alloc_elmts","H5EA__hdr_create","H5EA__hdr_debug","H5EA__hdr_decr","H5EA__hdr_delete","H5EA__hdr_dest","H5EA__hdr_free_elmts","H5EA__hdr_fuse_decr","H5EA__hdr_fuse_incr","H5EA__hdr_incr","H5EA__hdr_init","H5EA__hdr_modified","H5EA__hdr_protect","H5EA__hdr_unprotect","H5EA__iblock_alloc","H5EA__iblock_create","H5EA__iblock_debug","H5EA__iblock_delete","H5EA__iblock_dest","H5EA__iblock_protect","H5EA__iblock_unprotect","H5EA__lookup_elmt.constprop.0.isra.0","H5EA__sblock_alloc","H5EA__sblock_create","H5EA__sblock_debug","H5EA__sblock_delete","H5EA__sblock_dest","H5EA__sblock_protect","H5EA__sblock_unprotect","H5EA__test_crt_context","H5EA__test_crt_dbg_context","H5EA__test_debug","H5EA__test_decode","H5EA__test_dst_context","H5EA__test_dst_dbg_context","H5EA__test_encode","H5EA__test_fill","H5EA_close","H5EA_create","H5EA_delete","H5EA_depend","H5EA_get","H5EA_get_addr","H5EA_get_nelmts","H5EA_get_stats","H5EA_iterate","H5EA_open","H5EA_patch_file","H5EA_set","H5ES__cancel","H5ES__cancel_cb","H5ES__close_cb","H5ES__close_failed_cb","H5ES__create","H5ES__event_completed","H5ES__event_free","H5ES__event_new","H5ES__get_err_info","H5ES__get_err_info_cb","H5ES__get_requests","H5ES__get_requests_cb","H5ES__insert_request","H5ES__list_append","H5ES__list_count","H5ES__list_iterate","H5ES__list_remove","H5ES__op_complete","H5ES__wait","H5ES__wait_cb","H5ES_init","H5ES_insert","H5ES_term_package","H5EScancel","H5ESclose","H5EScreate","H5ESfree_err_info","H5ESget_count","H5ESget_err_count","H5ESget_err_info","H5ESget_err_status","H5ESget_op_counter","H5ESget_requests","H5ESinsert_request","H5ESregister_complete_func","H5ESregister_insert_func","H5ESwait","H5E__append_stack","H5E__clear_entries","H5E__clear_stack","H5E__close_msg","H5E__close_msg_cb","H5E__close_stack","H5E__create_msg","H5E__get_auto","H5E__get_class_name","H5E__get_current_stack","H5E__get_msg","H5E__get_num","H5E__pop","H5E__print","H5E__print2","H5E__push_stack","H5E__register_class","H5E__set_auto","H5E__set_current_stack","H5E__set_default_auto","H5E__unregister_class","H5E__walk","H5E__walk1_cb","H5E__walk2_cb","H5E_clear_stack","H5E_dump_api_stack","H5E_init","H5E_pause_stack","H5E_printf_stack","H5E_resume_stack","H5E_term_package","H5Eappend_stack","H5Eauto_is_v2","H5Eclear1","H5Eclear2","H5Eclose_msg","H5Eclose_stack","H5Ecreate_msg","H5Ecreate_stack","H5Eget_auto1","H5Eget_auto2","H5Eget_class_name","H5Eget_current_stack","H5Eget_major","H5Eget_minor","H5Eget_msg","H5Eget_num","H5Eis_paused","H5Epause_stack","H5Epop","H5Eprint1","H5Eprint2","H5Epush1","H5Epush2","H5Eregister_class","H5Eresume_stack","H5Eset_auto1","H5Eset_auto2","H5Eset_current_stack","H5Eunregister_class","H5Ewalk1","H5Ewalk2","H5FA__cache_dblk_page_deserialize","H5FA__cache_dblk_page_free_icr","H5FA__cache_dblk_page_get_initial_load_size","H5FA__cache_dblk_page_image_len","H5FA__cache_dblk_page_notify","H5FA__cache_dblk_page_serialize","H5FA__cache_dblk_page_verify_chksum","H5FA__cache_dblock_deserialize","H5FA__cache_dblock_free_icr","H5FA__cache_dblock_fsf_size","H5FA__cache_dblock_get_initial_load_size","H5FA__cache_dblock_image_len","H5FA__cache_dblock_notify","H5FA__cache_dblock_serialize","H5FA__cache_dblock_verify_chksum","H5FA__cache_hdr_deserialize","H5FA__cache_hdr_free_icr","H5FA__cache_hdr_get_initial_load_size","H5FA__cache_hdr_image_len","H5FA__cache_hdr_notify","H5FA__cache_hdr_serialize","H5FA__cache_hdr_verify_chksum","H5FA__cmp_cparam_test","H5FA__create_flush_depend","H5FA__dblk_page_alloc","H5FA__dblk_page_create","H5FA__dblk_page_dest","H5FA__dblk_page_protect","H5FA__dblk_page_unprotect","H5FA__dblock_alloc","H5FA__dblock_create","H5FA__dblock_debug","H5FA__dblock_delete","H5FA__dblock_dest","H5FA__dblock_protect","H5FA__dblock_unprotect","H5FA__destroy_flush_depend","H5FA__get_cparam_test","H5FA__hdr_alloc","H5FA__hdr_create","H5FA__hdr_debug","H5FA__hdr_decr","H5FA__hdr_delete","H5FA__hdr_dest","H5FA__hdr_fuse_decr","H5FA__hdr_fuse_incr","H5FA__hdr_incr","H5FA__hdr_init","H5FA__hdr_modified","H5FA__hdr_protect","H5FA__hdr_unprotect","H5FA__test_crt_context","H5FA__test_crt_dbg_context","H5FA__test_debug","H5FA__test_decode","H5FA__test_dst_context","H5FA__test_encode","H5FA__test_fill","H5FA_close","H5FA_create","H5FA_delete","H5FA_depend","H5FA_get","H5FA_get_addr","H5FA_get_nelmts","H5FA_get_stats","H5FA_iterate","H5FA_open","H5FA_patch_file","H5FA_set","H5FD__alloc_real","H5FD__copy_plist","H5FD__core_close","H5FD__core_cmp","H5FD__core_delete","H5FD__core_fapl_get","H5FD__core_flush","H5FD__core_flush.part.0","H5FD__core_get_eoa","H5FD__core_get_eof","H5FD__core_get_handle","H5FD__core_lock","H5FD__core_open","H5FD__core_query","H5FD__core_read","H5FD__core_set_eoa","H5FD__core_term","H5FD__core_truncate","H5FD__core_unlock","H5FD__core_write","H5FD__core_write_to_bstore","H5FD__extend","H5FD__family_close","H5FD__family_cmp","H5FD__family_delete","H5FD__family_fapl_copy","H5FD__family_fapl_free","H5FD__family_fapl_get","H5FD__family_flush","H5FD__family_get_default_config","H5FD__family_get_default_printf_filename","H5FD__family_get_eoa","H5FD__family_get_eof","H5FD__family_get_handle","H5FD__family_lock","H5FD__family_open","H5FD__family_query","H5FD__family_read","H5FD__family_sb_decode","H5FD__family_sb_encode","H5FD__family_sb_size","H5FD__family_set_eoa","H5FD__family_term","H5FD__family_truncate","H5FD__family_unlock","H5FD__family_write","H5FD__free_cls","H5FD__free_real","H5FD__get_driver_cb","H5FD__log_alloc","H5FD__log_close","H5FD__log_cmp","H5FD__log_delete","H5FD__log_fapl_copy","H5FD__log_fapl_free","H5FD__log_fapl_get","H5FD__log_free","H5FD__log_get_eoa","H5FD__log_get_eof","H5FD__log_get_handle","H5FD__log_lock","H5FD__log_open","H5FD__log_query","H5FD__log_read","H5FD__log_set_eoa","H5FD__log_term","H5FD__log_truncate","H5FD__log_unlock","H5FD__log_write","H5FD__mpio_close","H5FD__mpio_ctl","H5FD__mpio_delete","H5FD__mpio_flush","H5FD__mpio_get_eoa","H5FD__mpio_get_eof","H5FD__mpio_get_handle","H5FD__mpio_open","H5FD__mpio_query","H5FD__mpio_read","H5FD__mpio_read_selection","H5FD__mpio_read_vector","H5FD__mpio_set_eoa","H5FD__mpio_term","H5FD__mpio_truncate","H5FD__mpio_vector_build_types.constprop.0","H5FD__mpio_write","H5FD__mpio_write_selection","H5FD__mpio_write_vector","H5FD__onion_archival_index_find","H5FD__onion_archival_index_is_valid","H5FD__onion_archival_index_list_sort_cmp","H5FD__onion_close","H5FD__onion_ctl","H5FD__onion_get_eoa","H5FD__onion_get_eof","H5FD__onion_header_decode","H5FD__onion_header_encode","H5FD__onion_history_decode","H5FD__onion_history_encode","H5FD__onion_ingest_header","H5FD__onion_ingest_history","H5FD__onion_ingest_revision_record","H5FD__onion_merge_revision_index_into_archival_index","H5FD__onion_open","H5FD__onion_read","H5FD__onion_revision_index_destroy","H5FD__onion_revision_index_find","H5FD__onion_revision_index_init","H5FD__onion_revision_index_insert","H5FD__onion_revision_record_decode","H5FD__onion_revision_record_encode","H5FD__onion_sb_decode","H5FD__onion_sb_encode","H5FD__onion_sb_size","H5FD__onion_set_eoa","H5FD__onion_term","H5FD__onion_write","H5FD__onion_write_final_history","H5FD__onion_write_header","H5FD__onion_write_history","H5FD__read_selection_translate","H5FD__sec2_close","H5FD__sec2_cmp","H5FD__sec2_ctl","H5FD__sec2_delete","H5FD__sec2_get_eoa","H5FD__sec2_get_eof","H5FD__sec2_get_handle","H5FD__sec2_lock","H5FD__sec2_open","H5FD__sec2_query","H5FD__sec2_read","H5FD__sec2_set_eoa","H5FD__sec2_term","H5FD__sec2_truncate","H5FD__sec2_unlock","H5FD__sec2_write","H5FD__selection_build_types.constprop.0","H5FD__sort_io_req_real.constprop.0","H5FD__splitter_alloc","H5FD__splitter_close","H5FD__splitter_cmp","H5FD__splitter_ctl","H5FD__splitter_delete","H5FD__splitter_fapl_copy","H5FD__splitter_fapl_free","H5FD__splitter_fapl_get","H5FD__splitter_flush","H5FD__splitter_free","H5FD__splitter_get_default_wo_path.constprop.0","H5FD__splitter_get_eoa","H5FD__splitter_get_eof","H5FD__splitter_get_handle","H5FD__splitter_get_type_map","H5FD__splitter_lock","H5FD__splitter_log_error.part.0.isra.0","H5FD__splitter_open","H5FD__splitter_populate_config","H5FD__splitter_query","H5FD__splitter_read","H5FD__splitter_sb_decode","H5FD__splitter_sb_encode","H5FD__splitter_sb_size","H5FD__splitter_set_eoa","H5FD__splitter_term","H5FD__splitter_truncate","H5FD__splitter_unlock","H5FD__splitter_write","H5FD__srt_tmp_cmp","H5FD__supports_swmr_test","H5FD__write_selection_translate","H5FD_alloc","H5FD_check_plugin_load","H5FD_close","H5FD_cmp","H5FD_core_init","H5FD_ctl","H5FD_delete","H5FD_driver_query","H5FD_family_init","H5FD_fapl_get","H5FD_flush","H5FD_free","H5FD_free_driver_info","H5FD_get_base_addr","H5FD_get_class","H5FD_get_class.localalias","H5FD_get_driver_id_by_name","H5FD_get_driver_id_by_value","H5FD_get_eoa","H5FD_get_eof","H5FD_get_feature_flags","H5FD_get_fileno","H5FD_get_fs_type_map","H5FD_get_maxaddr","H5FD_get_mpio_atomicity","H5FD_get_vfd_handle","H5FD_init","H5FD_is_driver_registered_by_name","H5FD_is_driver_registered_by_value","H5FD_locate_signature","H5FD_lock","H5FD_log_init","H5FD_mpi_MPIOff_to_haddr","H5FD_mpi_get_comm","H5FD_mpi_get_file_sync_required","H5FD_mpi_get_info","H5FD_mpi_get_rank","H5FD_mpi_get_size","H5FD_mpi_haddr_to_MPIOff","H5FD_mpio_init","H5FD_multi_alloc","H5FD_multi_close","H5FD_multi_cmp","H5FD_multi_ctl","H5FD_multi_delete","H5FD_multi_fapl_copy","H5FD_multi_fapl_free","H5FD_multi_fapl_get","H5FD_multi_flush","H5FD_multi_free","H5FD_multi_get_eoa","H5FD_multi_get_eof","H5FD_multi_get_handle","H5FD_multi_get_type_map","H5FD_multi_init","H5FD_multi_lock","H5FD_multi_open","H5FD_multi_populate_config","H5FD_multi_query","H5FD_multi_read","H5FD_multi_sb_decode","H5FD_multi_sb_decode.part.0","H5FD_multi_sb_encode","H5FD_multi_sb_size","H5FD_multi_set_eoa","H5FD_multi_term","H5FD_multi_truncate","H5FD_multi_unlock","H5FD_multi_write","H5FD_onion_init","H5FD_open","H5FD_read","H5FD_read_from_selection","H5FD_read_selection","H5FD_read_selection_id","H5FD_read_vector","H5FD_read_vector_from_selection","H5FD_register","H5FD_register_driver_by_name","H5FD_register_driver_by_value","H5FD_sb_encode","H5FD_sb_load","H5FD_sb_size","H5FD_sec2_init","H5FD_set_base_addr","H5FD_set_eoa","H5FD_set_feature_flags","H5FD_set_mpio_atomicity","H5FD_set_paged_aggr","H5FD_sort_selection_io_req","H5FD_sort_vector_io_req","H5FD_split_populate_config.constprop.0","H5FD_splitter_init","H5FD_stdio_alloc","H5FD_stdio_close","H5FD_stdio_cmp","H5FD_stdio_delete","H5FD_stdio_flush","H5FD_stdio_get_eoa","H5FD_stdio_get_eof","H5FD_stdio_get_handle","H5FD_stdio_init","H5FD_stdio_lock","H5FD_stdio_open","H5FD_stdio_query","H5FD_stdio_read","H5FD_stdio_set_eoa","H5FD_stdio_term","H5FD_stdio_truncate","H5FD_stdio_unlock","H5FD_stdio_write","H5FD_term_package","H5FD_truncate","H5FD_try_extend","H5FD_unlock","H5FD_write","H5FD_write_from_selection","H5FD_write_selection","H5FD_write_selection_id","H5FD_write_vector","H5FD_write_vector_from_selection","H5FDalloc","H5FDclose","H5FDcmp","H5FDctl","H5FDdelete","H5FDdriver_query","H5FDflush","H5FDfree","H5FDget_eoa","H5FDget_eof","H5FDget_vfd_handle","H5FDis_driver_registered_by_name","H5FDis_driver_registered_by_value","H5FDlock","H5FDonion_get_revision_count","H5FDopen","H5FDperform_init","H5FDquery","H5FDread","H5FDread_from_selection","H5FDread_selection","H5FDread_vector","H5FDread_vector_from_selection","H5FDregister","H5FDset_eoa","H5FDtruncate","H5FDunlock","H5FDunregister","H5FDwrite","H5FDwrite_from_selection","H5FDwrite_selection","H5FDwrite_vector","H5FDwrite_vector_from_selection","H5FL__blk_create_list.part.0","H5FL__blk_gc_list","H5FL_arr_calloc","H5FL_arr_free","H5FL_arr_malloc","H5FL_arr_realloc","H5FL_blk_calloc","H5FL_blk_free","H5FL_blk_free_block_avail","H5FL_blk_malloc","H5FL_blk_realloc","H5FL_fac_calloc","H5FL_fac_free","H5FL_fac_init","H5FL_fac_malloc","H5FL_fac_term","H5FL_garbage_coll","H5FL_get_free_list_sizes","H5FL_reg_calloc","H5FL_reg_free","H5FL_reg_malloc","H5FL_seq_calloc","H5FL_seq_free","H5FL_seq_malloc","H5FL_seq_realloc","H5FL_set_free_list_limits","H5FL_term_package","H5FO_create","H5FO_delete","H5FO_dest","H5FO_insert","H5FO_mark","H5FO_marked","H5FO_opened","H5FO_top_count","H5FO_top_create","H5FO_top_decr","H5FO_top_dest","H5FO_top_incr","H5FS__cache_hdr_deserialize","H5FS__cache_hdr_free_icr","H5FS__cache_hdr_get_initial_load_size","H5FS__cache_hdr_image_len","H5FS__cache_hdr_notify","H5FS__cache_hdr_pre_serialize","H5FS__cache_hdr_serialize","H5FS__cache_hdr_verify_chksum","H5FS__cache_sinfo_deserialize","H5FS__cache_sinfo_free_icr","H5FS__cache_sinfo_get_initial_load_size","H5FS__cache_sinfo_image_len","H5FS__cache_sinfo_notify","H5FS__cache_sinfo_pre_serialize","H5FS__cache_sinfo_serialize","H5FS__cache_sinfo_verify_chksum","H5FS__cmp_cparam_test","H5FS__create_flush_depend","H5FS__decr","H5FS__destroy_flush_depend","H5FS__dirty","H5FS__get_cparam_test","H5FS__hdr_dest","H5FS__incr","H5FS__iterate_node_cb","H5FS__iterate_sect_cb","H5FS__new","H5FS__sect_init_cls.part.0","H5FS__sect_link","H5FS__sect_merge","H5FS__sect_node_new.part.0","H5FS__sect_remove_real","H5FS__sect_unlink_rest","H5FS__sinfo_dest","H5FS__sinfo_free_node_cb","H5FS__sinfo_free_sect_cb","H5FS__sinfo_lock","H5FS__sinfo_new","H5FS__sinfo_serialize_node_cb","H5FS__sinfo_serialize_sect_cb","H5FS__sinfo_unlock","H5FS__size_node_decr.isra.0","H5FS_alloc_hdr","H5FS_alloc_sect","H5FS_close","H5FS_create","H5FS_debug","H5FS_delete","H5FS_free","H5FS_get_sect_count","H5FS_open","H5FS_sect_add","H5FS_sect_change_class","H5FS_sect_debug","H5FS_sect_find","H5FS_sect_iterate","H5FS_sect_remove","H5FS_sect_stats","H5FS_sect_try_extend","H5FS_sect_try_merge","H5FS_sect_try_shrink_eoa","H5FS_sects_debug","H5FS_size","H5FS_stat_info","H5FS_vfd_alloc_hdr_and_section_info_if_needed","H5F_Kvalue","H5F__accum_adjust","H5F__accum_flush","H5F__accum_free","H5F__accum_read","H5F__accum_reset","H5F__accum_write","H5F__alloc","H5F__build_actual_name","H5F__build_name","H5F__cache_drvrinfo_deserialize","H5F__cache_drvrinfo_free_icr","H5F__cache_drvrinfo_get_final_load_size","H5F__cache_drvrinfo_get_initial_load_size","H5F__cache_drvrinfo_image_len","H5F__cache_drvrinfo_serialize","H5F__cache_superblock_deserialize","H5F__cache_superblock_free_icr","H5F__cache_superblock_get_final_load_size","H5F__cache_superblock_get_initial_load_size","H5F__cache_superblock_image_len","H5F__cache_superblock_serialize","H5F__cache_superblock_verify_chksum","H5F__check_cached_stab_test","H5F__close","H5F__close_cb","H5F__close_mounts","H5F__create_api_common","H5F__delete","H5F__dest","H5F__efc_create","H5F__efc_destroy","H5F__efc_max_nfiles","H5F__efc_open","H5F__efc_open_file","H5F__efc_release","H5F__efc_release_real","H5F__efc_try_close","H5F__efc_try_close_tag1.isra.0","H5F__efc_try_close_tag2.isra.0","H5F__evict_cache_entries","H5F__flush","H5F__flush_api_common","H5F__flush_mounts_recurse","H5F__flush_phase2","H5F__format_convert","H5F__free","H5F__get_all_count_cb","H5F__get_all_ids_cb","H5F__get_cont_info","H5F__get_file_image","H5F__get_info","H5F__get_max_eof_eoa","H5F__get_maxaddr_test","H5F__get_mpi_atomicity","H5F__get_objects_cb","H5F__get_sbe_addr_test","H5F__get_sohm_mesg_count_test","H5F__is_hdf5","H5F__mount_count_ids","H5F__mount_count_ids_recurse","H5F__new","H5F__open_api_common","H5F__parse_file_lock_env_var","H5F__post_open","H5F__post_open_api_common","H5F__reopen","H5F__reopen_api_common","H5F__reparse_file_lock_variable_test","H5F__same_file_test","H5F__set_base_addr","H5F__set_eoa","H5F__set_libver_bounds","H5F__set_mpi_atomicity","H5F__set_paged_aggr","H5F__sfile_add","H5F__sfile_remove","H5F__sfile_search","H5F__start_swmr_write","H5F__super_ext_close","H5F__super_ext_create","H5F__super_ext_open","H5F__super_ext_remove_msg","H5F__super_ext_write_msg","H5F__super_free","H5F__super_init","H5F__super_read","H5F__super_size","H5F__superblock_prefix_decode","H5F__try_extend","H5F__update_super_ext_driver_msg","H5F_addr_decode","H5F_addr_decode_len","H5F_addr_encode","H5F_addr_encode_len","H5F_block_read","H5F_block_write","H5F_coll_md_read","H5F_cwfs_add","H5F_cwfs_advance_heap","H5F_cwfs_find_free_heap","H5F_cwfs_remove_heap","H5F_debug","H5F_decr_nopen_objs","H5F_efc_close","H5F_eoa_dirty","H5F_fake_alloc","H5F_fake_free","H5F_file_id_exists","H5F_flush_mounts","H5F_flush_tagged_metadata","H5F_gc_ref","H5F_get_access_plist","H5F_get_actual_name","H5F_get_alignment","H5F_get_base_addr","H5F_get_checksums","H5F_get_coll_metadata_reads","H5F_get_driver_id","H5F_get_eoa","H5F_get_evict_on_close","H5F_get_extpath","H5F_get_fc_degree","H5F_get_fcpl","H5F_get_file_id","H5F_get_fileno","H5F_get_high_bound","H5F_get_id","H5F_get_intent","H5F_get_low_bound","H5F_get_metadata_read_retry_info","H5F_get_min_dset_ohdr","H5F_get_nmounts","H5F_get_nopen_objs","H5F_get_nrefs","H5F_get_null_fsm_addr","H5F_get_obj_count","H5F_get_obj_ids","H5F_get_open_name","H5F_get_parent","H5F_get_pgend_meta_thres","H5F_get_point_of_no_return","H5F_get_read_attempts","H5F_get_rfic_flags","H5F_get_shared","H5F_get_sohm_addr","H5F_get_sohm_nindexes","H5F_get_sohm_vers","H5F_get_threshold","H5F_get_use_file_locking","H5F_get_vfd_handle","H5F_get_vol_cls","H5F_get_vol_obj","H5F_grp_btree_shared","H5F_has_feature","H5F_has_vector_select_io","H5F_incr_nopen_objs","H5F_init","H5F_is_mount","H5F_is_tmp_addr","H5F_mdc_log_location","H5F_mount","H5F_mpi_get_comm","H5F_mpi_get_file_block_type","H5F_mpi_get_info","H5F_mpi_get_rank","H5F_mpi_get_size","H5F_mpi_retrieve_comm","H5F_object_flush_cb","H5F_open","H5F_prefix_open_file","H5F_rdcc_nbytes","H5F_rdcc_nslots","H5F_rdcc_w0","H5F_same_shared","H5F_set_coll_metadata_reads","H5F_set_grp_btree_shared","H5F_set_min_dset_ohdr","H5F_set_retries","H5F_set_sohm_addr","H5F_set_sohm_nindexes","H5F_set_sohm_vers","H5F_set_store_msg_crt_idx","H5F_sfile_assert_num","H5F_shared_block_read","H5F_shared_block_write","H5F_shared_coll_md_read","H5F_shared_get_coll_metadata_reads","H5F_shared_get_eoa","H5F_shared_get_file_driver","H5F_shared_get_intent","H5F_shared_get_mpi_file_sync_required","H5F_shared_has_feature","H5F_shared_mpi_get_size","H5F_shared_select_read","H5F_shared_select_write","H5F_shared_vector_read","H5F_shared_vector_write","H5F_sieve_buf_size","H5F_sizeof_addr","H5F_sizeof_size","H5F_start_mdc_log_on_access","H5F_store_msg_crt_idx","H5F_super_dirty","H5F_sym_leaf_k","H5F_term_package","H5F_track_metadata_read_retries","H5F_traverse_mount","H5F_try_close","H5F_try_close.localalias","H5F_unmount","H5F_use_mdc_logging","H5F_use_tmp_space","H5Fclear_elink_file_cache","H5Fclose","H5Fclose_async","H5Fcreate","H5Fcreate_async","H5Fdelete","H5Fflush","H5Fflush_async","H5Fformat_convert","H5Fget_access_plist","H5Fget_create_plist","H5Fget_dset_no_attrs_hint","H5Fget_eoa","H5Fget_file_image","H5Fget_fileno","H5Fget_filesize","H5Fget_free_sections","H5Fget_freespace","H5Fget_info1","H5Fget_info2","H5Fget_intent","H5Fget_mdc_config","H5Fget_mdc_hit_rate","H5Fget_mdc_image_info","H5Fget_mdc_logging_status","H5Fget_mdc_size","H5Fget_metadata_read_retry_info","H5Fget_mpi_atomicity","H5Fget_name","H5Fget_obj_count","H5Fget_obj_ids","H5Fget_page_buffering_stats","H5Fget_vfd_handle","H5Fincrement_filesize","H5Fis_accessible","H5Fis_hdf5","H5Fmount","H5Fopen","H5Fopen_async","H5Freopen","H5Freopen_async","H5Freset_mdc_hit_rate_stats","H5Freset_page_buffering_stats","H5Fset_dset_no_attrs_hint","H5Fset_latest_format","H5Fset_libver_bounds","H5Fset_mdc_config","H5Fset_mpi_atomicity","H5Fstart_mdc_logging","H5Fstart_swmr_write","H5Fstop_mdc_logging","H5Funmount","H5G__cache_node_deserialize","H5G__cache_node_free_icr","H5G__cache_node_get_initial_load_size","H5G__cache_node_image_len","H5G__cache_node_serialize","H5G__close_cb","H5G__common_path","H5G__compact_build_table_cb","H5G__compact_get_name_by_idx","H5G__compact_insert","H5G__compact_iterate","H5G__compact_lookup","H5G__compact_lookup_by_idx","H5G__compact_lookup_cb","H5G__compact_remove","H5G__compact_remove_by_idx","H5G__compact_remove_common_cb","H5G__component","H5G__create","H5G__create_named","H5G__dense_btree2_corder_compare","H5G__dense_btree2_corder_debug","H5G__dense_btree2_corder_decode","H5G__dense_btree2_corder_encode","H5G__dense_btree2_corder_store","H5G__dense_btree2_name_compare","H5G__dense_btree2_name_debug","H5G__dense_btree2_name_decode","H5G__dense_btree2_name_encode","H5G__dense_btree2_name_store","H5G__dense_build_table","H5G__dense_build_table_cb","H5G__dense_create","H5G__dense_delete","H5G__dense_fh_name_cmp","H5G__dense_get_name_by_idx","H5G__dense_get_name_by_idx_bt2_cb","H5G__dense_get_name_by_idx_fh_cb","H5G__dense_insert","H5G__dense_iterate","H5G__dense_iterate_bt2_cb","H5G__dense_iterate_fh_cb","H5G__dense_lookup","H5G__dense_lookup_by_idx","H5G__dense_lookup_by_idx_bt2_cb","H5G__dense_lookup_by_idx_fh_cb","H5G__dense_lookup_cb","H5G__dense_remove","H5G__dense_remove_bt2_cb","H5G__dense_remove_by_idx","H5G__dense_remove_by_idx_bt2_cb","H5G__dense_remove_by_idx_fh_cb","H5G__dense_remove_fh_cb","H5G__ent_copy","H5G__ent_debug","H5G__ent_decode_vec","H5G__ent_encode_vec","H5G__ent_reset","H5G__ent_to_link","H5G__free_visit_visited","H5G__get_info_by_idx","H5G__get_info_by_name","H5G__get_name_by_addr_cb","H5G__get_objinfo","H5G__get_objinfo_cb","H5G__has_links_test","H5G__has_stab_test","H5G__is_empty_test","H5G__is_new_dense_test","H5G__iterate_cb","H5G__lheap_size_test","H5G__link_cmp_corder_dec","H5G__link_cmp_corder_inc","H5G__link_cmp_name_dec","H5G__link_cmp_name_inc","H5G__link_iterate_table","H5G__link_name_replace","H5G__link_release_table","H5G__link_sort_table","H5G__link_to_ent","H5G__link_to_loc","H5G__loc_addr","H5G__loc_addr_cb","H5G__loc_exists_cb","H5G__loc_find_by_idx_cb","H5G__loc_find_cb","H5G__loc_get_comment_cb","H5G__loc_info_cb","H5G__loc_insert","H5G__loc_native_info_cb","H5G__loc_set_comment_cb","H5G__name_init","H5G__name_replace_cb","H5G__new_dense_info_test","H5G__node_build_table","H5G__node_by_idx","H5G__node_cmp2","H5G__node_cmp3","H5G__node_copy","H5G__node_create","H5G__node_debug_key","H5G__node_decode_key","H5G__node_encode_key","H5G__node_found","H5G__node_free","H5G__node_get_shared","H5G__node_init","H5G__node_insert","H5G__node_iterate","H5G__node_iterate_size","H5G__node_remove","H5G__node_sumup","H5G__obj_compact_to_dense_cb","H5G__obj_create","H5G__obj_create_real","H5G__obj_get_linfo","H5G__obj_info","H5G__obj_iterate","H5G__obj_lookup","H5G__obj_remove_update_linfo","H5G__obj_stab_to_new_cb","H5G__open_name","H5G__stab_bh_size","H5G__stab_count","H5G__stab_create","H5G__stab_create_components","H5G__stab_delete","H5G__stab_get_name_by_idx","H5G__stab_get_name_by_idx_cb","H5G__stab_insert","H5G__stab_insert_real","H5G__stab_iterate","H5G__stab_lookup","H5G__stab_lookup_by_idx","H5G__stab_lookup_by_idx_cb","H5G__stab_lookup_cb","H5G__stab_remove","H5G__stab_remove_by_idx","H5G__stab_valid","H5G__traverse_real","H5G__traverse_slink_cb","H5G__traverse_special","H5G__user_path_test","H5G__verify_cached_stab_test","H5G__verify_cached_stabs_test","H5G__verify_cached_stabs_test_cb","H5G__visit_cb","H5G_build_fullpath_refstr_str","H5G_close","H5G_ent_decode","H5G_ent_encode","H5G_fileof","H5G_get_create_plist","H5G_get_gcpl_id","H5G_get_name","H5G_get_name_by_addr","H5G_get_shared_count","H5G_init","H5G_iterate","H5G_link_to_info","H5G_loc","H5G_loc_copy","H5G_loc_exists","H5G_loc_find","H5G_loc_find_by_idx","H5G_loc_free","H5G_loc_get_comment","H5G_loc_info","H5G_loc_native_info","H5G_loc_real","H5G_loc_reset","H5G_loc_set_comment","H5G_map_obj_type","H5G_mkroot","H5G_mount","H5G_mounted","H5G_name_copy","H5G_name_free","H5G_name_replace","H5G_name_reset","H5G_name_set","H5G_nameof","H5G_node_close","H5G_node_debug","H5G_normalize","H5G_obj_get_name_by_idx","H5G_obj_insert","H5G_obj_insert.localalias","H5G_obj_lookup_by_idx","H5G_obj_remove","H5G_obj_remove_by_idx","H5G_oloc","H5G_open","H5G_root_free","H5G_root_loc","H5G_rootof","H5G_term_package","H5G_top_term_package","H5G_traverse","H5G_unmount","H5G_visit","H5Gclose","H5Gclose_async","H5Gcreate1","H5Gcreate2","H5Gcreate_anon","H5Gcreate_async","H5Gflush","H5Gget_comment","H5Gget_create_plist","H5Gget_info","H5Gget_info_async","H5Gget_info_by_idx","H5Gget_info_by_idx_async","H5Gget_info_by_name","H5Gget_info_by_name_async","H5Gget_linkval","H5Gget_num_objs","H5Gget_objinfo","H5Gget_objname_by_idx","H5Gget_objtype_by_idx","H5Giterate","H5Glink","H5Glink2","H5Gmove","H5Gmove2","H5Gopen1","H5Gopen2","H5Gopen_async","H5Grefresh","H5Gset_comment","H5Gunlink","H5HF__cache_dblock_deserialize","H5HF__cache_dblock_free_icr","H5HF__cache_dblock_fsf_size","H5HF__cache_dblock_get_initial_load_size","H5HF__cache_dblock_image_len","H5HF__cache_dblock_notify","H5HF__cache_dblock_pre_serialize","H5HF__cache_dblock_serialize","H5HF__cache_dblock_verify_chksum","H5HF__cache_hdr_deserialize","H5HF__cache_hdr_free_icr","H5HF__cache_hdr_get_final_load_size","H5HF__cache_hdr_get_initial_load_size","H5HF__cache_hdr_image_len","H5HF__cache_hdr_pre_serialize","H5HF__cache_hdr_serialize","H5HF__cache_hdr_verify_chksum","H5HF__cache_iblock_deserialize","H5HF__cache_iblock_free_icr","H5HF__cache_iblock_get_initial_load_size","H5HF__cache_iblock_image_len","H5HF__cache_iblock_notify","H5HF__cache_iblock_pre_serialize","H5HF__cache_iblock_serialize","H5HF__cache_iblock_verify_chksum","H5HF__dtable_dest","H5HF__dtable_init","H5HF__dtable_lookup","H5HF__dtable_size_to_row","H5HF__dtable_size_to_rows","H5HF__dtable_span_size","H5HF__hdr_adj_free","H5HF__hdr_adjust_heap","H5HF__hdr_alloc","H5HF__hdr_create","H5HF__hdr_decr","H5HF__hdr_delete","H5HF__hdr_dirty","H5HF__hdr_empty","H5HF__hdr_finish_init","H5HF__hdr_finish_init_phase1","H5HF__hdr_finish_init_phase2","H5HF__hdr_free","H5HF__hdr_fuse_decr","H5HF__hdr_fuse_incr","H5HF__hdr_inc_alloc","H5HF__hdr_inc_iter","H5HF__hdr_incr","H5HF__hdr_protect","H5HF__hdr_reset_iter","H5HF__hdr_reverse_iter","H5HF__hdr_skip_blocks","H5HF__hdr_start_iter","H5HF__hdr_update_iter","H5HF__huge_bt2_crt_context","H5HF__huge_bt2_dir_compare","H5HF__huge_bt2_dir_debug","H5HF__huge_bt2_dir_decode","H5HF__huge_bt2_dir_encode","H5HF__huge_bt2_dir_remove","H5HF__huge_bt2_dir_store","H5HF__huge_bt2_dst_context","H5HF__huge_bt2_filt_dir_compare","H5HF__huge_bt2_filt_dir_debug","H5HF__huge_bt2_filt_dir_decode","H5HF__huge_bt2_filt_dir_encode","H5HF__huge_bt2_filt_dir_found","H5HF__huge_bt2_filt_dir_remove","H5HF__huge_bt2_filt_dir_store","H5HF__huge_bt2_filt_indir_compare","H5HF__huge_bt2_filt_indir_debug","H5HF__huge_bt2_filt_indir_decode","H5HF__huge_bt2_filt_indir_encode","H5HF__huge_bt2_filt_indir_found","H5HF__huge_bt2_filt_indir_remove","H5HF__huge_bt2_filt_indir_store","H5HF__huge_bt2_indir_compare","H5HF__huge_bt2_indir_debug","H5HF__huge_bt2_indir_decode","H5HF__huge_bt2_indir_encode","H5HF__huge_bt2_indir_found","H5HF__huge_bt2_indir_remove","H5HF__huge_bt2_indir_store","H5HF__huge_delete","H5HF__huge_get_obj_len","H5HF__huge_get_obj_off","H5HF__huge_init","H5HF__huge_insert","H5HF__huge_op","H5HF__huge_op_real","H5HF__huge_read","H5HF__huge_remove","H5HF__huge_term","H5HF__huge_write","H5HF__iblock_decr","H5HF__iblock_dirty","H5HF__iblock_incr","H5HF__man_dblock_create","H5HF__man_dblock_delete","H5HF__man_dblock_dest","H5HF__man_dblock_destroy","H5HF__man_dblock_locate","H5HF__man_dblock_new","H5HF__man_dblock_protect","H5HF__man_get_obj_len","H5HF__man_get_obj_off","H5HF__man_iblock_alloc_row","H5HF__man_iblock_attach","H5HF__man_iblock_create","H5HF__man_iblock_delete","H5HF__man_iblock_delete.localalias","H5HF__man_iblock_dest","H5HF__man_iblock_detach","H5HF__man_iblock_detach.localalias","H5HF__man_iblock_entry_addr","H5HF__man_iblock_parent_info","H5HF__man_iblock_protect","H5HF__man_iblock_root_create","H5HF__man_iblock_root_double","H5HF__man_iblock_size","H5HF__man_iblock_size.localalias","H5HF__man_iblock_unprotect","H5HF__man_insert","H5HF__man_iter_curr","H5HF__man_iter_down","H5HF__man_iter_init","H5HF__man_iter_next","H5HF__man_iter_ready","H5HF__man_iter_reset","H5HF__man_iter_set_entry","H5HF__man_iter_start_entry","H5HF__man_iter_start_offset","H5HF__man_iter_up","H5HF__man_op","H5HF__man_op_real","H5HF__man_read","H5HF__man_remove","H5HF__man_write","H5HF__op_read","H5HF__op_write","H5HF__sect_indirect_add","H5HF__sect_indirect_decr","H5HF__sect_indirect_first","H5HF__sect_indirect_free","H5HF__sect_indirect_init_cls","H5HF__sect_indirect_init_rows","H5HF__sect_indirect_new","H5HF__sect_indirect_reduce","H5HF__sect_indirect_revive","H5HF__sect_indirect_serialize","H5HF__sect_indirect_shrink","H5HF__sect_indirect_term_cls","H5HF__sect_indirect_valid.isra.0","H5HF__sect_row_can_merge","H5HF__sect_row_can_shrink","H5HF__sect_row_debug","H5HF__sect_row_deserialize","H5HF__sect_row_first.part.0","H5HF__sect_row_free","H5HF__sect_row_get_iblock","H5HF__sect_row_init_cls","H5HF__sect_row_merge","H5HF__sect_row_reduce","H5HF__sect_row_revive","H5HF__sect_row_serialize","H5HF__sect_row_shrink","H5HF__sect_row_term_cls","H5HF__sect_row_valid","H5HF__sect_single_add","H5HF__sect_single_can_merge","H5HF__sect_single_can_shrink","H5HF__sect_single_dblock_info","H5HF__sect_single_deserialize","H5HF__sect_single_free","H5HF__sect_single_full_dblock","H5HF__sect_single_merge","H5HF__sect_single_new","H5HF__sect_single_reduce","H5HF__sect_single_revive","H5HF__sect_single_shrink","H5HF__sect_single_valid","H5HF__space_add","H5HF__space_close","H5HF__space_create_root","H5HF__space_create_root_cb","H5HF__space_delete","H5HF__space_find","H5HF__space_remove","H5HF__space_revert_root","H5HF__space_revert_root_cb","H5HF__space_sect_change_class","H5HF__space_size","H5HF__space_start","H5HF__tiny_get_obj_len","H5HF__tiny_init","H5HF__tiny_insert","H5HF__tiny_op","H5HF__tiny_read","H5HF__tiny_remove","H5HF_close","H5HF_cmp_cparam_test","H5HF_create","H5HF_dblock_debug","H5HF_dblock_debug_cb","H5HF_delete","H5HF_get_cparam_test","H5HF_get_dblock_free_test","H5HF_get_dblock_size_test","H5HF_get_dtable_max_drows_test","H5HF_get_dtable_width_test","H5HF_get_heap_addr","H5HF_get_huge_info_test","H5HF_get_iblock_max_drows_test","H5HF_get_id_len","H5HF_get_id_off_test","H5HF_get_id_type_test","H5HF_get_max_root_rows","H5HF_get_obj_len","H5HF_get_obj_off","H5HF_get_tiny_info_test","H5HF_hdr_debug","H5HF_hdr_print","H5HF_iblock_debug","H5HF_iblock_print","H5HF_iblock_print.localalias","H5HF_id_print","H5HF_insert","H5HF_op","H5HF_open","H5HF_read","H5HF_remove","H5HF_sects_debug","H5HF_sects_debug_cb","H5HF_size","H5HF_stat_info","H5HF_write","H5HG__cache_heap_deserialize","H5HG__cache_heap_free_icr","H5HG__cache_heap_get_final_load_size","H5HG__cache_heap_get_initial_load_size","H5HG__cache_heap_image_len","H5HG__cache_heap_serialize","H5HG__free","H5HG__protect","H5HG_debug","H5HG_extend","H5HG_get_addr","H5HG_get_free_size","H5HG_get_obj_size","H5HG_get_size","H5HG_insert","H5HG_link","H5HG_read","H5HG_remove","H5HL__cache_datablock_deserialize","H5HL__cache_datablock_free_icr","H5HL__cache_datablock_get_initial_load_size","H5HL__cache_datablock_image_len","H5HL__cache_datablock_notify","H5HL__cache_datablock_serialize","H5HL__cache_prefix_deserialize","H5HL__cache_prefix_free_icr","H5HL__cache_prefix_get_final_load_size","H5HL__cache_prefix_get_initial_load_size","H5HL__cache_prefix_image_len","H5HL__cache_prefix_serialize","H5HL__dblk_dest","H5HL__dblk_new","H5HL__dblk_realloc","H5HL__dec_rc","H5HL__dest","H5HL__fl_deserialize","H5HL__fl_serialize","H5HL__hdr_deserialize","H5HL__inc_rc","H5HL__minimize_heap_space","H5HL__new","H5HL__prfx_dest","H5HL__prfx_new","H5HL_create","H5HL_debug","H5HL_delete","H5HL_get_size","H5HL_heap_get_size","H5HL_heapsize","H5HL_insert","H5HL_offset_into","H5HL_protect","H5HL_remove","H5HL_unprotect","H5I__destroy_type","H5I__find_id","H5I__get_name_test","H5I__get_type_ref","H5I__inc_type_ref","H5I__iterate_pub_cb","H5I__register","H5I__remove_common","H5I__remove_verify","H5I__search_cb","H5I_clear_type","H5I_dec_app_ref","H5I_dec_app_ref_always_close","H5I_dec_app_ref_always_close_async","H5I_dec_app_ref_async","H5I_dec_ref","H5I_dec_type_ref","H5I_dump_ids_for_type","H5I_find_id","H5I_get_ref","H5I_get_type","H5I_inc_ref","H5I_is_file_object","H5I_iterate","H5I_nmembers","H5I_object","H5I_object_verify","H5I_register","H5I_register_type","H5I_register_using_existing_id","H5I_remove","H5I_subst","H5I_term_package","H5Iclear_type","H5Idec_ref","H5Idec_type_ref","H5Idestroy_type","H5Iget_file_id","H5Iget_name","H5Iget_ref","H5Iget_type","H5Iget_type_ref","H5Iinc_ref","H5Iinc_type_ref","H5Iis_valid","H5Iiterate","H5Inmembers","H5Iobject_verify","H5Iregister","H5Iregister_future","H5Iregister_type","H5Iremove_verify","H5Isearch","H5Itype_exists","H5L__create_hard","H5L__create_hard_api_common","H5L__create_real","H5L__create_soft","H5L__create_soft_api_common","H5L__create_ud","H5L__delete","H5L__delete_by_idx","H5L__delete_by_idx_cb","H5L__delete_cb","H5L__exists","H5L__exists_final_cb","H5L__exists_inter_cb","H5L__extern_query","H5L__extern_traverse","H5L__get_info_by_idx","H5L__get_info_by_idx_cb","H5L__get_info_cb","H5L__get_name_by_idx","H5L__get_name_by_idx_cb","H5L__get_val","H5L__get_val_by_idx","H5L__get_val_by_idx_cb","H5L__get_val_cb","H5L__iterate2_shim","H5L__link_cb","H5L__link_copy_file","H5L__move","H5L__move_cb","H5L__move_dest_cb","H5L_exists_tolerant","H5L_find_class","H5L_get_info","H5L_get_ocrt_info","H5L_init","H5L_is_registered","H5L_iterate","H5L_link","H5L_link_object","H5L_register","H5L_register_external","H5L_term_package","H5L_unregister","H5Lcopy","H5Lcreate_external","H5Lcreate_hard","H5Lcreate_hard_async","H5Lcreate_soft","H5Lcreate_soft_async","H5Lcreate_ud","H5Ldelete","H5Ldelete_async","H5Ldelete_by_idx","H5Ldelete_by_idx_async","H5Lexists","H5Lexists_async","H5Lget_info1","H5Lget_info2","H5Lget_info_by_idx1","H5Lget_info_by_idx2","H5Lget_name_by_idx","H5Lget_val","H5Lget_val_by_idx","H5Lis_registered","H5Literate1","H5Literate2","H5Literate_async","H5Literate_by_name1","H5Literate_by_name2","H5Lmove","H5Lregister","H5Lunpack_elink_val","H5Lunregister","H5Lvisit1","H5Lvisit2","H5Lvisit_by_name1","H5Lvisit_by_name2","H5MF__add_sect","H5MF__aggr_absorb","H5MF__aggr_alloc","H5MF__aggr_can_absorb","H5MF__aggr_query","H5MF__aggr_try_extend","H5MF__aggrs_try_shrink_eoa","H5MF__alloc_to_fs_type","H5MF__close_delete_fstype","H5MF__close_shrink_eoa","H5MF__find_sect","H5MF__fsm_is_self_referential","H5MF__fsm_type_is_self_referential","H5MF__open_fstype","H5MF__sect_deserialize","H5MF__sect_free","H5MF__sect_large_can_merge","H5MF__sect_large_can_shrink","H5MF__sect_large_merge","H5MF__sect_large_shrink","H5MF__sect_new","H5MF__sect_simple_can_merge","H5MF__sect_simple_can_shrink","H5MF__sect_simple_merge","H5MF__sect_simple_shrink","H5MF__sect_small_add","H5MF__sect_small_can_merge","H5MF__sect_small_merge","H5MF__sect_split","H5MF__sect_valid","H5MF__sects_cb","H5MF__sects_debug_cb","H5MF__start_fstype","H5MF_aggr_vfd_alloc","H5MF_alloc","H5MF_alloc_tmp","H5MF_close","H5MF_free_aggrs","H5MF_get_free_sections","H5MF_get_freespace","H5MF_init_merge_flags","H5MF_sects_debug","H5MF_settle_meta_data_fsm","H5MF_settle_raw_data_fsm","H5MF_try_close","H5MF_try_extend","H5MF_try_shrink","H5MF_xfree","H5MM_realloc","H5MM_strdup","H5MM_strndup","H5MM_xfree","H5MM_xfree_const","H5MM_xstrdup","H5M__close_cb","H5M_init","H5M_term_package","H5M_top_term_package","H5O__add_gap.constprop.0","H5O__ainfo_copy","H5O__ainfo_copy_file","H5O__ainfo_debug","H5O__ainfo_decode","H5O__ainfo_delete","H5O__ainfo_encode","H5O__ainfo_free","H5O__ainfo_post_copy_file","H5O__ainfo_pre_copy_file","H5O__ainfo_size","H5O__alloc","H5O__alloc_chunk","H5O__alloc_find_best_null","H5O__alloc_msgs","H5O__alloc_null","H5O__are_mdc_flushes_disabled","H5O__attr_bh_info","H5O__attr_copy","H5O__attr_count_real","H5O__attr_create","H5O__attr_delete","H5O__attr_dense_info_test","H5O__attr_exists","H5O__attr_exists_cb","H5O__attr_find_opened_attr","H5O__attr_free","H5O__attr_get_crt_index","H5O__attr_iterate","H5O__attr_link","H5O__attr_open_by_idx","H5O__attr_open_by_idx_cb","H5O__attr_open_by_name","H5O__attr_open_cb","H5O__attr_pre_copy_file","H5O__attr_remove","H5O__attr_remove_by_idx","H5O__attr_remove_cb","H5O__attr_remove_update","H5O__attr_rename","H5O__attr_rename_chk_cb","H5O__attr_rename_mod_cb","H5O__attr_reset","H5O__attr_set_crt_index","H5O__attr_shared_copy_file","H5O__attr_shared_debug","H5O__attr_shared_decode","H5O__attr_shared_delete","H5O__attr_shared_encode","H5O__attr_shared_link","H5O__attr_shared_post_copy_file","H5O__attr_shared_size","H5O__attr_to_dense_cb","H5O__attr_update_shared","H5O__attr_write","H5O__attr_write_cb","H5O__btreek_copy","H5O__btreek_debug","H5O__btreek_decode","H5O__btreek_encode","H5O__btreek_size","H5O__cache_chk_deserialize","H5O__cache_chk_free_icr","H5O__cache_chk_get_initial_load_size","H5O__cache_chk_image_len","H5O__cache_chk_notify","H5O__cache_chk_serialize","H5O__cache_chk_verify_chksum","H5O__cache_deserialize","H5O__cache_free_icr","H5O__cache_get_final_load_size","H5O__cache_get_initial_load_size","H5O__cache_image_len","H5O__cache_notify","H5O__cache_serialize","H5O__cache_verify_chksum","H5O__check_msg_marked_test","H5O__chunk_add","H5O__chunk_delete","H5O__chunk_deserialize","H5O__chunk_dest","H5O__chunk_protect","H5O__chunk_resize","H5O__chunk_serialize","H5O__chunk_unprotect","H5O__chunk_update_idx","H5O__condense_header","H5O__cont_debug","H5O__cont_decode","H5O__cont_delete","H5O__cont_encode","H5O__cont_free","H5O__cont_size","H5O__copy","H5O__copy_api_common","H5O__copy_comm_dt_cmp","H5O__copy_free_addrmap_cb","H5O__copy_free_comm_dt_cb","H5O__copy_header_real","H5O__copy_obj_by_ref","H5O__copy_search_comm_dt_attr_cb","H5O__copy_search_comm_dt_cb","H5O__copy_search_comm_dt_check","H5O__debug_real","H5O__dec_rc","H5O__delete_mesg","H5O__disable_mdc_flushes","H5O__drvinfo_copy","H5O__drvinfo_debug","H5O__drvinfo_decode","H5O__drvinfo_encode","H5O__drvinfo_reset","H5O__drvinfo_size","H5O__dset_bh_info","H5O__dset_create","H5O__dset_flush","H5O__dset_free_copy_file_udata","H5O__dset_get_copy_file_udata","H5O__dset_get_oloc","H5O__dset_isa","H5O__dset_open","H5O__dtype_can_share","H5O__dtype_copy","H5O__dtype_create","H5O__dtype_debug.isra.0","H5O__dtype_decode_helper","H5O__dtype_encode_helper","H5O__dtype_encode_helper.cold","H5O__dtype_free","H5O__dtype_get_oloc","H5O__dtype_isa","H5O__dtype_open","H5O__dtype_pre_copy_file","H5O__dtype_reset","H5O__dtype_set_share","H5O__dtype_shared_copy_file","H5O__dtype_shared_debug","H5O__dtype_shared_decode","H5O__dtype_shared_delete","H5O__dtype_shared_encode","H5O__dtype_shared_link","H5O__dtype_shared_post_copy_file","H5O__dtype_shared_size","H5O__dtype_size.isra.0","H5O__efl_copy","H5O__efl_copy_file","H5O__efl_debug","H5O__efl_decode","H5O__efl_encode","H5O__efl_reset","H5O__efl_size","H5O__eliminate_gap","H5O__enable_mdc_flushes","H5O__expunge_chunks_test","H5O__fill_copy","H5O__fill_debug.constprop.0","H5O__fill_free","H5O__fill_new_shared_copy_file","H5O__fill_new_shared_debug","H5O__fill_new_shared_decode","H5O__fill_new_shared_delete","H5O__fill_new_shared_encode","H5O__fill_new_shared_link","H5O__fill_new_shared_post_copy_file","H5O__fill_new_shared_size","H5O__fill_pre_copy_file","H5O__fill_reset","H5O__fill_shared_copy_file","H5O__fill_shared_debug","H5O__fill_shared_decode","H5O__fill_shared_delete","H5O__fill_shared_encode","H5O__fill_shared_link","H5O__fill_shared_post_copy_file","H5O__fill_shared_size","H5O__flush_msgs","H5O__free","H5O__free_visit_visited","H5O__fsinfo_copy","H5O__fsinfo_debug","H5O__fsinfo_decode","H5O__fsinfo_encode","H5O__fsinfo_free","H5O__fsinfo_size","H5O__get_hdr_info_real","H5O__get_info_old","H5O__get_rc_test","H5O__ginfo_copy","H5O__ginfo_debug","H5O__ginfo_decode","H5O__ginfo_encode","H5O__ginfo_free","H5O__ginfo_size","H5O__group_bh_info","H5O__group_create","H5O__group_free_copy_file_udata","H5O__group_get_copy_file_udata","H5O__group_get_oloc","H5O__group_isa","H5O__group_open","H5O__inc_rc","H5O__is_attr_dense_test","H5O__is_attr_empty_test","H5O__iterate1_adapter","H5O__layout_copy","H5O__layout_copy_file","H5O__layout_debug","H5O__layout_decode","H5O__layout_delete","H5O__layout_encode","H5O__layout_free","H5O__layout_pre_copy_file","H5O__layout_reset","H5O__layout_reset.part.0","H5O__layout_size","H5O__linfo_copy","H5O__linfo_copy.part.0","H5O__linfo_copy_file","H5O__linfo_debug","H5O__linfo_decode","H5O__linfo_delete","H5O__linfo_encode","H5O__linfo_free","H5O__linfo_post_copy_file","H5O__linfo_post_copy_file_cb","H5O__linfo_size","H5O__link_copy","H5O__link_copy_file","H5O__link_debug","H5O__link_decode","H5O__link_encode","H5O__link_free","H5O__link_oh","H5O__link_post_copy_file","H5O__link_pre_copy_file","H5O__link_reset","H5O__link_size","H5O__mdci_copy","H5O__mdci_debug","H5O__mdci_decode","H5O__mdci_delete","H5O__mdci_encode","H5O__mdci_free","H5O__mdci_size","H5O__msg_alloc","H5O__msg_append_real","H5O__msg_copy_file","H5O__msg_count_real","H5O__msg_free_mesg","H5O__msg_get_chunkno_test","H5O__msg_iterate_real","H5O__msg_move_to_new_chunk_test","H5O__msg_remove_cb","H5O__msg_remove_real","H5O__msg_write_real","H5O__mtime_copy","H5O__mtime_debug","H5O__mtime_decode","H5O__mtime_encode","H5O__mtime_free","H5O__mtime_new_decode","H5O__mtime_new_encode","H5O__mtime_new_size","H5O__mtime_size","H5O__name_copy","H5O__name_debug","H5O__name_decode","H5O__name_encode","H5O__name_reset","H5O__name_size","H5O__num_attrs_test","H5O__obj_class","H5O__obj_class_real","H5O__open_by_addr","H5O__open_by_idx","H5O__pline_copy","H5O__pline_free","H5O__pline_pre_copy_file","H5O__pline_reset","H5O__pline_shared_copy_file","H5O__pline_shared_debug","H5O__pline_shared_decode","H5O__pline_shared_delete","H5O__pline_shared_encode","H5O__pline_shared_link","H5O__pline_shared_post_copy_file","H5O__pline_shared_size","H5O__prefix_deserialize","H5O__refcount_copy","H5O__refcount_debug","H5O__refcount_decode","H5O__refcount_encode","H5O__refcount_free","H5O__refcount_pre_copy_file","H5O__refcount_size","H5O__release_mesg","H5O__remove_empty_chunks","H5O__sdspace_copy","H5O__sdspace_free","H5O__sdspace_pre_copy_file","H5O__sdspace_reset","H5O__sdspace_shared_copy_file","H5O__sdspace_shared_debug","H5O__sdspace_shared_decode","H5O__sdspace_shared_delete","H5O__sdspace_shared_encode","H5O__sdspace_shared_link","H5O__sdspace_shared_post_copy_file","H5O__sdspace_shared_size","H5O__shared_copy_file","H5O__shared_debug","H5O__shared_decode","H5O__shared_delete","H5O__shared_encode","H5O__shared_link","H5O__shared_post_copy_file","H5O__shared_size","H5O__shmesg_copy","H5O__shmesg_debug","H5O__shmesg_decode","H5O__shmesg_encode","H5O__shmesg_size","H5O__stab_copy","H5O__stab_copy_file","H5O__stab_debug","H5O__stab_decode","H5O__stab_delete","H5O__stab_encode","H5O__stab_free","H5O__stab_post_copy_file","H5O__stab_size","H5O__unknown_free","H5O__visit","H5O__visit_cb","H5O_apply_ohdr","H5O_attr_iterate_real","H5O_close","H5O_copy_expand_ref","H5O_copy_header_map","H5O_create","H5O_create_ohdr","H5O_debug","H5O_debug_id","H5O_dec_rc_by_loc","H5O_delete","H5O_efl_total_size","H5O_fill_convert","H5O_fill_reset_dyn","H5O_fill_set_version","H5O_flush","H5O_flush_common","H5O_fsinfo_check_version","H5O_fsinfo_set_version","H5O_get_create_plist","H5O_get_hdr_info","H5O_get_info","H5O_get_loc","H5O_get_native_info","H5O_get_nlinks","H5O_get_oh_addr","H5O_get_oh_flags","H5O_get_oh_mtime","H5O_get_oh_version","H5O_get_proxy","H5O_get_rc_and_type","H5O_has_chksum","H5O_init","H5O_link","H5O_link_delete","H5O_loc_copy","H5O_loc_copy_deep","H5O_loc_copy_shallow","H5O_loc_free","H5O_loc_hold_file","H5O_loc_reset","H5O_msg_append_oh","H5O_msg_can_share","H5O_msg_can_share_in_ohdr","H5O_msg_copy","H5O_msg_count","H5O_msg_create","H5O_msg_decode","H5O_msg_delete","H5O_msg_encode","H5O_msg_exists","H5O_msg_exists_oh","H5O_msg_flush","H5O_msg_free","H5O_msg_free_real","H5O_msg_get_crt_index","H5O_msg_get_flags","H5O_msg_is_shared","H5O_msg_iterate","H5O_msg_raw_size","H5O_msg_read","H5O_msg_read_oh","H5O_msg_remove","H5O_msg_remove_op","H5O_msg_reset","H5O_msg_reset_share","H5O_msg_set_share","H5O_msg_size_f","H5O_msg_size_oh","H5O_msg_write","H5O_msg_write_oh","H5O_obj_create","H5O_obj_type","H5O_open","H5O_open_by_loc","H5O_open_name","H5O_pin","H5O_pline_set_version","H5O_protect","H5O_refresh_metadata","H5O_refresh_metadata_reopen","H5O_set_shared","H5O_touch","H5O_touch_oh","H5O_unpin","H5O_unprotect","H5Oare_mdc_flushes_disabled","H5Oclose","H5Oclose_async","H5Ocopy","H5Ocopy_async","H5Odecr_refcount","H5Odisable_mdc_flushes","H5Oenable_mdc_flushes","H5Oexists_by_name","H5Oflush","H5Oflush_async","H5Oget_comment","H5Oget_comment_by_name","H5Oget_info1","H5Oget_info2","H5Oget_info3","H5Oget_info_by_idx1","H5Oget_info_by_idx2","H5Oget_info_by_idx3","H5Oget_info_by_name1","H5Oget_info_by_name2","H5Oget_info_by_name3","H5Oget_info_by_name_async","H5Oget_native_info","H5Oget_native_info_by_idx","H5Oget_native_info_by_name","H5Oincr_refcount","H5Olink","H5Oopen","H5Oopen_async","H5Oopen_by_addr","H5Oopen_by_idx","H5Oopen_by_idx_async","H5Oopen_by_token","H5Orefresh","H5Orefresh_async","H5Oset_comment","H5Oset_comment_by_name","H5Otoken_cmp","H5Otoken_from_str","H5Otoken_to_str","H5Ovisit1","H5Ovisit2","H5Ovisit3","H5Ovisit_by_name1","H5Ovisit_by_name2","H5Ovisit_by_name3","H5PB__dest_cb","H5PB__flush_cb","H5PB__make_space","H5PB_add_new_page","H5PB_create","H5PB_dest","H5PB_enabled","H5PB_flush","H5PB_get_stats","H5PB_print_stats","H5PB_read","H5PB_remove_entry","H5PB_reset_stats","H5PB_update_entry","H5PB_write","H5PL__add_plugin","H5PL__append_path","H5PL__close","H5PL__close_path_table","H5PL__close_plugin_cache","H5PL__create_path_table","H5PL__create_plugin_cache","H5PL__find_plugin_in_cache","H5PL__find_plugin_in_path_table","H5PL__get_num_paths","H5PL__get_path","H5PL__get_plugin_control_mask","H5PL__insert_at","H5PL__insert_path","H5PL__open","H5PL__path_table_iterate","H5PL__prepend_path","H5PL__remove_path","H5PL__replace_path","H5PL__set_plugin_control_mask","H5PL_init","H5PL_iterate","H5PL_load","H5PL_term_package","H5PLappend","H5PLget","H5PLget_loading_state","H5PLinsert","H5PLprepend","H5PLremove","H5PLreplace","H5PLset_loading_state","H5PLsize","H5P__access_class","H5P__access_class.localalias","H5P__add_prop","H5P__class_get","H5P__class_set","H5P__close_class","H5P__close_class_cb","H5P__close_list_cb","H5P__cmp_class","H5P__cmp_plist","H5P__cmp_plist_cb","H5P__cmp_prop.part.0","H5P__copy_merge_comm_dt_list","H5P__copy_pclass","H5P__copy_prop_pclass","H5P__copy_prop_plist","H5P__create_class","H5P__create_prop","H5P__dacc_reg_prop","H5P__dacc_vds_view_dec","H5P__dacc_vds_view_enc","H5P__dapl_efile_pref_close","H5P__dapl_efile_pref_cmp","H5P__dapl_efile_pref_copy","H5P__dapl_efile_pref_dec","H5P__dapl_efile_pref_del","H5P__dapl_efile_pref_enc","H5P__dapl_efile_pref_get","H5P__dapl_efile_pref_set","H5P__dapl_vds_file_pref_close","H5P__dapl_vds_file_pref_cmp","H5P__dapl_vds_file_pref_copy","H5P__dapl_vds_file_pref_dec","H5P__dapl_vds_file_pref_del","H5P__dapl_vds_file_pref_enc","H5P__dapl_vds_file_pref_get","H5P__dapl_vds_file_pref_set","H5P__dcrt_ext_file_list_close","H5P__dcrt_ext_file_list_cmp","H5P__dcrt_ext_file_list_copy","H5P__dcrt_ext_file_list_dec","H5P__dcrt_ext_file_list_del","H5P__dcrt_ext_file_list_enc","H5P__dcrt_ext_file_list_get","H5P__dcrt_ext_file_list_set","H5P__dcrt_fill_value_close","H5P__dcrt_fill_value_copy","H5P__dcrt_fill_value_dec","H5P__dcrt_fill_value_del","H5P__dcrt_fill_value_enc","H5P__dcrt_fill_value_get","H5P__dcrt_fill_value_set","H5P__dcrt_layout_close","H5P__dcrt_layout_cmp","H5P__dcrt_layout_copy","H5P__dcrt_layout_dec","H5P__dcrt_layout_del","H5P__dcrt_layout_enc","H5P__dcrt_layout_get","H5P__dcrt_layout_set","H5P__dcrt_reg_prop","H5P__decode","H5P__decode_bool","H5P__decode_chunk_cache_nbytes","H5P__decode_chunk_cache_nslots","H5P__decode_coll_md_read_flag_t","H5P__decode_double","H5P__decode_hsize_t","H5P__decode_size_t","H5P__decode_uint64_t","H5P__decode_uint8_t","H5P__decode_unsigned","H5P__do_prop_cb1","H5P__dup_prop","H5P__dxfr_bkgr_buf_type_dec","H5P__dxfr_bkgr_buf_type_enc","H5P__dxfr_btree_split_ratio_dec","H5P__dxfr_btree_split_ratio_enc","H5P__dxfr_dset_io_hyp_sel_close","H5P__dxfr_dset_io_hyp_sel_cmp","H5P__dxfr_dset_io_hyp_sel_copy","H5P__dxfr_edc_dec","H5P__dxfr_edc_enc","H5P__dxfr_io_xfer_mode_dec","H5P__dxfr_io_xfer_mode_enc","H5P__dxfr_modify_write_buf_dec","H5P__dxfr_modify_write_buf_enc","H5P__dxfr_mpio_chunk_opt_hard_dec","H5P__dxfr_mpio_chunk_opt_hard_enc","H5P__dxfr_mpio_collective_opt_dec","H5P__dxfr_mpio_collective_opt_enc","H5P__dxfr_reg_prop","H5P__dxfr_selection_io_mode_dec","H5P__dxfr_selection_io_mode_enc","H5P__dxfr_xform_close","H5P__dxfr_xform_cmp","H5P__dxfr_xform_copy","H5P__dxfr_xform_dec","H5P__dxfr_xform_del","H5P__dxfr_xform_enc","H5P__dxfr_xform_get","H5P__dxfr_xform_set","H5P__encode","H5P__encode_bool","H5P__encode_cb","H5P__encode_chunk_cache_nbytes","H5P__encode_chunk_cache_nslots","H5P__encode_coll_md_read_flag_t","H5P__encode_double","H5P__encode_hsize_t","H5P__encode_size_t","H5P__encode_uint64_t","H5P__encode_uint8_t","H5P__encode_unsigned","H5P__exist_pclass","H5P__facc_cache_config_cmp","H5P__facc_cache_config_dec","H5P__facc_cache_config_enc","H5P__facc_cache_image_config_cmp","H5P__facc_cache_image_config_dec","H5P__facc_cache_image_config_enc","H5P__facc_fclose_degree_dec","H5P__facc_fclose_degree_enc","H5P__facc_file_driver_close","H5P__facc_file_driver_cmp","H5P__facc_file_driver_copy","H5P__facc_file_driver_create","H5P__facc_file_driver_del","H5P__facc_file_driver_get","H5P__facc_file_driver_set","H5P__facc_file_image_info_close","H5P__facc_file_image_info_cmp","H5P__facc_file_image_info_copy","H5P__facc_file_image_info_del","H5P__facc_file_image_info_get","H5P__facc_file_image_info_set","H5P__facc_libver_type_dec","H5P__facc_libver_type_enc","H5P__facc_mdc_log_location_close","H5P__facc_mdc_log_location_cmp","H5P__facc_mdc_log_location_copy","H5P__facc_mdc_log_location_dec","H5P__facc_mdc_log_location_del","H5P__facc_mdc_log_location_enc","H5P__facc_mpi_comm_close","H5P__facc_mpi_comm_cmp","H5P__facc_mpi_comm_copy","H5P__facc_mpi_comm_del","H5P__facc_mpi_comm_get","H5P__facc_mpi_comm_set","H5P__facc_mpi_info_close","H5P__facc_mpi_info_cmp","H5P__facc_mpi_info_copy","H5P__facc_mpi_info_del","H5P__facc_mpi_info_get","H5P__facc_mpi_info_set","H5P__facc_multi_type_dec","H5P__facc_multi_type_enc","H5P__facc_reg_prop","H5P__facc_set_def_driver","H5P__facc_vol_close","H5P__facc_vol_cmp","H5P__facc_vol_copy","H5P__facc_vol_create","H5P__facc_vol_del","H5P__facc_vol_get","H5P__facc_vol_set","H5P__fcrt_btree_rank_dec","H5P__fcrt_btree_rank_enc","H5P__fcrt_fspace_strategy_dec","H5P__fcrt_fspace_strategy_enc","H5P__fcrt_reg_prop","H5P__fcrt_shmsg_index_minsize_dec","H5P__fcrt_shmsg_index_minsize_enc","H5P__fcrt_shmsg_index_types_dec","H5P__fcrt_shmsg_index_types_enc","H5P__find_prop_plist","H5P__fmnt_reg_prop","H5P__free_del_name_cb","H5P__free_prop_cb","H5P__gcrt_group_info_dec","H5P__gcrt_group_info_enc","H5P__gcrt_link_info_dec","H5P__gcrt_link_info_enc","H5P__gcrt_reg_prop","H5P__get_cb","H5P__get_class_parent","H5P__get_class_path","H5P__get_class_path.localalias","H5P__get_class_path_test","H5P__get_filter","H5P__get_nprops_plist","H5P__get_size_pclass","H5P__get_size_plist","H5P__iterate_cb","H5P__iterate_pclass","H5P__iterate_pclass_cb","H5P__iterate_plist","H5P__iterate_plist_cb","H5P__iterate_plist_pclass_cb","H5P__lacc_elink_fapl_close","H5P__lacc_elink_fapl_cmp","H5P__lacc_elink_fapl_copy","H5P__lacc_elink_fapl_dec","H5P__lacc_elink_fapl_del","H5P__lacc_elink_fapl_enc","H5P__lacc_elink_fapl_get","H5P__lacc_elink_fapl_set","H5P__lacc_elink_pref_close","H5P__lacc_elink_pref_cmp","H5P__lacc_elink_pref_copy","H5P__lacc_elink_pref_dec","H5P__lacc_elink_pref_del","H5P__lacc_elink_pref_enc","H5P__lacc_elink_pref_get","H5P__lacc_elink_pref_set","H5P__lacc_reg_prop","H5P__lcrt_reg_prop","H5P__macc_reg_prop","H5P__mcrt_reg_prop","H5P__new_plist_of_type","H5P__ocpy_merge_comm_dt_list_close","H5P__ocpy_merge_comm_dt_list_cmp","H5P__ocpy_merge_comm_dt_list_copy","H5P__ocpy_merge_comm_dt_list_dec","H5P__ocpy_merge_comm_dt_list_del","H5P__ocpy_merge_comm_dt_list_enc","H5P__ocpy_merge_comm_dt_list_enc.cold","H5P__ocpy_merge_comm_dt_list_get","H5P__ocpy_merge_comm_dt_list_set","H5P__ocpy_reg_prop","H5P__ocrt_pipeline_close","H5P__ocrt_pipeline_cmp","H5P__ocrt_pipeline_copy","H5P__ocrt_pipeline_dec","H5P__ocrt_pipeline_del","H5P__ocrt_pipeline_enc","H5P__ocrt_pipeline_get","H5P__ocrt_pipeline_set","H5P__ocrt_reg_prop","H5P__open_class_path","H5P__open_class_path_cb","H5P__open_class_path_test","H5P__register","H5P__register_real","H5P__set_layout","H5P__strcrt_char_encoding_dec","H5P__strcrt_char_encoding_enc","H5P__strcrt_reg_prop","H5P__unregister","H5P_class_isa","H5P_close","H5P_copy_plist","H5P_create_id","H5P_exist_plist","H5P_fill_value_cmp","H5P_fill_value_defined","H5P_filter_in_pline","H5P_get","H5P_get_class","H5P_get_class_name","H5P_get_fill_value","H5P_get_filter_by_id","H5P_get_nprops_pclass","H5P_get_plist_id","H5P_ignore_cmp","H5P_init_phase1","H5P_init_phase2","H5P_insert","H5P_is_fill_value_defined","H5P_isa_class","H5P_modify_filter","H5P_object_verify","H5P_peek","H5P_peek_driver","H5P_peek_driver_config_str","H5P_peek_driver_info","H5P_poke","H5P_remove","H5P_reset_vol_class","H5P_set","H5P_set_driver","H5P_set_driver_by_name","H5P_set_driver_by_value","H5P_set_vlen_mem_manager","H5P_set_vol","H5P_term_package","H5Padd_merge_committed_dtype_path","H5Pall_filters_avail","H5Pclose","H5Pclose_class","H5Pcopy","H5Pcopy_prop","H5Pcreate","H5Pcreate_class","H5Pdecode","H5Pencode1","H5Pencode2","H5Pequal","H5Pexist","H5Pfill_value_defined","H5Pfree_merge_committed_dtype_paths","H5Pget","H5Pget_actual_selection_io_mode","H5Pget_alignment","H5Pget_all_coll_metadata_ops","H5Pget_alloc_time","H5Pget_append_flush","H5Pget_attr_creation_order","H5Pget_attr_phase_change","H5Pget_btree_ratios","H5Pget_buffer","H5Pget_cache","H5Pget_char_encoding","H5Pget_chunk","H5Pget_chunk_cache","H5Pget_chunk_opts","H5Pget_class","H5Pget_class_name","H5Pget_class_parent","H5Pget_coll_metadata_write","H5Pget_copy_object","H5Pget_core_write_tracking","H5Pget_create_intermediate_group","H5Pget_data_transform","H5Pget_driver","H5Pget_driver_config_str","H5Pget_driver_info","H5Pget_dset_no_attrs_hint","H5Pget_dxpl_mpio","H5Pget_edc_check","H5Pget_efile_prefix","H5Pget_elink_acc_flags","H5Pget_elink_cb","H5Pget_elink_fapl","H5Pget_elink_file_cache_size","H5Pget_elink_prefix","H5Pget_est_link_info","H5Pget_evict_on_close","H5Pget_external","H5Pget_external_count","H5Pget_family_offset","H5Pget_fapl_core","H5Pget_fapl_family","H5Pget_fapl_mpio","H5Pget_fapl_multi","H5Pget_fapl_onion","H5Pget_fapl_splitter","H5Pget_fclose_degree","H5Pget_file_image","H5Pget_file_image_callbacks","H5Pget_file_locking","H5Pget_file_space","H5Pget_file_space_page_size","H5Pget_file_space_strategy","H5Pget_fill_time","H5Pget_fill_value","H5Pget_filter1","H5Pget_filter2","H5Pget_filter_by_id1","H5Pget_filter_by_id2","H5Pget_gc_references","H5Pget_hyper_vector_size","H5Pget_istore_k","H5Pget_layout","H5Pget_libver_bounds","H5Pget_link_creation_order","H5Pget_link_phase_change","H5Pget_local_heap_size_hint","H5Pget_mcdt_search_cb","H5Pget_mdc_config","H5Pget_mdc_image_config","H5Pget_mdc_log_options","H5Pget_meta_block_size","H5Pget_metadata_read_attempts","H5Pget_modify_write_buf","H5Pget_mpi_params","H5Pget_mpio_actual_chunk_opt_mode","H5Pget_mpio_actual_io_mode","H5Pget_mpio_no_collective_cause","H5Pget_multi_type","H5Pget_nfilters","H5Pget_nlinks","H5Pget_no_selection_io_cause","H5Pget_nprops","H5Pget_obj_track_times","H5Pget_object_flush_cb","H5Pget_page_buffer_size","H5Pget_preserve","H5Pget_relax_file_integrity_checks","H5Pget_selection_io","H5Pget_shared_mesg_index","H5Pget_shared_mesg_nindexes","H5Pget_shared_mesg_phase_change","H5Pget_sieve_buf_size","H5Pget_size","H5Pget_sizes","H5Pget_small_data_block_size","H5Pget_sym_k","H5Pget_type_conv_cb","H5Pget_userblock","H5Pget_version","H5Pget_virtual_count","H5Pget_virtual_dsetname","H5Pget_virtual_filename","H5Pget_virtual_prefix","H5Pget_virtual_printf_gap","H5Pget_virtual_srcspace","H5Pget_virtual_view","H5Pget_virtual_vspace","H5Pget_vlen_mem_manager","H5Pget_vol_cap_flags","H5Pget_vol_id","H5Pget_vol_info","H5Pinsert1","H5Pinsert2","H5Pisa_class","H5Piterate","H5Pmodify_filter","H5Pregister1","H5Pregister2","H5Premove","H5Premove_filter","H5Pset","H5Pset_alignment","H5Pset_all_coll_metadata_ops","H5Pset_alloc_time","H5Pset_append_flush","H5Pset_attr_creation_order","H5Pset_attr_phase_change","H5Pset_btree_ratios","H5Pset_buffer","H5Pset_cache","H5Pset_char_encoding","H5Pset_chunk","H5Pset_chunk_cache","H5Pset_chunk_opts","H5Pset_coll_metadata_write","H5Pset_copy_object","H5Pset_core_write_tracking","H5Pset_create_intermediate_group","H5Pset_data_transform","H5Pset_dataset_io_hyperslab_selection","H5Pset_deflate","H5Pset_driver","H5Pset_driver_by_name","H5Pset_driver_by_value","H5Pset_dset_no_attrs_hint","H5Pset_dxpl_mpio","H5Pset_dxpl_mpio_chunk_opt","H5Pset_dxpl_mpio_chunk_opt_num","H5Pset_dxpl_mpio_chunk_opt_ratio","H5Pset_dxpl_mpio_collective_opt","H5Pset_edc_check","H5Pset_efile_prefix","H5Pset_elink_acc_flags","H5Pset_elink_cb","H5Pset_elink_fapl","H5Pset_elink_file_cache_size","H5Pset_elink_prefix","H5Pset_est_link_info","H5Pset_evict_on_close","H5Pset_external","H5Pset_family_offset","H5Pset_fapl_core","H5Pset_fapl_family","H5Pset_fapl_log","H5Pset_fapl_mpio","H5Pset_fapl_multi","H5Pset_fapl_onion","H5Pset_fapl_sec2","H5Pset_fapl_split","H5Pset_fapl_splitter","H5Pset_fapl_stdio","H5Pset_fclose_degree","H5Pset_file_image","H5Pset_file_image_callbacks","H5Pset_file_locking","H5Pset_file_space","H5Pset_file_space_page_size","H5Pset_file_space_strategy","H5Pset_fill_time","H5Pset_fill_value","H5Pset_filter","H5Pset_filter_callback","H5Pset_fletcher32","H5Pset_gc_references","H5Pset_hyper_vector_size","H5Pset_istore_k","H5Pset_layout","H5Pset_libver_bounds","H5Pset_link_creation_order","H5Pset_link_phase_change","H5Pset_local_heap_size_hint","H5Pset_mcdt_search_cb","H5Pset_mdc_config","H5Pset_mdc_image_config","H5Pset_mdc_log_options","H5Pset_meta_block_size","H5Pset_metadata_read_attempts","H5Pset_modify_write_buf","H5Pset_mpi_params","H5Pset_multi_type","H5Pset_nbit","H5Pset_nlinks","H5Pset_obj_track_times","H5Pset_object_flush_cb","H5Pset_page_buffer_size","H5Pset_preserve","H5Pset_relax_file_integrity_checks","H5Pset_scaleoffset","H5Pset_selection_io","H5Pset_shared_mesg_index","H5Pset_shared_mesg_nindexes","H5Pset_shared_mesg_phase_change","H5Pset_shuffle","H5Pset_sieve_buf_size","H5Pset_sizes","H5Pset_small_data_block_size","H5Pset_sym_k","H5Pset_szip","H5Pset_type_conv_cb","H5Pset_userblock","H5Pset_virtual","H5Pset_virtual_prefix","H5Pset_virtual_printf_gap","H5Pset_virtual_view","H5Pset_vlen_mem_manager","H5Pset_vol","H5Punregister","H5RS__prepare_for_append","H5RS__resize_for_append.part.0","H5RS_acat","H5RS_ancat","H5RS_aputc","H5RS_asprintf_cat","H5RS_cmp","H5RS_create","H5RS_decr","H5RS_dup","H5RS_get_count","H5RS_get_str","H5RS_incr","H5RS_len","H5RS_wrap","H5R__copy","H5R__create_attr","H5R__create_object","H5R__create_region","H5R__decode","H5R__decode_heap","H5R__decode_string","H5R__decode_token_compat","H5R__decode_token_obj_compat","H5R__decode_token_region_compat","H5R__destroy","H5R__encode","H5R__encode_heap","H5R__encode_token_obj_compat","H5R__equal","H5R__get_attr_name","H5R__get_file_name","H5R__get_loc_id","H5R__get_obj_token","H5R__get_region","H5R__get_type","H5R__open_attr_api_common","H5R__open_object_api_common","H5R__open_region_api_common","H5R__reopen_file","H5R__set_loc_id","H5R__set_obj_token","H5R_init","H5Rcopy","H5Rcreate","H5Rcreate_attr","H5Rcreate_object","H5Rcreate_region","H5Rdereference1","H5Rdereference2","H5Rdestroy","H5Requal","H5Rget_attr_name","H5Rget_file_name","H5Rget_name","H5Rget_obj_name","H5Rget_obj_type1","H5Rget_obj_type2","H5Rget_obj_type3","H5Rget_region","H5Rget_type","H5Ropen_attr","H5Ropen_attr_async","H5Ropen_object","H5Ropen_object_async","H5Ropen_region","H5Ropen_region_async","H5SL__insert_common","H5SL__insert_common.cold","H5SL__release_common","H5SL_below","H5SL_close","H5SL_count","H5SL_create","H5SL_destroy","H5SL_find","H5SL_find.cold","H5SL_first","H5SL_free","H5SL_greater","H5SL_init","H5SL_insert","H5SL_item","H5SL_iterate","H5SL_last","H5SL_less","H5SL_next","H5SL_prev","H5SL_release","H5SL_remove","H5SL_remove.cold","H5SL_remove_first","H5SL_search","H5SL_search.cold","H5SL_term_package","H5SM__bt2_convert_to_list_op","H5SM__bt2_crt_context","H5SM__bt2_debug","H5SM__bt2_dst_context","H5SM__bt2_store","H5SM__cache_list_deserialize","H5SM__cache_list_free_icr","H5SM__cache_list_get_initial_load_size","H5SM__cache_list_image_len","H5SM__cache_list_serialize","H5SM__cache_list_verify_chksum","H5SM__cache_table_deserialize","H5SM__cache_table_free_icr","H5SM__cache_table_get_initial_load_size","H5SM__cache_table_image_len","H5SM__cache_table_serialize","H5SM__cache_table_verify_chksum","H5SM__compare_cb","H5SM__compare_iter_op","H5SM__create_list","H5SM__decr_ref","H5SM__delete_index","H5SM__get_index","H5SM__get_mesg_count_test","H5SM__get_refcount_bt2_cb","H5SM__incr_ref","H5SM__list_free","H5SM__message_compare","H5SM__message_decode","H5SM__message_encode","H5SM__read_iter_op","H5SM__read_mesg","H5SM__read_mesg_fh_cb","H5SM__table_free","H5SM_can_share","H5SM_delete","H5SM_get_fheap_addr","H5SM_get_info","H5SM_get_refcount","H5SM_ih_size","H5SM_init","H5SM_list_debug","H5SM_reconstitute","H5SM_table_debug","H5SM_try_share","H5SM_type_shared","H5S__all_adjust_s","H5S__all_adjust_u","H5S__all_bounds","H5S__all_copy","H5S__all_deserialize","H5S__all_intersect_block","H5S__all_is_contiguous","H5S__all_is_regular","H5S__all_is_single","H5S__all_is_valid","H5S__all_iter_block","H5S__all_iter_coords","H5S__all_iter_get_seq_list","H5S__all_iter_has_next_block","H5S__all_iter_init","H5S__all_iter_nelmts","H5S__all_iter_next","H5S__all_iter_next_block","H5S__all_iter_release","H5S__all_offset","H5S__all_project_scalar","H5S__all_project_simple","H5S__all_release","H5S__all_serial_size","H5S__all_serialize","H5S__all_shape_same","H5S__all_unlim_dim","H5S__check_internal_consistency","H5S__check_spans_overlap","H5S__check_spans_tail_ptr","H5S__close_cb","H5S__combine_select","H5S__copy_pnt_list","H5S__extent_copy_real","H5S__extent_release","H5S__fill_in_new_space","H5S__fill_in_select","H5S__generate_hyperslab","H5S__get_diminfo_status_test","H5S__get_rebuild_status_test","H5S__get_select_hyper_blocklist","H5S__hyper_add_disjoint_spans","H5S__hyper_add_span_element_helper.constprop.0","H5S__hyper_adjust_s","H5S__hyper_adjust_s_helper.constprop.0","H5S__hyper_adjust_u","H5S__hyper_adjust_u_helper.constprop.0","H5S__hyper_append_span","H5S__hyper_append_span.constprop.0","H5S__hyper_bounds","H5S__hyper_clip_spans.constprop.0","H5S__hyper_cmp_spans.part.0","H5S__hyper_coord_to_span","H5S__hyper_copy","H5S__hyper_copy_span_helper.part.0","H5S__hyper_deserialize","H5S__hyper_free_span_info","H5S__hyper_generate_spans","H5S__hyper_get_op_gen","H5S__hyper_get_version_enc_size","H5S__hyper_intersect_block","H5S__hyper_intersect_block_helper.constprop.0","H5S__hyper_is_contiguous","H5S__hyper_is_regular","H5S__hyper_is_single","H5S__hyper_is_valid","H5S__hyper_iter_block","H5S__hyper_iter_coords","H5S__hyper_iter_get_seq_list","H5S__hyper_iter_get_seq_list_opt","H5S__hyper_iter_get_seq_list_single","H5S__hyper_iter_has_next_block","H5S__hyper_iter_init","H5S__hyper_iter_nelmts","H5S__hyper_iter_next","H5S__hyper_iter_next_block","H5S__hyper_iter_release","H5S__hyper_make_spans","H5S__hyper_merge_spans_helper","H5S__hyper_new_span.part.0","H5S__hyper_new_span_info.part.0","H5S__hyper_num_elem_non_unlim","H5S__hyper_offset","H5S__hyper_proj_int_build_proj","H5S__hyper_proj_int_iterate","H5S__hyper_project_intersection","H5S__hyper_project_scalar","H5S__hyper_project_simple","H5S__hyper_rebuild","H5S__hyper_rebuild_helper","H5S__hyper_release","H5S__hyper_serial_size","H5S__hyper_serialize","H5S__hyper_serialize_helper","H5S__hyper_shape_same","H5S__hyper_span_blocklist","H5S__hyper_span_nblocks_helper.constprop.0","H5S__hyper_spans_nelem_helper.part.0.constprop.0","H5S__hyper_spans_shape_same","H5S__hyper_spans_shape_same_helper","H5S__hyper_unlim_dim","H5S__hyper_update_diminfo","H5S__internal_consistency_test","H5S__modify_select","H5S__mpio_create_point_datatype","H5S__mpio_reg_hyper_type","H5S__mpio_span_hyper_type","H5S__none_adjust_s","H5S__none_adjust_u","H5S__none_bounds","H5S__none_copy","H5S__none_deserialize","H5S__none_intersect_block","H5S__none_is_contiguous","H5S__none_is_regular","H5S__none_is_single","H5S__none_is_valid","H5S__none_iter_block","H5S__none_iter_coords","H5S__none_iter_get_seq_list","H5S__none_iter_has_next_block","H5S__none_iter_init","H5S__none_iter_nelmts","H5S__none_iter_next","H5S__none_iter_next_block","H5S__none_iter_release","H5S__none_offset","H5S__none_project_scalar","H5S__none_project_simple","H5S__none_release","H5S__none_serial_size","H5S__none_serialize","H5S__none_shape_same","H5S__none_unlim_dim","H5S__obtain_datatype.constprop.0","H5S__point_adjust_s","H5S__point_adjust_u","H5S__point_bounds","H5S__point_copy","H5S__point_deserialize","H5S__point_get_version_enc_size","H5S__point_intersect_block","H5S__point_is_contiguous","H5S__point_is_regular","H5S__point_is_single","H5S__point_is_valid","H5S__point_iter_block","H5S__point_iter_coords","H5S__point_iter_get_seq_list","H5S__point_iter_has_next_block","H5S__point_iter_init","H5S__point_iter_nelmts","H5S__point_iter_next","H5S__point_iter_next_block","H5S__point_iter_release","H5S__point_offset","H5S__point_project_scalar","H5S__point_project_simple","H5S__point_release","H5S__point_serial_size","H5S__point_serialize","H5S__point_shape_same","H5S__point_unlim_dim","H5S__sel_iter_close_cb","H5S__set_regular_hyperslab","H5S__verify_offsets","H5S_append","H5S_close","H5S_combine_hyperslab","H5S_copy","H5S_create","H5S_create_simple","H5S_debug","H5S_decode","H5S_encode","H5S_extent_copy","H5S_extent_equal","H5S_extent_get_dims","H5S_extent_nelem","H5S_get_npoints_max","H5S_get_select_bounds","H5S_get_select_npoints","H5S_get_select_num_elem_non_unlim","H5S_get_select_offset","H5S_get_select_type","H5S_get_select_unlim_dim","H5S_get_simple_extent","H5S_get_simple_extent_dims","H5S_get_simple_extent_ndims","H5S_get_simple_extent_npoints","H5S_get_simple_extent_type","H5S_has_extent","H5S_hyper_add_span_element","H5S_hyper_clip_unlim","H5S_hyper_denormalize_offset","H5S_hyper_get_clip_extent","H5S_hyper_get_clip_extent_match","H5S_hyper_get_first_inc_block","H5S_hyper_get_unlim_block","H5S_hyper_normalize_offset","H5S_init","H5S_mpio_space_type","H5S_read","H5S_sel_iter_close","H5S_select_adjust_s","H5S_select_adjust_u","H5S_select_all","H5S_select_construct_projection","H5S_select_contig_block","H5S_select_copy","H5S_select_deserialize","H5S_select_elements","H5S_select_fill","H5S_select_hyperslab","H5S_select_hyperslab.localalias","H5S_select_intersect_block","H5S_select_is_contiguous","H5S_select_is_regular","H5S_select_is_single","H5S_select_iter_coords","H5S_select_iter_get_seq_list","H5S_select_iter_init","H5S_select_iter_nelmts","H5S_select_iter_next","H5S_select_iter_release","H5S_select_iterate","H5S_select_none","H5S_select_offset","H5S_select_project_intersection","H5S_select_project_scalar","H5S_select_project_simple","H5S_select_release","H5S_select_serial_size","H5S_select_serialize","H5S_select_shape_same","H5S_select_subtract","H5S_select_valid","H5S_set_extent","H5S_set_extent_real","H5S_set_extent_simple","H5S_set_version","H5S_term_package","H5S_top_term_package","H5S_write","H5Sclose","H5Scombine_hyperslab","H5Scombine_select","H5Scopy","H5Screate","H5Screate_simple","H5Sdecode","H5Sencode1","H5Sencode2","H5Sextent_copy","H5Sextent_equal","H5Sget_regular_hyperslab","H5Sget_select_bounds","H5Sget_select_elem_npoints","H5Sget_select_elem_pointlist","H5Sget_select_hyper_blocklist","H5Sget_select_hyper_nblocks","H5Sget_select_npoints","H5Sget_select_type","H5Sget_simple_extent_dims","H5Sget_simple_extent_ndims","H5Sget_simple_extent_npoints","H5Sget_simple_extent_type","H5Sis_regular_hyperslab","H5Sis_simple","H5Smodify_select","H5Soffset_simple","H5Ssel_iter_close","H5Ssel_iter_create","H5Ssel_iter_get_seq_list","H5Ssel_iter_reset","H5Sselect_adjust","H5Sselect_all","H5Sselect_copy","H5Sselect_elements","H5Sselect_hyperslab","H5Sselect_intersect_block","H5Sselect_none","H5Sselect_project_intersection","H5Sselect_shape_same","H5Sselect_valid","H5Sset_extent_none","H5Sset_extent_simple","H5T__alloc","H5T__array_create","H5T__bit_cmp.constprop.0","H5T__bit_copy","H5T__bit_dec","H5T__bit_find","H5T__bit_get_d","H5T__bit_inc","H5T__bit_neg","H5T__bit_set","H5T__bit_set_d","H5T__bit_shift","H5T__close_cb","H5T__commit","H5T__commit_anon","H5T__commit_api_common","H5T__commit_named","H5T__complete_copy","H5T__conv_array","H5T__conv_b_b","H5T__conv_double_float","H5T__conv_double_int","H5T__conv_double_ldouble","H5T__conv_double_ldouble.cold","H5T__conv_double_llong","H5T__conv_double_long","H5T__conv_double_schar","H5T__conv_double_short","H5T__conv_double_uchar","H5T__conv_double_uint","H5T__conv_double_ullong","H5T__conv_double_ulong","H5T__conv_double_ushort","H5T__conv_enum","H5T__conv_enum_free.part.0","H5T__conv_enum_init","H5T__conv_enum_numeric","H5T__conv_f_f","H5T__conv_f_i","H5T__conv_float_double","H5T__conv_float_double.cold","H5T__conv_float_int","H5T__conv_float_ldouble","H5T__conv_float_ldouble.cold","H5T__conv_float_llong","H5T__conv_float_long","H5T__conv_float_schar","H5T__conv_float_short","H5T__conv_float_uchar","H5T__conv_float_uint","H5T__conv_float_ullong","H5T__conv_float_ulong","H5T__conv_float_ushort","H5T__conv_i_f","H5T__conv_i_i","H5T__conv_int_double","H5T__conv_int_float","H5T__conv_int_ldouble","H5T__conv_int_llong","H5T__conv_int_llong.cold","H5T__conv_int_long","H5T__conv_int_long.cold","H5T__conv_int_schar","H5T__conv_int_short","H5T__conv_int_uchar","H5T__conv_int_uint","H5T__conv_int_ullong","H5T__conv_int_ulong","H5T__conv_int_ushort","H5T__conv_ldouble_double","H5T__conv_ldouble_float","H5T__conv_ldouble_int","H5T__conv_ldouble_llong","H5T__conv_ldouble_long","H5T__conv_ldouble_schar","H5T__conv_ldouble_short","H5T__conv_ldouble_uchar","H5T__conv_ldouble_uint","H5T__conv_ldouble_ullong","H5T__conv_ldouble_ulong","H5T__conv_ldouble_ushort","H5T__conv_llong_double","H5T__conv_llong_float","H5T__conv_llong_int","H5T__conv_llong_ldouble","H5T__conv_llong_long","H5T__conv_llong_schar","H5T__conv_llong_short","H5T__conv_llong_uchar","H5T__conv_llong_uint","H5T__conv_llong_ullong","H5T__conv_llong_ulong","H5T__conv_llong_ushort","H5T__conv_long_double","H5T__conv_long_float","H5T__conv_long_int","H5T__conv_long_ldouble","H5T__conv_long_llong","H5T__conv_long_schar","H5T__conv_long_short","H5T__conv_long_uchar","H5T__conv_long_uint","H5T__conv_long_ullong","H5T__conv_long_ulong","H5T__conv_long_ushort","H5T__conv_noop","H5T__conv_order","H5T__conv_order_opt","H5T__conv_ref","H5T__conv_s_s","H5T__conv_schar_double","H5T__conv_schar_float","H5T__conv_schar_int","H5T__conv_schar_int.cold","H5T__conv_schar_ldouble","H5T__conv_schar_llong","H5T__conv_schar_llong.cold","H5T__conv_schar_long","H5T__conv_schar_long.cold","H5T__conv_schar_short","H5T__conv_schar_short.cold","H5T__conv_schar_uchar","H5T__conv_schar_uint","H5T__conv_schar_ullong","H5T__conv_schar_ulong","H5T__conv_schar_ushort","H5T__conv_short_double","H5T__conv_short_float","H5T__conv_short_int","H5T__conv_short_int.cold","H5T__conv_short_ldouble","H5T__conv_short_llong","H5T__conv_short_llong.cold","H5T__conv_short_long","H5T__conv_short_long.cold","H5T__conv_short_schar","H5T__conv_short_uchar","H5T__conv_short_uint","H5T__conv_short_ullong","H5T__conv_short_ulong","H5T__conv_short_ushort","H5T__conv_struct","H5T__conv_struct_free","H5T__conv_struct_init","H5T__conv_struct_opt","H5T__conv_struct_subset","H5T__conv_uchar_double","H5T__conv_uchar_float","H5T__conv_uchar_int","H5T__conv_uchar_int.cold","H5T__conv_uchar_ldouble","H5T__conv_uchar_llong","H5T__conv_uchar_llong.cold","H5T__conv_uchar_long","H5T__conv_uchar_long.cold","H5T__conv_uchar_schar","H5T__conv_uchar_short","H5T__conv_uchar_short.cold","H5T__conv_uchar_uint","H5T__conv_uchar_uint.cold","H5T__conv_uchar_ullong","H5T__conv_uchar_ullong.cold","H5T__conv_uchar_ulong","H5T__conv_uchar_ulong.cold","H5T__conv_uchar_ushort","H5T__conv_uchar_ushort.cold","H5T__conv_uint_double","H5T__conv_uint_float","H5T__conv_uint_int","H5T__conv_uint_ldouble","H5T__conv_uint_llong","H5T__conv_uint_llong.cold","H5T__conv_uint_long","H5T__conv_uint_long.cold","H5T__conv_uint_schar","H5T__conv_uint_short","H5T__conv_uint_uchar","H5T__conv_uint_ullong","H5T__conv_uint_ullong.cold","H5T__conv_uint_ulong","H5T__conv_uint_ulong.cold","H5T__conv_uint_ushort","H5T__conv_ullong_double","H5T__conv_ullong_float","H5T__conv_ullong_int","H5T__conv_ullong_ldouble","H5T__conv_ullong_llong","H5T__conv_ullong_long","H5T__conv_ullong_schar","H5T__conv_ullong_short","H5T__conv_ullong_uchar","H5T__conv_ullong_uint","H5T__conv_ullong_ulong","H5T__conv_ullong_ushort","H5T__conv_ulong_double","H5T__conv_ulong_float","H5T__conv_ulong_int","H5T__conv_ulong_ldouble","H5T__conv_ulong_llong","H5T__conv_ulong_long","H5T__conv_ulong_schar","H5T__conv_ulong_short","H5T__conv_ulong_uchar","H5T__conv_ulong_uint","H5T__conv_ulong_ullong","H5T__conv_ulong_ushort","H5T__conv_ushort_double","H5T__conv_ushort_float","H5T__conv_ushort_int","H5T__conv_ushort_int.cold","H5T__conv_ushort_ldouble","H5T__conv_ushort_llong","H5T__conv_ushort_llong.cold","H5T__conv_ushort_long","H5T__conv_ushort_long.cold","H5T__conv_ushort_schar","H5T__conv_ushort_short","H5T__conv_ushort_uchar","H5T__conv_ushort_uint","H5T__conv_ushort_uint.cold","H5T__conv_ushort_ullong","H5T__conv_ushort_ullong.cold","H5T__conv_ushort_ulong","H5T__conv_ushort_ulong.cold","H5T__conv_vlen","H5T__conv_vlen_nested_free","H5T__copy_all","H5T__copy_transient","H5T__create","H5T__detect_vlen_ref","H5T__enum_create","H5T__enum_insert","H5T__free","H5T__get_array_dims","H5T__get_array_ndims","H5T__get_create_plist","H5T__get_member_name","H5T__get_member_size","H5T__get_member_value","H5T__get_native_type","H5T__get_path_table_npaths","H5T__init_native_float_types","H5T__init_native_internal","H5T__initiate_copy","H5T__insert","H5T__open_api_common","H5T__open_name","H5T__pack","H5T__path_find_real","H5T__path_free","H5T__print_path_stats","H5T__ref_disk_getsize","H5T__ref_disk_isnull","H5T__ref_disk_read","H5T__ref_disk_setnull","H5T__ref_disk_write","H5T__ref_dsetreg_disk_getsize","H5T__ref_dsetreg_disk_isnull","H5T__ref_dsetreg_disk_read","H5T__ref_mem_getsize","H5T__ref_mem_isnull","H5T__ref_mem_read","H5T__ref_mem_setnull","H5T__ref_mem_write","H5T__ref_obj_disk_getsize","H5T__ref_obj_disk_isnull","H5T__ref_obj_disk_read","H5T__ref_reclaim","H5T__ref_set_loc","H5T__register","H5T__register_int","H5T__reverse_order","H5T__set_offset","H5T__set_order","H5T__set_precision","H5T__set_size","H5T__sort_name","H5T__sort_value","H5T__unlock_cb","H5T__update_packed","H5T__upgrade_version","H5T__upgrade_version_cb","H5T__visit","H5T__visit.localalias","H5T__vlen_create","H5T__vlen_disk_delete","H5T__vlen_disk_delete.part.0","H5T__vlen_disk_getlen","H5T__vlen_disk_isnull","H5T__vlen_disk_read","H5T__vlen_disk_setnull","H5T__vlen_disk_write","H5T__vlen_mem_seq_getlen","H5T__vlen_mem_seq_getptr","H5T__vlen_mem_seq_isnull","H5T__vlen_mem_seq_read","H5T__vlen_mem_seq_setnull","H5T__vlen_mem_seq_write","H5T__vlen_mem_str_getlen","H5T__vlen_mem_str_getptr","H5T__vlen_mem_str_isnull","H5T__vlen_mem_str_read","H5T__vlen_mem_str_setnull","H5T__vlen_mem_str_write","H5T__vlen_reclaim","H5T__vlen_set_loc","H5T_already_vol_managed","H5T_close","H5T_close_real","H5T_cmp","H5T_cmp.localalias","H5T_construct_datatype","H5T_convert","H5T_convert_committed_datatype","H5T_convert_with_ctx","H5T_copy","H5T_copy_reopen","H5T_debug","H5T_debug.cold","H5T_debug.localalias","H5T_decode","H5T_detect_class","H5T_detect_class.localalias","H5T_encode","H5T_get_actual_type","H5T_get_class","H5T_get_force_conv","H5T_get_member_offset","H5T_get_member_type","H5T_get_named_type","H5T_get_nmembers","H5T_get_offset","H5T_get_order","H5T_get_order.localalias","H5T_get_precision","H5T_get_ref_type","H5T_get_sign","H5T_get_size","H5T_get_super","H5T_init","H5T_invoke_vol_optional","H5T_is_immutable","H5T_is_named","H5T_is_numeric_with_unusual_unused_bits","H5T_is_relocatable","H5T_is_sensible","H5T_is_variable_str","H5T_is_vl_storage","H5T_link","H5T_lock","H5T_nameof","H5T_noop_conv","H5T_oloc","H5T_open","H5T_own_vol_obj","H5T_patch_file","H5T_patch_vlen_file","H5T_path_bkg","H5T_path_compound_subset","H5T_path_find","H5T_path_match_find_type_with_volobj","H5T_path_noop","H5T_reclaim","H5T_reclaim_cb","H5T_restore_refresh_state","H5T_save_refresh_state","H5T_set_loc","H5T_set_loc.localalias","H5T_set_version","H5T_term_package","H5T_top_term_package","H5T_unregister","H5T_update_shared","H5T_vlen_reclaim_elmt","H5Tarray_create1","H5Tarray_create2","H5Tclose","H5Tclose_async","H5Tcommit1","H5Tcommit2","H5Tcommit_anon","H5Tcommit_async","H5Tcommitted","H5Tcompiler_conv","H5Tconvert","H5Tcopy","H5Tcreate","H5Tdecode","H5Tdetect_class","H5Tencode","H5Tenum_create","H5Tenum_insert","H5Tenum_nameof","H5Tenum_valueof","H5Tequal","H5Tfind","H5Tflush","H5Tget_array_dims1","H5Tget_array_dims2","H5Tget_array_ndims","H5Tget_class","H5Tget_create_plist","H5Tget_cset","H5Tget_ebias","H5Tget_fields","H5Tget_inpad","H5Tget_member_class","H5Tget_member_index","H5Tget_member_name","H5Tget_member_offset","H5Tget_member_type","H5Tget_member_value","H5Tget_native_type","H5Tget_nmembers","H5Tget_norm","H5Tget_offset","H5Tget_order","H5Tget_pad","H5Tget_precision","H5Tget_sign","H5Tget_size","H5Tget_strpad","H5Tget_super","H5Tget_tag","H5Tinsert","H5Tis_variable_str","H5Tlock","H5Topen1","H5Topen2","H5Topen_async","H5Tpack","H5Treclaim","H5Trefresh","H5Tregister","H5Tset_cset","H5Tset_ebias","H5Tset_fields","H5Tset_inpad","H5Tset_norm","H5Tset_offset","H5Tset_order","H5Tset_pad","H5Tset_precision","H5Tset_sign","H5Tset_size","H5Tset_strpad","H5Tset_tag","H5Tunregister","H5Tvlen_create","H5UC_create","H5UC_decr","H5VL__connector_str_to_info","H5VL__file_open_find_connector_cb","H5VL__find_opt_operation","H5VL__free_cls","H5VL__get_connector_cb","H5VL__get_connector_id","H5VL__get_connector_id_by_name","H5VL__get_connector_id_by_value","H5VL__get_connector_name","H5VL__is_connector_registered_by_name","H5VL__is_connector_registered_by_value","H5VL__is_default_conn","H5VL__native_attr_close","H5VL__native_attr_create","H5VL__native_attr_get","H5VL__native_attr_open","H5VL__native_attr_optional","H5VL__native_attr_read","H5VL__native_attr_specific","H5VL__native_attr_write","H5VL__native_blob_get","H5VL__native_blob_put","H5VL__native_blob_specific","H5VL__native_dataset_close","H5VL__native_dataset_create","H5VL__native_dataset_get","H5VL__native_dataset_io_cleanup","H5VL__native_dataset_io_setup","H5VL__native_dataset_open","H5VL__native_dataset_optional","H5VL__native_dataset_read","H5VL__native_dataset_specific","H5VL__native_dataset_write","H5VL__native_datatype_close","H5VL__native_datatype_commit","H5VL__native_datatype_get","H5VL__native_datatype_open","H5VL__native_datatype_specific","H5VL__native_file_close","H5VL__native_file_create","H5VL__native_file_get","H5VL__native_file_open","H5VL__native_file_optional","H5VL__native_file_specific","H5VL__native_get_file_addr_len","H5VL__native_group_close","H5VL__native_group_create","H5VL__native_group_get","H5VL__native_group_open","H5VL__native_group_optional","H5VL__native_group_specific","H5VL__native_introspect_get_cap_flags","H5VL__native_introspect_get_conn_cls","H5VL__native_introspect_opt_query","H5VL__native_link_copy","H5VL__native_link_create","H5VL__native_link_get","H5VL__native_link_move","H5VL__native_link_specific","H5VL__native_object_copy","H5VL__native_object_get","H5VL__native_object_open","H5VL__native_object_optional","H5VL__native_object_specific","H5VL__native_str_to_token","H5VL__native_term","H5VL__native_token_cmp","H5VL__native_token_to_str","H5VL__num_opt_operation","H5VL__peek_connector_id_by_name","H5VL__peek_connector_id_by_value","H5VL__register_connector","H5VL__register_connector_by_class","H5VL__register_connector_by_name","H5VL__register_connector_by_value","H5VL__register_opt_operation","H5VL__reparse_def_vol_conn_variable_test","H5VL__set_def_conn","H5VL__term_opt_operation","H5VL__term_opt_operation_cb","H5VL__unregister_opt_operation","H5VL__wrap_obj","H5VL_attr_close","H5VL_attr_create","H5VL_attr_get","H5VL_attr_open","H5VL_attr_optional","H5VL_attr_read","H5VL_attr_specific","H5VL_attr_write","H5VL_blob_get","H5VL_blob_optional","H5VL_blob_put","H5VL_blob_specific","H5VL_check_plugin_load","H5VL_cmp_connector_cls","H5VL_cmp_connector_info","H5VL_conn_copy","H5VL_conn_dec_rc","H5VL_conn_free","H5VL_conn_inc_rc","H5VL_copy_connector_info","H5VL_create_object","H5VL_create_object_using_vol_id","H5VL_dataset_close","H5VL_dataset_create","H5VL_dataset_get","H5VL_dataset_open","H5VL_dataset_optional","H5VL_dataset_read","H5VL_dataset_specific","H5VL_dataset_write","H5VL_datatype_close","H5VL_datatype_commit","H5VL_datatype_get","H5VL_datatype_open","H5VL_datatype_optional","H5VL_datatype_optional_op","H5VL_datatype_specific","H5VL_dec_vol_wrapper","H5VL_file_close","H5VL_file_create","H5VL_file_get","H5VL_file_is_same","H5VL_file_open","H5VL_file_optional","H5VL_file_specific","H5VL_finish_lib_state","H5VL_free_connector_info","H5VL_free_lib_state","H5VL_free_object","H5VL_free_wrap_ctx","H5VL_get_cap_flags","H5VL_get_wrap_ctx","H5VL_group_close","H5VL_group_create","H5VL_group_get","H5VL_group_open","H5VL_group_optional","H5VL_group_specific","H5VL_inc_vol_wrapper","H5VL_init_phase1","H5VL_init_phase2","H5VL_introspect_get_cap_flags","H5VL_introspect_get_conn_cls","H5VL_introspect_opt_query","H5VL_link_copy","H5VL_link_create","H5VL_link_get","H5VL_link_move","H5VL_link_optional","H5VL_link_specific","H5VL_native_addr_to_token","H5VL_native_get_file_addr_len","H5VL_native_get_file_struct","H5VL_native_register","H5VL_native_token_to_addr","H5VL_new_connector","H5VL_object","H5VL_object_copy","H5VL_object_data","H5VL_object_get","H5VL_object_inc_rc","H5VL_object_is_native","H5VL_object_open","H5VL_object_optional","H5VL_object_specific","H5VL_object_unwrap","H5VL_object_verify","H5VL_optional","H5VL_pass_through_attr_close","H5VL_pass_through_attr_create","H5VL_pass_through_attr_get","H5VL_pass_through_attr_open","H5VL_pass_through_attr_optional","H5VL_pass_through_attr_read","H5VL_pass_through_attr_specific","H5VL_pass_through_attr_write","H5VL_pass_through_blob_get","H5VL_pass_through_blob_optional","H5VL_pass_through_blob_put","H5VL_pass_through_blob_specific","H5VL_pass_through_dataset_close","H5VL_pass_through_dataset_create","H5VL_pass_through_dataset_get","H5VL_pass_through_dataset_open","H5VL_pass_through_dataset_optional","H5VL_pass_through_dataset_read","H5VL_pass_through_dataset_specific","H5VL_pass_through_dataset_write","H5VL_pass_through_datatype_close","H5VL_pass_through_datatype_commit","H5VL_pass_through_datatype_get","H5VL_pass_through_datatype_open","H5VL_pass_through_datatype_optional","H5VL_pass_through_datatype_specific","H5VL_pass_through_file_close","H5VL_pass_through_file_create","H5VL_pass_through_file_get","H5VL_pass_through_file_open","H5VL_pass_through_file_optional","H5VL_pass_through_file_specific","H5VL_pass_through_free_wrap_ctx","H5VL_pass_through_get_object","H5VL_pass_through_get_wrap_ctx","H5VL_pass_through_group_close","H5VL_pass_through_group_create","H5VL_pass_through_group_get","H5VL_pass_through_group_open","H5VL_pass_through_group_optional","H5VL_pass_through_group_specific","H5VL_pass_through_info_cmp","H5VL_pass_through_info_copy","H5VL_pass_through_info_free","H5VL_pass_through_info_to_str","H5VL_pass_through_init","H5VL_pass_through_introspect_get_cap_flags","H5VL_pass_through_introspect_get_conn_cls","H5VL_pass_through_introspect_opt_query","H5VL_pass_through_link_copy","H5VL_pass_through_link_create","H5VL_pass_through_link_get","H5VL_pass_through_link_move","H5VL_pass_through_link_optional","H5VL_pass_through_link_specific","H5VL_pass_through_object_copy","H5VL_pass_through_object_get","H5VL_pass_through_object_open","H5VL_pass_through_object_optional","H5VL_pass_through_object_specific","H5VL_pass_through_optional","H5VL_pass_through_register","H5VL_pass_through_request_cancel","H5VL_pass_through_request_free","H5VL_pass_through_request_notify","H5VL_pass_through_request_optional","H5VL_pass_through_request_specific","H5VL_pass_through_request_wait","H5VL_pass_through_str_to_info","H5VL_pass_through_term","H5VL_pass_through_token_cmp","H5VL_pass_through_token_from_str","H5VL_pass_through_token_to_str","H5VL_pass_through_unwrap_object","H5VL_pass_through_wrap_object","H5VL_register","H5VL_register_using_existing_id","H5VL_register_using_vol_id","H5VL_request_cancel","H5VL_request_free","H5VL_request_notify","H5VL_request_optional","H5VL_request_specific","H5VL_request_wait","H5VL_reset_vol_wrapper","H5VL_restore_lib_state","H5VL_retrieve_lib_state","H5VL_set_vol_wrapper","H5VL_setup_acc_args","H5VL_setup_args","H5VL_setup_idx_args","H5VL_setup_loc_args","H5VL_setup_name_args","H5VL_setup_self_args","H5VL_setup_token_args","H5VL_start_lib_state","H5VL_term_package","H5VL_token_cmp","H5VL_token_from_str","H5VL_token_to_str","H5VL_unwrap_object","H5VL_vol_object","H5VL_vol_object_verify","H5VL_wrap_object","H5VL_wrap_register","H5VLattr_close","H5VLattr_create","H5VLattr_get","H5VLattr_open","H5VLattr_optional","H5VLattr_optional_op","H5VLattr_read","H5VLattr_specific","H5VLattr_write","H5VLblob_get","H5VLblob_optional","H5VLblob_put","H5VLblob_specific","H5VLclose","H5VLcmp_connector_cls","H5VLcmp_connector_info","H5VLconnector_info_to_str","H5VLconnector_str_to_info","H5VLcopy_connector_info","H5VLdataset_close","H5VLdataset_create","H5VLdataset_get","H5VLdataset_open","H5VLdataset_optional","H5VLdataset_optional_op","H5VLdataset_read","H5VLdataset_specific","H5VLdataset_write","H5VLdatatype_close","H5VLdatatype_commit","H5VLdatatype_get","H5VLdatatype_open","H5VLdatatype_optional","H5VLdatatype_optional_op","H5VLdatatype_specific","H5VLfile_close","H5VLfile_create","H5VLfile_get","H5VLfile_open","H5VLfile_optional","H5VLfile_optional_op","H5VLfile_specific","H5VLfind_opt_operation","H5VLfinish_lib_state","H5VLfree_connector_info","H5VLfree_lib_state","H5VLfree_wrap_ctx","H5VLget_cap_flags","H5VLget_connector_id","H5VLget_connector_id_by_name","H5VLget_connector_id_by_value","H5VLget_connector_name","H5VLget_file_type","H5VLget_object","H5VLget_value","H5VLget_wrap_ctx","H5VLgroup_close","H5VLgroup_create","H5VLgroup_get","H5VLgroup_open","H5VLgroup_optional","H5VLgroup_optional_op","H5VLgroup_specific","H5VLinitialize","H5VLintrospect_get_cap_flags","H5VLintrospect_get_conn_cls","H5VLintrospect_opt_query","H5VLis_connector_registered_by_name","H5VLis_connector_registered_by_value","H5VLlink_copy","H5VLlink_create","H5VLlink_get","H5VLlink_move","H5VLlink_optional","H5VLlink_optional_op","H5VLlink_specific","H5VLnative_addr_to_token","H5VLnative_token_to_addr","H5VLobject","H5VLobject_copy","H5VLobject_get","H5VLobject_is_native","H5VLobject_open","H5VLobject_optional","H5VLobject_optional_op","H5VLobject_specific","H5VLoptional","H5VLpeek_connector_id_by_name","H5VLpeek_connector_id_by_value","H5VLquery_optional","H5VLregister_connector","H5VLregister_connector_by_name","H5VLregister_connector_by_value","H5VLregister_opt_operation","H5VLrequest_cancel","H5VLrequest_free","H5VLrequest_notify","H5VLrequest_optional","H5VLrequest_optional_op","H5VLrequest_specific","H5VLrequest_wait","H5VLrestore_lib_state","H5VLretrieve_lib_state","H5VLstart_lib_state","H5VLterminate","H5VLtoken_cmp","H5VLtoken_from_str","H5VLtoken_to_str","H5VLunregister_connector","H5VLunregister_opt_operation","H5VLunwrap_object","H5VLwrap_object","H5VLwrap_register","H5VM_array_calc","H5VM_array_calc_pre","H5VM_array_down","H5VM_array_fill","H5VM_array_offset","H5VM_array_offset_pre","H5VM_chunk_index","H5VM_chunk_index_scaled","H5VM_chunk_scaled","H5VM_hyper_copy","H5VM_hyper_eq","H5VM_hyper_fill","H5VM_hyper_stride","H5VM_memcpyvv","H5VM_opvv","H5VM_stride_copy","H5VM_stride_copy.part.0","H5VM_stride_copy_s","H5VM_stride_fill","H5WB_actual","H5WB_actual_clear","H5WB_unwrap","H5WB_wrap","H5Z__calc_parms_array","H5Z__calc_parms_compound","H5Z__can_apply_nbit","H5Z__can_apply_scaleoffset","H5Z__check_unregister_dset_cb","H5Z__check_unregister_group_cb","H5Z__do_op","H5Z__filter_deflate","H5Z__filter_fletcher32","H5Z__filter_nbit","H5Z__filter_scaleoffset","H5Z__filter_shuffle","H5Z__flush_file_cb","H5Z__get_token","H5Z__nbit_compress_one_array","H5Z__nbit_compress_one_atomic","H5Z__nbit_compress_one_compound","H5Z__nbit_decompress_one_array","H5Z__nbit_decompress_one_atomic","H5Z__nbit_decompress_one_compound","H5Z__new_node.part.0","H5Z__parse_expression","H5Z__parse_factor","H5Z__parse_term","H5Z__prelude_callback","H5Z__prepare_prelude_callback_dcpl","H5Z__scaleoffset_get_type","H5Z__scaleoffset_postdecompress_i","H5Z__scaleoffset_precompress_fd","H5Z__set_local_nbit","H5Z__set_local_scaleoffset","H5Z__set_local_shuffle","H5Z__set_parms_array","H5Z__set_parms_atomic","H5Z__set_parms_compound","H5Z__unregister","H5Z__xform_copy_tree.isra.0","H5Z__xform_destroy_parse_tree.part.0","H5Z__xform_eval_full","H5Z__xform_reduce_tree","H5Z_all_filters_avail","H5Z_append","H5Z_can_apply","H5Z_can_apply_direct","H5Z_delete","H5Z_filter_avail","H5Z_filter_in_pline","H5Z_filter_info","H5Z_find","H5Z_get_filter_info","H5Z_ignore_filters","H5Z_init","H5Z_modify","H5Z_pipeline","H5Z_register","H5Z_set_local","H5Z_set_local_direct","H5Z_term_package","H5Z_xform_copy","H5Z_xform_create","H5Z_xform_destroy","H5Z_xform_eval","H5Z_xform_extract_xform_str","H5Z_xform_noop","H5Zfilter_avail","H5Zget_filter_info","H5Zregister","H5Zunregister","H5__debug_mask","H5__mpi_delete_cb","H5_bandwidth","H5_basename","H5_buffer_dump","H5_build_extpath","H5_checksum_crc","H5_checksum_fletcher32","H5_checksum_lookup3","H5_checksum_metadata","H5_combine_path","H5_default_vfd_init","H5_dirname","H5_get_option","H5_get_time","H5_hash_string","H5_init_library","H5_make_time","H5_mpi_comm_cmp","H5_mpi_comm_dup","H5_mpi_comm_free","H5_mpi_get_bigio_count","H5_mpi_info_cmp","H5_mpi_info_dup","H5_mpi_info_free","H5_mpi_set_bigio_count","H5_mpio_create_large_type","H5_mpio_gatherv_alloc","H5_mpio_gatherv_alloc_simple","H5_mpio_get_file_sync_required","H5_nanosleep","H5_now","H5_now_usec","H5_strcasestr","H5_term_library","H5_term_library.part.0","H5_timer_get_time_string","H5_timer_get_times","H5_timer_get_total_times","H5_timer_init","H5_timer_start","H5_timer_stop","H5_trace","H5_trace_args","H5allocate_memory","H5atclose","H5check_version","H5close","H5dont_atexit","H5free_memory","H5garbage_collect","H5get_free_list_sizes","H5get_libversion","H5is_library_terminating","H5is_library_threadsafe","H5open","H5resize_memory","H5set_free_list_limits","Nflock","Pflock","__do_global_dtors_aux","atexit","compute_next","deregister_tm_clones","frame_dummy","open_members","register_tm_clones"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/hdf5-1.14.5-ul6ejhuh527dwwbgwi3ij6soj2pikw2u/lib/libhdf5.so","include_offsets":false},{"type":1,"name":"bio","functions":["bio_add_folio","bio_add_folio_nofail","bio_add_hw_folio","bio_add_hw_page","bio_add_page","bio_add_pc_page","bio_add_zone_append_page","bio_alloc_bioset","bio_alloc_cache_prune.constprop.0","bio_alloc_clone","bio_alloc_irq_cache_splice","bio_alloc_map_data","bio_alloc_rescue","bio_associate_blkg","bio_associate_blkg_from_css","bio_associate_blkg_from_page.isra.0","bio_attempt_back_merge","bio_attempt_discard_merge","bio_attempt_front_merge","bio_await_chain","bio_blkcg_css","bio_chain","bio_chain_and_submit","bio_chain_endio","bio_check_pages_dirty","bio_clone_blkg_association","bio_copy_data","bio_copy_data_iter","bio_copy_from_iter","bio_copy_kern_endio","bio_copy_kern_endio_read","bio_copy_user_iov","bio_cpu_dead","bio_dirty_fn","bio_end_io_acct_remapped","bio_endio","bio_free","bio_free_pages","bio_get_page","bio_init","bio_init_clone","bio_integrity_add_page","bio_integrity_advance","bio_integrity_alloc","bio_integrity_clone","bio_integrity_copy_user","bio_integrity_free","bio_integrity_init_user","bio_integrity_map_user","bio_integrity_prep","bio_integrity_prep.cold","bio_integrity_trim","bio_integrity_unmap_user","bio_integrity_unpin_bvec","bio_integrity_verify_fn","bio_iov_bvec_set","bio_iov_iter_get_pages","bio_kmalloc","bio_map_kern_endio","bio_map_user_iov","bio_next_page","bio_poll","bio_post_read_processing","bio_put","bio_reset","bio_set_pages_dirty","bio_split","bio_split_discard","bio_split_rw","bio_split_rw_at","bio_split_to_limits","bio_split_write_zeroes","bio_split_zone_append","bio_start_io_acct","bio_submit_split.part.0","bio_to_wbt_flags","bio_trim","bio_uninit","bio_wait_end_io","bioset_exit","bioset_init","bioset_integrity_create","bioset_integrity_free","biovec_init_pool"]},{"type":3,"name":"python","functions":["function__entry"],"binary_path":"/usr/lib64/libpython3.9.so","provider":"python"},{"type":1,"name":"os_page_cache","functions":["add_to_page_cache_lru","clear_page_dirty_for_io","delete_from_page_cache_batch","end_page_writeback","fault_in_safe_writeable","fault_in_subpage_writeable","fault_in_writeable","filemap_add_folio","filemap_alloc_folio","filemap_check_errors","filemap_fdatawait_keep_errors","filemap_fdatawait_range","filemap_fdatawait_range_keep_errors","filemap_fdatawrite","filemap_fdatawrite_range","filemap_fdatawrite_wbc","filemap_flush","filemap_get_folios","filemap_get_folios_contig","filemap_get_folios_tag","filemap_range_has_page","filemap_range_has_writeback","filemap_release_folio","filemap_remove_folio","folio_account_cleaned","folio_add_wait_queue","folio_clear_dirty_for_io","folio_end_private_2","folio_end_writeback","folio_invalidate","folio_mapping","folio_wait_bit","folio_wait_bit_killable","folio_wait_private_2","folio_wait_private_2_killable","folio_wait_stable","folio_wait_writeback","folio_wait_writeback_killable","grab_cache_page_write_begin","invalidate_inode_pages2","invalidate_inode_pages2_range","invalidate_mapping_pages","kiocb_invalidate_pages","kiocb_invalidate_post_direct_write","kiocb_write_and_wait","mapping_read_folio_gfp","mapping_seek_hole_data"]},{"type":1,"name":"shm","functions":["shmem_charge","shmem_file_setup","shmem_file_setup_with_mnt","shmem_get_folio","shmem_get_unmapped_area","shmem_init_fs_context","shmem_kernel_file_setup","shmem_lock","shmem_partial_swap_usage","shmem_read_folio_gfp","shmem_read_mapping_page_gfp","shmem_swap_usage","shmem_truncate_range","shmem_uncharge","shmem_unlock_mapping","shmem_unuse","shmem_zero_setup"]},{"type":1,"name":"fscache","functions":["__fscache_acquire_cookie","__fscache_acquire_volume","__fscache_begin_read_operation","__fscache_begin_write_operation","__fscache_clear_page_bits","__fscache_invalidate","__fscache_relinquish_cookie","__fscache_relinquish_volume","__fscache_resize_cookie","__fscache_unuse_cookie","__fscache_use_cookie","__fscache_write_to_cache"]},{"type":1,"name":"xfs","functions":["xfs_agfblock_init","xfs_agflblock_init","xfs_align_sparse_ino.isra.0","xfs_alloc_ag_max_usable","xfs_alloc_ag_vextent_exact","xfs_alloc_ag_vextent_locality","xfs_alloc_ag_vextent_near","xfs_alloc_ag_vextent_size","xfs_alloc_ag_vextent_small","xfs_alloc_btrec_to_irec","xfs_alloc_buftarg","xfs_alloc_cancel_autoreap","xfs_alloc_check_irec","xfs_alloc_cntbt_iter","xfs_alloc_commit_autoreap","xfs_alloc_compute_aligned","xfs_alloc_compute_diff","xfs_alloc_compute_maxlevels","xfs_alloc_cur_check","xfs_alloc_cur_finish","xfs_alloc_file_space","xfs_alloc_fix_freelist","xfs_alloc_fix_len","xfs_alloc_fixup_trees","xfs_alloc_get_freelist","xfs_alloc_get_rec","xfs_alloc_has_records","xfs_alloc_log_agf","xfs_alloc_longest_free_extent","xfs_alloc_lookup_eq","xfs_alloc_lookup_ge","xfs_alloc_lookup_le","xfs_alloc_min_freelist","xfs_alloc_put_freelist","xfs_alloc_query_all","xfs_alloc_query_range","xfs_alloc_query_range_helper","xfs_alloc_read_agf","xfs_alloc_read_agfl","xfs_alloc_schedule_autoreap","xfs_alloc_set_aside","xfs_alloc_space_available","xfs_alloc_update","xfs_alloc_update_counters","xfs_alloc_vextent_check_args","xfs_alloc_vextent_exact_bno","xfs_alloc_vextent_finish","xfs_alloc_vextent_first_ag","xfs_alloc_vextent_iterate_ags.constprop.0","xfs_alloc_vextent_near_bno","xfs_alloc_vextent_prepare_ag","xfs_alloc_vextent_start_ag","xfs_alloc_vextent_this_ag","xfs_alloc_walk_iter","xfs_allocfree_block_count","xfs_attr_leaf_entsize","xfs_attr_leaf_try_add","xfs_attr_restore_rmt_blk","xfs_btroot_init","xfs_buf_alert_ratelimited","xfs_buf_alloc_pages","xfs_buf_cmp","xfs_buf_corruption_error","xfs_buf_delwri_cancel","xfs_buf_delwri_pushbuf","xfs_buf_delwri_queue","xfs_buf_delwri_queue_here","xfs_buf_delwri_submit","xfs_buf_delwri_submit_buffers","xfs_buf_delwri_submit_nowait","xfs_buf_dquot_io_fail","xfs_buf_dquot_iodone","xfs_buf_find_insert.constprop.0","xfs_buf_find_lock","xfs_buf_free","xfs_buf_free_callback","xfs_buf_free_pages","xfs_buf_get_map","xfs_buf_get_uncached","xfs_buf_hash_destroy","xfs_buf_hash_init","xfs_buf_hold","xfs_buf_inode_io_fail","xfs_buf_inode_iodone","xfs_buf_ioapply_map","xfs_buf_ioend","xfs_buf_ioend_fail","xfs_buf_ioend_handle_error","xfs_buf_ioend_work","xfs_buf_ioerror_alert","xfs_buf_iowait","xfs_buf_item_committed","xfs_buf_item_committing","xfs_buf_item_dirty_format","xfs_buf_item_done","xfs_buf_item_format","xfs_buf_item_format_segment","xfs_buf_item_free","xfs_buf_item_free_format","xfs_buf_item_get_format","xfs_buf_item_init","xfs_buf_item_log","xfs_buf_item_pin","xfs_buf_item_push","xfs_buf_item_put","xfs_buf_item_release","xfs_buf_item_relse","xfs_buf_item_size","xfs_buf_item_size_segment.isra.0","xfs_buf_item_unpin","xfs_buf_lock","xfs_buf_log_check_iovec","xfs_buf_log_overhead","xfs_buf_offset","xfs_buf_read_map","xfs_buf_read_uncached","xfs_buf_readahead_map","xfs_buf_rele","xfs_buf_reverify","xfs_buf_set_ref","xfs_buf_stale","xfs_buf_trylock","xfs_buf_unlock","xfs_buf_verifier_error","xfs_buf_wait_unpin","xfs_buf_zero","xfs_buffered_write_delalloc_punch","xfs_buffered_write_iomap_begin","xfs_buffered_write_iomap_end","xfs_buftarg_drain_rele","xfs_buftarg_isolate","xfs_buftarg_shrink_count","xfs_buftarg_shrink_scan","xfs_bunmapi","xfs_bunmapi_range","xfs_bwrite","xfs_cntbt_diff_two_keys","xfs_cntbt_init_high_key_from_rec","xfs_cntbt_key_diff","xfs_cntbt_keys_inorder","xfs_cntbt_recs_inorder","xfs_cntroot_init","xfs_da3_blk_link","xfs_da3_blk_unlink.isra.0","xfs_da3_blkinfo_verify","xfs_da3_fixhashpath","xfs_da3_join","xfs_da3_node_add","xfs_da3_node_create","xfs_da3_node_hdr_from_disk","xfs_da3_node_hdr_to_disk","xfs_da3_node_lasthash.isra.0","xfs_da3_node_lookup_int","xfs_da3_node_order.isra.0","xfs_da3_node_read","xfs_da3_node_read_mapped","xfs_da3_node_read_verify","xfs_da3_node_rebalance.constprop.0","xfs_da3_node_remove","xfs_da3_node_set_type","xfs_da3_node_split","xfs_da3_node_toosmall","xfs_da3_node_unbalance","xfs_da3_node_verify","xfs_da3_node_verify_struct","xfs_da3_node_write_verify","xfs_da3_path_shift","xfs_da3_root_join","xfs_da3_root_split","xfs_da3_split","xfs_da3_swap_lastblock","xfs_da_buf_copy","xfs_da_compname","xfs_da_get_buf","xfs_da_grow_inode","xfs_da_grow_inode_int","xfs_da_hashname","xfs_da_mount","xfs_da_read_buf","xfs_da_reada_buf","xfs_da_shrink_inode","xfs_da_state_alloc","xfs_da_state_free","xfs_da_state_kill_altpath","xfs_da_state_reset","xfs_da_unmount","xfs_dabuf_map.constprop.0","xfs_dax_write_iomap_end","xfs_dax_writepages","xfs_dio_write_end_io","xfs_direct_write_iomap_begin","xfs_discard_endio","xfs_discard_endio_work","xfs_discard_extents","xfs_discard_folio","xfs_do_force_shutdown","xfs_dquot_buf_read_verify","xfs_dquot_buf_readahead_verify","xfs_dquot_buf_verify","xfs_dquot_buf_verify_crc.isra.0","xfs_dquot_buf_verify_struct","xfs_dquot_buf_write_verify","xfs_end_ioend","xfs_extent_busy_ag_cmp","xfs_extent_busy_clear","xfs_extent_busy_clear_one","xfs_extent_busy_flush","xfs_extent_busy_insert","xfs_extent_busy_insert_discard","xfs_extent_busy_insert_list","xfs_extent_busy_list_empty","xfs_extent_busy_reuse","xfs_extent_busy_search","xfs_extent_busy_trim","xfs_extent_busy_update_extent","xfs_extent_busy_wait_all","xfs_extent_free_abort_intent","xfs_extent_free_cancel_item","xfs_extent_free_create_done","xfs_extent_free_create_intent","xfs_extent_free_diff_items","xfs_extent_free_finish_item","xfs_extent_free_get_group","xfs_extent_free_log_item.constprop.0","xfs_extent_free_recover_work","xfs_extent_free_relog_intent","xfs_extfree_intent_destroy_cache","xfs_file_buffered_read","xfs_file_buffered_write","xfs_file_dax_read","xfs_file_dax_write","xfs_file_dio_read","xfs_file_dio_write_aligned","xfs_file_dio_write_unaligned","xfs_file_fadvise","xfs_file_fallocate","xfs_file_fsync","xfs_file_llseek","xfs_file_mmap","xfs_file_open","xfs_file_read_iter","xfs_file_readdir","xfs_file_release","xfs_file_remap_range","xfs_file_write_checks","xfs_file_write_iter","xfs_filemap_fault","xfs_filemap_huge_fault","xfs_filemap_page_mkwrite","xfs_filemap_pfn_mkwrite","xfs_finobt_init_ptr_from_cur","xfs_free_ag_extent","xfs_freesp_init_recs.isra.0","xfs_fs_alloc_inode","xfs_fs_commit_blocks","xfs_fs_destroy_inode","xfs_fs_dirty_inode","xfs_fs_drop_inode","xfs_fs_encode_fh","xfs_fs_fh_to_dentry","xfs_fs_fh_to_parent","xfs_fs_fill_super","xfs_fs_free","xfs_fs_free_cached_objects","xfs_fs_freeze","xfs_fs_geometry","xfs_fs_get_dqblk","xfs_fs_get_nextdqblk","xfs_fs_get_parent","xfs_fs_get_quota_state","xfs_fs_get_tree","xfs_fs_get_uuid","xfs_fs_goingdown","xfs_fs_inode_init_once","xfs_fs_map_blocks","xfs_fs_mark_healthy","xfs_fs_mark_sick","xfs_fs_measure_sickness","xfs_fs_nfs_commit_metadata","xfs_fs_nr_cached_objects","xfs_fs_parse_param","xfs_fs_put_super","xfs_fs_reconfigure","xfs_fs_reserve_ag_blocks","xfs_fs_rm_xquota","xfs_fs_set_dqblk","xfs_fs_set_info","xfs_fs_show_options","xfs_fs_shutdown","xfs_fs_statfs","xfs_fs_sync_fs","xfs_fs_unfreeze","xfs_fs_unreserve_ag_blocks","xfs_fs_validate_params","xfs_fs_writable","xfs_ialloc_ag_alloc","xfs_ialloc_count_inodes_rec","xfs_ialloc_count_ondisk","xfs_ialloc_get_rec","xfs_ialloc_next_rec","xfs_iflush","xfs_iflush_abort","xfs_iflush_cluster","xfs_iflush_fork","xfs_iflush_shutdown_abort","xfs_ifork_init_attr","xfs_ifork_init_cow","xfs_ifork_verify_local_attr","xfs_ifork_verify_local_data","xfs_ifork_zap_attr","xfs_ifork_zapped","xfs_ilock_for_iomap","xfs_ilock_iocb_for_write","xfs_inode_alloc","xfs_inode_buf_read_verify","xfs_inode_buf_readahead_verify","xfs_inode_buf_verify","xfs_inode_buf_write_verify","xfs_inode_clear_cowblocks_tag","xfs_inode_clear_eofblocks_tag","xfs_inode_free","xfs_inode_free_callback","xfs_inode_free_cowblocks","xfs_inode_free_eofblocks.constprop.0","xfs_inode_from_disk","xfs_inode_from_disk_ts","xfs_inode_hasattr","xfs_inode_inherit_flags","xfs_inode_init_security","xfs_inode_item_attr_fork_size","xfs_inode_item_committed","xfs_inode_item_committing","xfs_inode_item_data_fork_size","xfs_inode_item_destroy","xfs_inode_item_format","xfs_inode_item_format_attr_fork","xfs_inode_item_format_convert","xfs_inode_item_format_data_fork","xfs_inode_item_init","xfs_inode_item_pin","xfs_inode_item_precommit","xfs_inode_item_push","xfs_inode_item_release","xfs_inode_item_size","xfs_inode_item_sort","xfs_inode_item_unpin","xfs_inode_mark_healthy","xfs_inode_mark_reclaimable","xfs_inode_mark_sick","xfs_inode_measure_sickness","xfs_inode_near_dquot_enforcement","xfs_inode_needs_inactive","xfs_inode_reload_unlinked","xfs_inode_reload_unlinked_bucket","xfs_inode_set_cowblocks_tag","xfs_inode_set_eofblocks_tag","xfs_inode_to_disk","xfs_inode_to_log_dinode","xfs_inode_validate_cowextsize","xfs_inode_validate_extsize","xfs_inode_verifier_error","xfs_iomap_eof_align_last_fsb","xfs_iomap_inode_sequence","xfs_iomap_prealloc_size.constprop.0.isra.0","xfs_iomap_swapfile_activate","xfs_iomap_valid","xfs_iomap_write_direct","xfs_iomap_write_unwritten","xfs_iread_bmbt_block","xfs_lookup_get_search_key","xfs_map_blocks","xfs_mru_cache_create","xfs_mru_cache_delete","xfs_mru_cache_destroy","xfs_mru_cache_done","xfs_mru_cache_init","xfs_mru_cache_insert","xfs_mru_cache_lookup","xfs_mru_cache_remove","xfs_mru_cache_uninit","xfs_nfs_get_inode.isra.0","xfs_prepare_ioend","xfs_read_agf","xfs_read_agi","xfs_read_iomap_begin","xfs_readdir","xfs_readlink","xfs_readlink_bmap_ilocked","xfs_readlink_by_handle","xfs_release","xfs_remove","xfs_rename","xfs_reserve_blocks","xfs_restore_resvblks","xfs_vm_bmap","xfs_vm_read_folio","xfs_vm_readahead","xfs_vm_writepages","xfs_xattr_iomap_begin"]},{"type":1,"name":"ext4","functions":["ext4_alloc_branch","ext4_alloc_da_blocks","ext4_alloc_file_blocks.isra.0","ext4_alloc_flex_bg_array","ext4_alloc_group_tables","ext4_alloc_inode","ext4_alloc_io_end_vec","ext4_append","ext4_block_bitmap","ext4_block_bitmap_csum_set","ext4_block_bitmap_csum_verify","ext4_block_bitmap_set","ext4_block_to_path","ext4_block_write_begin","ext4_block_zero_page_range","ext4_bmap","ext4_bread","ext4_bread_batch","ext4_da_convert_inline_data_to_extent","ext4_da_get_block_prep","ext4_da_map_blocks.constprop.0","ext4_da_release_space","ext4_da_reserve_space","ext4_da_update_reserve_space","ext4_da_write_begin","ext4_da_write_end","ext4_da_write_inline_data_begin","ext4_dio_alignment","ext4_dio_write_checks","ext4_dio_write_end_io","ext4_dio_write_iter","ext4_dirty_folio","ext4_dirty_inode","ext4_end_buffer_io_sync","ext4_end_io_rsv_work","ext4_exit_es","ext4_exit_mballoc","ext4_exit_pageio","ext4_exit_pending","ext4_exit_post_read_processing","ext4_exit_sysfs","ext4_exit_system_zone","ext4_ext_calc_credits_for_single_extent","ext4_ext_check_inode","ext4_ext_clear_bb","ext4_ext_convert_to_initialized","ext4_ext_correct_indexes","ext4_ext_find_goal","ext4_ext_get_access","ext4_ext_grow_indepth","ext4_ext_handle_unwritten_extents","ext4_ext_index_trans_blocks","ext4_ext_init","ext4_ext_insert_extent","ext4_ext_insert_index","ext4_ext_map_blocks","ext4_ext_migrate","ext4_ext_next_allocated_block","ext4_ext_precache","ext4_ext_precache.part.0","ext4_ext_release","ext4_ext_remove_space","ext4_ext_replay_set_iblocks","ext4_ext_replay_shrink_inode","ext4_ext_replay_update_ex","ext4_ext_rm_idx","ext4_ext_rm_leaf","ext4_ext_search_left","ext4_ext_search_right","ext4_ext_shift_extents","ext4_ext_shift_path_extents","ext4_ext_split","ext4_ext_swap_inode_data","ext4_ext_tree_init","ext4_ext_truncate","ext4_ext_try_to_merge","ext4_ext_try_to_merge_right","ext4_ext_try_to_merge_up","ext4_extent_block_csum_set","ext4_fallocate","ext4_fh_to_dentry","ext4_fh_to_parent","ext4_fiemap","ext4_file_getattr","ext4_file_mmap","ext4_file_open","ext4_file_read_iter","ext4_file_write_iter","ext4_fileattr_get","ext4_fileattr_set","ext4_find_dest_de","ext4_find_entry","ext4_find_extent","ext4_find_inline_data_nolock","ext4_find_inline_entry","ext4_find_shared","ext4_finish_convert_inline_dir","ext4_free_blocks","ext4_free_blocks_simple.isra.0","ext4_free_branches","ext4_free_clusters_after_init","ext4_free_data","ext4_free_ext_path","ext4_free_group_clusters","ext4_free_group_clusters_set","ext4_free_in_core_inode","ext4_free_inode","ext4_free_inodes_count","ext4_free_inodes_set","ext4_free_link","ext4_io_submit","ext4_io_submit_init","ext4_iomap_begin","ext4_iomap_begin_report","ext4_iomap_end","ext4_iomap_overwrite_begin","ext4_iomap_swap_activate","ext4_iomap_xattr_begin","ext4_journal_abort_handle.constprop.0","ext4_journal_bmap","ext4_journal_check_start","ext4_journal_commit_callback","ext4_journal_finish_inode_data_buffers","ext4_journal_submit_inode_data_buffers","ext4_journalled_dirty_folio","ext4_journalled_invalidate_folio","ext4_journalled_submit_inode_data_buffers","ext4_journalled_write_end","ext4_journalled_write_inline_data","ext4_journalled_writepage_callback","ext4_journalled_zero_new_buffers","ext4_mark_bitmap_end","ext4_mark_bitmap_end.part.0","ext4_mark_dquot_dirty","ext4_mark_group_bitmap_corrupted","ext4_mark_iloc_dirty","ext4_mark_inode_used","ext4_mark_recovery_complete.constprop.0","ext4_mballoc_query_range","ext4_meta_trans_blocks","ext4_mkdir","ext4_mknod","ext4_move_extents","ext4_read_bh","ext4_read_bh_lock","ext4_read_bh_nowait","ext4_read_block_bitmap","ext4_read_block_bitmap_nowait","ext4_read_folio","ext4_read_inline_data.part.0.isra.0","ext4_read_inline_dir","ext4_read_inline_link","ext4_read_inline_page","ext4_read_inode_bitmap","ext4_read_merkle_tree_page","ext4_readahead","ext4_readdir","ext4_readpage_inline","ext4_release_io_end","ext4_statfs","ext4_swap_extents","ext4_symlink","ext4_sync_file","ext4_sync_fs","ext4_tmpfile","ext4_trim_all_free","ext4_trim_fs","ext4_truncate","ext4_unfreeze","ext4_unlink","ext4_write_begin","ext4_write_dquot","ext4_write_end","ext4_write_info","ext4_write_inline_data","ext4_write_inline_data_end","ext4_write_inode","ext4_write_merkle_tree_block","ext4_writepage","ext4_writepage_cb","ext4_writepage_trans_blocks","ext4_writepages"]},{"type":1,"name":"iomap","functions":["iomap_add_to_ioend","iomap_adjust_read_range.isra.0","iomap_bmap","iomap_dio_complete","iomap_dio_complete_work","iomap_dio_deferred_complete","iomap_dio_inline_iter","iomap_dio_rw","iomap_dio_zero","iomap_dirty_folio","iomap_do_writepage","iomap_fiemap","iomap_file_buffered_write","iomap_file_buffered_write_punch_delalloc","iomap_file_unshare","iomap_finish_ioend","iomap_finish_ioends","iomap_get_folio","iomap_invalidate_folio","iomap_ioend_compare","iomap_ioend_try_merge","iomap_is_partially_uptodate","iomap_iter","iomap_page_mkwrite","iomap_read_end_io","iomap_read_folio","iomap_read_folio_sync","iomap_read_inline_data","iomap_readahead","iomap_readpage_iter","iomap_release_folio","iomap_seek_data","iomap_seek_hole","iomap_sort_ioends","iomap_submit_ioend","iomap_swapfile_activate","iomap_swapfile_add_extent","iomap_swapfile_fail","iomap_swapfile_iter","iomap_to_bh","iomap_to_fiemap","iomap_truncate_page","iomap_unshare_iter","iomap_write_begin","iomap_write_delalloc_release","iomap_write_end","iomap_write_iter","iomap_writepage_map","iomap_writepages","iomap_zero_iter","iomap_zero_range"]},{"type":2,"name":"mpi","functions":["MPIX_Comm_ack_failed","MPIX_Comm_ack_failed.cold","MPIX_Comm_agree","MPIX_Comm_agree.cold","MPIX_Comm_failure_ack","MPIX_Comm_failure_ack.cold","MPIX_Comm_failure_get_acked","MPIX_Comm_failure_get_acked.cold","MPIX_Comm_get_failed","MPIX_Comm_get_failed.cold","MPIX_Comm_iagree","MPIX_Comm_iagree.cold","MPIX_Comm_is_revoked","MPIX_Comm_revoke","MPIX_Comm_revoke.cold","MPIX_Comm_shrink","MPIX_Comm_shrink.cold","MPIX_Query_cuda_support","MPIX_Query_rocm_support","MPI_AINT_ADD_F90","MPI_AINT_DIFF_F90","MPI_Abort","MPI_Accumulate","MPI_Add_error_class","MPI_Add_error_code","MPI_Add_error_string","MPI_Address","MPI_Allgather","MPI_Allgather_init","MPI_Allgatherv","MPI_Allgatherv_init","MPI_Alloc_mem","MPI_Allreduce","MPI_Allreduce_init","MPI_Alltoall","MPI_Alltoall_init","MPI_Alltoallv","MPI_Alltoallv_init","MPI_Alltoallw","MPI_Alltoallw_init","MPI_Attr_delete","MPI_Attr_get","MPI_Attr_put","MPI_Barrier","MPI_Barrier_init","MPI_Bcast","MPI_Bcast_init","MPI_Bsend","MPI_Bsend_init","MPI_Buffer_attach","MPI_Buffer_detach","MPI_COMM_DUP_FN","MPI_COMM_NULL_COPY_FN","MPI_COMM_NULL_DELETE_FN","MPI_CONVERSION_FN_NULL","MPI_Cancel","MPI_Cart_coords","MPI_Cart_create","MPI_Cart_get","MPI_Cart_map","MPI_Cart_rank","MPI_Cart_shift","MPI_Cart_sub","MPI_Cartdim_get","MPI_Close_port","MPI_Comm_accept","MPI_Comm_c2f","MPI_Comm_call_errhandler","MPI_Comm_compare","MPI_Comm_connect","MPI_Comm_create","MPI_Comm_create_errhandler","MPI_Comm_create_from_group","MPI_Comm_create_group","MPI_Comm_create_keyval","MPI_Comm_delete_attr","MPI_Comm_disconnect","MPI_Comm_dup","MPI_Comm_dup_with_info","MPI_Comm_f2c","MPI_Comm_free","MPI_Comm_free_keyval","MPI_Comm_get_attr","MPI_Comm_get_errhandler","MPI_Comm_get_info","MPI_Comm_get_name","MPI_Comm_get_parent","MPI_Comm_group","MPI_Comm_idup","MPI_Comm_idup_with_info","MPI_Comm_join","MPI_Comm_rank","MPI_Comm_remote_group","MPI_Comm_remote_size","MPI_Comm_set_attr","MPI_Comm_set_errhandler","MPI_Comm_set_info","MPI_Comm_set_name","MPI_Comm_size","MPI_Comm_spawn","MPI_Comm_spawn_multiple","MPI_Comm_split","MPI_Comm_split_type","MPI_Comm_test_inter","MPI_Compare_and_swap","MPI_DUP_FN","MPI_Dims_create","MPI_Dist_graph_create","MPI_Dist_graph_create_adjacent","MPI_Dist_graph_neighbors","MPI_Dist_graph_neighbors_count","MPI_Errhandler_c2f","MPI_Errhandler_create","MPI_Errhandler_f2c","MPI_Errhandler_free","MPI_Errhandler_get","MPI_Errhandler_set","MPI_Error_class","MPI_Error_string","MPI_Exscan","MPI_Exscan_init","MPI_Fetch_and_op","MPI_File_c2f","MPI_File_call_errhandler","MPI_File_close","MPI_File_create_errhandler","MPI_File_delete","MPI_File_f2c","MPI_File_get_amode","MPI_File_get_atomicity","MPI_File_get_byte_offset","MPI_File_get_errhandler","MPI_File_get_group","MPI_File_get_info","MPI_File_get_position","MPI_File_get_position_shared","MPI_File_get_size","MPI_File_get_type_extent","MPI_File_get_view","MPI_File_iread","MPI_File_iread_all","MPI_File_iread_at","MPI_File_iread_at_all","MPI_File_iread_shared","MPI_File_iwrite","MPI_File_iwrite_all","MPI_File_iwrite_at","MPI_File_iwrite_at_all","MPI_File_iwrite_shared","MPI_File_open","MPI_File_preallocate","MPI_File_read","MPI_File_read_all","MPI_File_read_all_begin","MPI_File_read_all_end","MPI_File_read_at","MPI_File_read_at_all","MPI_File_read_at_all_begin","MPI_File_read_at_all_end","MPI_File_read_ordered","MPI_File_read_ordered_begin","MPI_File_read_ordered_end","MPI_File_read_shared","MPI_File_seek","MPI_File_seek_shared","MPI_File_set_atomicity","MPI_File_set_errhandler","MPI_File_set_info","MPI_File_set_size","MPI_File_set_view","MPI_File_sync","MPI_File_write","MPI_File_write_all","MPI_File_write_all_begin","MPI_File_write_all_end","MPI_File_write_at","MPI_File_write_at_all","MPI_File_write_at_all_begin","MPI_File_write_at_all_end","MPI_File_write_ordered","MPI_File_write_ordered_begin","MPI_File_write_ordered_end","MPI_File_write_shared","MPI_Finalize","MPI_Finalized","MPI_Free_mem","MPI_Gather","MPI_Gather_init","MPI_Gatherv","MPI_Gatherv_init","MPI_Get","MPI_Get_accumulate","MPI_Get_address","MPI_Get_count","MPI_Get_elements","MPI_Get_elements_x","MPI_Get_library_version","MPI_Get_processor_name","MPI_Get_version","MPI_Graph_create","MPI_Graph_get","MPI_Graph_map","MPI_Graph_neighbors","MPI_Graph_neighbors_count","MPI_Graphdims_get","MPI_Grequest_complete","MPI_Grequest_start","MPI_Group_c2f","MPI_Group_compare","MPI_Group_difference","MPI_Group_excl","MPI_Group_f2c","MPI_Group_free","MPI_Group_from_session_pset","MPI_Group_incl","MPI_Group_intersection","MPI_Group_range_excl","MPI_Group_range_incl","MPI_Group_rank","MPI_Group_size","MPI_Group_translate_ranks","MPI_Group_union","MPI_Iallgather","MPI_Iallgatherv","MPI_Iallreduce","MPI_Ialltoall","MPI_Ialltoallv","MPI_Ialltoallw","MPI_Ibarrier","MPI_Ibcast","MPI_Ibsend","MPI_Iexscan","MPI_Igather","MPI_Igatherv","MPI_Improbe","MPI_Imrecv","MPI_Ineighbor_allgather","MPI_Ineighbor_allgatherv","MPI_Ineighbor_alltoall","MPI_Ineighbor_alltoallv","MPI_Ineighbor_alltoallw","MPI_Info_c2f","MPI_Info_create","MPI_Info_create_env","MPI_Info_delete","MPI_Info_dup","MPI_Info_f2c","MPI_Info_free","MPI_Info_get","MPI_Info_get_nkeys","MPI_Info_get_nthkey","MPI_Info_get_string","MPI_Info_get_valuelen","MPI_Info_set","MPI_Init","MPI_Init_thread","MPI_Initialized","MPI_Intercomm_create","MPI_Intercomm_create_from_groups","MPI_Intercomm_merge","MPI_Iprobe","MPI_Irecv","MPI_Ireduce","MPI_Ireduce_scatter","MPI_Ireduce_scatter_block","MPI_Irsend","MPI_Is_thread_main","MPI_Iscan","MPI_Iscatter","MPI_Iscatterv","MPI_Isend","MPI_Isendrecv","MPI_Isendrecv_replace","MPI_Issend","MPI_Keyval_create","MPI_Keyval_free","MPI_Lookup_name","MPI_Message_c2f","MPI_Message_f2c","MPI_Mprobe","MPI_Mrecv","MPI_NULL_COPY_FN","MPI_NULL_DELETE_FN","MPI_Neighbor_allgather","MPI_Neighbor_allgather_init","MPI_Neighbor_allgatherv","MPI_Neighbor_allgatherv_init","MPI_Neighbor_alltoall","MPI_Neighbor_alltoall_init","MPI_Neighbor_alltoallv","MPI_Neighbor_alltoallv_init","MPI_Neighbor_alltoallw","MPI_Neighbor_alltoallw_init","MPI_Op_c2f","MPI_Op_commutative","MPI_Op_create","MPI_Op_f2c","MPI_Op_free","MPI_Open_port","MPI_Pack","MPI_Pack_external","MPI_Pack_external_size","MPI_Pack_size","MPI_Parrived","MPI_Pcontrol","MPI_Pready","MPI_Pready_list","MPI_Pready_range","MPI_Precv_init","MPI_Probe","MPI_Psend_init","MPI_Publish_name","MPI_Put","MPI_Query_thread","MPI_Raccumulate","MPI_Recv","MPI_Recv_init","MPI_Reduce","MPI_Reduce_init","MPI_Reduce_local","MPI_Reduce_scatter","MPI_Reduce_scatter_block","MPI_Reduce_scatter_block_init","MPI_Reduce_scatter_init","MPI_Register_datarep","MPI_Request_c2f","MPI_Request_f2c","MPI_Request_free","MPI_Request_get_status","MPI_Rget","MPI_Rget_accumulate","MPI_Rput","MPI_Rsend","MPI_Rsend_init","MPI_Scan","MPI_Scan_init","MPI_Scatter","MPI_Scatter_init","MPI_Scatterv","MPI_Scatterv_init","MPI_Send","MPI_Send_init","MPI_Sendrecv","MPI_Sendrecv_replace","MPI_Session_c2f","MPI_Session_call_errhandler","MPI_Session_create_errhandler","MPI_Session_f2c","MPI_Session_finalize","MPI_Session_get_errhandler","MPI_Session_get_info","MPI_Session_get_nth_pset","MPI_Session_get_num_psets","MPI_Session_get_pset_info","MPI_Session_init","MPI_Session_set_errhandler","MPI_Session_set_info","MPI_Ssend","MPI_Ssend_init","MPI_Start","MPI_Startall","MPI_Status_c2f","MPI_Status_c2f08","MPI_Status_f082c","MPI_Status_f082f","MPI_Status_f2c","MPI_Status_f2f08","MPI_Status_set_cancelled","MPI_Status_set_elements","MPI_Status_set_elements_x","MPI_TYPE_DUP_FN","MPI_TYPE_NULL_COPY_FN","MPI_TYPE_NULL_DELETE_FN","MPI_T_category_changed","MPI_T_category_get_categories","MPI_T_category_get_cvars","MPI_T_category_get_index","MPI_T_category_get_info","MPI_T_category_get_num","MPI_T_category_get_pvars","MPI_T_cvar_get_index","MPI_T_cvar_get_info","MPI_T_cvar_get_num","MPI_T_cvar_handle_alloc","MPI_T_cvar_handle_free","MPI_T_cvar_read","MPI_T_cvar_write","MPI_T_enum_get_info","MPI_T_enum_get_item","MPI_T_finalize","MPI_T_init_thread","MPI_T_pvar_get_index","MPI_T_pvar_get_info","MPI_T_pvar_get_num","MPI_T_pvar_handle_alloc","MPI_T_pvar_handle_free","MPI_T_pvar_read","MPI_T_pvar_readreset","MPI_T_pvar_reset","MPI_T_pvar_session_create","MPI_T_pvar_session_free","MPI_T_pvar_start","MPI_T_pvar_stop","MPI_T_pvar_write","MPI_Test","MPI_Test_cancelled","MPI_Testall","MPI_Testany","MPI_Testsome","MPI_Topo_test","MPI_Type_c2f","MPI_Type_commit","MPI_Type_contiguous","MPI_Type_create_darray","MPI_Type_create_f90_complex","MPI_Type_create_f90_integer","MPI_Type_create_f90_real","MPI_Type_create_hindexed","MPI_Type_create_hindexed_block","MPI_Type_create_hvector","MPI_Type_create_indexed_block","MPI_Type_create_keyval","MPI_Type_create_resized","MPI_Type_create_struct","MPI_Type_create_subarray","MPI_Type_delete_attr","MPI_Type_dup","MPI_Type_extent","MPI_Type_f2c","MPI_Type_free","MPI_Type_free_keyval","MPI_Type_get_attr","MPI_Type_get_contents","MPI_Type_get_envelope","MPI_Type_get_extent","MPI_Type_get_extent_x","MPI_Type_get_name","MPI_Type_get_true_extent","MPI_Type_get_true_extent_x","MPI_Type_hindexed","MPI_Type_hvector","MPI_Type_indexed","MPI_Type_lb","MPI_Type_match_size","MPI_Type_set_attr","MPI_Type_set_name","MPI_Type_size","MPI_Type_size_x","MPI_Type_struct","MPI_Type_ub","MPI_Type_vector","MPI_Unpack","MPI_Unpack_external","MPI_Unpublish_name","MPI_WIN_DUP_FN","MPI_WIN_NULL_COPY_FN","MPI_WIN_NULL_DELETE_FN","MPI_WTICK_F90","MPI_WTIME_F90","MPI_Wait","MPI_Waitall","MPI_Waitany","MPI_Waitsome","MPI_Win_allocate","MPI_Win_allocate_shared","MPI_Win_attach","MPI_Win_c2f","MPI_Win_call_errhandler","MPI_Win_complete","MPI_Win_create","MPI_Win_create_dynamic","MPI_Win_create_errhandler","MPI_Win_create_keyval","MPI_Win_delete_attr","MPI_Win_detach","MPI_Win_f2c","MPI_Win_fence","MPI_Win_flush","MPI_Win_flush_all","MPI_Win_flush_local","MPI_Win_flush_local_all","MPI_Win_free","MPI_Win_free_keyval","MPI_Win_get_attr","MPI_Win_get_errhandler","MPI_Win_get_group","MPI_Win_get_info","MPI_Win_get_name","MPI_Win_lock","MPI_Win_lock_all","MPI_Win_post","MPI_Win_set_attr","MPI_Win_set_errhandler","MPI_Win_set_info","MPI_Win_set_name","MPI_Win_shared_query","MPI_Win_start","MPI_Win_sync","MPI_Win_test","MPI_Win_unlock","MPI_Win_unlock_all","MPI_Win_wait","MPI_Wtick","MPI_Wtime","NBC_Comm_neighbors","NBC_Comm_neighbors_count","NBC_Error","NBC_Error.constprop.0:0x12d820","NBC_Error.constprop.0:0x12e380","NBC_Error.constprop.0:0x12ee10","NBC_Error.constprop.0:0x130de0","NBC_Error.constprop.0:0x138c20","NBC_Error.constprop.0:0x13a930","NBC_Error.constprop.0:0x13bee0","NBC_Init_comm","NBC_Progress","NBC_Return_handle","NBC_Sched_barrier","NBC_Sched_commit","NBC_Sched_copy","NBC_Sched_local_recv","NBC_Sched_local_send","NBC_Sched_op","NBC_Sched_recv","NBC_Sched_send","NBC_Sched_unpack","NBC_Schedule_request","NBC_Start","NBC_Start_round","OMPI_Affinity_str","OMPI_Affinity_str.cold","OMPI_C_MPI_COMM_DUP_FN","OMPI_C_MPI_COMM_NULL_COPY_FN","OMPI_C_MPI_COMM_NULL_DELETE_FN","OMPI_C_MPI_DUP_FN","OMPI_C_MPI_NULL_COPY_FN","OMPI_C_MPI_NULL_DELETE_FN","OMPI_C_MPI_TYPE_DUP_FN","OMPI_C_MPI_TYPE_NULL_COPY_FN","OMPI_C_MPI_TYPE_NULL_DELETE_FN","OMPI_C_MPI_WIN_DUP_FN","OMPI_C_MPI_WIN_NULL_COPY_FN","OMPI_C_MPI_WIN_NULL_DELETE_FN","OMPI_TEST_FORTRAN_CONSTANTS","PMPIX_Comm_ack_failed","PMPIX_Comm_ack_failed.cold","PMPIX_Comm_agree","PMPIX_Comm_agree.cold","PMPIX_Comm_failure_ack","PMPIX_Comm_failure_ack.cold","PMPIX_Comm_failure_get_acked","PMPIX_Comm_failure_get_acked.cold","PMPIX_Comm_get_failed","PMPIX_Comm_get_failed.cold","PMPIX_Comm_iagree","PMPIX_Comm_iagree.cold","PMPIX_Comm_is_revoked","PMPIX_Comm_revoke","PMPIX_Comm_revoke.cold","PMPIX_Comm_shrink","PMPIX_Comm_shrink.cold","PMPI_Abort","PMPI_Accumulate","PMPI_Accumulate.cold","PMPI_Add_error_class","PMPI_Add_error_class.cold","PMPI_Add_error_code","PMPI_Add_error_code.cold","PMPI_Add_error_string","PMPI_Address","PMPI_Allgather","PMPI_Allgather.cold","PMPI_Allgather_init","PMPI_Allgather_init.cold","PMPI_Allgatherv","PMPI_Allgatherv.cold","PMPI_Allgatherv_init","PMPI_Allgatherv_init.cold","PMPI_Alloc_mem","PMPI_Allreduce","PMPI_Allreduce.cold","PMPI_Allreduce_init","PMPI_Allreduce_init.cold","PMPI_Alltoall","PMPI_Alltoall.cold","PMPI_Alltoall_init","PMPI_Alltoall_init.cold","PMPI_Alltoallv","PMPI_Alltoallv.cold","PMPI_Alltoallv_init","PMPI_Alltoallv_init.cold","PMPI_Alltoallw","PMPI_Alltoallw.cold","PMPI_Alltoallw_init","PMPI_Alltoallw_init.cold","PMPI_Attr_delete","PMPI_Attr_get","PMPI_Attr_get.cold","PMPI_Attr_put","PMPI_Barrier","PMPI_Barrier.cold","PMPI_Barrier_init","PMPI_Barrier_init.cold","PMPI_Bcast","PMPI_Bcast.cold","PMPI_Bcast_init","PMPI_Bcast_init.cold","PMPI_Bsend","PMPI_Bsend.cold","PMPI_Bsend_init","PMPI_Bsend_init.cold","PMPI_Buffer_attach","PMPI_Buffer_detach","PMPI_Cancel","PMPI_Cancel.cold","PMPI_Cart_coords","PMPI_Cart_coords.cold","PMPI_Cart_create","PMPI_Cart_create.cold","PMPI_Cart_get","PMPI_Cart_get.cold","PMPI_Cart_map","PMPI_Cart_map.cold","PMPI_Cart_rank","PMPI_Cart_rank.cold","PMPI_Cart_shift","PMPI_Cart_shift.cold","PMPI_Cart_sub","PMPI_Cart_sub.cold","PMPI_Cartdim_get","PMPI_Cartdim_get.cold","PMPI_Close_port","PMPI_Close_port.cold","PMPI_Comm_accept","PMPI_Comm_accept.cold","PMPI_Comm_c2f","PMPI_Comm_call_errhandler","PMPI_Comm_call_errhandler.cold","PMPI_Comm_compare","PMPI_Comm_compare.cold","PMPI_Comm_connect","PMPI_Comm_connect.cold","PMPI_Comm_create","PMPI_Comm_create.cold","PMPI_Comm_create_errhandler","PMPI_Comm_create_from_group","PMPI_Comm_create_group","PMPI_Comm_create_group.cold","PMPI_Comm_create_keyval","PMPI_Comm_delete_attr","PMPI_Comm_disconnect","PMPI_Comm_dup","PMPI_Comm_dup.cold","PMPI_Comm_dup_with_info","PMPI_Comm_dup_with_info.cold","PMPI_Comm_f2c","PMPI_Comm_free","PMPI_Comm_free.cold","PMPI_Comm_free_keyval","PMPI_Comm_get_attr","PMPI_Comm_get_errhandler","PMPI_Comm_get_info","PMPI_Comm_get_name","PMPI_Comm_get_parent","PMPI_Comm_group","PMPI_Comm_group.cold","PMPI_Comm_idup","PMPI_Comm_idup.cold","PMPI_Comm_idup_with_info","PMPI_Comm_idup_with_info.cold","PMPI_Comm_join","PMPI_Comm_join.cold","PMPI_Comm_rank","PMPI_Comm_remote_group","PMPI_Comm_remote_size","PMPI_Comm_set_attr","PMPI_Comm_set_errhandler","PMPI_Comm_set_info","PMPI_Comm_set_name","PMPI_Comm_set_name.cold","PMPI_Comm_size","PMPI_Comm_spawn","PMPI_Comm_spawn.cold","PMPI_Comm_spawn_multiple","PMPI_Comm_spawn_multiple.cold","PMPI_Comm_split","PMPI_Comm_split.cold","PMPI_Comm_split_type","PMPI_Comm_split_type.cold","PMPI_Comm_test_inter","PMPI_Compare_and_swap","PMPI_Compare_and_swap.cold","PMPI_Dims_create","PMPI_Dist_graph_create","PMPI_Dist_graph_create.cold","PMPI_Dist_graph_create_adjacent","PMPI_Dist_graph_create_adjacent.cold","PMPI_Dist_graph_neighbors","PMPI_Dist_graph_neighbors.cold","PMPI_Dist_graph_neighbors_count","PMPI_Dist_graph_neighbors_count.cold","PMPI_Errhandler_c2f","PMPI_Errhandler_create","PMPI_Errhandler_f2c","PMPI_Errhandler_free","PMPI_Errhandler_get","PMPI_Errhandler_set","PMPI_Error_class","PMPI_Error_class.cold","PMPI_Error_string","PMPI_Error_string.cold","PMPI_Exscan","PMPI_Exscan.cold","PMPI_Exscan_init","PMPI_Exscan_init.cold","PMPI_Fetch_and_op","PMPI_Fetch_and_op.cold","PMPI_File_c2f","PMPI_File_call_errhandler","PMPI_File_call_errhandler.cold","PMPI_File_close","PMPI_File_close.cold","PMPI_File_create_errhandler","PMPI_File_delete","PMPI_File_delete.cold","PMPI_File_f2c","PMPI_File_get_amode","PMPI_File_get_amode.cold","PMPI_File_get_atomicity","PMPI_File_get_atomicity.cold","PMPI_File_get_byte_offset","PMPI_File_get_byte_offset.cold","PMPI_File_get_errhandler","PMPI_File_get_group","PMPI_File_get_group.cold","PMPI_File_get_info","PMPI_File_get_info.cold","PMPI_File_get_position","PMPI_File_get_position.cold","PMPI_File_get_position_shared","PMPI_File_get_position_shared.cold","PMPI_File_get_size","PMPI_File_get_size.cold","PMPI_File_get_type_extent","PMPI_File_get_type_extent.cold","PMPI_File_get_view","PMPI_File_get_view.cold","PMPI_File_iread","PMPI_File_iread.cold","PMPI_File_iread_all","PMPI_File_iread_all.cold","PMPI_File_iread_at","PMPI_File_iread_at.cold","PMPI_File_iread_at_all","PMPI_File_iread_at_all.cold","PMPI_File_iread_shared","PMPI_File_iread_shared.cold","PMPI_File_iwrite","PMPI_File_iwrite.cold","PMPI_File_iwrite_all","PMPI_File_iwrite_all.cold","PMPI_File_iwrite_at","PMPI_File_iwrite_at.cold","PMPI_File_iwrite_at_all","PMPI_File_iwrite_at_all.cold","PMPI_File_iwrite_shared","PMPI_File_iwrite_shared.cold","PMPI_File_open","PMPI_File_open.cold","PMPI_File_preallocate","PMPI_File_preallocate.cold","PMPI_File_read","PMPI_File_read.cold","PMPI_File_read_all","PMPI_File_read_all.cold","PMPI_File_read_all_begin","PMPI_File_read_all_begin.cold","PMPI_File_read_all_end","PMPI_File_read_all_end.cold","PMPI_File_read_at","PMPI_File_read_at.cold","PMPI_File_read_at_all","PMPI_File_read_at_all.cold","PMPI_File_read_at_all_begin","PMPI_File_read_at_all_begin.cold","PMPI_File_read_at_all_end","PMPI_File_read_at_all_end.cold","PMPI_File_read_ordered","PMPI_File_read_ordered.cold","PMPI_File_read_ordered_begin","PMPI_File_read_ordered_begin.cold","PMPI_File_read_ordered_end","PMPI_File_read_ordered_end.cold","PMPI_File_read_shared","PMPI_File_read_shared.cold","PMPI_File_seek","PMPI_File_seek.cold","PMPI_File_seek_shared","PMPI_File_seek_shared.cold","PMPI_File_set_atomicity","PMPI_File_set_atomicity.cold","PMPI_File_set_errhandler","PMPI_File_set_info","PMPI_File_set_info.cold","PMPI_File_set_size","PMPI_File_set_size.cold","PMPI_File_set_view","PMPI_File_set_view.cold","PMPI_File_sync","PMPI_File_sync.cold","PMPI_File_write","PMPI_File_write.cold","PMPI_File_write_all","PMPI_File_write_all.cold","PMPI_File_write_all_begin","PMPI_File_write_all_begin.cold","PMPI_File_write_all_end","PMPI_File_write_all_end.cold","PMPI_File_write_at","PMPI_File_write_at.cold","PMPI_File_write_at_all","PMPI_File_write_at_all.cold","PMPI_File_write_at_all_begin","PMPI_File_write_at_all_begin.cold","PMPI_File_write_at_all_end","PMPI_File_write_at_all_end.cold","PMPI_File_write_ordered","PMPI_File_write_ordered.cold","PMPI_File_write_ordered_begin","PMPI_File_write_ordered_begin.cold","PMPI_File_write_ordered_end","PMPI_File_write_ordered_end.cold","PMPI_File_write_shared","PMPI_File_write_shared.cold","PMPI_Finalize","PMPI_Finalized","PMPI_Free_mem","PMPI_Gather","PMPI_Gather.cold","PMPI_Gather_init","PMPI_Gather_init.cold","PMPI_Gatherv","PMPI_Gatherv.cold","PMPI_Gatherv_init","PMPI_Gatherv_init.cold","PMPI_Get","PMPI_Get.cold","PMPI_Get_accumulate","PMPI_Get_accumulate.cold","PMPI_Get_address","PMPI_Get_count","PMPI_Get_elements","PMPI_Get_elements_x","PMPI_Get_library_version","PMPI_Get_processor_name","PMPI_Get_version","PMPI_Graph_create","PMPI_Graph_create.cold","PMPI_Graph_get","PMPI_Graph_get.cold","PMPI_Graph_map","PMPI_Graph_map.cold","PMPI_Graph_neighbors","PMPI_Graph_neighbors.cold","PMPI_Graph_neighbors_count","PMPI_Graph_neighbors_count.cold","PMPI_Graphdims_get","PMPI_Graphdims_get.cold","PMPI_Grequest_complete","PMPI_Grequest_start","PMPI_Grequest_start.cold","PMPI_Group_c2f","PMPI_Group_compare","PMPI_Group_difference","PMPI_Group_difference.cold","PMPI_Group_excl","PMPI_Group_excl.cold","PMPI_Group_f2c","PMPI_Group_free","PMPI_Group_free.cold","PMPI_Group_from_session_pset","PMPI_Group_from_session_pset.cold","PMPI_Group_incl","PMPI_Group_incl.cold","PMPI_Group_intersection","PMPI_Group_intersection.cold","PMPI_Group_range_excl","PMPI_Group_range_excl.cold","PMPI_Group_range_incl","PMPI_Group_range_incl.cold","PMPI_Group_rank","PMPI_Group_size","PMPI_Group_translate_ranks","PMPI_Group_translate_ranks.cold","PMPI_Group_union","PMPI_Group_union.cold","PMPI_Iallgather","PMPI_Iallgather.cold","PMPI_Iallgatherv","PMPI_Iallgatherv.cold","PMPI_Iallreduce","PMPI_Iallreduce.cold","PMPI_Ialltoall","PMPI_Ialltoall.cold","PMPI_Ialltoallv","PMPI_Ialltoallv.cold","PMPI_Ialltoallw","PMPI_Ialltoallw.cold","PMPI_Ibarrier","PMPI_Ibarrier.cold","PMPI_Ibcast","PMPI_Ibcast.cold","PMPI_Ibsend","PMPI_Ibsend.cold","PMPI_Iexscan","PMPI_Iexscan.cold","PMPI_Igather","PMPI_Igather.cold","PMPI_Igatherv","PMPI_Igatherv.cold","PMPI_Improbe","PMPI_Improbe.cold","PMPI_Imrecv","PMPI_Imrecv.cold","PMPI_Ineighbor_allgather","PMPI_Ineighbor_allgather.cold","PMPI_Ineighbor_allgatherv","PMPI_Ineighbor_allgatherv.cold","PMPI_Ineighbor_alltoall","PMPI_Ineighbor_alltoall.cold","PMPI_Ineighbor_alltoallv","PMPI_Ineighbor_alltoallv.cold","PMPI_Ineighbor_alltoallw","PMPI_Ineighbor_alltoallw.cold","PMPI_Info_c2f","PMPI_Info_create","PMPI_Info_create_env","PMPI_Info_create_env.cold","PMPI_Info_delete","PMPI_Info_delete.cold","PMPI_Info_dup","PMPI_Info_dup.cold","PMPI_Info_f2c","PMPI_Info_free","PMPI_Info_free.cold","PMPI_Info_get","PMPI_Info_get.cold","PMPI_Info_get_nkeys","PMPI_Info_get_nkeys.cold","PMPI_Info_get_nthkey","PMPI_Info_get_nthkey.cold","PMPI_Info_get_string","PMPI_Info_get_string.cold","PMPI_Info_get_valuelen","PMPI_Info_get_valuelen.cold","PMPI_Info_set","PMPI_Info_set.cold","PMPI_Init","PMPI_Init.cold","PMPI_Init_thread","PMPI_Init_thread.cold","PMPI_Initialized","PMPI_Intercomm_create","PMPI_Intercomm_create.cold","PMPI_Intercomm_create_from_groups","PMPI_Intercomm_merge","PMPI_Intercomm_merge.cold","PMPI_Iprobe","PMPI_Iprobe.cold","PMPI_Irecv","PMPI_Irecv.cold","PMPI_Ireduce","PMPI_Ireduce.cold","PMPI_Ireduce_scatter","PMPI_Ireduce_scatter.cold","PMPI_Ireduce_scatter_block","PMPI_Ireduce_scatter_block.cold","PMPI_Irsend","PMPI_Irsend.cold","PMPI_Is_thread_main","PMPI_Iscan","PMPI_Iscan.cold","PMPI_Iscatter","PMPI_Iscatter.cold","PMPI_Iscatterv","PMPI_Iscatterv.cold","PMPI_Isend","PMPI_Isend.cold","PMPI_Isendrecv","PMPI_Isendrecv.cold","PMPI_Isendrecv_replace","PMPI_Isendrecv_replace.cold","PMPI_Issend","PMPI_Issend.cold","PMPI_Keyval_create","PMPI_Keyval_free","PMPI_Lookup_name","PMPI_Lookup_name.cold","PMPI_Message_c2f","PMPI_Message_f2c","PMPI_Mprobe","PMPI_Mprobe.cold","PMPI_Mrecv","PMPI_Mrecv.cold","PMPI_Neighbor_allgather","PMPI_Neighbor_allgather.cold","PMPI_Neighbor_allgather_init","PMPI_Neighbor_allgather_init.cold","PMPI_Neighbor_allgatherv","PMPI_Neighbor_allgatherv.cold","PMPI_Neighbor_allgatherv_init","PMPI_Neighbor_allgatherv_init.cold","PMPI_Neighbor_alltoall","PMPI_Neighbor_alltoall.cold","PMPI_Neighbor_alltoall_init","PMPI_Neighbor_alltoall_init.cold","PMPI_Neighbor_alltoallv","PMPI_Neighbor_alltoallv.cold","PMPI_Neighbor_alltoallv_init","PMPI_Neighbor_alltoallv_init.cold","PMPI_Neighbor_alltoallw","PMPI_Neighbor_alltoallw.cold","PMPI_Neighbor_alltoallw_init","PMPI_Neighbor_alltoallw_init.cold","PMPI_Op_c2f","PMPI_Op_commutative","PMPI_Op_create","PMPI_Op_f2c","PMPI_Op_free","PMPI_Open_port","PMPI_Open_port.cold","PMPI_Pack","PMPI_Pack.cold","PMPI_Pack_external","PMPI_Pack_external.cold","PMPI_Pack_external_size","PMPI_Pack_external_size.cold","PMPI_Pack_size","PMPI_Parrived","PMPI_Parrived.cold","PMPI_Pcontrol","PMPI_Pready","PMPI_Pready.cold","PMPI_Pready_list","PMPI_Pready_list.cold","PMPI_Pready_range","PMPI_Pready_range.cold","PMPI_Precv_init","PMPI_Precv_init.cold","PMPI_Probe","PMPI_Probe.cold","PMPI_Psend_init","PMPI_Psend_init.cold","PMPI_Publish_name","PMPI_Publish_name.cold","PMPI_Put","PMPI_Put.cold","PMPI_Query_thread","PMPI_Raccumulate","PMPI_Raccumulate.cold","PMPI_Recv","PMPI_Recv.cold","PMPI_Recv_init","PMPI_Recv_init.cold","PMPI_Reduce","PMPI_Reduce.cold","PMPI_Reduce_init","PMPI_Reduce_init.cold","PMPI_Reduce_local","PMPI_Reduce_local.cold","PMPI_Reduce_scatter","PMPI_Reduce_scatter.cold","PMPI_Reduce_scatter_block","PMPI_Reduce_scatter_block.cold","PMPI_Reduce_scatter_block_init","PMPI_Reduce_scatter_block_init.cold","PMPI_Reduce_scatter_init","PMPI_Reduce_scatter_init.cold","PMPI_Register_datarep","PMPI_Register_datarep.cold","PMPI_Request_c2f","PMPI_Request_f2c","PMPI_Request_free","PMPI_Request_free.cold","PMPI_Request_get_status","PMPI_Rget","PMPI_Rget.cold","PMPI_Rget_accumulate","PMPI_Rget_accumulate.cold","PMPI_Rput","PMPI_Rput.cold","PMPI_Rsend","PMPI_Rsend.cold","PMPI_Rsend_init","PMPI_Rsend_init.cold","PMPI_Scan","PMPI_Scan.cold","PMPI_Scan_init","PMPI_Scan_init.cold","PMPI_Scatter","PMPI_Scatter.cold","PMPI_Scatter_init","PMPI_Scatter_init.cold","PMPI_Scatterv","PMPI_Scatterv.cold","PMPI_Scatterv_init","PMPI_Scatterv_init.cold","PMPI_Send","PMPI_Send.cold","PMPI_Send_init","PMPI_Send_init.cold","PMPI_Sendrecv","PMPI_Sendrecv.cold","PMPI_Sendrecv_replace","PMPI_Sendrecv_replace.cold","PMPI_Session_c2f","PMPI_Session_call_errhandler","PMPI_Session_call_errhandler.cold","PMPI_Session_create_errhandler","PMPI_Session_f2c","PMPI_Session_finalize","PMPI_Session_finalize.cold","PMPI_Session_get_errhandler","PMPI_Session_get_errhandler.cold","PMPI_Session_get_info","PMPI_Session_get_nth_pset","PMPI_Session_get_nth_pset.cold","PMPI_Session_get_num_psets","PMPI_Session_get_num_psets.cold","PMPI_Session_get_pset_info","PMPI_Session_get_pset_info.cold","PMPI_Session_init","PMPI_Session_init.cold","PMPI_Session_set_errhandler","PMPI_Session_set_info","PMPI_Ssend","PMPI_Ssend.cold","PMPI_Ssend_init","PMPI_Ssend_init.cold","PMPI_Start","PMPI_Start.cold","PMPI_Startall","PMPI_Status_c2f","PMPI_Status_c2f08","PMPI_Status_f082c","PMPI_Status_f082f","PMPI_Status_f2c","PMPI_Status_f2f08","PMPI_Status_set_cancelled","PMPI_Status_set_elements","PMPI_Status_set_elements_x","PMPI_T_category_changed","PMPI_T_category_get_categories","PMPI_T_category_get_cvars","PMPI_T_category_get_index","PMPI_T_category_get_info","PMPI_T_category_get_num","PMPI_T_category_get_pvars","PMPI_T_cvar_get_index","PMPI_T_cvar_get_info","PMPI_T_cvar_get_num","PMPI_T_cvar_handle_alloc","PMPI_T_cvar_handle_free","PMPI_T_cvar_read","PMPI_T_cvar_write","PMPI_T_enum_get_info","PMPI_T_enum_get_item","PMPI_T_finalize","PMPI_T_init_thread","PMPI_T_pvar_get_index","PMPI_T_pvar_get_info","PMPI_T_pvar_get_num","PMPI_T_pvar_handle_alloc","PMPI_T_pvar_handle_free","PMPI_T_pvar_read","PMPI_T_pvar_readreset","PMPI_T_pvar_reset","PMPI_T_pvar_session_create","PMPI_T_pvar_session_free","PMPI_T_pvar_start","PMPI_T_pvar_stop","PMPI_T_pvar_write","PMPI_Test","PMPI_Test_cancelled","PMPI_Testall","PMPI_Testany","PMPI_Testsome","PMPI_Topo_test","PMPI_Type_c2f","PMPI_Type_commit","PMPI_Type_commit.cold","PMPI_Type_contiguous","PMPI_Type_contiguous.cold","PMPI_Type_create_darray","PMPI_Type_create_darray.cold","PMPI_Type_create_f90_complex","PMPI_Type_create_f90_complex.cold","PMPI_Type_create_f90_integer","PMPI_Type_create_f90_integer.cold","PMPI_Type_create_f90_real","PMPI_Type_create_f90_real.cold","PMPI_Type_create_hindexed","PMPI_Type_create_hindexed.cold","PMPI_Type_create_hindexed_block","PMPI_Type_create_hindexed_block.cold","PMPI_Type_create_hvector","PMPI_Type_create_hvector.cold","PMPI_Type_create_indexed_block","PMPI_Type_create_indexed_block.cold","PMPI_Type_create_keyval","PMPI_Type_create_keyval.cold","PMPI_Type_create_resized","PMPI_Type_create_resized.cold","PMPI_Type_create_struct","PMPI_Type_create_struct.cold","PMPI_Type_create_subarray","PMPI_Type_create_subarray.cold","PMPI_Type_delete_attr","PMPI_Type_dup","PMPI_Type_dup.cold","PMPI_Type_extent","PMPI_Type_f2c","PMPI_Type_free","PMPI_Type_free_keyval","PMPI_Type_get_attr","PMPI_Type_get_contents","PMPI_Type_get_envelope","PMPI_Type_get_envelope.cold","PMPI_Type_get_extent","PMPI_Type_get_extent_x","PMPI_Type_get_name","PMPI_Type_get_true_extent","PMPI_Type_get_true_extent_x","PMPI_Type_hindexed","PMPI_Type_hvector","PMPI_Type_indexed","PMPI_Type_indexed.cold","PMPI_Type_lb","PMPI_Type_match_size","PMPI_Type_set_attr","PMPI_Type_set_name","PMPI_Type_size","PMPI_Type_size_x","PMPI_Type_struct","PMPI_Type_ub","PMPI_Type_vector","PMPI_Type_vector.cold","PMPI_Unpack","PMPI_Unpack.cold","PMPI_Unpack_external","PMPI_Unpack_external.cold","PMPI_Unpublish_name","PMPI_Unpublish_name.cold","PMPI_Wait","PMPI_Waitall","PMPI_Waitany","PMPI_Waitsome","PMPI_Win_allocate","PMPI_Win_allocate_shared","PMPI_Win_allocate_shared.cold","PMPI_Win_attach","PMPI_Win_attach.cold","PMPI_Win_c2f","PMPI_Win_call_errhandler","PMPI_Win_call_errhandler.cold","PMPI_Win_complete","PMPI_Win_complete.cold","PMPI_Win_create","PMPI_Win_create_dynamic","PMPI_Win_create_errhandler","PMPI_Win_create_keyval","PMPI_Win_delete_attr","PMPI_Win_detach","PMPI_Win_detach.cold","PMPI_Win_f2c","PMPI_Win_fence","PMPI_Win_fence.cold","PMPI_Win_flush","PMPI_Win_flush.cold","PMPI_Win_flush_all","PMPI_Win_flush_all.cold","PMPI_Win_flush_local","PMPI_Win_flush_local.cold","PMPI_Win_flush_local_all","PMPI_Win_flush_local_all.cold","PMPI_Win_free","PMPI_Win_free.cold","PMPI_Win_free_keyval","PMPI_Win_get_attr","PMPI_Win_get_errhandler","PMPI_Win_get_group","PMPI_Win_get_group.cold","PMPI_Win_get_info","PMPI_Win_get_info.cold","PMPI_Win_get_name","PMPI_Win_get_name.cold","PMPI_Win_lock","PMPI_Win_lock.cold","PMPI_Win_lock_all","PMPI_Win_lock_all.cold","PMPI_Win_post","PMPI_Win_post.cold","PMPI_Win_set_attr","PMPI_Win_set_errhandler","PMPI_Win_set_info","PMPI_Win_set_info.cold","PMPI_Win_set_name","PMPI_Win_set_name.cold","PMPI_Win_shared_query","PMPI_Win_shared_query.cold","PMPI_Win_start","PMPI_Win_start.cold","PMPI_Win_sync","PMPI_Win_sync.cold","PMPI_Win_test","PMPI_Win_test.cold","PMPI_Win_unlock","PMPI_Win_unlock.cold","PMPI_Win_unlock_all","PMPI_Win_unlock_all.cold","PMPI_Win_wait","PMPI_Win_wait.cold","PMPI_Wtick","PMPI_Wtime","PQ_adjustElementKey","PQ_adjustKey","PQ_decreaseElementKey","PQ_decreaseKey","PQ_delete","PQ_deleteElement","PQ_deleteMax","PQ_deleteMaxElement","PQ_exit","PQ_findMaxElement","PQ_findMaxKey","PQ_free","PQ_increaseElementKey","PQ_increaseKey","PQ_init","PQ_insert","PQ_insertElement","PQ_isEmpty","V_OUTPUT_ERR","__SENDER_BASED_METHOD_COPY","__do_global_dtors_aux","__muldc3","__mulsc3","__mulxc3","__ompi_datatype_allocate","__ompi_datatype_create_from_args","__ompi_datatype_create_from_packed_description.isra.0","__ompi_datatype_pack_description.isra.0","__ompi_datatype_release","_convert_process_name_to_string:0x84d30","_convert_process_name_to_string:0x88400","_convert_string_to_jobid","_convert_string_to_process_name:0x84b80","_convert_string_to_process_name:0x88410","_jobid_print_for_opal","_mca_topo_base_select.part.0","_process_name_compare:0x849c0","_process_name_compare:0x88420","_process_name_print_for_opal:0x84790","_process_name_print_for_opal:0x88450","_release_fn","_vpid_print_for_opal","adapt_close","adapt_constant_reduce_context_construct","adapt_constant_reduce_context_destruct","adapt_module_construct","adapt_module_destruct","adapt_module_enable","adapt_open","adapt_register","alloc_window","append_frag_to_list","attr_subsys_construct","attr_subsys_construct.cold","attr_subsys_destruct","attribute_key_value_construct","avail_coll_compare","avail_io_compare:0x179350","avail_io_compare:0x1799d0","avail_op_compare","avx_component_close","avx_component_init_query","avx_component_op_query","avx_component_open","avx_component_register","backend_abort_aggregate","backend_abort_no_aggregate","basic_register","block","bootstrap_comm","btl_bandwidth_compare","btl_exclusivity_compare","btl_latency_sort_fn","buffer_cleanup","build_level_topology","build_level_topology.cold","build_process_tab_id","check","check_file","check_one_component","close_component","coll_base_comm_construct","coll_base_comm_destruct","coll_base_module_construct","coll_base_module_destruct","comm_method_string","compFunc","compare_attr_sequence","compare_ints","compare_pmix_proc","compare_ranks:0x1da9b0","compare_ranks:0x1ea3b0","compare_uint16_ts","complete_objs_callback","complete_vecs_callback","component_finalize","component_init","component_open","component_query","component_register","component_select","compute_gain","config_window","construct_peers","cost_calc","create_comm","create_dumb_tree","create_threads","create_win","cset2mapstr.constprop.0","cset2str.constprop.0","datatype_duplicate.isra.0","dbl_cmp_inc","delete_group_list","delete_query","delete_select","depth_first","deregister_tm_clones","destruct_topology_cache","dfs","display_sol","distance","dpm_convert.constprop.0","dpm_convert.constprop.1","dynamic_gen2_register","dynamic_register","era_agreement_comm_specific_constructor","era_agreement_comm_specific_destructor","era_agreement_info_constructor","era_agreement_info_destructor","era_bounce_event_cb","era_cb_fn","era_cb_fn.cold","era_check_status","era_combine_agreement_values","era_combine_agreement_values.cold","era_create_agreement_info","era_create_agreement_info.cold","era_decide","era_error_event_cb","era_iagree_req_complete_cb","era_iagree_req_complete_cb.cold","era_iagree_req_free","era_mark_process_failed","era_merge_new_dead_list","era_next_child","era_on_comm_rank_failure","era_tree_fn_binary","era_tree_fn_star","era_tree_fn_string","era_tree_remove_node","era_update_return_value","era_value_constructor","era_value_destructor","evhandler_dereg_callbk","evhandler_reg_callbk:0x7c580","evhandler_reg_callbk:0x884c0","f1","f2","fast_group","fd_event_cb","fd_heartbeat_rdma_cb","fd_heartbeat_recv_cb","fd_heartbeat_request.isra.0","fd_heartbeat_request_cb","fd_heartbeat_send.isra.0","fd_progress","fence_cbfunc","fence_release:0x820f0","fence_release:0x884b0","file_constructor","file_destructor","file_query","file_unquery","fill_null_pointers","fragment_sent_cb","frame_dummy","free_constraint_tree","free_list_child","free_objs_callback","free_tab_child","free_vecs_callback","ftagree_close","ftagree_register","generate_random_sol.isra.0","generate_work_units.constprop.0","generate_work_units.part.0","get_algorithm","get_dynamic_rule","get_module","get_print_name_buffer","get_rsrc_exists","group_list_asc","group_list_dsc","group_list_id","han_close","han_module_enable","han_open","han_register","hash_asc","hb_itor_search","ibcast_request_fini.isra.0","icompar","individual_register:0x16eff0","individual_register:0x21a490","info_constructor","info_destructor","init_by_array","init_query:0x17b980","init_query:0x21f830","init_query:0x233dc0","inter_register","io_base_request_constructor","ireduce_request_fini.isra.0","kpartition_build_level_topology.isra.0","libnbc_close","libnbc_comm_query","libnbc_init_query","libnbc_module_construct","libnbc_module_destruct","libnbc_module_enable","libnbc_open","libnbc_register","list_all_possible_groups","list_all_possible_groups.cold","lockedfile_register","match_one","mca_bml_base_btl_array_construct","mca_bml_base_btl_array_destruct","mca_bml_base_btl_array_reserve","mca_bml_base_close","mca_bml_base_endpoint_construct","mca_bml_base_endpoint_destruct","mca_bml_base_init","mca_bml_base_inited","mca_bml_base_open","mca_bml_base_register","mca_bml_r2_add_btl","mca_bml_r2_add_btls","mca_bml_r2_add_proc","mca_bml_r2_add_procs","mca_bml_r2_allocate_endpoint","mca_bml_r2_component_close","mca_bml_r2_component_fini","mca_bml_r2_component_init","mca_bml_r2_component_open","mca_bml_r2_component_register","mca_bml_r2_compute_endpoint_metrics","mca_bml_r2_compute_endpoint_metrics.cold","mca_bml_r2_del_btl","mca_bml_r2_del_proc_btl","mca_bml_r2_del_procs","mca_bml_r2_del_procs.cold","mca_bml_r2_endpoint_add_btl","mca_bml_r2_finalize","mca_bml_r2_register","mca_bml_r2_register_error","mca_coll_base_alltoall_intra_basic_inplace","mca_coll_base_alltoallv_intra_basic_inplace","mca_coll_base_colltype_to_str","mca_coll_base_comm_select","mca_coll_base_comm_unselect","mca_coll_base_find_available","mca_coll_base_name_to_colltype","mca_coll_base_reduce_local","mca_coll_basic_allgather_inter","mca_coll_basic_allgatherv_inter","mca_coll_basic_allreduce_inter","mca_coll_basic_allreduce_intra","mca_coll_basic_alltoall_inter","mca_coll_basic_alltoallv_inter","mca_coll_basic_alltoallw_inter","mca_coll_basic_alltoallw_intra","mca_coll_basic_alltoallw_intra_inplace.constprop.0","mca_coll_basic_barrier_inter_lin","mca_coll_basic_barrier_intra_log","mca_coll_basic_bcast_lin_inter","mca_coll_basic_bcast_log_inter","mca_coll_basic_bcast_log_intra","mca_coll_basic_comm_query","mca_coll_basic_exscan_inter","mca_coll_basic_exscan_intra","mca_coll_basic_gather_inter","mca_coll_basic_gatherv_inter","mca_coll_basic_gatherv_intra","mca_coll_basic_init_query","mca_coll_basic_module_enable","mca_coll_basic_neighbor_allgather","mca_coll_basic_neighbor_allgatherv","mca_coll_basic_neighbor_alltoall","mca_coll_basic_neighbor_alltoallv","mca_coll_basic_neighbor_alltoallw","mca_coll_basic_reduce_lin_inter","mca_coll_basic_reduce_log_inter","mca_coll_basic_reduce_log_intra","mca_coll_basic_reduce_scatter_block_inter","mca_coll_basic_reduce_scatter_block_intra","mca_coll_basic_reduce_scatter_inter","mca_coll_basic_reduce_scatter_intra","mca_coll_basic_scan_intra","mca_coll_basic_scatter_inter","mca_coll_basic_scatterv_inter","mca_coll_basic_scatterv_intra","mca_coll_ftagree_comm_query","mca_coll_ftagree_construct","mca_coll_ftagree_era_comm_finalize","mca_coll_ftagree_era_comm_init","mca_coll_ftagree_era_finalize","mca_coll_ftagree_era_init","mca_coll_ftagree_era_inter","mca_coll_ftagree_era_intra","mca_coll_ftagree_eta_intra","mca_coll_ftagree_iera_intra","mca_coll_ftagree_iera_intra.cold","mca_coll_ftagree_init_query","mca_coll_ftagree_module_construct","mca_coll_ftagree_module_destruct","mca_coll_ftagree_module_enable","mca_coll_han_algorithm_id_is_valid","mca_coll_han_algorithm_id_to_fn","mca_coll_han_algorithm_id_to_name","mca_coll_han_algorithm_name_to_id","mca_coll_han_allgather_intra","mca_coll_han_allgather_intra_dynamic","mca_coll_han_allgather_intra_simple","mca_coll_han_allgather_lb_task","mca_coll_han_allgather_lg_task","mca_coll_han_allgather_uag_task","mca_coll_han_allgatherv_intra_dynamic","mca_coll_han_allreduce_intra","mca_coll_han_allreduce_intra_dynamic","mca_coll_han_allreduce_intra_simple","mca_coll_han_allreduce_reproducible","mca_coll_han_allreduce_reproducible_decision","mca_coll_han_allreduce_t0_task","mca_coll_han_allreduce_t1_task","mca_coll_han_allreduce_t2_task","mca_coll_han_allreduce_t3_task","mca_coll_han_barrier_intra_dynamic","mca_coll_han_barrier_intra_simple","mca_coll_han_bcast_intra","mca_coll_han_bcast_intra_dynamic","mca_coll_han_bcast_intra_simple","mca_coll_han_bcast_t0_task","mca_coll_han_bcast_t1_task","mca_coll_han_comm_create","mca_coll_han_comm_create_new","mca_coll_han_comm_query","mca_coll_han_component_name_to_id","mca_coll_han_dump_dynamic_rules","mca_coll_han_free_algorithms","mca_coll_han_free_dynamic_rules","mca_coll_han_gather_intra","mca_coll_han_gather_intra_dynamic","mca_coll_han_gather_intra_simple","mca_coll_han_gather_lg_task","mca_coll_han_gather_ug_task","mca_coll_han_get_all_coll_modules","mca_coll_han_init_algorithms","mca_coll_han_init_dynamic_rules","mca_coll_han_init_query","mca_coll_han_is_coll_dynamic_implemented","mca_coll_han_module_construct","mca_coll_han_module_destruct","mca_coll_han_module_disable","mca_coll_han_reduce_intra","mca_coll_han_reduce_intra_dynamic","mca_coll_han_reduce_intra_simple","mca_coll_han_reduce_reproducible","mca_coll_han_reduce_reproducible_decision","mca_coll_han_reduce_t0_task","mca_coll_han_reduce_t1_task","mca_coll_han_scatter_intra","mca_coll_han_scatter_intra_dynamic","mca_coll_han_scatter_intra_simple","mca_coll_han_scatter_ls_task","mca_coll_han_scatter_us_task","mca_coll_han_topo_init","mca_coll_han_topo_lvl_name_to_id","mca_coll_han_topo_lvl_to_str","mca_coll_inter_allgather_inter","mca_coll_inter_allgatherv_inter","mca_coll_inter_allreduce_inter","mca_coll_inter_bcast_inter","mca_coll_inter_comm_query","mca_coll_inter_gather_inter","mca_coll_inter_gatherv_inter","mca_coll_inter_init_query","mca_coll_inter_module_construct","mca_coll_inter_module_destruct","mca_coll_inter_module_enable","mca_coll_inter_reduce_inter","mca_coll_inter_scatter_inter","mca_coll_inter_scatterv_inter","mca_coll_monitoring_allgather","mca_coll_monitoring_allgatherv","mca_coll_monitoring_allreduce","mca_coll_monitoring_alltoall","mca_coll_monitoring_alltoallv","mca_coll_monitoring_alltoallw","mca_coll_monitoring_barrier","mca_coll_monitoring_bcast","mca_coll_monitoring_component_close","mca_coll_monitoring_component_init","mca_coll_monitoring_component_open","mca_coll_monitoring_component_query","mca_coll_monitoring_component_register","mca_coll_monitoring_exscan","mca_coll_monitoring_gather","mca_coll_monitoring_gatherv","mca_coll_monitoring_iallgather","mca_coll_monitoring_iallgatherv","mca_coll_monitoring_iallreduce","mca_coll_monitoring_ialltoall","mca_coll_monitoring_ialltoallv","mca_coll_monitoring_ialltoallw","mca_coll_monitoring_ibarrier","mca_coll_monitoring_ibcast","mca_coll_monitoring_iexscan","mca_coll_monitoring_igather","mca_coll_monitoring_igatherv","mca_coll_monitoring_ineighbor_allgather","mca_coll_monitoring_ineighbor_allgatherv","mca_coll_monitoring_ineighbor_alltoall","mca_coll_monitoring_ineighbor_alltoallv","mca_coll_monitoring_ineighbor_alltoallw","mca_coll_monitoring_ireduce","mca_coll_monitoring_ireduce_scatter","mca_coll_monitoring_ireduce_scatter_block","mca_coll_monitoring_iscan","mca_coll_monitoring_iscatter","mca_coll_monitoring_iscatterv","mca_coll_monitoring_module_disable","mca_coll_monitoring_module_enable","mca_coll_monitoring_neighbor_allgather","mca_coll_monitoring_neighbor_allgatherv","mca_coll_monitoring_neighbor_alltoall","mca_coll_monitoring_neighbor_alltoallv","mca_coll_monitoring_neighbor_alltoallw","mca_coll_monitoring_reduce","mca_coll_monitoring_reduce_scatter","mca_coll_monitoring_reduce_scatter_block","mca_coll_monitoring_scan","mca_coll_monitoring_scatter","mca_coll_monitoring_scatterv","mca_coll_self_allgather_intra","mca_coll_self_allgatherv_intra","mca_coll_self_allreduce_intra","mca_coll_self_alltoall_intra","mca_coll_self_alltoallv_intra","mca_coll_self_alltoallw_intra","mca_coll_self_barrier_intra","mca_coll_self_bcast_intra","mca_coll_self_comm_query","mca_coll_self_exscan_intra","mca_coll_self_gather_intra","mca_coll_self_gatherv_intra","mca_coll_self_init_query","mca_coll_self_module_enable","mca_coll_self_reduce_intra","mca_coll_self_reduce_scatter_intra","mca_coll_self_scan_intra","mca_coll_self_scatter_intra","mca_coll_self_scatterv_intra","mca_coll_sm_allreduce_intra","mca_coll_sm_barrier_intra","mca_coll_sm_bcast_intra","mca_coll_sm_comm_query","mca_coll_sm_init_query","mca_coll_sm_module_construct","mca_coll_sm_module_destruct","mca_coll_sm_module_disable","mca_coll_sm_reduce_intra","mca_coll_sync_bcast","mca_coll_sync_comm_query","mca_coll_sync_exscan","mca_coll_sync_gather","mca_coll_sync_gatherv","mca_coll_sync_init_query","mca_coll_sync_module_construct","mca_coll_sync_module_destruct","mca_coll_sync_module_enable","mca_coll_sync_reduce","mca_coll_sync_reduce_scatter","mca_coll_sync_scan","mca_coll_sync_scatter","mca_coll_sync_scatterv","mca_coll_task_constructor","mca_coll_task_destructor","mca_coll_tuned_module_construct","mca_comm_cid_context_alloc","mca_comm_cid_context_construct","mca_comm_cid_context_destruct","mca_common_monitoring_add_procs","mca_common_monitoring_coll_a2a","mca_common_monitoring_coll_a2o","mca_common_monitoring_coll_cache_name","mca_common_monitoring_coll_cond_release","mca_common_monitoring_coll_finalize","mca_common_monitoring_coll_flush","mca_common_monitoring_coll_flush_all","mca_common_monitoring_coll_get_a2a_count","mca_common_monitoring_coll_get_a2a_size","mca_common_monitoring_coll_get_a2o_count","mca_common_monitoring_coll_get_a2o_size","mca_common_monitoring_coll_get_o2a_count","mca_common_monitoring_coll_get_o2a_size","mca_common_monitoring_coll_messages_notify","mca_common_monitoring_coll_new","mca_common_monitoring_coll_o2a","mca_common_monitoring_coll_release","mca_common_monitoring_coll_reset","mca_common_monitoring_comm_size_notify","mca_common_monitoring_finalize","mca_common_monitoring_flush.part.0","mca_common_monitoring_get_coll_count","mca_common_monitoring_get_coll_size","mca_common_monitoring_get_flush","mca_common_monitoring_get_osc_recv_count","mca_common_monitoring_get_osc_recv_size","mca_common_monitoring_get_osc_sent_count","mca_common_monitoring_get_osc_sent_size","mca_common_monitoring_get_pml_count","mca_common_monitoring_get_pml_size","mca_common_monitoring_init","mca_common_monitoring_notify_flush","mca_common_monitoring_output","mca_common_monitoring_record_coll","mca_common_monitoring_record_osc","mca_common_monitoring_record_pml","mca_common_monitoring_register","mca_common_monitoring_set_flush","mca_common_ompio_alloc_buf","mca_common_ompio_base_file_read_all","mca_common_ompio_buffer_alloc_fini","mca_common_ompio_buffer_alloc_init","mca_common_ompio_buffer_alloc_seg","mca_common_ompio_buffer_free_seg","mca_common_ompio_build_io_array","mca_common_ompio_cart_based_grouping","mca_common_ompio_check_gpu_buf","mca_common_ompio_create_groups","mca_common_ompio_create_incomplete_file_handle","mca_common_ompio_decode_datatype","mca_common_ompio_empty_print_queue","mca_common_ompio_file_close","mca_common_ompio_file_delete","mca_common_ompio_file_get_position","mca_common_ompio_file_get_size","mca_common_ompio_file_iread","mca_common_ompio_file_iread_all","mca_common_ompio_file_iread_at","mca_common_ompio_file_iread_at_all","mca_common_ompio_file_iwrite","mca_common_ompio_file_iwrite_all","mca_common_ompio_file_iwrite_at","mca_common_ompio_file_iwrite_at_all","mca_common_ompio_file_open","mca_common_ompio_file_read","mca_common_ompio_file_read_all","mca_common_ompio_file_read_all.part.0","mca_common_ompio_file_read_at","mca_common_ompio_file_read_at_all","mca_common_ompio_file_read_pipelined","mca_common_ompio_file_write","mca_common_ompio_file_write_all","mca_common_ompio_file_write_all.part.0","mca_common_ompio_file_write_at","mca_common_ompio_file_write_at_all","mca_common_ompio_file_write_pipelined","mca_common_ompio_finalize_initial_grouping","mca_common_ompio_finalize_split","mca_common_ompio_forced_grouping","mca_common_ompio_full_print_queue","mca_common_ompio_fview_based_grouping","mca_common_ompio_initialize_print_queue","mca_common_ompio_merge_groups","mca_common_ompio_merge_initial_groups","mca_common_ompio_prepare_to_group","mca_common_ompio_print_time_info","mca_common_ompio_progress","mca_common_ompio_register_print_entry","mca_common_ompio_register_progress","mca_common_ompio_release_buf","mca_common_ompio_request_alloc","mca_common_ompio_request_cancel","mca_common_ompio_request_construct","mca_common_ompio_request_destruct","mca_common_ompio_request_fini","mca_common_ompio_request_free","mca_common_ompio_request_init","mca_common_ompio_retain_initial_groups","mca_common_ompio_set_aggregator_props","mca_common_ompio_set_callbacks","mca_common_ompio_set_explicit_offset","mca_common_ompio_set_file_defaults","mca_common_ompio_set_view","mca_common_ompio_simple_grouping","mca_common_ompio_split_a_group","mca_common_ompio_split_initial_groups","mca_common_ompio_unregister_print_entry","mca_fbtl_base_check_atomicity","mca_fbtl_base_file_select","mca_fbtl_base_file_unselect","mca_fbtl_base_find_available","mca_fbtl_posix_check_atomicity","mca_fbtl_posix_component_file_query","mca_fbtl_posix_component_file_unquery","mca_fbtl_posix_component_init_query","mca_fbtl_posix_ipreadv","mca_fbtl_posix_ipwritev","mca_fbtl_posix_lock","mca_fbtl_posix_module_finalize","mca_fbtl_posix_module_init","mca_fbtl_posix_preadv","mca_fbtl_posix_progress","mca_fbtl_posix_pwritev","mca_fbtl_posix_request_free","mca_fbtl_posix_unlock","mca_fcoll_base_component_lookup","mca_fcoll_base_file_select","mca_fcoll_base_file_unselect","mca_fcoll_base_find_available","mca_fcoll_base_query_table","mca_fcoll_dynamic_component_file_query","mca_fcoll_dynamic_component_file_unquery","mca_fcoll_dynamic_component_init_query","mca_fcoll_dynamic_file_read_all","mca_fcoll_dynamic_file_write_all","mca_fcoll_dynamic_gen2_break_file_view","mca_fcoll_dynamic_gen2_component_file_query","mca_fcoll_dynamic_gen2_component_file_unquery","mca_fcoll_dynamic_gen2_component_init_query","mca_fcoll_dynamic_gen2_file_read_all","mca_fcoll_dynamic_gen2_file_write_all","mca_fcoll_dynamic_gen2_get_configuration","mca_fcoll_dynamic_gen2_module_finalize","mca_fcoll_dynamic_gen2_module_init","mca_fcoll_dynamic_gen2_split_iov_array","mca_fcoll_dynamic_module_finalize","mca_fcoll_dynamic_module_init","mca_fcoll_individual_component_file_query","mca_fcoll_individual_component_file_unquery","mca_fcoll_individual_component_init_query","mca_fcoll_individual_file_read_all","mca_fcoll_individual_file_write_all","mca_fcoll_individual_module_finalize","mca_fcoll_individual_module_init","mca_fcoll_vulcan_break_file_view","mca_fcoll_vulcan_component_file_query","mca_fcoll_vulcan_component_file_unquery","mca_fcoll_vulcan_component_init_query","mca_fcoll_vulcan_file_read_all","mca_fcoll_vulcan_file_write_all","mca_fcoll_vulcan_get_configuration","mca_fcoll_vulcan_module_finalize","mca_fcoll_vulcan_module_init","mca_fcoll_vulcan_split_iov_array","mca_fs_base_file_close","mca_fs_base_file_delete","mca_fs_base_file_get_size","mca_fs_base_file_select","mca_fs_base_file_set_size","mca_fs_base_file_sync","mca_fs_base_file_unselect","mca_fs_base_find_available","mca_fs_base_get_file_amode","mca_fs_base_get_file_perm","mca_fs_base_get_fstype","mca_fs_base_get_mpi_err","mca_fs_base_get_parent_dir","mca_fs_base_get_real_filename.constprop.0","mca_fs_ufs_component_file_query","mca_fs_ufs_component_file_unquery","mca_fs_ufs_component_init_query","mca_fs_ufs_file_open","mca_fs_ufs_module_finalize","mca_fs_ufs_module_init","mca_io_base_delete","mca_io_base_delete.cold","mca_io_base_file_select","mca_io_base_file_select.cold","mca_io_base_file_select.localalias","mca_io_base_find_available","mca_io_base_open","mca_io_base_register_datarep","mca_io_ompio_file_close","mca_io_ompio_file_get_amode","mca_io_ompio_file_get_atomicity","mca_io_ompio_file_get_byte_offset","mca_io_ompio_file_get_position","mca_io_ompio_file_get_position_shared","mca_io_ompio_file_get_size","mca_io_ompio_file_get_type_extent","mca_io_ompio_file_get_view","mca_io_ompio_file_iread","mca_io_ompio_file_iread_all","mca_io_ompio_file_iread_at","mca_io_ompio_file_iread_at_all","mca_io_ompio_file_iread_shared","mca_io_ompio_file_iwrite","mca_io_ompio_file_iwrite_all","mca_io_ompio_file_iwrite_at","mca_io_ompio_file_iwrite_at_all","mca_io_ompio_file_iwrite_shared","mca_io_ompio_file_open","mca_io_ompio_file_preallocate","mca_io_ompio_file_read","mca_io_ompio_file_read_all","mca_io_ompio_file_read_all_begin","mca_io_ompio_file_read_all_end","mca_io_ompio_file_read_at","mca_io_ompio_file_read_at_all","mca_io_ompio_file_read_at_all_begin","mca_io_ompio_file_read_at_all_end","mca_io_ompio_file_read_ordered","mca_io_ompio_file_read_ordered_begin","mca_io_ompio_file_read_ordered_end","mca_io_ompio_file_read_shared","mca_io_ompio_file_seek","mca_io_ompio_file_seek_shared","mca_io_ompio_file_set_atomicity","mca_io_ompio_file_set_size","mca_io_ompio_file_set_view","mca_io_ompio_file_sync","mca_io_ompio_file_write","mca_io_ompio_file_write_all","mca_io_ompio_file_write_all_begin","mca_io_ompio_file_write_all_end","mca_io_ompio_file_write_at","mca_io_ompio_file_write_at_all","mca_io_ompio_file_write_at_all_begin","mca_io_ompio_file_write_at_all_end","mca_io_ompio_file_write_ordered","mca_io_ompio_file_write_ordered_begin","mca_io_ompio_file_write_ordered_end","mca_io_ompio_file_write_shared","mca_io_ompio_get_mca_parameter_value","mca_monitoring_coll_construct","mca_monitoring_coll_destruct","mca_osc_monitoring_component_finish","mca_osc_monitoring_component_init","mca_osc_monitoring_component_query","mca_osc_monitoring_component_register","mca_osc_monitoring_component_select","mca_part_base_close","mca_part_base_finalize","mca_part_base_open","mca_part_base_precv_request_construct","mca_part_base_prequest_construct","mca_part_base_progress","mca_part_base_psend_request_construct","mca_part_base_register","mca_part_base_select","mca_part_base_select.cold","mca_part_persist_component_close","mca_part_persist_component_fini","mca_part_persist_component_init","mca_part_persist_component_open","mca_part_persist_component_register","mca_part_persist_free:0x1ee0d0","mca_part_persist_free:0x1ee3e0","mca_part_persist_parrived","mca_part_persist_pready","mca_part_persist_precv_init","mca_part_persist_precv_request_construct","mca_part_persist_progress","mca_part_persist_psend_init","mca_part_persist_psend_request_construct","mca_part_persist_request_construct","mca_part_persist_request_destruct","mca_part_persist_start:0x1ed610","mca_part_persist_start:0x1edf30","mca_part_persist_start:0x1ee240","mca_pml_base_bsend_attach","mca_pml_base_bsend_detach","mca_pml_base_bsend_fini","mca_pml_base_bsend_init","mca_pml_base_bsend_request_alloc","mca_pml_base_bsend_request_alloc_buf","mca_pml_base_bsend_request_fini","mca_pml_base_bsend_request_free","mca_pml_base_bsend_request_start","mca_pml_base_close","mca_pml_base_finalize","mca_pml_base_open","mca_pml_base_pml_check_selected","mca_pml_base_pml_check_selected_impl","mca_pml_base_pml_selected","mca_pml_base_progress","mca_pml_base_recv_request_construct","mca_pml_base_recv_request_destruct","mca_pml_base_register","mca_pml_base_request_construct","mca_pml_base_revoke_comm","mca_pml_base_select","mca_pml_base_select.cold","mca_pml_base_send_request_construct","mca_pml_base_send_request_destruct","mca_pml_bsend_alloc_segment","mca_pml_cm_add_comm","mca_pml_cm_add_procs","mca_pml_cm_cancel","mca_pml_cm_component_close","mca_pml_cm_component_fini","mca_pml_cm_component_init","mca_pml_cm_component_open","mca_pml_cm_component_register","mca_pml_cm_del_comm","mca_pml_cm_del_procs","mca_pml_cm_dump","mca_pml_cm_enable","mca_pml_cm_improbe","mca_pml_cm_imrecv","mca_pml_cm_iprobe","mca_pml_cm_irecv","mca_pml_cm_irecv_init","mca_pml_cm_isend","mca_pml_cm_isend_init","mca_pml_cm_mprobe","mca_pml_cm_mrecv","mca_pml_cm_probe","mca_pml_cm_recv","mca_pml_cm_recv_fast_completion","mca_pml_cm_recv_request_completion","mca_pml_cm_recv_request_construct","mca_pml_cm_recv_request_free","mca_pml_cm_request_construct","mca_pml_cm_request_destruct","mca_pml_cm_send","mca_pml_cm_send_request_completion","mca_pml_cm_send_request_construct","mca_pml_cm_send_request_free","mca_pml_cm_start","mca_pml_monitoring_add_comm","mca_pml_monitoring_add_procs","mca_pml_monitoring_component_finish","mca_pml_monitoring_component_init","mca_pml_monitoring_component_open","mca_pml_monitoring_del_comm","mca_pml_monitoring_del_procs","mca_pml_monitoring_dump","mca_pml_monitoring_enable","mca_pml_monitoring_improbe","mca_pml_monitoring_imrecv","mca_pml_monitoring_iprobe","mca_pml_monitoring_irecv","mca_pml_monitoring_irecv_init","mca_pml_monitoring_isend","mca_pml_monitoring_isend_init","mca_pml_monitoring_mprobe","mca_pml_monitoring_mrecv","mca_pml_monitoring_probe","mca_pml_monitoring_recv","mca_pml_monitoring_revoke_comm","mca_pml_monitoring_send","mca_pml_monitoring_start","mca_pml_ob1_accelerator_add_ipc_support","mca_pml_ob1_accelerator_fini","mca_pml_ob1_accelerator_init","mca_pml_ob1_accelerator_need_buffers","mca_pml_ob1_add_comm","mca_pml_ob1_add_procs","mca_pml_ob1_com_btl_comp","mca_pml_ob1_comm_construct","mca_pml_ob1_comm_destruct","mca_pml_ob1_comm_init_size","mca_pml_ob1_comm_proc_construct","mca_pml_ob1_comm_proc_destruct","mca_pml_ob1_comm_size_notify","mca_pml_ob1_component_close","mca_pml_ob1_component_fini","mca_pml_ob1_component_init","mca_pml_ob1_component_open","mca_pml_ob1_component_register","mca_pml_ob1_control_completion","mca_pml_ob1_copy_frag_completion","mca_pml_ob1_del_comm","mca_pml_ob1_del_procs","mca_pml_ob1_dump","mca_pml_ob1_dump_cant_match","mca_pml_ob1_dump_frag_list","mca_pml_ob1_dump_hdr","mca_pml_ob1_enable","mca_pml_ob1_enable_progress","mca_pml_ob1_error_handler","mca_pml_ob1_frag_completion","mca_pml_ob1_get_dtoh_stream","mca_pml_ob1_get_htod_stream","mca_pml_ob1_get_posted_recvq_size","mca_pml_ob1_get_unex_msgq_size","mca_pml_ob1_handle_cid","mca_pml_ob1_improbe","mca_pml_ob1_imrecv","mca_pml_ob1_imrecv.cold","mca_pml_ob1_iprobe","mca_pml_ob1_irecv","mca_pml_ob1_irecv_init","mca_pml_ob1_isend","mca_pml_ob1_isend_init","mca_pml_ob1_match_completion_free","mca_pml_ob1_merge_cant_match","mca_pml_ob1_mprobe","mca_pml_ob1_mrecv","mca_pml_ob1_mrecv.cold","mca_pml_ob1_peer_create","mca_pml_ob1_probe","mca_pml_ob1_process_pending_packets","mca_pml_ob1_process_pending_rdma","mca_pml_ob1_progress","mca_pml_ob1_progress_one_htod_event","mca_pml_ob1_put_completion:0x2057a0","mca_pml_ob1_put_completion:0x20bf00","mca_pml_ob1_rdma_btls","mca_pml_ob1_rdma_btls.cold","mca_pml_ob1_rdma_cuda_btls","mca_pml_ob1_rdma_cuda_btls.cold","mca_pml_ob1_rdma_frag_constructor","mca_pml_ob1_rdma_pipeline_btls","mca_pml_ob1_rdma_pipeline_btls.cold","mca_pml_ob1_rdma_pipeline_btls_count","mca_pml_ob1_rdma_pipeline_btls_count.cold","mca_pml_ob1_record_htod_event","mca_pml_ob1_recv","mca_pml_ob1_recv_ctl_completion","mca_pml_ob1_recv_frag_callback_ack","mca_pml_ob1_recv_frag_callback_cid","mca_pml_ob1_recv_frag_callback_fin","mca_pml_ob1_recv_frag_callback_frag","mca_pml_ob1_recv_frag_callback_match","mca_pml_ob1_recv_frag_callback_put","mca_pml_ob1_recv_frag_callback_rget","mca_pml_ob1_recv_frag_callback_rndv","mca_pml_ob1_recv_frag_match.isra.0","mca_pml_ob1_recv_frag_match_proc.isra.0","mca_pml_ob1_recv_req_start","mca_pml_ob1_recv_request_ack.isra.0","mca_pml_ob1_recv_request_ack_send_btl","mca_pml_ob1_recv_request_cancel","mca_pml_ob1_recv_request_construct","mca_pml_ob1_recv_request_destruct","mca_pml_ob1_recv_request_frag_copy_finished","mca_pml_ob1_recv_request_frag_copy_start","mca_pml_ob1_recv_request_free","mca_pml_ob1_recv_request_get_frag","mca_pml_ob1_recv_request_get_frag_failed","mca_pml_ob1_recv_request_matched_probe","mca_pml_ob1_recv_request_process_pending","mca_pml_ob1_recv_request_progress_frag","mca_pml_ob1_recv_request_progress_match","mca_pml_ob1_recv_request_progress_rget","mca_pml_ob1_recv_request_progress_rget.cold","mca_pml_ob1_recv_request_progress_rndv","mca_pml_ob1_recv_request_put_frag","mca_pml_ob1_recv_request_schedule_once","mca_pml_ob1_revoke_comm","mca_pml_ob1_revoke_comm.localalias","mca_pml_ob1_rget_completion:0x204ec0","mca_pml_ob1_rget_completion:0x209c10","mca_pml_ob1_rndv_completion","mca_pml_ob1_seg_alloc","mca_pml_ob1_seg_free","mca_pml_ob1_send","mca_pml_ob1_send_cid","mca_pml_ob1_send_control_any","mca_pml_ob1_send_control_btl","mca_pml_ob1_send_ctl_completion","mca_pml_ob1_send_fin","mca_pml_ob1_send_inline.constprop.0","mca_pml_ob1_send_request_cancel","mca_pml_ob1_send_request_construct","mca_pml_ob1_send_request_copy_in_out","mca_pml_ob1_send_request_destruct","mca_pml_ob1_send_request_free","mca_pml_ob1_send_request_process_pending","mca_pml_ob1_send_request_put","mca_pml_ob1_send_request_put_frag","mca_pml_ob1_send_request_put_frag_failed","mca_pml_ob1_send_request_schedule_once","mca_pml_ob1_send_request_start_accelerator","mca_pml_ob1_send_request_start_buffered","mca_pml_ob1_send_request_start_copy","mca_pml_ob1_send_request_start_prepare","mca_pml_ob1_send_request_start_rdma","mca_pml_ob1_send_request_start_rndv","mca_pml_ob1_send_request_start_seq.constprop.0","mca_pml_ob1_set_allow_overtake","mca_pml_ob1_start","mca_pml_v_component_close","mca_pml_v_component_finalize","mca_pml_v_component_init","mca_pml_v_component_open","mca_pml_v_component_parasite_close","mca_pml_v_component_parasite_finalize","mca_pml_v_component_register","mca_pml_v_enable","mca_sharedfp_base_close","mca_sharedfp_base_file_select","mca_sharedfp_base_file_unselect","mca_sharedfp_base_find_available","mca_sharedfp_base_open","mca_sharedfp_individual_assign_globaloffset","mca_sharedfp_individual_collaborate_data","mca_sharedfp_individual_component_file_query","mca_sharedfp_individual_component_file_unquery","mca_sharedfp_individual_component_init_query","mca_sharedfp_individual_create_buff","mca_sharedfp_individual_file_close","mca_sharedfp_individual_file_open","mca_sharedfp_individual_get_position","mca_sharedfp_individual_get_timestamps_and_reclengths","mca_sharedfp_individual_getoffset","mca_sharedfp_individual_gettime","mca_sharedfp_individual_insert_headnode","mca_sharedfp_individual_insert_metadata","mca_sharedfp_individual_iread","mca_sharedfp_individual_iwrite","mca_sharedfp_individual_module_finalize","mca_sharedfp_individual_module_init","mca_sharedfp_individual_read","mca_sharedfp_individual_read_ordered","mca_sharedfp_individual_read_ordered_begin","mca_sharedfp_individual_read_ordered_end","mca_sharedfp_individual_seek","mca_sharedfp_individual_sort_timestamps","mca_sharedfp_individual_write","mca_sharedfp_individual_write_metadata_file","mca_sharedfp_individual_write_ordered","mca_sharedfp_individual_write_ordered_begin","mca_sharedfp_individual_write_ordered_end","mca_sharedfp_lockedfile_component_file_query","mca_sharedfp_lockedfile_component_file_unquery","mca_sharedfp_lockedfile_component_init_query","mca_sharedfp_lockedfile_file_close","mca_sharedfp_lockedfile_file_open","mca_sharedfp_lockedfile_get_position","mca_sharedfp_lockedfile_iread","mca_sharedfp_lockedfile_iwrite","mca_sharedfp_lockedfile_module_finalize","mca_sharedfp_lockedfile_module_init","mca_sharedfp_lockedfile_read","mca_sharedfp_lockedfile_read_ordered","mca_sharedfp_lockedfile_read_ordered.cold","mca_sharedfp_lockedfile_read_ordered_begin","mca_sharedfp_lockedfile_read_ordered_begin.cold","mca_sharedfp_lockedfile_read_ordered_end","mca_sharedfp_lockedfile_request_position","mca_sharedfp_lockedfile_seek","mca_sharedfp_lockedfile_write","mca_sharedfp_lockedfile_write_ordered","mca_sharedfp_lockedfile_write_ordered.cold","mca_sharedfp_lockedfile_write_ordered_begin","mca_sharedfp_lockedfile_write_ordered_begin.cold","mca_sharedfp_lockedfile_write_ordered_end","mca_sharedfp_sm_component_file_query","mca_sharedfp_sm_component_file_unquery","mca_sharedfp_sm_component_init_query","mca_sharedfp_sm_file_close","mca_sharedfp_sm_file_open","mca_sharedfp_sm_get_position","mca_sharedfp_sm_iread","mca_sharedfp_sm_iwrite","mca_sharedfp_sm_module_finalize","mca_sharedfp_sm_module_init","mca_sharedfp_sm_read","mca_sharedfp_sm_read_ordered","mca_sharedfp_sm_read_ordered.cold","mca_sharedfp_sm_read_ordered_begin","mca_sharedfp_sm_read_ordered_begin.cold","mca_sharedfp_sm_read_ordered_end","mca_sharedfp_sm_request_position","mca_sharedfp_sm_seek","mca_sharedfp_sm_write","mca_sharedfp_sm_write_ordered","mca_sharedfp_sm_write_ordered.cold","mca_sharedfp_sm_write_ordered_begin","mca_sharedfp_sm_write_ordered_begin.cold","mca_sharedfp_sm_write_ordered_end","mca_topo_base_cart_coords","mca_topo_base_cart_create","mca_topo_base_cart_get","mca_topo_base_cart_map","mca_topo_base_cart_rank","mca_topo_base_cart_shift","mca_topo_base_cart_sub","mca_topo_base_cartdim_get","mca_topo_base_close","mca_topo_base_comm_cart_2_2_0_construct","mca_topo_base_comm_cart_2_2_0_destruct","mca_topo_base_comm_dist_graph_2_2_0_construct","mca_topo_base_comm_dist_graph_2_2_0_destruct","mca_topo_base_comm_graph_2_2_0_construct","mca_topo_base_comm_graph_2_2_0_destruct","mca_topo_base_comm_select","mca_topo_base_dist_graph_create","mca_topo_base_dist_graph_create_adjacent","mca_topo_base_dist_graph_distribute","mca_topo_base_dist_graph_neighbors","mca_topo_base_dist_graph_neighbors_count","mca_topo_base_find_available","mca_topo_base_graph_create","mca_topo_base_graph_get","mca_topo_base_graph_map","mca_topo_base_graph_neighbors","mca_topo_base_graph_neighbors_count","mca_topo_base_graphdims_get","mca_topo_base_group_select","mca_topo_base_lazy_init","mca_topo_base_module_construct","mca_topo_base_module_destruct","mca_topo_base_neighbor_count","mca_topo_base_open","mca_topo_basic_query","mca_topo_treematch_component_register","mca_topo_treematch_dist_graph_create","mca_topo_treematch_dist_graph_create.cold","mca_topo_treematch_query","mca_vprotocol_base_close","mca_vprotocol_base_open","mca_vprotocol_base_parasite","mca_vprotocol_base_request_parasite","mca_vprotocol_base_select","mca_vprotocol_base_set_include_list","mca_vprotocol_pessimist_add_comm","mca_vprotocol_pessimist_add_procs","mca_vprotocol_pessimist_component_close","mca_vprotocol_pessimist_component_finalize","mca_vprotocol_pessimist_component_init","mca_vprotocol_pessimist_component_open","mca_vprotocol_pessimist_component_register","mca_vprotocol_pessimist_del_comm","mca_vprotocol_pessimist_del_procs","mca_vprotocol_pessimist_dump","mca_vprotocol_pessimist_enable","mca_vprotocol_pessimist_iprobe","mca_vprotocol_pessimist_irecv","mca_vprotocol_pessimist_isend","mca_vprotocol_pessimist_isend.cold","mca_vprotocol_pessimist_probe","mca_vprotocol_pessimist_recv","mca_vprotocol_pessimist_request_free","mca_vprotocol_pessimist_send","mca_vprotocol_pessimist_send.cold","mca_vprotocol_pessimist_start","mca_vprotocol_pessimist_test","mca_vprotocol_pessimist_test_all","mca_vprotocol_pessimist_test_any","mca_vprotocol_pessimist_test_some","mca_vprotocol_pessimist_wait_any","mca_vprotocol_pessimist_wait_some","model_callback","module_constructor","module_constructor_1_0_0","mpi_aint_add_f90","mpi_aint_add_f90_","mpi_aint_add_f90__","mpi_aint_diff_f90","mpi_aint_diff_f90_","mpi_aint_diff_f90__","mpi_comm_dup_fn","mpi_comm_dup_fn_","mpi_comm_dup_fn__","mpi_comm_null_copy_fn","mpi_comm_null_copy_fn_","mpi_comm_null_copy_fn__","mpi_comm_null_delete_fn","mpi_comm_null_delete_fn_","mpi_comm_null_delete_fn__","mpi_conversion_fn_null","mpi_conversion_fn_null_","mpi_conversion_fn_null__","mpi_conversion_fn_null_f","mpi_dup_fn","mpi_dup_fn_","mpi_dup_fn__","mpi_null_copy_fn","mpi_null_copy_fn_","mpi_null_copy_fn__","mpi_null_delete_fn","mpi_null_delete_fn_","mpi_null_delete_fn__","mpi_type_dup_fn","mpi_type_dup_fn_","mpi_type_dup_fn__","mpi_type_null_copy_fn","mpi_type_null_copy_fn_","mpi_type_null_copy_fn__","mpi_type_null_delete_fn","mpi_type_null_delete_fn_","mpi_type_null_delete_fn__","mpi_win_dup_fn","mpi_win_dup_fn_","mpi_win_dup_fn__","mpi_win_null_copy_fn","mpi_win_null_copy_fn_","mpi_win_null_copy_fn__","mpi_win_null_delete_fn","mpi_win_null_delete_fn_","mpi_win_null_delete_fn__","mpi_wtick_f90","mpi_wtick_f90_","mpi_wtick_f90__","mpi_wtime_f90","mpi_wtime_f90_","mpi_wtime_f90__","msg_down","msg_down.cold","msg_up","mycompar","myfn","nb_leaves","nb_lines","nbc_allgather_init","nbc_allgather_inter_init","nbc_allgatherv_init","nbc_allgatherv_inter_init","nbc_allreduce_init","nbc_allreduce_init.cold","nbc_allreduce_inter_init","nbc_alltoall_init","nbc_alltoall_inter_init","nbc_alltoallv_init","nbc_alltoallv_inter_init","nbc_alltoallw_init","nbc_alltoallw_inter_init","nbc_barrier_init","nbc_barrier_inter_init","nbc_bcast_init","nbc_bcast_inter_init","nbc_exscan_init","nbc_gather_init","nbc_gather_inter_init","nbc_gatherv_init","nbc_gatherv_inter_init","nbc_neighbor_allgather_init","nbc_neighbor_allgatherv_init","nbc_neighbor_alltoall_init","nbc_neighbor_alltoallv_init","nbc_neighbor_alltoallw_init","nbc_reduce_init","nbc_reduce_inter_init","nbc_reduce_scatter_block_init","nbc_reduce_scatter_block_inter_init","nbc_reduce_scatter_init","nbc_reduce_scatter_inter_init","nbc_req_constructor","nbc_scan_init","nbc_scatter_init","nbc_scatter_inter_init","nbc_scatterv_init","nbc_scatterv_inter_init","nbc_schedule_constructor","nbc_schedule_destructor","next_bucket_elem","node_height","node_mheight","node_pathlen","ompi_attr_copy_all","ompi_attr_create_keyval","ompi_attr_create_keyval_aint","ompi_attr_create_keyval_fint","ompi_attr_create_keyval_impl","ompi_attr_create_predefined_keyvals","ompi_attr_delete","ompi_attr_delete_all","ompi_attr_delete_impl","ompi_attr_delete_predefined_keyvals_for_wm","ompi_attr_free_keyval","ompi_attr_free_predefined","ompi_attr_get_aint","ompi_attr_get_aint.cold","ompi_attr_get_c","ompi_attr_get_c.cold","ompi_attr_get_fint","ompi_attr_get_fint.cold","ompi_attr_get_ref","ompi_attr_put_ref","ompi_attr_set_aint","ompi_attr_set_c","ompi_attr_set_fint","ompi_attr_set_int","ompi_attr_set_predefined_keyvals_for_wm","ompi_attribute_keyval_construct","ompi_attribute_keyval_destruct","ompi_coll_adapt_bcast","ompi_coll_adapt_comm_query","ompi_coll_adapt_ibcast","ompi_coll_adapt_ibcast_fini","ompi_coll_adapt_ibcast_register","ompi_coll_adapt_init_query","ompi_coll_adapt_ireduce","ompi_coll_adapt_ireduce_fini","ompi_coll_adapt_ireduce_register","ompi_coll_adapt_module_cached_topology","ompi_coll_adapt_reduce","ompi_coll_adapt_request_free","ompi_coll_base_agree_noft","ompi_coll_base_allgather_intra_basic_linear","ompi_coll_base_allgather_intra_bruck","ompi_coll_base_allgather_intra_neighborexchange","ompi_coll_base_allgather_intra_recursivedoubling","ompi_coll_base_allgather_intra_ring","ompi_coll_base_allgather_intra_sparbit","ompi_coll_base_allgather_intra_two_procs","ompi_coll_base_allgatherv_intra_basic_default","ompi_coll_base_allgatherv_intra_bruck","ompi_coll_base_allgatherv_intra_neighborexchange","ompi_coll_base_allgatherv_intra_ring","ompi_coll_base_allgatherv_intra_sparbit","ompi_coll_base_allgatherv_intra_two_procs","ompi_coll_base_allreduce_intra_basic_linear","ompi_coll_base_allreduce_intra_nonoverlapping","ompi_coll_base_allreduce_intra_recursivedoubling","ompi_coll_base_allreduce_intra_redscat_allgather","ompi_coll_base_allreduce_intra_ring","ompi_coll_base_allreduce_intra_ring_segmented","ompi_coll_base_alltoall_intra_basic_linear","ompi_coll_base_alltoall_intra_bruck","ompi_coll_base_alltoall_intra_linear_sync","ompi_coll_base_alltoall_intra_pairwise","ompi_coll_base_alltoall_intra_two_procs","ompi_coll_base_alltoallv_intra_basic_linear","ompi_coll_base_alltoallv_intra_pairwise","ompi_coll_base_barrier_intra_basic_linear","ompi_coll_base_barrier_intra_bruck","ompi_coll_base_barrier_intra_doublering","ompi_coll_base_barrier_intra_recursivedoubling","ompi_coll_base_barrier_intra_tree","ompi_coll_base_barrier_intra_two_procs","ompi_coll_base_bcast_intra_basic_linear","ompi_coll_base_bcast_intra_binomial","ompi_coll_base_bcast_intra_bintree","ompi_coll_base_bcast_intra_chain","ompi_coll_base_bcast_intra_generic","ompi_coll_base_bcast_intra_knomial","ompi_coll_base_bcast_intra_pipeline","ompi_coll_base_bcast_intra_scatter_allgather","ompi_coll_base_bcast_intra_scatter_allgather_ring","ompi_coll_base_bcast_intra_split_bintree","ompi_coll_base_comm_get_reqs","ompi_coll_base_exscan_intra_linear","ompi_coll_base_exscan_intra_recursivedoubling","ompi_coll_base_file_getnext_long","ompi_coll_base_file_getnext_size_t","ompi_coll_base_file_getnext_string","ompi_coll_base_file_peek_next_char_is","ompi_coll_base_file_peek_next_char_isdigit","ompi_coll_base_gather_intra_basic_linear","ompi_coll_base_gather_intra_binomial","ompi_coll_base_gather_intra_linear_sync","ompi_coll_base_iagree_noft","ompi_coll_base_reduce_generic","ompi_coll_base_reduce_intra_basic_linear","ompi_coll_base_reduce_intra_binary","ompi_coll_base_reduce_intra_binomial","ompi_coll_base_reduce_intra_chain","ompi_coll_base_reduce_intra_in_order_binary","ompi_coll_base_reduce_intra_pipeline","ompi_coll_base_reduce_intra_redscat_gather","ompi_coll_base_reduce_scatter_block_basic_linear","ompi_coll_base_reduce_scatter_block_intra_butterfly","ompi_coll_base_reduce_scatter_block_intra_recursivedoubling","ompi_coll_base_reduce_scatter_block_intra_recursivehalving","ompi_coll_base_reduce_scatter_intra_basic_recursivehalving","ompi_coll_base_reduce_scatter_intra_butterfly","ompi_coll_base_reduce_scatter_intra_nonoverlapping","ompi_coll_base_reduce_scatter_intra_ring","ompi_coll_base_retain_datatypes","ompi_coll_base_retain_datatypes_w","ompi_coll_base_retain_op","ompi_coll_base_scan_intra_linear","ompi_coll_base_scan_intra_recursivedoubling","ompi_coll_base_scatter_intra_basic_linear","ompi_coll_base_scatter_intra_binomial","ompi_coll_base_scatter_intra_linear_nb","ompi_coll_base_sendrecv_actual","ompi_coll_base_topo_build_bmtree","ompi_coll_base_topo_build_chain","ompi_coll_base_topo_build_in_order_bintree","ompi_coll_base_topo_build_in_order_bmtree","ompi_coll_base_topo_build_kmtree","ompi_coll_base_topo_build_tree","ompi_coll_base_topo_destroy_tree","ompi_coll_base_topo_dump_tree","ompi_coll_han_reorder_gather","ompi_coll_han_request_free","ompi_coll_libnbc_allgather_init","ompi_coll_libnbc_allgather_inter_init","ompi_coll_libnbc_allgatherv_init","ompi_coll_libnbc_allgatherv_inter_init","ompi_coll_libnbc_allreduce_init","ompi_coll_libnbc_allreduce_inter_init","ompi_coll_libnbc_alltoall_init","ompi_coll_libnbc_alltoall_inter_init","ompi_coll_libnbc_alltoallv_init","ompi_coll_libnbc_alltoallv_inter_init","ompi_coll_libnbc_alltoallw_init","ompi_coll_libnbc_alltoallw_inter_init","ompi_coll_libnbc_barrier_init","ompi_coll_libnbc_barrier_inter_init","ompi_coll_libnbc_bcast_init","ompi_coll_libnbc_bcast_inter_init","ompi_coll_libnbc_dict_destroy","ompi_coll_libnbc_dict_itor_destroy","ompi_coll_libnbc_dict_long_cmp","ompi_coll_libnbc_dict_ptr_cmp","ompi_coll_libnbc_dict_str_cmp","ompi_coll_libnbc_dict_uint_cmp","ompi_coll_libnbc_dict_ulong_cmp","ompi_coll_libnbc_exscan_init","ompi_coll_libnbc_gather_init","ompi_coll_libnbc_gather_inter_init","ompi_coll_libnbc_gatherv_init","ompi_coll_libnbc_gatherv_inter_init","ompi_coll_libnbc_hb_dict_itor_new","ompi_coll_libnbc_hb_dict_new","ompi_coll_libnbc_hb_itor_cdata","ompi_coll_libnbc_hb_itor_data","ompi_coll_libnbc_hb_itor_destroy","ompi_coll_libnbc_hb_itor_first","ompi_coll_libnbc_hb_itor_invalidate","ompi_coll_libnbc_hb_itor_key","ompi_coll_libnbc_hb_itor_last","ompi_coll_libnbc_hb_itor_new","ompi_coll_libnbc_hb_itor_next","ompi_coll_libnbc_hb_itor_nextn","ompi_coll_libnbc_hb_itor_prev","ompi_coll_libnbc_hb_itor_prevn","ompi_coll_libnbc_hb_itor_set_data","ompi_coll_libnbc_hb_itor_valid","ompi_coll_libnbc_hb_tree_count","ompi_coll_libnbc_hb_tree_destroy","ompi_coll_libnbc_hb_tree_empty","ompi_coll_libnbc_hb_tree_height","ompi_coll_libnbc_hb_tree_insert","ompi_coll_libnbc_hb_tree_max","ompi_coll_libnbc_hb_tree_mheight","ompi_coll_libnbc_hb_tree_min","ompi_coll_libnbc_hb_tree_new","ompi_coll_libnbc_hb_tree_pathlen","ompi_coll_libnbc_hb_tree_probe","ompi_coll_libnbc_hb_tree_remove","ompi_coll_libnbc_hb_tree_search","ompi_coll_libnbc_hb_tree_walk","ompi_coll_libnbc_iallgather","ompi_coll_libnbc_iallgather_inter","ompi_coll_libnbc_iallgatherv","ompi_coll_libnbc_iallgatherv_inter","ompi_coll_libnbc_iallreduce","ompi_coll_libnbc_iallreduce_inter","ompi_coll_libnbc_ialltoall","ompi_coll_libnbc_ialltoall_inter","ompi_coll_libnbc_ialltoallv","ompi_coll_libnbc_ialltoallv_inter","ompi_coll_libnbc_ialltoallw","ompi_coll_libnbc_ialltoallw_inter","ompi_coll_libnbc_ibarrier","ompi_coll_libnbc_ibarrier_inter","ompi_coll_libnbc_ibcast","ompi_coll_libnbc_ibcast_inter","ompi_coll_libnbc_iexscan","ompi_coll_libnbc_igather","ompi_coll_libnbc_igather_inter","ompi_coll_libnbc_igatherv","ompi_coll_libnbc_igatherv_inter","ompi_coll_libnbc_ineighbor_allgather","ompi_coll_libnbc_ineighbor_allgatherv","ompi_coll_libnbc_ineighbor_alltoall","ompi_coll_libnbc_ineighbor_alltoallv","ompi_coll_libnbc_ineighbor_alltoallw","ompi_coll_libnbc_ireduce","ompi_coll_libnbc_ireduce_inter","ompi_coll_libnbc_ireduce_scatter","ompi_coll_libnbc_ireduce_scatter_block","ompi_coll_libnbc_ireduce_scatter_block_inter","ompi_coll_libnbc_ireduce_scatter_inter","ompi_coll_libnbc_iscan","ompi_coll_libnbc_iscatter","ompi_coll_libnbc_iscatter_inter","ompi_coll_libnbc_iscatterv","ompi_coll_libnbc_iscatterv_inter","ompi_coll_libnbc_neighbor_allgather_init","ompi_coll_libnbc_neighbor_allgatherv_init","ompi_coll_libnbc_neighbor_alltoall_init","ompi_coll_libnbc_neighbor_alltoallv_init","ompi_coll_libnbc_neighbor_alltoallw_init","ompi_coll_libnbc_progress","ompi_coll_libnbc_reduce_init","ompi_coll_libnbc_reduce_inter_init","ompi_coll_libnbc_reduce_scatter_block_init","ompi_coll_libnbc_reduce_scatter_block_inter_init","ompi_coll_libnbc_reduce_scatter_init","ompi_coll_libnbc_reduce_scatter_inter_init","ompi_coll_libnbc_scan_init","ompi_coll_libnbc_scatter_init","ompi_coll_libnbc_scatter_inter_init","ompi_coll_libnbc_scatterv_init","ompi_coll_libnbc_scatterv_inter_init","ompi_coll_sm_lazy_enable","ompi_coll_tuned_allgather_intra_check_forced_init","ompi_coll_tuned_allgather_intra_dec_dynamic","ompi_coll_tuned_allgather_intra_dec_fixed","ompi_coll_tuned_allgather_intra_do_this","ompi_coll_tuned_allgatherv_intra_check_forced_init","ompi_coll_tuned_allgatherv_intra_dec_dynamic","ompi_coll_tuned_allgatherv_intra_dec_fixed","ompi_coll_tuned_allgatherv_intra_do_this","ompi_coll_tuned_allreduce_intra_check_forced_init","ompi_coll_tuned_allreduce_intra_dec_dynamic","ompi_coll_tuned_allreduce_intra_dec_fixed","ompi_coll_tuned_allreduce_intra_do_this","ompi_coll_tuned_alltoall_intra_check_forced_init","ompi_coll_tuned_alltoall_intra_dec_dynamic","ompi_coll_tuned_alltoall_intra_dec_fixed","ompi_coll_tuned_alltoall_intra_do_this","ompi_coll_tuned_alltoallv_intra_check_forced_init","ompi_coll_tuned_alltoallv_intra_dec_dynamic","ompi_coll_tuned_alltoallv_intra_dec_fixed","ompi_coll_tuned_alltoallv_intra_do_this","ompi_coll_tuned_barrier_intra_check_forced_init","ompi_coll_tuned_barrier_intra_dec_dynamic","ompi_coll_tuned_barrier_intra_dec_fixed","ompi_coll_tuned_barrier_intra_do_this","ompi_coll_tuned_bcast_intra_check_forced_init","ompi_coll_tuned_bcast_intra_dec_dynamic","ompi_coll_tuned_bcast_intra_dec_fixed","ompi_coll_tuned_bcast_intra_do_this","ompi_coll_tuned_comm_query","ompi_coll_tuned_dump_alg_rule","ompi_coll_tuned_dump_all_rules","ompi_coll_tuned_dump_com_rule","ompi_coll_tuned_dump_msg_rule","ompi_coll_tuned_exscan_intra_check_forced_init","ompi_coll_tuned_exscan_intra_dec_dynamic","ompi_coll_tuned_exscan_intra_do_this","ompi_coll_tuned_forced_getvalues.isra.0","ompi_coll_tuned_free_all_rules","ompi_coll_tuned_free_coms_in_alg_rule","ompi_coll_tuned_free_msg_rules_in_com_rule","ompi_coll_tuned_gather_intra_check_forced_init","ompi_coll_tuned_gather_intra_dec_dynamic","ompi_coll_tuned_gather_intra_dec_fixed","ompi_coll_tuned_gather_intra_do_this","ompi_coll_tuned_get_com_rule_ptr","ompi_coll_tuned_get_target_method_params","ompi_coll_tuned_init_query","ompi_coll_tuned_mk_alg_rules","ompi_coll_tuned_mk_com_rules","ompi_coll_tuned_mk_msg_rules","ompi_coll_tuned_read_rules_config_file","ompi_coll_tuned_reduce_intra_check_forced_init","ompi_coll_tuned_reduce_intra_dec_dynamic","ompi_coll_tuned_reduce_intra_dec_fixed","ompi_coll_tuned_reduce_intra_do_this","ompi_coll_tuned_reduce_scatter_block_intra_check_forced_init","ompi_coll_tuned_reduce_scatter_block_intra_dec_dynamic","ompi_coll_tuned_reduce_scatter_block_intra_dec_fixed","ompi_coll_tuned_reduce_scatter_block_intra_do_this","ompi_coll_tuned_reduce_scatter_intra_check_forced_init","ompi_coll_tuned_reduce_scatter_intra_dec_dynamic","ompi_coll_tuned_reduce_scatter_intra_dec_fixed","ompi_coll_tuned_reduce_scatter_intra_do_this","ompi_coll_tuned_scan_intra_check_forced_init","ompi_coll_tuned_scan_intra_dec_dynamic","ompi_coll_tuned_scan_intra_do_this","ompi_coll_tuned_scatter_intra_check_forced_init","ompi_coll_tuned_scatter_intra_dec_dynamic","ompi_coll_tuned_scatter_intra_dec_fixed","ompi_coll_tuned_scatter_intra_do_this","ompi_comm_ack_failed_internal","ompi_comm_activate","ompi_comm_activate_nb","ompi_comm_activate_nb_complete","ompi_comm_allgather_emulate_intra","ompi_comm_allreduce_bridged_reduce_complete","ompi_comm_allreduce_bridged_xchng_complete","ompi_comm_allreduce_context_construct","ompi_comm_allreduce_context_destruct","ompi_comm_allreduce_getnextcid","ompi_comm_allreduce_group_broadcast","ompi_comm_allreduce_group_nb","ompi_comm_allreduce_group_recv_complete","ompi_comm_allreduce_inter_bcast","ompi_comm_allreduce_inter_leader_exchange","ompi_comm_allreduce_inter_leader_reduce","ompi_comm_allreduce_inter_nb","ompi_comm_allreduce_intra_bridge_nb","ompi_comm_allreduce_intra_nb","ompi_comm_allreduce_intra_pmix_nb","ompi_comm_allreduce_pmix_reduce_complete","ompi_comm_assert_subscribe","ompi_comm_checkcid","ompi_comm_cid_init","ompi_comm_compare","ompi_comm_construct","ompi_comm_create","ompi_comm_create_from_group","ompi_comm_create_group","ompi_comm_create_w_info","ompi_comm_destruct","ompi_comm_determine_first","ompi_comm_determine_first_auto","ompi_comm_dump","ompi_comm_dup","ompi_comm_dup_fn_f","ompi_comm_dup_with_info","ompi_comm_enable","ompi_comm_failure_ack_internal","ompi_comm_failure_detector_finalize","ompi_comm_failure_detector_init","ompi_comm_failure_detector_register_params","ompi_comm_failure_detector_start","ompi_comm_failure_get_acked_internal","ompi_comm_failure_propagate","ompi_comm_failure_propagator_finalize","ompi_comm_failure_propagator_init","ompi_comm_failure_propagator_local","ompi_comm_failure_propagator_register_params","ompi_comm_finalize","ompi_comm_free","ompi_comm_free.localalias","ompi_comm_ft_allreduce_agree_completion","ompi_comm_ft_allreduce_inter_nb","ompi_comm_ft_allreduce_intra_nb","ompi_comm_ft_allreduce_intra_pmix_nb","ompi_comm_get_failed_internal","ompi_comm_get_remote_cid_from_pmix","ompi_comm_get_rprocs","ompi_comm_group","ompi_comm_idup","ompi_comm_idup_getcid","ompi_comm_idup_with_info","ompi_comm_idup_with_info_activate","ompi_comm_idup_with_info_finish","ompi_comm_init","ompi_comm_init_mpi3","ompi_comm_is_proc_active","ompi_comm_ishrink_check_activate","ompi_comm_ishrink_check_agree","ompi_comm_ishrink_check_cid","ompi_comm_ishrink_check_setrank","ompi_comm_ishrink_internal","ompi_comm_nextcid","ompi_comm_nextcid_check_flag","ompi_comm_nextcid_nb","ompi_comm_null_copy_fn_f","ompi_comm_null_delete_fn_f","ompi_comm_print_cid","ompi_comm_rbcast_bmg","ompi_comm_rbcast_bml_recv_cb","ompi_comm_rbcast_finalize","ompi_comm_rbcast_init","ompi_comm_rbcast_n2","ompi_comm_rbcast_null","ompi_comm_rbcast_register_cb_type","ompi_comm_rbcast_register_params","ompi_comm_rbcast_send_msg","ompi_comm_rbcast_unregister_cb_type","ompi_comm_request_cancel","ompi_comm_request_construct","ompi_comm_request_destruct","ompi_comm_request_fini","ompi_comm_request_free","ompi_comm_request_get","ompi_comm_request_init","ompi_comm_request_progress","ompi_comm_request_progress.cold","ompi_comm_request_return","ompi_comm_request_schedule_append","ompi_comm_request_schedule_append_w_flags","ompi_comm_request_start","ompi_comm_revoke_finalize","ompi_comm_revoke_init","ompi_comm_revoke_internal","ompi_comm_revoke_local","ompi_comm_set","ompi_comm_set_active_poll","ompi_comm_set_allow_overtake","ompi_comm_set_exact_length","ompi_comm_set_lazy_barrier","ompi_comm_set_name","ompi_comm_set_nb","ompi_comm_set_no_any_source","ompi_comm_set_no_any_tag","ompi_comm_set_rank_failed","ompi_comm_shrink_internal","ompi_comm_split","ompi_comm_split_type","ompi_comm_split_type_core","ompi_comm_split_type_get_part.constprop.0","ompi_comm_split_verify","ompi_comm_split_with_info","ompi_comm_start_detector","ompi_datatype_copy_args","ompi_datatype_create","ompi_datatype_create_contiguous","ompi_datatype_create_darray","ompi_datatype_create_from_packed_description","ompi_datatype_create_hindexed","ompi_datatype_create_hindexed_block","ompi_datatype_create_hvector","ompi_datatype_create_indexed","ompi_datatype_create_indexed_block","ompi_datatype_create_struct","ompi_datatype_create_subarray","ompi_datatype_create_vector","ompi_datatype_default_convertors_fini","ompi_datatype_default_convertors_init","ompi_datatype_destroy","ompi_datatype_dump","ompi_datatype_duplicate","ompi_datatype_finalize","ompi_datatype_get_args","ompi_datatype_get_elements","ompi_datatype_get_pack_description","ompi_datatype_get_single_predefined_type_from_args","ompi_datatype_get_single_predefined_type_from_args.localalias","ompi_datatype_init","ompi_datatype_init.cold","ompi_datatype_match_size","ompi_datatype_match_size.cold","ompi_datatype_pack_description_length","ompi_datatype_pack_external","ompi_datatype_pack_external_size","ompi_datatype_print_args","ompi_datatype_release_args","ompi_datatype_set_args","ompi_datatype_sndrcv","ompi_datatype_unpack_external","ompi_debugger_setup_dlls","ompi_dpm_close_port","ompi_dpm_connect_accept","ompi_dpm_disconnect","ompi_dpm_dyn_finalize","ompi_dpm_dyn_init","ompi_dpm_init","ompi_dpm_mark_dyncomm","ompi_dpm_open_port","ompi_dpm_spawn","ompi_dup_fn_f","ompi_errcode_get_mpi_code.part.0","ompi_errcode_get_mpi_code.part.0.cold","ompi_errcode_intern_construct","ompi_errcode_intern_destruct","ompi_errcode_intern_finalize","ompi_errcode_intern_init","ompi_errhandler_callback","ompi_errhandler_construct","ompi_errhandler_create","ompi_errhandler_destruct","ompi_errhandler_event_cb","ompi_errhandler_finalize","ompi_errhandler_free","ompi_errhandler_init","ompi_errhandler_invoke","ompi_errhandler_proc_failed_internal","ompi_errhandler_registration_callback","ompi_errhandler_request_invoke","ompi_errhandler_request_invoke.cold","ompi_fcoll_base_coll_allgather_array","ompi_fcoll_base_coll_allgatherv_array","ompi_fcoll_base_coll_bcast_array","ompi_fcoll_base_coll_gather_array","ompi_fcoll_base_coll_gatherv_array","ompi_fcoll_base_coll_scatterv_array","ompi_fcoll_base_sort_iovec","ompi_file_close","ompi_file_finalize","ompi_file_init","ompi_file_open","ompi_fortran_argv_blank_f2c","ompi_fortran_argv_count_f2c","ompi_fortran_multiple_argvs_f2c","ompi_fortran_string_c2f","ompi_fortran_string_f2c","ompi_grequest_cancel","ompi_grequest_complete","ompi_grequest_construct","ompi_grequest_destruct","ompi_grequest_free","ompi_grequest_invoke_query","ompi_grequest_start","ompi_group_allocate","ompi_group_allocate_bmap","ompi_group_allocate_plist_w_procs","ompi_group_allocate_sporadic","ompi_group_allocate_strided","ompi_group_calc_bmap","ompi_group_calc_plist","ompi_group_calc_sporadic","ompi_group_calc_strided","ompi_group_compare","ompi_group_construct","ompi_group_count_local_peers","ompi_group_decrement_proc_count","ompi_group_dense_overlap","ompi_group_destruct","ompi_group_difference","ompi_group_div_ceil","ompi_group_dump","ompi_group_excl","ompi_group_finalize","ompi_group_flatten","ompi_group_free","ompi_group_from_pset","ompi_group_have_remote_peers","ompi_group_incl","ompi_group_incl_bmap","ompi_group_incl_plist","ompi_group_incl_spor","ompi_group_incl_strided","ompi_group_increment_proc_count","ompi_group_init","ompi_group_intersection","ompi_group_minloc","ompi_group_overlap","ompi_group_range_excl","ompi_group_range_incl","ompi_group_to_proc_name_array","ompi_group_translate_ranks","ompi_group_translate_ranks_bmap","ompi_group_translate_ranks_bmap_reverse","ompi_group_translate_ranks_sporadic","ompi_group_translate_ranks_sporadic_reverse","ompi_group_translate_ranks_strided","ompi_group_translate_ranks_strided_reverse","ompi_group_union","ompi_hook_base_close","ompi_hook_base_deregister_callbacks","ompi_hook_base_mpi_finalize_bottom","ompi_hook_base_mpi_finalize_top","ompi_hook_base_mpi_finalized_bottom","ompi_hook_base_mpi_finalized_top","ompi_hook_base_mpi_init_bottom","ompi_hook_base_mpi_init_error","ompi_hook_base_mpi_init_thread_bottom","ompi_hook_base_mpi_init_thread_top","ompi_hook_base_mpi_init_top","ompi_hook_base_mpi_init_top_post_opal","ompi_hook_base_mpi_initialized_bottom","ompi_hook_base_mpi_initialized_top","ompi_hook_base_open","ompi_hook_base_register","ompi_hook_base_register_callbacks","ompi_hook_comm_method_component_close","ompi_hook_comm_method_component_open","ompi_hook_comm_method_component_register","ompi_hook_comm_method_mpi_finalize_top","ompi_hook_comm_method_mpi_init_bottom","ompi_info_allocate","ompi_info_close_components","ompi_info_delete","ompi_info_dup","ompi_info_free","ompi_info_get","ompi_info_get_bool","ompi_info_get_nkeys","ompi_info_get_nthkey","ompi_info_get_value_enum","ompi_info_get_valuelen","ompi_info_register_framework_params","ompi_info_register_types","ompi_info_set","ompi_info_set_value_enum","ompi_info_show_ompi_version","ompi_init_preconnect_mpi","ompi_initial_errhandler_init","ompi_instance_construct","ompi_instance_destruct","ompi_instance_get_nth_pset","ompi_instance_get_num_psets","ompi_instance_get_num_psets_complete","ompi_instance_get_pset_info","ompi_instance_group_pmix_pset","ompi_instance_group_shared","ompi_instance_print_error.part.0","ompi_instance_refresh_pmix_psets","ompi_intercomm_create","ompi_intercomm_create_from_groups","ompi_interlib_declare","ompi_io_ompio_generate_current_file_view","ompi_io_ompio_generate_current_file_view.cold","ompi_io_ompio_sort_offlen","ompi_isendrecv_complete_func","ompi_isendrecv_context_constructor","ompi_isendrecv_context_destructor","ompi_isendrecv_replace_complete_func","ompi_message_constructor","ompi_message_finalize","ompi_message_init","ompi_mirror_perm","ompi_mpi_abort","ompi_mpi_dynamics_disable","ompi_mpi_dynamics_finalize","ompi_mpi_dynamics_is_enabled","ompi_mpi_errclass_add","ompi_mpi_errcode_add","ompi_mpi_errcode_construct","ompi_mpi_errcode_destruct","ompi_mpi_errcode_finalize","ompi_mpi_errcode_init","ompi_mpi_errnum_add_string","ompi_mpi_errors_abort_comm_handler","ompi_mpi_errors_abort_file_handler","ompi_mpi_errors_abort_win_handler","ompi_mpi_errors_are_fatal_comm_handler","ompi_mpi_errors_are_fatal_file_handler","ompi_mpi_errors_are_fatal_instance_handler","ompi_mpi_errors_are_fatal_win_handler","ompi_mpi_errors_return_comm_handler","ompi_mpi_errors_return_file_handler","ompi_mpi_errors_return_instance_handler","ompi_mpi_errors_return_win_handler","ompi_mpi_finalize","ompi_mpi_init","ompi_mpi_instance_cleanup_pml","ompi_mpi_instance_finalize","ompi_mpi_instance_finalize_common","ompi_mpi_instance_init","ompi_mpi_instance_init_common","ompi_mpi_instance_release","ompi_mpi_instance_retain","ompi_mpi_register_params","ompi_mpi_thread_level","ompi_mpiext_fini","ompi_mpiext_init","ompi_mpiinfo_finalize","ompi_mpiinfo_init","ompi_mpiinfo_init_env","ompi_mpit_lock","ompi_mpit_unlock","ompi_mtl_base_close","ompi_mtl_base_select","ompi_null_copy_fn_f","ompi_null_delete_fn_f","ompi_op_avx_2buff_add_double_avx","ompi_op_avx_2buff_add_double_avx2","ompi_op_avx_2buff_add_double_avx512","ompi_op_avx_2buff_add_float_avx","ompi_op_avx_2buff_add_float_avx2","ompi_op_avx_2buff_add_float_avx512","ompi_op_avx_2buff_band_int16_t_avx","ompi_op_avx_2buff_band_int16_t_avx2","ompi_op_avx_2buff_band_int16_t_avx512","ompi_op_avx_2buff_band_int32_t_avx","ompi_op_avx_2buff_band_int32_t_avx2","ompi_op_avx_2buff_band_int32_t_avx512","ompi_op_avx_2buff_band_int64_t_avx","ompi_op_avx_2buff_band_int64_t_avx2","ompi_op_avx_2buff_band_int64_t_avx512","ompi_op_avx_2buff_band_int8_t_avx","ompi_op_avx_2buff_band_int8_t_avx2","ompi_op_avx_2buff_band_int8_t_avx512","ompi_op_avx_2buff_band_uint16_t_avx","ompi_op_avx_2buff_band_uint16_t_avx2","ompi_op_avx_2buff_band_uint16_t_avx512","ompi_op_avx_2buff_band_uint32_t_avx","ompi_op_avx_2buff_band_uint32_t_avx2","ompi_op_avx_2buff_band_uint32_t_avx512","ompi_op_avx_2buff_band_uint64_t_avx","ompi_op_avx_2buff_band_uint64_t_avx2","ompi_op_avx_2buff_band_uint64_t_avx512","ompi_op_avx_2buff_band_uint8_t_avx","ompi_op_avx_2buff_band_uint8_t_avx2","ompi_op_avx_2buff_band_uint8_t_avx512","ompi_op_avx_2buff_bor_int16_t_avx","ompi_op_avx_2buff_bor_int16_t_avx2","ompi_op_avx_2buff_bor_int16_t_avx512","ompi_op_avx_2buff_bor_int32_t_avx","ompi_op_avx_2buff_bor_int32_t_avx2","ompi_op_avx_2buff_bor_int32_t_avx512","ompi_op_avx_2buff_bor_int64_t_avx","ompi_op_avx_2buff_bor_int64_t_avx2","ompi_op_avx_2buff_bor_int64_t_avx512","ompi_op_avx_2buff_bor_int8_t_avx","ompi_op_avx_2buff_bor_int8_t_avx2","ompi_op_avx_2buff_bor_int8_t_avx512","ompi_op_avx_2buff_bor_uint16_t_avx","ompi_op_avx_2buff_bor_uint16_t_avx2","ompi_op_avx_2buff_bor_uint16_t_avx512","ompi_op_avx_2buff_bor_uint32_t_avx","ompi_op_avx_2buff_bor_uint32_t_avx2","ompi_op_avx_2buff_bor_uint32_t_avx512","ompi_op_avx_2buff_bor_uint64_t_avx","ompi_op_avx_2buff_bor_uint64_t_avx2","ompi_op_avx_2buff_bor_uint64_t_avx512","ompi_op_avx_2buff_bor_uint8_t_avx","ompi_op_avx_2buff_bor_uint8_t_avx2","ompi_op_avx_2buff_bor_uint8_t_avx512","ompi_op_avx_2buff_bxor_int16_t_avx","ompi_op_avx_2buff_bxor_int16_t_avx2","ompi_op_avx_2buff_bxor_int16_t_avx512","ompi_op_avx_2buff_bxor_int32_t_avx","ompi_op_avx_2buff_bxor_int32_t_avx2","ompi_op_avx_2buff_bxor_int32_t_avx512","ompi_op_avx_2buff_bxor_int64_t_avx","ompi_op_avx_2buff_bxor_int64_t_avx2","ompi_op_avx_2buff_bxor_int64_t_avx512","ompi_op_avx_2buff_bxor_int8_t_avx","ompi_op_avx_2buff_bxor_int8_t_avx2","ompi_op_avx_2buff_bxor_int8_t_avx512","ompi_op_avx_2buff_bxor_uint16_t_avx","ompi_op_avx_2buff_bxor_uint16_t_avx2","ompi_op_avx_2buff_bxor_uint16_t_avx512","ompi_op_avx_2buff_bxor_uint32_t_avx","ompi_op_avx_2buff_bxor_uint32_t_avx2","ompi_op_avx_2buff_bxor_uint32_t_avx512","ompi_op_avx_2buff_bxor_uint64_t_avx","ompi_op_avx_2buff_bxor_uint64_t_avx2","ompi_op_avx_2buff_bxor_uint64_t_avx512","ompi_op_avx_2buff_bxor_uint8_t_avx","ompi_op_avx_2buff_bxor_uint8_t_avx2","ompi_op_avx_2buff_bxor_uint8_t_avx512","ompi_op_avx_2buff_max_double_avx","ompi_op_avx_2buff_max_double_avx2","ompi_op_avx_2buff_max_double_avx512","ompi_op_avx_2buff_max_float_avx","ompi_op_avx_2buff_max_float_avx2","ompi_op_avx_2buff_max_float_avx512","ompi_op_avx_2buff_max_int16_t_avx","ompi_op_avx_2buff_max_int16_t_avx2","ompi_op_avx_2buff_max_int16_t_avx512","ompi_op_avx_2buff_max_int32_t_avx","ompi_op_avx_2buff_max_int32_t_avx2","ompi_op_avx_2buff_max_int32_t_avx512","ompi_op_avx_2buff_max_int64_t_avx512","ompi_op_avx_2buff_max_int8_t_avx","ompi_op_avx_2buff_max_int8_t_avx2","ompi_op_avx_2buff_max_int8_t_avx512","ompi_op_avx_2buff_max_uint16_t_avx","ompi_op_avx_2buff_max_uint16_t_avx2","ompi_op_avx_2buff_max_uint16_t_avx512","ompi_op_avx_2buff_max_uint32_t_avx","ompi_op_avx_2buff_max_uint32_t_avx2","ompi_op_avx_2buff_max_uint32_t_avx512","ompi_op_avx_2buff_max_uint64_t_avx512","ompi_op_avx_2buff_max_uint8_t_avx","ompi_op_avx_2buff_max_uint8_t_avx2","ompi_op_avx_2buff_max_uint8_t_avx512","ompi_op_avx_2buff_min_double_avx","ompi_op_avx_2buff_min_double_avx2","ompi_op_avx_2buff_min_double_avx512","ompi_op_avx_2buff_min_float_avx","ompi_op_avx_2buff_min_float_avx2","ompi_op_avx_2buff_min_float_avx512","ompi_op_avx_2buff_min_int16_t_avx","ompi_op_avx_2buff_min_int16_t_avx2","ompi_op_avx_2buff_min_int16_t_avx512","ompi_op_avx_2buff_min_int32_t_avx","ompi_op_avx_2buff_min_int32_t_avx2","ompi_op_avx_2buff_min_int32_t_avx512","ompi_op_avx_2buff_min_int64_t_avx512","ompi_op_avx_2buff_min_int8_t_avx","ompi_op_avx_2buff_min_int8_t_avx2","ompi_op_avx_2buff_min_int8_t_avx512","ompi_op_avx_2buff_min_uint16_t_avx","ompi_op_avx_2buff_min_uint16_t_avx2","ompi_op_avx_2buff_min_uint16_t_avx512","ompi_op_avx_2buff_min_uint32_t_avx","ompi_op_avx_2buff_min_uint32_t_avx2","ompi_op_avx_2buff_min_uint32_t_avx512","ompi_op_avx_2buff_min_uint64_t_avx512","ompi_op_avx_2buff_min_uint8_t_avx","ompi_op_avx_2buff_min_uint8_t_avx2","ompi_op_avx_2buff_min_uint8_t_avx512","ompi_op_avx_2buff_mul_double_avx","ompi_op_avx_2buff_mul_double_avx2","ompi_op_avx_2buff_mul_double_avx512","ompi_op_avx_2buff_mul_float_avx","ompi_op_avx_2buff_mul_float_avx2","ompi_op_avx_2buff_mul_float_avx512","ompi_op_avx_2buff_prod_int16_t_avx","ompi_op_avx_2buff_prod_int16_t_avx2","ompi_op_avx_2buff_prod_int16_t_avx512","ompi_op_avx_2buff_prod_int32_t_avx","ompi_op_avx_2buff_prod_int32_t_avx2","ompi_op_avx_2buff_prod_int32_t_avx512","ompi_op_avx_2buff_prod_int64_t_avx512","ompi_op_avx_2buff_prod_int8_t_avx","ompi_op_avx_2buff_prod_int8_t_avx2","ompi_op_avx_2buff_prod_int8_t_avx512","ompi_op_avx_2buff_prod_uint16_t_avx","ompi_op_avx_2buff_prod_uint16_t_avx2","ompi_op_avx_2buff_prod_uint16_t_avx512","ompi_op_avx_2buff_prod_uint32_t_avx","ompi_op_avx_2buff_prod_uint32_t_avx2","ompi_op_avx_2buff_prod_uint32_t_avx512","ompi_op_avx_2buff_prod_uint64_t_avx512","ompi_op_avx_2buff_prod_uint8_t_avx","ompi_op_avx_2buff_prod_uint8_t_avx2","ompi_op_avx_2buff_prod_uint8_t_avx512","ompi_op_avx_2buff_sum_int16_t_avx","ompi_op_avx_2buff_sum_int16_t_avx2","ompi_op_avx_2buff_sum_int16_t_avx512","ompi_op_avx_2buff_sum_int32_t_avx","ompi_op_avx_2buff_sum_int32_t_avx2","ompi_op_avx_2buff_sum_int32_t_avx512","ompi_op_avx_2buff_sum_int64_t_avx","ompi_op_avx_2buff_sum_int64_t_avx2","ompi_op_avx_2buff_sum_int64_t_avx512","ompi_op_avx_2buff_sum_int8_t_avx","ompi_op_avx_2buff_sum_int8_t_avx2","ompi_op_avx_2buff_sum_int8_t_avx512","ompi_op_avx_2buff_sum_uint16_t_avx","ompi_op_avx_2buff_sum_uint16_t_avx2","ompi_op_avx_2buff_sum_uint16_t_avx512","ompi_op_avx_2buff_sum_uint32_t_avx","ompi_op_avx_2buff_sum_uint32_t_avx2","ompi_op_avx_2buff_sum_uint32_t_avx512","ompi_op_avx_2buff_sum_uint64_t_avx","ompi_op_avx_2buff_sum_uint64_t_avx2","ompi_op_avx_2buff_sum_uint64_t_avx512","ompi_op_avx_2buff_sum_uint8_t_avx","ompi_op_avx_2buff_sum_uint8_t_avx2","ompi_op_avx_2buff_sum_uint8_t_avx512","ompi_op_avx_3buff_add_double_avx","ompi_op_avx_3buff_add_double_avx2","ompi_op_avx_3buff_add_double_avx512","ompi_op_avx_3buff_add_float_avx","ompi_op_avx_3buff_add_float_avx2","ompi_op_avx_3buff_add_float_avx512","ompi_op_avx_3buff_and_int16_t_avx","ompi_op_avx_3buff_and_int16_t_avx2","ompi_op_avx_3buff_and_int16_t_avx512","ompi_op_avx_3buff_and_int32_t_avx","ompi_op_avx_3buff_and_int32_t_avx2","ompi_op_avx_3buff_and_int32_t_avx512","ompi_op_avx_3buff_and_int64_t_avx","ompi_op_avx_3buff_and_int64_t_avx2","ompi_op_avx_3buff_and_int64_t_avx512","ompi_op_avx_3buff_and_int8_t_avx","ompi_op_avx_3buff_and_int8_t_avx2","ompi_op_avx_3buff_and_int8_t_avx512","ompi_op_avx_3buff_and_uint16_t_avx","ompi_op_avx_3buff_and_uint16_t_avx2","ompi_op_avx_3buff_and_uint16_t_avx512","ompi_op_avx_3buff_and_uint32_t_avx","ompi_op_avx_3buff_and_uint32_t_avx2","ompi_op_avx_3buff_and_uint32_t_avx512","ompi_op_avx_3buff_and_uint64_t_avx","ompi_op_avx_3buff_and_uint64_t_avx2","ompi_op_avx_3buff_and_uint64_t_avx512","ompi_op_avx_3buff_and_uint8_t_avx","ompi_op_avx_3buff_and_uint8_t_avx2","ompi_op_avx_3buff_and_uint8_t_avx512","ompi_op_avx_3buff_max_double_avx","ompi_op_avx_3buff_max_double_avx2","ompi_op_avx_3buff_max_double_avx512","ompi_op_avx_3buff_max_float_avx","ompi_op_avx_3buff_max_float_avx2","ompi_op_avx_3buff_max_float_avx512","ompi_op_avx_3buff_max_int16_t_avx","ompi_op_avx_3buff_max_int16_t_avx2","ompi_op_avx_3buff_max_int16_t_avx512","ompi_op_avx_3buff_max_int32_t_avx","ompi_op_avx_3buff_max_int32_t_avx2","ompi_op_avx_3buff_max_int32_t_avx512","ompi_op_avx_3buff_max_int64_t_avx512","ompi_op_avx_3buff_max_int8_t_avx","ompi_op_avx_3buff_max_int8_t_avx2","ompi_op_avx_3buff_max_int8_t_avx512","ompi_op_avx_3buff_max_uint16_t_avx","ompi_op_avx_3buff_max_uint16_t_avx2","ompi_op_avx_3buff_max_uint16_t_avx512","ompi_op_avx_3buff_max_uint32_t_avx","ompi_op_avx_3buff_max_uint32_t_avx2","ompi_op_avx_3buff_max_uint32_t_avx512","ompi_op_avx_3buff_max_uint64_t_avx512","ompi_op_avx_3buff_max_uint8_t_avx","ompi_op_avx_3buff_max_uint8_t_avx2","ompi_op_avx_3buff_max_uint8_t_avx512","ompi_op_avx_3buff_min_double_avx","ompi_op_avx_3buff_min_double_avx2","ompi_op_avx_3buff_min_double_avx512","ompi_op_avx_3buff_min_float_avx","ompi_op_avx_3buff_min_float_avx2","ompi_op_avx_3buff_min_float_avx512","ompi_op_avx_3buff_min_int16_t_avx","ompi_op_avx_3buff_min_int16_t_avx2","ompi_op_avx_3buff_min_int16_t_avx512","ompi_op_avx_3buff_min_int32_t_avx","ompi_op_avx_3buff_min_int32_t_avx2","ompi_op_avx_3buff_min_int32_t_avx512","ompi_op_avx_3buff_min_int64_t_avx512","ompi_op_avx_3buff_min_int8_t_avx","ompi_op_avx_3buff_min_int8_t_avx2","ompi_op_avx_3buff_min_int8_t_avx512","ompi_op_avx_3buff_min_uint16_t_avx","ompi_op_avx_3buff_min_uint16_t_avx2","ompi_op_avx_3buff_min_uint16_t_avx512","ompi_op_avx_3buff_min_uint32_t_avx","ompi_op_avx_3buff_min_uint32_t_avx2","ompi_op_avx_3buff_min_uint32_t_avx512","ompi_op_avx_3buff_min_uint64_t_avx512","ompi_op_avx_3buff_min_uint8_t_avx","ompi_op_avx_3buff_min_uint8_t_avx2","ompi_op_avx_3buff_min_uint8_t_avx512","ompi_op_avx_3buff_mul_double_avx","ompi_op_avx_3buff_mul_double_avx2","ompi_op_avx_3buff_mul_double_avx512","ompi_op_avx_3buff_mul_float_avx","ompi_op_avx_3buff_mul_float_avx2","ompi_op_avx_3buff_mul_float_avx512","ompi_op_avx_3buff_or_int16_t_avx","ompi_op_avx_3buff_or_int16_t_avx2","ompi_op_avx_3buff_or_int16_t_avx512","ompi_op_avx_3buff_or_int32_t_avx","ompi_op_avx_3buff_or_int32_t_avx2","ompi_op_avx_3buff_or_int32_t_avx512","ompi_op_avx_3buff_or_int64_t_avx","ompi_op_avx_3buff_or_int64_t_avx2","ompi_op_avx_3buff_or_int64_t_avx512","ompi_op_avx_3buff_or_int8_t_avx","ompi_op_avx_3buff_or_int8_t_avx2","ompi_op_avx_3buff_or_int8_t_avx512","ompi_op_avx_3buff_or_uint16_t_avx","ompi_op_avx_3buff_or_uint16_t_avx2","ompi_op_avx_3buff_or_uint16_t_avx512","ompi_op_avx_3buff_or_uint32_t_avx","ompi_op_avx_3buff_or_uint32_t_avx2","ompi_op_avx_3buff_or_uint32_t_avx512","ompi_op_avx_3buff_or_uint64_t_avx","ompi_op_avx_3buff_or_uint64_t_avx2","ompi_op_avx_3buff_or_uint64_t_avx512","ompi_op_avx_3buff_or_uint8_t_avx","ompi_op_avx_3buff_or_uint8_t_avx2","ompi_op_avx_3buff_or_uint8_t_avx512","ompi_op_avx_3buff_prod_int16_t_avx","ompi_op_avx_3buff_prod_int16_t_avx2","ompi_op_avx_3buff_prod_int16_t_avx512","ompi_op_avx_3buff_prod_int32_t_avx","ompi_op_avx_3buff_prod_int32_t_avx2","ompi_op_avx_3buff_prod_int32_t_avx512","ompi_op_avx_3buff_prod_int64_t_avx512","ompi_op_avx_3buff_prod_int8_t_avx","ompi_op_avx_3buff_prod_int8_t_avx2","ompi_op_avx_3buff_prod_int8_t_avx512","ompi_op_avx_3buff_prod_uint16_t_avx","ompi_op_avx_3buff_prod_uint16_t_avx2","ompi_op_avx_3buff_prod_uint16_t_avx512","ompi_op_avx_3buff_prod_uint32_t_avx","ompi_op_avx_3buff_prod_uint32_t_avx2","ompi_op_avx_3buff_prod_uint32_t_avx512","ompi_op_avx_3buff_prod_uint64_t_avx512","ompi_op_avx_3buff_prod_uint8_t_avx","ompi_op_avx_3buff_prod_uint8_t_avx2","ompi_op_avx_3buff_prod_uint8_t_avx512","ompi_op_avx_3buff_sum_int16_t_avx","ompi_op_avx_3buff_sum_int16_t_avx2","ompi_op_avx_3buff_sum_int16_t_avx512","ompi_op_avx_3buff_sum_int32_t_avx","ompi_op_avx_3buff_sum_int32_t_avx2","ompi_op_avx_3buff_sum_int32_t_avx512","ompi_op_avx_3buff_sum_int64_t_avx","ompi_op_avx_3buff_sum_int64_t_avx2","ompi_op_avx_3buff_sum_int64_t_avx512","ompi_op_avx_3buff_sum_int8_t_avx","ompi_op_avx_3buff_sum_int8_t_avx2","ompi_op_avx_3buff_sum_int8_t_avx512","ompi_op_avx_3buff_sum_uint16_t_avx","ompi_op_avx_3buff_sum_uint16_t_avx2","ompi_op_avx_3buff_sum_uint16_t_avx512","ompi_op_avx_3buff_sum_uint32_t_avx","ompi_op_avx_3buff_sum_uint32_t_avx2","ompi_op_avx_3buff_sum_uint32_t_avx512","ompi_op_avx_3buff_sum_uint64_t_avx","ompi_op_avx_3buff_sum_uint64_t_avx2","ompi_op_avx_3buff_sum_uint64_t_avx512","ompi_op_avx_3buff_sum_uint8_t_avx","ompi_op_avx_3buff_sum_uint8_t_avx2","ompi_op_avx_3buff_sum_uint8_t_avx512","ompi_op_avx_3buff_xor_int16_t_avx","ompi_op_avx_3buff_xor_int16_t_avx2","ompi_op_avx_3buff_xor_int16_t_avx512","ompi_op_avx_3buff_xor_int32_t_avx","ompi_op_avx_3buff_xor_int32_t_avx2","ompi_op_avx_3buff_xor_int32_t_avx512","ompi_op_avx_3buff_xor_int64_t_avx","ompi_op_avx_3buff_xor_int64_t_avx2","ompi_op_avx_3buff_xor_int64_t_avx512","ompi_op_avx_3buff_xor_int8_t_avx","ompi_op_avx_3buff_xor_int8_t_avx2","ompi_op_avx_3buff_xor_int8_t_avx512","ompi_op_avx_3buff_xor_uint16_t_avx","ompi_op_avx_3buff_xor_uint16_t_avx2","ompi_op_avx_3buff_xor_uint16_t_avx512","ompi_op_avx_3buff_xor_uint32_t_avx","ompi_op_avx_3buff_xor_uint32_t_avx2","ompi_op_avx_3buff_xor_uint32_t_avx512","ompi_op_avx_3buff_xor_uint64_t_avx","ompi_op_avx_3buff_xor_uint64_t_avx2","ompi_op_avx_3buff_xor_uint64_t_avx512","ompi_op_avx_3buff_xor_uint8_t_avx","ompi_op_avx_3buff_xor_uint8_t_avx2","ompi_op_avx_3buff_xor_uint8_t_avx512","ompi_op_base_2buff_band_byte","ompi_op_base_2buff_band_fortran_integer","ompi_op_base_2buff_band_fortran_integer1","ompi_op_base_2buff_band_fortran_integer2","ompi_op_base_2buff_band_fortran_integer4","ompi_op_base_2buff_band_fortran_integer8","ompi_op_base_2buff_band_int16_t","ompi_op_base_2buff_band_int32_t","ompi_op_base_2buff_band_int64_t","ompi_op_base_2buff_band_int8_t","ompi_op_base_2buff_band_long","ompi_op_base_2buff_band_uint16_t","ompi_op_base_2buff_band_uint32_t","ompi_op_base_2buff_band_uint64_t","ompi_op_base_2buff_band_uint8_t","ompi_op_base_2buff_band_unsigned_long","ompi_op_base_2buff_bor_byte","ompi_op_base_2buff_bor_fortran_integer","ompi_op_base_2buff_bor_fortran_integer1","ompi_op_base_2buff_bor_fortran_integer2","ompi_op_base_2buff_bor_fortran_integer4","ompi_op_base_2buff_bor_fortran_integer8","ompi_op_base_2buff_bor_int16_t","ompi_op_base_2buff_bor_int32_t","ompi_op_base_2buff_bor_int64_t","ompi_op_base_2buff_bor_int8_t","ompi_op_base_2buff_bor_long","ompi_op_base_2buff_bor_uint16_t","ompi_op_base_2buff_bor_uint32_t","ompi_op_base_2buff_bor_uint64_t","ompi_op_base_2buff_bor_uint8_t","ompi_op_base_2buff_bor_unsigned_long","ompi_op_base_2buff_bxor_byte","ompi_op_base_2buff_bxor_fortran_integer","ompi_op_base_2buff_bxor_fortran_integer1","ompi_op_base_2buff_bxor_fortran_integer2","ompi_op_base_2buff_bxor_fortran_integer4","ompi_op_base_2buff_bxor_fortran_integer8","ompi_op_base_2buff_bxor_int16_t","ompi_op_base_2buff_bxor_int32_t","ompi_op_base_2buff_bxor_int64_t","ompi_op_base_2buff_bxor_int8_t","ompi_op_base_2buff_bxor_long","ompi_op_base_2buff_bxor_uint16_t","ompi_op_base_2buff_bxor_uint32_t","ompi_op_base_2buff_bxor_uint64_t","ompi_op_base_2buff_bxor_uint8_t","ompi_op_base_2buff_bxor_unsigned_long","ompi_op_base_2buff_land_bool","ompi_op_base_2buff_land_fortran_logical","ompi_op_base_2buff_land_int16_t","ompi_op_base_2buff_land_int32_t","ompi_op_base_2buff_land_int64_t","ompi_op_base_2buff_land_int8_t","ompi_op_base_2buff_land_long","ompi_op_base_2buff_land_uint16_t","ompi_op_base_2buff_land_uint32_t","ompi_op_base_2buff_land_uint64_t","ompi_op_base_2buff_land_uint8_t","ompi_op_base_2buff_land_unsigned_long","ompi_op_base_2buff_lor_bool","ompi_op_base_2buff_lor_fortran_logical","ompi_op_base_2buff_lor_int16_t","ompi_op_base_2buff_lor_int32_t","ompi_op_base_2buff_lor_int64_t","ompi_op_base_2buff_lor_int8_t","ompi_op_base_2buff_lor_long","ompi_op_base_2buff_lor_uint16_t","ompi_op_base_2buff_lor_uint32_t","ompi_op_base_2buff_lor_uint64_t","ompi_op_base_2buff_lor_uint8_t","ompi_op_base_2buff_lor_unsigned_long","ompi_op_base_2buff_lxor_bool","ompi_op_base_2buff_lxor_fortran_logical","ompi_op_base_2buff_lxor_int16_t","ompi_op_base_2buff_lxor_int32_t","ompi_op_base_2buff_lxor_int64_t","ompi_op_base_2buff_lxor_int8_t","ompi_op_base_2buff_lxor_long","ompi_op_base_2buff_lxor_uint16_t","ompi_op_base_2buff_lxor_uint32_t","ompi_op_base_2buff_lxor_uint64_t","ompi_op_base_2buff_lxor_uint8_t","ompi_op_base_2buff_lxor_unsigned_long","ompi_op_base_2buff_max_double","ompi_op_base_2buff_max_float","ompi_op_base_2buff_max_fortran_double_precision","ompi_op_base_2buff_max_fortran_integer","ompi_op_base_2buff_max_fortran_integer1","ompi_op_base_2buff_max_fortran_integer2","ompi_op_base_2buff_max_fortran_integer4","ompi_op_base_2buff_max_fortran_integer8","ompi_op_base_2buff_max_fortran_real","ompi_op_base_2buff_max_fortran_real16","ompi_op_base_2buff_max_fortran_real4","ompi_op_base_2buff_max_fortran_real8","ompi_op_base_2buff_max_int16_t","ompi_op_base_2buff_max_int32_t","ompi_op_base_2buff_max_int64_t","ompi_op_base_2buff_max_int8_t","ompi_op_base_2buff_max_long","ompi_op_base_2buff_max_long_double","ompi_op_base_2buff_max_uint16_t","ompi_op_base_2buff_max_uint32_t","ompi_op_base_2buff_max_uint64_t","ompi_op_base_2buff_max_uint8_t","ompi_op_base_2buff_max_unsigned_long","ompi_op_base_2buff_maxloc_2double_precision","ompi_op_base_2buff_maxloc_2int","ompi_op_base_2buff_maxloc_2integer","ompi_op_base_2buff_maxloc_2real","ompi_op_base_2buff_maxloc_double_int","ompi_op_base_2buff_maxloc_float_int","ompi_op_base_2buff_maxloc_long_double_int","ompi_op_base_2buff_maxloc_long_int","ompi_op_base_2buff_maxloc_short_int","ompi_op_base_2buff_min_double","ompi_op_base_2buff_min_float","ompi_op_base_2buff_min_fortran_double_precision","ompi_op_base_2buff_min_fortran_integer","ompi_op_base_2buff_min_fortran_integer1","ompi_op_base_2buff_min_fortran_integer2","ompi_op_base_2buff_min_fortran_integer4","ompi_op_base_2buff_min_fortran_integer8","ompi_op_base_2buff_min_fortran_real","ompi_op_base_2buff_min_fortran_real16","ompi_op_base_2buff_min_fortran_real4","ompi_op_base_2buff_min_fortran_real8","ompi_op_base_2buff_min_int16_t","ompi_op_base_2buff_min_int32_t","ompi_op_base_2buff_min_int64_t","ompi_op_base_2buff_min_int8_t","ompi_op_base_2buff_min_long","ompi_op_base_2buff_min_long_double","ompi_op_base_2buff_min_uint16_t","ompi_op_base_2buff_min_uint32_t","ompi_op_base_2buff_min_uint64_t","ompi_op_base_2buff_min_uint8_t","ompi_op_base_2buff_min_unsigned_long","ompi_op_base_2buff_minloc_2double_precision","ompi_op_base_2buff_minloc_2int","ompi_op_base_2buff_minloc_2integer","ompi_op_base_2buff_minloc_2real","ompi_op_base_2buff_minloc_double_int","ompi_op_base_2buff_minloc_float_int","ompi_op_base_2buff_minloc_long_double_int","ompi_op_base_2buff_minloc_long_int","ompi_op_base_2buff_minloc_short_int","ompi_op_base_2buff_prod_c_double_complex","ompi_op_base_2buff_prod_c_float_complex","ompi_op_base_2buff_prod_c_long_double_complex","ompi_op_base_2buff_prod_double","ompi_op_base_2buff_prod_float","ompi_op_base_2buff_prod_fortran_double_precision","ompi_op_base_2buff_prod_fortran_integer","ompi_op_base_2buff_prod_fortran_integer1","ompi_op_base_2buff_prod_fortran_integer2","ompi_op_base_2buff_prod_fortran_integer4","ompi_op_base_2buff_prod_fortran_integer8","ompi_op_base_2buff_prod_fortran_real","ompi_op_base_2buff_prod_fortran_real16","ompi_op_base_2buff_prod_fortran_real4","ompi_op_base_2buff_prod_fortran_real8","ompi_op_base_2buff_prod_int16_t","ompi_op_base_2buff_prod_int32_t","ompi_op_base_2buff_prod_int64_t","ompi_op_base_2buff_prod_int8_t","ompi_op_base_2buff_prod_long","ompi_op_base_2buff_prod_long_double","ompi_op_base_2buff_prod_uint16_t","ompi_op_base_2buff_prod_uint32_t","ompi_op_base_2buff_prod_uint64_t","ompi_op_base_2buff_prod_uint8_t","ompi_op_base_2buff_prod_unsigned_long","ompi_op_base_2buff_sum_c_double_complex","ompi_op_base_2buff_sum_c_float_complex","ompi_op_base_2buff_sum_c_long_double_complex","ompi_op_base_2buff_sum_double","ompi_op_base_2buff_sum_float","ompi_op_base_2buff_sum_fortran_double_precision","ompi_op_base_2buff_sum_fortran_integer","ompi_op_base_2buff_sum_fortran_integer1","ompi_op_base_2buff_sum_fortran_integer2","ompi_op_base_2buff_sum_fortran_integer4","ompi_op_base_2buff_sum_fortran_integer8","ompi_op_base_2buff_sum_fortran_real","ompi_op_base_2buff_sum_fortran_real16","ompi_op_base_2buff_sum_fortran_real4","ompi_op_base_2buff_sum_fortran_real8","ompi_op_base_2buff_sum_int16_t","ompi_op_base_2buff_sum_int32_t","ompi_op_base_2buff_sum_int64_t","ompi_op_base_2buff_sum_int8_t","ompi_op_base_2buff_sum_long","ompi_op_base_2buff_sum_long_double","ompi_op_base_2buff_sum_uint16_t","ompi_op_base_2buff_sum_uint32_t","ompi_op_base_2buff_sum_uint64_t","ompi_op_base_2buff_sum_uint8_t","ompi_op_base_2buff_sum_unsigned_long","ompi_op_base_3buff_band_byte","ompi_op_base_3buff_band_fortran_integer","ompi_op_base_3buff_band_fortran_integer1","ompi_op_base_3buff_band_fortran_integer2","ompi_op_base_3buff_band_fortran_integer4","ompi_op_base_3buff_band_fortran_integer8","ompi_op_base_3buff_band_int16_t","ompi_op_base_3buff_band_int32_t","ompi_op_base_3buff_band_int64_t","ompi_op_base_3buff_band_int8_t","ompi_op_base_3buff_band_long","ompi_op_base_3buff_band_uint16_t","ompi_op_base_3buff_band_uint32_t","ompi_op_base_3buff_band_uint64_t","ompi_op_base_3buff_band_uint8_t","ompi_op_base_3buff_band_unsigned_long","ompi_op_base_3buff_bor_byte","ompi_op_base_3buff_bor_fortran_integer","ompi_op_base_3buff_bor_fortran_integer1","ompi_op_base_3buff_bor_fortran_integer2","ompi_op_base_3buff_bor_fortran_integer4","ompi_op_base_3buff_bor_fortran_integer8","ompi_op_base_3buff_bor_int16_t","ompi_op_base_3buff_bor_int32_t","ompi_op_base_3buff_bor_int64_t","ompi_op_base_3buff_bor_int8_t","ompi_op_base_3buff_bor_long","ompi_op_base_3buff_bor_uint16_t","ompi_op_base_3buff_bor_uint32_t","ompi_op_base_3buff_bor_uint64_t","ompi_op_base_3buff_bor_uint8_t","ompi_op_base_3buff_bor_unsigned_long","ompi_op_base_3buff_bxor_byte","ompi_op_base_3buff_bxor_fortran_integer","ompi_op_base_3buff_bxor_fortran_integer1","ompi_op_base_3buff_bxor_fortran_integer2","ompi_op_base_3buff_bxor_fortran_integer4","ompi_op_base_3buff_bxor_fortran_integer8","ompi_op_base_3buff_bxor_int16_t","ompi_op_base_3buff_bxor_int32_t","ompi_op_base_3buff_bxor_int64_t","ompi_op_base_3buff_bxor_int8_t","ompi_op_base_3buff_bxor_long","ompi_op_base_3buff_bxor_uint16_t","ompi_op_base_3buff_bxor_uint32_t","ompi_op_base_3buff_bxor_uint64_t","ompi_op_base_3buff_bxor_uint8_t","ompi_op_base_3buff_bxor_unsigned_long","ompi_op_base_3buff_land_bool","ompi_op_base_3buff_land_fortran_logical","ompi_op_base_3buff_land_int16_t","ompi_op_base_3buff_land_int32_t","ompi_op_base_3buff_land_int64_t","ompi_op_base_3buff_land_int8_t","ompi_op_base_3buff_land_long","ompi_op_base_3buff_land_uint16_t","ompi_op_base_3buff_land_uint32_t","ompi_op_base_3buff_land_uint64_t","ompi_op_base_3buff_land_uint8_t","ompi_op_base_3buff_land_unsigned_long","ompi_op_base_3buff_lor_bool","ompi_op_base_3buff_lor_fortran_logical","ompi_op_base_3buff_lor_int16_t","ompi_op_base_3buff_lor_int32_t","ompi_op_base_3buff_lor_int64_t","ompi_op_base_3buff_lor_int8_t","ompi_op_base_3buff_lor_long","ompi_op_base_3buff_lor_uint16_t","ompi_op_base_3buff_lor_uint32_t","ompi_op_base_3buff_lor_uint64_t","ompi_op_base_3buff_lor_uint8_t","ompi_op_base_3buff_lor_unsigned_long","ompi_op_base_3buff_lxor_bool","ompi_op_base_3buff_lxor_fortran_logical","ompi_op_base_3buff_lxor_int16_t","ompi_op_base_3buff_lxor_int32_t","ompi_op_base_3buff_lxor_int64_t","ompi_op_base_3buff_lxor_int8_t","ompi_op_base_3buff_lxor_long","ompi_op_base_3buff_lxor_uint16_t","ompi_op_base_3buff_lxor_uint32_t","ompi_op_base_3buff_lxor_uint64_t","ompi_op_base_3buff_lxor_uint8_t","ompi_op_base_3buff_lxor_unsigned_long","ompi_op_base_3buff_max_double","ompi_op_base_3buff_max_float","ompi_op_base_3buff_max_fortran_double_precision","ompi_op_base_3buff_max_fortran_integer","ompi_op_base_3buff_max_fortran_integer1","ompi_op_base_3buff_max_fortran_integer2","ompi_op_base_3buff_max_fortran_integer4","ompi_op_base_3buff_max_fortran_integer8","ompi_op_base_3buff_max_fortran_real","ompi_op_base_3buff_max_fortran_real16","ompi_op_base_3buff_max_fortran_real4","ompi_op_base_3buff_max_fortran_real8","ompi_op_base_3buff_max_int16_t","ompi_op_base_3buff_max_int32_t","ompi_op_base_3buff_max_int64_t","ompi_op_base_3buff_max_int8_t","ompi_op_base_3buff_max_long","ompi_op_base_3buff_max_long_double","ompi_op_base_3buff_max_uint16_t","ompi_op_base_3buff_max_uint32_t","ompi_op_base_3buff_max_uint64_t","ompi_op_base_3buff_max_uint8_t","ompi_op_base_3buff_max_unsigned_long","ompi_op_base_3buff_maxloc_2double_precision","ompi_op_base_3buff_maxloc_2int","ompi_op_base_3buff_maxloc_2integer","ompi_op_base_3buff_maxloc_2real","ompi_op_base_3buff_maxloc_double_int","ompi_op_base_3buff_maxloc_float_int","ompi_op_base_3buff_maxloc_long_double_int","ompi_op_base_3buff_maxloc_long_int","ompi_op_base_3buff_maxloc_short_int","ompi_op_base_3buff_min_double","ompi_op_base_3buff_min_float","ompi_op_base_3buff_min_fortran_double_precision","ompi_op_base_3buff_min_fortran_integer","ompi_op_base_3buff_min_fortran_integer1","ompi_op_base_3buff_min_fortran_integer2","ompi_op_base_3buff_min_fortran_integer4","ompi_op_base_3buff_min_fortran_integer8","ompi_op_base_3buff_min_fortran_real","ompi_op_base_3buff_min_fortran_real16","ompi_op_base_3buff_min_fortran_real4","ompi_op_base_3buff_min_fortran_real8","ompi_op_base_3buff_min_int16_t","ompi_op_base_3buff_min_int32_t","ompi_op_base_3buff_min_int64_t","ompi_op_base_3buff_min_int8_t","ompi_op_base_3buff_min_long","ompi_op_base_3buff_min_long_double","ompi_op_base_3buff_min_uint16_t","ompi_op_base_3buff_min_uint32_t","ompi_op_base_3buff_min_uint64_t","ompi_op_base_3buff_min_uint8_t","ompi_op_base_3buff_min_unsigned_long","ompi_op_base_3buff_minloc_2double_precision","ompi_op_base_3buff_minloc_2int","ompi_op_base_3buff_minloc_2integer","ompi_op_base_3buff_minloc_2real","ompi_op_base_3buff_minloc_double_int","ompi_op_base_3buff_minloc_float_int","ompi_op_base_3buff_minloc_long_double_int","ompi_op_base_3buff_minloc_long_int","ompi_op_base_3buff_minloc_short_int","ompi_op_base_3buff_prod_c_double_complex","ompi_op_base_3buff_prod_c_float_complex","ompi_op_base_3buff_prod_c_long_double_complex","ompi_op_base_3buff_prod_double","ompi_op_base_3buff_prod_float","ompi_op_base_3buff_prod_fortran_double_precision","ompi_op_base_3buff_prod_fortran_integer","ompi_op_base_3buff_prod_fortran_integer1","ompi_op_base_3buff_prod_fortran_integer2","ompi_op_base_3buff_prod_fortran_integer4","ompi_op_base_3buff_prod_fortran_integer8","ompi_op_base_3buff_prod_fortran_real","ompi_op_base_3buff_prod_fortran_real16","ompi_op_base_3buff_prod_fortran_real4","ompi_op_base_3buff_prod_fortran_real8","ompi_op_base_3buff_prod_int16_t","ompi_op_base_3buff_prod_int32_t","ompi_op_base_3buff_prod_int64_t","ompi_op_base_3buff_prod_int8_t","ompi_op_base_3buff_prod_long","ompi_op_base_3buff_prod_long_double","ompi_op_base_3buff_prod_uint16_t","ompi_op_base_3buff_prod_uint32_t","ompi_op_base_3buff_prod_uint64_t","ompi_op_base_3buff_prod_uint8_t","ompi_op_base_3buff_prod_unsigned_long","ompi_op_base_3buff_sum_c_double_complex","ompi_op_base_3buff_sum_c_float_complex","ompi_op_base_3buff_sum_c_long_double_complex","ompi_op_base_3buff_sum_double","ompi_op_base_3buff_sum_float","ompi_op_base_3buff_sum_fortran_double_precision","ompi_op_base_3buff_sum_fortran_integer","ompi_op_base_3buff_sum_fortran_integer1","ompi_op_base_3buff_sum_fortran_integer2","ompi_op_base_3buff_sum_fortran_integer4","ompi_op_base_3buff_sum_fortran_integer8","ompi_op_base_3buff_sum_fortran_real","ompi_op_base_3buff_sum_fortran_real16","ompi_op_base_3buff_sum_fortran_real4","ompi_op_base_3buff_sum_fortran_real8","ompi_op_base_3buff_sum_int16_t","ompi_op_base_3buff_sum_int32_t","ompi_op_base_3buff_sum_int64_t","ompi_op_base_3buff_sum_int8_t","ompi_op_base_3buff_sum_long","ompi_op_base_3buff_sum_long_double","ompi_op_base_3buff_sum_uint16_t","ompi_op_base_3buff_sum_uint32_t","ompi_op_base_3buff_sum_uint64_t","ompi_op_base_3buff_sum_uint8_t","ompi_op_base_3buff_sum_unsigned_long","ompi_op_base_find_available","ompi_op_base_op_select","ompi_op_construct","ompi_op_create_user","ompi_op_destruct","ompi_op_finalize","ompi_op_init","ompi_op_reduce:0x103bf0","ompi_op_reduce:0x105a40","ompi_op_reduce:0x109a40","ompi_op_reduce:0x11a690","ompi_op_reduce:0x11d440","ompi_op_reduce:0x128cd0","ompi_op_reduce:0x153a70","ompi_op_reduce:0x15a800","ompi_op_reduce:0x15ce80","ompi_op_reduce:0x15ed30","ompi_op_reduce:0x1642a0","ompi_op_reduce:0x1c2ff0","ompi_op_reduce:0x1ce8e0","ompi_op_reduce:0x1e8750","ompi_op_reduce:0x5eb80","ompi_op_reduce:0xef780","ompi_op_reduce:0xf6ab0","ompi_op_reduce:0xfc2b0","ompi_op_reduce:0xff940","ompi_op_set_java_callback","ompi_osc_base_finalize","ompi_osc_base_find_available","ompi_osc_base_get_primitive_type_info","ompi_osc_base_process_op","ompi_osc_base_select","ompi_osc_base_set_memory_alignment","ompi_osc_base_sndrcv_op","ompi_osc_get_data_blocking","ompi_osc_get_data_complete","ompi_osc_module_add_peer","ompi_osc_monitoring_portals4_accumulate","ompi_osc_monitoring_portals4_attach","ompi_osc_monitoring_portals4_compare_and_swap","ompi_osc_monitoring_portals4_complete","ompi_osc_monitoring_portals4_detach","ompi_osc_monitoring_portals4_fence","ompi_osc_monitoring_portals4_fetch_and_op","ompi_osc_monitoring_portals4_flush","ompi_osc_monitoring_portals4_flush_all","ompi_osc_monitoring_portals4_flush_local","ompi_osc_monitoring_portals4_flush_local_all","ompi_osc_monitoring_portals4_free","ompi_osc_monitoring_portals4_get","ompi_osc_monitoring_portals4_get_accumulate","ompi_osc_monitoring_portals4_lock","ompi_osc_monitoring_portals4_lock_all","ompi_osc_monitoring_portals4_post","ompi_osc_monitoring_portals4_put","ompi_osc_monitoring_portals4_raccumulate","ompi_osc_monitoring_portals4_rget","ompi_osc_monitoring_portals4_rget_accumulate","ompi_osc_monitoring_portals4_rput","ompi_osc_monitoring_portals4_set_template","ompi_osc_monitoring_portals4_start","ompi_osc_monitoring_portals4_sync","ompi_osc_monitoring_portals4_test","ompi_osc_monitoring_portals4_unlock","ompi_osc_monitoring_portals4_unlock_all","ompi_osc_monitoring_portals4_wait","ompi_osc_monitoring_rdma_accumulate","ompi_osc_monitoring_rdma_attach","ompi_osc_monitoring_rdma_compare_and_swap","ompi_osc_monitoring_rdma_complete","ompi_osc_monitoring_rdma_detach","ompi_osc_monitoring_rdma_fence","ompi_osc_monitoring_rdma_fetch_and_op","ompi_osc_monitoring_rdma_flush","ompi_osc_monitoring_rdma_flush_all","ompi_osc_monitoring_rdma_flush_local","ompi_osc_monitoring_rdma_flush_local_all","ompi_osc_monitoring_rdma_free","ompi_osc_monitoring_rdma_get","ompi_osc_monitoring_rdma_get_accumulate","ompi_osc_monitoring_rdma_lock","ompi_osc_monitoring_rdma_lock_all","ompi_osc_monitoring_rdma_post","ompi_osc_monitoring_rdma_put","ompi_osc_monitoring_rdma_raccumulate","ompi_osc_monitoring_rdma_rget","ompi_osc_monitoring_rdma_rget_accumulate","ompi_osc_monitoring_rdma_rput","ompi_osc_monitoring_rdma_set_template","ompi_osc_monitoring_rdma_start","ompi_osc_monitoring_rdma_sync","ompi_osc_monitoring_rdma_test","ompi_osc_monitoring_rdma_unlock","ompi_osc_monitoring_rdma_unlock_all","ompi_osc_monitoring_rdma_wait","ompi_osc_monitoring_sm_accumulate","ompi_osc_monitoring_sm_attach","ompi_osc_monitoring_sm_compare_and_swap","ompi_osc_monitoring_sm_complete","ompi_osc_monitoring_sm_detach","ompi_osc_monitoring_sm_fence","ompi_osc_monitoring_sm_fetch_and_op","ompi_osc_monitoring_sm_flush","ompi_osc_monitoring_sm_flush_all","ompi_osc_monitoring_sm_flush_local","ompi_osc_monitoring_sm_flush_local_all","ompi_osc_monitoring_sm_free","ompi_osc_monitoring_sm_get","ompi_osc_monitoring_sm_get_accumulate","ompi_osc_monitoring_sm_lock","ompi_osc_monitoring_sm_lock_all","ompi_osc_monitoring_sm_post","ompi_osc_monitoring_sm_put","ompi_osc_monitoring_sm_raccumulate","ompi_osc_monitoring_sm_rget","ompi_osc_monitoring_sm_rget_accumulate","ompi_osc_monitoring_sm_rput","ompi_osc_monitoring_sm_set_template","ompi_osc_monitoring_sm_start","ompi_osc_monitoring_sm_sync","ompi_osc_monitoring_sm_test","ompi_osc_monitoring_sm_unlock","ompi_osc_monitoring_sm_unlock_all","ompi_osc_monitoring_sm_wait","ompi_osc_monitoring_ucx_accumulate","ompi_osc_monitoring_ucx_attach","ompi_osc_monitoring_ucx_compare_and_swap","ompi_osc_monitoring_ucx_complete","ompi_osc_monitoring_ucx_detach","ompi_osc_monitoring_ucx_fence","ompi_osc_monitoring_ucx_fetch_and_op","ompi_osc_monitoring_ucx_flush","ompi_osc_monitoring_ucx_flush_all","ompi_osc_monitoring_ucx_flush_local","ompi_osc_monitoring_ucx_flush_local_all","ompi_osc_monitoring_ucx_free","ompi_osc_monitoring_ucx_get","ompi_osc_monitoring_ucx_get_accumulate","ompi_osc_monitoring_ucx_lock","ompi_osc_monitoring_ucx_lock_all","ompi_osc_monitoring_ucx_post","ompi_osc_monitoring_ucx_put","ompi_osc_monitoring_ucx_raccumulate","ompi_osc_monitoring_ucx_rget","ompi_osc_monitoring_ucx_rget_accumulate","ompi_osc_monitoring_ucx_rput","ompi_osc_monitoring_ucx_set_template","ompi_osc_monitoring_ucx_start","ompi_osc_monitoring_ucx_sync","ompi_osc_monitoring_ucx_test","ompi_osc_monitoring_ucx_unlock","ompi_osc_monitoring_ucx_unlock_all","ompi_osc_monitoring_ucx_wait","ompi_osc_rdma_accumulate","ompi_osc_rdma_add_attachment","ompi_osc_rdma_atomic_complete","ompi_osc_rdma_attach","ompi_osc_rdma_btl_op.constprop.0","ompi_osc_rdma_cas_put_complete","ompi_osc_rdma_check_posts","ompi_osc_rdma_compare_and_swap","ompi_osc_rdma_compare_and_swap.cold","ompi_osc_rdma_complete_atomic","ompi_osc_rdma_component_finalize","ompi_osc_rdma_component_init","ompi_osc_rdma_component_query","ompi_osc_rdma_component_register","ompi_osc_rdma_component_select","ompi_osc_rdma_demand_lock_peer","ompi_osc_rdma_detach","ompi_osc_rdma_fence_atomic","ompi_osc_rdma_fetch_and_op","ompi_osc_rdma_find_dynamic_region","ompi_osc_rdma_flush","ompi_osc_rdma_flush_all","ompi_osc_rdma_flush_local","ompi_osc_rdma_flush_local_all","ompi_osc_rdma_frag_alloc","ompi_osc_rdma_frag_alloc.constprop.0:0x1dafc0","ompi_osc_rdma_frag_alloc.constprop.0:0x1dd090","ompi_osc_rdma_frag_alloc.constprop.0:0x1e0770","ompi_osc_rdma_free","ompi_osc_rdma_gacc_amo.constprop.0","ompi_osc_rdma_gacc_master","ompi_osc_rdma_gacc_master_cleanup","ompi_osc_rdma_gacc_master_cleanup.cold","ompi_osc_rdma_get","ompi_osc_rdma_get_accumulate","ompi_osc_rdma_get_complete","ompi_osc_rdma_get_contig","ompi_osc_rdma_get_partial","ompi_osc_rdma_get_peers","ompi_osc_rdma_handle_fini","ompi_osc_rdma_handle_init","ompi_osc_rdma_initialize_region.isra.0","ompi_osc_rdma_lock_all_atomic","ompi_osc_rdma_lock_atomic","ompi_osc_rdma_lock_atomic_internal","ompi_osc_rdma_lock_release_exclusive.constprop.0.isra.0","ompi_osc_rdma_lock_release_exclusive.constprop.0.isra.0.cold","ompi_osc_rdma_master_noncontig","ompi_osc_rdma_new_peer","ompi_osc_rdma_new_peer.cold","ompi_osc_rdma_peer_accumulate_cleanup","ompi_osc_rdma_peer_accumulate_cleanup.cold","ompi_osc_rdma_peer_basic_construct","ompi_osc_rdma_peer_basic_destruct","ompi_osc_rdma_peer_btl_endpoint","ompi_osc_rdma_peer_construct","ompi_osc_rdma_peer_destruct","ompi_osc_rdma_peer_dynamic_construct","ompi_osc_rdma_peer_dynamic_destruct","ompi_osc_rdma_peer_lookup","ompi_osc_rdma_peer_setup","ompi_osc_rdma_pending_op_construct","ompi_osc_rdma_pending_op_destruct","ompi_osc_rdma_post_atomic","ompi_osc_rdma_put","ompi_osc_rdma_put_complete","ompi_osc_rdma_put_complete_flush","ompi_osc_rdma_put_contig","ompi_osc_rdma_pvar_read","ompi_osc_rdma_raccumulate","ompi_osc_rdma_release_peers","ompi_osc_rdma_request_complete:0x1c62b0","ompi_osc_rdma_request_complete:0x1cee10","ompi_osc_rdma_rget","ompi_osc_rdma_rget_accumulate","ompi_osc_rdma_rget_accumulate_internal","ompi_osc_rdma_rget_accumulate_internal.cold","ompi_osc_rdma_rput","ompi_osc_rdma_set_no_lock_info","ompi_osc_rdma_start_atomic","ompi_osc_rdma_sync","ompi_osc_rdma_sync_allocate","ompi_osc_rdma_sync_constructor","ompi_osc_rdma_sync_destructor","ompi_osc_rdma_sync_pscw_peer","ompi_osc_rdma_sync_return","ompi_osc_rdma_test_atomic","ompi_osc_rdma_unlock_all_atomic","ompi_osc_rdma_unlock_all_atomic.cold","ompi_osc_rdma_unlock_atomic","ompi_osc_rdma_unlock_atomic.cold","ompi_osc_rdma_wait_atomic","ompi_osc_sm_accumulate","ompi_osc_sm_attach","ompi_osc_sm_compare_and_swap","ompi_osc_sm_complete","ompi_osc_sm_detach","ompi_osc_sm_fence","ompi_osc_sm_fetch_and_op","ompi_osc_sm_flush","ompi_osc_sm_flush_all","ompi_osc_sm_flush_local","ompi_osc_sm_flush_local_all","ompi_osc_sm_free","ompi_osc_sm_get","ompi_osc_sm_get_accumulate","ompi_osc_sm_get_info","ompi_osc_sm_group_ranks","ompi_osc_sm_lock","ompi_osc_sm_lock_all","ompi_osc_sm_post","ompi_osc_sm_put","ompi_osc_sm_raccumulate","ompi_osc_sm_rget","ompi_osc_sm_rget_accumulate","ompi_osc_sm_rput","ompi_osc_sm_set_info","ompi_osc_sm_shared_query","ompi_osc_sm_start","ompi_osc_sm_sync","ompi_osc_sm_test","ompi_osc_sm_unlock","ompi_osc_sm_unlock_all","ompi_osc_sm_wait","ompi_pmix_print_id","ompi_pmix_print_name","ompi_pmix_snprintf_jobid","ompi_pml_ob1_append_frag_to_ordered_list","ompi_pml_ob1_check_cantmatch_for_match","ompi_pml_v_output_close","ompi_pml_v_output_open","ompi_proc_all","ompi_proc_allocate","ompi_proc_compare_vid","ompi_proc_complete_init","ompi_proc_complete_init_single","ompi_proc_construct","ompi_proc_destruct","ompi_proc_finalize","ompi_proc_find","ompi_proc_find_and_add","ompi_proc_for_name","ompi_proc_get_allocated","ompi_proc_init","ompi_proc_lookup","ompi_proc_pack","ompi_proc_refresh","ompi_proc_self","ompi_proc_unpack","ompi_proc_world","ompi_proc_world_size","ompi_rbcast_bml_send_complete_cb","ompi_report_comm_methods","ompi_request_check_same_instance","ompi_request_construct","ompi_request_default_test","ompi_request_default_test_all","ompi_request_default_test_any","ompi_request_default_test_some","ompi_request_default_wait","ompi_request_default_wait_all","ompi_request_default_wait_any","ompi_request_default_wait_some","ompi_request_destruct","ompi_request_empty_free","ompi_request_finalize","ompi_request_init","ompi_request_is_failed_fn","ompi_request_null_cancel","ompi_request_null_free","ompi_request_persistent_noop_create","ompi_request_persistent_noop_free","ompi_request_wait_completion:0x1f3e20","ompi_request_wait_completion:0x1f56c0","ompi_request_wait_completion:0x1f7c70","ompi_request_wait_completion:0x212b80","ompi_request_wait_completion:0x5d7f0","ompi_rounddown","ompi_rte_abort","ompi_rte_abort_peers","ompi_rte_breakpoint","ompi_rte_compare_name_fields","ompi_rte_convert_process_name_to_string","ompi_rte_convert_string_to_process_name","ompi_rte_finalize","ompi_rte_init","ompi_rte_wait_for_debugger","ompi_seq_tracker_check_duplicate","ompi_seq_tracker_construct","ompi_seq_tracker_copy","ompi_seq_tracker_destruct","ompi_seq_tracker_insert","ompi_set_group_rank","ompi_show_all_mca_params","ompi_test_fortran_constants","ompi_test_fortran_constants_","ompi_test_fortran_constants__","ompi_test_fortran_constants_f","ompi_type_dup_fn_f","ompi_type_null_copy_fn_f","ompi_type_null_delete_fn_f","ompi_vprotocol_pessimist_delivery_replay","ompi_vprotocol_pessimist_event_logger_connect","ompi_vprotocol_pessimist_event_logger_connect.cold","ompi_vprotocol_pessimist_event_logger_disconnect","ompi_vprotocol_pessimist_matching_replay","ompi_vprotocol_pessimist_sender_based_alloc","ompi_vprotocol_pessimist_sender_based_finalize","ompi_vprotocol_pessimist_sender_based_init","ompi_win_allocate","ompi_win_allocate_shared","ompi_win_construct","ompi_win_create","ompi_win_create_dynamic","ompi_win_destruct","ompi_win_dup_fn_f","ompi_win_finalize","ompi_win_free","ompi_win_get_name","ompi_win_group","ompi_win_init","ompi_win_null_copy_fn_f","ompi_win_null_delete_fn_f","ompi_win_set_name","ompit_opal_to_mpit_error","ompit_var_type_to_datatype","opal_free_list_wait","opal_free_list_wait.constprop.0:0x1f8730","opal_free_list_wait.constprop.0:0x1fbad0","open_component","optimize_arity","partial_aggregate_aff_mat","partial_exhaustive_search","partial_update_val","rankkeycompare","recurs_select_independent_groups","recv_cb:0x1613b0","recv_cb:0x1647d0","recv_request_pml_complete","reduce_inorder","register_component:0x1686b0","register_component:0x175430","register_component:0x17baa0","register_datarep","register_tm_clones","release_objs_callback","release_vecs_callback","request_cancel:0x127800","request_cancel:0x1da890","request_construct:0x127810","request_construct:0x1da8a0","request_free:0x127b50","request_free:0x1da910","request_start","result_request","retreive_size","retreive_size.cold","save_ptr","select_independent_groups","self_register","send_cb:0x160b60","send_cb:0x163f50","send_msg","send_msg.cold","send_request_pml_complete","set_handler_default","set_value","shuffle_init.constprop.0:0x16bb70","shuffle_init.constprop.0:0x16f180","sm_close","sm_module_enable","sm_register:0x108080","sm_register:0x215be0","sync_register","tab_cmp","tgt_to_tm","thread_loop","tm_bucket_grouping","tm_build_affinity_mat","tm_build_synthetic_topology","tm_build_tree_from_topology","tm_calloc","tm_close_verbose_file","tm_complete_obj_weight","tm_compute_mapping","tm_compute_nb_leaves_from_level","tm_create_work","tm_destroy_work","tm_display_arity","tm_display_other_heuristics","tm_display_solution","tm_display_tab","tm_display_topology","tm_enable_oversubscribing","tm_fiboTreeDel","tm_fiboTreeExit","tm_fiboTreeFree","tm_fiboTreeInit","tm_fiboTreeMin","tm_fill_tab","tm_finalize","tm_free","tm_free_affinity_mat","tm_free_solution","tm_free_topology","tm_free_tree","tm_genrand_int31","tm_genrand_int32","tm_genrand_real1","tm_genrand_real2","tm_genrand_real3","tm_genrand_res53","tm_get_exhaustive_search_flag","tm_get_greedy_flag","tm_get_local_topology_with_hwloc","tm_get_local_topology_with_hwloc.cold","tm_get_nb_threads","tm_get_numbering","tm_get_time","tm_get_verbose_level","tm_get_verbose_output","tm_in_tab","tm_init_genrand","tm_intCIV_get","tm_intCIV_init","tm_intCIV_isInitialized","tm_intCIV_set","tm_int_cmp_inc","tm_kPartitioning","tm_kpartition","tm_kpartition.cold","tm_kpartition_build_tree_from_topology","tm_load_aff_mat","tm_load_topology","tm_load_topology.cold","tm_malloc","tm_map_MPIPP","tm_map_Packed","tm_map_RR","tm_map_topology","tm_mem_check","tm_nb_processing_units","tm_new_affinity_mat","tm_open_verbose_file","tm_optimize_topology","tm_print_1D_tab","tm_realloc","tm_set_exhaustive_search_flag","tm_set_greedy_flag","tm_set_max_nb_threads","tm_set_node","tm_set_numbering","tm_set_verbose_level","tm_submit_work","tm_terminate_thread_pool","tm_test_main","tm_time_diff","tm_topology_add_binding_constraints","tm_topology_set_binding_constraints","tm_try_add_edge","tm_update_val","tm_wait_work_completion","treematch_module_constructor","treematch_module_destructor","tuned_close","tuned_module_enable","tuned_open","tuned_register","vprotocol_pessimist_delivery_log","vprotocol_pessimist_request_construct","vprotocol_pessimist_request_no_free","vulcan_register","weighted_degree_dsc","write_init","write_init.constprop.0"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/openmpi-5.0.7-y6xplmqxukxsuvvwnv2jqvztli5rhevm/lib/libmpi.so.40","include_offsets":false},{"type":2,"name":"ior","functions":["AllocResults","CheckFileSize","CheckForOutliers","CheckRunSettings","CompareBuffers","CountErrors","CreateTest","CurrentTimeString","DUMMY_Close","DUMMY_Create","DUMMY_Delete","DUMMY_Fsync","DUMMY_GetFileSize","DUMMY_Open","DUMMY_Sync","DUMMY_Xfer","DUMMY_access","DUMMY_check_params","DUMMY_getVersion","DUMMY_mkdir","DUMMY_options","DUMMY_rmdir","DUMMY_stat","DUMMY_statfs","DecodeDirective","DelaySecs","DestroyTest","DestroyTests","DisplayFreespace","DisplayOutliers","DistributeHints","DumpBuffer","ExtractHint","FailMessage","FillBuffer","FillIncompressibleBuffer","FreeResults","GetNumNodes","GetNumTasks","GetNumTasksOnNode0","GetOffsetArrayRandom","GetOffsetArraySequential","GetPlatformName","GetTestFileName","GetTimeStamp","HDF5_Access","HDF5_Close","HDF5_Create","HDF5_Delete","HDF5_Fsync","HDF5_GetFileSize","HDF5_GetVersion","HDF5_Open","HDF5_Xfer","HDF5_options","HogMemory","HumanReadable","InitTests","MMAP_Close","MMAP_Create","MMAP_Fsync","MMAP_Open","MMAP_Xfer","MMAP_options","MPIIO_Access","MPIIO_Close","MPIIO_Create","MPIIO_Delete","MPIIO_Fsync","MPIIO_GetFileSize","MPIIO_GetVersion","MPIIO_Open","MPIIO_Xfer","NodeMemoryStringToBytes","POSIX_Close","POSIX_Create","POSIX_Delete","POSIX_Fsync","POSIX_GetFileSize","POSIX_Mknod","POSIX_Open","POSIX_Sync","POSIX_Xfer","POSIX_options","PPDouble","ParseCommandLine","ParseFileName","ParseLine","PrependDir","PrintArrayEnd","PrintArrayNamedStart","PrintArrayStart","PrintEndSection","PrintHeader","PrintIndent","PrintKeyVal","PrintKeyValDouble","PrintKeyValEnd","PrintKeyValInt","PrintKeyValStart","PrintLongSummaryAllTests","PrintLongSummaryHeader","PrintLongSummaryOneOperation","PrintLongSummaryOneTest","PrintNamedArrayStart","PrintNamedSectionStart","PrintNextToken","PrintReducedResult","PrintRemoveTiming","PrintRepeatEnd","PrintRepeatStart","PrintShortSummary","PrintStartSection","PrintTableHeader","PrintTestEnds","PrintTimestamp","QueryNodeMapping","ReadConfigScript","ReadStoneWallingIterations","ReduceIterResults","Regex","RemoveFile","SeedRandGen","SetHints","SetupDataSet","ShowFileSystemSize","ShowHints","ShowSetup","ShowTestEnd","ShowTestStart","StoreStoneWallingIterations","StringToBytes","TestIoSys","TimeDeviation","ValidateTests","WriteOrRead","WriteOrReadSingle","WriteTimes","XferBuffersFree","XferBuffersSetup","__do_global_dtors_aux","aiori_count","aiori_default","aiori_finalize","aiori_get_version","aiori_initialize","aiori_posix_access","aiori_posix_mkdir","aiori_posix_rmdir","aiori_posix_stat","aiori_posix_statfs","aiori_select","aiori_supported_apis","airoi_create_all_module_options","airoi_update_module_options","aligned_buffer_alloc","aligned_buffer_free","bw_ops_values","bw_values","contains_only","createGlobalOptions","decodeDirectiveWrapper","deregister_tm_clones","file_hits_histogram","frame_dummy","init_IOR_Param_t","init_clock","init_or_fini","init_or_fini_internal","ior_main","ior_mmap_file","ior_run","main","malloc_and_touch","mean_of_array_of_doubles","ops_values","option_parse","option_parse_key_value","option_parse_str","option_parse_token","option_print_current","option_print_help","print_current_option_section","print_help_section","print_option_value","print_value","register_tm_clones","safeMalloc","set_o_direct_flag","string_to_bytes","test_time_elapsed","updateParsedOptions"],"binary_path":"/home/haridev/spack/opt/spack/linux-haswell/ior-3.3.0-ip47j26fw7xxfftdzjvy2h36phgcuypv/bin/ior","include_offsets":false},{"type":1,"name":"lustre","functions":["cap_drop"]}] diff --git a/etc/datacrumbs/data/probes-invalid-haridev-lead.json b/etc/datacrumbs/data/probes-invalid-haridev-lead.json index e38f0cab..fd9f7654 100644 --- a/etc/datacrumbs/data/probes-invalid-haridev-lead.json +++ b/etc/datacrumbs/data/probes-invalid-haridev-lead.json @@ -1 +1 @@ -[{"type":4,"name":"custom1","functions":[],"bpf_path":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c","start_event_id":100000,"process_header":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h","event_type":2},{"type":0,"name":"sys","functions":[]},{"type":1,"name":"os_page_cache","functions":[]},{"type":1,"name":"lustre","functions":["__pfx___pcc_inode_create","__pfx___pcc_layout_invalidate.part.0.constprop.0","__pfx___sa_make_ready","__pfx_alloc_rw_stats_info","__pfx_blocksize_show","__pfx_can_populate_pages.isra.0","__pfx_cap_drop","__pfx_cfs_cdebug_show.part.0.constprop.0:0x1b60","__pfx_cfs_cdebug_show.part.0.constprop.0:0x2b120","__pfx_cfs_cdebug_show.part.0.constprop.0:0x480c0","__pfx_cfs_cdebug_show.part.0.constprop.0:0x4b040","__pfx_cfs_cdebug_show.part.0.constprop.0:0x54740","__pfx_cfs_cdebug_show.part.0.constprop.0:0x57840","__pfx_cfs_cdebug_show.part.0.constprop.0:0x60ab0","__pfx_cfs_cdebug_show.part.0.constprop.0:0x612b0","__pfx_cfs_cdebug_show.part.0.constprop.0:0x6a0b0","__pfx_cfs_cdebug_show.part.0.constprop.0:0x6cad0","__pfx_cfs_cdebug_show.part.0.constprop.0:0x73ad0","__pfx_cfs_cdebug_show.part.0.constprop.0:0x7f620","__pfx_cfs_cdebug_show.part.0.constprop.0:0x82e50","__pfx_cfs_cdebug_show.part.0.constprop.0:0xea90","__pfx_cfs_cpt_bind_workqueue.constprop.0","__pfx_cfs_match_wildcard","__pfx_cfs_race.constprop.0","__pfx_checksums_show","__pfx_checksums_store","__pfx_cl_falloc","__pfx_cl_fid_build_gen","__pfx_cl_fid_build_ino","__pfx_cl_file_inode_init","__pfx_cl_get_grouplock","__pfx_cl_glimpse_lock","__pfx_cl_glimpse_size0","__pfx_cl_init_ea_size.isra.0","__pfx_cl_inode2vvp","__pfx_cl_inode_fini","__pfx_cl_io_get","__pfx_cl_ocd_update","__pfx_cl_put_grouplock","__pfx_cl_sb_fini","__pfx_cl_sb_init","__pfx_cl_setattr_ost","__pfx_cl_sync_file_range","__pfx_cleanup_module","__pfx_client_common_fill_super","__pfx_client_type_show","__pfx_copy_and_ct_start.constprop.0","__pfx_default_easize_show","__pfx_default_easize_store","__pfx_dirty_cnt","__pfx_do_release_page.constprop.0","__pfx_fast_read_show","__pfx_fast_read_store","__pfx_file_heat_show","__pfx_file_heat_store","__pfx_file_read_confine_iter","__pfx_filesfree_show","__pfx_filestotal_show","__pfx_foreign_symlink_alloc_and_copy_prefix","__pfx_foreign_symlink_enable_show","__pfx_foreign_symlink_enable_store","__pfx_foreign_symlink_prefix_show","__pfx_foreign_symlink_prefix_store","__pfx_foreign_symlink_upcall_info_store","__pfx_foreign_symlink_upcall_show","__pfx_foreign_symlink_upcall_store","__pfx_free_dentry_data","__pfx_fstype_show","__pfx_get_hsm_state.constprop.0","__pfx_get_uuid2int","__pfx_get_xattr_type","__pfx_has_same_mount_namespace","__pfx_heat_decay_percentage_show","__pfx_heat_decay_percentage_store","__pfx_heat_period_second_show","__pfx_heat_period_second_store","__pfx_init_module","__pfx_inode_cache_show","__pfx_inode_cache_store","__pfx_is_first_dirent","__pfx_kbytesavail_show","__pfx_kbytesfree_show","__pfx_kbytestotal_show","__pfx_kickoff_async_readahead","__pfx_lazystatfs_show","__pfx_lazystatfs_store","__pfx_ll_agl_add","__pfx_ll_agl_thread","__pfx_ll_agl_trigger","__pfx_ll_alloc_inode","__pfx_ll_atomic_open","__pfx_ll_authorize_statahead","__pfx_ll_check_swap_layouts_validity","__pfx_ll_cl_add","__pfx_ll_cl_find","__pfx_ll_cl_remove","__pfx_ll_clear_inode","__pfx_ll_close_inode_openhandle","__pfx_ll_compute_rootsquash_state","__pfx_ll_copy_user_md","__pfx_ll_create_it","__pfx_ll_create_nd","__pfx_ll_create_node","__pfx_ll_d_init","__pfx_ll_data_version","__pfx_ll_dcompare","__pfx_ll_ddelete","__pfx_ll_deauthorize_statahead","__pfx_ll_debugfs_register_super","__pfx_ll_debugfs_unregister_super","__pfx_ll_delete_inode","__pfx_ll_dentry_init_security","__pfx_ll_destroy_inode","__pfx_ll_dir_clear_lsm_md","__pfx_ll_dir_flush","__pfx_ll_dir_get_default_layout","__pfx_ll_dir_get_parent_fid","__pfx_ll_dir_getstripe","__pfx_ll_dir_getstripe_default","__pfx_ll_dir_ioctl","__pfx_ll_dir_open","__pfx_ll_dir_read","__pfx_ll_dir_release","__pfx_ll_dir_seek","__pfx_ll_dir_setdirstripe","__pfx_ll_dir_setstripe","__pfx_ll_direct_IO","__pfx_ll_direct_IO_impl","__pfx_ll_direct_rw_pages","__pfx_ll_dirty_page_discard_warn","__pfx_ll_display_extents_info","__pfx_ll_do_fiemap","__pfx_ll_do_tiny_write","__pfx_ll_dom_finish_open","__pfx_ll_dom_lock_cancel","__pfx_ll_dom_read_folio","__pfx_ll_dom_readpage","__pfx_ll_dput_later","__pfx_ll_drop_inode","__pfx_ll_dummy_context","__pfx_ll_empty_dir","__pfx_ll_encode_fh","__pfx_ll_fallocate","__pfx_ll_fault","__pfx_ll_fault0","__pfx_ll_fault_io_init","__pfx_ll_fh_to_dentry","__pfx_ll_fh_to_parent","__pfx_ll_fid2path","__pfx_ll_fiemap","__pfx_ll_file_data_put.part.0","__pfx_ll_file_flock","__pfx_ll_file_futimes_3","__pfx_ll_file_getstripe","__pfx_ll_file_io_generic","__pfx_ll_file_ioctl","__pfx_ll_file_lock_ahead","__pfx_ll_file_mmap","__pfx_ll_file_noflock","__pfx_ll_file_open","__pfx_ll_file_open_encrypt","__pfx_ll_file_read_iter","__pfx_ll_file_release","__pfx_ll_file_seek","__pfx_ll_file_set_lease","__pfx_ll_file_unlock_lease","__pfx_ll_file_write_iter","__pfx_ll_filemap_fault","__pfx_ll_filemap_get_one_page_contig","__pfx_ll_filename_enc_seq_show","__pfx_ll_filename_enc_seq_write","__pfx_ll_filename_enc_single_open","__pfx_ll_fill_super","__pfx_ll_find_alias","__pfx_ll_finish_md_op_data","__pfx_ll_flush","__pfx_ll_flush_ctx","__pfx_ll_fname_disk_to_usr","__pfx_ll_foreign_dir_lookup","__pfx_ll_foreign_get_link","__pfx_ll_foreign_is_openable","__pfx_ll_foreign_is_removable","__pfx_ll_foreign_put_link","__pfx_ll_foreign_readlink_internal","__pfx_ll_foreign_symlink_default_parse","__pfx_ll_foreign_symlink_getattr","__pfx_ll_foreign_symlink_upcall_parse","__pfx_ll_free_rw_stats_info","__pfx_ll_free_sbi.isra.0","__pfx_ll_fsync","__pfx_ll_get_acl","__pfx_ll_get_acl_common","__pfx_ll_get_context","__pfx_ll_get_default_mdsize","__pfx_ll_get_dir_page","__pfx_ll_get_fid_by_name","__pfx_ll_get_grouplock","__pfx_ll_get_inode_acl","__pfx_ll_get_link","__pfx_ll_get_max_mdsize","__pfx_ll_get_mdt_idx","__pfx_ll_get_mdt_idx_by_fid","__pfx_ll_get_name","__pfx_ll_get_obd_name","__pfx_ll_get_parent","__pfx_ll_getattr","__pfx_ll_getattr_dentry","__pfx_ll_getattr_link","__pfx_ll_getname","__pfx_ll_getparent","__pfx_ll_getxattr_lov","__pfx_ll_have_md_lock","__pfx_ll_heat_add","__pfx_ll_hsm_import","__pfx_ll_hsm_release","__pfx_ll_hsm_state_set","__pfx_ll_i2gids","__pfx_ll_i2suppgid","__pfx_ll_iget","__pfx_ll_iget_anon_dir","__pfx_ll_iget_for_nfs.constprop.0","__pfx_ll_init_lsm_md","__pfx_ll_init_sbi","__pfx_ll_initxattrs","__pfx_ll_inode2fid.part.0:0x1ad0","__pfx_ll_inode2fid.part.0:0x2abb0","__pfx_ll_inode2fid.part.0:0x4b000","__pfx_ll_inode2fid.part.0:0x54700","__pfx_ll_inode2fid.part.0:0x61270","__pfx_ll_inode2fid.part.0:0x7f5e0","__pfx_ll_inode2fid.part.0:0xe9d0","__pfx_ll_inode_destroy_callback","__pfx_ll_inode_from_resource_lock","__pfx_ll_inode_init_security","__pfx_ll_inode_notifysecctx","__pfx_ll_inode_permission","__pfx_ll_inode_revalidate","__pfx_ll_inode_size_lock","__pfx_ll_inode_size_unlock","__pfx_ll_intent_drop_lock","__pfx_ll_intent_drop_lock.part.0","__pfx_ll_intent_file_open","__pfx_ll_intent_release","__pfx_ll_invalidate_folio","__pfx_ll_io_init","__pfx_ll_io_read_page","__pfx_ll_io_set_mirror","__pfx_ll_io_zero_page","__pfx_ll_ioc_copy_end","__pfx_ll_ioc_copy_start","__pfx_ll_ioc_data_version","__pfx_ll_iocontrol","__pfx_ll_ioctl_check_project","__pfx_ll_ioctl_fsgetxattr","__pfx_ll_ioctl_fssetxattr","__pfx_ll_ioctl_project","__pfx_ll_iterate","__pfx_ll_kill_super","__pfx_ll_ladvise.constprop.0","__pfx_ll_ladvise_sanity.isra.0","__pfx_ll_layout_conf","__pfx_ll_layout_fetch","__pfx_ll_layout_intent","__pfx_ll_layout_lock_set","__pfx_ll_layout_refresh","__pfx_ll_layout_restore","__pfx_ll_layout_write_intent","__pfx_ll_lease_close_intent","__pfx_ll_lease_file_resync","__pfx_ll_lease_och_acquire","__pfx_ll_lease_open","__pfx_ll_link","__pfx_ll_linkea_decode","__pfx_ll_listxattr","__pfx_ll_lli_init","__pfx_ll_local_open","__pfx_ll_lock_cancel_bits","__pfx_ll_lookup_finish_locks","__pfx_ll_lookup_it","__pfx_ll_lookup_it_finish.constprop.0","__pfx_ll_lookup_nd","__pfx_ll_lov_getstripe_ea_info","__pfx_ll_lov_setea","__pfx_ll_lov_setstripe","__pfx_ll_lov_setstripe_ea_info","__pfx_ll_lseek","__pfx_ll_manage_foreign","__pfx_ll_manage_foreign_dir","__pfx_ll_manage_foreign_file","__pfx_ll_max_cached_mb_seq_show","__pfx_ll_max_cached_mb_seq_write","__pfx_ll_max_cached_mb_single_open","__pfx_ll_md_blocking_ast","__pfx_ll_md_blocking_lease_ast","__pfx_ll_md_close","__pfx_ll_md_need_convert","__pfx_ll_md_real_close","__pfx_ll_md_setattr","__pfx_ll_merge_attr","__pfx_ll_merge_md_attr","__pfx_ll_migrate","__pfx_ll_migrate_folio","__pfx_ll_mkdir","__pfx_ll_mknod","__pfx_ll_new_node","__pfx_ll_nfs_get_name_filldir","__pfx_ll_nosquash_nids_seq_show","__pfx_ll_nosquash_nids_seq_write","__pfx_ll_nosquash_nids_single_open","__pfx_ll_obd_statfs","__pfx_ll_och_fill","__pfx_ll_old_b64_enc_seq_show","__pfx_ll_old_b64_enc_seq_write","__pfx_ll_old_b64_enc_single_open","__pfx_ll_open_cleanup","__pfx_ll_options.isra.0","__pfx_ll_page_mkwrite","__pfx_ll_page_mkwrite0.constprop.0","__pfx_ll_pcc_seq_show","__pfx_ll_pcc_seq_write","__pfx_ll_pcc_single_open","__pfx_ll_prep_inode","__pfx_ll_prep_md_op_data","__pfx_ll_prepare_close","__pfx_ll_prepare_partial_page","__pfx_ll_prune_aliases","__pfx_ll_prune_negative_children","__pfx_ll_put_grouplock.isra.0","__pfx_ll_put_link","__pfx_ll_put_super","__pfx_ll_ra_count_get.constprop.0","__pfx_ll_ra_count_put","__pfx_ll_ra_stats_inc","__pfx_ll_ras_enter","__pfx_ll_read_ahead_page","__pfx_ll_read_ahead_pages","__pfx_ll_read_cache_page.constprop.0","__pfx_ll_read_folio","__pfx_ll_read_inode2","__pfx_ll_readahead.constprop.0","__pfx_ll_readahead_file_kms","__pfx_ll_readahead_handle_work","__pfx_ll_readahead_init","__pfx_ll_readlink_internal.constprop.0","__pfx_ll_readpage","__pfx_ll_readpages","__pfx_ll_release","__pfx_ll_release_folio","__pfx_ll_release_openhandle","__pfx_ll_release_page","__pfx_ll_remount_fs","__pfx_ll_rename","__pfx_ll_revalidate_d_crypto","__pfx_ll_revalidate_dentry","__pfx_ll_revalidate_it_finish","__pfx_ll_revalidate_statahead","__pfx_ll_rmdir","__pfx_ll_rmdir_entry","__pfx_ll_rmfid","__pfx_ll_root_squash_seq_show","__pfx_ll_root_squash_seq_write","__pfx_ll_root_squash_single_open","__pfx_ll_rw_extents_stats_pp_seq_show","__pfx_ll_rw_extents_stats_pp_seq_write","__pfx_ll_rw_extents_stats_pp_single_open","__pfx_ll_rw_extents_stats_seq_show","__pfx_ll_rw_extents_stats_seq_write","__pfx_ll_rw_extents_stats_single_open","__pfx_ll_rw_offset_stats_seq_show","__pfx_ll_rw_offset_stats_seq_write","__pfx_ll_rw_offset_stats_single_open","__pfx_ll_rw_stats_tally","__pfx_ll_sai_alloc","__pfx_ll_sai_free","__pfx_ll_sai_put","__pfx_ll_sb_has_test_dummy_encryption","__pfx_ll_sbi_flags_seq_show","__pfx_ll_sbi_flags_single_open","__pfx_ll_sbi_has_encrypt","__pfx_ll_sbi_has_name_encrypt","__pfx_ll_sbi_set_encrypt","__pfx_ll_sbi_set_name_encrypt","__pfx_ll_secctx_name_free","__pfx_ll_secctx_name_get","__pfx_ll_secctx_name_store","__pfx_ll_security_secctx_name_filter","__pfx_ll_select_file_operations","__pfx_ll_set_acl","__pfx_ll_set_context","__pfx_ll_set_default_mdsize","__pfx_ll_set_encflags","__pfx_ll_set_inode","__pfx_ll_set_lock_data.constprop.0:0x5b620","__pfx_ll_set_lock_data.constprop.0:0x62560","__pfx_ll_set_lock_data:0x11720","__pfx_ll_set_lock_data:0x4b5a0","__pfx_ll_set_lock_data:0x960","__pfx_ll_set_project","__pfx_ll_setattr","__pfx_ll_setattr_raw","__pfx_ll_setstripe_ea","__pfx_ll_setup_filename","__pfx_ll_show_options","__pfx_ll_site_stats_seq_show","__pfx_ll_site_stats_single_open","__pfx_ll_splice_alias","__pfx_ll_start_agl","__pfx_ll_start_statahead","__pfx_ll_statahead_interpret","__pfx_ll_statahead_stats_seq_show","__pfx_ll_statahead_stats_single_open","__pfx_ll_statahead_thread","__pfx_ll_statfs","__pfx_ll_statfs_internal","__pfx_ll_statfs_project.constprop.0","__pfx_ll_stats_ops_tally","__pfx_ll_stats_pid_write","__pfx_ll_stop_agl","__pfx_ll_swap_layouts","__pfx_ll_swap_layouts_close","__pfx_ll_symlink","__pfx_ll_take_md_lock","__pfx_ll_test_inode","__pfx_ll_test_inode_by_fid","__pfx_ll_thread_key_fini","__pfx_ll_thread_key_init","__pfx_ll_track_file_opens","__pfx_ll_truncate_inode_pages_final","__pfx_ll_umount_begin","__pfx_ll_unlink","__pfx_ll_unlock_md_op_lsm","__pfx_ll_unstable_stats_seq_show","__pfx_ll_unstable_stats_seq_write","__pfx_ll_unstable_stats_single_open","__pfx_ll_update_default_lsm_md","__pfx_ll_update_dir_depth","__pfx_ll_update_inode","__pfx_ll_update_inode_flags","__pfx_ll_update_lsm_md","__pfx_ll_update_times","__pfx_ll_vm_close","__pfx_ll_vm_open","__pfx_ll_write_begin","__pfx_ll_write_end","__pfx_ll_writepage","__pfx_ll_writepages","__pfx_ll_xattr_cache_add","__pfx_ll_xattr_cache_del.constprop.0","__pfx_ll_xattr_cache_destroy","__pfx_ll_xattr_cache_destroy_locked","__pfx_ll_xattr_cache_empty","__pfx_ll_xattr_cache_find","__pfx_ll_xattr_cache_get","__pfx_ll_xattr_cache_init","__pfx_ll_xattr_cache_insert","__pfx_ll_xattr_cache_list","__pfx_ll_xattr_cache_refill","__pfx_ll_xattr_find_get_lock","__pfx_ll_xattr_fini","__pfx_ll_xattr_get","__pfx_ll_xattr_get_common","__pfx_ll_xattr_init","__pfx_ll_xattr_list","__pfx_ll_xattr_set","__pfx_ll_xattr_set_common","__pfx_llcrypt_free_ctx","__pfx_llcrypt_require_key","__pfx_llite_kobj_release","__pfx_llite_tunables_register","__pfx_llite_tunables_unregister","__pfx_lsm_md_dump","__pfx_lustre_fill_super","__pfx_lustre_kill_super","__pfx_lustre_mount","__pfx_max_easize_show","__pfx_max_read_ahead_async_active_show","__pfx_max_read_ahead_async_active_store","__pfx_max_read_ahead_mb_show","__pfx_max_read_ahead_mb_store","__pfx_max_read_ahead_per_file_mb_show","__pfx_max_read_ahead_per_file_mb_store","__pfx_max_read_ahead_whole_mb_show","__pfx_max_read_ahead_whole_mb_store","__pfx_mkwrite_commit_callback","__pfx_obd_connect.constprop.0","__pfx_obd_disconnect.isra.0","__pfx_obd_get_info.constprop.0:0x2650","__pfx_obd_get_info.constprop.0:0x2c120","__pfx_obd_get_info.constprop.0:0x69180","__pfx_obd_iocontrol.constprop.0:0x2bdb0","__pfx_obd_iocontrol.constprop.0:0x57870","__pfx_obd_iocontrol.constprop.0:0x74a70","__pfx_obd_iocontrol:0x10460","__pfx_obd_iocontrol:0x22e0","__pfx_obd_quotactl","__pfx_obd_set_info_async.constprop.0:0x2c490","__pfx_obd_set_info_async.constprop.0:0x492e0","__pfx_obd_statfs.constprop.0","__pfx_opencache_max_ms_show","__pfx_opencache_max_ms_store","__pfx_opencache_threshold_count_show","__pfx_opencache_threshold_count_store","__pfx_opencache_threshold_ms_show","__pfx_opencache_threshold_ms_store","__pfx_our_vma","__pfx_page_list_sanity_check.constprop.0","__pfx_parallel_dio_show","__pfx_parallel_dio_store","__pfx_pathname_is_valid","__pfx_pcc_cmd_fini.part.0","__pfx_pcc_cmd_handle","__pfx_pcc_cmd_parse.constprop.0","__pfx_pcc_conds_parse","__pfx_pcc_conjunction_free","__pfx_pcc_copy_data","__pfx_pcc_create_attach_cleanup","__pfx_pcc_dataset_add","__pfx_pcc_dataset_get","__pfx_pcc_dataset_match_get","__pfx_pcc_dataset_put","__pfx_pcc_dataset_rule_fini","__pfx_pcc_dataset_rule_init","__pfx_pcc_expression_free","__pfx_pcc_expression_parse","__pfx_pcc_fault","__pfx_pcc_fid2dataset_path.constprop.0.isra.0","__pfx_pcc_file_init","__pfx_pcc_file_mmap","__pfx_pcc_file_open","__pfx_pcc_file_read_iter","__pfx_pcc_file_release","__pfx_pcc_file_splice_read","__pfx_pcc_file_write_iter","__pfx_pcc_fname_list_add","__pfx_pcc_fname_list_free","__pfx_pcc_fsync","__pfx_pcc_get_layout_info","__pfx_pcc_hsm_remove","__pfx_pcc_id_list_free","__pfx_pcc_id_list_parse","__pfx_pcc_id_parse","__pfx_pcc_inode_attach_set.constprop.0","__pfx_pcc_inode_create","__pfx_pcc_inode_create_fini","__pfx_pcc_inode_free","__pfx_pcc_inode_getattr","__pfx_pcc_inode_put","__pfx_pcc_inode_remove.isra.0","__pfx_pcc_inode_reset_iattr","__pfx_pcc_inode_setattr","__pfx_pcc_io_fini","__pfx_pcc_io_init","__pfx_pcc_ioctl_detach","__pfx_pcc_ioctl_state","__pfx_pcc_layout_invalidate","__pfx_pcc_layout_xattr_set.isra.0","__pfx_pcc_lookup","__pfx_pcc_mkdir_p.constprop.0","__pfx_pcc_page_mkwrite","__pfx_pcc_parse_value_pair","__pfx_pcc_parse_value_pairs","__pfx_pcc_readwrite_attach","__pfx_pcc_readwrite_attach_fini","__pfx_pcc_remove_datasets","__pfx_pcc_rule_conds_free","__pfx_pcc_super_dump","__pfx_pcc_super_fini","__pfx_pcc_super_init","__pfx_pcc_try_auto_attach","__pfx_pcc_try_dataset_attach.constprop.0","__pfx_pcc_vm_close","__pfx_pcc_vm_open","__pfx_policy_from_vma","__pfx_posix_acl_release.part.0","__pfx_quotactl_ioctl","__pfx_ras_detect_read_pattern","__pfx_ras_reset","__pfx_ras_stride_increase_window","__pfx_ras_stride_reset","__pfx_ras_update","__pfx_read_ahead_async_file_threshold_mb_show","__pfx_read_ahead_async_file_threshold_mb_store","__pfx_read_ahead_range_kb_show","__pfx_read_ahead_range_kb_store","__pfx_read_in_stride_window","__pfx_revalidate_statahead_dentry","__pfx_ria_page_count","__pfx_sa_alloc","__pfx_sa_fini_data","__pfx_sa_free","__pfx_sa_handle_callback","__pfx_sa_instantiate","__pfx_sa_lookup","__pfx_sa_make_ready","__pfx_sa_prep_data","__pfx_sa_revalidate","__pfx_sa_statahead","__pfx_sbi_kobj_release","__pfx_search_inode_for_lustre","__pfx_start_statahead_thread","__pfx_stat_blocksize_show","__pfx_stat_blocksize_store","__pfx_statahead_agl_show","__pfx_statahead_agl_store","__pfx_statahead_max_show","__pfx_statahead_max_store","__pfx_statahead_running_max_show","__pfx_statahead_running_max_store","__pfx_statfs_max_age_show","__pfx_statfs_max_age_store","__pfx_stats_track_gid_show","__pfx_stats_track_gid_store","__pfx_stats_track_pid_show","__pfx_stats_track_pid_store","__pfx_stats_track_ppid_show","__pfx_stats_track_ppid_store","__pfx_stride_byte_count","__pfx_tiny_write_show","__pfx_tiny_write_store","__pfx_trunc_sem_down_read","__pfx_trunc_sem_down_write","__pfx_uuid_show","__pfx_volatile_ref_file","__pfx_vvp_attr_get","__pfx_vvp_attr_update","__pfx_vvp_conf_set","__pfx_vvp_device_alloc","__pfx_vvp_device_fini","__pfx_vvp_device_free","__pfx_vvp_device_init","__pfx_vvp_dump_pgcache_seq_open","__pfx_vvp_dump_pgcache_seq_release","__pfx_vvp_global_fini","__pfx_vvp_global_init","__pfx_vvp_io_advance","__pfx_vvp_io_commit_sync","__pfx_vvp_io_fault_end","__pfx_vvp_io_fault_fini","__pfx_vvp_io_fault_iter_init","__pfx_vvp_io_fault_lock","__pfx_vvp_io_fault_start","__pfx_vvp_io_fini","__pfx_vvp_io_fsync_start","__pfx_vvp_io_init","__pfx_vvp_io_kernel_fault","__pfx_vvp_io_lseek_end","__pfx_vvp_io_lseek_lock","__pfx_vvp_io_lseek_start","__pfx_vvp_io_one_lock_index","__pfx_vvp_io_read_ahead","__pfx_vvp_io_read_iter_init","__pfx_vvp_io_read_lock","__pfx_vvp_io_read_start","__pfx_vvp_io_rw_end","__pfx_vvp_io_rw_lock","__pfx_vvp_io_setattr_end","__pfx_vvp_io_setattr_fini","__pfx_vvp_io_setattr_iter_init","__pfx_vvp_io_setattr_lock","__pfx_vvp_io_setattr_start","__pfx_vvp_io_write_commit","__pfx_vvp_io_write_iter_fini","__pfx_vvp_io_write_iter_init","__pfx_vvp_io_write_lock","__pfx_vvp_io_write_start","__pfx_vvp_key_init_generic.constprop.0","__pfx_vvp_mmap_locks","__pfx_vvp_object_alloc","__pfx_vvp_object_free","__pfx_vvp_object_free_rcu","__pfx_vvp_object_glimpse","__pfx_vvp_object_init","__pfx_vvp_object_invariant","__pfx_vvp_object_print","__pfx_vvp_page_completion_read","__pfx_vvp_page_completion_write","__pfx_vvp_page_delete","__pfx_vvp_page_discard","__pfx_vvp_page_init","__pfx_vvp_pgcache_current","__pfx_vvp_pgcache_next","__pfx_vvp_pgcache_page_show.constprop.0","__pfx_vvp_pgcache_show","__pfx_vvp_pgcache_start","__pfx_vvp_pgcache_stop","__pfx_vvp_prep_size","__pfx_vvp_prune","__pfx_vvp_req_attr_set","__pfx_vvp_session_key_fini","__pfx_vvp_session_key_init","__pfx_vvp_set_batch_dirty","__pfx_vvp_thread_key_fini","__pfx_vvp_thread_key_init","__pfx_vvp_type_fini","__pfx_vvp_type_init","__pfx_vvp_type_start","__pfx_vvp_type_stop","__pfx_vvp_vmpage_error","__pfx_write_commit_callback","__pfx_xattr_cache_show","__pfx_xattr_cache_store","__pfx_xattr_type_filter","__pfx_zero_user_segments.constprop.0","cap_drop","cfs_cdebug_show.part.0.constprop.0:0x1b70","cfs_cdebug_show.part.0.constprop.0:0x2b130","cfs_cdebug_show.part.0.constprop.0:0x480d0","cfs_cdebug_show.part.0.constprop.0:0x4b050","cfs_cdebug_show.part.0.constprop.0:0x54750","cfs_cdebug_show.part.0.constprop.0:0x57850","cfs_cdebug_show.part.0.constprop.0:0x60ac0","cfs_cdebug_show.part.0.constprop.0:0x612c0","cfs_cdebug_show.part.0.constprop.0:0x6a0c0","cfs_cdebug_show.part.0.constprop.0:0x6cae0","cfs_cdebug_show.part.0.constprop.0:0x73ae0","cfs_cdebug_show.part.0.constprop.0:0x7f630","cfs_cdebug_show.part.0.constprop.0:0x82e60","cfs_cdebug_show.part.0.constprop.0:0xeaa0","cfs_cpt_bind_workqueue.constprop.0","cfs_race.constprop.0","cleanup_module","init_module","ll_dom_read_folio","ll_dom_readpage","ll_inode2fid.part.0:0x1ae0","ll_inode2fid.part.0:0x2abc0","ll_inode2fid.part.0:0x4b010","ll_inode2fid.part.0:0x54710","ll_inode2fid.part.0:0x61280","ll_inode2fid.part.0:0x7f5f0","ll_inode2fid.part.0:0xe9e0","ll_read_cache_page.constprop.0","ll_readlink_internal.constprop.0.cold","ll_sai_free","ll_set_lock_data.constprop.0:0x5b630","ll_set_lock_data.constprop.0:0x62570","ll_set_lock_data:0x11730","ll_set_lock_data:0x4b5b0","ll_set_lock_data:0x970","llcrypt_require_key","lsm_md_dump","lustre_exit","lustre_init","obd_connect.constprop.0","obd_disconnect.isra.0","obd_get_info.constprop.0:0x2660","obd_get_info.constprop.0:0x2c130","obd_get_info.constprop.0:0x69190","obd_iocontrol.constprop.0:0x2bdc0","obd_iocontrol.constprop.0:0x57880","obd_iocontrol.constprop.0:0x74a80","obd_iocontrol:0x10470","obd_iocontrol:0x22f0","obd_quotactl","obd_set_info_async.constprop.0:0x2c4a0","obd_set_info_async.constprop.0:0x492f0","obd_statfs.constprop.0","posix_acl_release.part.0","trunc_sem_down_read","trunc_sem_down_write","zero_user_segments.constprop.0"]},{"type":2,"name":"mpiio","functions":[],"binary_path":"/opt/toss/openmpi/4.1/gnu/lib/libmpi.so","include_offsets":false},{"type":2,"name":"ior","functions":[],"binary_path":"/home/haridev/software/ior/install/bin/ior","include_offsets":false}] +[{"type":4,"name":"custom1","functions":[],"bpf_path":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c","start_event_id":100000,"process_header":"/home/haridev/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h","event_type":2},{"type":0,"name":"sys","functions":[]},{"type":1,"name":"os_page_cache","functions":["page_cache_sync_readahead"]},{"type":1,"name":"lustre","functions":["cap_drop","cleanup_module","init_module","ll_dom_read_folio","ll_dom_readpage","ll_sai_free","llcrypt_require_key","lsm_md_dump","lustre_exit","lustre_init","obd_quotactl","posix_acl_release.part.0","trunc_sem_down_read","trunc_sem_down_write"]},{"type":1,"name":"mdc","functions":["cfs_delete_from_page_cache","cleanup_module","init_module","mdc_attr_pack","mdc_clear_replay_flag.part.0","mdc_exit","mdc_init","mdc_read_folio_remote","obd_notify","obd_quotactl"]},{"type":1,"name":"mgc","functions":["cleanup_module","init_module","mgc_exit","mgc_init"]},{"type":1,"name":"osc","functions":["_compound_head","cleanup_module","ext_flags","init_module","libcfs_nidstr","obd_notify","osc_exit","osc_init","osc_release_bounce_pages","ostid_id","ostid_seq"]},{"type":1,"name":"ptlrpc","functions":["cfs_race","cleanup_module","cpumask_weight","dt_delete","dt_insert","enc_pools_alloc","enc_pools_free","exp_connect_healthy","exp_finished","exp_finished_or_from_mdt","exp_lock_replay_healthy","exp_req_replay_healthy_or_from_mdt","exp_vbr_healthy","init_module","lcd_cpu_to_le","lcd_le_to_cpu","ldlm_callback_errmsg","ldlm_flock_destroy","ldlm_plain_compat_queue","libcfs_nid2str","lsd_cpu_to_le","lsd_le_to_cpu","obd_cksum_type_unpack","obd_commitrw","obd_connect","obd_disconnect","obd_preprw","obd_reconnect","ost_fid_from_resid","ostid_id","ostid_seq","page_from_bulkdesc","page_from_pagearray","ptlrpc_exit","ptlrpc_init","ptlrpc_release_bulk_noop","ptlrpc_req_drop_rs.part.0","ptlrpc_set_producer","tgt_fmd_put_nolock"]},{"type":2,"name":"mpi","functions":[],"binary_path":"/opt/toss/openmpi/4.1/gnu/lib/libmpi.so","include_offsets":false},{"type":2,"name":"ior","functions":[],"binary_path":"/home/haridev/software/ior/install/bin/ior","include_offsets":false},{"type":1,"name":"iomap","functions":["iomap_init","iomap_iter_advance","iomap_iter_done"]},{"type":1,"name":"xfs","functions":["xfs_ag_resv_rmapbt_alloc","xfs_attri_log_nameval_alloc","xfs_attri_recover_work","xfs_buf_lookup.constprop.0","xfs_bui_copy_format","xfs_cui_copy_format","xfs_defer_pending_cancel_work","xfs_fs_eofblocks_from_user","xfs_has_finobt","xfs_has_reflink","xfs_has_rmapbt","xfs_icount_range","xfs_iext_count","xfs_inobt_maxlevels_ondisk","xfs_internal_inum","xfs_rui_copy_format","xfs_sysfs_del.constprop.0","xfs_sysfs_release","xfs_verify_fsbno","xfs_verify_ino","xfs_verify_rtbno"]}] diff --git a/notes.MD b/notes.MD index fd811ca5..9909f654 100644 --- a/notes.MD +++ b/notes.MD @@ -21,7 +21,7 @@ for i in {3..6} {9..11}; do done ``` ```bash -for i in 2 {4..6} {9..11}; do +for i in {2..6} {9..11}; do echo "Copying prolog and epilog files into server:lead${i}" sudo ssh lead${i} rm /etc/flux/system/prolog-job-manager.d/datacrumbs* sudo ssh lead${i} rm /etc/flux/system/epilog.d/datacrumbs* @@ -53,7 +53,7 @@ sudo ssh lead${i} << 'EOF' rm /etc/systemd/system/datacrumbs.service EOF done -for i in 2 {4..6} {9..11}; do +for i in 2; do sudo ssh lead${i} << 'EOF' /admin/scripts/flux_reconfig.sh flux config reload @@ -61,10 +61,10 @@ EOF done ``` ```bash -for i in 2 {4..6} {9..11}; do +for i in {2..6} {9..11}; do echo Checking lead${i} sudo ssh lead${i} << 'EOF' -systemctl daemon-reload +chmod 777 /p/ssd EOF done ``` @@ -111,4 +111,19 @@ flux run -N $nodes --tasks-per-node 16 ~/software/ior/install/bin/ior -t 1m -b 1 flux run -N $nodes --tasks-per-node 16 ~/software/ior/install/bin/ior -a MPIIO -t 1m -b 16m -F -o /tmp/file2 flux run -N $nodes --tasks-per-node 16 ~/software/ior/install/bin/ior -c -t 1m -b 16m -F -o /tmp/file2 -z flux run -N $nodes --tasks-per-node 16 ~/software/ior/install/bin/ior -t 1m -b 16m -F -o /tmp/file2 +``` + +```bash +mkfs /dev/sda +DIR=/p/ssd +pdsh -g compute mkdir -p $DIR +pdsh -g compute 'mount /dev/sda $DIR' +pdsh -g compute 'chmod 777 $DIR' +``` + +```bash +for i in {0..16}; do +done +flux run -n 1 ~/software/ior/install/bin/ior -o /p/ssd/test -t 1g -b 64g +flux run -n 16 ~/software/ior/install/bin/ior -o /p/ssd/test -t 32m -b 4g ``` \ No newline at end of file diff --git a/scripts/datacrumbs/datacrumbs_args.in b/scripts/datacrumbs/datacrumbs_args.in index 9cfaed8d..adf6c221 100755 --- a/scripts/datacrumbs/datacrumbs_args.in +++ b/scripts/datacrumbs/datacrumbs_args.in @@ -268,9 +268,19 @@ dc_args_usage() { done done if (( ${#__vals[@]} > 0 )); then - local __vals_joined - IFS='|' read -r __vals_joined <<< "${__vals[*]}" - note=" (required when --$SUBCMD_OPT=$__vals_joined)" + # Check if the subcommand option is a bool type + local __subcmd_idx="${IDX[$SUBCMD_OPT]}" + local __subcmd_type="${T[$__subcmd_idx]}" + + if [[ "$__subcmd_type" == "bool" ]]; then + # For bool, just show --option without =value + note=" (required when --$SUBCMD_OPT)" + else + # For non-bool, show --option=value1|value2 + local __vals_joined + IFS='|' read -r __vals_joined <<< "${__vals[*]}" + note=" (required when --$SUBCMD_OPT=$__vals_joined)" + fi fi fi if [[ "${T[i]}" == "bool" ]]; then @@ -505,12 +515,22 @@ dc_args_pretty_print() { done done if (( ${#__vals[@]} > 0 )); then - local __joined=""; local __idx - for __idx in "${!__vals[@]}"; do - [[ "$__idx" -gt 0 ]] && __joined+="|" - __joined+="${__vals[$__idx]}" - done - note=" (required when --$SUBCMD_OPT=$__joined)" + # Check if the subcommand option is a bool type + local __subcmd_idx="${IDX[$SUBCMD_OPT]}" + local __subcmd_type="${T[$__subcmd_idx]}" + + if [[ "$__subcmd_type" == "bool" ]]; then + # For bool, just show --option without =value + note=" (required when --$SUBCMD_OPT)" + else + # For non-bool, show --option=value1|value2|... + local __joined=""; local __idx + for __idx in "${!__vals[@]}"; do + [[ "$__idx" -gt 0 ]] && __joined+="|" + __joined+="${__vals[$__idx]}" + done + note=" (required when --$SUBCMD_OPT=$__joined)" + fi fi fi diff --git a/scripts/datacrumbs/datacrumbs_compose.in b/scripts/datacrumbs/datacrumbs_compose.in index 505f7980..ae272db7 100755 --- a/scripts/datacrumbs/datacrumbs_compose.in +++ b/scripts/datacrumbs/datacrumbs_compose.in @@ -54,7 +54,7 @@ if [[ -n "${DRY_RUN}" && "${DRY_RUN}" != "0" ]]; then fi run() { - if [[ "$DRY_RUN_MODE" -eq 1 ]]; then + if [[ "$DRY_RUN_MODE" == "1" ]]; then printf "[DRY-RUN]" printf " %q" "$@" printf "\n" diff --git a/scripts/datacrumbs/datacrumbs_create_log_dir.in b/scripts/datacrumbs/datacrumbs_create_log_dir.in index de9b5c58..9bdd1db1 100755 --- a/scripts/datacrumbs/datacrumbs_create_log_dir.in +++ b/scripts/datacrumbs/datacrumbs_create_log_dir.in @@ -13,9 +13,19 @@ fi # Source argument parser source "$SCRIPT_DIR/datacrumbs_args" -dc_args_init "DATACRUMBS" -dc_args_parse "DATACRUMBS" "datacrumbs_run" "$@" - +APP="DATACRUMBS_CREATE_LOG_DIR" +dc_args_init "$APP" + +# If --help was requested, show help using the already-registered spec and exit +for __dc_a in "$@"; do + [[ "$__dc_a" == "--" ]] && break + if [[ "$__dc_a" == "--help" ]]; then + dc_args_show_help "$APP" "datacrumbs_create_log_dir" + exit 0 + fi +done + +dc_args_parse "$APP" "datacrumbs_create_log_dir" "$@" if [[ $? -ne 0 ]]; then echo "Error: Argument parsing failed." show_help diff --git a/scripts/datacrumbs/datacrumbs_run_validator.in b/scripts/datacrumbs/datacrumbs_run_validator.in index 95214cb3..d4b8c106 100755 --- a/scripts/datacrumbs/datacrumbs_run_validator.in +++ b/scripts/datacrumbs/datacrumbs_run_validator.in @@ -4,6 +4,14 @@ set -eo pipefail SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ +# Source argument parser +source "$SCRIPT_DIR/datacrumbs_args" + +dc_args_init "DATACRUMBS_VALIDATOR" +dc_args_add_subcommand "DATACRUMBS_VALIDATOR" "enable_mpi" "1" "nodes" "ppn" + +dc_args_parse "DATACRUMBS_VALIDATOR" "datacrumbs_run_validator" "$@" + source $SCRIPT_DIR/datacrumbs_setup check_root_user diff --git a/scripts/datacrumbs/datacrumbs_utility.in b/scripts/datacrumbs/datacrumbs_utility.in index bbd8adcb..34282d0c 100755 --- a/scripts/datacrumbs/datacrumbs_utility.in +++ b/scripts/datacrumbs/datacrumbs_utility.in @@ -53,20 +53,25 @@ function datacrumbs_init() { } function datacrumbs_start_server() { - if [[ "$RUNID" == "1000" ]]; then - RUNID=$(date +"%Y-%m-%d-%H-%M-%S") - fi - READY_FILE="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_${RUNID}.ready" - exec=$1 - exec=($exec) - if [[ -z "$DATACRUMBS_TRACE_DIR" ]]; then - error "DATACRUMBS_TRACE_DIR is empty. Please set the trace directory." - exit 1 - fi - common_cmd=("$DATACRUMBS_INSTALL_HOST" "--user" "$DATACRUMBS_USER" "--config_path" "$DATACRUMBS_INSTALL_CONFIGS_DIR" "--data_dir" "$DATACRUMBS_INSTALL_DATA_DIR" "--trace_log_dir" "$DATACRUMBS_TRACE_DIR" --run_id "$RUNID") - cmd=("${exec[@]}" "run" "${common_cmd[@]}") - WAIT_INTERVAL=2 - ELAPSED=0 + if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then + mkdir -p "$DATACRUMBS_SERVER_RUN_DIR" + else + sudo mkdir -p "$DATACRUMBS_SERVER_RUN_DIR" + fi + if [[ ! -w "$DATACRUMBS_SERVER_RUN_DIR" ]]; then + warn "Cannot write to DATACRUMBS_SERVER_RUN_DIR: $DATACRUMBS_SERVER_RUN_DIR. Trying sudo." + sudo mkdir -p "$DATACRUMBS_SERVER_RUN_DIR" + fi + exec=$1 + exec=($exec) + if [[ -z "$DATACRUMBS_TRACE_DIR" ]]; then + error "DATACRUMBS_TRACE_DIR is empty. Please set the trace directory." + exit 1 + fi + common_cmd=("$DATACRUMBS_INSTALL_HOST" "--user" "$DATACRUMBS_USER" "--config_path" "$DATACRUMBS_INSTALL_CONFIGS_DIR" "--data_dir" "$DATACRUMBS_INSTALL_DATA_DIR" "--trace_log_dir" "$DATACRUMBS_TRACE_DIR" --run_id "$DATACRUMBS_SERVER_RUN_ID") + cmd=("${exec[@]}" "run" "${common_cmd[@]}") + WAIT_INTERVAL=2 + ELAPSED=0 log "Starting Server: ${cmd[*]}" if [[ "${DRY_RUN:-0}" == "1" ]]; then @@ -119,25 +124,27 @@ function datacrumbs_stop_server() { server_launch "${cmd[@]}" >> $DATACRUMBS_LOG_FILE 2>&1 fi - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would find and kill process(es) with RUNID ${RUNID}" - log "[DRY RUN] Would remove ready file: $READY_FILE" - return 0 - fi - SERVER_PID=$(cat "$DATACRUMBS_SERVER_PID_FILE") - # SERVER_PID=$(ps aux | grep "${RUNID}" | grep -v grep | grep -v "${prog_name}" | awk '{print $2}') - if [[ -n "$SERVER_PID" ]]; then - log "Found process(es) with RUNID ${RUNID}: $SERVER_PID. Killing them." - if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then - ${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_stop "${prog_name}" - else - sudo ${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_stop "${prog_name}" - fi - cat "${DATACRUMBS_LOG_FILE}" - fi - rm -f "${READY_FILE}" - rm -f "${DATACRUMBS_SERVER_RUNID_FILE}" - log "Stopped server" + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would find and kill process(es) with DATACRUMBS_SERVER_RUN_ID ${DATACRUMBS_SERVER_RUN_ID}" + log "[DRY RUN] Would remove ready file: $DATACRUMBS_SERVER_READY_FILE" + return 0 + fi + SERVER_PID=$(cat "$DATACRUMBS_SERVER_PID_FILE" 2>/dev/null || true) + # SERVER_PID=$(ps aux | grep "${RUNID}" | grep -v grep | grep -v "${prog_name}" | awk '{print $2}') + if [[ -n "$SERVER_PID" ]]; then + log "Found process(es) with DATACRUMBS_SERVER_RUN_ID ${DATACRUMBS_SERVER_RUN_ID}: $SERVER_PID. Killing them." + if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then + ${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_stop "${prog_name}" + else + sudo ${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_stop "${prog_name}" + fi + cat "${DATACRUMBS_LOG_FILE}" + fi + rm -f "${DATACRUMBS_SERVER_READY_FILE}" + rm -f "${DATACRUMBS_SERVER_RUN_ID_FILE}" + rm -f "${DATACRUMBS_SERVER_PID_FILE}" + rm -f "${DATACRUMBS_SERVER_SYSTEMD_PID_FILE}" + log "Stopped server" } function datacrumbs_print_status() { @@ -224,9 +231,9 @@ function server_launch() { cmd=( "${cmd[@]}" ) else debug "Launching server without MPI" - cmd=( "${cmd[@]}" --disable_mpi) + cmd=( "${cmd[@]}" --disable-mpi) fi - if [[ "${DRY_RUN:-0}" -eq 1 ]]; then + if [[ "${DRY_RUN:-0}" == "1" ]]; then log "[DRY RUN] Would launch server: ${cmd[*]}" return 0 fi diff --git a/src/datacrumbs/common/configuration_manager.cpp b/src/datacrumbs/common/configuration_manager.cpp index 9ff7b293..7642d2b5 100644 --- a/src/datacrumbs/common/configuration_manager.cpp +++ b/src/datacrumbs/common/configuration_manager.cpp @@ -97,14 +97,14 @@ ArgumentParser::ArgumentParser(int argc, char** argv, ExecutableType exe_type) { } else if (arg == "--log_dir" && i + 1 < argc) { log_dir = argv[++i]; DC_LOG_DEBUG("[ArgumentParser] Log directory set to: %s", log_dir->c_str()); - } else if (arg == "--disable_mpi") { + } else if (arg == "--disable-mpi") { disable_mpi = true; DC_LOG_DEBUG("[ArgumentParser] disable_mpi set to: %s", disable_mpi ? "true" : "false"); } else if (arg == "--help" || arg == "-h") { DC_LOG_PRINT( "Usage: %s [--run_id ] [--trace_log_dir ] " "[--config_path ] [--user ] [--data_dir " - "] [--inclusion_path ] [--log_dir ]", + "] [--inclusion_path ] [--log_dir ] [--disable-mpi]", argv[0]); exit(0); } else { diff --git a/src/datacrumbs/common/logging.h b/src/datacrumbs/common/logging.h index 2e0f06f5..f5d83d1e 100644 --- a/src/datacrumbs/common/logging.h +++ b/src/datacrumbs/common/logging.h @@ -150,20 +150,40 @@ namespace datacrumbs::logging_internal { inline void log_progress(const std::string& message, size_t current, size_t total) { using namespace std::chrono; static auto start_time = steady_clock::now(); + static size_t last_printed = 0; + constexpr size_t PRINT_INTERVAL = 10000; // Print every 10K events + + // Only print every PRINT_INTERVAL events or when done + if (current != total && (current - last_printed) < PRINT_INTERVAL) { + return; + } + + last_printed = current; float percent = (total > 0) ? (100.0f * current / total) : 0.0f; auto now = steady_clock::now(); double elapsed = duration_cast>(now - start_time).count(); double rate = (elapsed > 0.0) ? (current / elapsed) : 0.0; +#ifdef LOG_TO_FILE + // For file logging, write complete lines without \r to avoid log file bloat + DC_LOG_PRINT("%s [%zu/%zu] %d%% completed | %.2fs elapsed | %.2f events/s", message.c_str(), + current, total, static_cast(percent), elapsed, rate); +#else + // For console logging, use \r for in-place updates DC_LOG_PRINT_NO_NEW_LINE("\r%s [%zu/%zu] %d%% completed | %.2fs elapsed | %.2f events/s", message.c_str(), current, total, static_cast(percent), elapsed, rate); +#endif if (current == total) { +#ifndef LOG_TO_FILE + DC_LOG_PRINT(""); // Print newline to finish the progress line +#endif DC_LOG_PRINT("%s done. Total time: %.2fs, Avg rate: %.2f events/s", message.c_str(), elapsed, rate); start_time = steady_clock::now(); // Reset for next progress + last_printed = 0; } } @@ -171,6 +191,16 @@ inline void log_progress(const std::string& message, size_t current) { using namespace std::chrono; static auto start_time = steady_clock::now(); static std::mutex mtx; + static size_t last_printed = 0; + constexpr size_t PRINT_INTERVAL = 10000; // Print every 10K events + + // Only print every PRINT_INTERVAL events + if ((current - last_printed) < PRINT_INTERVAL) { + return; + } + + last_printed = current; + auto now = steady_clock::now(); double elapsed = duration_cast>(now - start_time).count(); double rate = (elapsed > 0.0) ? (current / elapsed) : 0.0; @@ -220,10 +250,17 @@ inline void log_progress(const std::string& message, size_t current) { current_str.resize(current_str.find('.') != std::string::npos ? current_str.find('.') + 3 : current_str.size()); current_str += multiplier; + +#ifdef LOG_TO_FILE + // For file logging, write complete lines without \r to avoid log file bloat + DC_LOG_PRINT("%s [%s events] | %s elapsed | %s events/s", message.c_str(), current_str.c_str(), + elapsed_str, rate_str.c_str()); +#else + // For console logging, use \r for in-place updates DC_LOG_PRINT_NO_NEW_LINE( "\r \r%s [%s events] | %s elapsed | %s events/s ", message.c_str(), current_str.c_str(), elapsed_str, rate_str.c_str()); - // Optionally, print newline if desired when called with a special value +#endif } } // namespace datacrumbs::logging_internal // Progress logging macro diff --git a/src/datacrumbs/common/utils.h b/src/datacrumbs/common/utils.h index 7959050f..b2b37aa8 100644 --- a/src/datacrumbs/common/utils.h +++ b/src/datacrumbs/common/utils.h @@ -150,5 +150,66 @@ class Timer { double elapsed_time; // Accumulated elapsed time in seconds }; +// Function to remove non-UTF8 characters from a string +inline std::string remove_non_utf8(const std::string& input) { + DC_LOG_TRACE("Start remove_non_utf8, input size: %zu", input.size()); + std::string result; + result.reserve(input.size()); + + for (size_t i = 0; i < input.size();) { + unsigned char byte = static_cast(input[i]); + + // Single-byte UTF-8 character (0xxxxxxx) + if (byte <= 0x7F) { + // Only keep characters valid for filenames/paths + if ((byte >= 'A' && byte <= 'Z') || (byte >= 'a' && byte <= 'z') || + (byte >= '0' && byte <= '9') || byte == '_' || byte == '-' || byte == '.' || + byte == '/') { + result += input[i]; + } else { + DC_LOG_DEBUG("Skipping invalid filename character 0x%02X at position %zu", byte, i); + } + i++; + } + // Multi-byte UTF-8 character + else if ((byte & 0xE0) == 0xC0) { // 2-byte (110xxxxx) + if (i + 1 < input.size() && (static_cast(input[i + 1]) & 0xC0) == 0x80) { + result += input.substr(i, 2); + i += 2; + } else { + DC_LOG_DEBUG("Invalid 2-byte UTF-8 sequence at position %zu", i); + i++; + } + } else if ((byte & 0xF0) == 0xE0) { // 3-byte (1110xxxx) + if (i + 2 < input.size() && (static_cast(input[i + 1]) & 0xC0) == 0x80 && + (static_cast(input[i + 2]) & 0xC0) == 0x80) { + result += input.substr(i, 3); + i += 3; + } else { + DC_LOG_DEBUG("Invalid 3-byte UTF-8 sequence at position %zu", i); + i++; + } + } else if ((byte & 0xF8) == 0xF0) { // 4-byte (11110xxx) + if (i + 3 < input.size() && (static_cast(input[i + 1]) & 0xC0) == 0x80 && + (static_cast(input[i + 2]) & 0xC0) == 0x80 && + (static_cast(input[i + 3]) & 0xC0) == 0x80) { + result += input.substr(i, 4); + i += 4; + } else { + DC_LOG_DEBUG("Invalid 4-byte UTF-8 sequence at position %zu", i); + i++; + } + } else { + // Invalid UTF-8 start byte + DC_LOG_DEBUG("Invalid UTF-8 start byte 0x%02X at position %zu", byte, i); + i++; + } + } + + DC_LOG_DEBUG("remove_non_utf8 completed, output size: %zu", result.size()); + DC_LOG_TRACE("End remove_non_utf8"); + return result; +} + } // namespace utils } // namespace datacrumbs \ No newline at end of file diff --git a/src/datacrumbs/composable/CMakeLists.txt.in b/src/datacrumbs/composable/CMakeLists.txt.in index e9b041ac..8c3291b3 100644 --- a/src/datacrumbs/composable/CMakeLists.txt.in +++ b/src/datacrumbs/composable/CMakeLists.txt.in @@ -77,8 +77,47 @@ endforeach() # ------------------------------------------------------------------------------ # Find all dependencies # ------------------------------------------------------------------------------ -set(yaml-cpp_DIR @YAML_CPP_CMAKE_DIR@) -include_dependencies() +# LIBBPF +include_directories(@LIBBPF_INCLUDEDIR@) +link_directories(@LIBBPF_LIBRARY_DIRS@) +set(LIBBPF_VERSION @LIBBPF_VERSION@) +# YAML_CPP +include_directories(@YAML_CPP_INCLUDE_DIR@) +link_directories(@YAML_CPP_LIBRARY_DIR@) +set(yaml-cpp_VERSION @yaml-cpp_VERSION@) +# LLVM +include_directories(@LLVM_INCLUDE_DIRS@) +link_directories(@LLVM_LIBRARY_DIRS@) +set(CLANG_EXECUTABLE @CLANG_EXECUTABLE@) +set(CLANG_VERSION_OUTPUT @CLANG_VERSION_OUTPUT@) +set(LLVM_VERSION @LLVM_VERSION@) +# JSON_C +include_directories(@json-c_INCLUDE_DIR@) +link_directories(@json-c_LIBRARY_DIR@) +set(json-c_CONSIDERED_VERSIONS @json-c_CONSIDERED_VERSIONS@) +# ZLIB +include_directories(@ZLIB_INCLUDE_DIRS@) +link_directories(@ZLIB_LIBRARY_DIRS@) +set(ZLIB_VERSION @ZLIB_VERSION@) +# MPI +include_directories(@MPI_CXX_INCLUDE_DIRS@) +link_directories(@MPI_CXX_LIBRARY_DIR@) +set(MPI_CXX_VERSION @MPI_CXX_VERSION@) +# Dependencies +set(DEPENDENCY_LIB @DEPENDENCY_LIB@) +set(DEPENDENCY_LIBRARY_DIRS @DEPENDENCY_LIBRARY_DIRS@) +set(CMAKE_INSTALL_RPATH "${DEPENDENCY_LIBRARY_DIRS}") +set(CMAKE_BUILD_RPATH "${DEPENDENCY_LIBRARY_DIRS}") + +# print found packages +message(STATUS " - Found libbpf:${LIBBPF_VERSION} at include:${LIBBPF_INCLUDEDIR} lib:${LIBBPF_LIBRARY_DIRS}") +message(STATUS " - Found yaml-cpp:${yaml-cpp_VERSION} at include:${YAML_CPP_INCLUDE_DIR} lib:${YAML_CPP_LIBRARY_DIR}") +message(STATUS " - Found llvm:${LLVM_VERSION} at include:${LLVM_INCLUDE_DIRS} lib:${LLVM_LIBRARY_DIRS} clang:${CLANG_EXECUTABLE}") +message(STATUS " - Found json-c:${json-c_CONSIDERED_VERSIONS} at include:${json-c_INCLUDE_DIR} lib:${json-c_LIBRARY_DIR}") +message(STATUS " - Found zlib:${ZLIB_VERSION} at include:${ZLIB_INCLUDE_DIRS} lib:${ZLIB_LIBRARY_DIRS}") +message(STATUS " - Found mpi:${MPI_CXX_VERSION} at include:${MPI_CXX_INCLUDE_DIRS} lib:${MPI_CXX_LIBRARY_DIR}") +message(STATUS " - DEPENDENCY_LIBRARY_DIRS for RPATH:${DEPENDENCY_LIBRARY_DIRS}") +message(STATUS " - DEPENDENCY_LIB for linking :${DEPENDENCY_LIB}") # ------------------------------------------------------------------------------ # Build composite object file diff --git a/src/datacrumbs/explorer/mechanism/elf_capture.cpp b/src/datacrumbs/explorer/mechanism/elf_capture.cpp index 5364fda5..0d4c3e7c 100644 --- a/src/datacrumbs/explorer/mechanism/elf_capture.cpp +++ b/src/datacrumbs/explorer/mechanism/elf_capture.cpp @@ -93,7 +93,7 @@ std::vector ElfSymbolExtractor::extract_symbols() { if (symbols_map.find(name) == symbols_map.end()) { symbols_map[name] = std::unordered_set(); } - if (!name.empty()) { + if (!name.empty() && name.find(':') == std::string::npos) { char buffer[32]; unsigned long offset = static_cast( syms[j].st_value); // TODO(Hari): Explore if i have to relocate for virtual address diff --git a/src/datacrumbs/server/process/event_processor.cpp b/src/datacrumbs/server/process/event_processor.cpp index 1ab96f9f..2fb9ed8b 100644 --- a/src/datacrumbs/server/process/event_processor.cpp +++ b/src/datacrumbs/server/process/event_processor.cpp @@ -148,9 +148,9 @@ int EventProcessor::handle_event(void* data, size_t data_sz) { DC_LOG_WARN("No category found for event_id %llu", event->event_id); } DC_LOG_TRACE("handle_event: end"); - std::string progress_msg = - "Processed events failed: " + std::to_string(failed_events) + " current:"; - if (configManager_->mpi_rank == 0) DC_LOG_PROGRESS_SINGLE(progress_msg.c_str(), event_index); + // std::string progress_msg = + // "Processed events failed: " + std::to_string(failed_events) + " current:"; + // if (configManager_->mpi_rank == 0) DC_LOG_PROGRESS_SINGLE(progress_msg.c_str(), event_index); return 0; } int EventProcessor::update_filename(const char* filename, unsigned int hash) { @@ -158,9 +158,11 @@ int EventProcessor::update_filename(const char* filename, unsigned int hash) { DC_LOG_DEBUG("Filename %s with hash %u already processed, skipping", filename, hash); return 0; // Skip if already processed } + auto file_str = utils::remove_non_utf8(filename); + processed_hashes_.insert(hash); // Mark this hash as processed auto args = new DataCrumbsArgs(); - args->emplace("value", std::string(filename)); + args->emplace("value", file_str); args->emplace("hash", hash); auto event = new datacrumbs::EventWithId(METADATA_EVENT, event_index.fetch_add(1), 0, 0, 0, 0, 0, args); @@ -170,6 +172,7 @@ int EventProcessor::update_filename(const char* filename, unsigned int hash) { return 0; } int EventProcessor::finalize() { + DC_LOG_PRINT("Collected %d events and failed %d events", event_index.load(), failed_events); auto writer_ = datacrumbs::Singleton::get_instance(); if (writer_) { writer_->finalize(); diff --git a/src/datacrumbs/validator/probe_validator.cpp b/src/datacrumbs/validator/probe_validator.cpp index 8f216bc7..4e2148d2 100644 --- a/src/datacrumbs/validator/probe_validator.cpp +++ b/src/datacrumbs/validator/probe_validator.cpp @@ -10,21 +10,84 @@ #include // Logging header #include // std headers +#include #include +#include #include #include #include #include +#include +#include #include #include #include #include #include #include -#include #include + namespace datacrumbs { + +// Function to pretty print invalid probes categorized by probe name +void prettyPrintInvalidProbes( + const std::unordered_map>& invalid_function_names, + size_t total_probes, size_t invalid_probes) { + std::cout << "\n"; + std::cout << "╔════════════════════════════════════════════════════════════════════════════╗\n"; + std::cout << "║ PROBE VALIDATION SUMMARY ║\n"; + std::cout << "╠════════════════════════════════════════════════════════════════════════════╣\n"; + std::cout << "║ Total Probes: " << std::setw(58) << std::left << total_probes << "║\n"; + std::cout << "║ Invalid Probes: " << std::setw(58) << std::left << invalid_probes << "║\n"; + std::cout << "║ Valid Probes: " << std::setw(58) << std::left << (total_probes - invalid_probes) + << "║\n"; + std::cout << "╚════════════════════════════════════════════════════════════════════════════╝\n"; + + if (invalid_function_names.empty()) { + std::cout << "\n✅ All probes validated successfully!\n\n"; + return; + } + + std::cout << "\n"; + std::cout << "╔════════════════════════════════════════════════════════════════════════════╗\n"; + std::cout << "║ INVALID PROBES BY CATEGORY ║\n"; + std::cout << "╚════════════════════════════════════════════════════════════════════════════╝\n"; + + for (const auto& [category, functions] : invalid_function_names) { + std::cout << "\n┌─ Category: " << category << " (" << functions.size() << " invalid)\n"; + std::cout << "│\n"; + + // Show first 10 invalid functions for each category + size_t max_display = std::min(10, functions.size()); + for (size_t i = 0; i < max_display; ++i) { + std::cout << "│ ✗ " << functions[i] << "\n"; + } + + if (functions.size() > max_display) { + std::cout << "│ ... and " << (functions.size() - max_display) << " more\n"; + } + std::cout << "└─────────────────────────────────────────────────────────────────────────────\n"; + } + + std::cout << "\n"; +} + +// Function to set memory limit to 2GB +bool setMemoryLimit(size_t limit_mb = 2048) { + struct rlimit limit; + limit.rlim_cur = limit_mb * 1024 * 1024; // 2GB in bytes + limit.rlim_max = limit_mb * 1024 * 1024; // 2GB in bytes + + if (setrlimit(RLIMIT_AS, &limit) != 0) { + DC_LOG_ERROR("Failed to set memory limit: %s", strerror(errno)); + return false; + } + + DC_LOG_INFO("Memory limit set to %zu MB", limit_mb); + return true; +} + class ProbeValidator { public: ProbeValidator(int argc, char** argv) { @@ -45,6 +108,16 @@ class ProbeValidator { DC_LOG_ERROR("Failed to read probes file: %s", probesFile.c_str()); return invalid_function_names; } + + // Use RAII wrapper for automatic cleanup + auto json_cleanup = [](struct json_object* ptr) { + if (ptr) { + json_object_put(ptr); + } + }; + std::unique_ptr json_guard(probesJson, + json_cleanup); + int arr_len = json_object_array_length(probesJson); DC_LOG_INFO("[ProbeGenerator] Number of probes: %d", arr_len); struct bpf_program* kprobe_prog = bpf_object__find_program_by_name(skel->obj, "kprobe_test"); @@ -70,12 +143,12 @@ class ProbeValidator { std::atomic atomic_invalid_probes{0}; std::atomic atomic_current_probe{0}; - auto validate_func = [&](const Probe& probe, const std::string& func, - struct json_object* jprobe) { + auto validate_func = [&](const std::string& probe_name, ProbeType probe_type, + const std::string& func, struct json_object* jprobe) { atomic_current_probe++; DC_LOG_PROGRESS("Validating probe", atomic_current_probe.load(), total_probes); bool is_invalid = false; - if (probe.type == ProbeType::KPROBE) { + if (probe_type == ProbeType::KPROBE) { struct bpf_kprobe_opts opts = { .sz = sizeof(struct bpf_kprobe_opts), }; @@ -85,7 +158,7 @@ class ProbeValidator { } else { bpf_link__destroy(link); } - } else if (probe.type == ProbeType::UPROBE) { + } else if (probe_type == ProbeType::UPROBE) { auto uprobe = UProbe::fromJson(jprobe); std::string function_name, offset; auto pos = func.find(':'); @@ -109,7 +182,7 @@ class ProbeValidator { } else { bpf_link__destroy(link); } - } else if (probe.type == ProbeType::SYSCALLS) { + } else if (probe_type == ProbeType::SYSCALLS) { struct bpf_ksyscall_opts opts = { .sz = sizeof(struct bpf_ksyscall_opts), }; @@ -123,7 +196,7 @@ class ProbeValidator { if (is_invalid) { atomic_invalid_probes++; std::lock_guard lock(invalid_mutex); - invalid_function_names[probe.name].push_back(func); + invalid_function_names[probe_name].push_back(func); } }; @@ -134,7 +207,9 @@ class ProbeValidator { std::mutex queue_mutex; std::condition_variable cv; bool done = false; - std::queue> task_queue; + + // Store probe_name, probe_type, function_name, and json_object + std::queue> task_queue; // Producer: enqueue all validation tasks for (int i = 0; i < arr_len; ++i) { @@ -143,7 +218,8 @@ class ProbeValidator { for (size_t func_index = 0; func_index < probe.functions.size(); ++func_index) { const auto& func = probe.functions[func_index]; std::lock_guard lock(queue_mutex); - task_queue.emplace(probe, func, jprobe); + // Store copies of probe.name and probe.type to avoid race conditions + task_queue.emplace(probe.name, probe.type, func, jprobe); } } @@ -151,7 +227,6 @@ class ProbeValidator { for (size_t i = 0; i < num_workers; ++i) { workers.emplace_back([&]() { while (true) { - std::tuple task; { std::unique_lock lock(queue_mutex); cv.wait(lock, [&]() { return !task_queue.empty() || done; }); @@ -161,10 +236,19 @@ class ProbeValidator { else continue; } - // Move declaration and initialization together to avoid default construction - auto task = std::move(task_queue.front()); + // Extract data from the queue with proper copies + auto& front_task = task_queue.front(); + std::string probe_name = std::get<0>(front_task); + ProbeType probe_type = std::get<1>(front_task); + std::string func = std::get<2>(front_task); + struct json_object* jprobe = std::get<3>(front_task); task_queue.pop(); - validate_func(std::get<0>(task), std::get<1>(task), std::get<2>(task)); + + // Release lock before validation (which can be slow) + lock.unlock(); + + // Now validate with copied data + validate_func(probe_name, probe_type, func, jprobe); } } }); @@ -180,6 +264,21 @@ class ProbeValidator { for (auto& t : workers) t.join(); invalid_probes = atomic_invalid_probes.load(); + + // Verify counts match - diagnostic check + size_t total_invalid_stored = 0; + for (const auto& [name, functions] : invalid_function_names) { + total_invalid_stored += functions.size(); + } + + if (total_invalid_stored != invalid_probes) { + DC_LOG_ERROR("Race condition detected! Invalid probes counted: %zu, but stored: %zu", + invalid_probes, total_invalid_stored); + } else { + DC_LOG_INFO("Validation counts verified: %zu invalid probes counted and stored", + invalid_probes); + } + return invalid_function_names; } size_t total_probes() const { return configManager_->category_map.size(); } @@ -191,13 +290,26 @@ class ProbeValidator { } // namespace datacrumbs int main(int argc, char** argv) { + // Set memory limit to 2GB + if (!datacrumbs::setMemoryLimit(2048)) { + DC_LOG_ERROR("Failed to set memory limit, continuing anyway..."); + } + auto configManager_ = datacrumbs::Singleton::get_instance(argc, argv); + struct validator* skel = validator__open_and_load(); if (!skel) { DC_LOG_ERROR("Failed to open and load datacrumbs_validator BPF skeleton"); return 1; } + + // Use RAII for skeleton cleanup + auto skel_cleanup = [](struct validator* s) { + if (s) validator__destroy(s); + }; + std::unique_ptr skel_guard(skel, skel_cleanup); + size_t invalid_probes = 0; try { datacrumbs::ProbeValidator validator(argc, argv); @@ -206,6 +318,10 @@ int main(int argc, char** argv) { invalid_probes = validator.invalid_probes; DC_LOG_INFO("\nProbe validation completed: total_probes=%zu, invalid_probes=%zu", total_probes, invalid_probes); + + // Pretty print the invalid probes categorized by category + datacrumbs::prettyPrintInvalidProbes(invalid_function_names, total_probes, invalid_probes); + struct json_object* invalid_probesJson = json_object_from_file(configManager_->probe_file_path.c_str()); // Iterate over probesJson array, clear functions attribute for all probes, then add invalid @@ -249,10 +365,8 @@ int main(int argc, char** argv) { chmod(configManager_->probe_invalid_file_path.c_str(), 0640); } catch (const std::exception& ex) { DC_LOG_ERROR("Exception: %s", ex.what()); - validator__destroy(skel); return -1; } - validator__destroy(skel); return invalid_probes > 0 ? -1 : 0; } \ No newline at end of file diff --git a/valgrind.supp b/valgrind.supp new file mode 100644 index 00000000..1f6aaa78 --- /dev/null +++ b/valgrind.supp @@ -0,0 +1,34 @@ +# Valgrind suppression file for probe_validator +# This file helps suppress known false positives in BPF/libbpf libraries + +{ + libbpf_allocation + Memcheck:Leak + match-leak-kinds: definite,indirect + ... + fun:*bpf* +} + +{ + json_c_allocation + Memcheck:Leak + match-leak-kinds: definite,indirect + ... + fun:*json* +} + +{ + glibc_dl_allocation + Memcheck:Leak + match-leak-kinds: definite,indirect + ... + fun:_dl_* +} + +{ + pthread_allocation + Memcheck:Leak + match-leak-kinds: definite,indirect + ... + fun:pthread_* +} \ No newline at end of file From e847bfcf7892c9aa8700ad5e323f1ba97eba763b Mon Sep 17 00:00:00 2001 From: Hariharan Devarajan Date: Thu, 13 Nov 2025 12:28:51 -0800 Subject: [PATCH 2/6] Added slurm integration 1. Generalized scheduler implementation to be updated by any user. 2. Specialized implementation for prolog and epilog script for slurm and flux and general. --- .clang-format | 2 +- CMakeLists.txt | 24 + cmake/configure_files/datacrumbs_config.h.in | 2 +- cmake/modules/datacrumbs-utils.cmake | 59 +- docs/slurm_integration.rst | 911 ++++++++++++++++++ etc/datacrumbs/configs/project.env.local.in | 65 +- etc/datacrumbs/systemd/datacrumbs@.service.in | 10 +- scripts/datacrumbs/datacrumbs_compose_run.in | 21 +- .../datacrumbs/datacrumbs_compose_wrapper.in | 5 + scripts/datacrumbs/datacrumbs_logging.in | 40 + scripts/datacrumbs/datacrumbs_run.in | 8 +- scripts/datacrumbs/datacrumbs_salloc.in | 118 +++ .../datacrumbs/datacrumbs_server_run.sh.in | 16 +- .../datacrumbs/datacrumbs_server_stop.sh.in | 10 +- .../datacrumbs_service_common.sh.in | 157 ++- .../datacrumbs/datacrumbs_service_stop.sh.in | 3 +- scripts/datacrumbs/datacrumbs_setup.in | 15 +- scripts/datacrumbs/datacrumbs_utility.in | 87 +- src/datacrumbs/server/process/server.impl.cpp | 60 +- 19 files changed, 1488 insertions(+), 125 deletions(-) mode change 100755 => 100644 CMakeLists.txt create mode 100644 docs/slurm_integration.rst create mode 100755 scripts/datacrumbs/datacrumbs_salloc.in diff --git a/.clang-format b/.clang-format index 7a70325a..1bdfc179 100755 --- a/.clang-format +++ b/.clang-format @@ -4,4 +4,4 @@ ColumnLimit: 100 AllowShortFunctionsOnASingleLine: Inline DerivePointerAlignment: false PointerAlignment: Left -UseTab: Never \ No newline at end of file +UseTab: Never diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 index 77277f42..83c6de7e --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ option(DATACRUMBS_TRACE_ALL_PROCESSES_OPT "Trace all processes" OFF) set(DATACRUMBS_INCLUSION_PATH "NONE" CACHE STRING "Inclusion path for datacrumbs") set(DATACRUMBS_CONFIGURED_TRACE_DIR "/tmp" CACHE STRING "Trace directory for datacrumbs") set(DATACRUMBS_CONFIGURED_LOG_DIR "/tmp" CACHE STRING "Log directory for datacrumbs") +set(DATACRUMBS_CONFIGURED_RUN_DIR "NONE" CACHE STRING "Run directory for datacrumbs") option(DATACRUMBS_BPF_PRINT_ENABLE "Enable BPF print" OFF) set(DATACRUMBS_MODE_STR "TRACE" CACHE STRING "Mode for datacrumbs (TRACE or PROFILE)") @@ -84,6 +85,15 @@ set(DATACRUMBS_SKIP_SMALL_EVENTS_THRESHOLD_NS "1000" CACHE STRING "Threshold in # Profiling Options set(DATACRUMBS_TIME_INTERVAL_NS "1000000" CACHE STRING "Profiling time interval in nanosecond") +# Scheduling Options +set(DATACRUMBS_SCHEDULER_TYPE "FLUX" CACHE STRING "Scheduler type for datacrumbs (FLUX, SLURM, OPENMPI, or NONE)") +set_property(CACHE DATACRUMBS_SCHEDULER_TYPE PROPERTY STRINGS FLUX SLURM OPENMPI NONE) +set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "NONE" CACHE STRING "Scheduler job ID environment variable name") +set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "NONE" CACHE STRING "Scheduler option for setting nodes") +set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "NONE" CACHE STRING "Scheduler option for setting processes per node") +set(DATACRUMBS_SCHEDULER_RUN_CMD "NONE" CACHE STRING "Scheduler run command") +set(DATACRUMBS_SCHEDULER_RUN_EXTRA_ARGS "" CACHE STRING "Scheduler run extra args") + # Other options set(DATACRUMBS_LOG_LEVEL_STR "INFO" CACHE STRING "Log Level for compiling ${UPPER_PROJECT_NAME}") set_property(CACHE DATACRUMBS_LOG_LEVEL_STR PROPERTY STRINGS ERROR WARN INFO DEBUG TRACE) @@ -139,6 +149,11 @@ message(STATUS " - Found kernel headers at: ${DATACRUMBS_KERNEL_HEAD message(STATUS " - DATACRUMBS_KERNEL_UNAME_R: ${DATACRUMBS_KERNEL_UNAME_R}") message(STATUS " - DATACRUMBS_CONFIGURED_TRACE_DIR: ${DATACRUMBS_CONFIGURED_TRACE_DIR}") message(STATUS " - DATACRUMBS_CONFIGURED_LOG_DIR: ${DATACRUMBS_CONFIGURED_LOG_DIR}") +message(STATUS " - DATACRUMBS_SCHEDULER_TYPE: ${DATACRUMBS_SCHEDULER_TYPE}") +message(STATUS " - DATACRUMBS_SCHEDULER_JOBID_ENV_VAR: ${DATACRUMBS_SCHEDULER_JOBID_ENV_VAR}") +message(STATUS " - DATACRUMBS_SCHEDULER_NODES_CMD_OPT: ${DATACRUMBS_SCHEDULER_NODES_CMD_OPT}") +message(STATUS " - DATACRUMBS_SCHEDULER_PPN_CMD_OPT: ${DATACRUMBS_SCHEDULER_PPN_CMD_OPT}") +message(STATUS " - DATACRUMBS_SCHEDULER_RUN_CMD: ${DATACRUMBS_SCHEDULER_RUN_CMD}") if(NOT EXISTS "${DATACRUMBS_CONFIGURED_TRACE_DIR}") message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] DATACRUMBS_CONFIGURED_TRACE_DIR does not exist: ${DATACRUMBS_CONFIGURED_TRACE_DIR}") @@ -775,6 +790,15 @@ install( ${DATACRUMBS_INSTALL_SBINARYDIR} ) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/datacrumbs/datacrumbs_salloc.in ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/datacrumbs_salloc @ONLY) +install( + PROGRAMS + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/datacrumbs_salloc + DESTINATION + ${DATACRUMBS_INSTALL_BINARYDIR} +) + + # Create an empty directory at install time install(CODE "file(MAKE_DIRECTORY \"\${DATACRUMBS_INSTALL_LIBEXEC}/sbin\")") diff --git a/cmake/configure_files/datacrumbs_config.h.in b/cmake/configure_files/datacrumbs_config.h.in index 773491e8..24e361e0 100644 --- a/cmake/configure_files/datacrumbs_config.h.in +++ b/cmake/configure_files/datacrumbs_config.h.in @@ -42,7 +42,7 @@ #cmakedefine DATACRUMBS_CONFIG_PATH "@DATACRUMBS_CONFIG_PATH@" #cmakedefine DATACRUMBS_LOG_DIR "@DATACRUMBS_LOG_DIR@" #cmakedefine DATACRUMBS_DATA_DIR "@DATACRUMBS_DATA_DIR@" -#cmakedefine DATACRUMBS_INSTALL_RUNSTATEDIR "@DATACRUMBS_INSTALL_RUNSTATEDIR@" +#cmakedefine DATACRUMBS_INSTALL_RUNSTATEDIR "@DATACRUMBS_INSTALL_RUNSTATEDIR@/@PROJECT_NAME@" #cmakedefine DATACRUMBS_ENABLE_INCLUSION_PATH @DATACRUMBS_ENABLE_INCLUSION_PATH@ #ifndef DATACRUMBS_ENABLE_INCLUSION_PATH diff --git a/cmake/modules/datacrumbs-utils.cmake b/cmake/modules/datacrumbs-utils.cmake index eb68d0a1..1c86f0fb 100644 --- a/cmake/modules/datacrumbs-utils.cmake +++ b/cmake/modules/datacrumbs-utils.cmake @@ -264,6 +264,59 @@ macro(derive_configurations) endif() set(DATACRUMBS_CMAKE_KERNEL_VERSION "(${KERNEL_VERSION_MAJOR}, ${KERNEL_VERSION_MINOR}, ${KERNEL_VERSION_PATCH})") + + # Set Scheduler options + # Check if scheduler configuration is complete + if((DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE" OR + DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE" OR + DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE" OR + DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE") AND + DATACRUMBS_SCHEDULER_TYPE STREQUAL "NONE") + message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] Incomplete scheduler configuration. Either use a predefined scheduler option by setting DATACRUMBS_SCHEDULER_TYPE, or set all of the following variables: DATACRUMBS_SCHEDULER_ALLOC_CMD, DATACRUMBS_SCHEDULER_JOBID_ENV_VAR, DATACRUMBS_SCHEDULER_NODES_CMD_OPT, DATACRUMBS_SCHEDULER_PPN_CMD_OPT, DATACRUMBS_SCHEDULER_RUN_CMD") + endif() + + if (DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "SLURM_JOB_ID") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "OMPI_COMM_WORLD_RANK") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "FLUX_JOB_ID") + endif() + endif() + + if (DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") + endif() + endif() + + if (DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--ntasks-per-node") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--map-by ppr:") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--tasks-per-node") + endif() + endif() + + if (DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_RUN_CMD "srun") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_RUN_CMD "mpirun") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_RUN_CMD "flux run") + endif() + endif() + + + endmacro(derive_configurations) macro(find_system_details) @@ -463,7 +516,11 @@ macro(load_build_variables) set(DATACRUMBS_INSTALL_ETC_CMAKE ${DATACRUMBS_INSTALL_SYSCONFDIR}/cmake) set(DATACRUMBS_INSTALL_ETC_SYSTEMD ${DATACRUMBS_INSTALL_SYSCONFDIR}/systemd) set(DATACRUMBS_INSTALL_ETC_FLUX ${DATACRUMBS_INSTALL_SYSCONFDIR}/flux) - set(DATACRUMBS_INSTALL_RUNSTATEDIR /${CMAKE_INSTALL_RUNSTATEDIR}) + if (DATACRUMBS_CONFIGURED_RUN_DIR AND NOT DATACRUMBS_CONFIGURED_RUN_DIR STREQUAL "" AND NOT DATACRUMBS_CONFIGURED_RUN_DIR STREQUAL "NONE") + set(DATACRUMBS_INSTALL_RUNSTATEDIR ${DATACRUMBS_CONFIGURED_RUN_DIR}) + else() + set(DATACRUMBS_INSTALL_RUNSTATEDIR /${CMAKE_INSTALL_RUNSTATEDIR}) + endif() # Set this at the top level of your project, before any install commands set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY TRUE) diff --git a/docs/slurm_integration.rst b/docs/slurm_integration.rst new file mode 100644 index 00000000..19b61497 --- /dev/null +++ b/docs/slurm_integration.rst @@ -0,0 +1,911 @@ +============================ +SLURM Scheduler Integration +============================ + +DataCrumbs provides deep integration with the SLURM workload manager for automated tracing in HPC environments. This integration enables transparent tracing of batch jobs through SLURM prolog/epilog scripts, systemd service management, and a custom ``salloc`` wrapper. + +Overview +======== + +The SLURM integration consists of four components: + +1. **Systemd Service**: Manages DataCrumbs server lifecycle +2. **Prolog Script**: Starts DataCrumbs before job execution +3. **Epilog Script**: Stops DataCrumbs after job completion +4. **salloc Wrapper**: Provides command-line options for users via ``datacrumbs_salloc`` + +Benefits +-------- + +* **Automatic Tracing**: Jobs are traced transparently without manual server management +* **Per-Job Isolation**: Each job gets its own tracing session +* **Custom Configurations**: Users can specify composable configurations +* **No Code Changes**: Applications remain unmodified +* **Centralized Management**: Administrators control tracing infrastructure +* **Native SLURM Integration**: Works seamlessly with existing SLURM workflows + +Architecture +============ + +When a SLURM job is submitted with ``datacrumbs_salloc --datacrumbs-enable ``, the following sequence occurs: + +1. **Job Submission Phase**: + + - User runs ``datacrumbs_salloc`` wrapper instead of ``salloc`` + - Wrapper parses DataCrumbs-specific flags + - Job metadata is encoded as JSON in SLURM comment field + - Allocation is submitted to SLURM with embedded DataCrumbs metadata + +2. **Prolog Phase** (before job starts): + + - ``datacrumbs_service_run.sh`` is executed on compute node + - Script parses SLURM job comment to check if tracing is enabled + - Systemd service ``datacrumbs@`` is created and started + - DataCrumbs server begins collecting events + - Job waits for server to be ready + +3. **Execution Phase**: + + - Application runs normally with tracing active + - eBPF probes capture I/O events + - Events are written to trace files + +4. **Epilog Phase** (after job completes): + + - ``datacrumbs_service_stop.sh`` is executed + - Systemd service is stopped and disabled + - Server flushes remaining events + - Trace files are finalized + +Installation Steps +================== + +.. note:: + Installation requires root/administrator privileges on all compute nodes. + +Step 1: Enable SLURM Prolog/Epilog +----------------------------------- + +Edit the SLURM configuration file on the controller node: + +.. code-block:: bash + + # On SLURM controller node + sudo vi /etc/slurm/slurm.conf + +Add or ensure the following configuration: + +.. code-block:: text + + # Enable prolog execution + Prolog=/etc/slurm/prolog.sh + + # Enable epilog execution + Epilog=/etc/slurm/epilog.sh + +.. note:: + Some SLURM configurations may use ``PrologSlurmctld`` and ``EpilogSlurmctld`` for controller-based execution. Adjust based on your site configuration. The prolog.sh and epilog.sh wrapper scripts will call all scripts in their respective .d directories. + +Step 2: Install Systemd Service +-------------------------------- + +Install the DataCrumbs systemd service file on all compute nodes: + +**Service file location:** ``/etc/datacrumbs/systemd/datacrumbs@.service`` + +.. code-block:: bash + + # On each compute node + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create symlink to systemd directory + sudo ln -s ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service \\ + /etc/systemd/system/datacrumbs@.service + + # Reload systemd + sudo systemctl daemon-reload + + # Verify service is recognized + systemctl status datacrumbs@test.service + +**Automated deployment** across multiple nodes: + +.. code-block:: bash + + # Example for compute nodes compute001-compute128 + NODES="compute{001..128}" + + for node in $NODES; do + echo "Installing on $node" + ssh $node "sudo ln -sf ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service /etc/systemd/system/ && sudo systemctl daemon-reload" + done + +Step 3: Create Prolog Wrapper Script +------------------------------------- + +Create a wrapper script that SLURM will call, which in turn executes all scripts in the prolog.d directory: + +.. code-block:: bash + + # On each compute node + sudo tee /etc/slurm/prolog.sh > /dev/null << 'EOF' + #!/bin/bash + # SLURM Prolog wrapper - executes all scripts in prolog.d + + PROLOG_DIR="/etc/slurm/prolog.d" + + if [ -d "$PROLOG_DIR" ]; then + for script in "$PROLOG_DIR"/*; do + if [ -x "$script" ]; then + "$script" + fi + done + fi + EOF + + # Make executable + sudo chmod +x /etc/slurm/prolog.sh + +**Automated deployment:** + +.. code-block:: bash + + NODES="compute{001..128}" + + for node in $NODES; do + echo "Creating prolog wrapper on $node" + ssh $node 'sudo tee /etc/slurm/prolog.sh > /dev/null << '"'"'EOF'"'"' + #!/bin/bash + PROLOG_DIR="/etc/slurm/prolog.d" + if [ -d "$PROLOG_DIR" ]; then + for script in "$PROLOG_DIR"/*; do + if [ -x "$script" ]; then + "$script" + fi + done + fi + EOF + sudo chmod +x /etc/slurm/prolog.sh' + done + +Step 4: Install DataCrumbs Prolog Script +----------------------------------------- + +Install the DataCrumbs prolog script that starts tracing: + +**Script location:** ``/sbin/datacrumbs_service_run.sh`` + +.. code-block:: bash + + # On each compute node + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create prolog.d directory if it doesn't exist + sudo mkdir -p /etc/slurm/prolog.d + + # Symlink DataCrumbs service run script + sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh \\ + /etc/slurm/prolog.d/datacrumbs_service_run.sh + +**Automated deployment:** + +.. code-block:: bash + + NODES="compute{001..128}" + + for node in $NODES; do + echo "Installing DataCrumbs prolog on $node" + ssh $node "sudo mkdir -p /etc/slurm/prolog.d && sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh /etc/slurm/prolog.d/datacrumbs_service_run.sh" + done + +Step 5: Create Epilog Wrapper Script +------------------------------------- + +Create a wrapper script that SLURM will call, which in turn executes all scripts in the epilog.d directory: + +.. code-block:: bash + + # On each compute node + sudo tee /etc/slurm/epilog.sh > /dev/null << 'EOF' + #!/bin/bash + # SLURM Epilog wrapper - executes all scripts in epilog.d + + EPILOG_DIR="/etc/slurm/epilog.d" + + if [ -d "$EPILOG_DIR" ]; then + for script in "$EPILOG_DIR"/*; do + if [ -x "$script" ]; then + "$script" + fi + done + fi + EOF + + # Make executable + sudo chmod +x /etc/slurm/epilog.sh + +**Automated deployment:** + +.. code-block:: bash + + NODES="compute{001..128}" + + for node in $NODES; do + echo "Creating epilog wrapper on $node" + ssh $node 'sudo tee /etc/slurm/epilog.sh > /dev/null << '"'"'EOF'"'"' + #!/bin/bash + EPILOG_DIR="/etc/slurm/epilog.d" + if [ -d "$EPILOG_DIR" ]; then + for script in "$EPILOG_DIR"/*; do + if [ -x "$script" ]; then + "$script" + fi + done + fi + EOF + sudo chmod +x /etc/slurm/epilog.sh' + done + +Step 6: Install DataCrumbs Epilog Script +----------------------------------------- + +Install the DataCrumbs epilog script that stops tracing: + +**Script location:** ``/sbin/datacrumbs_service_stop.sh`` + +.. code-block:: bash + + # On each compute node + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create epilog.d directory if it doesn't exist + sudo mkdir -p /etc/slurm/epilog.d + + # Symlink DataCrumbs service stop script + sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh \\ + /etc/slurm/epilog.d/datacrumbs_service_stop.sh + +**Automated deployment:** + +.. code-block:: bash + + NODES="compute{001..128}" + + for node in $NODES; do + echo "Installing DataCrumbs epilog on $node" + ssh $node "sudo mkdir -p /etc/slurm/epilog.d && sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh /etc/slurm/epilog.d/datacrumbs_service_stop.sh" + done + +Step 7: Install datacrumbs_salloc Wrapper +------------------------------------------ + +The ``datacrumbs_salloc`` wrapper is installed as part of the standard DataCrumbs installation: + +**Wrapper location:** ``/bin/datacrumbs_salloc`` + +Users should add the DataCrumbs bin directory to their PATH: + +.. code-block:: bash + + # Add to user's ~/.bashrc or ~/.bash_profile + export PATH=/path/to/datacrumbs/install/bin:$PATH + +**Verify wrapper installation:** + +.. code-block:: bash + + # Check if wrapper is accessible + which datacrumbs_salloc + + # View wrapper help + datacrumbs_salloc --help + +Step 8: Restart SLURM (if needed) +---------------------------------- + +After modifying ``slurm.conf``, restart SLURM services: + +.. code-block:: bash + + # On controller node + sudo systemctl restart slurmctld + + # On compute nodes (if using slurmd) + sudo systemctl restart slurmd + +If using ``scontrol``, you can reconfigure without full restart: + +.. code-block:: bash + + sudo scontrol reconfigure + +Complete Installation Script +============================= + +Here's a complete script for deploying across multiple nodes: + +.. code-block:: bash + + #!/bin/bash + # deploy_datacrumbs_slurm.sh + + # Configuration + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + NODES="compute{001..128}" + + echo "Deploying DataCrumbs SLURM integration..." + + # Deploy to each node + for node in $(eval echo $NODES); do + echo "==========================================" + echo "Deploying to $node" + echo "==========================================" + + ssh $node << EOF + # Install systemd service + sudo ln -sf ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service \\ + /etc/systemd/system/datacrumbs@.service + sudo systemctl daemon-reload + + # Create SLURM directories + sudo mkdir -p /etc/slurm/prolog.d + sudo mkdir -p /etc/slurm/epilog.d + + # Create prolog wrapper script + sudo tee /etc/slurm/prolog.sh > /dev/null << 'PROLOG_EOF' +#!/bin/bash +PROLOG_DIR="/etc/slurm/prolog.d" +if [ -d "\$PROLOG_DIR" ]; then + for script in "\$PROLOG_DIR"/*; do + if [ -x "\$script" ]; then + "\$script" + fi + done +fi +PROLOG_EOF + sudo chmod +x /etc/slurm/prolog.sh + + # Create epilog wrapper script + sudo tee /etc/slurm/epilog.sh > /dev/null << 'EPILOG_EOF' +#!/bin/bash +EPILOG_DIR="/etc/slurm/epilog.d" +if [ -d "\$EPILOG_DIR" ]; then + for script in "\$EPILOG_DIR"/*; do + if [ -x "\$script" ]; then + "\$script" + fi + done +fi +EPILOG_EOF + sudo chmod +x /etc/slurm/epilog.sh + + # Symlink DataCrumbs prolog script + sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh \\ + /etc/slurm/prolog.d/datacrumbs_service_run.sh + + # Symlink DataCrumbs epilog script + sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh \\ + /etc/slurm/epilog.d/datacrumbs_service_stop.sh + + # Clean old runtime files + sudo rm -rf /tmp/datacrumbs* + sudo rm -rf /var/run/datacrumbs* + + echo "✓ Installation complete on $node" + EOF + done + + echo "" + echo "==========================================" + echo "Deployment complete!" + echo "==========================================" + echo "" + echo "Next steps:" + echo "1. Verify slurm.conf has Prolog=/etc/slurm/prolog.sh and Epilog=/etc/slurm/epilog.sh" + echo "2. Run: sudo scontrol reconfigure (on controller)" + echo "3. Add DataCrumbs bin to user PATH" + echo "4. Test: datacrumbs_salloc --datacrumbs-enable -N 1" + +Usage +===== + +Basic Usage +----------- + +.. important:: + Before tracing, applications must be instrumented using ``datacrumbs_track`` or ``datacrumbs_wrap``. DataCrumbs cannot trace uninstrumented executables. See the main documentation for tracking instructions. + +Use ``datacrumbs_salloc`` wrapper instead of ``salloc`` to enable DataCrumbs: + +.. code-block:: bash + + datacrumbs_salloc --datacrumbs-enable [SLURM_OPTIONS] + +Example: + +.. code-block:: bash + + # Single node allocation + datacrumbs_salloc --datacrumbs-enable -N 1 + + # Multi-node allocation + datacrumbs_salloc --datacrumbs-enable -N 4 -n 32 + + # With time limit and partition + datacrumbs_salloc --datacrumbs-enable -N 2 -t 1:00:00 -p compute + +With Custom Composable Configuration +------------------------------------- + +Specify a custom composable configuration: + +.. code-block:: bash + + datacrumbs_salloc --datacrumbs-enable --datacrumbs-composite=CONFIG_NAME [SLURM_OPTIONS] + +Example: + +.. code-block:: bash + + # Use POSIX I/O configuration + datacrumbs_salloc --datacrumbs-enable --datacrumbs-composite=posix_io -N 4 + + # Use HDF5 configuration + datacrumbs_salloc --datacrumbs-enable --datacrumbs-composite=hdf5_only -N 2 + + # Use MPI-IO configuration + datacrumbs_salloc --datacrumbs-enable --datacrumbs-composite=mpiio_only -N 8 + +Running Jobs in Allocation +--------------------------- + +Once you have an allocation with DataCrumbs enabled, run your applications normally: + +.. code-block:: bash + + # Get allocation with tracing + datacrumbs_salloc --datacrumbs-enable -N 4 + + # Inside allocation, run jobs + srun -N 4 -n 32 ./myapp + + # MPI application + srun -N 4 -n 64 ./parallel_simulation + + # Exit allocation when done + exit + +Using with sbatch +----------------- + +For batch jobs, you need to set the job comment manually in your batch script: + +.. code-block:: bash + + #!/bin/bash + #SBATCH -N 4 + #SBATCH -n 32 + #SBATCH -t 1:00:00 + #SBATCH --comment='{"datacrumbs": {"enable": "yes", "composite": "posix_io"}}' + + # Your application + srun ./myapp + +.. note:: + The ``--comment`` flag must contain valid JSON with the DataCrumbs metadata. The wrapper handles this automatically for interactive allocations. + +Command Reference +================= + +datacrumbs_salloc Options +-------------------------- + +``--datacrumbs-enable`` + Enable DataCrumbs tracing for the allocation + + - Default: disabled + - No argument required + - Must be specified to activate tracing + +``--datacrumbs-composite=NAME`` + Specify custom composable configuration + + - Requires ``--datacrumbs-enable`` + - NAME must be alphanumeric and underscores only + - Composable must exist (created with ``datacrumbs_compose``) + - If not specified, uses default configuration + +.. warning:: + The ``--comment`` flag is reserved for internal use by the wrapper and cannot be used directly. + +Examples +======== + +Example 1: Interactive Job with Tracing +---------------------------------------- + +.. code-block:: bash + + # Get allocation with tracing + datacrumbs_salloc --datacrumbs-enable -N 1 + + # Run I/O benchmark + srun dd if=/dev/zero of=/tmp/test bs=1M count=100 + + # Check traces (will be available after epilog) + exit + +Example 2: Multi-Node MPI Application +-------------------------------------- + +.. code-block:: bash + + # Get allocation with tracing + datacrumbs_salloc --datacrumbs-enable -N 8 -n 64 + + # Run MPI application + srun -N 8 -n 64 ./parallel_simulation input.dat + + # Exit when done + exit + +Example 3: Custom Configuration for HDF5 +----------------------------------------- + +.. code-block:: bash + + # First, create HDF5-specific configuration (one-time, as root/admin) + sudo datacrumbs_compose --action compose \\ + --name hdf5_workflow \\ + --probes H5Fopen,H5Fclose,H5Dcreate,H5Dopen,H5Dclose,H5Dread,H5Dwrite + + # Get allocation with custom config + datacrumbs_salloc --datacrumbs-enable --datacrumbs-composite=hdf5_workflow -N 4 + + # Run HDF5 application + srun -N 4 -n 32 ./hdf5_analysis dataset.h5 + + # Exit + exit + +Example 4: Batch Job with Tracing +---------------------------------- + +Create a batch script ``job.sbatch``: + +.. code-block:: bash + + #!/bin/bash + #SBATCH -J datacrumbs_test + #SBATCH -N 4 + #SBATCH -n 32 + #SBATCH -t 1:00:00 + #SBATCH -p compute + #SBATCH --comment='{"datacrumbs": {"enable": "yes", "composite": "NONE"}}' + + module load ior + + # Run IOR benchmark + srun -N 4 -n 32 ior -t 1m -b 16m -F -o /scratch/testfile + +Submit the job: + +.. code-block:: bash + + sbatch job.sbatch + +Trace File Location +=================== + +Traces are saved to the configured trace directory in **DFTracer format** (``.pfw.gz``). + +**Trace Directory Pattern**: + +According to the ``trace_dir_pattern`` in the project configuration: + +.. code-block:: bash + + # Default pattern: /path/to/traces/%YY%/%MM%/%DD% + # For job on 2025-12-03: + /path/to/traces/25/12/03/ + +**Trace File Naming**: + +.. code-block:: text + + # Without MPI: + trace----.pfw.gz + + # With MPI: + trace-----.pfw.gz + +**Example**: + +.. code-block:: bash + + # Single node job (SLURM_JOB_ID=12345) + /path/to/traces/25/12/03/trace-haridev-12345-node01-lead.pfw.gz + + # Multi-rank MPI job (4 ranks, SLURM_JOB_ID=67890) + /path/to/traces/25/12/03/trace-haridev-67890-0-4-lead.pfw.gz + /path/to/traces/25/12/03/trace-haridev-67890-1-4-lead.pfw.gz + /path/to/traces/25/12/03/trace-haridev-67890-2-4-lead.pfw.gz + /path/to/traces/25/12/03/trace-haridev-67890-3-4-lead.pfw.gz + +Find traces for a specific job: + +.. code-block:: bash + + # Set job ID + JOBID=12345 + + # Find trace files + find $DATACRUMBS_TRACE_DIR -name "trace-*-${JOBID}-*.pfw.gz" + + # List all traces from today + ls -lh $DATACRUMBS_TRACE_DIR/$(date +%y/%m/%d)/trace-*.pfw.gz + +Monitoring and Debugging +========================= + +Check Service Status +-------------------- + +.. code-block:: bash + + # Check if service is running for a job + JOBID= + systemctl status datacrumbs@${JOBID}.service + + # View service logs + sudo journalctl -u datacrumbs@${JOBID}.service -f + +Check Prolog/Epilog Execution +------------------------------ + +.. code-block:: bash + + # View SLURM logs + sudo tail -f /var/log/slurm/slurmctld.log + + # Check job info + scontrol show job + + # View job comment (contains DataCrumbs metadata) + scontrol show job | grep Comment + +Check Job Comment +----------------- + +.. code-block:: bash + + # View DataCrumbs metadata in job comment + JOBID= + scontrol show job $JOBID | grep Comment | awk -F'=' '{print $2}' | jq . + +Debug Mode +---------- + +Enable verbose output in prolog/epilog scripts: + +.. code-block:: bash + + # Edit prolog script + sudo vi /etc/slurm/prolog.d/datacrumbs_service_run.sh + + # Add at the beginning: + export DATACRUMBS_VERBOSE=1 + +Troubleshooting +=============== + +Job Hangs at Prolog +-------------------- + +**Symptom**: Job hangs during prolog execution + +**Cause**: DataCrumbs server failed to start + +**Solution**: + +.. code-block:: bash + + # Check systemd service + sudo journalctl -u "datacrumbs@*" --no-pager + + # Check for permission issues + ls -la /var/run/datacrumbs/ + + # Verify server binary exists + ls -la $DATACRUMBS_INSTALL/sbin/datacrumbs + + # Check prolog script execution + sudo tail -f /var/log/slurm/slurmctld.log + +Composable Not Found +-------------------- + +**Symptom**: Error about missing composable configuration + +**Cause**: Specified composable doesn't exist + +**Solution**: + +.. code-block:: bash + + # List available composables + ls $PREFIX/libexec/datacrumbs/sbin/$USER/ + + # Create if missing + sudo datacrumbs_compose --action compose --name --probes + +No Traces Generated +------------------- + +**Symptom**: Job completes but no trace files (``.pfw.gz``) created + +**Cause**: Multiple possible causes + +**Solution**: + +.. code-block:: bash + + # Verify job comment was set correctly + scontrol show job | grep Comment + + # Should show: Comment={"datacrumbs": {"enable": "yes", ...}} + + # Check if trace files exist + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + + # Check trace directory permissions + ls -la $DATACRUMBS_TRACE_DIR + + # Verify application was instrumented + # Applications MUST be tracked or wrapped before tracing works + ldd ./myapp | grep datacrumbs + + # Check service logs + sudo journalctl -u "datacrumbs@*" --since "1 hour ago" + + # Verify eBPF support + ls /sys/kernel/btf/vmlinux + +Wrapper Not Found +----------------- + +**Symptom**: ``datacrumbs_salloc: command not found`` + +**Cause**: DataCrumbs bin directory not in PATH + +**Solution**: + +.. code-block:: bash + + # Add to PATH temporarily + export PATH=/path/to/datacrumbs/install/bin:$PATH + + # Add to ~/.bashrc for persistence + echo 'export PATH=/path/to/datacrumbs/install/bin:$PATH' >> ~/.bashrc + source ~/.bashrc + +Invalid JSON in Comment +----------------------- + +**Symptom**: Job fails with JSON parsing error + +**Cause**: Malformed JSON in ``--comment`` field (when using sbatch) + +**Solution**: + +.. code-block:: bash + + # Validate JSON format + echo '{"datacrumbs": {"enable": "yes", "composite": "NONE"}}' | jq . + + # Use single quotes around comment in sbatch script + #SBATCH --comment='{"datacrumbs": {"enable": "yes", "composite": "NONE"}}' + +Service Won't Stop +------------------ + +**Symptom**: Epilog fails, service remains running + +**Cause**: Server process not responding + +**Solution**: + +.. code-block:: bash + + # Manually stop service + JOBID= + sudo systemctl stop datacrumbs@${JOBID}.service + + # Force kill if needed + sudo pkill -f "datacrumbs.*${JOBID}" + + # Clean up runtime files + sudo rm -rf /var/run/datacrumbs/*${JOBID}* + +Best Practices +============== + +1. **Test First**: Test integration on a single node before cluster-wide deployment +2. **Monitor Overhead**: Check that tracing overhead is acceptable for your workloads +3. **Use Composables**: Create workload-specific configurations to minimize overhead +4. **Regular Cleanup**: Periodically clean old trace files to manage disk usage +5. **Log Rotation**: Configure log rotation for DataCrumbs and systemd logs +6. **Resource Limits**: Set appropriate ulimits in systemd service file +7. **Documentation**: Document custom composables and their use cases +8. **User Training**: Educate users on when and how to use ``datacrumbs_salloc`` +9. **Disk Space**: Ensure adequate space for trace files +10. **Backup Configs**: Keep backups of configuration files and composables +11. **PATH Setup**: Document PATH requirements for users in site documentation +12. **JSON Validation**: Validate JSON when manually setting comments in batch scripts + +Advanced Configuration +====================== + +Customizing Systemd Service +---------------------------- + +Edit the systemd service file to adjust timeouts, resources, etc.: + +.. code-block:: ini + + # /etc/systemd/system/datacrumbs@.service + [Unit] + Description=DataCrumbs I/O Tracer for Job %i + + [Service] + Type=forking + User=root + EnvironmentFile=/var/run/datacrumbs/datacrumbs-%i.env + ExecStart=/path/to/datacrumbs/sbin/datacrumbs ... + TimeoutStartSec=120s + TimeoutStopSec=60s + LimitNOFILE=1048576 + LimitMEMLOCK=infinity + +Per-User Trace Directories +--------------------------- + +Configure per-user trace directories in the project configuration: + +.. code-block:: yaml + + # project.yaml + trace: + dir_pattern: /scratch/${USER}/traces/%YY%/%MM%/%DD% + +Resource Quotas +--------------- + +Limit trace file size and count per user (filesystem-dependent): + +.. code-block:: bash + + # Example with XFS quotas + xfs_quota -x -c 'limit -u bsoft=100g bhard=120g $USER' /scratch + +Conditional Tracing +------------------- + +Enable tracing only for specific user groups or applications (modify prolog script): + +.. code-block:: bash + + # In datacrumbs_service_run.sh + # Only trace for specific users + if [[ ! " user1 user2 user3 " =~ " $SLURM_JOB_USER " ]]; then + exit 0 # Skip tracing + fi + +See Also +======== + +* :doc:`composability` - Creating custom composable configurations +* :doc:`deployment` - General deployment guidelines +* :doc:`usage` - DataCrumbs usage and configuration + +For additional support or questions about SLURM integration, consult your system administrator or refer to the DataCrumbs GitHub repository. diff --git a/etc/datacrumbs/configs/project.env.local.in b/etc/datacrumbs/configs/project.env.local.in index 7886148f..b68d6a0f 100644 --- a/etc/datacrumbs/configs/project.env.local.in +++ b/etc/datacrumbs/configs/project.env.local.in @@ -1,7 +1,12 @@ +# Version export DATACRUMBS_VERSION=@DATACRUMBS_RELEASE_VERSION_STRING@ readonly DATACRUMBS_VERSION + +# Library export DATACRUMBS_LIB_VERSION=@DATACRUMBS_PACKAGE_VERSION@ readonly DATACRUMBS_LIB_VERSION + +# Install export DATACRUMBS_INSTALL_HOST=@DATACRUMBS_HOST@ readonly DATACRUMBS_INSTALL_HOST export DATACRUMBS_INSTALL_USER=@DATACRUMBS_INSTALL_USER@ @@ -28,31 +33,61 @@ export DATACRUMBS_INSTALL_PROBE_OBJECTS_DIR=${DATACRUMBS_INSTALL_LIBEXEC_DIR}/ob readonly DATACRUMBS_INSTALL_PROBE_OBJECTS_DIR export DATACRUMBS_INSTALL_COMPOSABLE_DIR=${DATACRUMBS_INSTALL_LIBEXEC_DIR}/composable readonly DATACRUMBS_INSTALL_COMPOSABLE_DIR +export DATACRUMBS_INSTALL_COMPOSE_BIN=${DATACRUMBS_INSTALL_LIBEXEC_DIR}/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_INSTALL_USER} +readonly DATACRUMBS_INSTALL_COMPOSE_BIN +export DATACRUMBS_INSTALL_RUNSTATEDIR=@DATACRUMBS_INSTALL_RUNSTATEDIR@ +readonly DATACRUMBS_INSTALL_RUNSTATEDIR + +# Client export DATACRUMBS_CLIENT_LIB=${DATACRUMBS_INSTALL_LIB_DIR}/libdatacrumbs_client.so readonly DATACRUMBS_CLIENT_LIB export DATACRUMBS_CLIENT_BIN=${DATACRUMBS_INSTALL_LIBEXEC_DIR}/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_USER} readonly DATACRUMBS_CLIENT_BIN + +# Trace export DATACRUMBS_TRACE_DIR_PATTERN=@DATACRUMBS_CONFIGURED_TRACE_DIR@/%YY%/%MM%/%DD% readonly DATACRUMBS_TRACE_DIR_PATTERN -export DATACRUMBS_LOG_DIR=@DATACRUMBS_CONFIGURED_LOG_DIR@ -readonly DATACRUMBS_LOG_DIR + +# Job +export DATACRUMBS_JOB_SCHEDULER=@DATACRUMBS_SCHEDULER_TYPE@ +readonly DATACRUMBS_JOB_SCHEDULER +export DATACRUMBS_JOB_RUN=@DATACRUMBS_SCHEDULER_RUN_CMD@ +readonly DATACRUMBS_JOB_RUN +export DATACRUMBS_JOB_NODE_FLAG=@DATACRUMBS_SCHEDULER_NODES_CMD_OPT@ +readonly DATACRUMBS_JOB_NODE_FLAG +export DATACRUMBS_JOB_PPN_FLAG=@DATACRUMBS_SCHEDULER_PPN_CMD_OPT@ +readonly DATACRUMBS_JOB_PPN_FLAG +export DATACRUMBS_JOB_OTHER_FLAGS=@DATACRUMBS_SCHEDULER_RUN_EXTRA_ARGS@ +readonly DATACRUMBS_JOB_OTHER_FLAGS +export DATACRUMBS_JOB_ID_VAR=@DATACRUMBS_SCHEDULER_JOBID_ENV_VAR@ +readonly DATACRUMBS_JOB_ID_VAR + +# Server export DATACRUMBS_SERVER_LOAD_TIMEOUT=${DATACRUMBS_SERVER_TIMEOUT_USER:-600} readonly DATACRUMBS_SERVER_LOAD_TIMEOUT -export DATACRUMBS_SERVER_PID_FILE=@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs.pid +export DATACRUMBS_SERVER_RUN_DIR=@DATACRUMBS_INSTALL_RUNSTATEDIR@/@PROJECT_NAME@ +readonly DATACRUMBS_SERVER_RUN_DIR +export DATACRUMBS_SERVER_RUN_ID_FILE=${DATACRUMBS_SERVER_RUN_DIR}/datacrumbs.runid +readonly DATACRUMBS_SERVER_RUN_ID_FILE +export DATACRUMBS_SERVER_RUN_ID=$(if [ "${!DATACRUMBS_JOB_ID_VAR}" == "" ]; then if [[ -f "${DATACRUMBS_SERVER_RUN_ID_FILE}" ]]; then cat "$DATACRUMBS_SERVER_RUN_ID_FILE" 2>/dev/null; else echo $(date +"%Y%m%d%H%M%S"); fi else echo ${!DATACRUMBS_JOB_ID_VAR}; fi) +readonly DATACRUMBS_SERVER_RUN_ID +export DATACRUMBS_SERVER_PID_FILE=${DATACRUMBS_SERVER_RUN_DIR}/datacrumbs-${DATACRUMBS_SERVER_RUN_ID}.pid readonly DATACRUMBS_SERVER_PID_FILE -export DATACRUMBS_SERVER_RUNID_FILE=@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs.runid -readonly DATACRUMBS_SERVER_RUNID_FILE +export DATACRUMBS_SERVER_SYSTEMD_PID_FILE=${DATACRUMBS_SERVER_RUN_DIR}/datacrumbs-systemd-${DATACRUMBS_SERVER_RUN_ID}.pid +readonly DATACRUMBS_SERVER_SYSTEMD_PID_FILE +export DATACRUMBS_SERVER_READY_FILE=${DATACRUMBS_SERVER_RUN_DIR}/datacrumbs-${DATACRUMBS_SERVER_RUN_ID}.ready +readonly DATACRUMBS_SERVER_READY_FILE +export DATACRUMBS_SERVER_STATUS_FILE=${DATACRUMBS_SERVER_RUN_DIR}/datacrumbs-${DATACRUMBS_SERVER_RUN_ID}.json +readonly DATACRUMBS_SERVER_STATUS_FILE +export DATACRUMBS_SERVER_ENV_FILE=${DATACRUMBS_SERVER_RUN_DIR}/datacrumbs-${DATACRUMBS_SERVER_RUN_ID}.env +readonly DATACRUMBS_SERVER_ENV_FILE export DATACRUMBS_SERVER_MODULE=0 readonly DATACRUMBS_SERVER_MODULE export DATACRUMBS_SERVER_PREAMBLE= readonly DATACRUMBS_SERVER_PREAMBLE -export DATACRUMBS_JOB_RUN=flux run -readonly DATACRUMBS_JOB_RUN -export DATACRUMBS_JOB_NODE_FLAG=-N -readonly DATACRUMBS_JOB_NODE_FLAG -export DATACRUMBS_JOB_PPN_FLAG=--tasks-per-node -readonly DATACRUMBS_JOB_PPN_FLAG -export DATACRUMBS_JOB_OTHER_FLAGS= -readonly DATACRUMBS_JOB_OTHER_FLAGS -export DATACRUMBS_JOB_ID_VAR=FLUX_JOB_ID -readonly DATACRUMBS_JOB_ID_VAR + +# Log +export DATACRUMBS_LOG_DIR=@DATACRUMBS_CONFIGURED_LOG_DIR@ +readonly DATACRUMBS_LOG_DIR +export DATACRUMBS_LOG_FILE=${DATACRUMBS_LOG_DIR}/datacrumbs_${DATACRUMBS_USER}_${DATACRUMBS_SERVER_RUN_ID}.log +readonly DATACRUMBS_LOG_FILE \ No newline at end of file diff --git a/etc/datacrumbs/systemd/datacrumbs@.service.in b/etc/datacrumbs/systemd/datacrumbs@.service.in index 658ae80e..36d5ea40 100644 --- a/etc/datacrumbs/systemd/datacrumbs@.service.in +++ b/etc/datacrumbs/systemd/datacrumbs@.service.in @@ -4,15 +4,17 @@ After=network.target [Service] Type=forking -ExecStart=@DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_server_run.sh --verbose --composite-name %i -ExecStop=@DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_server_stop.sh --verbose --composite-name %i +ExecStart=@DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_server_run.sh --verbose +ExecStop=@DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_server_stop.sh --verbose User=root # Optional: RemainAfterExit=no -PIDFile=/run/datacrumbs.pid +# Copy PIDFile path to project yaml +PIDFile=@DATACRUMBS_INSTALL_RUNSTATEDIR@/@PROJECT_NAME@/datacrumbs-systemd-%i.pid TimeoutStartSec=10min TimeoutStopSec=5min -EnvironmentFile=/run/datacrumbs.env +# Copy ENVFile path to project yaml +EnvironmentFile=@DATACRUMBS_INSTALL_RUNSTATEDIR@/@PROJECT_NAME@/datacrumbs-%i.env [Install] WantedBy=multi-user.target \ No newline at end of file diff --git a/scripts/datacrumbs/datacrumbs_compose_run.in b/scripts/datacrumbs/datacrumbs_compose_run.in index 0de03bbb..186087a5 100755 --- a/scripts/datacrumbs/datacrumbs_compose_run.in +++ b/scripts/datacrumbs/datacrumbs_compose_run.in @@ -15,7 +15,7 @@ source "$SCRIPT_DIR/datacrumbs_args" # Initialize argument parser for this script dc_args_init "DATACRUMBS_COMPOSE_RUN" -dc_args_add_option "DATACRUMBS_COMPOSE_RUN" "composite_name" "MANDATORY" "Composable name" "string" +dc_args_add_option "DATACRUMBS_COMPOSE_RUN" "composite_name" "MANDATORY" "Composable name" "string" "${DATACRUMBS_COMPOSABLE_NAME}" dc_args_add_option "DATACRUMBS_COMPOSE_RUN" "app" "MANDATORY" "App command" "string" dc_args_add_option "DATACRUMBS_COMPOSE_RUN" "enable_mpi" "OPTIONAL" "switch to enable MPI" "bool" "0" dc_args_add_option "DATACRUMBS_COMPOSE_RUN" "nodes" "OPTIONAL" "Set number of nodes" "int" "1" @@ -40,7 +40,7 @@ export DATACRUMBS_JOB_ENABLE_MPI=${DATACRUMBS_COMPOSE_RUN_ENABLE_MPI:-0} export DATACRUMBS_JOB_NODES=${DATACRUMBS_COMPOSE_RUN_NODES:-1} export DATACRUMBS_JOB_PPN=${DATACRUMBS_COMPOSE_RUN_PPN:-1} -if [[ -z "$DATACRUMBS_COMPOSABLE_NAME" ]]; then +if [[ -z "$DATACRUMBS_COMPOSABLE_NAME" || "$DATACRUMBS_COMPOSABLE_NAME" == "NONE" ]]; then echo "Error: COMPOSITE_NAME argument is required." show_help exit 1 @@ -52,6 +52,11 @@ if [[ -z "${DATACRUMBS_COMPOSE_RUN_APP}" ]]; then exit 1 fi +if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then + error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" + exit 1 +fi + # Convert APP_CMD string into array, splitting on spaces read -ra APP_CMD <<< "${DATACRUMBS_COMPOSE_RUN_APP}" @@ -66,15 +71,15 @@ if [[ -z "$DRY_RUN" ]]; then datacrumbs_init "$DATACRUMBS_USER" "$DATACRUMBS_TRACE_DIR" fi -RUNID=${!DATACRUMBS_JOB_ID_VAR} -RUNID=${RUNID:-1000} -DATACRUMBS_LOG_FILE=${DATACRUMBS_LOG_DIR}/datacrumbs_${DATACRUMBS_USER}_${RUNID}.log -READY_FILE="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_${RUNID}.ready" -debug "RUNID: $RUNID" +debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" -debug "READY_FILE: $READY_FILE" +debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" + + + + exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSABLE_NAME}") debug "Starting datacrumbs server with exec: ${exec[*]}" datacrumbs_start_server "${exec[*]}" diff --git a/scripts/datacrumbs/datacrumbs_compose_wrapper.in b/scripts/datacrumbs/datacrumbs_compose_wrapper.in index a4cac7ac..0046d6ac 100755 --- a/scripts/datacrumbs/datacrumbs_compose_wrapper.in +++ b/scripts/datacrumbs/datacrumbs_compose_wrapper.in @@ -12,4 +12,9 @@ check_sudo_user DATACRUMBS_COMPOSABLE_NAME=$1 shift +if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then + error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" + exit 1 +fi + ${DATACRUMBS_CLIENT_BIN}/datacrumbs_${DATACRUMBS_COMPOSABLE_NAME} $@ \ No newline at end of file diff --git a/scripts/datacrumbs/datacrumbs_logging.in b/scripts/datacrumbs/datacrumbs_logging.in index ca34d473..87bcaf8a 100755 --- a/scripts/datacrumbs/datacrumbs_logging.in +++ b/scripts/datacrumbs/datacrumbs_logging.in @@ -27,3 +27,43 @@ warn() { printf "\n" >&2 fi } + +log_system() { + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi +} + +log_user() { + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + flux job raise --severity=7 ${FLUX_JOB_ID} "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi +} + +warn_user() { + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + flux job raise --severity=1 ${FLUX_JOB_ID} "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[WARN $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi +} + +error_user() { + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + flux job raise --severity=1 ${FLUX_JOB_ID} "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi +} diff --git a/scripts/datacrumbs/datacrumbs_run.in b/scripts/datacrumbs/datacrumbs_run.in index 9c22eff2..406dd7b0 100755 --- a/scripts/datacrumbs/datacrumbs_run.in +++ b/scripts/datacrumbs/datacrumbs_run.in @@ -49,15 +49,11 @@ check_regular_user -RUNID=${!DATACRUMBS_JOB_ID_VAR} -RUNID=${RUNID:-1000} -DATACRUMBS_LOG_FILE=${DATACRUMBS_LOG_DIR}/datacrumbs_${DATACRUMBS_USER}_${RUNID}.log -READY_FILE="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_${RUNID}.ready" -debug "RUNID: $RUNID" +debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" -debug "READY_FILE: $READY_FILE" +debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" datacrumbs_init $DATACRUMBS_USER $DATACRUMBS_TRACE_DIR diff --git a/scripts/datacrumbs/datacrumbs_salloc.in b/scripts/datacrumbs/datacrumbs_salloc.in new file mode 100755 index 00000000..83bff2d4 --- /dev/null +++ b/scripts/datacrumbs/datacrumbs_salloc.in @@ -0,0 +1,118 @@ +#!/bin/bash + + +function usage() { + echo "Usage: $0 [SLURM_OPTIONS] [--datacrumbs-composite NAME]" + echo "" + echo "Datacrumbs salloc wrapper - adds datacrumbs metadata to enable Datacrumbs" + echo "" + echo "DATACRUMBS-SPECIFIC OPTIONS:" + echo " --datacrumbs-composite NAME Set a custom name for job tracking" + echo " (default: NONE)" + echo " --datacrumbs-enable Enable datacrumbs tracking" + echo "" + echo "NOTE" + echo " * The --comment flag is reserved for internal use" + echo "" + echo "EXAMPLES:" + echo " $0 -N 2 -p compute" + echo " $0 --datacrumbs-enable --datacrumbs-composite xfs_pagecache -N 1" + echo " $0 --datacrumbs-enable -t 1:00:00" + echo "" + echo "For comprehensive SLURM options, run: salloc -h" + exit 1 +} + +source @DATACRUMBS_INSTALL_BINARYDIR@/datacrumbs_setup + +DATACRUMBS_DRY_RUN=${DATACRUMBS_INPUT_DRY_RUN:-"no"} +if [[ ${DATACRUMBS_DRY_RUN} == "yes" ]]; then + warn_user "Dry run enabled" +fi + +# NOTE: must maintain a set of salloc to handle differently +# SALLOC_FLAGS=( comment: h help: ) +# NOTE: This is a placeholder to automatically generate the flag parsing +# right now it just keeps track of which flags to handle internally +# we probably don't need the getopt parsing since we are not overriding any salloc flags +# DATACRUMBS_FLAGS=(datacrumbs-composite datacrumbs-enable) +# EXCEPTION_FLAGS=(comment) +# SHORT_FLAG=$(printf '%s' "${SALLOC_FLAGS[@]//*:/}") +# LONG_FLAG=$( +# IFS=, +# echo "${SALLOC_FLAGS[*]}" ) +# PARSED=$(getopt -o "${SHORT_FLAG}" -l "${LONG_FLAG}" -n "$0" -- "$@") +# [[ $? -ne 0 ]] && echo "Parsing flags error " && exit 1 +# eval set -- "$PARSED" + +DATACRUMBS_ARGS=() +unset USER_COMMENT USER_COMPOSE +USER_ENABLE="no" +USER_COMPOSE=$(get_default_datacrumbs_composite_name) + +while [[ $# -gt 0 ]]; do + case "$1" in + # NOTE: have to manually add for each exception flag + --comment) + error "The system has disabled comments feature" + exit 1 + ;; + # NOTE: have to manually add for each internal flag + --datacrumbs-composite) + USER_COMPOSE=$2 + shift 2 + ;; + # NOTE: have to manually add for each internal flag + --datacrumbs-enable) + USER_ENABLE="yes" + shift 1 + ;; + --) + shift + break + ;; + -h | --help) usage ;; + *) + DATACRUMBS_ARGS+=("$1") + shift + ;; + esac +done +DATACRUMBS_ARGS+=("$@") + +if [[ -n "${USER_COMPOSE}" ]] && [[ "${USER_COMPOSE}" != "NONE" ]] && ! validate_datacrumbs_composite_name "${USER_COMPOSE}"; then + error "Not a valid datacrumbs composite name: ${USER_COMPOSE}" + exit 1 +fi + +USER_COMPOSE="${USER_COMPOSE// /}" +if [[ -z "${USER_COMPOSE}" ]]; then + USER_COMPOSE=$(get_default_datacrumbs_composite_name) +fi + +DATACRUMBS_COMPOSABLE_NAME="${USER_COMPOSE}" +DATACRUMBS_ENABLED="${USER_ENABLE}" + +DATACRUMBS_INPUTS=$(jq -n -c \ + --arg enable "${DATACRUMBS_ENABLED}" \ + --arg composite "${DATACRUMBS_COMPOSABLE_NAME}" \ + '{datacrumbs: {enable: $enable, composite: $composite}}') +# INFO: Validating JSON +echo "${DATACRUMBS_INPUTS}" | jq . || { + error "Invalid JSON: ${DATACRUMBS_INPUTS}" + exit 1 +} + +# INFO: Add the datacrumbs metadata as a comment +DATACRUMBS_ARGS+=(--comment "${DATACRUMBS_INPUTS}") + +info "Datacrumbs inputs: ${DATACRUMBS_INPUTS}" +info "Datacrumbs args: ${DATACRUMBS_ARGS[*]}" +if [[ ${DATACRUMBS_DRY_RUN} == "yes" ]]; then + info "Dry run enabled, exiting before salloc" + info "salloc ${DATACRUMBS_ARGS[*]}" + exit 0 +fi + +info "salloc ${DATACRUMBS_ARGS[*]}" +exec salloc "${DATACRUMBS_ARGS[@]}" diff --git a/scripts/datacrumbs/datacrumbs_server_run.sh.in b/scripts/datacrumbs/datacrumbs_server_run.sh.in index 43fd2c1c..8c589e11 100755 --- a/scripts/datacrumbs/datacrumbs_server_run.sh.in +++ b/scripts/datacrumbs/datacrumbs_server_run.sh.in @@ -14,7 +14,7 @@ fi source "$SCRIPT_DIR/datacrumbs_args" dc_args_init "DATACRUMBS" -dc_args_add_option "DATACRUMBS" "composite-name" "OPTIONAL" "Composable name" "string" +dc_args_add_option "DATACRUMBS" "composite-name" "OPTIONAL" "Composable name" "string" "$DATACRUMBS_COMPOSABLE_NAME" dc_args_add_option "DATACRUMBS" "enable-mpi" "OPTIONAL" "switch to enable MPI" "bool" "0" dc_args_add_option "DATACRUMBS" "nodes" "OPTIONAL" "Set number of nodes" "int" "1" dc_args_add_option "DATACRUMBS" "ppn" "OPTIONAL" "Set processes per node" "int" "1" @@ -37,24 +37,20 @@ PROG_NAME=$(basename "$0") source $SCRIPT_DIR/datacrumbs_setup if [[ "$DATACRUMBS_COMPOSITE_NAME" != "" ]] && [[ "$DATACRUMBS_COMPOSITE_NAME" != "NONE" ]]; then - if [[ ! -f "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${DATACRUMBS_COMPOSITE_NAME}" ]]; then - error "Composite ${DATACRUMBS_COMPOSITE_NAME} not found for ${DATACRUMBS_USER}" + if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSITE_NAME}"; then + error "Invalid composable name: ${DATACRUMBS_COMPOSITE_NAME}" exit 1 fi fi check_sudo_user - -RUNID=${!DATACRUMBS_JOB_ID_VAR} -RUNID=${RUNID:-1000} -DATACRUMBS_LOG_FILE=${DATACRUMBS_LOG_DIR}/datacrumbs_${DATACRUMBS_USER}_${RUNID}.log -READY_FILE="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_${RUNID}.ready" -debug "RUNID: $RUNID" + +debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" -debug "READY_FILE: $READY_FILE" +debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" log "Running as USER = $DATACRUMBS_USER and storing traces in $DATACRUMBS_TRACE_DIR and log file $DATACRUMBS_LOG_FILE" datacrumbs_init $DATACRUMBS_USER $DATACRUMBS_TRACE_DIR exec=() diff --git a/scripts/datacrumbs/datacrumbs_server_stop.sh.in b/scripts/datacrumbs/datacrumbs_server_stop.sh.in index e39ea18d..4fc81d82 100755 --- a/scripts/datacrumbs/datacrumbs_server_stop.sh.in +++ b/scripts/datacrumbs/datacrumbs_server_stop.sh.in @@ -14,7 +14,7 @@ fi source "$SCRIPT_DIR/datacrumbs_args" dc_args_init "DATACRUMBS" -dc_args_add_option "DATACRUMBS" "composite-name" "OPTIONAL" "Composable name" "string" +dc_args_add_option "DATACRUMBS" "composite-name" "OPTIONAL" "Composable name" "string" "$DATACRUMBS_COMPOSABLE_NAME" dc_args_add_option "DATACRUMBS" "enable-mpi" "OPTIONAL" "switch to enable MPI" "bool" "0" dc_args_add_option "DATACRUMBS" "nodes" "OPTIONAL" "Set number of nodes" "int" "1" dc_args_add_option "DATACRUMBS" "ppn" "OPTIONAL" "Set processes per node" "int" "1" @@ -51,15 +51,11 @@ read -ra APP_CMD <<< "${DATACRUMBS_APP}" check_sudo_user -RUNID=${!DATACRUMBS_JOB_ID_VAR} -RUNID=${RUNID:-1000} -DATACRUMBS_LOG_FILE=${DATACRUMBS_LOG_DIR:-/tmp}/datacrumbs_${DATACRUMBS_USER}_${RUNID}.log -READY_FILE="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_${RUNID}.ready" -debug "RUNID: $RUNID" +debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" -debug "READY_FILE: $READY_FILE" +debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" echo "Running cmd: ${APP_CMD[*]} as USER = $DATACRUMBS_USER and storing traces in $DATACRUMBS_TRACE_DIR and log file $DATACRUMBS_LOG_FILE" exec=() diff --git a/scripts/datacrumbs/datacrumbs_service_common.sh.in b/scripts/datacrumbs/datacrumbs_service_common.sh.in index 1726021e..9de2d14d 100755 --- a/scripts/datacrumbs/datacrumbs_service_common.sh.in +++ b/scripts/datacrumbs/datacrumbs_service_common.sh.in @@ -2,42 +2,141 @@ set -e pipefail -FLUX_DATACRUMBS=$(flux job info $FLUX_JOB_ID jobspec | jq -r .attributes.system.datacrumbs) +source @DATACRUMBS_INSTALL_BINARYDIR@/datacrumbs_setup -warn_user() { - ## post exception to flux log, cancel job - flux job raise --severity=1 ${FLUX_JOB_ID} "datacrumbs-prolog: $@" +function get_general_datacrumbs_enabled() { + local enabled=${DATACRUMBS_ENABLED:-0} + enabled_value="no" + if [[ "${enabled}" -eq "1" ]]; then + enabled_value="yes" + fi + log_system "get_general_datacrumbs_enabled returned enabled:${enabled_value}" + echo "${enabled_value}" } -if [[ ${FLUX_DATACRUMBS} == "null" ]]; then - logger "User hasn't requested datacrumbs feature, exiting." - return 1 -fi -FLUX_DATACRUMBS=$(flux job info $FLUX_JOB_ID jobspec | jq -r .attributes.system.datacrumbs.enable) -if [[ ${FLUX_DATACRUMBS} == "null" || "${FLUX_DATACRUMBS}" != "yes" ]]; then - logger "User hasn't requested datacrumbs feature, exiting." - return 1 -fi +function get_flux_datacrumbs_enabled() { + local enabled=$(flux job info $FLUX_JOB_ID jobspec 2>/dev/null | jq -r .attributes.system.datacrumbs 2>/dev/null) + enabled_value="no" + if [[ ${enabled} == "null" ]]; then + log_system "User hasn't requested datacrumbs feature enabled:${enabled}, exiting." + else + FLUX_DATACRUMBS=$(flux job info $FLUX_JOB_ID jobspec 2>/dev/null | jq -r .attributes.system.datacrumbs.enable 2>/dev/null) + if [[ ${FLUX_DATACRUMBS} == "null" || "${FLUX_DATACRUMBS}" != "yes" ]]; then + log_system "User hasn't requested datacrumbs feature FLUX_DATACRUMBS:${FLUX_DATACRUMBS}, exiting." + else + enabled_value="yes" + fi + fi + log_system "get_flux_datacrumbs_enabled returned enabled:${enabled_value}" + echo "${enabled_value}" +} -FLUX_DATACRUMBS_COMPOSE=$(flux job info $FLUX_JOB_ID jobspec | jq -r .attributes.system.datacrumbs.composite) -if [[ ${FLUX_DATACRUMBS_COMPOSE} == "null" || ${FLUX_DATACRUMBS_COMPOSE} == "" ]]; then - DATACRUMBS_COMPOSABLE_NAME="NONE" - logger "User hasn't requested datacrumbs' composite feature using ${DATACRUMBS_COMPOSABLE_NAME}." -else - DATACRUMBS_COMPOSABLE_NAME=${FLUX_DATACRUMBS_COMPOSE} - if [[ -n "$FLUX_JOB_USERID" ]]; then - DATACRUMBS_USER=$(id -nu $FLUX_JOB_USERID) +function get_slurm_comment() { + local slurm_job_comment=$(scontrol show job $SLURM_JOB_ID | grep -i comment | awk -F'=' '{print $2}') + echo $slurm_job_comment +} + +function get_slurm_datacrumbs_enabled() { + enabled_value="no" + local slurm_job_comment=$(get_slurm_comment) + # NOTE: If SLURM_JOB_COMMENT which is a JSON + # of format {datacrumbs: {enable: "yes|no", composite: name}}. + # says datacrumbs enable is yes, else remains the same. + if [[ $(echo ${slurm_job_comment} | jq -r .datacrumbs.enable 2>/dev/null) == "yes" ]]; then + enabled_value="yes" + fi + log_system "get_slurm_datacrumbs_enabled returned enabled:${enabled_value}" + echo "${enabled_value}" +} + +function get_datacrumbs_enabled() { + local enabled="no" + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + enabled=$(get_flux_datacrumbs_enabled) + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + local slurm_job_comment=$(get_slurm_comment) + log_system "Slurm comment: $slurm_job_comment" + enabled=$(get_slurm_datacrumbs_enabled) + else + enabled=$(get_general_datacrumbs_enabled) + fi + log_system "get_datacrumbs_enabled returned enabled:${enabled}" + echo "${enabled}" +} + +function get_flux_datacrumbs_composite_name() { + local composite_name=$(flux job info $FLUX_JOB_ID jobspec | jq -r .attributes.system.datacrumbs.composite 2>/dev/null) + if [[ ${composite_name} == "null" || ${composite_name} == "" ]]; then + log_system "User hasn't requested datacrumbs' composite feature using ${composite_name}.""ERROR" + else + log_system "User has requested datacrumbs' composite feature using ${composite_name}." + fi + log_system "get_flux_datacrumbs_composite_name returned composite_name:${composite_name}" + echo "${composite_name}" +} + +function get_slurm_datacrumbs_composite_name() { + local composite_name=$(get_default_datacrumbs_composite_name) + local slurm_job_comment=$(get_slurm_comment) + local slurm_composite="$(echo ${slurm_job_comment} | jq -r .datacrumbs.composite 2>/dev/null)" + if [[ + ${slurm_composite} == "" || + ${slurm_composite} == "NONE" || + ${slurm_composite} == "null" || + ${slurm_composite} == $(get_default_datacrumbs_composite_name) ]] \ + ; then + log_system "User hasn't requested datacrumbs' composite feature using ${composite_name}" + else + log_system "User has requested datacrumbs' composite feature using ${composite_name}." + fi + log_system "get_slurm_datacrumbs_composite_name returned composite_name:${composite_name}" + echo "${composite_name}" +} + +function get_general_datacrumbs_composite_name() { + local composite_name=$(get_default_datacrumbs_composite_name) + if [[ ${DATACRUMBS_COMPOSITE_NAME} == "null" || ${composite_name} == "" ]]; then + log_system "User hasn't requested datacrumbs' composite feature using ${composite_name}." + else + log_system "User has requested datacrumbs' composite feature using ${composite_name}." + fi + log_system "get_general_datacrumbs_composite_name returned composite_name:${composite_name}" + echo "${composite_name}" +} + +function get_datacrumbs_composite_name() { + local name=$(get_default_datacrumbs_composite_name) + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + name=$(get_flux_datacrumbs_composite_name) + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + name=$(get_slurm_datacrumbs_composite_name) + else + name=$(get_general_datacrumbs_composite_name) fi - if [[ ! -f "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_USER}/datacrumbs_${DATACRUMBS_COMPOSABLE_NAME}" ]]; then - warn_user "Error: Composable name ${DATACRUMBS_COMPOSABLE_NAME} does not exist." - return 1 + if [[ "${name}" != "$(get_default_datacrumbs_composite_name)" && "${name}" != "ERROR" ]]; then + if ! validate_datacrumbs_composite_name "${name}"; then + name="ERROR" + fi fi - logger "User has requested datacrumbs' composite feature using ${DATACRUMBS_COMPOSABLE_NAME}." -fi + log_system "get_datacrumbs_composite_name returned name:${name}" + echo "${name}" +} -if [[ ! ${DATACRUMBS_COMPOSABLE_NAME} =~ ^[a-zA-Z_]+$ ]]; then - warn_user "Error: DATACRUMBS_COMPOSABLE_NAME: ${DATACRUMBS_COMPOSABLE_NAME} contains invalid characters. Only alphabets and underscores are allowed." +DATACRUMBS_ENABLED=$(get_datacrumbs_enabled) +if [[ "${DATACRUMBS_ENABLED}" != "yes" ]]; then + log_system "User hasn't requested datacrumbs feature, exiting." return 1 fi +DATACRUMBS_COMPOSABLE_NAME=$(get_datacrumbs_composite_name) +if [[ "${DATACRUMBS_COMPOSABLE_NAME}" == "ERROR" ]]; then + return 1 +fi +if [[ "${DATACRUMBS_COMPOSABLE_NAME}" == "$(get_default_datacrumbs_composite_name)" ]]; then + log_user "Running system datacrumbs" +else + log_user "Running a composite datacrumbs with name: ${DATACRUMBS_COMPOSABLE_NAME}" +fi -export DATACRUMBS_COMPOSABLE_NAME \ No newline at end of file +readonly DATACRUMBS_COMPOSABLE_NAME +export DATACRUMBS_COMPOSABLE_NAME +export DATACRUMBS_USER diff --git a/scripts/datacrumbs/datacrumbs_service_stop.sh.in b/scripts/datacrumbs/datacrumbs_service_stop.sh.in index f7cf54a4..f604ddb4 100755 --- a/scripts/datacrumbs/datacrumbs_service_stop.sh.in +++ b/scripts/datacrumbs/datacrumbs_service_stop.sh.in @@ -4,7 +4,8 @@ set -e pipefail source @DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_service_common.sh if [[ $? -eq 0 ]]; then - sudo systemctl stop datacrumbs@$DATACRUMBS_COMPOSABLE_NAME.service + sudo systemctl stop datacrumbs@${DATACRUMBS_SERVER_RUN_ID}.service + sudo rm ${DATACRUMBS_SERVER_ENV_FILE} fi exit 0 diff --git a/scripts/datacrumbs/datacrumbs_setup.in b/scripts/datacrumbs/datacrumbs_setup.in index abfb3b12..ffab738e 100755 --- a/scripts/datacrumbs/datacrumbs_setup.in +++ b/scripts/datacrumbs/datacrumbs_setup.in @@ -25,9 +25,7 @@ if [[ "${DATACRUMBS_ENV_LOADED:-0}" == "0" ]]; then debug "User is root." fi if [[ -z "$DATACRUMBS_USER" ]] || [[ "$DATACRUMBS_USER" = "root" ]]; then - if [[ -n "$FLUX_JOB_USERID" ]]; then - DATACRUMBS_USER=$(id -nu $FLUX_JOB_USERID) - fi + DATACRUMBS_USER=$(get_actual_user) fi fi @@ -45,10 +43,21 @@ if [[ "${DATACRUMBS_ENV_LOADED:-0}" == "0" ]]; then export DATACRUMBS_TRACE_DIR=$(echo "$DATACRUMBS_TRACE_DIR_PATTERN" | sed "s|%YY%|$YEAR|g; s|%MM%|$MONTH|g; s|%DD%|$DAY|g") readonly DATACRUMBS_TRACE_DIR debug "Log directory set to $DATACRUMBS_TRACE_DIR" + + mkdir -p "${DATACRUMBS_SERVER_RUN_DIR}" 2> /dev/null + export DATACRUMBS_ENV_LOADED=1 readonly DATACRUMBS_ENV_LOADED + if command -v module &> /dev/null; then + export DATACRUMBS_MODULE_AVAILABLE=1 + else + export DATACRUMBS_MODULE_AVAILABLE=0 + fi + readonly DATACRUMBS_MODULE_AVAILABLE + eval $DATACRUMBS_SERVER_PREAMBLE + fi if [[ "$DATACRUMBS_MODULE_AVAILABLE" == "1" ]] && [[ "$DATACRUMBS_SERVER_MODULE" == "1" ]]; then diff --git a/scripts/datacrumbs/datacrumbs_utility.in b/scripts/datacrumbs/datacrumbs_utility.in index 34282d0c..96f1db27 100755 --- a/scripts/datacrumbs/datacrumbs_utility.in +++ b/scripts/datacrumbs/datacrumbs_utility.in @@ -79,43 +79,38 @@ function datacrumbs_start_server() { else server_launch "${cmd[@]}" > $DATACRUMBS_LOG_FILE 2>&1 & PID=$! - echo $PID > "$DATACRUMBS_SERVER_PID_FILE" + echo $PID > "$DATACRUMBS_SERVER_SYSTEMD_PID_FILE" log "Service started with PID: $PID" chown ${DATACRUMBS_USER}:${DATACRUMBS_USER} $DATACRUMBS_LOG_FILE fi if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would wait for ready file: $READY_FILE (DATACRUMBS_SERVER_LOAD_TIMEOUT: $DATACRUMBS_SERVER_LOAD_TIMEOUT seconds)" + log "[DRY RUN] Would wait for ready file: $DATACRUMBS_SERVER_READY_FILE (DATACRUMBS_SERVER_LOAD_TIMEOUT: $DATACRUMBS_SERVER_LOAD_TIMEOUT seconds)" return 0 fi - while [[ ! -f "$READY_FILE" ]]; do + while [[ ! -f "$DATACRUMBS_SERVER_READY_FILE" ]]; do sleep $WAIT_INTERVAL log "Waiting for ${ELAPSED} seconds $Server..." ELAPSED=$((ELAPSED + WAIT_INTERVAL)) if [[ $ELAPSED -ge $DATACRUMBS_SERVER_LOAD_TIMEOUT ]]; then - log "DATACRUMBS_SERVER_LOAD_TIMEOUT waiting for $READY_FILE" + log "DATACRUMBS_SERVER_LOAD_TIMEOUT waiting for $DATACRUMBS_SERVER_READY_FILE" server_launch $DATACRUMBS_INSTALL_SBIN_DIR/datacrumbs_stop cat $DATACRUMBS_LOG_FILE exit 1 fi done - echo $RUNID > "$DATACRUMBS_SERVER_RUNID_FILE" + echo $DATACRUMBS_SERVER_RUN_ID > "${DATACRUMBS_SERVER_RUN_ID_FILE}" log "Started server" } function datacrumbs_stop_server() { exec=$1 prog_name=$2 - if [[ "$RUNID" == "1000" ]] && [[ -f "$DATACRUMBS_SERVER_RUNID_FILE" ]]; then - RUNID=$(cat "$DATACRUMBS_SERVER_RUNID_FILE" 2>/dev/null) - fi - READY_FILE="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_${RUNID}.ready" exec=($exec) - common_cmd=("$DATACRUMBS_INSTALL_HOST" "--user" "$DATACRUMBS_USER" "--config_path" "$DATACRUMBS_INSTALL_CONFIGS_DIR" "--data_dir" "$DATACRUMBS_INSTALL_DATA_DIR" "--trace_log_dir" "$DATACRUMBS_TRACE_DIR" --run_id "$RUNID") + common_cmd=("$DATACRUMBS_INSTALL_HOST" "--user" "$DATACRUMBS_USER" "--config_path" "$DATACRUMBS_INSTALL_CONFIGS_DIR" "--data_dir" "$DATACRUMBS_INSTALL_DATA_DIR" "--trace_log_dir" "$DATACRUMBS_TRACE_DIR" --run_id "$DATACRUMBS_SERVER_RUN_ID") cmd=("${exec[@]}" "stop" "${common_cmd[@]}") - log "Stopping Server: ${cmd[*]}" if [[ "${DRY_RUN:-0}" == "1" ]]; then @@ -148,10 +143,7 @@ function datacrumbs_stop_server() { } function datacrumbs_print_status() { - if [[ "$RUNID" == "1000" ]] && [[ -f "$DATACRUMBS_SERVER_RUNID_FILE" ]]; then - RUNID=$(cat "$DATACRUMBS_SERVER_RUNID_FILE" 2>/dev/null) - fi - local status_file="/tmp/datacrumbs_${DATACRUMBS_USER}_status_${RUNID}.json" + local status_file=${DATACRUMBS_SERVER_STATUS_FILE} if [[ "${DRY_RUN:-0}" == "1" ]]; then log "[DRY RUN] Would print status from: $status_file" log "[DRY RUN] Would remove status file: $status_file" @@ -241,9 +233,62 @@ function server_launch() { "${cmd[@]}" } -if command -v module &> /dev/null -then - export DATACRUMBS_MODULE_AVAILABLE=1 -else - export DATACRUMBS_MODULE_AVAILABLE=0 -fi \ No newline at end of file +function get_actual_user() { + local user=$(whoami) + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ -n "$FLUX_JOB_USERID" ]]; then + user=$(id -nu $FLUX_JOB_USERID) + fi + elif [[ "SLURM" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ -n "$SLURM_JOB_UID" ]]; then + user=$(id -nu $SLURM_JOB_UID) + fi + fi + log_system "get_actual_user returned user:${user}" + echo "${user}" +} + +function check_composite_location() { + local name="$1" + local selected_location="" + local user_location=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_USER}/datacrumbs_${name} + local system_location=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_INSTALL_USER}/datacrumbs_${name} + if [[ -f "${user_location}" ]]; then + selected_location="${user_location}" + elif [[ -f "${system_location}" ]]; then + selected_location="${system_location}" + else + selected_location="NA" + fi + log_system "check_composite_location for name:${name} selected_location:${selected_location}" + echo "${selected_location}" +} + +function validate_datacrumbs_enable_value() { + local value="$1" + if [[ "$value" == "yes" || "$value" == "no" ]]; then + return 0 + else + return 1 + fi +} + +function validate_datacrumbs_composite_name() { + local name="$1" + return_code=0 + if [[ ! ${name} =~ ^[a-zA-Z_]+$ ]]; then + warn_user "Error: DATACRUMBS_COMPOSABLE_NAME: ${name} contains invalid characters. Only alphabets and underscores are allowed." + return_code=1 + fi + local selected_location=$(check_composite_location "${name}") + if [[ ${return_code} -eq 0 && "${selected_location}" == "NA" ]]; then + warn_user "Error: Composable name ${name} does not exist." + return_code=1 + fi + log_system "validate_datacrumbs_composite_name validated name:${name} return_code:${return_code}" + return ${return_code} +} + +function get_default_datacrumbs_composite_name() { + echo "NONE" +} diff --git a/src/datacrumbs/server/process/server.impl.cpp b/src/datacrumbs/server/process/server.impl.cpp index 70f011e5..a75c6bbe 100644 --- a/src/datacrumbs/server/process/server.impl.cpp +++ b/src/datacrumbs/server/process/server.impl.cpp @@ -519,17 +519,27 @@ static int main_process(int argc, char** argv, datacrumbs::EventProcessor* event // Main event polling loop signal(SIGINT, sig_handler); if (event_processor->configManager_->mpi_rank == 0) { - std::string ready_file = std::string(DATACRUMBS_INSTALL_RUNSTATEDIR) + "/datacrumbs_" + - event_processor->configManager_->user + "_" + - event_processor->configManager_->run_id + ".ready"; + std::string ready_file; + const char* env_ready_file = getenv("DATACRUMBS_SERVER_READY_FILE"); + if (env_ready_file) { + ready_file = std::string(env_ready_file); + } else { + ready_file = std::string(DATACRUMBS_INSTALL_RUNSTATEDIR) + "/datacrumbs-" + + event_processor->configManager_->run_id + ".ready"; + } std::ofstream ofs_ready(ready_file); ofs_ready << "ready" << std::endl; ofs_ready.close(); - auto pwd = getpwnam(event_processor->configManager_->user.c_str()); - uid_t uid = pwd ? pwd->pw_uid : static_cast(-1); - gid_t gid = pwd ? pwd->pw_gid : static_cast(-1); - chown(ready_file.c_str(), uid, gid); - chmod(ready_file.c_str(), 0660); + if (ready_file.substr(0, 4) != "/run" && ready_file.substr(0, 8) != "/var/run") { + auto pwd = getpwnam(event_processor->configManager_->user.c_str()); + auto uid = pwd ? pwd->pw_uid : static_cast(-1); + auto gid = pwd ? pwd->pw_gid : static_cast(-1); + chown(ready_file.c_str(), uid, gid); + chmod(ready_file.c_str(), 0660); + } + DC_LOG_INFO("Ready file created: %s for user:%s on %d nodes", ready_file.c_str(), + event_processor->configManager_->user.c_str(), + event_processor->configManager_->mpi_size); DC_LOG_PRINT("Server running on %d nodes. Ready to run the code.", event_processor->configManager_->mpi_size); } @@ -777,8 +787,14 @@ static int main_process(int argc, char** argv, datacrumbs::EventProcessor* event DC_LOG_PRINT("Total events: sum=%d, min=%d, max=%d", global_total_events_sum, global_total_events_min, global_total_events_max); // Write status info to JSON file for postprocessing - std::string status_file = "/tmp/datacrumbs_" + event_processor->configManager_->user + - "_status_" + event_processor->configManager_->run_id + ".json"; + std::string status_file; + const char* env_statusfile = getenv("DATACRUMBS_SERVER_STATUS_FILE"); + if (env_statusfile) { + status_file = std::string(env_statusfile); + } else { + status_file = std::string(DATACRUMBS_INSTALL_RUNSTATEDIR) + "/datacrumbs-" + + event_processor->configManager_->run_id + ".json"; + } struct json_object* status_json = json_object_new_object(); json_object_object_add( status_json, "trace_file", @@ -792,11 +808,13 @@ static int main_process(int argc, char** argv, datacrumbs::EventProcessor* event DC_LOG_ERROR("Failed to write status file: %s", status_file.c_str()); } json_object_put(status_json); - auto pwd = getpwnam(event_processor->configManager_->user.c_str()); - auto uid = pwd ? pwd->pw_uid : static_cast(-1); - auto gid = pwd ? pwd->pw_gid : static_cast(-1); - chown(status_file.c_str(), uid, gid); - chmod(status_file.c_str(), 0660); + if (status_file.substr(0, 4) != "/run" && status_file.substr(0, 8) != "/var/run") { + auto pwd = getpwnam(event_processor->configManager_->user.c_str()); + auto uid = pwd ? pwd->pw_uid : static_cast(-1); + auto gid = pwd ? pwd->pw_gid : static_cast(-1); + chown(status_file.c_str(), uid, gid); + chmod(status_file.c_str(), 0660); + } } DC_LOG_TRACE("main: end"); @@ -810,9 +828,14 @@ static int main_call(int argc, char** argv) { event_processor.configManager_->load_mpi_configurations(); } - std::string hostname = get_hostname(); - std::string pidfile = event_processor.configManager_->log_dir + "/datacrumbs_" + hostname + "_" + - event_processor.configManager_->run_id + ".pid"; + std::string pidfile; + const char* env_pidfile = getenv("DATACRUMBS_SERVER_PID_FILE"); + if (env_pidfile) { + pidfile = std::string(env_pidfile); + } else { + pidfile = std::string(DATACRUMBS_INSTALL_RUNSTATEDIR) + "/datacrumbs-" + + event_processor.configManager_->run_id + ".pid"; + } int return_code = 0; if (event_processor.configManager_->mpi_rank == 0 && @@ -824,6 +847,7 @@ static int main_call(int argc, char** argv) { return_code = main_process(argc, argv, &event_processor, false); } else if (event_processor.configManager_->exe_mode == datacrumbs::ExecutableMode::START) { daemonize(); + std::string hostname = get_hostname(); std::string logfile = event_processor.configManager_->log_dir + "/datacrumbs_" + event_processor.configManager_->user + "_" + hostname + "_" + event_processor.configManager_->run_id + ".log"; From d84bb578ae2d773f83cbc98fb526ed141f4ec58e Mon Sep 17 00:00:00 2001 From: Hariharan Date: Sun, 16 Nov 2025 18:25:33 +0000 Subject: [PATCH 3/6] Enhance probe management by adding enable_explorer flag and loading existing probes from JSON --- .devcontainer/devcontainer.json | 2 +- CMakeLists.txt | 2 + etc/datacrumbs/configs/docker.yaml | 3 +- infrastructure/docker/build-multiarch.sh | 41 +++- scripts/datacrumbs/datacrumbs_compose_run.in | 65 ++--- scripts/datacrumbs/datacrumbs_run.in | 46 ++-- scripts/datacrumbs/datacrumbs_setup.in | 32 ++- .../common/configuration_manager.cpp | 7 + src/datacrumbs/common/data_structures.h | 1 + src/datacrumbs/explorer/probe_explorer.cpp | 227 ++++++++++++++++++ src/datacrumbs/explorer/probe_explorer.h | 3 + src/datacrumbs/server/bpf/common.h | 1 - 12 files changed, 363 insertions(+), 67 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0ac87462..4e36bad5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,7 +6,7 @@ // Sets the run context to one level up instead of the .devcontainer folder. "context": "..", // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename. - "dockerfile": "../Dockerfile", + "dockerfile": "../infrastructure/docker/Dockerfile", }, "runArgs": [ "-ti", diff --git a/CMakeLists.txt b/CMakeLists.txt index 83c6de7e..3cc9d90e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -602,6 +602,8 @@ set(_DATACRUMBS_DATA_FILES "${CMAKE_DATA_OUTPUT_DIRECTORY}/categories-${DATACRUMBS_USER}-${DATACRUMBS_HOST}.json" "${CMAKE_DATA_OUTPUT_DIRECTORY}/probes-${DATACRUMBS_USER}-${DATACRUMBS_HOST}.json" ) +# Ensure the data output directory exists +file(MAKE_DIRECTORY ${CMAKE_DATA_OUTPUT_DIRECTORY}) if(_DATACRUMBS_DATA_FILES) install(FILES ${_DATACRUMBS_DATA_FILES} diff --git a/etc/datacrumbs/configs/docker.yaml b/etc/datacrumbs/configs/docker.yaml index 4867cd31..3ff6db14 100755 --- a/etc/datacrumbs/configs/docker.yaml +++ b/etc/datacrumbs/configs/docker.yaml @@ -20,4 +20,5 @@ capture_probes: - name: os_page_cache probe: kprobe type: header - file: @DATACRUMBS_KERNEL_HEADERS_PATH@/include/linux/pagemap.h \ No newline at end of file + file: @DATACRUMBS_KERNEL_HEADERS_PATH@/include/linux/pagemap.h + enable_explorer: false \ No newline at end of file diff --git a/infrastructure/docker/build-multiarch.sh b/infrastructure/docker/build-multiarch.sh index 97b418dc..dd1bb2c5 100755 --- a/infrastructure/docker/build-multiarch.sh +++ b/infrastructure/docker/build-multiarch.sh @@ -16,6 +16,7 @@ PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}" # Parse command line arguments PUSH=false LOAD=false +RUN=false print_usage() { echo "Usage: $0 [OPTIONS]" @@ -23,6 +24,7 @@ print_usage() { echo "Options:" echo " --push Push the built images to the registry" echo " --load Load the image into local Docker (only works for single platform)" + echo " --run Run the container after loading (implies --load)" echo " --platform ARCH Comma-separated list of platforms (default: linux/amd64,linux/arm64)" echo " --tag TAG Image tag (default: latest)" echo " --name NAME Image name (default: datacrumbs)" @@ -33,6 +35,7 @@ print_usage() { echo "Examples:" echo " $0 --push # Build and push multi-arch images" echo " $0 --load --platform linux/amd64 # Build and load amd64 only" + echo " $0 --run --platform linux/amd64 # Build, load and run container" echo " $0 --push --tag v1.0.0 --name myimage # Custom tag and name" } @@ -46,6 +49,11 @@ while [[ $# -gt 0 ]]; do LOAD=true shift ;; + --run) + RUN=true + LOAD=true + shift + ;; --platform) PLATFORMS="$2" shift 2 @@ -173,8 +181,37 @@ if [ $? -eq 0 ]; then elif [ "$LOAD" = true ]; then echo "" echo "Image has been loaded into local Docker." - echo "You can run it with:" - echo " docker run -it ${FULL_IMAGE_NAME}" + + if [ "$RUN" = true ]; then + echo "" + echo "Starting container with workspace mounted at /opt/datacrumbs..." + docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \ + --net=host --pid=host --hostname docker \ + -v /lib/modules/:/lib/modules:ro \ + -v /sys/kernel/debug/:/sys/kernel/debug:rw \ + -v /sys/fs/bpf:/sys/fs/bpf \ + -v "$(pwd):/opt/datacrumbs" -w /opt/datacrumbs \ + ${FULL_IMAGE_NAME} + else + echo "" + echo "To run with current workspace mounted (replaces built version in container):" + echo " docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \\" + echo " --net=host --pid=host --hostname docker \\" + echo " -v /lib/modules/:/lib/modules:ro \\" + echo " -v /sys/kernel/debug/:/sys/kernel/debug:rw \\" + echo " -v /sys/fs/bpf:/sys/fs/bpf \\" + echo " -v \"\$(pwd):/opt/datacrumbs\" -w /opt/datacrumbs \\" + echo " ${FULL_IMAGE_NAME}" + echo "" + echo "To run with workspace mounted at /workspace (keeps built version):" + echo " docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \\" + echo " --net=host --pid=host --hostname docker \\" + echo " -v /lib/modules/:/lib/modules:ro \\" + echo " -v /sys/kernel/debug/:/sys/kernel/debug:rw \\" + echo " -v /sys/fs/bpf:/sys/fs/bpf \\" + echo " -v \"\$(pwd):/workspace\" -w /workspace \\" + echo " ${FULL_IMAGE_NAME}" + fi fi else echo "" diff --git a/scripts/datacrumbs/datacrumbs_compose_run.in b/scripts/datacrumbs/datacrumbs_compose_run.in index 186087a5..3a934836 100755 --- a/scripts/datacrumbs/datacrumbs_compose_run.in +++ b/scripts/datacrumbs/datacrumbs_compose_run.in @@ -52,50 +52,57 @@ if [[ -z "${DATACRUMBS_COMPOSE_RUN_APP}" ]]; then exit 1 fi -if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then - error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" - exit 1 -fi - # Convert APP_CMD string into array, splitting on spaces read -ra APP_CMD <<< "${DATACRUMBS_COMPOSE_RUN_APP}" # Load environment source "$SCRIPT_DIR/datacrumbs_setup" +if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then + error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" + exit 1 +fi + check_regular_user log "Running cmd: ${APP_CMD[*]} as USER = $DATACRUMBS_USER using composable $DATACRUMBS_COMPOSABLE_NAME" -if [[ -z "$DRY_RUN" ]]; then - datacrumbs_init "$DATACRUMBS_USER" "$DATACRUMBS_TRACE_DIR" +# Build args to pass to server scripts +server_args=() +if [[ -n "${DATACRUMBS_COMPOSABLE_NAME}" && "${DATACRUMBS_COMPOSABLE_NAME}" != "NONE" ]]; then + server_args+=("--composite-name" "${DATACRUMBS_COMPOSABLE_NAME}") +fi +if [[ "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then + server_args+=("--enable-mpi") + server_args+=("--nodes" "${DATACRUMBS_JOB_NODES}") + server_args+=("--ppn" "${DATACRUMBS_JOB_PPN}") +fi +if [[ "${VERBOSE:-0}" == "1" ]]; then + server_args+=("--verbose") +fi +if [[ "${QUIET:-0}" == "1" ]]; then + server_args+=("--quiet") +fi +if [[ "${DRY_RUN:-0}" == "1" ]]; then + server_args+=("--dry-run") fi -debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" -debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" -debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" -debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" -debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" - - - - -exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSABLE_NAME}") -debug "Starting datacrumbs server with exec: ${exec[*]}" -datacrumbs_start_server "${exec[*]}" +SERVER_RUN_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_run.sh +SERVER_STOP_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_stop.sh +echo "Starting DataCrumbs server via: $SERVER_RUN_BIN ${server_args[*]}" +sudo "$SERVER_RUN_BIN" "${server_args[@]}" +if [[ $? -ne 0 ]]; then + echo "Error: Failed to start DataCrumbs server" + exit 1 +fi log "Running App: ${APP_CMD[*]}" job_launch "${APP_CMD[@]}" log "Finished App" -debug "Stopping datacrumbs server with exec: ${exec[*]}" -datacrumbs_stop_server "${exec[*]}" $PROG_NAME -if [[ "$DRY_RUN" == "1" ]]; then - debug "[DRY_RUN] Would print datacrumbs status" - debug "[DRY_RUN] Would finalize datacrumbs for user: $DATACRUMBS_USER" -else - debug "Printing datacrumbs status" - datacrumbs_print_status - debug "Finalizing datacrumbs for user: $DATACRUMBS_USER" - datacrumbs_finalize "$DATACRUMBS_USER" +echo "Stopping DataCrumbs server via: $SERVER_STOP_BIN ${server_args[*]}" +sudo "$SERVER_STOP_BIN" "${server_args[@]}" +if [[ $? -ne 0 ]]; then + echo "Error: Failed to stop DataCrumbs server" + exit 1 fi diff --git a/scripts/datacrumbs/datacrumbs_run.in b/scripts/datacrumbs/datacrumbs_run.in index 406dd7b0..5182aa36 100755 --- a/scripts/datacrumbs/datacrumbs_run.in +++ b/scripts/datacrumbs/datacrumbs_run.in @@ -47,25 +47,39 @@ source $SCRIPT_DIR/datacrumbs_setup check_regular_user +# Build args to pass to server scripts +server_args=() +if [[ "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then + server_args+=("--enable-mpi") + server_args+=("--nodes" "${DATACRUMBS_JOB_NODES}") + server_args+=("--ppn" "${DATACRUMBS_JOB_PPN}") +fi +if [[ "${VERBOSE:-0}" == "1" ]]; then + server_args+=("--verbose") +fi +if [[ "${QUIET:-0}" == "1" ]]; then + server_args+=("--quiet") +fi +if [[ "${DRY_RUN:-0}" == "1" ]]; then + server_args+=("--dry-run") +fi +SERVER_RUN_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_run.sh +SERVER_STOP_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_stop.sh -debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" -debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" -debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" -debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" -debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" -datacrumbs_init $DATACRUMBS_USER $DATACRUMBS_TRACE_DIR - - -echo "Running cmd: ${APP_CMD[*]} as USER = $DATACRUMBS_USER and storing traces in $DATACRUMBS_TRACE_DIR and log file $DATACRUMBS_LOG_FILE" -datacrumbs_start_server @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs - +echo "Starting DataCrumbs server via: $SERVER_RUN_BIN ${server_args[*]}" +sudo "$SERVER_RUN_BIN" "${server_args[@]}" +if [[ $? -ne 0 ]]; then + echo "Error: Failed to start DataCrumbs server" + exit 1 +fi log "Running App: ${APP_CMD[*]}" job_launch "${APP_CMD[@]}" log "Finished App" -datacrumbs_stop_server @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs $PROG_NAME - -datacrumbs_print_status - -datacrumbs_finalize $DATACRUMBS_USER $DATACRUMBS_TRACE_DIR +echo "Stopping DataCrumbs server via: $SERVER_STOP_BIN ${server_args[*]}" +sudo "$SERVER_STOP_BIN" "${server_args[@]}" +if [[ $? -ne 0 ]]; then + echo "Error: Failed to stop DataCrumbs server" + exit 1 +fi diff --git a/scripts/datacrumbs/datacrumbs_setup.in b/scripts/datacrumbs/datacrumbs_setup.in index ffab738e..03a290aa 100755 --- a/scripts/datacrumbs/datacrumbs_setup.in +++ b/scripts/datacrumbs/datacrumbs_setup.in @@ -13,24 +13,22 @@ CONFIG_FILE=@DATACRUMBS_INSTALL_ETC_CONFIGSDIR@/project.env.local source ${SCRIPT_DIR}/datacrumbs_utility -if [[ "${DATACRUMBS_ENV_LOADED:-0}" == "0" ]]; then - if [[ "$(id -u)" != "0" ]]; then - export DATACRUMBS_IS_ROOT=0 - export DATACRUMBS_USER=$(id -un) - else - export DATACRUMBS_IS_ROOT=1 - export DATACRUMBS_USER=$SUDO_USER - if [[ -z "$DATACRUMBS_USER" ]]; then - DATACRUMBS_USER=$USER - debug "User is root." - fi - if [[ -z "$DATACRUMBS_USER" ]] || [[ "$DATACRUMBS_USER" = "root" ]]; then - DATACRUMBS_USER=$(get_actual_user) - fi +if [[ "$(id -u)" != "0" ]]; then + export DATACRUMBS_IS_ROOT=0 + export DATACRUMBS_USER=$(id -un) +else + export DATACRUMBS_IS_ROOT=1 + export DATACRUMBS_USER=$SUDO_USER + if [[ -z "$DATACRUMBS_USER" ]]; then + DATACRUMBS_USER=$USER + debug "User is root." + fi + if [[ -z "$DATACRUMBS_USER" ]] || [[ "$DATACRUMBS_USER" = "root" ]]; then + DATACRUMBS_USER=$(get_actual_user) fi - - readonly DATACRUMBS_IS_ROOT - readonly DATACRUMBS_USER +fi + +if [[ "${DATACRUMBS_ENV_LOADED:-0}" == "0" ]]; then if command -v direnv &> /dev/null; then eval "$(direnv exec ${CONFIG_FILE%/*} bash -c 'source ${CONFIG_FILE}; env')" else diff --git a/src/datacrumbs/common/configuration_manager.cpp b/src/datacrumbs/common/configuration_manager.cpp index 7642d2b5..0d948797 100644 --- a/src/datacrumbs/common/configuration_manager.cpp +++ b/src/datacrumbs/common/configuration_manager.cpp @@ -220,6 +220,8 @@ ConfigurationManager::ConfigurationManager(int argc, char** argv, bool print, std::shared_ptr probe; + DC_LOG_DEBUG("[ConfigurationManager] Capture probe enable_explorer set to: %s", + probe->enable_explorer ? "true" : "false"); // Handle each capture probe type switch (type) { case CaptureType::HEADER: { @@ -343,6 +345,11 @@ ConfigurationManager::ConfigurationManager(int argc, char** argv, bool print, throw std::invalid_argument("Unknown CaptureType in configuration: " + probe_node["type"].as()); } + if (probe_node["enable_explorer"]) { + probe->enable_explorer = probe_node["enable_explorer"].as(); + } else { + probe->enable_explorer = true; // Default to true if not specified + } // Parse probe type if (probe_node["probe"]) { auto probe_type_str = probe_node["probe"].as(); diff --git a/src/datacrumbs/common/data_structures.h b/src/datacrumbs/common/data_structures.h index 56a45071..b7d299d3 100644 --- a/src/datacrumbs/common/data_structures.h +++ b/src/datacrumbs/common/data_structures.h @@ -393,6 +393,7 @@ class CaptureProbe { std::string regex; // Regex pattern for matching std::string name; // Name of the capture probe ProbeType probe_type; // Type of probe associated with the capture + bool enable_explorer; // Flag to enable explorer for this capture probe }; // Capture probe for kernel symbols diff --git a/src/datacrumbs/explorer/probe_explorer.cpp b/src/datacrumbs/explorer/probe_explorer.cpp index 93277e51..12d5c1f0 100644 --- a/src/datacrumbs/explorer/probe_explorer.cpp +++ b/src/datacrumbs/explorer/probe_explorer.cpp @@ -135,6 +135,8 @@ std::vector> ProbeExplorer::extractProbes() { } } + auto existingProbesMap = loadExistingProbes(); + static std::unordered_set global_function_names; std::vector> probes; // Iterate over all capture probes from configuration @@ -163,7 +165,65 @@ std::vector> ProbeExplorer::extractProbes() { DC_LOG_ERROR("Unknown probe type encountered in extractProbes()"); throw std::runtime_error("Unknown probe type encountered in extractProbes()"); } + if (!capture_probe->enable_explorer) { + // Check if probe already exists and can be reused + auto existingProbeIt = existingProbesMap.find(capture_probe->name); + if (existingProbeIt != existingProbesMap.end()) { + DC_LOG_INFO("Found existing probe '%s', reusing it", capture_probe->name.c_str()); + auto existingProbe = existingProbeIt->second; + + // Copy fields from existing probe to new probe + probe->name = existingProbe->name; + probe->functions = existingProbe->functions; + // Copy type-specific fields based on probe type + switch (capture_probe->probe_type) { + case ProbeType::UPROBE: + if (auto existingUprobe = std::dynamic_pointer_cast(existingProbe)) { + if (auto uprobe = std::dynamic_pointer_cast(probe)) { + uprobe->binary_path = existingUprobe->binary_path; + uprobe->include_offsets = existingUprobe->include_offsets; + } + } + break; + case ProbeType::USDT: + if (auto existingUsdtProbe = std::dynamic_pointer_cast(existingProbe)) { + if (auto usdtProbe = std::dynamic_pointer_cast(probe)) { + usdtProbe->binary_path = existingUsdtProbe->binary_path; + usdtProbe->provider = existingUsdtProbe->provider; + } + } + break; + case ProbeType::CUSTOM: + if (auto existingCustomProbe = std::dynamic_pointer_cast(existingProbe)) { + if (auto customProbe = std::dynamic_pointer_cast(probe)) { + customProbe->bpf_path = existingCustomProbe->bpf_path; + customProbe->start_event_id = existingCustomProbe->start_event_id; + customProbe->process_header = existingCustomProbe->process_header; + customProbe->event_type = existingCustomProbe->event_type; + } + } + break; + default: + // For SYSCALLS and KPROBE, no additional fields to copy + break; + } + DC_LOG_INFO("Reused existing probe: %s", probe->name.c_str()); + + // Validate the existing probe and add it to the list + if (probe->validate()) { + DC_LOG_INFO("Valid probe reused: %s", probe->name.c_str()); + probes.push_back(probe); + continue; // Skip the rest of the processing for this probe + } else { + DC_LOG_WARN("Existing probe '%s' failed validation, will extract fresh", + probe->name.c_str()); + } + } else { + DC_LOG_INFO("No existing probe found for '%s', will extract fresh", + capture_probe->name.c_str()); + } + } // Extract function names based on capture type switch (capture_probe->type) { case CaptureType::HEADER: @@ -505,6 +565,173 @@ void ProbeExplorer::create_exclusion_file(std::vector> pr DC_LOG_TRACE("ProbeExplorer::create_exclusion_file - end"); } +// Loads existing probes from JSON file and builds a map for querying +std::unordered_map> ProbeExplorer::loadExistingProbes() { + DC_LOG_TRACE("ProbeExplorer::loadExistingProbes - start"); + std::unordered_map> existingProbesMap; + + if (!configManager_->probe_file_path.empty() && + std::filesystem::exists(configManager_->probe_file_path)) { + std::ifstream ifs(configManager_->probe_file_path); + if (ifs.is_open()) { + std::string content((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); + json_object* jobj = json_tokener_parse(content.c_str()); + + if (jobj && json_object_get_type(jobj) == json_type_array) { + int arr_len = json_object_array_length(jobj); + for (int i = 0; i < arr_len; ++i) { + json_object* probe_obj = json_object_array_get_idx(jobj, i); + if (!probe_obj) { + DC_LOG_WARN("Probe object at index %d is null", i); + continue; + } + + json_object* name_obj = nullptr; + json_object* type_obj = nullptr; + + if (json_object_object_get_ex(probe_obj, "name", &name_obj) && + json_object_object_get_ex(probe_obj, "type", &type_obj) && + json_object_get_type(name_obj) == json_type_string && + json_object_get_type(type_obj) == json_type_int) { + std::string probe_name = json_object_get_string(name_obj); + ProbeType probe_type = static_cast(json_object_get_int(type_obj)); + + std::shared_ptr probe; + + // Create appropriate probe type based on the type field + switch (probe_type) { + case ProbeType::UPROBE: + probe = std::make_shared(); + probe->type = ProbeType::UPROBE; + break; + case ProbeType::SYSCALLS: + probe = std::make_shared(); + probe->type = ProbeType::SYSCALLS; + break; + case ProbeType::USDT: + probe = std::make_shared(); + probe->type = ProbeType::USDT; + break; + case ProbeType::KPROBE: + probe = std::make_shared(); + probe->type = ProbeType::KPROBE; + break; + case ProbeType::CUSTOM: + probe = std::make_shared(); + probe->type = ProbeType::CUSTOM; + break; + default: + DC_LOG_WARN("Unknown probe type '%d' for probe '%s'", static_cast(probe_type), + probe_name.c_str()); + continue; + } + + probe->name = probe_name; + + // Load functions array if present + json_object* funcs_obj = nullptr; + if (json_object_object_get_ex(probe_obj, "functions", &funcs_obj) && + json_object_get_type(funcs_obj) == json_type_array) { + int func_len = json_object_array_length(funcs_obj); + for (int j = 0; j < func_len; ++j) { + json_object* func_obj = json_object_array_get_idx(funcs_obj, j); + if (func_obj && json_object_get_type(func_obj) == json_type_string) { + probe->functions.push_back(json_object_get_string(func_obj)); + } + } + } + + // Load type-specific fields + switch (probe_type) { + case ProbeType::UPROBE: + if (auto uprobe = std::dynamic_pointer_cast(probe)) { + json_object* binary_path_obj = nullptr; + json_object* include_offsets_obj = nullptr; + if (json_object_object_get_ex(probe_obj, "binary_path", &binary_path_obj) && + json_object_get_type(binary_path_obj) == json_type_string) { + uprobe->binary_path = json_object_get_string(binary_path_obj); + } + if (json_object_object_get_ex(probe_obj, "include_offsets", + &include_offsets_obj) && + json_object_get_type(include_offsets_obj) == json_type_boolean) { + uprobe->include_offsets = json_object_get_boolean(include_offsets_obj); + } + } + break; + case ProbeType::USDT: + if (auto usdtProbe = std::dynamic_pointer_cast(probe)) { + json_object* binary_path_obj = nullptr; + json_object* provider_obj = nullptr; + if (json_object_object_get_ex(probe_obj, "binary_path", &binary_path_obj) && + json_object_get_type(binary_path_obj) == json_type_string) { + usdtProbe->binary_path = json_object_get_string(binary_path_obj); + } + if (json_object_object_get_ex(probe_obj, "provider", &provider_obj) && + json_object_get_type(provider_obj) == json_type_string) { + usdtProbe->provider = json_object_get_string(provider_obj); + } + } + break; + case ProbeType::CUSTOM: + if (auto customProbe = std::dynamic_pointer_cast(probe)) { + json_object* bpf_path_obj = nullptr; + json_object* start_event_id_obj = nullptr; + json_object* process_header_obj = nullptr; + json_object* event_type_obj = nullptr; + + if (json_object_object_get_ex(probe_obj, "bpf_path", &bpf_path_obj) && + json_object_get_type(bpf_path_obj) == json_type_string) { + customProbe->bpf_path = json_object_get_string(bpf_path_obj); + } + if (json_object_object_get_ex(probe_obj, "start_event_id", &start_event_id_obj) && + json_object_get_type(start_event_id_obj) == json_type_int) { + customProbe->start_event_id = json_object_get_int(start_event_id_obj); + } + if (json_object_object_get_ex(probe_obj, "process_header", &process_header_obj) && + json_object_get_type(process_header_obj) == json_type_string) { + customProbe->process_header = json_object_get_string(process_header_obj); + } + if (json_object_object_get_ex(probe_obj, "event_type", &event_type_obj) && + json_object_get_type(event_type_obj) == json_type_int) { + customProbe->event_type = json_object_get_int(event_type_obj); + } + } + break; + case ProbeType::SYSCALLS: + case ProbeType::KPROBE: + // No additional fields to load for these types + break; + default: + // Already handled above, should not reach here + break; + } + + existingProbesMap[probe_name] = probe; + DC_LOG_DEBUG("Loaded existing probe: %s with %zu functions", probe_name.c_str(), + probe->functions.size()); + } else { + DC_LOG_WARN("Probe at index %d missing required 'name' or 'type' field", i); + } + } + } else { + DC_LOG_WARN("Existing probe file is not a valid JSON array"); + } + + if (jobj) json_object_put(jobj); + } else { + DC_LOG_ERROR("Failed to open existing probe file: %s", + configManager_->probe_file_path.string().c_str()); + } + } else { + DC_LOG_INFO("No existing probe file found at: %s", + configManager_->probe_file_path.string().c_str()); + } + + DC_LOG_INFO("Loaded %zu existing probes", existingProbesMap.size()); + DC_LOG_TRACE("ProbeExplorer::loadExistingProbes - end"); + return existingProbesMap; +} + // Writes extracted probes to a JSON file and returns the probe list std::vector> ProbeExplorer::writeProbesToJson() { DC_LOG_TRACE("ProbeExplorer::writeProbesToJson - start"); diff --git a/src/datacrumbs/explorer/probe_explorer.h b/src/datacrumbs/explorer/probe_explorer.h index 40c57c0f..2ec25b4a 100644 --- a/src/datacrumbs/explorer/probe_explorer.h +++ b/src/datacrumbs/explorer/probe_explorer.h @@ -42,6 +42,9 @@ class ProbeExplorer { // Returns a vector of shared pointers to Probe objects std::vector> writeProbesToJson(); + // Loads existing probes from a JSON file + std::unordered_map> loadExistingProbes(); + bool has_invalid_probes_ = false; // Flag to indicate if any invalid probes were found private: diff --git a/src/datacrumbs/server/bpf/common.h b/src/datacrumbs/server/bpf/common.h index 669885cc..b743ca22 100644 --- a/src/datacrumbs/server/bpf/common.h +++ b/src/datacrumbs/server/bpf/common.h @@ -31,7 +31,6 @@ DATACRUMBS_TRIE_EXTERN(inclusion_path_trie, struct string_t, struct string_t); static inline __attribute__((always_inline)) u32 hash_str(const char* str, size_t len) { u32 hash = 5381; -#pragma unroll for (int i = 0; i < 128; ++i) { if (i >= len) break; hash = ((hash << 5) + hash) + str[i]; From 078a19c652b8e37d6a1a41f52f31d3152f5244fe Mon Sep 17 00:00:00 2001 From: Hariharan Date: Fri, 21 Nov 2025 20:03:27 +0000 Subject: [PATCH 4/6] added initial docs 1. Build instructions 2. Required dependencies 3. Deployment options --- .gitignore | 6 +- CMakeLists.txt | 2 +- docs/DataCrumbs_IPDPS_26-2.pdf | Bin 0 -> 1104026 bytes docs/_static/custom.css | 58 ++ docs/app.rst | 28 - docs/build.rst | 848 +++++++++++++++-- docs/composability.rst | 597 ++++++++++++ docs/conf.py | 23 +- docs/dependencies.rst | 485 ++++++++++ docs/deployment.rst | 595 ++++++++++++ docs/ebpf_background.rst | 166 ++++ docs/flux_integration.rst | 670 ++++++++++++++ docs/index.rst | 40 +- docs/integration.rst | 762 ++++++++++++++++ docs/introduction.rst | 101 +++ docs/run.rst | 344 ++++++- docs/setup.rst | 1551 ++++++++++++++++++++++++++++++++ docs/tuo.rst | 20 - docs/usage.rst | 832 +++++++++++++++++ 19 files changed, 6979 insertions(+), 149 deletions(-) create mode 100644 docs/DataCrumbs_IPDPS_26-2.pdf create mode 100644 docs/_static/custom.css delete mode 100644 docs/app.rst mode change 100644 => 100755 docs/build.rst create mode 100755 docs/composability.rst create mode 100755 docs/dependencies.rst create mode 100755 docs/deployment.rst create mode 100755 docs/ebpf_background.rst create mode 100755 docs/flux_integration.rst create mode 100755 docs/integration.rst create mode 100755 docs/introduction.rst mode change 100644 => 100755 docs/run.rst create mode 100755 docs/setup.rst delete mode 100644 docs/tuo.rst create mode 100755 docs/usage.rst diff --git a/.gitignore b/.gitignore index 951f9942..bd7f5899 100755 --- a/.gitignore +++ b/.gitignore @@ -78,4 +78,8 @@ poc/bpf-core/vmlinux.h deps #nfs -*.nfs* \ No newline at end of file +*.nfs* + +# Sphinx documentation builds +docs/_build/ +docs/_static/__pycache__/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cc9d90e..655f1283 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -439,7 +439,7 @@ add_dependencies(datacrumbs_obj datacrumbs_bpf_skel) # Build the final executable by linking server.cpp and the object library add_executable(${PROJECT_NAME} ${DATACRUMBS_SERVER_SRC}) -target_link_libraries(${PROJECT_NAME} ${DEPENDENCY_LIB} datacrumbs_obj) +target_link_libraries(${PROJECT_NAME} datacrumbs_obj ${DEPENDENCY_LIB}) add_dependencies(${PROJECT_NAME} datacrumbs_bpf_skel datacrumbs_obj) # Install the main processing executable into DATACRUMBS_INSTALL_BINARYDIR diff --git a/docs/DataCrumbs_IPDPS_26-2.pdf b/docs/DataCrumbs_IPDPS_26-2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53e649b15686278de0a118e8e3d13432972803b8 GIT binary patch literal 1104026 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

JH27tz*l%k0jy;n0~|=Q1LCP0O76`zD@+3O?9 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%0D6$8+<3cbXe}hhg>6>18!_7`_C6RUiWzr`C#eU{ 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

n6q+BBW$-P*u^5MlpLKMTf!= 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

9hvDoj7@(!~pVln(2NC%(Q`A@^$HrPJ%eU&H63b z)6R6gE?VZy&jisgeyrQZMq$Y7d^gh<=@IvZ>ows>WFIb7hv8i2^iTO zO|13`nV201FJlvWWNoz2tS=u9r%u9U6=#(n+>MP$?2icc@`o+w`pc?4emwm*-5e0p9IMzlh7?563CJtTp507QLKC!6h9Vs7$Qn!xLrG}Se&$j0 zAHPV{653JX;}y?#bE^Ks9b_oZo$V`OH6y4OnSeltG zCwldJP9p(eM5Y9Y${+Q!r3>~6Mdm?*U%Hdi1s+NRV@bvYK{-$gf3Y5w3D$7K_1yCJ z@9D#4KOMYK7TbHtXFf4V2`XbCqz+dM@4kJeV%gAD%5&YeNZuJ~jd|HgxklLsvDb3z zEhTd7?O@_F6gh`Myx+BXk718`}mZhs)7rS@e+*hoI)GNKLYA+IODn=DW#* zWuY`4TonS1Rpu)gDm$*`#g$G6LrFC?jOw<`9LtM3J9yQoE?bHv_ z`a+Vu*R>Ps#>)fso-V|DjIFF3$Lz!HfZB$)*X>hTb)O9O7Y!3ze*X0X+Tn;B@`zuQ z3zIc%kKTDvO|LhXzHbIZ5AT|N3bE+SB#+BjO{3z0_my2N)j%xwi%4Q8(a%s5@?9)W z7m<1ZiY{Kc0C&KrYhIW=_s^r(q{;i{j1w~--=7adpgREanipZu9eebe^?w;w^Z@@s zOuKj|KKwyk^TO@9qmN$GChu!7PSofD{xv{d^CIoJiy_W6-<7SHwV>a8RFYMMiVJlZO8z4K(Se=8kL*V|qAARIWN^hp;$ z{BVWV1zQ8%&MR`UOBKK%hvMNbja$qp^XKz2$2(yxN;x5eJM4%Wa<$r<&C6l`Zx!lV z8{$98M~DA!S^aeVS9m$I%-i|14oyD}@JBHKJeB;vsl8+H)b4AbU;g8hUw$Ua=$|4C zqFJiQ*Xvb@Z^;>AK_W??^jy#^8xor(Wa7U(M$ugj<{s^B<0m@G!nna^ajHFgv{+NS zs4yR%B92Wigw$^j=-2#K9pdY#yWJjH@$`6DgUH5(L9nkSz&VLC#! zowg~uRB~QcTkDf?_(H~=B1aL$vqHv@Gn(2*@46!=BJzQ*$7iJ_nZ{DFB0N`@T$VV) zmakS-+~4}9J0_IY1J4u$8XeOtbn9O6_-u#A5L;V#u=n|U5FGbk)o;(Ng)=r(tX1xK zi1NfS;76?DF@v)}~7Kk7iX7>gSGhtC$ev4t1K_mtAjiiZYvU zG~P@zAZ*uGY9iq_a<8iKht$7fjiSjgBe;wi$vFNN1q zFRH2J;Hv z$_3WYOOCcgHSm{&$J7QV?uMM>OCnZq=}nHVcASX?K}U=r0-5_jSTPmy0ZI zq=(5r8L9WW+Qe%AQlirE6H5R*tf2=)!#r#8HlDm2Sh-viK@070!&*tSF@ zr|If;aX=ZMy9|pxQl@PxV8;k!>a^N$Ep?L+!LP#F@SQ>8R}Gkw;bUR_7dn7Z2^8nO zo64mrGZJJkviX9lf?Zvdhb3Bey;Slq{tSq#T!_eK`OYz zey*k+Hmo<1Wlv2NCZ-SsCVj%dCRpF-c&1=esMfm(0~`njls;q&wUo(@!F>mF<4@G7 z>-yC|GD*(k;KCEcZ~2>7B5^;l^li^ZrD|Etd&q?V5Q=OT`Ca%>|KQNRhG#Z6_o8cv zll2Jw14rLrI_T`_5LHYS*9s7< zG-UVLa|GZM7Bz_+J+L%*X^&F>#5qOBs81_P=yWB`>=)?Ar4~Jl={Hz<=vRxFi|e-8 z&Zgr$hd8dr12f zaTnevOFOZ(NL~0b^9*^x`_N_jt+w91Sk=-_zH%PkoX-rRo%6Fu1y{ZK1?qf=6uq#h z+M)UNalbfQpd`NaFXvs7awMVeXUP?UJtI*j6h0k}X(dUIu&ykPrl_tValaufL~!Z^?x$H8MsAzTwFaMlr0w>QYEZo1 zRNZu5GhDq~!%K6u1g$gA+>M}9$Gs=1(@Lpf#NBLD7=u`qp@44Q=;4m|pmN7G8bjB;TkBH2Zo!>-RlSU-2&0{*IDTW%DHv0r*QP(iv;TVV+%d)- zM&>>Zkkt}42ZYAPw;lU?YeE-wr$()uWftUcpKBUrfu8y+s3qQ+cy8% zwQC>!C;K$1tR$6M$y!gY=f3k62Qu-^iWn>jC(g+eRZ?6bCXP$0cuRM;2FePy?^TfL zlQu)M`g|4%0VM5x5H@k&6hVo==Yr@>2O8?mZd^WhRS{Sghg@Z#LaRk5Q^sp z@33X7{2=FGz;>`2X|pKkS`@GZMR*1>LS?hPtGFKr+!`lQCi@D%&N4MkoHB8hP-hv^ zEj*6g(ezh7ucXYamobz2C(0sJ)p;{j~$_ zts9S^r>6@pf6SUvjPjoZ`bg{~vvyeM0j5Fc)Q6#qR7LMg=$T)0RpoVIr5z#cdw-<7 zN9aDZokrHcxXbSPLz|{W?w<5gj=0lzoRvn&Ede0G80Ad*t;@SisrFLon?(w-tkJsqaB9f=Ddmwvvmcce zFYXuJCG;GD3&{B{wyxFgU`eqjCXj9GlI7_Ca=(nDk9X}O;4f_H>4?KrXbS0g7esFu zWeeT8{C;)5!bR@BQrnOPM$SB;pLMXtI1b%4R|%hGB!P-iAv|q7kc0U2MwkuXHWzg` z;(q^mFC?z&+farZK{Q;Eq#(F~_R!ob-W(`F?r(gphkR^&?u%nVC6iX(zSeLS{A7K= z?sT#|vs6*ePk+eb#QC$>m^z@5;lkUvHfxhk5;~~pq>(BG84Vf;D&c}qvd88KtC0<3 zwl;AVn(ZC$4J#G3k=D8y+|4l!R&eKm^$2mD>^Xpyyh=gG2Aqi(?@CNBh7VMj#BK++ zxE3lc{Eo8jn?kCW_iW=KUXair|2O=VecZP@lqRCS+ zTq)JK56Xhz!3Z;miVAw&`j^TBRfzFdpN5;{`W)mk9Lj?o>nyr~&m@y?qMtw|bwH|N zmJ|ks*KkIpR||r{6#Cz>5_MY5MKJW93HtXOaBVpY)k;e06RgFM`bRitr>`N_h!N-& zyy@1NW|Kx_BA~6FbB4?df5|MXn?Yt%CZoSc;GacIH&qWvWa}4VH#aHs zKhi;4RPqJs@)^ZOB$=Z4*mrcHeSfPv_x68%m8&fR#bw+TDn0E#I-9cmIp3-4Tdvw{ zM@=dPP(HLDJazQ|yq(8o5aM5^>%$*IV&oss%gWEzU5?sXTTbP zB@JCJ4{Y<#rtDAdM>l=^Uf|)#%&wyNch<7^oY_Pi(4?u6|E%C{J=U>fVIs5sMXIRy z(cR$e@NKmC6Zm3`%Q1<)@QZ;PJ;cbmS{Biq)+lqN?Py z2GpWyYDvc%uGF8S{l3X0@7mhA^Jlbx_QOW)57;F@*GY9?pM=(;C;V;B67Ik%%m5p*4*8LJ7 zPZA^<$`LNEVED$mPvNg@`4B1Ib$Sriq!EwMbsbvrkZSfxQ@L`(qJGE1{7Vo0Xy8iJ zMQ*-q2^7X~L3R2}_AgT0=C~spg6F}!p`?Peaz$46SIy3173@Sb_)pg@p$U%YBUHfs zHDij!6q6p3+*bPAC$Yaj0H~T6D5dfccpsXo{;N8hH!it04xvzmdx{c7%FpY}6D;2& z1SYR5W4kRm5Zk78!s$QnVr@C1uufDn+HM2SBsDH-@+@|JiPnnzKjolI%A5`Dlk%*s z_9C!sEM?Yh>~`0(F-5x=M3i4tcTbLj9E@?P!Fh zYgWZ>r0^wK)il9}>fzogq0u{nd24vzwH?2so1u3db&Nq7$(#~VGTTCEm9~)w)<3j zIRRa&4?UI_;cA)sqyp=OC@zIjy;V-C=PG*Fuy-jk(^NBFDXM(dQfd3)-HT5^rSF{C z7_)E>3}w^)x`-k#b;pUtcreVOxk!5yCt5(iY$|=s_6NIr8p zE>b1xbwDLU6>ypSXB*!t!logAQSOSbV`td_-e(;mNNjX^Hc()qcuXFDgtuRLfm_&# zlQaqlZ{2e*FJHj@-FTG4lMh%jSkS?$P zI1xpYjX&%IH|*;%E{0dd9B}NqMFX<`B>a_jLB2@`#;Ca?>`YLAe|rXct@3*@(8@s% z>UC{=C-8p}O*suYj>~&uHrRoHtM#8UAz}d(azL9J(Y%A7h07&ybi2bdjL<4ChlZq; zL%q)isCGmCxJXvu#vV{UMWn9&9N}i%$m-O;yrhdine5xKdUy#a?Ar^4EVv7aT#LIU z(epm7QBX}PZKtqnNM0AGAm1I%>jC$z-~dl_NrN2g2jYxY5&iVAYxoT``ip!cb#L*7 zH0`~HLr=`2h$$zk3;}3d$}=OtO32J>x95cb>*CEI%A=y(#aKf*7lonxuG|_fklMpK zHuB-O^So93=Zz@npo+^oW`C-;yAKNz`%h1Krrjpju#(?B6iknCPnhAGi)7PF&b!|X z7FB6`?G~|uyy|EtW#@5KWad#ci6|(v5+x_FNba<+wL?xLVojaCw#Yfeg0w5cY-cF7Qrf?{rOS=rQ;<;V?Y z0!mZ3;;*0qTbL|VM*5c6e^bW=2(%pAs%6hQb~*yqptIC1;^{jQRwESZ61XNB+7pC) zuRs#q)gIyvq;=!wS7!I*wc6a}H=~Z6v0OriHD+;~8TOA4gf|acY!ocoGve&~ z8FGIN-jIonzJ#$8=OzDl@c;h+oc|xee^wG6R`!1!?*F4T**JLr(YgPGZ(QA6EKD5W zthbx9pp7*&mq%x+lAs_EI8mq-&_v}Dwqegu;!mSWSa{1zi|K`0T*w+2w$osO%R*a%* zpeu%liA0#Y={)#C3!9J)7J48bJ?@CRQGiHGxVO}Oa5CxfvT-Dt&K5DI&(&bBc4lT& z=1A${CxYQWSbX+CJ>A{$YFWrR5wWhAr?1A*AGO(~e@Wi6lRaZYws@_-Y}IMHBcw6JW*%kE(otLP@m{)!_(4%ES|~mPUrPI% z&tg_H2RpZKul2!yrA8aG=)P1bv>#Zb{D z$<#Uhxl%Q4M~WuNPB8HYwDZ%G`Wuk^EjBa9v@Y&6_wks7CK~F-{FMUCuRD|OEKk^1 z!=sx@S$_O^KIz?{DdAhMGFLN8eh+#|321u4M3wW=xd-u$eJY+ns|s}I(>M<3>s|P% z#g&~Sb7+3&D&CF9l83h&M^NCjGeAY<@S9^(m zYETOZ?xlT#xEB6v4=5Zxn|Y*g2nv9=4fy9vl)>2WwL!8b6EFG>QA`kRp?n}r>`+Gd zh#(lv)$|qTMBO7dvjG3gNWu;%!Ms4AJ@5^iRbWlb+lh2 zB~RW~V6#(nJt5iFwn%N7-QxEEaSr!#&&`tKjXFA%?b^qjyS0*akM z&k_!ed-m^-(CG!pW@AnRxO)RQ*bay#D^We#s7mX@-cL6jx>-zd)`EqB-{_b)Nx@hNH#Ub zOH4DBuw#cK9%AIetZAMcCy1~aL6y4$!hVj%`*&(nnd zU>7K)vFY(i8D;say!kq(yzL&J=hN*PyR^gStMyhnIfdKi?gm+fuTvj)GV*~z{n9{L zm4a5>+)1%E=8D-eYVXFTjfNd{2vOC9{MnN*nkGwvye<_9*OhR_xX z)}Bu1TeUU(g9p!qGB53(bVc{wUbS*B80~&#!w<%H)zq-cgkJjxi32%v<}RHZWf-08 zz8S7mT9z24M5zsA~QZrX9py#)Ce!8Yo za}Y+3x!mM}TtYyRF&f3gBlZPfro=P=Tv|qIS6iE3%l!*~QAK;b;v&RMNFl3X-hUwy zDY{Y?M`}i2T)^dAH=_&4(ahZ>d0z*?Gh84Sk$EaR!!6jb6@?UFGsOxv^d(zJQ(cXM z($e%%XJ7hzNQ9Gg)0-+8k#gu|c+^!V^+ut<)XP`?zPoitakzn>hO$F3P?_;CK`SRA zjGV_j5*ICU^|BUp zMlMo(X%jiBI_Zws2@m&&-bTer%Vit-eB^)=YaxSc+Fy&vXrk5`%i?2>z9c$O5{ix?IpU*&K}gTtJfT?~fF+;c+(HNML<_ zcOfZE@?ZZM&1lQfW3UzvtK?#6%zCNPFoyienrD|veeC;T8Pt)fj4KG6NSuy@iZQ8( zcFe4HzvPQ&A2|U?qQ`<{edYlCl@{xr?7iIVZdJp%^~SWrmD{zwEr-1Lebh^@MUKb* zNv;N^Cb)pqTj=gJ(thx4V^528YAY{FtLsGEKltP@#12%5G`ib8qE-k~3fA1pmWiW; zSJTxD>o$zEwVSzr)O1o+c{-?1_HbDW=Giwl`2S0GPxn;41oPJfA6Ip`SKnv}y_Vg& zR!u!}P*zPvBtG&(ZEXhV06oJi%WXm{AUDuaj{Q*S6EH|Mb;iY>+t&tp5re4}hT{EL zL#-oWmO@2dM{hJ_#s&y7#11?wTN&09D-zCH86?MEkz*Il*(!0)xdsITvrgiI{-%UN z3bdD_W}^LI38r0NS@t91v=MpSjI2loxr!8D3Bz&8A?(18Fv2MN$Mlv?Hx7O z4uKxP&pPBFpj!N9Cg2U3AV48kFW$S3kT{s*vKC47hZO))LIQ)hKGklL!RB&`{F1NE zA}!kexd=jkXh8HKE($UnzGyBS0Ky>r3 zV@IM@HUCS9=IGW40VoRs@^CmL|I?&IaM8z2cS`iP)x*}=|kO3ez! z8r5G(yQRVQED$kJ@+3~M`;XkHH?Z@I)YWBAV#%1+!$BGAPDc*}w&iK+DQD8#xGgBi zr7G8)88*SbE>9ZW@Ho-8zSOx6rHxfrqiq|TFan@Iyisr?r=q>RhL36GiS(iCA%)7N zUOkwS;e|cQITX&9=Qe9NBi+UzbB}sTcO+p{ zse*j5b-%P?j9NcOtQeS-dIjowq4^}sKY#W05Y zgr~&{k>&nxNA5+R+kj@dx|plrl<)itMAEPy?wsC+Vl$71KE$zQ48oEcUod>U1#CR^ z5zc4YgAvRm*iM<&jTZizsvBG`;Ww$B~sC(Wd3E z(O^eoBpS#j5@hhBPN{{*Tn_Qr<~SL-7V&ad*ilfzC7pq*GOjY5nuzhKu2%z29Og~< zWxPEkDS&>oD%Y{&oQIMS@A;^PquCdXXR!x7VtoTc`{8RWvi&2QZuPSCXRoT+6NT{$ zc@$?MYq)@)9}ex}swS+i0Wr(o-StWJv@n`OPDeyM1yDVBUgebwZooq5JQLis zC|-QP0ntYN^dA!m;e2_3)J`;ITPLnSVCMzw7B}qsB~g8%)s?OAt5}Y2=%s57{W^H3 zGC*RC2n=1!+)gA?4e`g%7*m`4aG}qf5&7FEAAx6_B zVvoL>?4 zY8(1Xx|~i?ZG-PQiZjUpCAmUwN5sJ%f1o$+gk!_-mU*{htrhzdxsMBn?((-*MF#th z-OhqB0IBWV885f3rH3Qo#25g4M7CU!*t+wzoi6A|KY_+!{}P5gmdu667nxZpdF|7O z+QLh3o1TLKYzJMTIUu4xs1huB9ur=H;^C&t6SbTmJAfjhK8Pk$@P0NVaEgtHU_!5lT1MuBQ;|MVu{reh;Ppl zuj8LyAhI$KsrraeeMKkR%MlhSc?gsoLW@p7xRmCgh`SC z{DRr=iR-ZlQ4P7Uj6%7J@o;ZJY&;;l^swY#YUp_+gG2X)?YT|eTCV4;LcreNk`6Yw zN*L8JnUTskAf<;CSLGJBDYv7^B`(C6L{^m&oJBb6Fybh)D0CW<_bKej!*;DVLmn<* zbn0KlFaJQHO5~dU)oS!eGnP&^FA?Cau}%@*7u;A^zjd^VN~~%Ib+v_Xg#88iRV3C+ z>{cv*?vdCbb+|CZ1JOo1Ph8fp-d1mv8p#9xBxf7=%BT`=Ub@$_fC~K}d>$jQ!w28< zop=by4X#%6Lx04a@f3A!zoWeDs#sLdiv@CLjjyJ-?h@p#@DM|BDa5R$;Ni@yeXSBu zo>YR8s80$%fOA35usdT+yBdga=SgS%Lv5C~-c5&yL+XxJ8owr^EOR-<@I8o z4aL9}(Px(GljLe11h_B0DuB<@zF81{PslOvFoe+YEbFcu@Ca6qF!zOiNI@y`n=<+N|NWgy3kUlO6PE;<&YY1 zBUP?8m^2-_0ocwt=lktaN};=EBEPfVFkB0u=95d-h&9elstHaOen ze4sjAqVDkAIgrGqyMy@ZMs$z7&k;NDXTW!n7J4{fX0k;2K0gJBz6wcm^{jtNJ=UQn zdwY!$obr8*(+$d{S9wmOY;CX4!-1QznFU5js__GcAEYn^JSZ zP^bf5c<*PBszB@*kSP(;F=+36WEn}~=gJM07kpafF6@hy7uGoXv;VFP?rq!D3ZFqA z7laF_x%=X_e|N5mbQtsO-eUzLBtUkuYb7&(bxx$I=)ER{2Y2vi43@-CxdX6U<>DISp@OS_o&Pr>a7`bIotXbvV*(6*A># zEs-5|WbZHHo}R4W-nZhs_?e9ZOs4sM1dXi-56~wzZS=}s!#1!zzitjI*FakG8(HbQ#DDUTdZ9C-#B%> zJ4i0&GU~6##vdP5uF%UloR#%K*vqzTk*>UYr68@oUV9pJS6jXM%avz=NuKs9JJD z{*R2t2B->5D+lA|-XP~os5(KU1yIy>ss)b7oj_8Ef`qpN~Q?clW!V*`@|0qC4} zyx$XC=yhja*Zb~vx0wQ7TQyrEip?;YWt;;%SyB&+*nM=bH+?u+5)T-}pHMAoGku{( z0XQZE-#GTi?5$NxqN{AD_{44p0-62Z=kcUdS=vSpCGY3jQK7LqQ^pJuYsTBq>qLv} z=$hz;;w-*(v^bM*SVfNg+13vzMcvV_dZ)E`3?u8Ntcpu$)lQ2k<$!MNdz@dv+D@#j z_c`6u`%g*f@%?_SF=Ic>AafmXJ1aF8vZDDXm0#{lU#}c6+6AVVLScQHg z+L$@VflmU6#1^;<%K0o=Je^U9DVj#8C=1BJn_uS<7X!D2I}htepo?bIosz;qEyy>3 zyni{ovt>oB0Y_xlFb-8uiLCGsBTSDQk=ktvrSI<$)r^_qR+c0&Pv;uN@#r5qn(Lyg zRod~USIZig@DJ-rFTV1JLf72dRbL_*=^x=Cge8^rL>d;YBVNPrLr;if!|kEK(RUif z)2sF8_~7TK*yU$`{>x&WxZF{GnoC4}CnVQll9_{6!#=#vX2CpdXfI~si_03X6`bOW zVVfuZn%;f><2^yaR|9>+2Cf$p2jt1WW#vii#G%v7rg1zmZ!8P%5Uv0D2@br&+fNw2 z<5h=_stOv8+ELe}oZA(fY;kHBL9aC(qU{V?p(FL5po;G1z*Bez0*z&NKl^!|>TSlD zfbb86n%CKs5INLtprOWOb=-utJn}GKLf%R!Zc-|kE>g2M!o0-0uD^GiKpK9SXF!6U zKlyE51}z1p5bGW5n3u<2p}q*aUl`U4xtHzr8b;pX8Z{SnFMqad4Hk3L039~n+;(54 z)AcV<-ZvsW=ocAg^}M^`Jyg$#4a-v@Jv7f>Zrgc>f=$S(qfNB1Pm80R#NHM4IsU=z z=_?IX3}_GT4j=AJt5%|b*?0Sk@>N$s2!Q_d!@A{UR^l?pwAS@7nbC#jhGjjl-U0ka zblWPF@RqSGFqT*E3&%YnxM2nmlyzp=?v2yS`yM;iL_L1FNoz%Q?0)foF2B%)v537$3t-x#**iElWP+{AGw$|DxN!PPL?R`xvmK!NI-w1>sN zq%3Zk@nIVxBC>aOE`7*w$g?>)!d0Mr7o)rfroD&TXrQ)&9o*s`uHbYYkZ873nSJ&f zY82Hl_)S=B)Iv>XY~oxz^yy>-awWEs-&0dNA+aa+0#$PzEOeY!pUYd2j&Q4`K0J2~ zEM%~m=Bag&5BN(@^=k4YJ5&uDUWT6YB3n>zoa6vpj{-4Q@~F>TM^)XUlOKdRB2ERS6|O}!H*{$^s+U+cDQI>OL7 zZ^Pf`8N}zbufEEcN4zIK^yRq%qZdriG1zJlqt54siytr-s>$K)2vTfqy!%`69H$rM zX{0_7=FuirEOqiL4F_-Dv9WL2hva8`&w|3eR(Uf8gmvDz2c2i@Ry;Ue(IJlbA)F`| zLNPiH8H)juVkbweQeY#88giH)(c+@qrw^zYCGq0ffkF0H;I{dGa2Yj5Sg<*)v4xP` z&_JTjd#cs*turW1>Fi#Z9B!k56OWG&|11P3v)^zhPU_sOV00ufD_{LsH_y0sN_;1B)^Na!Udo78$`7j$xnP>r zNJ}~R zLcx4{8 z%IMEmeU)5jsQqjyzi)6peCJ8&S*IUG_ksYIW)F=O&S=vZ6YcPB1ttfw%UYpb3~T6d zkPXEvYq0g2sz}xfCFva_Y3}?hj4#*K5FGZx8DUA@bE?VE850IY@t^TR9jZ&nN#bc= zVfcr85QokdY%UA(9>L>NljMS%kgI#5c?HNP8Y2|=Y91CbfalaT<|NhSjt!%@Q2X+prsj#>l$CZw- zCjp$2mZ9#z&J{xue?b!?NtI+D@b`0>m^!3Iqpz^AiqSqI@7hkHZpd$#jW*PAx4BwZ zXUph!t!WcPJjmQ(fa%qP_L2MQr_CvG+RIBBpPi{YXDc>*#VDwDbo8VkC6^5U=B8hx3fb);IsILdQ zcwjf~CjD;#Oh<>1)C1c)wSW?WmcL26hW$S+1igRipsz7M<=$L&mq(udRX=5eyukUF z5Qy(COU1h68)33{TS0Dl#q%Vsi@nGV0pmLZsayhGjdIH z%s5hr_Jx>a55mvUwcs>wTuZ;FJ*O&-5UUN3pl`*JleP|zr}#u(*)LCy5@ z+&MMBoD6O6n4BR~QH3P4W@+{Ol?l3N|tERh# zN45Njtg=?IQrDJl&*mULiYJ=`13NmXG0**KZiX|cH$+-Dw!IMi%rM=AW{N%%X4+;) z1Hz{gLjM8O?htlQy{DtIR>&sXO*aQ6GHuA0Jv@Q~JCOz^*u8OVN9xk##4}A5_?L7h zgXiHjOYbH>Cqj63ZTe?%gF2wO@5(o#?VwOI;yLteaX!`S=xpp)$i*5QD~%P3E` zr?T-A9TLKs_}|Vxbij&~-c{|hJVYYS|8$97VL3df#bYv3O`f0XAc|u0K8gROk}k~) zueb01fP7yW2l_!v4)uT^l3kJ<3h#P1JoaA5m4Vi}O~6Dy?|`}(+`J-p&VT*i8vJ(Q zd!wO_XfU>*TyTi%GX1QEA5nc&Vh{gfzS&9;&)~CLX&GU5$RQcHeotf4Q<_04qX!_t zPP7TrPIw2N35kFN7r|$0Ud{*G58`*yN6!zeC5H9m#aL4d|Ux){OltV};#QKVGPp$PdRB5aHTt%ul}B3e!jp_6&Xr(L!FM z4(y6)KzR6csieNfVhYXejjhz5x&+v32Wy?pM0|Bv7a?8-n=Y;aU|t5M8n2=zJW=~e zqqq@YcS`$xnGrQI{Al9#0Ka^Nm8<}R(VPM+Kib{_4&{DGhuII-)HJ~}#W>z&OlsLv zJTK=#Gqhm?xxcPQS;vs=I_ZGW)IclZj$vML+7`9|=^n+xWgjiutEf^KA$qnyvm@Lp z7XS0Me;@n+BK!pxVwdQAvlq|m^16D)8Ggxe*6Xt&P$b$|Y_jF&6-Zs0F=-#?$ zF?eT`Cvmvp6@1n*MlwDWCz`J;;iI+l5B)#+Bu_yRf&=!-QTLKB33o6nIHq&7RXwzq zg?cg%+mQkTKS|*PouYL(%;_F_b zFA}ULl(^z1!l}D@d_k-cKe!#ZK&`PC#3zj6EwRkmjM1Z>KIoxu<6Ul|*(vea+K!m+ zqVh;VHpz5`gd%NL{#3wD@{ zlltLYEyLQ8s~I*p=hnE^zH3DK&nahXEr)(Uyw_o$>1(9DkUtTfvO84UIv}{uZBwex z3<|8H`%UQ>-5HAc!{}9`N&O_V8CbDk3Ag!s2%7ut=}PvpewgTc1Xg3VgaMtqxJ(2- zBX|KwQ%C&uCQb!gM#cJZ6Q{8Cl+Ov!es%gk;Nu(^PsM7kuGsIN5~nrj9Mb$wJ@LMc zbHa^Ntfwy#btUs451cU{uKO<>sI$13BP^Z6lBf8+(nbeelNO5%_MrQlAst7Y_;YnH zk?v=ri=)PAmHF#e7Z_aOdVbS{WP4om877&_Z4 z;w|SOypx0Nc`Z*_b=dRC@HTn4@$z-&iF_LV-UagVtP->IjcZ)eux=aiREdPQZl{G} zdm&p}-$t=v7$6nzuVk3 zGQf3q`&cbR@rg_&?v~lUvQ4h__tgEDf|V?_Y^r%2MQ{KB1#DEhMoViThjiy9_)xTd z**`oV;Zru1IU_*a#MP#q(CF|1{YOZQEioVs^qbPgDF8Z6@=%j1pompb=m*Pu-CfrY zFFV0vI-z%X)%*lt1O6MU258-@mq160>?7O+hJb96@=5qtT(q&5%ptN^+eQBmH7>Ib z7#8&3vUQCB3)eGE*%I?&^Jc{-JJLyr9?B^5h(jn@gTEqK@-zKk;Re`CC%Z_0cpP%= z)%`^F7jKaM;;jJ#QXwYZYG0vbUr-3%^2~Q88h7-*ykN2{01k;Ehl75Sk7aT_mRUwBM!RF+fc=iX^R$6^&eC?{^t}Q8YKvm*TKWP}S>X9-deNGap6GCQIP*2h zJz?fcMUt-A=SLUp{1j&I+a7@4$ruTM_6%?DQiEV4918SL^0`>>29|Ai8;zW_ns^p$ zudDv2&9>Q*eDtpS>Bus%8T{hZJ|AlE&p*KLNo;Z{T*U*(?k1Bxx8}b(cdnc+9!;zJ zw)Q@qZrW3UTrb4s?t9>wOz2O3Y>W-$#C(>Gdn##&*sr&YVrK{a@ec_wi+OgV+}C?9 zFvwD`<$^!@#<#DoNk-x?fz4y?R4cFHF%u92Z+=^x`a9#?0#CD&W6I=2{mOmWb5ySw zE*=ivlAMV%qlPpvZm?4bG!)sy`el`G*jl&^#ON(}j|w=bFzFdQDexV^$WK4NzrlJF zs;K|4An-#fv0+xxa)fq3Y2kQ9TI@+cZh5wquO?q-e|_GP;U;|QAn@4y?}Gdqd4$B5 z8@SL;=*X%+y0hpb4cOode6NZ3LE>g(!9I!rC_OF4n+RW(nF}d%D56vf6zMx# zj-0G+(DMD_K4DCLLTz}4#dd_OnQ+B01_q)t{nBm*?#l=}F8|$jjUyAJuyHYyD z=Vmous6Dh~_O$Ee7#C$|t1&jS;_A1#Q;TpOFvr;Nu5nAC5`(2x%bUr;R@J$T$iMxY zxf%qK-+wl7u?k`IB9mxij6JHobUOOFWF`?+qa`t*Lj%bxFznl zu*A$s&q=R{Dc=-kL`fc<``Y%spgvk8*EtpYruNrX)%74Dso6QezMsk$A}3$)&($HR z5GTe3NFM}Gn7(x7#}Ob5CeG9HS++u{WUe2k-^@R_>(SaAp64YROM<6S+XZzrTGU z?`Zsiwe-OWhJMb|Ye!>t1t?`CZ`yLsi}2$iT11NaBK^tNrpwL#1igmihqzID^00h? zaACCkIeLG5$Mv_@9UW-Z$QGIL#_c=iNt}C=uePkU6aKV((#U7PG9leLC5K#WNAZbi z+`V^GKxOKCWY*`)rT!jo*$d;|0Q)fV#4-KgMCD$zD)1w4tlY~HgsZxOD8NY5i#bnd z?JCR`{m66NtQL|J+S=E9lAYf(D1S5lU**l!`%YlVOY$3_y`pjl&Yd~04tVfR@@aB; z{XXr9)}vL`W2QH`LwI~MUTI~{YEL&%cj{x6n%89Tw^I52KT8DSAMl-mV^_R+^}*h! zg8|<{IX@~mlTXLgJHaG;LGwjIn7KMw#)j#;m>pbm!t=1*7XKOINU-$A8)clAe6|9xTm<5 ztw$}V%n7C`WEILNxgyi#9QM(r zDPC3YVg%&eda8VtvIx%-kNh#2w@%(sc*c8#-~g5TEoFNSJ#1YW$X0+>uHVH)K=(V7 z1e*iI#oE847w*a@k|(qW@+z!UG(&}*0~HTpjWaeVsz7Mg+B)L6F3sbLV2TmhcJ>qT z_jtRGe^{H~l>n$^<3q>f2Uj!kdPzn@**#Gxi__bDzLa&nlu#LAzV{|}*;G@53Kj?2 z!1gM)1p2cAkS!ulQk(SqOA^Y>LWBqZ?ZGr>*8tQH9)PfjFBj@Z$OEqnks_AF$-OxW zsA{#uDX1XKEZ<71Lq+2Vvp!P{B$~Z8@GV@6{>t;@o(u1(nkhVrFS~nB!hj4|?RtYF z#U03mVlWdj>5D-8VawM+Aq5{$kLP9KzYY+%hvP-Zaw1Hmdwf+L7k1t4B z;`i$h`Sl);E?E8ZBJog0XLkQ_N1-#Y2Iq*9 z)^x(M7F+G^XUx?L-}+xyJX7xm;d}(hHR=`%8sAnS9n5k>H-604JnvW(h#}J^exJ`t z3lnt}Y)yNWUc@}(VH4zQzm6auufT@h2+cZeR-Jx`8pKr$2e++hN5(*!x`}Lp7Tvj) zPhGlh;H`UO?o^jZu^@Oc0?o_&(|8AmZvGBdHz#E`v42kkx}F7BmDFF zp=ecz%^~Cw#^=nK9uQ=pSCli74PfRt40*d=d^3m56J}{eIyoR&pCmJsx(9ikx_uIs zm8F{zZAWhjQP)4e2nedZr4;>AJ{MP1A)Y(_Qfo3Qqs7&QH`s~&F`vr*n;vD^RtPkf^D?k2v7 zQbZkWGVr@oi{tatoAE1p@B7B)^e5l)TlR%Pl!wt3)?uW9LmRntufq&--3->qV*V0$qbqYGAGM}pUi~tzp zNTv;naFKuwP^YGWx37k`56IUCte)^KwF;qrzFNY|0^iI8zpMhkoamgi;t9(=d)vOr z$$OiL`ULm`fqQo9K%%E4VS1Cvi?ieI-rB5(Z&JL2-EZJC!B)U_-u#qzK#j-tPT9Zm zl1#v60Pl@5EYFS6_LTRJ_`3HGkK$)ekgV=z;K^4(X1m{ptkuT@si?gC_)YdzQH<}= z`kJ8d#!vEQz>B@G692}J20c7_@j|YHpM!oMQ?gWn;Yg!I11_D#)IJ$k4E*=No2$qz z*|z{lW^D>?fL4E54|{*J71gKC5L;)OZYg4BhVTSVQHfL0e_XdWg2hXcCI4NY=?Yq) zEb$4;&5(63$O5Hh6v*BjL#|7FZVmFcl2-l#s7rL@>pUGre9XY+D@ztW{-i2hb76Gq zkgw-6-xN15d*=N|RQE!7)sy&_+9s-#+Af?(W5%Q$nE-AVtQ5I3t|32o6+oI223>Cy z6tw(qh{Sge`1>p8#$pg@N4_(wVP}9y$ts9x0LTtAuxb_Y+e56^)Ts>mL(BmO`we%V zG^7GNUZlt*7m_O>`HsS%q7)w061iC~8qi>ADCzOV9U&Z+f&;m%?g?^me(|d-bbq-n zBv0T}?$m#EAzy|}82&JMCv*p#;tf|VO)$9ly;l_;`HTt$krm~6Q;w4Z@_K4rux@eW z)6zxj)le|^zT!Q0Nkj2ZTOvlW-W%v1lx?PnGmd>k6P#}puZk!317EUusO8n#Gs>yy zRmP*n6)$H%t6!q_-|I6Ue*pUP7xdCeH|D2z>n#9Z!-U(d}fb0^nG;NHDFXVx_cx zCZARXN(1yM6tCr^s^T-#pMC-XuaB(+%Lw_*)u_O?Vup6-_yRQ<@r7Tf^qce){Pf>@ z)-{d*7fjXfFMP>z!7T>Jr`9gL9z3`f=>F!vx6>YAi@kTo6@qr(#XDvh35wXcWo*vm z)p(%J>?KC|&N;ZYeVvnN7(B7`^kEMz>sd0*Y}3U%xuW&%*1TumhC4#L;T;b)OuG;B zjPPyXmf1dCil*=GHx1;Db~qPcNCh;7T;+VM(&v1Hbnzp*G~{gSFYirZruwLBUfo*C z-))1@j&FcFW6L;syJ|d;I@Q|tPU(>nKL2;>FA3~QEXW5GAPPK7&+l9S6oeo`8@=au zR!J7k(CXMN;@ec$E^;WGG=8b;LEPq*@7+4jo z>sYR=WqCXg&qyymM5w>KT!20Qy#RZun$Ib_{whvWT9b#oj(p8EbJ<E%mT9nV;eo}+dvxbkd`HMPBix%lOYIF$Bq|)&UfoeMsFat%XoI?_9Zq@$JZV#kt6+iR4LW1=^N@Cvk|K* zDSqNBXA05^x@>^%XLj$h+?QRkc3gVxUEHUG5F?Beka1IW&Dl28BBzzx?awLC+(7+^ z&%Q*AVSOvy?y2<>P$>p2)Va|eqIsyrE|Jy?4P>&3`5i#@@j0E#W+RsyweJ|+;|+KX z?TH;2=aMiPZ#~dng?xno8WLyF^+Y&6@Ud&R{5p#D;iq1%^*R;Zj=iI1$GD%d8T@;u zh(QCqq%0xUiM{(Q%?P@)5!X)-?MD6iTw=gaV3@7aV~a~~|2NeKtM5TvgP?k`uPZrv z*jIhTTa)dMOZ!ZrhGU$rQl&e&iOQA|=0$OP`Rxzdm~yS3tazJB|0T&|Mm?=*?X~RY zuU73{_F;EMNMMD*^*Fu4Q?D&I%NUDBaXrCR-Ni3mghIM;cSL8Yt_SQ$h0XCsMo$a* z4#CtS3{61hdK2h}*iPCcv7_Gie$_MyHz;X&bCF zsSA<~u1+8j{D^(cM$57(YlS%f#jQ>IF+h*zyh3aVb;p;&CNU@z@6Dp=OW{a+*9h_W z2#Pbb4WaV>O2n?pREPi3p+p63JSKk=#1yJOKW)&|{_E0P_|hBni?85~&y65C$eUCG zqt@b9cVUy;25OE6)0bT<1#o-5a_cTIJ7qg3KS7?M;O2HBJ-`HZ=nOcN5}rve&`9(^ zd0Wr2NNKA~d10;)!Fm+yh*BIz2jSND3LTXGHu|t;`8EfpeJGC~VPVKGPE4^g=ZsIP zR-sTFlB+lAxj5Q6eREc^I3-S}Z8+t z)sjo7$PT7odP|rgB?Q6!;R_%wT>Hs?!2ItPQ}wUtwy>at7qt=X5FQvnHsspmMNTYg z6f!;vaa4xlYfn-};tbLMiS+0PzbCSD009&~Vt0x4cKoGw9|xcSKmw>4JvQu9KX@VA zh3Pv6Ohe`%e+mBxI}s7Y=Rk4f2k6`0m3YY%7wumKiP z?a+43`eXq(P#lPA$kipK>Iyf908_v@q%_pB(jRL`X~;;ZNJtncb??21fC@+$$oqd( zW@jjM;${3w1(_B0=*M-ndqxIGj;;xEZJaJ!Vdkh|7> z|1<<(fYL|gqwo=X0bV^5$OG~IBO{bxaB?4+-zVW`V7ULRuOg2Se0L&nKmMzuop5Z( z&g<}U@GX*$j2n8Tw=*^`EYw67#QeOWhR~{;RAK9NYg$ z>$F)L5&;E2zw}$qBd#{>=Ets|Jn4|GVIoC6bZe|b4MjbC>o5u@YU?@*Cv59D$||JI zgGl=y?$L3)15*&swye$#v1L25ob%D<7@sYn7aTARX^s8xN(eRO8&yCC6o+Dh9cd0n z+;kG)oHrisFZ5koW^I&17KIUM?E(rDbn6m|Bfdj4g%NG-016YR#zi|ITb&faJgQYO+fX1X(X|FKjPpuQ?aH1c)_g+W`C!{J<}GUP#*z{6ANr?1ImN z&qB`v?!xYZICXGJOH8)WAC0|kqe|*V7LJ(CZr%} z*Kl8j)-g7S9~@ptcVIW5`wySEs~@N@zuU~HvjWAxgUa;+O zs*W@ZM6|gH-5bV-vVQPrQ#O630BNX8z!$(z1zr^tBQIelWhS&9S2Bzc;Culjm3(MT zxbhQ1u4_YCwUbD|EINelb0~illhOpq%VvyX1S*J^k}V*HAcCWSBTW&hpnxNTBPv1t zL*|$WArr;N34~D$AQ?e1f#R65q$3_`A-D+*=Wgff=jki-@(c3|@(b|`YzuGasr3YR z2k-@df#3!51@MKy3qdG!)Ce#LGYB#WF$hcxPYZhI`U`dBndiYWs2-z_%J*9kpFgFY0ohI6b3fFu0GWi0jZ}AH%j! z@Os~y+Rd8=zRn3=UKKydul3lc5U*vdWvrVw)mUxAKzwdquCKedNaJ;v=onshja6VY zZqLw*?X-`q1tVT%&e=g%XS0z9nK)-8)G4-gH+GovB_boRsHBMMv zb(mYL*tl9)`&Cq^wwowKdLJF3Ki4KFC%@9+Xl2_d9<@~3AQ6N}x-?|eB@c@-psXOxp5H-XzpDy~yrtTg_U~S*6Xs z&OFFI$=t!e#y!Vx@vMC3IktFCoh;atET9pOEXX9;Btg8>F;86YY8&Oe&#Zd?r?LC{?`o==Y4Y|c=aaO$2n#7EKo)Y z^^OulF2S-NI}~}p4~ScNt)nq6Li`AOKuJVxU^Ww;=x34&vx=Kw=|=~IvsA%U8g(z4 zex|tgsG2QtR~n6s#laCFgi7=a4Ta)D-3E^!ghC=f@MC>w)w0rh_&7+{q9RXRCR7kD zpk2_G!q<^%-q9+FW*5ydPY_o%LefVz)UKIII;*Isho%i@6v3JGnof&zd8ql9Iywa|HdQf^2Hk4U;KP{vx{B=L?4FgR7(}DHguAu3SY{;WvwPxJ-W7 z{a9XP^oqP%qnqIMni#1HboeZ-3S8;2lopZgx2R{(s|zH1s8~&4^eGf?-;V+K6<9UX z?wF-Wv%R;b^^TWjI@(^^+BP_?Io*InTL+C-x_zhvdSuOcFBCh57W<6Ax`&ncB4*r@qQ=d>nxw4!% zP_#?0q@jdsFgqqHAwR#b+h}?Z*4wJKv>h!4_>>d@jUr0bcRi<6_gvH-c?5 zfzMiZpS<#5QNYCY&oP}foV2AGgB%PJ#_hMUlE2a)EF`nlTGy-&9eJeJ;N4=d&TB`Dbq~YnHkg$f zBHp?SdzGXgm&iiROC51GK~!`SMCNTJCMH=XfQDApB29It)<9pbE~u!PuZh1KZ40D> z;&sj(MB-|wRl=~k)>hHGtUb#{a)YExoU1268%4B2I+)sVNUV&UY93eDB9ToniGbdo zf5j&cG3;hAZ7>p#)R8(o3peMK51XztFhe1)M@`NI9A z&WyYma67u-)fx2%Wfex1->B}vfqKsM3AC~H#Kaw8!@7Tp4R28@_V znn#u6&hr`Eu3MjpZ*|){N;Y^4WGYgO4jBlCIo}+dwR2u=bRwxQsLEqynlq&b9c(f^ zrPiJ_0!xQFy0<-I|KelgCC4FQpywdvq~cjOAFt4?UuP|OZAWEOrHu+UYO7I9IAVArDH1_#VcC{yD?F9wd;g{-xXU9(%uCRWhk7F#5dw{j+r7T`ZW)6aSdeX z5QW?v+?X6tE}01i8WEt>dw}s-A)PTZyD;Ht)f+FEXk+7A)#Le0Ue4jkv!}bjPuuEg zXlm-|QQEIM#%2d&mRV+M;9AW~)McB997Pd@Oi6o=hDpQriirva-JnA+V+yr$4(w!+ zboNdvGnu57#zis3h`{QQU)w3OhSWz{6g-M6glm;8K>rF9jGb1Cj%Fzr9Xtqe9~5rW(OUTf<&r1IEYVvb*X+6;)D2VLbbEim!ZJ zidVKB9=15m{N<1%J>(|((B8rhgv8Ap6F6yy zyfbPU$95PsWw}UVDd1F`iVZK`%kmdSU!7%>1yGwqE3Xbx2y{5;hIF{VNR)=X zi4y_q&!oF`BxM=&#i%RfhcxIX_@YVE`h#QfeMz(^X*QGRR8TrDmHNk!b_jfRv?S&H|r0&Z)V-(8WCw;V98Y46h z4tY)gq8T*C-wx2wG$Z3q#i!0>NRUeh04jOD%9VWev8Wp?90DgqOgKV z?!u9NwZwL8)KF7H)uoscoC5(DTb4w=b;yc|Bkv*1j)sw|gVyc=2!Z z^i3>l+DV;w#mpphKU!)E7802_Qs+(2|9wt`ex^-__sVo zz2p>g$&1q)E~gNLn(4}~bpgjtriDsMvnT=Lif7;I0m@Ta+y>$0GeRLB@QNUj4{Xhe zTh1#Um(E=`oGMJuVdbeyGgpW7pC1KYf9G^{aY1PlfT?fm{5__Z0c>nL?HLG_Rrh{L zIxPl$0~P1W3Dy`g2dK*%r<+`ED?|Dm+fVDsj=~&Y4=2EP`U-5HS6$=cZT=3YnWX0% zG(@dqib&t^zn54=fSEpybih~NcGonAlBN4A^iv{bY{P~?h^3)-%hWa!gfC=wPci?(&&@iu+e$>Zy?eS1#XTCY(}wrZ+q-l=-PA{CBj}9| zZP~k?y6UV0Zc4#_PM90;U`wy=LeL|e15b3Ws4gYk=udiUUIOc?*NU+?g~J1Fe6Als zYC!5FA$JPw3y+WkzGT*ji-*TVAV;v^VqtyNm%~V1=%(tX8YG*GnxVJW<9rT=kR8_M z`#B09$2b(X4ylr&K90clP!61YdSCk?iSp9x&Q+AD`;=1+gms&;!BBxUiPml1RL|*T zoX3$VkA{t(mDAgt;oxU#vag(u*Gf-T#~VgWc^m8W{@~+Med8NeqRWCan)F2c%{BbkduOmvVcAGWLB=!>lbZ~s?oN#?!!4H@Z{>AyRZtP`nr|W z74^xZ?{>ds1Jy_NbjPxEv;*4hj5~T73#moDw)E@5QElKRCdH-V8Sh0(7xE52SMdF! z$%g*^eZYKxHCai_za7<9Ib~YOD85d6>ej*8B&>4@?Yufs6ulb#>Xzs-cZ35oo63{X z{t!7zLjyz85PYRNX=u8Dqf69-li<#2JCt&f;D0r&)&(do%y+OIu1>2hTc#m6C2n{} zOM;t#Rn|jsr!kEAD(W(v_1tC&V=@)>EV>mtHQuFJO;DL5>7k|4_|p5(U>?FaK13Ih z4EbsXAc{gs)=CZz>&3`Hs!ra4S!yaqm_)$xClhz!*fmhr528ELD!&o3uH{oIa-RBp zd%=6H7R_;MkaU2CHji_NV7P}FH?xEWJzgO~vU@X#()_eL|2_Q;I!YOI$ot3(CIldyZ z;Stvta}S^YQ;=~?th#A%REqfU9$T{j9L37M-AaH16$7Y^+XF2t!JO}O-doqqNuO>$ z5n;Y{h`64a$hDs|t90rC+(b*;GC{6HvdZ@I@OSXIhO_&9wa5miCI|LaPqC-4c(s~X znd7%}^tQ+F*!@LrU0BxCPPRVRN}(b7X>urClIUgcEv!~6o~cIVn3UC$|C7gNa^!UJ z@Ws|RI(=>FZO{GrB02{Dr*6W=i~G=MXQ0+t^CuN|`8#qK=|Q)Z!laqobhQ2>_S{8- z3Nl+DB{k76dsxU0gq`O>C{eKq!&i<(1B`qlDk{cc*PjV znZ2C3QOl}z*!r4EJE_IU(9-RiD|##oQ>3g|qj470Qbuzm9$iJkH6AI#Hn9WEIcg3* z>|imsUM=r~Oh;f-a|)Bo+DRNfAAjQ^?91%ay$)t}%H)a&?c5fNmQI(3y8Mhq`?Jlo zjg@Kiwb83iA2226S<&07;m^cPIkoM#5^ZqDn;JLS@fVkd&X^YG1e(kRuHO_{27#r` zR*b(vURt8R%-rDSCr3eHf3{QK@I<<1YRZ}-Rv4e=DLyeu^AGX$3f&kXfCxI2L+GRM zJV5mv$!dQ=Sh`?qOr%yX{WrYsa;>3 z@ZG-H-pAsHcaC20qpspK&n*-w5b~{RTQlOApvhH~4HYhGOuS7gPj7YIZFGV7j>qC1 z*mIv=VI%aHwb<$8^Aok9@Pu)TWT(17W=;xMAmxN=7vNS@dE0I^RW-U!vV=<{5X_N{ z+qpMFz`q0+Kf=gj06d~Qn$4TbL+OH*fTzjO&wF!y7-zO^A;HvywkoY9 z7U)9{<35_%IedS<3tLsKMSQE}mA@bz%}=x_a$t*vQj)%@lB|VASvnVG%uSc1rL!h| z?Q*D~)@naSJC=K8)<-Gt^Lx)qq(!4LpG7q;S@3KOedM#8?t}OqzgsMbKX$DoFI|}nc<05My;EK; z7W20@{lUAJPrgL29WbHRq_fXLeW)Cz9a1oLj1DlL*`W4GVTA)|sx-LIqns4OA(|~( zV%81$tQC%Dz)r5dQ+)J`CFM~)bmb-Cd|pcD=9XXJioI1hh;6CH9S+$Jr<{d_rd>fc= z-*uOAJ4#13u%NSLi1*>GaxJS^y;NreW)drWh&nBt#V%i9)x8*b5(G%4?=!;g>d@tm3vw zDXI{PwQ)f{&vX3W(T{u&=VoUW8+zvVud7*H@O=qMoc?%1{YDhM#^BsxF-TA+A)6sk zJzrw?Ylp@!j#E(zSCOVf>1~`ole0}I6(WpFO{7VD<-+%YXul#Yi1(BLoHjw>YU5<6+ypq^)dev4;VR^mkCb!ohh5HZ@C0j#l{bFm}`Ly>~xDK>a2rnOVjG&Vy7sTp{3ajUcKYWtg}1#l79D{18RPk z9vz9Y12u^sL&lm%mLJGdwh;f;SW^hQbCox;0q-gznin0o7~s8*FZnMv;n1*!*hrie zcbVLWSc%j~LU#yDp=BaGg=t*)TwO8881l~rr1`=`q3nm5LVb5f=&{-+ra7k_3Wr8=i1p;P&d1+8@@_0!X_jnvaS5d=SrK8^%P%mdo~5f!Ik4nEAX z=sPa^=aFcVO}%n23(HnH>t@WLpP}QF4QlJG&0g9~IW5cJ$SqH#F$k|JXkt}M8phS- zRX{8{vFJ%v&Heq$DSSW}t9n;1U{ z&0Xl>iy-IGwfzt&+JqJ=JhIJiG`TS2Yy?-8JGCyEa-ftPSRc5D3yLt zKVAIa-7hVw7%I79CFWomGZ&C5xxGx#d(~P$&s$oWb1A5B>^B7=Yslg=AhPwCE!8^& zw=+Z$$9L{UaH_B~T$lSei;ZVsV6}a;ttqbF--wA-gP%d{ZaY^|$}3#BN6-kVT{e}O zmZh6^<1w55fGr!!F$mCp@of#e0NsqgM>T!bAQl>pKe#BqGL~7yN)}GF3Mf#dfDTI~ znNr$PRMbS7C(W7;8#Vpm2;@|-$#n!V)k>LkGx%qgHkGDc*^Rd)`hh&YWXu2 zOV_npr=hA|4*r~U7voKil6ST%%Wx;g`3LKGXn6tx$Jzz&C{m%-vIWLzPj0%$*q8F9 zC{fiMi@-Ti;F`(%+E9zyF7_X5p&*z`uAvLbv`|#xLtxkT^>+LneAl`Ck#GSAQv&sp_F2yOfwuOj-WFR-2pAv-G8(B1Avy zZWhEZrH&-izi7m4VZ3?rsLAe8g}>RNd1d8WBaHEt?-sRzg%xNKkN&Iq75!y^-+`u_ zGHOZCiD)RA<5kntgV+@_MzQe_r=EzVxMI)Ar9SwJa|nbmPV?OWVv_*>kxG@S*;T*| zi_}mdEJ=zq6#VBr6r2<#juL&*R{WfO+n@D9n8d|=Z!`*j(6?m$c-6}F^WtQ^BaOWT0z=dSa5PxX>`I~q?I(!MeG_|eM%~W zG+aO`zaANbUTwMwS7i2`bQN~->LJq@R?=eU7l+GIamu(XKFv#XtnCNJBkjFsFGsZ( zvTF6LwRxKr#>?#*>6vHUv1l#gi|NOqU**>w0XTn!V>3HzBbRFVoT{^D7Srq6hE`R_ z<7@bd zhK``m8##$7eVoGYr>VHh4!;o!kq;Ml2MR=iDSd(k^XA;D4X90!4q^VAEd|Gj zKRa)VoL--de1UPNA5Far!)h;Qx8e3Win5Y224#PF-=sHe;vCzB zlC>S~Xk>}N-vc0z>xv9#7^VDwl>P<~u||o_P+|-3Tl{*77oGnbjms4nlh4ByV>XLR zo$J~72R(p)+yX3XW91K%I{}UJs)lk(wCj6Jom?(A2RpmpfD2Ph^f5#p)mXd)kDh()&tlB+5?wYVm@U^f-?3Pw9{^Gr%Irda(@rB zV~^S>1|Rl=`=MW>-8~i-*H1P_I$$6lT{4!50Y3UTEs&osxk$lJi*{TA;@;IKLK7@X zvzOT@O~|cGk#=5!#1?fN_D;%sfEng6QzKdEHFkixQv8k73-<+06iI*t$ox0ja!2Ur zi^7j9T0w1oAo?GU7j76jPs+(W#Enz1?#Vt^*tM8^V+VW1(!-tfpe>3WZ*Z@2MPw=E znFJ83T|wldJXVMV2PMi|LIO=nj6e4tLzD72o3ff{}^3(9t#kURINeU z4ZqObuIgCj1UIM{ChB3`OM*X>%Q}8d(?imY&sdA)Vk2A*1Datov!DXFJa^kT1FG@* z?m6?s;io2n0*6?;85rs+SK~03k-y~cYm=Fuo1X%%8G5PjZVreQ^7L0^^;RVPoC!1y zRa3uN`Z7Hhhl4-yR_nHCijGSa^h4UlyO=oaLb;A)^fYu&9Qm-r+3(Um9)t|*98AKm z8E7Xk(CejN`*gytv$76{@5E#2=Y`H)JHTCS>Uj)L!CWH#P=FUvc??yqX$% zd*(3W_wyevhF=H2`~rtb#M3<(x(9xJXt=q3VdhLs$zl}83R|~3*u==wPt)#slE)lk zyslpE<5JPy_`a5{ez>?LW0(W@z*2$ww6qK|#~z&$ybT`t&PCn#py$FXT z&d!l-@P14w`_3)$hh}C@EFU&yNjal*atsH@w@(00GbicQj|(G-P43JKJgkRjbMt#; zm{$XRL${-~^Z{l)-DG{Ok*Nc_X?oma7;!0@HPVaO;J!N^yKMRmzMQP_V|3vjBDB9q zWH;YpP!EBp@_o;csdnF{)IaZ^C@WpmG#(edzytWeN~b@hyg$`YfhVl$pFh__Cx9rO z2-uymj9gK1>Fm0o+EP%-T5HcY`Ww<&yoHw^_9jU%#qS&bo!4MKzK{O=_Xs^7UtTcg zi9sz9sHWE+-=LU3+;y9K{!d;5$Nwv@fs>j2_y6WKurM*Qvi%QU1C)=-;^Xl2x|t9p zA`u~D7)l6$3^MEwBqR~3A(S-wFBZcLQc_S8DDFUMP!Y_(V1iH)v`TrbC!kfJ=Ye4n zMoDXXchBE7)^u753sy9w_g_8E+rEjTwG#Zc0SwPu_g5X)SH~Ns5=8mMDuURr!$*%N zO_w8+C4`)CAA=1r;}rZ!%h^CG-tflsy+N4G&@uiK;le0l=4=MK9KQD$erpb7PUEoj zLYW*_>(gYgBrFkcJ|gUFH8rK*bSfR+yh>)70$#r3gckKZpEM#+T}W3N?B2U`-*`{M zCV(yxXCt#oI(ip5sx2XxW|BU~2AGs&_nwOLOAr3Am#bAW7?_somAX`mV1iv$XK3>j z*4MZGA5@|*-Ol!}8(=Vs@Fq2J<2&>@`bu9F_bhrM9}G8bIg<0r!1vKy%!0YrpR;S) z)oy`m6{x~iEW)a)y2_6Xr5&CCE_!k5=pWHj&K*=qBdmC+#D}H#Ol+&N5u?+ML1M~Z z*kptVu}H!Ag(Li{tcmEkel!+rwz&|eWN%>+7Gyq2jX~MD`pR*7#T+NTZwOydn^qIW zzb^?nOTnCcr+84jek~A|JSIROS><({lbLnC$^tJkW`fLoN{41MjRrep7u<8pW^j2j zV!ox3(jznm!v??JG@Q$DCrW}F!_fEbIX_@b!g3~2c10UO{ZrV$_l&Aed-AVWbmnZ*bFbnB=aBL2re9f%=siap#Hkzwulvab) zKy`|eV(4LM(7Hlj5)xR?hDCb zZ1DaS;_k2|$0xLHo%oB*a>BouY5cXwx~^D1VbvGy>(~d)tHehAMxD6w(;vLD)460h zMM3{g5h>noOt14weuT7~BGa?iGs1d>{i&8QJ2iBkKkHKpA4=micS#_vnT)&Nh!ER~W z#pspY-n)UX_hZLXX}ssjX)I&KDakT4>0G9Fh2da)_Ft`?8<`jX;UtV4v?=(P5d4Q(u~a*RV*VPQ z{5{C4-u&g}{PzVFAeT{S2cey4%m$O<FHJOp1V0H3q}eU^T(+~ zO}pcT!t_kS%6Yq@tBtV-PCv%Q1yzk27lIN%{4#U42fMrx%AdWI%oJ4)#_ZUGWllFd zoR6p=kGLw=*kXoi&S`pwXP(R5wWUAck?mIHKt4R@jL<|~;#;HehQB1u2Q|dB)52oDD&uPVPjyWesWktTP=AAcu zLj}w4)!tF_+(0z`z1^mVW(DVX58I@EU1*bH^+-4TFquk z0mEHP(n|y!htz5Wc5Hz@TR!Pr$Pd$gz`+^5g}_qsKU@Tf|8NnsJA#0h|KTF=A-pMA zHK&XZxzeq1&`c*LDes_F(Rq)yf)ky4^3$LeitsdpoGJX{BA}*hRuc2b0Q!4(6=TI$ zVtF%b1Prv;EG0LRbQdFTFol<21C5n^vJDg?DB|xubz9CbBcySU2_ov!!%wFYHBTIe zJ6J%1*~~;0bGg{q6tZ_2&SM>sZlY4rZw@>m+C`3>yIMMuZ(A~ylM~qJ;Uvp|YL|*j z2P!4h)_2gIp?ij9HCV^IxzuM0{{M_9B-x$_ZQ)A6DyCF0oI6K9N`R39QDN6y09Aot zk8+p*NQ`AlQWK_TnY=yh#e_j^0x5I?DKa#9mvhN-Jnc~0p#)WpI_~imCJ*Fk`D_wO zWMqUY{>1^bOl<4Ip+a`4XyuI3QYCb}KL?xxwuLkEj#4Ots?n^@!L4FtrFOtGE>fkj zBqkcfL{l_FET^eiV&uN(%E0606vCdr?=HARzPJ2Fg|`F`eM_b%!ZQ?DSC$*!cK1nO zAAH%orD$)|UsQsFEMbA==7>%gVK75pQgeaPyq2^C6L-DI8@)~xUfpw2g2wlSI5*ym zNX7#mqeU9Vviqc)Y{i^Y8UGqyu=I(C=13KG;Mk=CoLCaXh_@Jr5N>M?L>-BagYLRM zs#z>W>JawlvPppIScY`sN#e*46q<3Sz%wGmPq7mjC zF95p4~K$G1Ra3lGREFnl3x zFM0iqUY|*KR4*;2L`+8|c$Ewnkbk2S+08tU zmKmIFDZY#D2(fXS{e}M}-^mkoTM*yZ|7(+=D+WSVv~FD+FckyJ@)5@pFZZ61h+eLic>VIZ?UPY93D@2zAEp4Qx&zg%yd+Lluvs3!I<_)P_UM{ngaArhBJ zOigWb-Qx@?#@R!H6Kz3QrEl#D-tlzS`s@j-H1T(<+KDWQn(lS(np?uLlw<2e3uf1! z@&^~{PRf$o3s&CBj02-aWfd^y!VD@ZaOGZICB34{5^9nda@0QUX5DZyQkd5ZlqiGIOR=)FRkmS=Kyw1hZHr^&%*_|93j=1=Xkf}$Q{sv z(iaRY>)n^+h)4JrbjFCC=RW)RVfrx+nK|S}_|Tq0vv^EAi|wR*h|-`2-c8)-t#B{m zswa#aWVpCSw5x5ZFDWMSv>c{(Iqs%?)_0>5vPP7Ng%kw_u?m3==z~G0%>=t#7>UHY zEG_meZNUb51F8dQ%dYNdrKI^rWlmeK-R1ypT$f+3gcuV+AJj8i?z3{Ph!>@TM_!k3 zg>Vbxwh&pPInOyYr;S1f9$d&st|^|OL{pvz ztDJRBe!eN(n;-JFYkN*-g0x_5{MrG(55SNK{h(GT!z=E1d}2nlN zZ_09L0NyXiRTW4Lvwo?83_-f5w8^%9&fvpgc?a0!2Jh3&y18-rJ<66hGWv&bi%S>c z!aS^tG)%$c$ZHW+NgZ+z_$MGQ7W~;frqcXQKzBzS8ORgt6o8=`w26tGz{t9swLbH zOergPV_Z9-NiRZG&SPHx__3=whB{%skMt}p7~+9&P08PTDQP)&e6Z`j&~d7DseM+w z^%Jipy;{}2kku9Us6o^K#rm=xGk;C_>;=YjguqfcAa2nPV!ps+{VyyZ!F+R|u0c&) z%8#BUq|;AGP4ZOw1Ma_gS`+~BKWV$HcFTK+cHq^>_0%`kk3Tzmz%CH$YyO&3+rU0T zzR>M;!}0}B5>>{o={R)Vv0ubJ|6NC?9Jc^B)dq7<^D1$`p!v>KJ$r2KGO9Mk5g8Bi z(-r-s!y$g)I%gf%gXA4*U#-Uwf-t~2faW$}acz9$J^MX9w`)do3;)pkgtJ1Pj33es zJ88H)`)eD(=Zd&#Z!(Wc!u`-tg`$a3ejFTg3vk6cQY&k5JDXN0D{4__ov zVbfKxDXiSrZcU$;URUdgvj z6U%y8^JTD;)`EfFib+$`EWD#1=)Gm$zIWj){#TD8i@0@bS#B8lKm8v>1^DA%aHCxN zBdo*WX+K2UTcp$`B9ms#Y@sc%_TitI(FVg;=R&<{@n}mU1We8ijherMnQo5e+M>DtlHMLdFSHRsrk=d4|200UgJ)>c^F)q5b`8dv#SZYLHh`{ zSeP63JOpk7{Boq0&jx>xAady-Ii2|XQl16BFG)_Ei<41kLZs=fc&ayKhb`<%_#@f` z(()qsG9a+4;=805fgCsJ&1Z}HgLp|>9V(OsGX)i&_2&+AN$a}uo=`tbpVdzGdKJSB z)>kJwJ6m7sp5=xT4sS$vYm{vhx>%&&Qk1g_LBFL@VISA1IHVk&b%OZpV>9`oQvCmp2z^VvkN1#E=o?zZ&z!{)l;R zsY}NXwBa4M#jtGzFI=ex7L`uV2|28|J+jxnt{L!1sCT5JJ{q3@N`QaVDtN*ji~%*u z7y_X`s?eWE9pLjP;{~1?)T9|ghc|56acGq>@?~Jk1aw9Bdx_c5?yaZ~NT?u-^{Mga zykKd6O7|M^O0=AC^y8NnrR|slv9ip=N|0;OQ$)j^M>FT3DQ&$H;!xkFMs<>h?BER%pL}#&sMzK=6*Tp zLL?>*gX+@3k1x)*7gd+&?(pLBVJ3#0V&b@Fs$gG#hjC#F^3HJ7Hy%@AypDq72tZN( z`s{UyKfXNSU!T=SIu87B?cV!%?9}*Tpa}q{tLTPv!F(kqu(qluME!6R9NjodyS%i5Fg>WDjU^~daQT0#VeXftofxfORSuLNHJ#Wo<7AR<-+sL*0Bx$ziIIJPyxDwgR# z0)~jo@E5^Z5GKL^dCX^&@I0{~-HP09I48wk3j(uB7yNqbmG}d|nZ9z5SGr7eOkL&| zM4K!`)>5{XZ|`;K?(!pCh_$*DOMCIBb|0#Q<$lFpoQN&}yp75W_)|;;Nq6#%N`B~= z#C%^Ep8h8re%&AsXH1tV#C`*)4L*@-;oK}?-m|h#Cx;6f)4h6Exa?p8-5&3#U|!n6{CPjeQ7WzQDDzfl4?$10H0hq6c6F;0sSEpUg8NcKME z1#8&{_xmLPEe|=4M(EWo*U|Y#H?g{$d zl5DSUT~EYIdlTOa+VR|CTLwi*Xwr&kCK+XAw8!oiFl{#1okZ>Lbc}pC=i@aKYFV<5 z1J6|O)Gj_xNpsBbgl|Y$)a?dYvRzsysO_74h~3lQ86V{)O_eDe!IfY}8zB)f3-ZP}nAeuTS~RmSmC!p+z>)Z0miRL5|ZH((wN z*SLpx{F{XZ`vm~bUyZ9I@A{k!(w1^M4>PGDj`esuF8R+B#vkWltc>O3eb(7VQa4|v zdRvFQWABvxSj`P=-noqpggQZ+>3GXG{ByD4D>lWz>8#F>x5OsjVZs+(+1#|;f-L8{ zse`6v+Rh)sRZX1-va}<_-ld3skvH`BSFEL9rwi-fNDWU5EnfSdppX5^N;CcbQ76hi zWAPed%g@`3Y?$S3*2Rnf$W#Fd*w)#`RgSC1q=4}2%atH;(?O4)u$Msf1l+t9?$EeH z^m~uMBK8hiO#_x`L0KriJr7Z`EyUu^&BnGZhHn+#_dFtl1bqo*?0<~j#~-0`VSnbp zUlMY8BV1xNeFi@}{~~22>*F080%6;-qJv&P+s311HMyi8vG08W+rU^gN1(?c^ z34Il8i{VKGq6;8#2mvXBIPlBtRXR6`oQ3V%C2xV7bzOe3PJbB%kUdhkByWA`)}T&w zRtw&NtGh1zQobV+-W^Du*-K@5`nT$xd`j}1?|orDYS^xK1ZQE7#?|b(yWfQjeU{*F zMh1>dwCp3A++H_Nt@I)KHugML)BJ0jKUyZ3)6sP5eg*z*NyYhjMgxL*?b5gqVHecb zUHf?;X82F!wY%P%2@(qX74Ob!5sZ$)F-w+{^xUhM0cLZu=OSZB^=hhYvMu^~0gQOn z@=|O@$X zyaA*`m!zmtGcofH_1$~yl|slKq-XVyPj=t`!Kjs(4*2ScG}K+#*Li2>Fz04=do(x1uzv!oR=TOwldkw)!#|kG@tN<`yO} z(vw-Mb5Cn?flOGPg_hmhGJdtmxwFB3V3%Y<*e$lBJ6g*f=%sYVBR{iP_<1fTS`Z!E zjarCLfrJ&&WzPEm)RdiDqe*TjlR z@RoxS+_@_t3BN)ThI*pbo;)Yv6L#Tu9Z;QnAqkRpwF4b-@T!W~_ zzs!NEX=E%TuV3$bOHG)bD%&Jq(@ovG37z#>ZLz}IruoS?CmQZ4P>+P`Yd2D_S*Jb7 z>kfLn;t#s&Oq*vmU~<-axD+ca4}^k=SYnOei29ws9waL~86Ww3w}W!PgZwFh{5QlO z+j;(jSkSC{z9iQy&UV3MNMgw~DZ{uPlx~?nM2^RHazESM4*QN0396X(6t_+_7_uh^H^ImOALm6jfp~F((jr^yyohR;hs_5&C>FTz!*% zG#Y*LiolOWESBcWnQD;GqVH&MJu5>pn zuKUh{g1goZ-9JK}kTrAef~O&Zf8>QWc@I@3Rj}{GAK0&Ks9YCiju2eGFEV@EjUN8F z=4T;BJYIGr&YWrSGryQM5Y8OQ@FI@Q@SDvIAbB7k_GPj_X%^|>3|t%H|8q~4cSVd$ z)K`!2O13MK9nh_XAP6H_3`~X9g>QyCQ|mz^lIM|a;l99e(gjT~q==Q~iusAW4-wCc z6CtgExt5v8elF8EMO~-u3sSgTqJBvvo1wO4HO*&e33Hz3*@Ds%we)sF&f312kJd7| zz&}K+BJA&b{jW2YWm&;7f+14^rfi`Q@Tpa z%$0cy4`v`cohj3f+lQ}E+vY3sUnGBMKYzyGuwD*r-{Exsc48Lcs=+W7^2m2}tHkjX z6e7%pb5VSRiMrE}iG#XlyR8qkXX(H!;UdU{%Y4rE*qX*qZ~_0)@z^TYPTGp^kp5!Y z*Y!m+BUbjGv*dq#@2CJTR>D14pUN=IW==55Rr-S9dA?m|JFamzLGQH7N)t56O3Qa%s!JJhVwQzu^fbAJ;JbvWHlQ z@wKDRtc%NK@j=W2Ud!x3^qC236P0VCgDf@rlsn3GaeGGl@L&eHZqfsFf-po~z(wPg zr4fcf6@{7bgP2CF%EFCMgko({P&0xERekpoBHPa1|Hg7$17#pSTY`0T)vJm3=ZwK`dh|yNFj-wKIHk?~Gb#?fwLLXXJnbLgVQ9p=+i|s~R;SKzhC)~!sU zFd;+6LmT}nRe;d1wTM+-Hcz#Co9}W?1da=GSxp+M$qi)dI1@ExJ&|Fq^Tt(8py1cK zWW4JxjyljoI4`?5dJK5vSoO+Ib*}#qKkU#&=TP{bC)O>(+nai5l+TrsXuUF$zm&E> zdHdOM(mP`W!1PF(MLWH*$OAjRJi?l8=b|U}>JpAwh-2p^bG9i3oSpQxOs9?=v%U1dy51UU19lzAbZ92ld z3OrFxtbZ%07KJd~s{g{;`#@m>C98Z*MN2!aot?e!C_^>s{Y z|J`jE)?-DQAO3^aO7s&mIS0}ANq`3dlkTADBN@9=vRALx)|+E4UmSBECelz=ukzGQ z(C1@%T4f<&>^tDzaEF~jAUGGgrj|L{_Ld67?DYMXf1O-F)5Bo87~i#jH7p6A!KUXC zJNLcd4BLaBqT1u>(}_LKtmrvvgk%oav4BOzCZS2A|Ml(g7i%$#nv|&fo#%S2Dj=F{ z%%}VGQ-W9QYo2$7`l)H!zBYIhC%o$jo>2=q5)!X1(n9Y;!>G_7bn)OHr<@B+W(i-O zVY!(G_Swx;5DQyc4UXAz{^*J@Nt#5Jvo1t{U#!3xlGy}D^RX%c6sR{SJI-W)g&CV& z+(u_o&Jk`(#I2Num(*TQr`C@UZcVe7>Vw_S5hU{dP6O;k zSmv;2w9{yteP(aTjhG3?OGLtt+$Hk|NdW3x$LCqU{>QP#IUH-S*|o24i8q(t-wDw@ z$BMA`FI&1VBt<>Ysala7xIb4tIq!b1{>F6sr?*Tq!hmszbq{w!P}ow#s0A~Om5m-i}i1pvrU8gvQZ(3tv8hau77+1NqcIUZngit7u>s%nt?sB3w}0_Y-fmE z?ZPA9pkc5Q3gwd_-~G1%{Wx+5UfQJbOT-+LxUBo#xd+|ZA*#Z}LsNfxqA})^z>{E# z*L28ul9POvoFx6bE9i8}JjhaON7LUpyOZFfA+;oh^lWYnWILu_Pl z0BRQl9n4~YWO6do1(6iX4oq!(^fKRLd4xo^%Z7gYR%K(=GKo z7aP&NnDe>g4gD3--bg;*xdTOoN~&0>Ldn6n*MZ_N?G1aA#YVO!Z3Hy7wd zG~nIl!IGBjx`hj(z49LuI;wEcmqLMT$C;&$A#I>aHF|eT=yfCS@^|P7g%A>UsVvs( z^c~XWCK5vma)CARoC=N~*YVP@@MMLP`$gS5-+FGPw}LJ!)3Ajyd9Z@!Y1-RIm-ZVPuJNwHu}5$s-teb7I(lVGhv8y2Bt zfWdcEl5_U7zmIQO+^JT~ixTh>Lajggn+6=sP`mL1pQ1(5jiYMn{&^Ng>E9OrphJ7j z>v_oDL8vDkV?!YC(b}c(RdlSa;5)kxucJs+4S9$j^S#cGp>`tMB}2Hn6><&o4vACiNods7Jd4A&X=KpLwKYZ3SA7KFL;l|&ej_ujxV zucF{PprHv5DxOz|_YaRBuE-!D-H+)jaCIX-wBGWI79fq{uK7U9R{E$aC9pZRP<@Bt zlxSI2b#kf6dT@iFXJ+EDsPE0nbUnh69mVoMwWg5h4h2$v@4^lt=$Pik#(byvAPcEV z60h#*G~(8pzd>cXe(eVW=bu<^qzZX{4_atd@{5LS2GxXgm2P{`H~N?_JI=sTyTpWJ z+75p(EW~>{P<@YhZ#?4=(O`~fojH252t46$)+*-~$!tYvz6qh_4NU5PRV@in|HCsB zfxYAM5rgX5yD8Toe#16?jCK+C`Msu4=^QxIW!KGjbvIAt7M27iBYZ)K6$vR-H` z5olaoqVENNjQb+s#fL%;E+9FtXIlY%%mwd>DPmlrkbGDvNo z-s}ZNmEJh9am*&+33fuw*N`>Mxu8jRMP+@7c^_NLRWwrL%Ku;62G)fFt zK}`c?#RcVse`SSLWG7||vsIjV@)>@gF={!HMiET85sVL$!*xg*dvv4h; zdLeLyoK@luGcB+}TXv0ja)PJTm%GcpQqjwx?**g4ulI%V_={}XbT!xH$h1*ZuEZA; z!X+9LQap&xuuo!`fi-_+7)Fo5{H}J&L4Q55Sv%A4BvVxS66+%A&-UCE+FhO~cf=tz zk6*oMLt5ACkzO5^i{x$?88zKg6|+O*Z-j~fR_a0fjU*$Rpqzl`3+*cCgB?37Ci>>? z-UtT82J*^a;DV4z_HFjEFY?Gg;w2D0i)4hk3hN~3A$kw4`9ZIh^Psv|czwipvtih{ z2FVC8zRMY7z%SN@zqF-ztTo7~l>J9g()4H8q2kUjtX)V}^d!Xn_}7Zjuvf=5iI%6L z_Il=zA9HhE-ZfV-rxe3pjbhWUQ!PoGm7Ji4bH+^)uFcff4R;WL>RN~vl+KyckZid5 zBR4g@Cy@^SrU%Tou#*w8OPAbJtqT5H7sf7Zz@VyGIIY*$ei{Y8y4sM^if)(BWX$+N zp)LEaMSW0|+gQ>{3af{n_J+Y{!83qXVPD5O&K;Eus6%UjgkYU-^Wz912b!;sBrkPL%#(_*tmrSPj5(K>>tB)9VS!Vj;9sR=#t=)2 z6|4qg{JBM|onHY;T&Q~R8V@OjE=Frf;@luA8`fH5Kw*w7>iw^vB?ok7B%>Rgn7Xfo zBXOgPC`sa*KrCBkB6PIEmrpn&84;j3vCxma8wI;e;}c3%>nJu+ZBBR6r4GxoQ;sI0 z%o^=w;VMu`d7)OhC(49s4+ouzho1}}N`B<71!oDQ2XZ+f9ON`3Njm24K0afefu;PD zlLz%XfIE>N1C7vMEe@{z56cW*QGg4(9|eZVK_try_r0Jyf*hP>9pTqx|mH8sK(@0n^cS!FhuKbrU+i1RZEg(2uaW9sm7UBT~$J_!e(*|xW1h3*C4@TT8S@mqrESUr&<*iM-u!kK z!+OKPdfI#dlR>^=Wbvbcq$HdZl>@3M;~D49*5aZi+=GE+(q-qNKR~?=*}9QO?l4lD zP^P(3ctw&0@^LI1Ll zaYQ-#n;2J|4!d@(ta!@~vEKJxCX&;0+IOsa+{IWb$>i(}ufmDATZ%eHPM_(rB^CcnY z^5=hyM}hckVNJE@)>!udf-*&8gVce|$hv3HP(t91Ci)^*YUufwRV(Z%5GL46Naz+6 z&rO5v^W_oo1y>I?_VIF@j5Yut5z^hogm7^jk|W7=ay)T;GfVDJyF0;>bYsw(Wc^;O zH{nROc-oWyD7g)&^m}*?zyjT$rMJT;eMy-4Uxu%9o&Ka16zNOd^ zR%ny#XwLS6U(^Q zoPAP0Y0rT^^Ww8HV=Z0iiZ}Gdr@E4n?!l+$wCRU;%;!rHu(P0qUbM$qYs-8)hLfNs z{p{h}CnCA7Z8E1fow}{gx;BZ9AnOY@mh;Zj4e=V9G~I?F{xCu3LJJDlP*wm(1$qAc!5{*uV)2|WcD_v9&53x9t{-Tl))Ag>}!r=_CkS#Mihez%>eF!N4sNl65}MxMN+ z#-6pmK(IcQW`17yzu$Bc>9B#L7YQKP{7pW$fx5VusGm~59*Qft`Qz8C-tU?Y8{bQ_ zmrOmIsV}DC{w7$9IxF^R_0dq^hF{B6u-3*S{_dav z#oK2)dCp*%ec+~bRIlR*#=yY6`1aie?X`3o!gT*4CrHl=n2x=RuIGB))GHJn0#Mz) zK2QmO!H6NV4c5CJekId4Z`8M+U)FElKE#|S&+!Gp27Y}vZ?=Nd&x~Iuyf<^tZaUv% zJaZsq91y;~J+m7RzgUzU2#vqHvtLI%81`o6jrC^5H>j<8Og!hDqPm6I;eme*UvOaE z?{7J);Qpxja{)<#xBw8`+>JXiAuq#^*pSv9(&g>~uXr?WxCKUlyEyx32t8o1 z^_motx#hDoM*@k;?wd~A4Kd#IioE;V1k<6#+ymqP?AD`+`9?|@aef|up;H95n5wni z#uw|rd@}6ELV^*7-Rtw|a3$43pGs&6&fL~jx}e#zE$aFN@$Jn(>cRY2Cb8zW+!vYK zr2va|1ZOi~Nc>x=f||p*@fSbE>&L$Cwq?Ijlp8o>SPLHd!FxntfMb1%`=;ShG5uhU zcgyv<;5?6FU$dTL4B_&Bz|O}rXJb5LE}^bjCV3%06ArCrg7By2L?2&uXuSx+z^%2M zJ&E0@HcNx{ncK-zXP+hmoHmy=^ z< z&(OR9(bjR9y8CtVDL?Q*T2aw0aU}Nrgl^}bD|4OZiT+N@V%LCuE#K6l2QQMlpCZxb z(tM0TpcBNaou16Iz4H4P%cm7HZv1Dx-DB&=FxN8lHECimftf5H$13eja3h8O)y2Rs zZip#&ECIJ-@e|>~F|}fTGtj-~cKfM&K&|p!3%yKr`h7~tmy9x(b@cG+dZpdljVU*H z+&sPA-ko#2{I^_D&sO*A`fCH&r%KPd4CT!mT&jOl>Q$~G2;m^|xnPWH5;Af9B1FpS zM+4pAApqx^mg#2?kKC&qG}JNEI_%!;k7?G8Dfl>tM3Fl>KkW_J_+e1zVXJSYPn2mf z;?d~GW&M4|WLa$0zIS50F&DZsXMoFMcLnX7?>oQu`=QRVv%Eo*K zQTw2)7;jHr>jHy-PPb;Y=auL9d!99uv` zo;U}P*_pnopD%(^ox8)i_r5isuRI@!(unMg-^z05RfaXbfbE#f3LB}0`LgI6iMeEa zvNjJFS~AwQ9+llnO%pJM#-${|-uk9iLYO15p1HF+USMT&me8w?mSTnt_nw7;?@c*o zkG*U=dT;ULbnN^o@YdN%AFM<14{#f;0(hFd))q#0JJOHO#(MNV41hWGEVW7(MIXGu zFymHFuv%$TFtw~B5Vw(cZfNZ|Y2B2)3BHx%QvMa?$Pp}H?D*A=#M$T>&xbQJPm=u2 z8VpF`7?d~BZDbqti~9Hv+1C*9En?f*gSz-tr>sOPo6~-3!bjX@^$8Qzrj;_#&1CS4 z^}h=n`sUhyC4U3Bm#nvkyu2v>;iswon&!3W(n^04w6?Y!DXEAxy4al5IU(3A{L)~W zA++=46{`cupM(p-)@tg;bj;K?xih(qf8O?!T*qDp&|On*Jt&1p1zHpBUrG8MhwKJQ z=J=lI5C7y@MVvIq4ryovKi+hSV{$gO*{zKAPwp%>Nut6eZIr> zD{0Ic$7JagY|36}kGVg29ldo|;4txyZ#S3C*>p`hHP;Cv1V5ciaH<(y&!ngvlf8bwbHqESOm#pw_tld7}9*2h1|^p)B?WPRgJBA2-V ziXzU7;eL}UtddcXltP3&^cVjtPxOai*T0=X*GqM?o^-MrzZk?{@s{p% znxU$e>~MDHPBju%UdNqnf(q*8Ul^mxe>P+8HVYjTu#SH-Q};89ALa{Jhq3s^RY|i1Tam%@Pl{U3B7_QVDYw?)kyt8~b(BoZ|qM&$>{- zP+p|qnk|yk_wbRHewdI`Tc~$@wgqtvAXGmkttcBJx#(2w*&2nC!^K(bvxMaD0A#6J@c z*+Q>7%fa<}`y>Y{F(RN4QqDWZqs$qKnICzf`L$yIk(JL4GR88@xMs3OMS!`>qK75w z!^~?KqYZC>+B;+r^~i9AHZ`Qy`s7ly5ot@LOl~ec?#lO4;4xjKv#(=`C+!@~fl{pf z75HyXO_tpt!((nT*(`>mp*Wois6MAA&90guV`(PE{wu?BPA=Ijf@6P9F2yW?1G_l= zE709?SlYRm!*nhx*({2qu$X`fC}k-jrTQJ{U>PEHj3zyN-8;i6&*9k(^w)GIm#q5%S&3;#FYec zoEKZt$mejh%{3;MM04=WHKvp#b1)WLev@~${99~EEw5_%w`eS>B%C9<*pgB{gyVRw zNP1o=L(Nj9NIHdDnlO|je2!8In^``Kqke8s3Y$?L*0P`|Jc(K~!@;t@s9qNPyL=c& z-yEDYHm$rr$J^Y4v`OOd_h@m#Uxf06>V)EiOsMRr5SiWh5`_#<@uPf3!`#bvAoJV{ z15k19g%(I)=^J<8W!as0(8vLjxryc|Eqc_+s4aR_$zU$xp#vVyc~b*R=e)^*BXi!A zz)zNfNe8f&o2dr^mNBw7H5_0mXSs~RxlTr)?p!Aw5Yuuq?x2pNR`w=?qgKXQDnql# zLpvk2$U`{;zletxcr(XO18kThjyoW*%t<+*v%HsWP|WC>Kg{IozbOVYRlUrR3O2IY+BqBhM8 zucDQ&K))hwW+1QSMT%K92SD1nl*776n-Tck@*>Wxn1jAZo9RO?c%2$pJ-1E{WV1|> zacgwH+qMj zdP>H$B&1j4*Q)pK(Dt_N^g6Kr6gu%g*zjLHs&Q-8J9lVX-F9jk*tZIu_=lESNy4Pb zr&r_Vet6!$@O`Nbn~%57%#B7u6i@kx5MazVDvHebwQV)~3sQN>jCXm}i zhK*0z-x{Q9$jb|C+3D1zRYc<1*FR-{otG|&mn)`Jl^U0(?%3@RrH+@QOc!R$`JKhr zjj|_$oE#tZL5*k2_>D6rm4KO4nKWA{1%!1ck$Za?OTP11plRgzP6^1V@YmE14V@*%8YO36kI*McEl6+LQPq z;gr(+DwA&@c;@g>YRp6ep}h&e^HDQ3VHnCGeTAzyNXMAm3r`$ExSY*;3d_o}3BmbB)<#Yn^SC0@CLHYbrsr$sU zLR&BCoT5=0sr$GyYLBd<6qSpD852rAX}35VfaJc|`bC*hoGqoUbaNcP%r(;303|0S zdRrlj!3|=05|9#orukW#E8d2(Ep|^o!ApuO?j;miSFyN?qAjzznyM{wPa%Ob$%r#p zBYs`vZ$fi*o=QsMy26?rMO*S7UV14aN?BaG|g3fJcyrkl}r&iP`Y2C{NE#zJY8BvT3l1< zo`7>Y*H; z$5MLZE@T%GiQ~0X)P%UWO0Gj4@5E?99iPQ$Asz3b(FftgaZ6uI z^R^E-_#A2~ecZ1W#F@(}%3fn?mmrm{S=&UNTeKyEvD|G=6?U@F{TRA-UU)@R#Wvf` zkrAALwV~xnYD<7#& zkr(tWFPmqy?fEU;OH}UQhuS{P<$J1r1OLP==S%HN_mR>*Y~o!1*gnZExE;YDU#LyQ z4{2WFCnk49Vpz#QYQ9Z0t8I6bCo`qCT`8sZT~voJZ+CfeBi38$4oGVTBI^?(s>IBF zJxK2`FMS`;wZlMa-W-&SEq5-9&RwW$!NBVr1V!jlfRG?0plfTammr1)hMw39hMuGY z)|{6VvB?mBhYXgl-WIXhRx*po23EH(#h)ie683Z*8an;zfu-j|5&X zgOv_ZaYgcj+4bi2=B-QGN@6m1GJ;^U()czx^UXS~_3YA5$1~V8rL^7B*|-2v)-D&c zOQY*5OJNx*OPA|dOLZAono`nk;aJ=pfG}&8zi8tmM^67fyP%FTy4}^%x!nQJcTWNz zHrvE&^f|?Aa@sb230SpvwD04!w-=CTd0Tj^bP|4#DOTi1ix|360Pbcvk_~6a%xkSL zw!S)AX-QR4Xjl?s4e&vtx95%V2G%Qj(AP=R34Rq~OtW{U5eT`ZIdp+9-alWRZ{*Qe>@iQMM=I0dV5W{9ya zI2DRcR{}{>+&$5#lMEG2^>5<3wyzx9Z`dZODy6DjpU3gWuh2%jA*iMS{~bV(as^Dh-jx4Zh;DG4%o3jS8GIfvaKo4wEY zuGUCgp!jgAefqTh?b{~C5W$~7^iOVZ^g9DYRlI?^jf|f^Il<9=ctsLCffy7gshG?5 zhDK8U6vB@Ch_|RpS)?ZZ(*qYjidBu|4H4s_g- zQ9>C0!)nO!1zzG0W**LG!~x+?Uywum`wTH00s;)7j?g1Sgl6z>p}RzwmEb)8kmm6n zAs~xr&cM4MWD7$({PCW_)Pv^rzt1BXg>B1Yw19OIww^(5gkuzTjzi4|DEW%=`ww*< zs|6gJFs~FWs>pXK=&`S#xP{53psv264gUFpflBC4i}8tEm>UV!4Fg$Jm<0(Y;49Pv ztdJqBh9NZX407j#S^x~UVO11GjF&LU1IY`*)Q1iy^Va{FouGyM!F_-&jt4w%ScQO( zscB305}x~$AmYbft&e8Qz~>uyCr@J!;O@KI2~Z#2Yvb3osb{?KG4UI*&T}?`rdzI%TWo%EnuWqp$^st z(XI~F241(fa0~O2r3@N90I|>P5~`KV28O85XG`A!eHrQvb}`U(%dQS@9sUB&y4R`> zc^z8g53V6kE6F;79ej(wsUck}!8)8BoNO=ZmSNaW5;P!~baUzd9f|vV8dEnb;)P9n zzE9|h=*dt1GWJc&w0OE-?nOM7_}gat9KnrRMd+Pj2^;-{NtZTRv*+o~T*}+r~3Yn)s~GG4ZtnLLT09BdHH4G7f*_5MVBO_eLDrH{j;;T@5Zxh z=-<;#A>5Qyp9u3Fz|JdnK8WP+p=k@RKCN%5dI&j$!rlYO>$8!xAy61@N`7bW><0sYmikvv~f zFxr=t#eD5Q>PCi+2y^4` z`fb;%;fH=xQgeo*E*@N=Kg?_X9D=v5;GBtVfpl)+@0A|+IVxxHeO)f8XpZwYb-kI% zBr}uSJz5H9NZkLME562SLNc4**+Rkb(;IG^f)|5K+Jf%NHl{(@rU-kDB72#XfFOaPxZK>IZUaNxDek=Dj8Qi-%o5Pk!Y~fFkmWcA7>DyA+iI$YLmu}qF?j=>3}QQoi4q$@9XV|D6( zuOkHP-IMSYh91r$L=*kkI%e05u_Z{>o}n~%Uy{gaUtUkhxq!`nZV5k5T(ot%%5OLi zbx}A>){Fv!>ZOY)#B`IkM+v!G01W{fP6IE_Pm1d9ZnatNik4Q--LBv!qPf29v1t1> zgU&0SRWBWs4;Ucmi!<=veNk}UW=O69H{T#qBgmIRhxNmq?9xI;Y_P}yCTR0cJB6ap z++R{NgmNANn;%j8_nh~V{LNLJgS%a!7@HY++EdK!nHA9#YxlMJ#s?7hESfsU?yre^ z4t7M$c$^Bh(S9TU1Vke>KTHy*NI6quI?Mh3SwOBM>+*|HY1S5VD*nb(?{%)a3$e=6 zN93X?p`Sam#;O@g*I}ZY{RvG+W0A}J%yz(26R!oW{z-S?SN^O~A7(WB4uai_-G)Gq zJppO@0wohSKNkbJ;5st}U*YMUA}|-S_vg>;nM^ zn=78HVoUZbT<`f2{QEV)9@`T|5{pY88gN$YO?yty8XuE4vH(1%=3(K1_L;IW*tVX) zOlXY7I@xIP`#_a?h<0U^&d|l}4T>VNqUgS{bsLbNktG|fcvxF}bL%1-<(@~RmIb|H z#`EJ|##}9Lb!GT7o>h#0u7I7@Cpgn7?5f%}^9s&9|HwPnY+cd+k5ky?hCo#} z2uE+#D8SD@tTI7lt4J4viH~?AljGByb2$HfoBVjnsYo6(9FRm*?)ZrtF!ZLHy$`S5 z9Knlm*W&45Tvb-Mo!uN(w0x9=M5I$R6DEK`8awXR5;80vGP3e|BG`nW?MgznT3En} zr35zGv~OJT#F{V%&pw33qKD({Qs_j*TCn;_J|iNBwo62IV-DV%UKV{eA1?dMNik?s zjM0!RI=MnKnB^lnsez0Mt}tsksAm2A0w^llGX<;>4H*i4X8dSaV> z<>SoYNhPCW6mYO(!>>*yA9t_P!zlm+ZRpn=J}zAk^Nrsi{Ekdm-(LwV(gd~QDS zxKYY%cAEtb@|!j`{F;35o7BtTdiGm}Tt9GE@J)NF|C4l82Q1A(e9CpJQ`(CceY7_I znvS*G$X-XAnq*Q42ii{BA|h#uN+F0M5g=hpaluNvVX<`MjP{*{693j@NZdvu*cv!& zNO!2la`Hw>U48bgt~YmFx-x)ejy^6U1T9=Wpi zak0$@acyE+25Vv)_m;j>ws}-w4UjwU1bKgB&NS=h^cy)sJ*>IcUM7)IVx?&qYs!7y z-V{?@=lJrupwi^iBvga;=TXz4)X&5G{gXmnK1*F-p}!OOiqFOwaDPwhB@+vMVY9e( zEJPedC~EWKHD`j9{$r!`P$n=JaOhdP0nYpmF^E%FhAZw`VjF6+;rN>cFk}TmVs+$i z*-m09*zZtlyAMAA133D`M3MJ2aJNzZLB-u@8h4K{{go#Ty;$;P`0BpHenmzyO0~?& zFpHksIAo!;p7{mGKTE8Kbbpa%J!qMx{<3%bDbO7@(CGjN_7E8a#-xo9xuzX|BENN? z4owd>)n%D~MR~9OJN;Jix8+jMw(87!K|+_MDSLq_?>_vGSN5~f4>3!)QjR~Wgne|; zTS*cQC#*Klj5N920mo*TrAUq}%6O=6m`)he?qfgcRYi5bV{d0Ex3t_};gb;v6(8@} z&(>b4E~+A`lchd=iNzm`rO6M^V-y?`h`CPslUi|R6xcjxQmE#m_a6U{)DJ9piBB-T zj5FO((*6jxjA(@;NG;cKry3w4KosD48(24g=Mi*zW_DfKa4!;L{*(SrOqkK?tBYcu z3MXEeW%#I*Xxx59qve7L+4QEWy={@2Id^s>=wwi4G&yxwp0eWRN}vl=C)fk%V(S?l5O=*w3BmWR*NFRcIk;qr^}}rD+&f4 z6L;->yd0O($_6ilKVcsT@9j&N=Z$e;A=0;l< z)#=rP+4RgTj9Um6;~zulXS4sd$2$Ms-O++0_+v#ExogrE&O^&F!hyTQ?P%N^^*BeD ze-WRQ!qFX~s5Br&7r1SU8etn|4rN_uUvh>-QfS?XMJz%BIdBaAswL8*HvJjI5G7EiLli0|Oekk#_mk9;oc(&0!3wmldUoVXcz?kld*H?QfH{ zF8xY3>TiI>Zve*MP=*y7($O5q@-}R48b18;KaM5JSXqMycufCq)emAP6C(jHefnJ$JyrFygccFM+)8=(MAf$nNy>`bM z$w#99puLvUVD5DKcFOw{%566sL&c@e(R8@S|J?p9Lf$Ik36WFO4Jw-WYX%z9cVY}R zZvO8Cx{-Q8RwXqfv#wGUzEX*gaR)5H9HDeYm_oPQXiE%9_#Kk>$J|FXM)Px9#w8U4 zq38NLZ_A~qjs@c(^0I-E8FFahj8?|1_jj|*-A+r{(;Hmeo=fzAjkmKyO)}Z+JIM3> z>+6(@(^@L?h95Y_^XbCx;qr0{h~9nED*zVibeM&i7Z%pa)wZPu=Jl*6f=Au8{TQno3lG1OZ z6guo*CAiU*nQ~I7u)5JvPh?35r1A|~5MZ_JIORA0{+?bnSl2llkMvl8meV!&zi2y$ z=t{UCKzApdq|>o&z1UXAe6ejid9iKVR>!t&+qTX5=gewmHnW*?YH=60w)fnsI`w_4 z3*C9oe}k$xij_4WJq@9jiub6SUBuSX&+t-KCk}&pAGZY0F}gTgOpP&d_%4X-Rt_2( ztmy_YbSma>h8ZA-)*8*P%l+<`A33bjx*BN@zmtA5vB&7{uwjkw&u%@gfWhZvnm*}i z;|V;Tjd9xDJr+14MIo3S;LeQjycQRy5pr?Xo$)-1urHYe1far#*dhEa3 z#}IkxNqO-DeGQ+Ws|7^AgpoWAAXPVkO4s+D?OKB__5mWGy&ekngCcQ?GnzXv?37&E zUNDa=g_47_fFJffw&JqwH5Qg_F{`Zf0)bhh6QTFSzrXVl=>GB3U+9kt~Y0i(BdTZx( zQzbnrgK77#qf{Y409DyuYOSx&t##{vw~d~&v95ON2c__Y2XI_^cqIVCKj$jp7{iDjF?(Q_Qb`?@Y%yYOaO!c1Pd2HeD0TSii1yk zQBP#Ek5WcJ!V9ljEyL^Jju&HFS*q@yaOYnK6c=S&k&co>y3`EuBmaR50?$UO!}dvq zzw!$c?Agc7w_}d1PvFc8jI28R?a(4U?!rCk!hdNQfeLVN?EZ z5i?6Xz=4P(sHhazFQgW)xR>Z7Pc8u{trSm_2L5n@l?gOj&W}a2SS}FRp0l?Q?$zmh zds`i+cRyGYU@gc?#VMgDz-sqo5-LR>{5eRi>UsT^^r=eF9UrC&c-$pu+N^6Vvmb}c zz;dxJ#OOzVK}j`$K0{A3fM)1=ggywco(nnK1el9N=`5TGY^hIj#NshbW{)AQP>$J+ zoZq^~gLWxn1XM`)TiXdo#gz$Cd0CkQOiWCen6bXY&dl*0@G%wksOomMotzdpLfulv z&GKby*lejz!re)G2NIjpp;znx9~4aHgR?T2-z=K z%dy-quuulevyjg>5nOyFJX%%>$cz?2mdU2=*6>~>l@hh>eKbaQ6Ns?TpB$dk* zP>N~#^I)c9{~vUP7mf2It!PptE!1=awG-`c$=gWY^xfN z$$yEI+*B2=Wxw{_9a!BI;}6q`B3No5+J`QO23b5U+m9a1#nkeR$rs(*2~mbn2Yk0N znjXFN9bS5j6u*tPJ9c9K8CySxYm?CWW4(8he~$r=8!z7`f)CjF_+6*QZk8UwJyczP z{p42fYwDBRoN)u+e-}LuUR!E@54g=$e^~1j(B&y*vFUK`Pq-=;bT@N9Bs`ksO%Q6TFx6^($bD{XXLE15bC)1O}*FjlR zIwa1|&EgxwP1cXt@o=6IAP=|SUg`J$s#Q)!y1KGZsuO?3`i6dNBh^wnkUT4bY(dwo zhF)~nw`gy-lvW#aYok?U21lb16?0cu0?S%|i>jA!SPv0i)U9CvSh`9P->2PGVWfnIXlN}T z7B&N!&}?fZWwX3_+=Ot^ZE9)aP_x;OWxi@5`)Ga9de>%VUtH~>NJR1%_7gNpt=^+{yIdPCQNRl;;-f~J*3n*ZO52Y*j9Fpa*j;* zK)kgL$5w>1v|)1t)h>YDF2K=FAa*T}nxtr+Juja1KjT7Lh6DuvYb9Se%@;bCYh&zt>wuqObfOO8flwMJwgM=kN2e< zm3h?2I&@`p!!#ZYzO)Zv+i@v-+PZ4``m1jW#EuS(W*A|3-YJ)b|4+tc0F5771%NN= zK=bQ#Fqj{R3USeWdI9$TQ=RoBYtvDSG6p^8?d`xF8?0(C`j>GBlzAXDZDN&2xhKdq z6D`Z1tgQC}axW!+Nis+_Aaz`d=2mHFkgMR1Pk0PNGH;K}$o=AlT*{4F6wX>CP4_$= zRbkzync>E^{y2TSz@z#66_KrvG!E%NPbS7|n{B;rT424A@soIpxsjD_(X1m=UL<27 z1sdGIYG3w0;s#@UYf247t=krjJlm}3I+mudM?I>Xak^3WZX4F(JljwKEAoXF)o}y! zqJXQu!Igv?20k3zWd=<)b3BT4M_e8j%66@}kNve!%G1N8kKS~UE?4`hz|k4Cs?~MO zEK62+w00xq`2#1At=dZY0_^$`@VPvp^ll>TTPfoH7=!EP(R`h_8NUXVvV!6 zhYRDsk8K{|S$*?Z#BLBYZUunUj-*~Djt)E}xKn;*zV?|z;FKiWRz`8}Yupw$D%9lJ z_HM<_9>5lTf~=9&6<1ssMxIJ0R_5G^!(X}Ne~r6odrl4(+$KT)^pJ2Kv}U&BIX2I_ zShbG#lq9~})!dO2fJ?U*MGlu`n!I>>ub^7ER+J-f20np!p93@rp3Ca{HZGr?!61F+I=47H$aTf|_ zg*C2`5)1EqH*p-LEaa1F@nQuw(f6T^@)dqGgagwm-SyUC`gSO;EsaK7s&(htfOq;X zQ#&A{JJ7E1`jc!_Nl3qVVxhz9M%vMC=KDsy#?ryYJU7L5Xd&+gP&G1Z{o0f+ zA_OJF(Xu+-2Da_M3Xoky>*O@JwDskMqj?stxt{;2U8!^Jx*uMj0Ai-5s9K#FNGmwp zw&mxaV^!#W?65md55nVxSi7*6T;_&Sfyj6lNVw|7e+FOa9{uOmTM)#yP@_h*q*PiQ zT(Ou~>$neJcF3jBLc+>zu;KbLnXhst2&aQo9Yc{WiXyaSUk8XikZDXVXk*#5z?xeB zMPX=L?9Mf+W9Us=DG_J9&>)>91Ukx^05?$wsqp*<4Equac%hb1R`pEXPiy(d~XccsHAiEyz?#bQiDe8(bcI9>PjF@}LhB zN2~LCOdL^;QX(jMR{S~kDo=(Obs-}?wx7)4MA<9lBi6b1J8$>?9&577(z1N5ZZ{|) zI%%Pv;nX``y(ziGml~`tG6?fAM-r!~wwVIFR3W6bOyOQ|k{9mO1{P=ouit835RI5Y zjLId~2GNLW%;MKsU^?M??W z)81HA8HMivO2Ie!L%(S+MYEF!85CAo_4&9vlSTJHLAp}nz&i_Iq|&gsek3Lmj81`U zMaaeU+t)mf_kzBxC9FGcXT)S`=;v+i>@PLs^B%KrImKo1`Icr;4T}imO$`(Evnte- zUi7%-+>emq9$Y-ys3`c@S*xO=e&qoPYON14@JD&{@vaNjS@|4&aZp0dRlVK>JC`KOK2xCy}exm8<$gn*MfpnRJRG{t9uGuc$yNTr4Oa z2k-RwuQL{U*~}8f=88gs=IqB_qxOuEVmIQWrcL*vFv)5$bX`L-|5@(geEOg+Qut#f(a;;?~I&7HoA!ilT4SN3&h4uES_abYEn(9Y!Dzs z98-@iDh|X@*XZ+zZ2D{R9hjBA60&+4^c;IxV2|5tQ3eqTVy!zW4{A*t%hAXa5|et8 zFP)iP%-=_=5PSCX;qqE;qF_jz46c zK4WelB>~vZ4SI-XnpJ8GiXt7tH)?Wh~@?o@>%2b zp6^eo{#xMll5|&=dfhsu^*Y8?V9oRnJ;0Ypem&`OPHeCw)wc4V7q?tCvw@l$V=Z&b zWjyRht)_NJn=RbL!m^K6Oiv>lcQBdl=guUe(2$HUb!UNbm;5k#1LR|!hM19HQ%jsbaTsQ}jM(?)MR(wT30#LlwOE2e+)#Z+8BV z9b%yW(i?%$bu2j|ObfeUTno>OC31`^B0jnq(Yr&*A+33*Q&WSi!Ghp=w*afv!ebj% z#UgTsie83aohZ<+a)_U131p&6Cz0GNnMf*$6jsZq5qG&Q9%Q|+ubV#0q=#S+@5Ul`yE}ezv1z0F+%bH>ja7VsxmDj?)ri zysV&?vCgC`jp6K+|JySc~-TbG)<*!SW4UV7LX;FuzBri z8Os}_OheL4Vzp4cqP-c^V@jBA3LT>cEUy`twtLm>)pSCJ*{ptP9M^Co*`>l|`ted@ zqF86v+FbN#tQ8l7XID4)@l=z;jwPpMWd<>?@T7{m2t>!edV{hM_7}5c{W^;O>L|+D zOCrV4kRdO_bh>CQe$Y7aX_$!=Q=9*do7JIukXRgtYI_r{moiq9 z3aGFK{rgjs4mfClv4W1L(2_==JN5iG3ZJb|dVZocfwE;9A0Xo*$0V}>M0ZLM0yefd zTBg4vRIzdPt)z}|5g~G7}0Rzlq*+; zW%tm2Z|v1z@tyYp3aV(UKs=$5CL+ss{v15J^+RJ! z49x>vpyvaSM35X<{E?9o>k6pz0e{M9WgM!)L~F>x1o2|~`|yG?Nj<^6Mf5#?rlX#V z<#*Tys!p;|#>Bh$nuPMl%6})krH|p2BAa{+mjaOC4n%pnaE6O9H~oPHxeSZ)ZYz?$uGW{FB(Z`=fY~)VP`^X$WQ!$dBzp@nNkwhcy1D z{k8(5v8?Mf6D9&jn7CrlkJJmTEYy?>uSb+?VC)n1;t}vAM2hjF-T~h(@P!rz_Q>R&Uu7#+vv& zp|<&$XBVKV=lypcfmubD3sq*<_V5{&2Hs-BFV)IKr|>jqE;ABDN0V`iVfMf?NhzO0 z@jH`^^CH5tn19+H1`55^#wC>lpBWEo6^1XmU%Gh@^s7ytH|f7gqCXj76ssew)Zgg0 zV5*`QCiV>Rn_s>X;g_Wmkj6Yd3Dz5y1{#PE3bNDvo( zA+ua0P8N6Y9&S)8tQUR+eG5`@@5*PdjAU!QV9CFml7J{aD|~vRAgLe zW)?C{%G?O3@m?TKX{U4Lq2vyF;@Kgg%#lPNBXpEJxrtsZ#Q$bOlC|Q5L|Eg)!lQ&7 zR;3w9v=h!H!zOwY&gX*3-a5N*u4sw93M`4b0#K!@l>BI){CJc*_xgH^_IJ$jamy_Om9T<$hmB|Mua3`!56P%gid z`Z+N>s@1{?XJ!P{c6Ur$XK6vbLH9R;VVP$LyC*As zRJ9a2n-`=&%1SD_gU9;LtInuQmAWnx+%;k{O7wKy$QVb+E|oD1HRO={-*7Ia(p!64oGi!&K~|8Btinxj->>&?puRzD5#2s_fJuWMf;PC^1>p zX7r$uYgre7gqm{!qYb7@$A|NB^ZSne`;aGKRUF4v;)T=wBLmvL6~@n0St0P+EoOGF!W(2VUXW(V5ez%n&;1*QKUtR zf~>DA=I7#&?PspoH7bgOF3J7au{r-?t!{-7lNugyF7*7V6C1*>zXjGuF~bVxnjm|H zUnFoGrRdhxEX8Wxh5Fx$!HyFz4dC#%WRa|SQyz_a1p^jkKQnIz(y#ueAxc8^f>VRt zZvOosb`S_37lHMq7F;rJJ9V|h`w|0L;+}d(c17gNrfY09f-gmn(l+;%_v#Jh*C%noHgT&-?LONr;Nzm4Qk&~)!{kq#jPC4_p+ZZmn*LL zUEljt_@+k>vS#n?8(b)g-_ThqG-|9r>#F5A=9r(&w# z6|0K@RfN3=gyF8K#gb9LO+)psF1jz)G2kw?=M33#uriV?bGEo!?lODTOy17I0#et> zNo@C@syp;Z4=ppSu2)&Jn|-f?RVj;1_qX<%rZX2&Pq&xaEw10lolck5r_Y@r``K`G zW>EaZwMmz{8Mj-DF#9!5l{%aiD_R=sy$eZjt7C93yi+!5S5avwSK(3+s$2BxGD?7# z=k$HfcyA2fi#xg4HH)Oqoh#t_3Mi7S`NDt5;!Ej#j%AR)1#povI1jpaLc7?4?KO&_yX^AsG~ z?kMN9j{VC`Kgzi~=8wONFcR-lVlFOWG9%BaZa~c364Jh{>q%{s!xc&M0gbq*Y-MS< zDk4^{?AN5u(8EfWGNM{Thq*{j-7TNoshD6jtTydf9_XN`|5RH!(XolzZQHezu-b_`RAXCcGC zEztQ=lKN|Z7oK|-C74fJ4uWNHLD2STSx{Y@(Pxim7X&5;@4_rqtg)v7f%t0;22xBr z&`_snChdbevE#ij;`dun&&~x8)cpz=vBJs$YD@7zlen8wy~HxD^Nl{-4jbn}BBK7;0eNU`X6Tsso8wYsXl`8 z$&V!g-@C+tj#IcxlxR&-N-KurLY}etg$OAj2JfzRq!_y&M+z<9Hg2v}YJaZTr*XS% zX%N1%xST$We{u8i2|g<*y<9R2IbA9Yd<~}&eNBCDi?>a|mL)}$>b?_*z4?i-IMKum ziH2LWJru-w9qi|=HiagyC>(6_F*k62ZRdHdrxolYpe{a^%+Ds2ly3RL<8e8i%-k~C ziNSf_`(Stp5%^Vm^Hcx~IzF3)z9A!BKp(VnAGjiwg_IVE?{5Eei%NGjojh?X)XRiI z{#SC||KEcTw;W3l;Kfl6_F|T3Ok8uv*Zqb6ad_ujx5~RUqcyoTI)4RiLi9+%1V*uM z_$Y0gsoQYN#QPhGq$W{#G%@6loCK8!s{&_v$XUT#nScc=>yyt)W!p?kIKY#f-3FP= zJQP8r(SZheU38gL1V%J3Lu5193VBbXDA(b6Yju-|oqPOq6(k@aj4DvN6A{W6Dl75; z%sUZME~OXL{lf?CpC8I+R`xRen6cV!IcI@}ByvLMa>Z^sHQ_SlX?oS^M8Fe06L6py zK)iF+IzJe@LPS2Oyr)qsRuM+B_j3g-PlR}FPyUw0eLB>15M~d~Ua*5iCj9wy&vyJO z;&@i&lu%o+Js`P%yx1d8^rSVewL1rJ zUN&=Jc4~K*(zM#Kq<*@!-;LXgo;N95hF_Xrh9Af;)h*L4F5Z2$zwHd_ZPlnU0YbKAf!fP8K(#+qv%RfL);a`7@Xt%2Bj5 zN(a3F6UUvYA0Egd#>@lzp%CoYQ*GiJh@QEBM9Ih#%vzFJkA?08q)XW)N*}qLssVqu z3J&p0Va^1%F~Yn($j&vK@ya%_pZuAWmkqVZ;xs?Q99;PuRZwcatp<=weik5)_wy@K zLr&!tvtC+uk8XEU^t|5@cacP%glG+(N2NA>02_^m71ls038q4xGMMp4`MNmfe|{vo zqbE*R#Cw`csC4`X_*@6L?g%uE8{?a{9Y#yn(y{DoWOq2VNi+YKd;vZ*&Ca-}otV9{ zRWH3vn4m~7OVA~q)pTuh^c0ivc)Z?1{p*uUb3kieBk9fEWfkKEoF(=Cg!07|fVy~BN8WT<7AG)uHOYn% z=s7Rn3MJ7=iGy9An~q5_Vok);u^u%kT95Cza0Vee=AMrk$~L#-IvU z67wlU!*HXA|KZA2vaLiN{75L(ZB&Y`rE&tYlf1Cp@+{IGXhP@>RUzcPJ8BfDDrl!s zH~%UNf%0^mnRi=oL#pW6H|+vIl^A_`6z6#|8bcSSlgaB!Ok>|treAXrC0{;{XD}}g zfIMyR^9j!B9|hKUagc0hFm7L)wciJ6hFcY?{Cu7`+C)_Y%|nP?tTx3Zp~ZiezkOW_ zYHYVQ_GXXyeC)S{xNW|Zouk)OZ#8xK?)+MP9zLlleBN$ThKIVaJJB|4zm`9$!C-%g zNVM7f-*#q>|5rOR8#@C73n9IG zQbPvIgAV<##{F9=@w+A>5f#}VjNA#4Q4&dI*5fCPYg|4mno~d!@uxvv=?R*AZLR{E zFcK<~^VaqRXZvbk>BjSx58tcFS(^8eTXq`CTqq!2GE7mX`-@g%lih2bY9R9`=c}PZ zL_(P&d;Yk*Fb|2(+^^$gtm{r-;UhVd1sZw`Zaru|F(%ZCQ+N?O8ke`x?xA(gEY6Q=o^|$5j&*qV6=~!eSCN6p<vpQ|{_Fk~z>EICuVP&B@STMZ^_>fm`Y3Y4AJnQVC_B%ud?D!W zpRJT<+<<&4t29DAKXy-FWEyM9S^0O$wAOt|X^h&DuAs63&hm_QEqbvDylb-o>ud7? z4X?=1DPCsQoL1iQAE@Ns$!}};1jAtAFcsrpcfpN|k=+1=p%pj@H#mukJubPr`H?GM z=@4Zs8x|))pA`@0U8L%yVlGV@x17p}>nPtSe$sFnuNGz`<+aOT$%JQ~p^E*ll+x7j zvLrFKh3-8B#q1*G9nO!WdpSZ|&i<;m(%JlzESWE#i=N^_?^F9E;`Wl~gsN=P`2j z=l8XF-B}X!Rq2QwgoqtHWrT~AC-xnWO0A~CITK>*YZRtPnN1ZKO3?Q&#PKp%LB(yE zT`r1RQ^2(yY4(qMMJ@c2>x#Q)d2e1Fh;kxCoCu1{GElfeCLir^+L=^_(gAQ%Lcq;9 z4r#RNz(3RkSVlvPye0nP30<|vM4MM%%tJ%e=!He9#HwByGhB2OePe9Yrl^QpTZ@k- zHd;=TL%V9KYRoA%$~NCWRaea28DkZm*O56;id2QvDzw3u9TC#Ovv}?`qRKnFypptM z$#bcO=hWJ>ypR-sCgqe@qodyYhb0FIW8cA@9vS)^@1ZH^D(&C~r`PPbQ)xk=iaHU)(V`*G*@c!eE_vBtM_jiow> zyW^u=l!5~Wqc$&Et-&shDjO3>VU9!G$g^ve7`2#J3$piICUx0Yjl$v)XHLaVPD&GS zWA!TOXA=wB=;TIwE**2A^$5xO?!T-^i7?s6HZjzh!F}x8P51SYm$F{Tpj{_^BzO-QeDjU2w#DG%;0nUO=F0Re= z0I*fLh$Nvms>FaFF;Z7V2`!#1tsx{!D3)Iz5(&5}8Ic^iYU1jQp}(6(D~=H|OpcP_ zEH0#J#i7mhf&}6I`Kg#IHz$nN)=&+h=sR$E{EBzQ-O?IhL@mfapjoni1N5IdqqXqR zRpb@IHeY1mTC#R`zO}m>!#n?5ZBmhN4vJ0Nnu2`=ppW|fkQ&04mU8-4tQ^$-&yHcG zK*7PCaFuNR@G%-df=`iBS0Js3Px7iCQ>~jnd^j%UG&ttWW~qTLDqp+GIqIr9U$fad z=b$}>X`0UNlJFmCC7F!OEke;Td~Lt;rfp8lRr_-j53l@I{puZe-e{AxG-Zjp9Vgsi zp>m>Va*{@B?&yi&Vha}>!quk91AJc1L55vcU8t~?ojWXEi6)_zNdYpGiBM`xkWl*2 z#Y%>lO1Z2pTyFORh+WoF^EXrUH6s-Z!%zjano5#57|z?NN z_T09uWF%uht{rM|NMo@2XkII8bXY5E)<83nzE62(665rYe7}9)Rh-%3moYRd8IJxMW zdskUO!P$+QUfQ3&;&-I@fyI$+VnieNRU*fd0C`Ea*?AIU8k5fzbc7Ah0go>{VRZ`6 zfEagOL(hf&#Vyka_HmXyV-Z@OE$k{4i~HVoe5B`Cr@mRXvuid(+~4_3F`VL0fCirJ zpu!K_l2*~TeQmZNk-+{)%AV}%VGIBmic>UmbDt5X zS`a}UOU@;d9+@^A0Za1yXC!?5oU!K3J7PLj{Z;&+kxf3$GOATp-E282cf8l)-kc-R z=EN}x(!K?TD~Gg=f1C=I$Ant@g&XP+o@O6;?GP&~+X0kENTRpHXPhCkj?$egwb;v* zwAB(zg@Y9<+T~-g^1rvAjvamF5ZY*?dv`@jzSJ0*8n#v0#uc{t4y=dn9&Lo&YMH;N z;D;kn&T)6+T4z>Z8zVmT$!SRwP-n{RY^6i~iq{JsvABDYP(w!e_p(4Q^t2omKl#dx zXruo-pbN2OSu!Gw$b>0b#@e^Ij`vyU-z4Kq&EA3W3yOIp*G-x8Ea65N$Au_9be-=| z;GCRpgq$cJWoN4ujB_Pnp}|2VZQrM!v^#RmEG9_YBQmsM-!!q$< zf}|!RTc*Zf7ZAJU@N^C>?AriSr7;STz2ZGO8D~3Nf)RqRUOs#*V`qa)llSD&X>mH; zY37(s(j-he7A)h&C^em*(PHJQV-YKdv9)_!wcrFE+kzq^y{0*$)wtNIRGZFfxIOPr;lXq1$94ZLlimq2(6&)=4ot zfmF+;fA8RpKLXmMAE>PYmg7K3yuWNGhJ$GpB{U@ALn@-( zg6ha5VdM;1b*XfFJ4?YHP-c*C{#$xXdw6y!XE3q0T`Rv-PN7}#Z}Lio;!Rrz59UJR z)}1kpDU^PmF>%ecbd#p-ku^E8$k_U}VapZA{p`l^PKcg6oQ}02_V)V+(NA%rF1PN0 zfdyx_``P%cQH zyA?jVAkil!Z%fHquSHRcknZmqYc%-0i?yKb6MNMaED@SQLl)y4+-7Mi%(RiQ`}8BK z=SM7rB%&_fmFK3wrn>1ac#$VPD5a)gLCn6-!KaYJJM?YEDzR9$(qC|)HPzuOo;HzA zfYZ&B{cH_b_9i*DOR>u?p=^U;K)xq-BgAl#r*MVT-JA8}YT0z&D+yCqB-1~qXxO@W z=4|W+e2C6&e@J0r$N-6a{`KAC; ztc%Fsps8jlbO=O&RJG6f$m=D`P;2V2Of;&*$EP-OzeR%vFz$V3oD5NTRj~NfaStL+ zZ2#74NziVk!onzAaZv5HKK#fL3|OUj0OJ-OS5wuf{Gc|gY?9In^nrViOg49GP{1LP zsi!b+Ws6Kc?=SuxO$o&kplS(i1lCmYV#>fDE?;W4;vSkI=az0>Miapm_ zVFse~5`!qvM4b*%aa^r4E%xnl_o`^XNvH>DAqrUh7#_g7kSmmLAqYd*h21caQXoak zUk>#kZ3FGNTBy~AytK9sHh+}=YXR-JJt6RXqpDTy$pqM9I>9#KbOd*__bktFCO+Ad z!EBUY2I1c^x=#P{IwjFZ3G)1+cJ6M0eU5zk$1!RHcSbEMi5K`B;+X}(S?u)tJ42y3 z?aluibON(4?bX{Ya`syi!Bq?Q_lQR%V;Ymz$^vuj=7)%VZ+!py3-outUA=Xq9K}Id zlo`~4dt%&fx7p}GnF4y7Pu;j??uZ7bpY=Z zN(@vd<~mVCOlCTev6mPPN@Gcwe&B~;ALyXzGfit1G=w&rybQ@^P z&T0~GQ&|w{U(4ZKv}>a(0wk^_3)HEp^eP81^sp@t`6-@Jzo?$dyGrjRMo=MnqZH3~ zvKi80JA+@?voC{Qr+3)(Ga+Y$BjgD;PJBPRXdi{UDX^yZH#Po(lUZe_kN>W^lCN$s zhRiYzcIK|B4bF$Pya573>n-@+W5p&-8IS%lK|3ypNB)_`tG5VXg8BI0XGe4|H=;2y7XO;Z7 z`g!9cOKkwG!J}~qaqJE z5dub0?s>G#zVQ^Qt8q>JDC@p)sloT%lH{pg8Yh*aaKqjxa*Dc=y#8~7B$ao*JGr3w zHzbl_IpPcOxFDu)LpP6{5#he3fP^nIADL#hPH6}0z7msYYUx*3LqT}?lQ#!{z%v#o z)LAK4lDI!Ao?v;7I3^ha4^?w5ft6UcUHr6ZlgG5Nq^K2`Jz2@CIyT~+3`?WJbO{<^ z&iw{jiTqbu%NxzxhTuxo7%6+r2#?kZQidc(|HL9W%&eq!B5Pz9dh!f?e4;rU*s64C zetOPIq`qHq(2sa16cA-YyJ0Vl<%i{DC1`uauXz33YuSo;6JM=h&yVw@c{A~AY?JKE z9`gQRIoO_O3GNn65dfbF@{!oC!F9)mJs>%O8Szh68;%)goy4BQthmn}vXUHr;{(5f z0;B1{&4NVmr{1xDg>~vKSvhCHlZKG>4SEC4fZO_SI-<}*I=X4g_jMsly^K4B>(2JM z0=as+@;9w`9)ARV{4ttCE4RFs{@0W2J6;{CAIcy6Q~{B(ikUt#6iQ+RMpg&C2V{%* zvr1zhNj9sN{GVt8<(3x-U&t};8tULY(ldu}Tj}5(&G-|H4+?@%`FR$;6NNV9`)7^Z zx={Ds`iUwy)2Odi-S;0t_6xiu&GDw}CrLe@Y}V|8m?+Q#!<&@ZG3O`RSPp4#ylnOdc3Bpz|2XF`2q(MYF)l!^-S<2 z;zXt?C)j=k;v@1!fxwsdt>#6^R*LxrvIEMxwrkD6Ct_#|6WH&k7=w<{)4oH~=i)b- z%h}hxi-$RNln}!23u4K(xB;#3hu6Tf&&f5ik3H5VAtUWL6G-rhchu-4ug;ueMg9-M4l#OVgB% z?@Py+P+7dHMt%L4&el*@NcQ!QrZulR!l*?I-cVC=Y3=cbQ4ajvSfqTK_S6B~=U7v`hYktn|xWLR-j#o;1h)l?1AOMT$ z(Kh!hC);h}4IIoA#ddbCyk?5{OsaXK3)R*aLJx(*YS0T|O2dMM@}Y{_4? z*BcAr6&ay#%o_W|AHH_hpIe6e0dNFrkXfHdGCU}9wnhi zU99W{$qMYe$GHaWc9H14Utlu!J_z+ctpvE@6TvHZ1@q4W?8&kL@zeC(VX# zfKHzw7O+G_Pzd$zCe){w(~cH(c&=;DF$B`L@-x?g@< zf$K+?(1yT&U&W_@d7eyo-|L3m27=6`Iyo8i&x+58E-=+byoMhyxg|c6IOe-{{6A_C zMQFB*8|TgqHkX2Us%WPStGj=GVWON+fXdK^j!h$FVK=sSmu7<_SWoULAG(WiVLoX` z;LP{M*YjF${?$7OXzNYG1@bDuyxaJD|9D^HlRP>Xp#WW77D>>6-!VWulFJ2Oin#ZQ z|HXdNJvracTSo}&oX2pUh?=tr>SUB#V~z!q9NL*QIS)SgUFmYLRPJiwlAVgQ0`t4W9O zXPi@lQ%m5^nz?l9$z0dfeoVR7xd_AH)2hirC;Qgo8UBoT10j8)97J_BVm{>v=-mYs z#dBLBT9#y&LJd+&Nxr7(|JX*kVIhoUPdW#&F0PB)E45U@J!fbhvWe~J^@)!HVp6ZF zY2VRX9A{7ln9jF|!Vu6t1=<>Q0fG)keNWuYTDi@i2iOiw-wj{ zD0^%LelPePV9`Mv7^opzSmK)OuBvk0^s(Vj&b#d*ik+;71yfU^v%*ThlU<^FNy(%C~J?5wT77yelY=rP*90 zzg95n7FX9a!gpFRpNZ>M#d5o{YMw8~;1iDv0}^4Y#R`O`?-M7ViIxOL)Im2|PwH)y zxd=Cv1|GmW=vu zb@*hnR(RT0RYIFa`HUmNPCRfHw?!UU9#VjQ^*Z+*%D-2J;yiIXA=(MUq3w0vv37@0 z%lIX9%u@_LoFRw1vN4fxJrrHAO_MEXH&6}Z<-^LM!~{<0)= zeWJNzV8iHDxHR;kpHW!dTTPnI9t6a?Os>{}vaPa6bbn#2IDe9d@f0ab_=`wb!iu&&o$YQ z(sm0rBfGAAQ6KB;@?wAB9C}trx5j*^FUv1j*o|b*trpo)zt=fI2W_Q5ErWB)n`}M* z=RR3J;GNtw+J`CQEw%m*bPt&v!sk$1<+fSJmaNCv?ew=P%R(ylR$JtaEAlCC=RVhg zv$jB)VSe4*tN7$in9dxqG>st0r^}!qP9OL&c8k7om zwK(;XcHy`~7k7ls3rW*fyxm?|-+ss4r}-+uSosmn@C(FW zdi6WZqeM~Nmf}4q494`Gs0UP(3u2ti) z%Bt<67^kg6rK#TbYH00=(%`2inwI0U3dFMGx1;tmUp;`$iu{;dD0h0gz#BEYVkAXy6^YMoIn*&CM4F%a6w@-z00YT-Sn$&bL_#^CBw z;_sC#+gC&5cC#PPt%L{W-SwZ%;;FC0R!ij2lCETF#%oI6g&6uG$`8U#82}E z`m%OEg8~1}+G>r;pV~LGGQyJ8%wrU_BZx;UA05#tmYg(k*IG10`?U zP*>D-2j0_ea?CM?Cs-rlLti_wAE}l)({4wdl`eoegC3BjuciLb_o`v--Ub~f25BCZ zz7}=vgB;jLccQ!z`W-Y4`xP_Zre@F?K0^FswrHBq`-yYB1;#<1!5@UqehBLUZIfr^ zvJ9gIJtEK4rA-aH!=vo#le9L(uAX-tcJ&TrQ*WS^(!N%JrjPqLbZ>1b> z-WIlZOB$<<5#M0kpFmmTFlT>9+6UkZjA>tXJ56DWz-llKy8H>+C-1Vsa(S1n{YcM% zfsBKP={a>*J%{FLduSDJL#smWJsz>n0HWDqx(vPzoVDt`@Q(JP?^&icS>0pH`|V7u z%SQgsShoLnHW1u_wgQw<0_3^EgO#|Gy`V+1T-u=xL;G6NOg0^BUe*&sPgF)9R1w4_ z!~G*#R0jE_8&?^`*M)lxi0=lsDk`_*kMecjk$e zuD2b3G|mm-Uc;ZXqc7a5sL&3quRICth~M=kT7YiBW8LUi??U<+@o)u}*3En3l7YiH3?5s1H_MOL68T~x^LJfes+q1BLFQ*L9e z6}UC%UZ7{e5X()64$*|&PfgU>h58=UI_rW9yJ@*T(EkqHB)*<9k!OuQl-e4LAQxBC z{VHDr?33+bpG>5Id?IY;uFy#jQ%lIpG{~BGy#{P&^LsO!>5BK&w+BuT`c5(0bfF{XP&Uu;Ydi<~uCxIjrNR6g=x4t`{$Iv^eMIT& zsn!|RI4~sSE@c6j@E7+jfB1~8V~}xRNJw}Am>~W9lsK;YL?I}FU%;IM=E46mIICX~ zr;NR#(0Egn7&&4+bU3*d}(Ms*7DxuCeJytXpRvXzNb_NgKl6x;tM z)+3I={{Wba@H(c8lk9*f0L83GhG8oo5VOHtgkMDZ3*Zb$0aJ{Q;;c;<4}lWQw;k>p zFc0wuWg6z2@e^XbQA0cqp4VRzZy-DvJdbtKKz_GsWT1?iD5E;ccvWmLGEh!Ulv5q$ zyei6&eh6GJzs>pcytZE`%JvKF-Ob`5`$kb>A1pQ?&W`XJgy$h#7W}T}|B%2pI)6m) zyPdx#5!C-rFuwu%GyLbI{sVvC@;FfkAS{Mf@hxFRq0%_E{_d6O{ig?B{P` zKVK*c?T=xvYm7bqE$ruyVn2Tr`*{~*mpeu4e)2=dGj8xUtlcn!ky5H1Vo z9|66CFVXB3^o)Rh5vo@}mypl#M#vMTwUBq9un$r|ACPP`pbR|;wr>OVyiByo(BcZy0(nBftL(d^ac= zNBQVShWtK|7en5nP3mr?0d=!=1?}le*z{l8j)|A-4zxwyq18ek_F*h!yX2Ynr!-cb zkslI2@MY8`@C_aGs!qZ0YMXiV-(rdy;VK*#kxa*ecIOi)`FUtZGnAj z-hULUZ>s~}=>h(*xFGL4)c4Zz41OovbgD1Ey+eQgjW+F7-{{G*o1_0v(^9^jmfGry zt+pO$hdi@+0PnGseTit>JnR+nynVO&e)4vHfO;4{^Lt7Dh59ZsRec*7k2XJteeP@O zZtJD~_hOLJ?c|xM`M(c$^V8xp{e7w@zk!tK;mH3M`Zb6{w>eWQFk}J12vUc-)?es-W~XUGw^Mu)H9FKEtrcYpe=|;c`5QcQ1#tqEpeKk zx6Wu!P`ojT8ely<$VbwH#xC)^ElQoA->vsUAI4BCeFEA=L}6rpH!WTEGLZkjH2`rL zaJPcRB>(-(`Vq|~dNgd*X!JE2b8|%ulQubb)7*fqj z7E7bSSYryEFqYB@*!~W?MqA-_(zCR~dKTVS62Cx=+-4H+i(l;Fv{)ZP&&&52?^u?8 zP@FXKXg=RdIcU=uy#xeDT+uP`o;wbizA|5Y}z=l~1mVs?7Te}C$2iag8?5*aY zw|Xr{Tr%fe~P$$G>yYMnrTF0PhA7|9n$Sxpr`EfczNKQT%OXmmbsy6J}m~PUO#&|HB8HvzGQY z=0A^C%J1hQmec3@AzHu=(M$>a8{iiIKkmH)I*KD(yE;wMM2%)fGb2q<928JQ0Tc!h z0we(v(x3py21FJDBxD;f!EtSDoO4b%EVdU9(Kd^{UfJugI2*jq35T_Xz3W7frvIgQax{g-(M1yod}sL&{PsIIf_bL3jvOQ&15HVJ!H=T)?_c*Z8(`-Zz>I&D>;0>IE9!$3{HuHddd{Od=Qa(V2W}-~zy@F^e*7@lfAW05 z4tRlb084!UIvlV7H9!n72B7cU<9v{3h+GOh2gCtWas5-2j{v|CANWb&XJ8s|CCWO0 zyMU#@1CW28A>siRL&g^^`yh&UfQ#AtNyl$s-+T;M+!F&G+z9Lg(AMBv^qUl5 z7i69XA4R>Z*!5IMhHXze)VNizak@i-$wS!P#* zxL-sVRt_BwUNDTW0v?UNXHRXdp4r{t{lMRWr+~w({Rl$d;Ac#41N1wf?NQ!=@`+Jk zT!XWj4itO28koz*H3+>8mSYWXV$XUQ=-<19K6%zD-|I!c1%waW@&6OzI_2Gx6~KJJ z2INT1@=Kyoens6((%AbOayk7TL;Mu^^8(~{lSrNL67rK0kDSHLJu1)Ue){K|`sxp%tO&mBxa@1k4m*l9{%P&c5f6a)S z$%ug|$R8T%_eW7KKXJ|>hOH&f2(w8WcL4n;BfRL9`w^47#mC81%>ZKcLB!M~b=ofaVitVzpiqr`ty+FX_z=2Xfqh)2lB0gb&n1hIH#Z1w zGEsdca-^9g$nQgcoyhfOKySN=R@p1iZ(q+){yubE=p#Nr4|{tVl;`=6H_$t*{w-XYcw{ipOMG@}td1m_0}yWq;t4O2{PS z_Qn(EdU+?>-zf&MN>@@n#=?NTUfE@_J7o>{cj6C5j5){sr4~o~y z2Zb;R!Hz=oZ^&#fA|IyxqCn1EMZZH6_5q9K9?>PgE}R{?Uvx$82R8@}#4hN`3;b8) z2JSHF=Gw7uN+ee(e@mxvxm|u#S}O0A&c|M}S^ilSl8>vj@}UzpFqC>F~p+PmZ>8Ug*eRc;pzau4#%N8xYwN*Sbd zC|4g2*xgIaC(6j~c&JpegUdCSP99(~tj1{*7TjV3+Bk~dM9oXU5 zu$#+pEf0Iwbg~}%@bzL7af=b7@XuI%}e(_1NR(cZsJBIz{eb^VggMREK=cojYn4RT(eFO2^EPBLO;QW!yJoe}(bVGG)AM%!`yUN5_pdsiUA{J~3W8PK=R` zRT<;Z_%JqQjL~r_W5qb>c!dv8FGt=X{Q$rAlzfLULf(IZ?;uH7D*?WqtfS9_B_sC2 zSff%q86~VEYc;FMGW96)&#vqegcpOaY@nr4Zv|MZ;|uq zH-Ov^h@I*3GVyGAqp(|kMkta0qJDu0s%NlQnr*@Gxm5Edh#WAJ-^chMbm&DIg`g5zOg@0KF zpNIRPjW+uHNo+)Xq2IX%NWJpjGJ7|8JbhO=`rdEf(0kbcQDoU(-lV+O`v`J{M~M2w z_s{gbWcdE*vo>YlPTvhy-o4h72Ke2Cp?8Fp?{(V9rR;eb*%o~-I{(Cb-0c10DQI&C z`qN3jfdqWQ^`wRZ>wYZ#HWIctNw|?rlFH?u;cr`!+cZOecZo7=Bp&$&M=ro}F<-+}>N%|96B_+u(!`GiH-A|Nf zCCYmY&ybt>7IG=~26>C$MCjjJTU8BYxtIVSQ-`=Q4gNkEaVP<6=8xC|Cdh-*1@cjG zI@(W^k8&RqqMCtoJ8av77)9UXQsdYM9)Wp84CCIGN5FzD9K>V(mxr zm*QkHI{M6QrD_^EOL>IMq&$bt5Orj>u!~$O+#%PAanSp2`9eXG?-%EjMdAeF z=H5TT27h;i~IyODT(j_A=pEjaEOfNpCS*!ufG8Kr6@l`T!S3%VT=_} z3((C?qzd{Nht1zI^);~NuYs9_(|m<%Z=jtI$oZ-;%IXOxzDUYc>tM@IliP5=xyTnQ z)T!{;K)K6k;^I-&1lsPiiP!x|D6!&qZ4lJnrB-VjreKRd|z(hA~2e{{GP z{mwL7bpiCQLT8Oh>NW z#UCb9pu28W3(8jGx*yl4L;ecPH=wE`y^8Io6TfN}Ss^_Ey>G$TU5JP2icM#Usj`go zWYrAPuB;Oq$;NrAI9@&z>#R(4$Vaj69gts%zO15hf)+88zT^GSz+rx*+(_-6#$x_G z`3wF=`Ae=H>!uESn|E>kH~EizuKXhRDdD9w%kd}X3I8u{b>WV!M;$0XQgA~AA@I1%&muJWG$Uig*+h!5|P4OB5z8AzYh>`C=QA$GG6!y zdnPsF{SU}%K1Th3oGCm{tU?iqq2Jjl-`Dk$mz4MSo*?(~2g&bM=PUVox)33S*eC24 z&Ld;U$w$fo`q;Unvuk1WIMBn6>*?{>?qywBzVWNOJF|Qf=PzHX{O-o@?)f;LG=DCR z>*lQL`mJ)0X@x!fny{zByN6%R=$x=826Q%~v%;Rypk79+m`G39GX~Th_LPBEGFriC zdDv49>SDBvRp?~2G@LjVw1m;(aN;=7qHyAP&_YHF7|mzY!Dt?fk z;e-jG*^Fi}n#rh*Q7fYsM$L?7FbXkhVlwV+By6=8QBsGLz5qcMy|Giqd1%GxYpRLmMH zVl;|TA#1aMQ9i4e$0(Ok4x^EbvRPwUta>J^m%*-$U=(1K&Lqqn{c5 z6pn8M{mAHtaC{T!dq)3c^bbbgF_CW>9cG37jJ{#?HKV^Xk*^qi$>os8}X+vb99XLMWGHV<@b*wz8MC2X4y zx;boH0J@3Mjf`$!bUmZ%7+uTgny_sS=xWyHRjkb`S({fd+RU21oK?7t(IzH&DHFLQ zYzu*Y#~QnsHFgoB3z_5vtd;Xw_462QWVC_NdPeIQoy%w~qcve0d@{G1-QgV8^x2Hg zVt43eeObk*huyE6RbR6Nkg^U)2(Ry=P;hb<>5OgLhJcAXshvU|RW{2Z00L===T?CpLwju~~ZDFei)XJzO zY}J998O;b=5$3s2*oyehH8E;rG(BuZnCBY8Rs?pgp3$^$EbaBwaBMYb3Zpt!Sj(t} z6;5U}iP6MxEaE0t%|s@!!YW4N!qHu(R7NR`l39f$Ch2Eg^07{M+5J3>5}9NIBR8w=V&r5L&m}Scnf83g5LmM2VTSZtKe6Fmx2AjUxAl^7l9Xm=M77}e=&4=pEG25p9S|Bvb=vr z*)ur)lVO=RC_imj;(f}n*t^fL$oofJ*=xx2J_$SlJg#5q-J|dJ?$-Bscj;GocLF)I zz@5My!0o_oz^%Y7G1=amftz#>cyH8g@!kNw9=Hy;7Pv;Y$a}T!eD77dTfJB6ZuefH zyVJWF<(C5&38~%-g%a-tT#5Jm(8kbtTQ`O_gw}=DZ(SFPS;xh!bFZsiw|3pub?>eV z#;SDZhSr4EZe0^v9XdO7&epR-PwFwQaPc=CByKaNIdSz&N zXvNm$p{@nXLQBxW#U%?vi?%KdEhy;-&EMJ)GIiv1@bgOMhUS!<89Jk6cBp;p?9i-| zw$RM2Z6Q-zP8+XpEoligqw0*3rch{WQ>d||AvAq!Lugvb)X-FvPbsMl)orZ})s##M zP2M^wG_j;QGy!@b3FZV}f?%e7nVNu35jQt3*Bx|!x5H`{%7!A6H^pVCyVaAg(a zyiv-qz4qj^YLksK*}OJ>!nZc=Vj^%pjw75IBxoSBgR^<7g}ofzT1tfDu6nGgF*CDv zk6NByyG>I+a~pTbw$w)YJJ`^+O?AmO5^9^-@)*Zm(fSz2k8j!*SKH9W&M(@$`7t{; zjwFt&-Imzc5*F^dD{)+F?Y52dI2crpWqM2?(n^$*$LwTWYi4^-Z%<}RutGyDA6dS$ z2)3upub6q0i8GmG6CX5TI3}al$kSi4Q3x9IimOcquYsq(WP@N28c;$I%(NIj7*jdEIvA6kTYc)tl{;pxYR9kko>iI3f1I_qa=r9ClNQteJ*#j|e|nX3 zl6lHMTAlvu8D7-O8a<;2|5gnZuFCws`H%ZQIx8_*h0}|qn{*mpRH^p59jRlg{mx9E)nqm6 zjgr+Kt5REIW75iN1~1b%Tn@EPr`DTw+W2_8Mypfl&4VR`mtT~RiRn@tNg`=vfa?1R zejUG_v}97x6>15NjyGGmDXDrxiosw{i_sB{?m%KNy2kAyH@G>|%iE zIlG|O$0kmX4N0LuW_)F3Wo&5 za0O;iUM`pE4*LJ+&F1B{x`PR*uTSmo9M-_eszYPTWG%4DnW&0sPqouo9m%H)e!(bU ze$$GIIX1lxbu#A{Qv|^pNV5AZ8ZLM6&_j~Jk?QuO7*#R+J!-Qnkmw)b)bUqxk$bqO z%k6HXD5&*XZcOBPok1f=Mz>uI#~3w&pfSa49$X76Zz4o=!`?k4lN6B`f35q+Nfuwc zU8l2=J$y;f?9EHH+oZI9yVqsQ&9$V`JkiyVhvad4(9%TJ0yR{^&T~p(>;0u%&U5(% zZ}wYCbNZ>-$NU#n6-^qY+_e7AXcZT&v!m11U{PvyqSi@e;wM@)vy?6%x*9x!EzT$= z`;*d&tym6zs8LPVPO?Ckkx-ZxJrdpi^5)`<$%TmtrJ?T4vm+1r{o2pf`EJfW@8Z_1 z-S)iN@?DL8p0;4DH~p-&@3;M9`pUY17+bzzXz#Zz@g*)OA%)UD;4%iO~t7q|w^O&skly z;J%*9z|`JbpIJ3|Lt8-HWUEL?%}lLadil+_RoAbZk(Hd8Y&OG7xE$8F^kirG*^l*{ z@xs0bH%#{Dr^Cgzz&f9Wb;gr)a_#AClkmkst<&cQ_{gtUjjZ6jWf@}V@d5Pk)vFR19y*KPRFY>X$VOB|> zt8+Y@<@&x0#_k%?a_Pz)FND|Jx4xysC6tZby!n!~i|R7eW_KJlp~`a}SyyvzYr%kJ z%>0Y5yA`%GT|Ooph9=UEz^ECplzDRy6g*vz)4Z9=MGv$-|c z&+ZJSG`N}f!ib0bS1DFaKm1{7j`_KQe8n9?Q;!qv|D+wN!N+V$A9S6xGODB~bvl(g z!`z>;U{NQNsS*oS@GFK!kEr`Qp;)_cn3FUJ9Fg=E?rD7t&rZg6axu0fr_&#+;=fbp zI`|1jt@w>9&grrnB9km8jm_bTGYlTm=+%;h5GFpF?zJ*)a>o#FY-G`Cv}v-D7@aMK z=tRjpJ?iV>qhUh@`HB7KY)$(oVr9ierm zOm~J1Lm|siTB$4s3oN(~K?k0>fJQBMFz(-0Qbu@MkyGLsB$*3QbDW({B@1Vq@QdLK z(WoYFu-ON{;2O1RjWyYwkZg+)BX?|6RHMx55l)Z8cpP#)e38cLOra`Mi{BeOw!t3; zw^(c%tx<#g#GvIb9$bB5qTe0T-r&=Gh1Q^kN1`8SQ%$P+u#QHP{?ll3T$Vr1Fmj|d zo9JwDzHFV&?7K3X%gyFY*<6f}ojp27kG))B!^mudmFVogY`rZmE5|?D=uU%an@=PL zR1cN{D7qlCkIScN2A0R{*_O=G_#CQuBpa3j{Kqe<`NZGcqB0BrUVQj;L~9Kx~AJ9+~1zC(0g(^H{Y8S0G`aRd~Ri?lx+zi8lIS z4z=%^%j}`{n#8DMig?zFp=qbU^ zh=5eOhvS0A5n1|x$F6l~)QO47B^d4QU{*tN$PzU~rXL5@PwA+kNx*e zQC)|nM5Ug&^OTBNO3lt_&Ee*q8LfUY;j`Nv)?sc(7%7}O6Tip+#kBNkXHOe7E_Re4 z>FntVE}uos7ih4+M)xe|b@n8u!yl{WztiLdBVAi z8l2WO9g$D0euLJa5k;NJz~zpbQJFmW_KAu5L%KI*!u(lDqciN0y4-0U@Is>8FWfBo zNevhK>-pJBEPMf}Bt?8_(BP`X4@tEY1**K0pXBJaG=(EUV-``H)x2I%XQ{LD^z_+u zRU?w(!1kc`7YQJZ%;tV`za=)4=0Sb5jGoi<@qepXCCOA8Q%|N3kUO(d_Hbl(r_xLn zZD&VkRijsFsndJ9ypv>RDlHAIAC`ae$Ujxl*%XEn&*%hpH3C|}$(+9jyeF$S$UcjDY})m^oLw2Fqt`ik_5?t40No2&C< zHR8j_6P#APE76r&S)Z9Tt|&LZw02G~bp7(NHm~31RM}llo57drOCR4>kUhR=B)vR# z+NMQiW`{f0O5@7CSaUsCb4g_7Y2u2OXf*M0TB{~b$(_6>oy}k$g2aLS1?K&9-JI^a zvNAMY0z=6>a=fJn0@v4>_&7G31Jk9j3gqS?krksFLU0p%v0aG^mb zeyy^_yWG@W=f;}VHdnmOKy#&Q<$lS9+#{3Rd76&`&8p(KgKPGzsi<7{#9F~Vq?v(l zS}ttK8rgb5)5$XGaT~CnKNemjX=Ds}hG}U7zwzYWPMfIl?BV{f0|8(RQsGB;6H^*z z71Hwd@SdQ-C_ug6Oqfv6w6wb`D|td`a(U-9Ezop1H2tcy zl4O%{bBg3yyXUuc0nG(upc3mCv>b z2xyLz9xyFkd776t^Z-bW6|PneMRoK6pc(;>W)s4z_Pm;L-%#Y>M0~rY-r{lHM zl0C5^S1%b&CY5=@?5>is8D*()nn!er#UqPWoLOt}=X6#THdW>OE&PRLS6_SC(y>*+ z7K_nrl1emi1R{P#x?Cm2d9lg0l^MQKRg)%WxvR@YR4lu;`Thyxa_bka?1qo1!>r5@ zULd2$GE;=T4ZEH+{*BhNVe#ub0zL-HDQ@!f!hiFJk=- zwG^$#7pwMlMnyC7U+c`M@#sJ7^qlHBGNV;a7;&;nb&3J=>fwHzCctTm^H83F-X6T< z&Fhw^rFqMP3u<$*nw`MtuW}JQ7+@{{zq=)Kj#&%38wk%k@Ih4#F zn$R^h!(ZX26fI93w7 zNh8@N*>86N5FjC2%GK9q$@c?h2Q#y?zi;N7@B3yJhT76%haA3gf*l!F{AI! z@8UZfb(HmLJl0?8)}yjI+E>-%8=wYOV@9%rCoiXAInboKhH=kz*HgseRg1^0SCi|? z=ct|B)ib#2?`1a1n2d3}ZYc#1gJwV!db_MxEEGyg zODX6dU>yIF3L`73LVvfO^T(=6Y(B7J4##8&5|^U>Fvg~0nMLLmZEB3ak)rP zwCIIY&`K=-c9p{OScx6UB#L(O zl`g9=6&HZ2=011mO46OLBNV=rT7@ZFuN*Q2zDrxYRY02!Q?$9b(&qyzmw#r83?%!j zT2xJ-7Z^q_SWW)MiX#3SFlzlSr&Ng0xBq+S>{zWJ&w9%0a9ITc6V|%^X7cGQy)f4| z!CXHNbG@;U-4?HwdO*?b}uDyd@JWj*czL(bGyOpV1w zj~W;%95WJJkI5>FSm+rhBL4f_$C~FYuTU-S)g-udcXTa ze1=&+$_)0TRVBavM|GbeCqIW1b&|HM zdHB}~>oE6v-K6%I`YBjKd(lq|^fA}8t?1h zQ0I5*k)xIm>>b(?Gd67MYZxfXYWB2hhZPrAgzzF5>lPRqVr&t=bll_oX4b~sm;5b7w-jw4t?qV4s!9O{=B5GB)0 z;}k>Hw>2DBGcyu-9COxUo84>D;ee@o--%e;O)VbM*0V3Up=-|uSKi7}+~|o9wBK^i zP0Q1(nZAwg_P+c~@(vi1r0hR`IRJjOKQ(lD~0-`0WN>BmS;SO6GWJmqvQQ+sUBLh{c5s6 z!F6kUdZu5$aLBK*%t;vVnRT6^8r#>d>UsQcIdHOFW}SEmcv^aXmE@9*j`nTuNpe+} z9Ge&dKjH_#s}qIMt?QYU_b*D~9CDdmgq3ua$sQap6#vHBUv()bfN(h->QT;1=-2q7?EhZ_g-b-RovB zTLtz@{%xJrjk`_{hk6@}+LHI|dbp>%e)Rb4j5@c8w?GCBnKLH&@qrC2ON#YMse z?24P?wf$m|rLwq!b_V*K*;PiJ)8WPJy8RRq-lw>-S5~XGnp{&Xe~nu2JzYz?I^ap* zxeY99b^2_9n{V1`8O}E+({tDF?C9T7VJY=FX`1|dozo|IMMlrG9=mH~IkkSuK2$Xj z3s4M4)3P??RxT4i2gZ5|t$9y_5?lh~vk`p%kfRm;QK_jh?(Ke|QlcVMoFXax3-NyG zY9*>RR}%tR9eyS5EgX@uh->#>;$^>2TdIE~w?K8j0M@Afg=DZkq>C$^FvMhd1^CnL4N4n~2w$!ikAh=FAY zS~=MlXxZ7`GTi8H9NstF)OhfY9pziwYIvSZ>iv?#>aw{*ExyX8>Z;a}j-E5SqDF^T zU@Zdcklj#kiPu}(=C5uFRmVo+n@^6^38I77%Q8B-@=M}b-6Nv<#hT0%#MBHqek2g`C4jA&M>4m&sO+~6fBicH+b3$$Q0oC{&zrkErY4!vg5llO3T zhr^;@*4rB`4Pj2t@g_rw&&4oCo^~}1HVeg)WW;Y9tj3_^c!?1>osJWjmmIPLW?*gm zG5IuVLtiK$fdKD9(YE?%X_?!Fcvo4}UD{U9Q7wJGzM3m>^B}bvRa8w}uy7aE(@?6XG5_sT4rlc z-nSdymC2S_y%j962Z7ZnI$g+K@Z%3ZDmp4J5+w*B3BMEP`2&`Xa#@p$Y?-fJL*0B_`}x&Q@GCiDUat^?m)$vQ_-lglz-^horji}XwegNdrL)v z|Mh(Y!GJ3CmRK0PKx~>E-C9EM_A+m+k9>%C>i0hTZ?AuF`BUK5>nOoy#4$1@*ce{n z%&1=q?0W2}e;Suf2mu)CU->PrMz4aE-!3!sG+6bsNI+IR_9&A(LS#E$-qUBS7x38m zWZrMG2^3soq~mHzZ*tWHipp#(#haW}<;A5o=6+*&Wxyq{R$N(q6#?Gej`!vGJMZ zpPFq3isD5h-a#2ew*?GR694#hBY%XpI~`WuW|4z#qJez=UY4TG0`K?x*l&iPiF5(C(LnXK- z&UvgIB-=0|#xLOV9Dcqf>!_s{(;HA==fq^IQz7?prP&*3BSZ4n%jz!R$oXVhgZv_G zoKI%zu}Z}?Y%8_Z?bS5fY5N9mqViv2(Y0h^DMlT`$OnFRk~C*9>zA4gqMjlJmmLod zogA$5u%_Ua#@MmZ7_S##esVm+ckY{MJ9MtESSamC+&%F&QE4$w(GI6e6u@TH>!tDv z5tnT_eRNlEtJBpIkpfkq$XKhxVY4!PS-{=A^H8Yjrh~`N-aYz~Tb^B|VC_5uve|>H z3(00*MmGC^MCk&tD{eqzRj9KHp{h>O)O>*$eRR7?xQLsP1NGqYCpJ0Y-y6Gtb#eW+ zvFIDYAhT`6tGxNZte$xRO&K$*r>o>;N)el~rv>9RM{@E_f8VyV;&ce|Th+-;Js`a& zlS)(Dl(r1Xv0(I#q|zFrG?!%7oVtmHLoxOARw&n}Tkl2?rP=*2C8K=(%S(y@Z1<7m z?e6B0g^wSszj?URV=@pr7z8XA9yr=HdUkt7aYth7oo0(NGWe7Ix87X8;{XhWR)N#& zIFp`_@0)8MK0Q=XJ2Jav^Ztz<{14G1hsHXBg1y+nxy|xHC%d5}Skky-B3jwg;Imj6 zhutCSYln}uZrxd0Rc0}O8WqR_Z# zgmDp($3-KEsNQA`TSF{Y&2iT1a9E0#lz5~tUbmTGsnHuaVup75>q`7#p8S~u2m}kiT-;mQ8l1lWPzYa+pPL=uTFHwpfw9A! zy#tUa&$2f-HqY3$ZQIrv+qP}nwr$&*co{;FFV{5gRH7Foi@_Zil z1siYyG@u)*!2MoiShi;(gP>uWL$EO7?&$4WkVOv9@*lvjo`|VV!Gp{R~po`WY@*ei}!vHSKwNv@ZB4>H+ezK=0^}9 zaY=;|Fzt>?OACncUfQhkeuoQr+HUAnxUM|mwBO$*W-A@iLgyQ@1CPFAy%&IA$-u6& z`Rx6zVG=UdZCrU`0|9?;eTn*b=_%RbfdzyXXv*Soo}3Y1^zX&4XnXvc<#XE^r_EHb zMZ-|%6xlXofXni9vz5@EZXx0d$h61;awFSfYBnwXsJA9EyyJXpPi}Sgo(TT}hmx3p zPiUA(xC1Ulwyw{lV3N5@fo6Yj>oNn+<%zGAuDvGTFi6)ZR&F;ry)aUUK&CKGkWAkk zY+SpQt9nCWe}1vT8x9XC*4Fa|=ka%Fj3LRELkzj$(O)&z%6jt;7obIl*U1J6OQ?&K3B6{XOvWB|6aavAcigEi|yM z4QfB$D~$~~L}V&-wMt+R4{up+hy6l+*8b}4?}sz*re_Vj&fYh8#F3hU*GhE%bEJwm zFo!yARG%CIrDZ2;09)9dZB4;mwU@H@#~Xsf=czoC_h;EBbkIN0MKlzhJ(C<(Li^V*FK(K#{{{O5D=E5TQ(yz$`8yP@#H`hqz4Wckwk0Pw-~Me>EN`NA;w z<+#{~@Omm>FF=SSR*pQAhdvY5?(>B|6WW-=UypGqKxB>>nPblYkRYBzj2l7bjIj}r zV2)Na1Dh`3V2(wdGj}pE2K}w986hZ@Sv$Y5>r9h9W_g;lxiCS}kXc2VtK)8R7@Ulz zrlaj{eK?)GLkRXZLB!NhFqmVEusl#`3!#Juz)q^dbaNA!^bd`*}Z~Z-{>u z=a$O0#}tz2P13{!;pl=|e~zL}@)^W&NVj;AxFONCbdgh>FG+SW&WAGFM4sxki`&x~ zyNP0;G-ISJ?5SiCgmHo9lsUZO^vdZs_^C3djL_Sc6Xu%`UtkYJLWLM2KeA#Vek5cZ zKa^1%(At!c4qB0k0PWo|`+>B81*Q>||4+^WoxgPHoI>0__fkUbubXVYh0?!{za%mB zyh!-B8*kh(C1HdtA!2V;;^^?Q%*@;YE4(GM&&eA+p~I2`Jt<@q|U9b>4B>}4$kT0S0!4FrM| zdO+onmmkDXQ6KOXuFFz>79}{Og1$Hlx^KgDmgZkoB{TvQlcFpWkMWfpzz$SlsH~I?m4HTC zj?|?1)ezFW&Q=*SEkj&-mgIMFyRe{S7JF7&mbA2_1dCdR^pwn$?DSY{>82qg10Qd4 zRwa`Y+@p&P9+Y!5St;DC?4PG;A%nd)rbRUeywT#^jTG0sWJaA;3`C*s(AW0dcikbDe$Uxb&dAZpMR-e-~8VKOImjD*(#|I z(R_W*pAWB7Yq?*BHln4z3tH=^?Z*E>K|s_4XsUB-{$D{oIQ|Eyhk%WZt&=0ZCO#uG z{ZF?dzBWFckgbiAvCU5}1H-?%=wytI%=HCr-G0RW5n^Rv#AoAR{6|z?-{D6RpOu;I z-;#>Pj<(JYhQ^LR`u;Om+1<|gA3;;&e*i&@ZH#OUET9Qi{4Fmo^Gt%S# zmyUnTQx;LD{ZV2pt8ZiWJ2*DNeLShTVZoU zryt{)|Gl1nDfq{BS!Zj5A4`6w{O=|HW4nl(lbDjzk9GL}w8WI?f5x)>Yb-DCKc@aT z=O2c$@;?mLe=Aj1X839R$79OMj6aQka8?w5{PSaogRP;GvD1&M>Ewk)e?}U+IsLfe zAC{7{fz!X7`Hu&FIRC1v%NbbwtmMC;R~R^0{&BRUlY_CoHI#VxlG=t178`>1irP)J zIpBPku3sL%4b3{C2xcW7e$`6&Zw&`EmxvGV*|^S1=OS$e+4B+lF2Z7xP$pBiqp7vb z!_EvIZ;z+9VL7^Vy&d20k3(oy&qvJI#{1{V^Uv6Z_uJa^zx^Jz-GfjckB#lB30znr z5DC-8hoWMo*#>`5su^-%bEiAk)?$wXx;LhqTDdt%iCq0T1PrTL*!)=@FC3mWf@CV& zlO#3u(+@_(^Xnomil4W?*b_JRGkfj7_-?+L&ZB1<3GDT5KKK~Ldv&L`OFv^p)U#vi zTC|2BDpO=>gl{OZj^~A0z2FKmFK0+v`psgVnnWVe( zcfXQ%Cq6@7hq1#gTwb?~@Ws3-U=9YknBlU&8YT%AJs*Z#g-)d7Ue%$*`WruV#{6zN zPO?W7X_c20#|I+kGk%4#me!7-t#Y?v&7$RwtU57VEoaf7vJ+}*&5(P8h@t>twZ&1A z27V3!NM8cOjU}T+(A1d7`Rx3e{@57CYjpo@y=Vc`J<2)cY0u!<(5a)!((MT2xRFg} z`*#5>2Ks!r%Zc;yMrzCI?2*g_By|Giw|)0YWboAXQMT8%1O$lZEt~%zPA&+4C#^jl zhU@kgdI=xC&K{lGiokyW&)qwgI7EkYhnCK{b^@44Yxj^p-0 zh0*4G*L!JM+VDhV3-`z`g=7@`-`k-b(4lkLs?u{&fO{xtVKA~|(Ty5j^{tiDTu&cQ zcMUcr^sfUxf_9N0eVuuv-1#E@(IHStQwc?(*NQ|j5dJ{0KB`Rmda9%3&fNB=N7bKq+GUlS+ivG7#m z>L^2ws4JleZN`6zE7koX7x*o7=md9gGd~lCL;{)nBz9O%bFu8ql)f#MC>-X_{`^Xk z-js}Mwe3U9n^ch*;Uc0Sk!JTrOvRl5@qpa4f_pfAK4%eti-1jzyYDQyt%i3t4O=nj zp{>TYA;IZDVgVBRG!pkbf&u3u$N>ckDGo}^U=6j8|3(W_crA$Lz4FZo@$HlFgaznl z;kq5*0w)A8ko^*h?bD@OCNa`YH`XVH7{CiG_7DoLLh zkko8pOvr@`yj~_^M_yh7G*$LzyL37~&{6&qD1wqiJEiB{G}kG#x)SSD`|)&H1@BU8 zYis#YIUM_WPxy|zi)xXP)+O#SeEy88DBy@8B+J>{Pl>-3V;_SyN}hwIf|e|XIOx~b zmDwfvv%b(3%Ek#}yRN8fg6i60<=Zl}pZW{@8BN_EHt>l%^sp-Tn_IiB{5a(!rw+}F zlB!b4qxrmo?q6}DpzeE|xZ=QO46*|g=x5~}YfX3XfF*@bdBCTLf<%F6z!)n#HECre z@kk8o+=7`qm-w+@HT^C@kyKhSeN zn0_Eayh#e&Fvswy0ro_W5D;-P$OPh9Qw|THaAk=Y<0tSYFoJ+cPSHfo_`e|-=a(8M zdms_pAx}Nx5Z{7LAfb#gm*8V2KBzb}nI|jHFFl&e*W@y{WE?fOs#>sI8jb(ly&bib zuN_{JdXJJ-v{IIBJ4Fgb0VF4^1FG0o(<#a%P2|g+NzbP7AGXG%~^P4u6!<9SR!}E zSa>;C)L9-sIzNnjKZz5_BA`)((L2odIe`!nWf9+E6BsW+PYr*QAj#7|2vG}raIt`E zsqM;X{uU1@C!^7{GdA zCKz);1XlOE(T4Rg?p_i1Hzvh%vv49P$w)DnAY-+ar|NnT;g%kjB=> zyMS&zwZ}g#uk4`t)cI~ssoUrs@j(PI9%K<7nL-iYS}^_m;+PoSga|}xjDiAd;0G^- zXbzKW&W+V)TQxm;=?|guUqpQX)Kh$5 z|7$?{uQ>C+qQU=d%=aH$IaYf5{~6r4WhHBEC2p`L_&)3Ax0+edWZ?7rZMF`DBk5k+ zc-6aFp3^?}#j`U-kw_v^c#`>kIu~N$^DD$C)HH~D)rWt*IkU09p4lhY`gq0P*ZO_m z|9Q0+LF@f^+3SR-)9FU+&`H*?j?(dVQ%51KJaZ^M=bTK|@LsL{a-~u6e)h%tI){et z|Hg_pb=J6#VwB4vNH9enXEM5jN#-t;&dESHxhGHEQ>GuQFwRyQ<@|?1cHbp?oZKC`C zpsl12iySVB_;K#k|Dqo!{lAgi3{}NJSApdJqj-DkD%f{-&`}^cM)|XHjPm(&^~jD< zRQ}!bPceNLv7!$Ya6wtgA_@vm6@M74Emb9%p5F2Mv}3}ELKP3LZga4BCuR$=zKdc- z``eBi57VkItncJ;Bi_Sh*4y!YCM~8wcEC6)zK~DeW=F1ZFh!*3q%2 za+!ujD(AVreejQHiJ#4b4*&eE?i;ra^ zRtjm;uS6^&2@q)g-elz~LuyTP-8ClX6%HfYf5rJAi?%5xM6VQ&)|9ZWYGq@8*GTsU za=laTqk`T_N*`@AH&e`pi+8SQ*ByNWxEaxWZZ%8Rb5(mC|E~+r4!*X@1bIQ&s|xD5 zx2vzsj5Zg3t7Q9E`%cT!;-wxqrr5E3iVCHI^Mv$r_TrPw}p3uqQ?h%)nHWiy$Y%ZWG}V3p=U`pdN(P>DTsQ_ z&$)xG{^IYsneQeL;1`)+w?F}`H`dSf#g(qJ`-}Cy5^S~Kub%7D-9)}B;$%JYT5ZP<&tbU znI}iiV4Cu|pr9&ut=Qozu-jG7^V>ApVFcw#6muNxVHe|C`Czk-%>WS&;zLoC=7htZ z96iMUx4f2rfSN57i6H#+5&#nuWG70zBl})PU5ltCUsO|Ha%3*oQUi5k1*JJ`+)eQ@5GFJZ1kbT(Gn_A5!p!?~0X1Aoa z-3%!OBlpvgd|P~8<)HA|;O%Dba3_VObXMc07onBwFX4t@pj5@-MOwqw>k(5QYRkv% ziPIJg&5l;MWEkVcSlvx!js69Zhp>&zGYDW9$ZI7!YgELWcC6gKDfanHj(bLMlJel^ zBjCc7t%J%|2!t_k0(RINS9@UJR7dy-Xb-%}eAuS$(iBL?%rtftLz2kuqxxRZe8gs+ z9Q{#n)$o{y;v2Zd1so3Pj8kQU6f7BDG^Vpw zK`I0tmGf`)sOIh{UDiJZv`q9Rw}s#y6e`NPL~V6;B~lo4`a4+S`o6$TBiH+^{If3n zY8nKqbRDgOILarXI={&4;&3uoT~dwv-p5bKTm4#%p~Bf2YAVp9^ea2lG)29ZeMUbz zz)&ifF<_v!SHt?K7kL2Hf$Qu5R0hpDEJ-P+o12-LEFqtLEokluk>-#QorD?#SIC9a z%^5OHrb+nzXbR&e4gz__BjuZKdXJ8_6H{fQu!P2{=HJ4u$>d1}R`$BKz-D9#LMoQQ z>S16hdww%4x|pHsZz8mpVM!+#ladI5_6k}9tJt+Hr~bj5?)21(w#oIOATO((vlHF2 z#g`YhRaaH*I~$YWN@OA`l}~5B$S}j3rv^Yi+%i8gO&R+eO};#el+l{X?b18Cmb>rJg#gY3x5Iw6^U@iB7-si6IvO~xWR>}MK^N;_@}$#{Pd6Mk@Mc{>K{ltMTcQG! z)UW7eRb3$cGIgD)bs8oh`U6~aOByp@syq2SNXf?5bjWC}=h1j%?=>Cyzs_CUyz@7e zd5|MP>~JCMN(Y~QK(m`Ws|t`OMN{rlkfANeG75H0OjCrA!ttF~{=j z!65mR-G$Am0_>+P)}+Y|6aBDbl_&AjN1J#fnAPIkMWBC2-zVukB4sWCdgX{pLF#zw z@Ma`vjR1>k8XFWNtEP_OlBHQ8q>k=muTVIQQjL>O3$&ot9-YT(3bE5c{RA*k06&sM zi$lQQWx?@Kr?@kfNf&?9bw^W{p7eG_d`(iksV!3pOhyT@#^7gPx%v2lVh4l~guV&D1#G>CInXVCH7S8t8uA%VWlp=dSv8gcG|r+kY;12& z7D>k#MofV&*8-9(r!ahDJR?U-u&woygeME3gC5k5sXoBoP<)zNAW}Y}?vOJ7TqsyuC4HmYjPm$&k9fbG2G^)z6rRpHbrqx$21s=?uDz7(0JIkQ-JI-4i%xL%d}r=X z@8|Q>e%JTSr)JLgWoPS5vmw#51==2q!_zoNE+hR6$jNo zxX~#TZ_djAARz{QulfS{IOd_&T9$Iuel#TgK|!~CeYcFr)N z(q=B#Ifgkh16T$|pOsCyt3D&asw5vvE~lnh{5mF9rq5s|xvN|;G34G^akMB6r{@N+ zhhxKj!+)%yG7excl)FbFM|xI$%>UB0mA%@|rvQ=uY)r1I4-2|F4u*ccCSW`e(KHgsvB z1aYK(DS$(eE4BZ4ju@^J~E!bT2gDpU#9g$q8 zH9CRpt2xtQ=_L?qlD>)F!YhY&$(T`o&3XN+#|iGc$%7kqrq{5897gB}AgxuS3U|%= zkpc$%&mSxMs09eWjT9R(O4;St(|R^Sk8UVm1_)U7H#;FPF?ZM_#Stc>i5*2TNsk3s z8f--s(@iN&H!goQI}<~pGsh@dfO}w|E*DYZka-0*&_0PEdg!TNYb!p5M;isv%q|`6 zWmtL`XHytsKR`}fqb%dGDHO#l<8&J$M7BAxP%$jl`up@)5^mT8lr3ICfEv>hu$4CS zVRLKVWY3NtDaky2EnK?xq#F^ytEY=8;@?qlI_^#Prz4CA(!7^lv&$fcG!;WQjtYQ` z3lf@`sI$+U25&-9cePV&wa-k9HIIawVhDA1PA45|vs)0&g)H)TN+GeYjGpHOl zoS5cXL0oo30F&E*nzl4+GSCOC&rfE7!;J;X zP|Rdb<_HX%{^Rx8>MJZ|s&Li+@?D0D8R>wiwJu9Ik8ay4>6|h^+yaV}VJ|(2cpm zwtGSj6`VP|o(Rv!E*Xw4)d?mb3N1Hsl{MA>eKS2ZifI506sJF=Zu|q~!XYFS{NkBU z!(SB0s~>(B5nlb!)8p*cVLdeIbI;JM&E5L|n=kw@RSMh(7{Rl%P;M7W7NHgtI`K<+ zNn~>tqm&|Jw2F7qlPk~h>f|CUqXInD2b_D5{@_hKg$yPy6T#TYjD~%iC0`HR&K??K zUNCwPwIoo`=FBW%) z!gLMl&IzU6{@PpvzV~qOwP0}<56hYodH@A_%9gAjwSKC^9h(DfUYwQYA;a#;j+=fF z#j5Ba4qToa^2?JH;hSTf{olO6s)3fA?QbM3vX#aV5kUu*YJ3;zynmK zQo~eV%_Z+dH0ozOBOC)^y|$}^YChMBGlKpl9-$jD!0D^gN2bB523Sr8x7%C^C*2m{ z=%V0b{&&@%@DG_KiBwJL+Uo1Ac@t+i+R{@!&-0~EpvduZ^fvbTAOrVJ%aA6>d=0Oi zZ@tc~)gy1J&b8yI0<8{PJ-_1qAD2#+ob~%Am`2nZ&K%S1Gdz2N_Y6sZdE;Fx=h?%l z*<%|cESe7tkx|u+)kh^szGbmpAs4Lg0193DvzjGS-M=j!_!r9~1RpdJ^#Fq>pJio3 z&8B^bNU}o&MUtymT0|{5@;rh_!OGJsSRkK!-u#tGYTH?U9gDLQ@{d~g^|E~@V8`jd|qx0zThN%C;ZGEJY6rJBBarO zqpa=BJ2$y)+#a9s)pqc7KiEDZdr=T7qcuH|sAYWfwB9ZS?AL@$bZ4~Hcw!TO+U5xzE*T2d1_o(SU{FPbE<2~!LCXvZi5)V!R73md- zPWJqFY`bkhq~|GI#>kSme$AljCfE@1*IyMH6OvB5^9l=^)6$J=y1^4!FqIHvSdW~V z=cc=Qp5<hx*pq8Df^Jwt@ED2L$?U@JEmsEotLW_{-gGjaH3x zNf3iJ|Y%81~Inc|RofCnEdxdUlX)POeGy(x$Bfv}4eK=&*v z?rreZuZb1W$Btm-z(|V@+-@bFWTK>RVZBA}r&0ZjmMB!tkx++e+aoR9q1Dhp)04*> z5tNP_V35RGI!^=^aKexeB z`wxQ)X375MD9ows{_%Gd_HNVYZ-;J|hk5sObjbaD@TxdW^&2$6RT5@tzs3&hXnZ~6 zU)Zg&OMqLc*{*y*QAxsKySiZkOrmhC;P_Hqrx<@?zdp5P!JQOBq(ZI`y#cooAiyBaAwbW*a4A*!3L{KhV_pu~ck;>U>aPGi>6cK5^K_-BJ zU{X+XJb|OJ^^D21%X)r$&`t;5(iklBX<8=2yVa{m34X)KyKVH%1S=cR0LFOXJ- zY>NsY$2^Wj2)S{o!EWUu0c_Q@v@0Ut`DK!44=su&)^oYF6a#L9^}IFkVF@Bb z(UVtSEmL>xU?6?|-afvxn(Jq=v*XK+%oN@i@xuD2%`yC+xTCGjzB>71D{*A4_eDU~ zg^_~wR|f}P-sjxj4k4b&cn-gDA2+}9{K6wc;g?9#i<0!H2uI<KW+R{hvt~@$+2#YU9U$@&m2=0tZb6urQF&c}aAL(L_kRvA|oi6t^CnH@;vc5*OS6FN_~;egmk1sbZ8MfW1aE^%4c=r$)9#lewZeX)>w`J}}w zi5&ESdM@p)YC-%p*3YL8t}k->#kj`Zc>i5=4CL{@*}iA|$zJ&Xuzk;f&&t8X&i>!2 z3ao5DSrGr7t6;X>lnLpDEb{i8TXU8(E&?-3$ViA362#vIA}k!k4+mlT3up>o4DQ!2 z5NUvRQKAEJa`ZeK;= zGu4Yb-jU+xLPkpz)EF!-8%Gp)zt$YWESPawOf2-TO@_mTi(?Ur;piyGaNJ3bi!+Ku z3SpY*0`f+nVOf9u$q9GbFQ`WBNfE?zRP(9nIq#t^h;H-ET{d(qP1;1( z@Z_%XMLEnigeE-1bMKN9<*ei8jxlN$q9%qO4j8hyENvtD@yf$yHFD*RaGe+`NTMlEBL|bJRJLE`bqb$re+~acP6yP90xY9 zcPHi1iz#Gij!j7@1t;VDl#jHk$5xFzeWi#0}T? zkX=~@)WGs4L~3~{4<6TW-D5hzoJU;P9%+p{3#l*8{q84v&6x zQbE&%vDXZ?%9KXC(Jx6C%9_ziVOU}VL;GN+W*voy#nMA|C2#Y@h^}%Din3a6M#8mZErj_3j$|=mLd@_q zx_%YK8WN{@ z)V4j7?_)>k6O$5An5UTOTuYbx?QLU|O5NL`UMxu7GTIbBca7}QAQ9S2MyH~pcQ~!` zG8dH_@U-dBa9h@PWY9?GOm;Q(cr$TJTUsP>;T>Y&R?r83)*NdS!YmpV)yCb;5%Gl3 zfLh8a>!R$0qg7s!YB(<5&)cpOh{G3)+;IYkqkqy-tKOkZ(XnbrLgdlQ*nI|ddj9>4 z4X$_0_07#oR>vnE#u2)!CJDK5r(vt72w6Dc2l`Kj#&!$p(9!V*VYmT{ajQqQ=9eyx znrkBfh%5)#F!1KtuX9G-Y$H5r(sN4P$|dAATGI+PvSF*ds>$TjZ9(hd+dCK8Q7Y?l z9CsrwFXu!C^4oHq=P^OuLF`fSsae6&4a9S)yS#U9T33Ium;|bkl?Qekw92cpnt?_Y z3LJ9k+)Z4xBPS;C=dt;KzVr~jnyc(M#K2ue366p-E{?5?K%ikew923;l?rf3+|*4a z6MJ`a2RX4SvgME0L{g3_Rt)=|y0{Jle2A9uu30?RX=)m*rKR-WalaP&B$F{!fveXm zY{?S6^|#Q~g2s0*Fvj-m-5d!F%S6Ku$d?`8$OlhdP};a@r}B$nTD@4;RxG?c;q4x0 zu=i98t)~+%Bq^AB1Jmyms2hMGQ=&N1QcfUXDkY!gPxTs1lP@0lTclbh&v7(lxn*UI z#o9{6evIF$DrH=j95#ywXGwtrt=T$M#AJUgVak~MNmWHRZ6c}l^+ z{N-4?f|WKL=h)&ojE+Cv-XoS&R3t4{BuA1>k7F?=KrETyY9U5UF4xkAROa+;6qQ6p zjWbW`O;2w?zZbnd6O|Z>E6n7O@L%9G(l4o+qR!S!h7*#Fnp%^TCoW=~&UHw@$wJmA z4kigE6RF39(WVr^!e5JM*v0JrRs3fT`>>2jDxA&I_;6PuhNhx~y3zR(psShLQTL`x2Uo+$u;?|reu@!&}GW2x+bJQC9;NXG&mUDHYyW4SnfX@E=+9+)?8B2QhOqMW z*YgNp*?SsbOk+mVfeV!?SIKchXW^2S z(=`7^1Yg~ZH;-O;uZeDX=#T9_c69MRj+ErnSHzA&r_us{q!4#FKo{L=ky{@FIa_09 zRCSL-}MhmWU$G7;~C1=m-;1N87c| z13dwM^Ba%jLZF>LF5Kj<$EaFDvg7$XXa_HmgOU;_g(qvXp|F%K58IYHA3pL;GLB4F z?=83gDB7k*G{MY>;7Vk(AQAGRu^=-v3(>6ihRg$g_Ip>b5Rs-$)rs!1g{{a?Wj-_P zSz$%it`p@6RK%;4T{|4wV3DO^9-R_5<%F~N9<98M^8x6rFikp}qzmSmrVv&21O!&V z5dl7d+FdtCfad}Hbfz*5q}>S8y{U0Yh>I!#aXYMz%nS%DfLb2PT_)(>3H(t{I|x4M z)_X~4AVx`dn1brVfA2;A%(77-gSQzI%6?WP=|0t}*a`A%eBaZqmM5vAHV^xYWskI+ z@23aKKV;)TOwzy+zg0*a5EcX!d8wah#iF%Opx zl`o`#EpLj_sYQE&M074FNS*1HNPuxui19!67a?G z#5A$Sgl8#WtL)5E<~_Tko@(h&iuG1yfH2Ao(y_`(o{x%|cXAcdPg=7H;Wqz=gybnxKbTX+2czoF>`B`IXS<)paodWHK==6hb6fHF|UT(srh# zHJ&b(nJMI0onSb2DVG2NIb3||P48m&h>1rPrB?&{5Zc0ypGj~6XBPzqYSF;0@`U3l zAa8I;U91@mm$Z}y+wbDNN%QCyO)X(BmiM3(3-=~LEUKBhQnPf{tdvu4GYl@Un7j*x z43K3DKK!i=6EofU^RbO-lX+C?}Ylp>p$|!5U* z7i?h*br^rM4d>k3^DOu{$EeHC)sh!Bp|0J6n&<_TW%)8);5a>h3(Bgho_rMBO9*K% z3v;&TKw)1afFVwL0G$PKn4rb5r5eI=)@QHIvjIr`NsrI`9Q3lfc1Ws4>Tj7j+q!!& zPU*KvOkS0w%K+(>Td$q@|l zOSCW6BjCA>FtjDFbfY!mS-<&-<&*r28b6$RkQUr+>24IOF$l+=lUPN%ZgfM(aMTU0 zrOA|t2Z#)lDgF)FK%}}spFD0&s-<8SKzI0)*9ZKOKr76v4Y21V4{i*12OAtw?bEtl zfMuTYK*mSSrH&0A<mXj>x1Ax@P18&TY1U8GlX?&- zH5QQRBwVT_5AikhIR?eqwe>+&MN1~9S@1O5+1(uV&PUwkx1LA`V+>7NuXr8i)v*$w zFHV%Z(EQS)e%75x4qyJPB~K;Y^2|q4=7`wAMh(51nxwiPBzivJ&u5tE!`gY0IS8l2 z-1$`M&>Xs@m$OVSp*?@O{fO`f})4ssJjBbKDz#G@* zE%8^NO8tp?{yxALeOP~=H~Ay`uyu5k8fJ$Lz8JHQQk&^@GT|C#&EYfoc?1Z0VX~dl z&o(;eB8_s}!N!>tP30;h`vS(UQ%B$#7J1X`a1y3iI3 z&EY1zLmjl`uZWT|BOH43YI6H~1pvkWcsD6sOHU&B0#MIAEzo_Sz76}yGUjDo^a7l~ zdXk|m*H@Q%|9Z(ijygUKtB=7Qx&O8P+WiIf7}CXYRvuYLuw2C%hR456x1cN1h2T98 zc&qb4W-*nz5bXtSwO;J@RGhY=z)V^Nx(xdec*%ZbB}4EK>;%rmKgjU`7sn3nbY73qEd0UN4P3O&{b2V8AyFpp zw-?TGEaB9k46}4~w1baTAxIM$3JeHCAK;m~K3E#0RvzLy8|G!EX-ljHKcDt!tYX@q zo^sXq^}R1|s&(*OmW(rhFx7X}^vl8$?vxg@UIUvKGg3`C_`a01e${#EspQuD)Ye8i zy;3i@o_scho_@Ib%5_!`_|0HT7A?)t*CBxxoeRU!A;1>Nu0RKdwq-qC{%4;bSYW~p=~m^;>tLD8StocVz!u4uQzg~gzlm#UK1LwqVQN|jQuZPk04@r5BNUcaRzXz# zT*-IZ;62Ph%}9BJcv7*JV;!Qw$#=fsMlKo*K+K>y{hj8Z9{>Uci28(1OtbQjIs|yE zzY93f-(g&2lLUFi*RdAh;y4#o`6nN(>XmAx3~y#=z~lnFBg{P3aI2kRf)GFJz+Cf+ zZ)lL1>8!Hl>Pk?*TFpMc6F;#e#&RMPb5T?KG3>U367rS4!7#s0b4I85@ax!aNomUA zEa?jJVW>W&ZaLH7Spy4GE;Q|C_B1J==jp0n!S~SBfqB8ei?H8FaD!A{nCn1s3=&a% z3XPa*2(^O&zyChs<5Ec{<`>(>jLXv@d(J=OdINCmAhU%Lp^dWp8yD@K487V|}VG|=EK znHE};8q%jc_l;TtWxG^97z%km$n#e2oA+u~-M=c>6tvH!FSY)^pQ9iy|1T0Wg+%zMFswSM?MYe0SuNQp$klGCKw4~Ex;{K@b(!HR9*ar zDi`>9qg?|ZpS}sNd*c&v82wqgwzG?dY_YZa`Sg*^6`?(Hx{=1Xtz z%p~B}i@|EI#kHzklQ-te+8$4&Fyxgc(qngoGbiG%WQ%Gg&2D5fuO4TP#vQy}r-&Hj z`ZL6;zvtsn8XiA4&fy?Gx31SKv94D!*t#90wfK^L;VI@Pp=Mx5VxQaQv)ZLL4V2Gc z`v*1j8aY5m;tw&(#ycYFURuCA7#-Q@>8}N=r+kA#Z*p%7yoz=N8&FRIO&c!Z?*^O& zn4-ykHGGNpEEhjtOWj5N8>CN3+W@2~S-e19b@mZ<>}O3u@P4*99H1Qm7l5qYT_*&u z!stBUzfmc{9t|gCm$?rdZ3UM_uYKTLpU~UF&|)vVexc+BuP)WmI(YXjybt!;_PCax z&S9fzeZ1vz&U1Wx`Mw4SUomw#tb$b|Ot~ZXD=FUjy^!4m-q@#HO~^jYYP4lkAMFA+ zVrP0=GIQ_-+8c7?Ufm~EPu<tg-Q5=aat5_2divWy}G>$jc&p-^i0|tWKH0z;%&EPOV~IOuz9zIT!O;jtsE!3M6Jsud|ZqnEQ=4U;x@JCEXhLkU!M|JcA{5-9DEr`~l zVzWe!K6##};4ICIfj8UWB}#|lK_F`WF|xlSBoYI>*O-&9_N$dY6F83mb@L2P!V5hE zK#^20GykxAU>ihF<(t>CyP)crhG5ARY9-~&FG2cenj9r>JIPH0=3hGjYJK5x_W=oW zOu(n-V6#w^GoXs|+cjRXW;LzFUYm`P3gFMUfH)r{PN&2bk-T+-+tW=?Yn+2RYVQM* zuB{^;w9j_hb(NaoJ1>q);m(29UlprmPlQFbn*d+Jz!rH=5P-|UR?V#~A%t$UZ{1;5 zPw{O#v@f16hu{<53;mLzYs4Z^AE#VnUqPenPq_Me0wHSNf&s zzg@w;Zy-hn``)yj##>=&h0P?;M*pS2{<_rbA$?$h_oxB<^CMTTm|zYB_nt)_`sN~7 zq8;(~2CbDZo?UhCSrmi3tM-?K!#`H*eS3;%I&M79Yu1XC;a zaK+KkeO$G78`!^X3Y%8#*ZMEwn$hefu}YPZwws(sa&NjDbwb`UrB=DE;KYQHZJp$B@R+&u5$t6{InbDBHJ z#urdWP}lwu^$DAWHE@XXcigtslx8o&dj;E4J1b24u)1?1%l=ench8?%D?1u08jN0xtLPb#VoC-Nes{!?2C-kb7a!b@E<~aZMBHSF_9FSG*H; z-ihpZC&tSC7qe9FA_h@JROg?kq zERpXMqs;R}@iB0K>*fAjfQoZOu^KGA>bdt=dv_IQgg5iA#k7hu!VuK?pgJQY?(zSm z&k{>O9(Xk59PozFvp{wJ7dQi~IPa^EXL$s5kt#Etie!J`IqI_G{zX=MZkErjo>7jQ zoa-4_cQ&CfI#+Z4Rt;C3y;Z}toc~_zwyGZ5dde2ajO5%e|m{uZ5r z$h?N|J+6sh`N<%h8iplT$lyB$>(WoaXO1v|ZfzKHze@N0Pusu`!!|M3_9P(JCmVmp zTJPIIpZKId4E=YRZc%&xa^E!x#8W>@rzlJjvEDyQcVVqg z;Oo%N2I5n+=~feJ&%B}|*7``$OZoYe(9U$aAM5)`W3xC1pZg@wqzOvT64qzvU+|l> z@xWG4AI}@5Y{9QEPaV+xcuu*OjJgY;w@zanPgOd4A?7@;u?>bEewQ-sEzy7HV0*kr zrN%UHLC7_IoL&sQ_dVW$@396ppb-*&L~Jpx6LXbqQHvTWecO(@;a<1lJ?$?09DR6- zH4#2MYiITY)lqxe9jJ@41u$l?1G4lrGywKq4b0tJVB^Ff&!h6!;GX-T2lmq)sBffx z8%@J{#f-P81#E^7A%DykP4jqv@jY*aevo_chhVcG#(Y5ACgJTyn+8$cESHEp8-4LJ;7irwBUQi(_E(w2>)gCP$|ao5^EzaVLm>N zKCvt0obQe~)B^rjPmK5X)J5})L$>?y9;B)F$cDC@=hI-rM2TCaZNhiM9_fU6doSkM zHtSuLwwQWH#fNeqOW9Z+ag?3VgpjK0$5 z(~ZA14?abo_G7ow6t)no0^?!JpQ8QpEE_D7XW7~h^eh;}ICz+zS7+6;X|A@H zR`PbVGUVLj5o-@1nk}MB;H$u1tKJ*$Xm9$KWonbvIkr6C&cwWI;{SwY`+sMHz-?$N zKpmw(?khZ4g*(_{Re`)d z!mEJ1JHqOy+KxXe*Zoi0QJp*<;Z^*%?f8>=T?nt@PukZTVRc+x;Drd3J|%UvLX3Q~aG~vTXQYyVd(%%oqC)?3iWEeA)yy<$1y$F+~OXp001o2zxOm@FZ>@(-|; zH`VG@qOlgOXsUIvXsrmyFKCgKXiOIs@;i?xB28$uBv;kjRBHon4u%)#IWW`;(_uq2 zWA{@twRfSu2etOP5W;U-rVsMJjWCI?r%aSttq-I2#zN@D6?DHU*9hxmNBAdq(;$8~ zeCKYkNsm%%=*u+dns~hyd}s4}Gn*NT_tdusQ?Oo3J-SGIuWv(q1;!(tGEDnNB+5GE zxw-Y7Vze2;M$VyZp5xbe4(wg&13XGY_?NKHeunQ%fI2+7G{AF-XzbsB0`$VDfhA1_1#Cq6( z%-Aa)0CSLDhy1nRthGmV8uDCFQe9bFIc3?(#cBIgkqb)fe-rB=V~9Th<{-U}>Edg4 zP!xa?RwUE#l@E$pU=GqRB7ZG73sS%oqmwvi)5Sxe6yt42xEjob{E*DUcr$)VtT$?j zC%_B(OX78;hkzF_Pa4VZR*ekQQ5$vCL>;e+4Mqm)sf~JSqMlbpIr0yK3+A^ue_q!1 zGey~chQGT-JY?S_O6^0$2FUD4uSR+<(&fSLYW@!ie53P61i#z)YZ5`j{{-_Jpg+U^ zy|jN2?^huc^#IahST)}gRz`j=B&qmL=>LnrcSQde{Ksc^*N9Q_*Hr93R8QqSi2okr z#9w26cl2k77;vGA{AS1ofRexZPCB^fA@?NYn)|;GYhw*Ri!dIcFu#%e-(hR|*Idh* zA6$n6YxW4aMps^kuW22d2R%_B_JQ$WDA;c?A52v7H?f|-iS>MeD6~I@wXP}F_&2eh zKZ^DIQLN|9#5#L@in7U+Ot(DRwL=gsf?^o8<_!#eM{Ov~lj zgHaBDy*+&A8|W_e?VfqoA-^RUrk9BQ#;f$KK9_dL@AW{Y@d}NS$g>#v-Jm=-F`~sw zs4r82a&|kykaI158tH?u6F}fwLwObz{N6D1TtaGM@7B92xTaKwbiUi#DmV zl}6Ov)(v!|&*0O4W;-EXvOCZgd4^U8&#)hTA=@SQv_GbCYLEP|_>M27u7PjpU{`ex zelM3ogZ1H9_dkNK|05;oJ+NlL4zf+APJ9XcVGc=E89-)nVSFm za3?<_KGEN!2J#z7i5`yfZ$fVZxsIvtFj1dA81}~`)VWC6ev55!75m?E?;Q8;uHR10 zCDyl_TxocUecA;peSA+EWy7Orl1Z4-fKD z^q{d@ykLt``{#G+{qYQAsf|7n?INNuGQXRaA$u9f|KA!2Sq8#wU=hiG|FV8WONky0 zA2k}!8jZ2JEQU*;oV#gGz*k4#t;93Gj=T$O0@cvJqgjFf<${f_?`I@Xg1s+g z+isz3dqYYvF490ffjY?dFl-Ga=p8YKAEXq015HzBuIs6(tiu*dW576L3Y{{R&?)%- z4!cI%5O&tHw4-_!-d7So!;IW+5{QeR?cuaYA4)IC_Zjb4mVQWlZRF8BzK?Ryrm=b} z8mZS4TVc1i(<8-ktRY1_UL1oDvj!{$+gY}D7nldK!Fc#vEkPgsI8Cr$pa}byRLA}_ zar+n=k9RcFh{T$@8sXcd+q=R}+b>?1-+jw(gTvaJ@4hT6kG+{UcIj`P>!(!;|zP#_#ELmanv>t^R7&MCBO0J zSLg}*k0|57v#tRsk3KEtZz;d@kUoSk^5Wk_{!IBleDFEzXm4Ts^Js&;-~W4_|MPr=Uw-$V z`<`>pdCz;^_dPfFf|n}g{|?wsroe#i1bOJuo-)iJFySR1vbOZ zD}kop%JqIL--`Mm6~C2FK+pM#&bjry7lKu~_siJv$E4xBviaRNS|0>D!5few3Y zz<9s_3o+w&MCFz+b42dQS|rcOCFJfVO(yRK7_8_CV%&@G;bD29z^cF$eky`*? z^g8A$g8uZPtoJQI8P_2II_p7H=sAqOJQuYcwA1q=jz0sNqTk!BjM~jI)KP2#^ATAW z)q{ddfkgoH94P_dXClyR1Z$&bF|Yykb^@;gn7iI%QT;y+JWF=fi~B`{0p-wP@5KZ7 zYT%*hd-jU0O(whR-3I&vcmg;=?MD#udOsz-^(fx~?Tqp+l#hu5&-0Mmjb(MhOUO@3k!M{mH);;E2JtSoPeKe+-jC)VM|||i-N;!y z+(YtA{zvwA^_`(7{ziF&2R~H8kv0QB!>|?o_HS$Z+s$VnWW(s0pD)NU0<@=*3 zSM;BAh+(VP)51(PjXQ*XlrvuR$=!&_?cyVBqOJ$A`Y>W@vigqj0;!sLC6oM&bdasr zOkiu(Z?BPOYK@53_d=IR80%1W1M=TYp;vxWT+h}E*T|0`k9k*pFJ!;GPqI{6ECtZ!gJcg{|^@@^?p`Sw@-0(+v#xZfA59Vp*#Ze(rh_f_TC%Y1{JDpURx>t?5<%-3}Gh`5R! zK;E?sdB|nZ)$N#rM(i0hx;N#g#7pHb)IGz!Y^?B_{JMCH{G)24URKC&V@2Gd$eox= zPxM_OrF^*XSGfmJ-pfu`zB%p3VFK(x5WZm5{6^#nZ?d3pfqYoJPChJzSqOF%QvQZa zdlC7F(k}(bnX8rW(1gc(}yMvkIji@^`;D3+v;1`4IoT{EV=Ptr9oER&HSx+}o^zZ(tXQ zx8r;<_D1Kig($mTxSE|W+y%Uhz0~=*{tz1>?gX~VN5u!_qukrD!>?gCSK?Ye_O2Oh z4ff${#75>3=P-}368oW7;ah9vAH{m?anYW%fvuOWVe7@i@O7VIz3s+cdN=L`VE?ob zd&|YRH)5guSEWp87k)AzKE_r_kD-6ZvERHG`+~R8kNxa?jes_K*l=}x1IE}l&c3m# zUe3)3)C@3$Bi|qSD=i!f4s^#F-B#q>KOaRhq0++ zjE++sE5@meS9l-wa^+pp5AbVG$ae^Xb-q)ygwr$&9@))~M9Vh6=0M zD%}dUNIMjMYXqAvJjQHT!*^kCGgXt0wXq6oB?kVu3v2s+Hd*=}vFa}QCE<4Y1!b>= zeNz|qIa8!tQU1LABz(w0DN(*o49S;DugQzx-!GE(V$HmSwWiennQ2ttihWfd>rNmp zyovTh>?X{O7kj(K+FF*Q{TSnVl_6hYSQE-M_7i|Sh)a&{Zvc*?yhSchz5(QZKx8}X(?Y5ISM3W-&^(R3BF`R|K4-I}-MHS3e&w-y#0vG@>$`;n)+8k|r?@~q zg7Z6YuDp|RH|B2+_OVkH-=}r6X&MWw?u%n;|CMJbUM`tGOYP6CVhsGtBKSPq2W?DK zo ze&Gf-UIEtq2<6*I*y32>MmAQekbj21Z9#4`75dvE%CM1m)3cn!-iuIzCp@otEDE?Rlc1(inVkIjCRF? z><`i{xSq&rrKvcNusg(W*)`%vxX1nIznd))wy{R(DYjfnmS2Xizd+i?)Mq8?dkjyr zoB3vT1@}68lV8u2zqht%>e&)85k964abptveG1}GBG$}bum?<(d!>uzW8xIF@0E{n zA2FtB!nqT+orD;ryvL=*u^&7L^N1M6y(JHV4UZM3sqeT3`40J7&6$X`AIe{fi4xuoYj@GrMe(63@B&I^cJ>M{XSLs zZWQw)cC*K1+oBo8?t)LdS87q81??99z`}@eJH$6x zIs9ycv>EeW$hJx@%!vzrYdUhQo7i;eJ(T|mb6U)5#3!Kdh3oZ(O>SSSFUS`Fj z3pQt9E^!~51|OL&9b#mm`qzz;?e7M#%>ePg{j|JMK^1Ot~-(YwF)lzexXOcN4k;CLrybWdY0wGKQT=e zn}(eBEabSeL=pXP!`3AAIrLyr&t?jH*cHMZa-A3lz3-JT5hQt=IF~IDM>7vENB$vL zA|D6`nOC!fO%-hNqu8W);R8ajhjigHHjICQ{Skis1;{T%`5EF$lra796 zq3+u@oo{PojS-DihI-~~p4lQ!YBIsZ+Y_$OWhiz)+sP7?WAlF{ZA7K-q zyLL@8%2wcd0N1BL{wmBjps8b>s_ka5fMy0;Dm@ClZ^hW%h=&=fO=pW~vW)W-O%rQX z*NKDW;50&2Nw|<^${w{y8=SzVC75v|sQ^>;+*NY_*iRL3?agbuunK3T*!vA zlaG`$mB-F=+7{1`9%pvY@nq$AMEjz}+5S;0+S{`IW9BYdsQzxp@AkPk9y@n7j_YPE zU;KOJ9*z#Xh}G! z0<@TD5mjg-S{U|@0G&g0cGx=-v>@yq1)5JZk7zE@9HO(R!fdKAi|9DnNoOri{uOeadC3aLaXR4t~eVu@^2Xr(g?k(mljL`EV5k)9|foG=-r3n$cr zv_u*riAW?7fzEg$j)WlIRP%_BqjKM4u9ULLwg%eME&H5`94QKGAz& zR}<)6qIbfssi3!s{!WE&5gn$&Lqu;9y+QOkiM&QODfVj|%q^ z?IGGtw2NpbQJCmqs<(ss@@G1Gi0DBQd4Om;(VvL!C;B7RyN@btqr$C3_Y&PhbT`pm zL|cgNB)TK)m<_s}=(e!qEYPiC#~jctVaHt1&0)tp&`m@)5^W~Bf#`ao>xixmJ7$5d zp*F9kHaAh5R}pQbrZ-T9D~Z;V z8lu%i7Z9x?S{Zi0Cvz+44(C(T=MkMtcj%ev;a9j{{CKaARg{|SZHK3W{ zxQjtE!f}^^ribka!rZj5Jqgr8)Eu_!K~ssE!ghptE)=#SzH^O44MbDIc7%DZK5R!| z=Ozc7UhVr ztr-*y+gd1%a-$-;Q6W)5 z*rsSOpC~VEQxus?G=%z+LzGQj%Azg}CK^Ot$|TC5PNWm15v3BPP=#cY3{aQ+)CnKm zFNw%Yl8Hnfs_rIAAc`kR7m<@X=pc%te%k3qu|zhiXC<-_nTbp!Vx%)e*g6xW4_jM7 zF=6W&ARUpGNJAu%q)3ti74k$J5ev#-8FCSDFVF*=0FI;V7%Cpc@z20dz>mNWmf61V zfqz=g^8J@(j_*6*Ti^)Ljq-1RuW{`kIR6Ux68Hl69Oa(@pW^rv@W;SMkoyql9{}$I z?*Z=u?*MO`=llL{Uf_ERI1C&D-bC3O;MalIfLC#T5c~@8GH?L+8}JhFBJcw6ylJ8D zuckKNbEd(*XTe>jY~M2|dm6`2nHKqi@{^`>d{3Cp_C0P|;QI@%>^J569s?c)9x*QS z?K8If_8L2UdyLC{yMbN6PMn9q4?|`L@Mqv5;6dO4U_0<9;C{mz-yaPtefJqw__l$! z8ZPkNYgp~O2jzDIcL7^~JApfZ+kxAFTY*~)Ilh~LoAmejZq#q}Z3f=}Tn}6aT&rK; zyGDPJ?`r+6zD@eueOKx4^le1>2H;X5&3B1V>bsaL^<5NN7rJo!y3pFt>d>0)t3!s> zoME+Rb?xd^tGBOyXLT@EqrV`uGPG*@%Fv3?d7<;SpBH+Rzk%fv)L(g{} zk$HA_p7aQ@7PrsM53(e1qb4PAOA^*5Y)TL;@vp@5!T3ShH5S(^t`A(_xHE2i; zb6TB#r{GYA>73A5qjFU>asE(s*gj`UdX2@wSsXqGKl)n-cNr5nKgTi73KDdX*~K}0 zHNt*Q*;-1Blqucd*d3>CF#w+*K_P zbNr~r9dWhw)9C!tjT;|!awC~{WbF=bLvvWzvc)^HrFO?U z$d;_uj?Rv(=3u3c**>&=XA>MxSYNU777J&w$QC|m!Eh{QpP5&F$z~yF&M&F4n0zK) z`6ZhKXV8QaWyBfA$&ED@gU`T+stl71e9%xeswQa2$*Vbambcqh8)qC&1H}n1X4uB7Ex$ku!>bCYC>W(cd%gxP)KQZ@JfOHVz z@l|eAh|1^Xw{W(AO+}oU*J?GIl;k0NNl9^WVPQcfKeT8FpOS0_(uWpR@+Fl*VL=kF zijt&S3Sp&Gc)Mr1FsWC=ukwvvJTaB`dCYM}iStW7m#$*c5W6KXG&3`p>(lBryrk3U z1`VrDu5KOXj_ek+2Cd%jbh^!ws5RdBo=u`A5$?>VF zdd``elAhKbG~iV5>P?(e%w$H+DHx5h-YKymDU_KNUsY8VTb9etXq}nmDvNcM6}l&M z7uX89+^&MMgxtcyLhI^3bamOdLMtdgkIV7|1OM}8^YdCf!9>(IrggUsXy9bkzOiLd z3sgA^RWa>pPGwey@EJltFbkO9^x_hZrq`uS;R0f+AlNgLoqn5+%j^B@e#zuY^CYF3 zH3t4}t<|0B4Gc=q^P9NH-Q1HEPLEj>w8j{2c;tD#Nhe5Vk5ddA%sN5PSqvL{SHa2~ z852FQ_av6ZirI_5*8L+an=jd^*E`rgzBFj{<)=9vQhK-3=XT`f+0v9e(OsX9D_J7DsH9Dt~PhQO|8|2 zS|^o>pJ>&rGGzfNt075n#F@pEKyrGC9m^pAHENZ$lOia~NGM8=9*Len#nh6)K)BrQt}?}q?Ed$%iWc{%VnvGF zuC}6vOjWWClBZ}-6<0M!P6QrCbi^g`ih>FYoY15$>RUv`9>o=Am&u$SoLkqpeo13V zVrJdqnu*Kmi){wIAWFIz$EaB=s^{I?QI$Ed^VX-Ak6Sw}Q(W(;Oijy5t6I3>=G$r} zuWrgt$x5+W;U(NIdt63JLdAIxcbxIU<9}Q`E>MsG7uyW$d=}Oj&obC`r?XAQmjq)H z{64G2YKc*IGWL2uc4|9=F#|2C&kUimo&Q=;QP(br*cF*wZT9*YRjMuKSEd#mIxZr*ocIs*yg|<|c8r8@etYv1d^870Y(L5MFujn&wisP(EVg z#>-bNs2i-cdg2rlsyhF{)#EQ{DeSQgpL^N$x59R&$j5~v&_o71bQ=F?j&V43_zCz; zCg#UHOTpMcs?(pz99GAZ4k1l&I6OM+XLkov>pkSXFycP{Rfbj54S!gcYkjV;Ky`=E z)FUkBf6|Vk!G|4cAM|ZXWmHL3>$ItL2Dm?U!J=HFPbVYVID;cOAt4Z};lI=7x%koM81WlTT!Pzaij1{cbPkt0&eZ#v&Zw0n zgfQ`;44<8}DgG1jCik?_#+hO?CF3XFm1@wZvD`GhYw(oR6s(@0H)x1Y%S{%&E#pND+s-RF&D;Gad!#n@qnpJHTO&HZSTx|o}_}Ag4E32zYi8g&YKB;Yr zHCiFie{_^LI0Ei?zg;7=_wH=x_0HsYw;u{W${C%3g!n+L#LegH7H|fqDkkv>T2i-` zuj+lO?^t}d@2K|}GMeZy%>{QHbKzhMPBRx42Q%m$2BsG!>y)T2FaWIQ!U8p*{Q8<2 zHwKmu&;TwE9Cvh#*lZY1j>_Z=#4E!+IgXQkkJ`>!^tXs@JxzbpMY|LmnOV6 zoHE&vBzLamIH$6#D7D~zHQCV&LtN`{_I|-N#AtQ)6i;G`!yrcPSf{E+U17?EC&y#L zHCzW@tg|PiDk{^8-6lGO`j) z7yR`w)_t0>jm!?jnT8Cp=P#Tm74IxV#+BlEWEq>Rw4B6tOT0}IPcG2;CvGsCEJo}|Zt5?)FD}U* zV{&IE_OuB1c``ia7`xY@d;r!icT2HSfVtrRPh)vcK&A{SM=IaIjLgergzXK3RNK;? z%&m}usp-Tcza^lCLA!S!mw_yzL91SG)BYmm>Wg~=(kgAyDVdij#U_qiwB_Ba+8^i` zmNa_FU2knzw!LH6K7Y;fDGP4zsLiqa#&$H!zpcG)h+UX5;qk6VHZ_+m+qS6bxo7um zY#82g|H_)q#@q=P+`eUV$(W8QIkhWqy>l~kpm?!N*ryLVc=We2E2H0@sf)?LPns^5am*1}CkLU^la>0bu;;H5SJr%+D zVS&5n-7{wP_(H!$cz@{fC1=%TMRF8VQg*)L_RM6h&R8(+%(}`JIK19t{-T=N2`s9| zbm%dkRkE*st;ansr_Ly4V(-)#G!9P+9E5Z=r)S39jZc9whm~`Hxp(A653X{+!`U9X)qO^02|qNL}8fIq<}y+%4RU)jpn!{q_9pXEwf&Rk32eENF69;fJN! ziZiQy;~wLbM?k3@3!1Z;)~e-=f;L;5oo`hB4piNM4QS@hpzjx(EhR&dud)Lgh{X~o%% z!`y;KYcR!F^Tx~`S+lq{Grh9DVRB_gW&7Q8@}|}l#OlNckdr6ajc%_yt!i>s_Q>MA zg0k9K!O#s$MmT%{cY?<0PH>p~Y5t5+(+YD&6%SD^kC?Q6LAllCiM1=S^&YIb4y?Ik zw(K;qHHPVQ@o_PBU7Wg4@tt%wyGvqRj^HJ`enYPW|hCpAvI(y{RQHR_ywEyFJ8WVzCYm(Wp4n5U~h1{ z%~H9ju6FHNqira4C^6oy;kd&q_pPj~TK(uM!P%#oo^P5jY0e(fa&hCyGG+Fkl8;L| z^;zMSr_oU&b0xc+PQ61PZ}3h*>f%Z^IO27uY!IrHm8oV$1(a>uep6D_%dan=x}zA7 z_hbm^>O$#DatfSIjg~)Cc{G>g9~^Js_6nRW#g~*4r{!^BHEWDXeb42@ zNA2-OQP7$7C!Q2X^gXvzVog0f*+;^QES(K!Pt(}f^6O4ML5lI}lJ;?b-i6RN92@S3 z_A*O4XBX1*_wh+Vmz~87&+w*eguuAL$K2zKj|R;Xgu1>sToui!yWfDXd9NF~u`0et z(T?+XR8;kpa8l4c_*k2Jyt(*jn=0GaQDqgK%(?rXYLn{7Y44sC!byEa^%*Yv!SJBZGl}(&y4d}Meg<7Mb*VqN9Fr0248Vj$&xe2 z$0pd!qSg@eCx2aVaOsTY6{S~QzhTL!u~pNp*cKSI-;5qz*toELadyh+vXqLpYn!3z z3TXPEw2bAjk?gHsYdRQfuz8bw{*;o^vc$5)*fLuzQ*@j-#HKGRO%}C<$1=tz#@Y;` z*;Qk%D?b|4PUu^0s=;)tx_+ZOS202ab#oW}i{(^}yMKQxl&F(@M&Yrxfi<+{N83>4 zr1GQYnnn62-=ChL{>>o0?=iC$zD=thiqTXQQ{i+fd6aO_nLmEvl~bp!D~RPYG6yG$ zoSu(S)^Jj+$W4~a7K_F@dgkKN@}}~%INgJKZ^@A2rDxXK0=aF~MUB-30ULiw`8C&F zxo|{vu-Rs|TBK4PT%d?wk;U%PlKj||+N#0+q19u@WP57L2URY*ZtAwtBl9NDU)GM5 zUx!&~5?)|K*(0a1{=`IPQzpTiS@d(JPvRu~Pr2j$KV`B6YXYwq65@^r)1vz8eM5be z(p`lEQ2*o9VB&vTRaL)BD*Cxi%GLkWmODPd|5IB+THNurv{Mw{r6QU+oqV|JJo#)@ zlM)RjN|bHVn(an&Qhx2Q;92AHl1$TDM$8;B*s6;Wv6(HOG$a46I~@fR+c(e396w^H zS1U}6O%FJ|sYydaZHwop&p*dM$Zs(l11U)fsb2fNcUN3<-TH+=lQZCsjrx)QX5ZVR z+qlj<@14QSU@(K%;0=(#03i4PNCMysf=G%(QKSfv6e*Fk-m)l?k|;rhMCxI!9Mx^} z*c@-|#*d`QCZ`WOZM{v}M3No(NKKQN@ouxVUHiD+zv4XPIL$+w*o_;>G0FXA@E|}! zHkG8^?pcuM2VC5__s*T~`|kI;cT{oe1gZzer-UAnG~R|TA6#U8F`1xFi?5!n>4QpE zjc8ruc13dIY8@bpm6B$aDcRhlNVH5)$GW>__DzbKS43{7Dw4X5C6!3F+ZsKh%DFDK ze0C?NNURw>(m+-PElvYPh>9L*-`O6pFxJSxu?KgB1~;`>4r7g3bl5!*k}kal>ZEmi zOH?#$P82GWzw{1t)p=Ta6G_j;Km5dl$2Xh2jSjrTXk|O4Wfl+h_D6RdJ2l%lairte zBRgfP4}tW44zzb8>OfyzOZ8`hO)*-9*sFw2V*N(mO`6UA@Kr)9S&*OpYAhCX8;yL^ z%fTf79mzdZ;2_G8e)y)WP81g%^tMgWBBpipQmAf^(O*qvn+BU+P6d;0{yQmmvE~S6 zyX1w~Pt!#LOfZFdTz37d73HDqw0utb&#yjqjG-pe(&2#!%d#r9R?T;gO*QTQ=}1-+YGQ^!nJla|+1R61GSX5wo{?;q=a z{E?3y-W1%tJ=WaSFgU%z+0X&r!E)!)qhyr24~?UR5;{U~8$H+X55RsJ@ed?_qN86* zv`Y!AH6gXDP>{c|ZL7QEM!Tm<=sG_9*HQ!q2+m?h)yB3I-6^cTzA!)!?mE)evR-UWzJaupCRHP)>;{ z#+WL}(YChrI!Bd;t+SsxIQsEAJ%=fVGq8MB$L{X7o!xaBqmMK6?VF7c9PO&esJS%` z(>*;+9=+b%TCM1~#*zDmYrQs&Nl#m?b`xiDTCMe4!h7%Y1_runns%P+-3Uhf#O6X5 zs%bQJD%}w3Z+3U49^EPX>0Qh3l3xNJsvA91g1`PoM^!h6G=9#`b+@P}(`_l9^gA@D zs*!fr^|=SB!IgZsoV<`(7?zXdnY4%GTz5Z(QLaq$xaoFkP5T1FQs^HAR&p7+0~bs# z@LS_7LG(;Bu-G&f*>o5woQ8PC74o#E?;S9X$k|N01FDIf$K)~QJ*F-D((TfoxKqtI z)ST=MacZL8*=?_k_|2P6JT|^`Dpy_LF3mXGS|f_P6zJa5QnkeoYYHfie@2Co3Du$h zx|Zfw>O5vQ_^F2^PUCUA&7L|{l|z3OZ+(W6suGT@Nq&9krcojGYp>okW_BaK@&Ro# zS@vurN^bR)RJK_GX`L^Ij9JGsOT_H4mDQUuKcb8kL3d@fKv1;cf>OXlEd6qYgqN|B z8Gq9Wj6Sx4Yk(HyPF4>K8BF^E`hUwV`v6w0)tD-EJV|(vS3!!Bny?meKVZo?$e+N$+i` zso?$&q}FSQF9SXcTOIk%_ft)ML`@L82c~;AiB*SGiDSiv6 zYeC0KP}g8VoTNb-3#XzCeOdLVtYBwWRdQ=DX7)%6>I-O+S){R55C3Lq9p+f8n=&(| zehAimFZyAL8OOIYG&II-R-bp9Z!g*l)4(QDv%$xWCXKbXr9^T=BUm3~ZQy)+w{3~* znl~ky2P^WLJ*(Q4eRVJi5RS=-93j2{U(e@KI^Me-OQDDldL?Rar{1Sqq3~p^Me$a; zY%HpaY(=T6EK#$z!?t2Vs3SNpM_@vtolVCNCS?PnR2pcUW~io)=3|-497mqUtf|s$ zap_gqr|;c&BHnRN%t@O2_N6xT?Ac&1vMiM?PHC|7_@nnM&8}3sH##~K#g*hoKqN`o zynn$rCmf&)A)ai6pt8^sNV>7AO1uVCvwq(Gi zQ#tj~YPA?jh=Xjgv6fdnuoGCA=cDz5du3wqHp}f)iH2)zdv>L-pE=~0)XXUm_?%s5 zsFu#vR=tS+TMnG+l&Ma<26S3{afQg9jn>YA_a$;&kDPtl29e^+Kv#Kx^8U4ymG|a6 z5{v8xJ7FU2RkCx;@s;nGl65x*80}cW8^==^9NBEda+b&;B9T=wXND# zyVhpUB;G!*s}B7aHzkfq66Ia&-e8`hySvMH>Q4CAdvNmLwZxTNNiuIMUdDlS+E`syfLg=KB zwH^MEU*96RdS9v)sR$)eB&B&tN{Y8@QP2=1crqA%U2>JqIU0r4dy7)lZ!%UUK9WbE zdS3!>RP$0wN(RN-sh}(TddgKIk7>-Gek2Mu4^?^3sn{`v;7OI;Ka_d#6PnYryf@O* zSihyw-a4{>xHWd5VUea+!x!?85?eKv<&YXZf&{uBipODcGPnmnbLSg ztI2M5gktX6)?i)xXjk9)ol%|D#jB0H+A1d+TppLJp~D+&4F%()(&kg6jl5vxG%}A) zE&q)8rs|8R7d=-(s_WY7L$T0iHQUX0$JkIP60^l@D6+Xf*4?45zrlvQZT(lIuOT00Emo^hv!t=K7@NbahUN5HkK4{LI*ztC54G`?qNu~~ zYE8O;Xnl?0S(S?Anb)i`2Tp=*`#yOcb)dg2!2ushO0ou~aPK zPSoF$3`5jP-Z*;%ths3+b8=25wrw4KGQ?ih&`^IXrL-){F|Rr;m`}yD73_M_`4mjP zt{!WIN{iX0rwFg1cYiv*Wq;hkGU;4^K;c=M=9JvP!2w}d-UZE6JAea9An=rLK&lON z?{4+>`iYjDx>tul9}9^Zu@%2mr$y&pWWCxEI^bgq=Y;Kd)iBv@;&5gvq) zh<_ze>)4CGbph=KL7%24WO~bbpg~G1BoQYiXwS}rUf65SyN`4o#I=|vg77)Fx z^pQ`{s=)qJ9~)r=hiLUwTUh)NjMak2=@gALPEqZL#s+Fg4#FzC+sKfghXCcocfS2k zlN`?wDz#2Sj&nvvEANytT6WRN)4TuT(!yCKRH9g!5)VV<@eQEF0Q#F!lxV>J?TXuH z5+c{|d*HXWgCU;kpN zW@a&q*_`UCQ(b+k&ZhhA?|UAaWtkn_ywt?D6k&ui8Sg;yiihmhWq_uxK;*o=k!P}g zG17E;M1(f1FB97Go(m6Iey=wjU-cZE9l=j@tIR_DhYdDLjLxCMpydE^LBPs__#PFp zj$B}~I&C3n4Bt{8U?yd6uCP0;T^h88-@mAn89+kkJwq zoLTe#*-vlDQoeJJCe{B5f{30G#$nh_asJ1UTDk-6DuP?+gcWVR&z|WXFH<|@gdNAU zqM7G2TSPu?zF128F^4?eSn$m5%|b!rjQHu@vE z8h!!_acgV zlcEv2e|I2dAuuK7t4Ijlu(N&(H*-=atlGn*8}B$j3WQC;w)}+0w7x?0z3n&z81{y> z@=3ttka5aK+uosN7L6}%QRVE}q<4W{4FumeiUidIt8(2MP)5es?ah9QuR5oTgQn>L z@8>~hURR_#u}obtYcsB70w>9|x2D9#ezqyjQOEXIe}79hwUrV0TtN&90VZJ2@y4ok z`MVuC_Pm6-A7#z;YgDpnQVguEQ4D}EWIjp>lP(0Nf1v0H^%I^Eubz;ZPMQ)|dyVF` zQY><5s~pK`+g@b}Rm~P?0Y^My7EWQ3RD3?+w29o@R0#lLmf{MxSI6=rZ5mgkHqxzr zVVQ!Kr5C#LNvnwYwUcuCH?xEJ_7m-#ER76Z2~qi`rQ*fZ%S20fnQV`2n13HfH*0Gzn97J5a5sOk)F&3@1o)hov>t>r%}y zsJdVMSG0vpw1}~iyn_=X7-{PL8VJT@)coYx{Zl@q! zQs2Dk2aPI?hu}NC91WRUP)rykoOu|-iPvT$rHfL{+OSek;~U^REL_4XiwXfL-%peGV1bj6vKXcd1!LyU!@7 zH)0UgzY0f!5W+E)x{g|4bkIZ*?*S_d0S+1%Hjen(qI$;hH%iV9GVLB1E zPs}%En)#Pxxq>JbSB(*011Ex9F06g1W_&USW4p^iD6BRbc={b^c|yK8RS@9(O#^4< z@U*^4&x@l&4dtGKaSbK7Re^qBa|oB4+_$a#iY`X?ml}s>wFnnu(rJl0Pj!Ct9Iq1^ z<;SqUh;e5)ollv@w~2iy7rKymkodCjTqQ79%VrS)KVt73o3HVFL9sxk3f0CkoP;RS z37@#}`vi;bLw5oZEE5%-yYJHNKmr(}Nn!)ZwrK^L*qA9=qOuzO&tkHZWqaJz3;<}(MM0#xlL82s2YL|V+bGBk7||w*dcdkb6_AQdrM{AF`f6} zy1WF)>_#*FlBPQQIZYpk_L}^hu0O9K>u$~(uQeRjiWZ6mwl+1C#}y&RHCGqhNT25u zS@8>yTAtZ^ynd2ra~l!RP0Cjyhr;{%l<1e0>c6nIV2o<5Q$G0>*xpW3gKby&*UuNM z;lIK8rz4{hALDf}E32$39C*c@r{Mk-QM zFj_z?q|l+#kzK3-MI4FgKa^7G;zTsG3JG#H>c;Xs4R*T7uL!QfxL9;b}o>C`2Ef|RRoR$bBS)16Hpq=4BzXWw&F zmWKr9BrGarP$H;waC~imf${SeT04}sH=G`wMlIMMPZS>S;P4^ee%}zmJkB*+h?d(M zU3>%rDE~ShdiqR4ONas}E3Jv{ht6O((>hpnn<6ju#JN0T!nOp?#e+smPj5*$bz9xJ zg1Bzt#R9XgFdnI5#IxW*Xe(>IyF6w%pN`jT2RGizCYnkPjqM1C=u*Nsv^^ZQ{&Dm| zn+O^G@?iBS6}u-LTtWMT#5#y^LoYf(%~n14HSSJ5{n^%KP8Px7y)*u@``;_~+iXuPD#jUyfrrEGH(@{dz4ojVz6<(*+d$1g? zroZGpL_kz3mJC$tdFU1)#Af=bx!F7wkBfzu;(ecekiGIibDNszB!=p@FL!k@pg7yg zY(`TW3y6z+c(U3NJl|AR2pN!@lAkzAuE53V8ZRWIPY_Jf2y&_u3&~P9UARMyH~6i7 zgcOM#p&o_Dgm)wPoo*LP))&3s?z z>mtFwvL-|hA3zoGF83^6wWCx;sxalYmnHYus=JLd-7UG;aQD$!O!Z)D69gaEqyB2fXTV zlLd7ID{~kMq6|>~K3{D6`Al;GLnHWyN?%u>x45542sZbgw>r8ZKCE3sh1L+tNpyte z4J;QHDX?BIv(VdR*-JHMTI+DPmzF}0`g{f1`5S!L1EZSmYsA;UWLTb`KX9C;Ac_?j zi);(s`o1RaHBa8Aia%!_!zI7p-~K~l=P&Yk1s2^4P|W^!%YIqQ(biXRn}H9zc$xi{ zUNAXBB>g0z*dNdzWba5m_`b-#M1rv&ymTMm6iIS|0D4j)SeHU#9KHT93vjw&d3Fns zx<{gKG+#4u#Y8P|qjQNYu%h!EoKe$-5_(fCopFi2UQFhi9Q~BZ(@K<}o+bQq%FYuw zop&=a@h7xDzJU4q02TL1F+5%YE7}WtqouRcD^M=MOqHP!oJHMk?8q!eViQWNo_c{;gX)0Z4!fIDp~qB8Oe0AnxYS@PI2C=P4i^# z-)nLAy9!NQ6+eI+UID^t5(B1`vs6Z`EyU-^Lt_C^83 z9F-YmL`PO+3>Mg&!`va}C{ARPsJt5)X(;$~KS%sRk!}+N8Og-7urFF>)1sht{=wHw zic&n8#U}%nIK`)TOy+)R3;KR<>Men5+yqkpv}Wl?7c8s&3UfoBo2NrOmESJ^A)L3*_f+l8}&iB&d`;6vWCxzFaY|re#ZYP;3JPVE@MfsrT0+|i8 z%4(Ki9yXaCt>Ef&nGegNA@<5LQG}$DL0s?+?)+B)$cO2s6nDB+M0^^Ut zv)>-qKNqOxCC!K4*;H<>y@z9_CnL-H9Z*UR2dCIVmDv(7X<0laEfPX9B5sb^oD$~q z`8J#|o#uDaR?3dKuWn~89cWmnP^RU60j3pNB5&sBcW%Q)=T%hZRgCFW=zqxr6sD&# z6G;@>Miy?5!_yYL3Ytso|4?$Houo-k5vFHYN@a%h@9C+U`HVSbqA396<>YfxQ+XMS zQOysMsKN1Vw`mEEcfX$p$HG_Aj-Q5osl{_?D*`@3RfS2`?V(E9{X{CT0w>ofm_N5m zrw`UEU)Th*s?uJ$te$*@O=+iF!UxFf^TGb1B7UJ55+tHh^X6v|8Ij*6fX=o0M?nrV7lPN{PWta3=!Rd|&_zrB2dNR;|5j@B zlZB0y`9Gyb?A$Cr|BKWJ)=*UqI0C3hfPq5dK%^ceL4JJz^pDYMVJ!(2D6T;YDeo7(zOgd~M_Q}W9mfnFIX=qdrEwQ| zJ##p>9B)!MSjxIGqD5_U>F=QTS693uRY}iaIjbn;oR;ou`}%Hj5ospri_n_7Y-ed> zj@n;LXmwD?t>=ECi~jkDPX+zU;`i4d%3fgYL*Mb9ZV88R3#tv7 z8w&x3+%*fbq4$l`XUM8z*dt+WQPkOi z(vhad7~ll+ea(Pxg*Z*>GufLpm*JS_wcqm3>BFQ6MWO0>s>)qI-z!U4EVOk&#Sd<|!z3_W!}>a9V}U z&?wPJ(L&rZZIYke#-AOKqjMB4v}PktWH0VnADct+uj-0&$4(TP=T5`3s*7G{q#B%p z7J3>WdOy*=Ot15q2!E4$X@*;4oI8i#^C*)zXL@BW{rirt8fq}dqQv(1d?hc%D%ONh zoUqz-y1;D1C#Lc5xs!G>Y{_=5!qx}E>NcfS`i8xjte5BrBw)n!k@h*cyMS%y12m61 zLoGOK`3MlX=J!gG75y%_+hcGX3eeuYG@ zMBCu-T9khIB3-)TW9QAEdEJ4pCb??OZzbAm%W}w;fp?KfCm*{*DUFATUi(A~QhN0> z%4~^PtAXw#ohQGC_?{0w7`&6gw;uZvr;kd9l$AL%piIW*4(L`(>s{XEG z@0UjIZK9z_#EEQwg#N0VNqA^meI)vLzuaCdHb_3$>2*-H*e^A!DH{ir?BB^7pGYoM zVB(<@AFv|J1t2s{UH-;y_m&P8;2%rK+K73}CWng%fC?7i5=-OQeOwPFPwz0B#2U=R z#b6tXNy7*$6YKC)0spn#z$0$4_iZ2P62(h89CA`?FX=t!{hkdQY0fY0cG8PU5{q>a zMU^nWAy71vwLOu^*2Y@EO!Q#p+=f z2(K7wa5|5{7D4ssc+-h@Tz7Q^Eh1q_&XkjO;1u4uuF^W$IN4QoPM_2RLYE&3w#}z< zqr!^5dTu1AEMH)yqfdD}X}M~;FMQEv`nd{~qq}2$Dh;@7x*~1JH1fxx5ujjM-L2*m zrRh9e7)$?0PRoK>06-JGriLkp-=1d6v!NmDW)jGrsJD?s_%^VslX=+mW=9vZ@r!oM z7QxGkEVOech@G&HEHW!j=vqX9k4sG=@0H8k5fijy?Ap;>>V3t8{(*LJZz&x-v`gKf zqpEx?tt2$ZK&dHTmT*QR?BHQw*s;g^|04S0cYsTbG)t`NOAQ=iB|>!KJGu(Qi3OBA{G zi-GQf>o8{osoT5iuDTN;R1N$`bd-Cm_QLO*-mz*TaqO|mE^W!`vPNI`s|T4|G@=&~ zTAN7!nD6*zFKohvNjSkXwOCl$w`hcar^eqTH@Q@a_S%}on6KxS+AXwPsk?%{x(C%@ z(W)npN!XwTzmt+iVGJq^mtP1PN|Up}-SwL3Pj%@No~&b34UO#;xNDKU%O^3eDDEAoG}5 zn2B__vqth=Sh$**&Z1a5IP5nkCXUxf^^fs$qXPWkld`urH|z2%2Rc6sIW8;k6=VJ- zqOK$Khl5^Yl}8yZ@Sjh#O3Mb7?zX$n8Ape{)KR5wGOZa@9Y6Z1ssp&m=yUJYp#rT$g2cuVF1lU5mTPD0|0et0q5~xC`po)vpJ~__yIE z4e*rJ&p`4AqwE)H4qZgxn;&l)X+3Q|zSWf=?946>`zh%gxDg!rP&kn8n6d<;nLlC2 zGVM6dz%iA$d`H1G@UuJp9YzD`wLMCvd*FwgMvm+%Nr@lZEDRZO8@YYOzYzO0SzY-_@Mbr1X%Ndp^o&F%4mV zJ-2Nga*C~u*>0&s8ro7iQ-}qW0GK~om-g@x<4UehobJ39spiD&h&bANdm^2mw*EakgjqO-d~9_5a>jq zyJu}zn~)Kcfap8pB-aUC?A>be|24a&vEpV z5)5j(+l!pW}`qQ{(d*R=JLJ8zVN24pCF$Nc@YsTX1SqRAOQ1f#HRbn6 zMeEWoP+@tq4xLuf@L-*LpHPOIXaMrVtcNu1yr+*g%0xUfBo;%u1L%5*o_7-mEhf-i zxxY&-F<5@(@$*sE&vTEzK)(ix1RHX>s27xpL^mUB>!Wg!+`~dRUh#I=9gA&#?ejM1c9r9VSB0BcghKySk?-d48*#H1R=D@bu*OC ztXdS)#lD*L`VtHUFdq+}=p0>G7b6a(Cw+dgo@5ueWOPFFm-qMRpchQj;F&7ywBEDd z1&4}l>Ow33^o0Q{)xo4u^;7MfVHpKIU(1D1kmvN+FSQj@lvSKiIgn9Hik~}#0WCp) zB;l0p1aSJh(F!{yUi%i<&rpTkeZ6TXEhxuwi>na)idI}z z2@%7z6ObR&B+7eBb6o6E*0@88R-P~8UC%zzKPh{SPOpd+!qLlB`t;A2uiFwS8}!`} z9t9kSd7@@khSucwKx(V$4R`gJ?sByTa@2&SkO~A>Xx1{cMU}5v(|X&!#UZT z_?=^|H%mO@y*eOrPnwEGu7fO-X!Qt&rth;N%YmV?cE4PLEHW&M`#?#wS{lfKHiKI! zF!aZU^mU3O{Y}v4;le+DLtU#hDgY~~x{P~5eEDO?=c{J{*(lm}t!4QsZCG%(T>o3< zKF&ODQzBJAgDQOxuZWuEzg1wJMrE2!V6L3nvxk+*8rpjkU&+dSfbUnpRCCu>4@q;M zq7iJT$W-Q&{!8|!=(<%ccK))n>O9Y%4|eUQ$d|c;>Llh+#R+9k+WG(dmYB_Yk_DHmWmqS+;T-e z{-w*#OOEXpfR?fXpEVve^pohbnjuBWZXvT7o`;~+Km}pgsm&1SEPlVR0@6}|)FrnG ztr5**pXNH`eMVo>z&^~KEM^XpXFGNe_%a9O&2DP-#xjj5wKy_wGxlR<+$~O7nCDre z)gkkZi`iSu|B_HBfXJ=yb+F5k;=cr5t2o-dIs#8%Km=)WWt_7IR*Nqm;TOdlcMq)*Mo$ zW!j1c*2h1y3gs(C@Z=mPMAf3jjcCV{5!DmDdL=C~^a*1<@i&tKyybHc?`p6vjCgX z^c*oAk$ijh&ZXE-tBssoB+sE57H*Y~f5(kp><)gbR~^JF)lfzpwDH`KM}6lU=-C~0CC9PNrSR-QOtf^j|clQ zKJWc~(OV^Nd@#nhNO!9a$x^k-+HKPUE8H~+?yONBRrne%gdXF%rOsv-X&L@3kc`7Q zcluH}Gptm`8NfPY7cHK1Awr;v%D~<{dmbl`>3EzUO(n&v(5j4GaUtQ;VVSU-Z}80z zmQaJ9LhUrP&9X-iWJ|7Kk+#FWR>fj*QXCCRTK-D zGrIV-aILy63CJ>&q!Oi3R^R}~vtzp8&HJG| zS{Hf2X_^O`yuU%4xbg2p4xEYb_YVtesH!+=2;T17Eg-!)hIv5Uuf~Qw@P8)LBbEk6 z(diLSo}aCGwCuP5tUZ8-xAmSbJ zTrRLoQ8HR!SHgZrW7FESK>WVxc2Q0&*7KB6tLB*4#g6;?jmwgyhMK}QUt5A`VMWT7 z{-C|gIicOpPBk*_kTpWZJU7R{x-+)wUR&qH?#I^(p>$_S|D-Lx0|GOKJJ#;6)TJrM z0mv=Ub61&miAp-VqPL-rCr0bP(yCP~60A;;+Woy|FpyFJ?&~AHVsT$3{(xY{hBY)P z?sJn5*l zk1DNWXA9*jjicy02|Lx7pZgZvom=MI(J-m0&O7}nozdd$Yu+pJ8S%bAc(dY?AH<*B zggr$dIMg~?(Doa0(#6PIGjbAR`JEM+#GziLR{1sQT|~wX$50K zHV$(mF!Q${JFPVR5hs5evZ?0qS+F8sTo?H3?VVV?C2n zu3WU|G;kk`TTRFh@h6-%=n-1~JOi3ECA|e@v|k&zrVP$hev=e%BhPpi+o`htj%;`6 zNCg&s6~7VQWsIW!LLMBFhE*nMGR1Go&5iQVSxCflDE^?w^$Asx)Wr$GdCOj6d?+C1 zot1w!s`PdPy|l(X1PBmCKhfhjNLuJr#ztwSa{bK*{TggHWnEmNHng23JNEfS+^7$8>B8}cOL4HKRERCX`jQ653UPRp24XF-{sOZa17G}sjKaU z7>5~d`GJy_BA>^7U&6*3`^M&nH6!XN$6LNlVWXNgcc)Z(7bU2j01kXljGC^fde>Af1)@MC0s(?led?8JY&9u5CIw zMF$!f>fFz1m@x3goLuqf^BPqt8hl4Stp3kLz#C2hmJg^q+g zM4fgIlo$PbrI(6R<#_mm?1(Q9kp>FWz3ceTik8UH!-R^dcvL%X#xm?r@jiFan#v|HQ7;}iPwQkZr&-uY2INx+49n*B?8q? zqq4#0w*-SjoiQ9n@u@Y|Yc)=N0*I@DKyw|*!R%AvbKYMOuo5_`vkCGKy%~hPoC=+lMjfqbrDwFYC#4h+bfFIKhQ2lI{LCf@*4p_ zi%^T`clHDPO0FT^zu>i{S>P18Ij7tf$3dR1$lo$EKCHl9c9jcZwxQ1E zzi=xG-Cn3#I&9VDZ07-b}GfD1OKPFqe&$I(%ckgRctk8G$*r@ds6KE8OFUi$+XLEtpKQ< zXkLqd4vKM2BGYS?%CX=N0;lHN*ZE-YOSlhhVy^j80VO(nXwO$>ZkU^y#Fy6+Yp#je zz^=~uF&?fFqWXj8>QYN$XZE(=4u2P(xA8-el0l;7gVHjhjiH7HX zu&&rJej{`~zy9S>8Kd%$zbUC1o69$7%KWcw z3LPv^C~P3vg)~b+ssqIv=q}$LLj(X+*iM>%Cy`#N13x|Szj&dXyDi=jE+K0O4)iVS z(KxS>R{Co`7)@Hq7QNGB@G!-)U@%jaD3>oA5F)e-=fvjHcoXg*VSNgJ6d})5Ms42e z6_27Uu^6`aFI{GmxO&yWzn02)c3#DgI-f8ETGr@q*M2j9u^!ymf|oh$vO8+S4iN2c zx&y)NwS8?rvQEtKpH}H^x-U%ww)E@S^TWR_5m6qm8LrtB8F~1opC9q&jb!Jw)1U&9 z@c2k96(E-RNOf9M5u^SdfjaG1k$HZQxUgY^eI`8++B@5T8Os7=4s)phL;ZFs?&{e@ zlSVP#)P-fu*r#$_+rR19M;&NAn9uvJ?8+pF{G2H3U$R)2o}rv6_)5{dwe8Cqtvm?F7l055mTly8wZTv zmhn_AC}u|Jb4Bfi*O|}`zaFjsxvkJYI%J#C7*SMMF!4PC!)S)8_WDH4*at`QMU7Zc zt+s`0qH;=byJxvW4tF(7dlBz`Se;JNwE_7g0|z}4meL)wXo0C-%`MPQ6L`0E&DWU< z*;i$}rClBbt4@q=LFt#=Bso`$KS8o31dAqrVpq(){cpMk9)ZXA+&RxszXf;N2;Z(r z7UW-eU6dab>qlb&(EIL&q|>wuhoHO$^bs%Iw|fIsoM&oDYe^Tq2AW~q5SLNey*aA> zixbFS0e^FmYBv^QsB$;j({U3{oNwQnoQYO{%?gIfhp|vRza}IW*bVAF{urKPzpeR^ zZrZQk`?@{((7?=uI#aCUX{f?Ew`LMUEP?lovdjo3n^INGfiXT?HE9&sFLScMk2NPo zd={9zo1hVY`xg@CG>^BXvM{TAGHG5iZg(oO^?GX_q0~IjyfA{hk2BfhHFW%)Pf*@u z!RBcB_-~fACLmBrTXvG5)breZZwd2W4NAOhDX%7G@bN_GZPDH$)dTA+`LO)7S7$4> z)|((t4(E&q$Go}JcmD@4S7{5clNu-xtEL|~l@s#rVCm~y-aw_klzRc3`Dw0zezzE} zbb~g0*yI&6VP45KYMy-OcfK^RX$aYy%}MxT~?4?li`gGWg&xOkZ2}ACtWJ|1j-pjHf`ha8@@F zYLp*BwWeIr@8d$Wa9SlozLlqL^V1&xiQ@-q2z&K`^-oBpzbTRL*q!> zW&Dgu#-=S=Xk+cw( z7sfhZOn)Y?YULYje~eZzx5Kx)kPDk!l0wQGm&qyqGDWbpH`6rV3QYaR{cyn%0e#+$ zJMl)OS9h?$JAqBek4kUyssYW44{^Z=0Z+7>Y;O`K@pf-R@X#^(`>!*Ejz^9}+8iGI zC%0_*4MPoh0(HUPRdc9Mp?;Kq5Z+z>APT|$!Fbn=Q@xQBF1#B5SyCt%H|&MPIbs5& zyJ6|UasEHH@$Ho@K`WVWVhucGp9&;|u#fW*F7^ zvK=HZx%`gy!Fxbl*>L~p+OGcqfSK1re0vdn1(!0s@ivKl&MAMN@97EYDT2#^8s>TU z6;1n2VW!bpP$8%$0Dw4l^TCapSGkg}dL0@@_^`PQtLwk+Rmg2~A~v3EL~5wZ;6eUVq$8o(`0+RH)MLcA zH|gU4zuD-0i~k^-*29WJza=F7Be;JO^~Uwt)Lwf-vFNW3-HIp|Dk$=tMoTK84A%|W z;vd6mbFBuRxaz_^nDb7hM~CSb{XNiU|FqJ^bknm1Y6HE14JG^~dSdua>9!iGw6pEu zwNgHoQXz%=Y9MtO&`;k@4U0S3)_;r|z?=kl7&7+vZ`*w-GbA7BS@kwFClRU~(pq|t z-RRY;{h*#)G#sdLV&M7EzP&W{uqhU-2qDfm26QI3?P}jXH60Bou8C$gK(FETHH*jb zqt}ucQkN20R$Xs=k19$%Oi|)@X!!$w`^uoYZ)FBD8Nlz9@zp*9h!fZvl3*1~Z;H0! z*d^O)=(b0~p(uA+_I_|8A9z~kj-QD-Ab|pRUmSSW2=ptr+uldUU#vyXok$NeC3%10 zc~K3G^18(D*bKL6;CTIF!MYD}5{wb{(VSPi;{SQY?>WXWjVDu<^u&8&i_rw^P`1`! z7r)esj}PMPj>&&~osbH>a6@Td`F?LY&XJJcL|wXmMh}j-T5Z6wi1MmHGyj$iP;7I+ zztFqRc1J{5LLnuZQR{rcy|pq}ZY<7SXD*H3l0C_ljC?U*dB$x${j!6bqr_iLe@m8_Zv<4FPp36ry|iEebhAJ;Qnx4vsZo}PeA%Z<)nV1$z(nO zI#{9sawwG|eo1rB3ANjZ&gKn|W{ukcH8yBEtmVgT0zyMkC(fv6w)YT`&>WZ251TH8 z0@(gfo-lZB7_pr?f}3d!7vZH23N(ivCHx8)ox1E2>9#K|Aw4&n3!3Jm0z+>y-NQom zT>04%2mGBf-6Im0Kl{r2fR)7?W@Anq$oTI8WoTm{hCK+(d;KQTS{U2>z;G445p7kA z3tCKtNzamIn+PI0S){*2u3#al7HbQmLHb$!jI{-#jrOao)_h5*4+-#D`27aCP6HPE zeyJ64&@z3Mo(W!|1*p*LSDe-ao;%A`G*4GNC@Dm>=q{u@cKy32d{)+@+w&IOWpwNq z&h;HJCalhDHbbnmv@3z(LmB7}?$)!=n=uf3@sWVMy&1iM>BMord}CwF<{`K_O07!< zi4N!?bWvW6A*-OA3|OT6(jyaz_=D&wn<`sE=fG*iLQHWyK6WVK1E!Td5&H|-K|Ib zT~*3)8@<+qzPl|sx#DEO2=YhvL_B|o*mu;GQ1D}@%iufm+9JhH(kmcGAqycc{=8Q#s`@)7MK|! zq8-9aGSsYw`E+Si%A)29NUYhO0d_&UT-l4};tX`fjI$NC#=(K3T`{rZjRG@BfY)^-<-~!0KwI#&3@*41kK1xkp zv{J)mW=6jwKv74*F|F(S?7a@PZEk45c{pju*SpRyNYDi~jF{Y_z~(%%Jks@)PLz1BYk_D#1+2Q- zF)omvx=AQe{W$Jb=HZ2@oUu5p8wH@`DZ-Y`mhT4dEH?%x_HHK$#NmSo#Qw?;oGU-XmTHcv)GmMPb)8z?DB zF6i@nDti(S^2y3fRI-K*k#J1((8$7fZ{8*@P)0pHmhve+QVbclpQ_=HknsEOEls>+ zh^`0^@!>nH%I>~_EVn>JxbUe3>Y9g!F9#7$7v!f=_sK3H;MLx0TdT?8%zIp9Rl#Ax zslTg^bO-!i4zTgynNEeQ1&kdKNIuT4`f&;sq~lKHw2WD6V3=TSD)mBpdzZ1GlQVt8 ze|PZ4D$s)5fq4gvsqg={Jzex;X=%qbQ0u_1)Awzk@eD$s;j{wBxLP2r{w6Cga3^Z| zejrBOx1Ug3Zgw01bREVzmG}0$t1H_j=qWh6JY|9HxU4FxRdB3iiVnsKir zb!KfD)IKElaT1{rp)4p{8S{y9!_m8XM?QNHJLvRg`FpGcc)TdThMds9N0)@$q2z>K z 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
D*rrU`P1d7aDXY!&NO`v;q2ZTj?;a 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

D?sTvOR~{cL7Gcee70gvi4OKceZ7 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

st-f}dZBsOdT(o2WiIisA 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 OqcDOpGKOo71pfzx^Vrw` literal 0 HcmV?d00001 diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 00000000..616291a5 --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,58 @@ +/* Bullet lists in content area only */ +.rst-content ul.simple, +.rst-content .section ul { + list-style: disc outside !important; + margin-left: 0 !important; + padding-left: 1.2em !important; + margin-bottom: 12px !important; +} + +.rst-content ul.simple li, +.rst-content .section ul li { + display: list-item !important; + list-style: disc outside !important; + margin-left: 0 !important; + margin-bottom: 0 !important; +} + +.rst-content ul.simple li p, +.rst-content .section ul li p { + margin-bottom: 0 !important; + margin-top: 0 !important; + display: inline !important; +} + +/* Numbered lists in content area only */ +.rst-content ol, +.rst-content .section ol { + list-style: decimal outside !important; + padding-left: 1.5em !important; + margin-bottom: 12px !important; + margin-left: 0 !important; +} + +.rst-content ol li, +.rst-content .section ol li { + display: list-item !important; + list-style: decimal outside !important; + margin-bottom: 0 !important; + margin-left: 0 !important; +} + +.rst-content ol li p, +.rst-content .section ol li p { + margin-bottom: 0 !important; + margin-top: 0 !important; + display: inline !important; +} + +/* Ensure navigation lists have no bullets */ +.wy-menu-vertical ul, +.wy-menu-vertical li, +nav ul, +nav li, +.toctree-l1, +.toctree-l2, +.toctree-l3 { + list-style: none !important; +} diff --git a/docs/app.rst b/docs/app.rst deleted file mode 100644 index 55e10186..00000000 --- a/docs/app.rst +++ /dev/null @@ -1,28 +0,0 @@ -Install IOR -=========== - -IOR is a parallel file system benchmarking tool. To install IOR, follow these steps: - -1. **Clone the IOR repository:** - - .. code-block:: bash - - git clone https://github.com/hpc/ior.git - cd ior - -2. **Build IOR:** - - .. code-block:: bash - - ./bootstrap - ./configure --prefix=$PREFIX - make -j - make install - -3. **(Optional) Install system-wide:** - - .. code-block:: bash - - sudo make install - -For more details, refer to the official IOR documentation: https://github.com/hpc/ior \ No newline at end of file diff --git a/docs/build.rst b/docs/build.rst old mode 100644 new mode 100755 index 105b82ac..db951567 --- a/docs/build.rst +++ b/docs/build.rst @@ -1,37 +1,112 @@ -.. _build_instructions: +================= +Building DataCrumbs +================= -Build Instructions -================== - -This guide describes how to build and install all dependencies required for `datacrumbs`, including `bpftool` (tag v7.5.0), with all components installed under a custom prefix directory. +This comprehensive guide covers building DataCrumbs from source in various environments, including standard builds, HPC systems, Docker containers, and the Tuolumne supercomputer. It includes complete instructions for installing dependencies with custom prefix paths. Prerequisites -------------- +============= -- Git -- CMake -- GCC or Clang -- Python (for Sphinx documentation) -- Spack (recommended for dependency management) +Before building, ensure all dependencies are installed as described in the :doc:`dependencies` section. -Set the installation prefix: +Quick verification: + +.. code-block:: bash + + # Verify kernel version (5.8+ recommended) + uname -r + + # Verify BTF support + ls /sys/kernel/btf/vmlinux + + # Verify libbpf + pkg-config --modversion libbpf + + # Verify bpftool + bpftool version + +Core Requirements +----------------- + +**Build Tools:** + +* Git +* CMake (3.14+) +* GCC or Clang +* Python (for Sphinx documentation) +* Linux kernel 5.8+ with BTF support + +Obtaining the Source +==================== + +Clone the DataCrumbs repository: + +.. code-block:: bash + + git clone https://github.com/LLNL/datacrumbs.git + cd datacrumbs + export DATACRUMBS_DIR=$(realpath .) + +Standard Build Process +====================== + +Basic Build +----------- + +The simplest build uses default configuration: + +.. code-block:: bash + + # Create build directory + mkdir build + cd build + + # Configure with CMake + cmake -DCMAKE_INSTALL_PREFIX=/path/to/install .. + + # Build + make -j$(nproc) + + # Install + make install + +This will: + +1. Discover available probes in system libraries +2. Generate custom eBPF programs +3. Compile eBPF and C++ code +4. Install binaries, libraries, and scripts + +Custom Prefix Installation +=========================== + +This section describes how to build and install all dependencies and DataCrumbs under a custom prefix directory. This is essential for non-root installations and HPC environments. + +Set Installation Prefix +----------------------- + +All dependencies and DataCrumbs will be installed under a custom prefix: .. code-block:: bash export PREFIX=/your/custom/prefix + # For example: export PREFIX=$HOME/datacrumbs-install + # Or on HPC: export PREFIX=/usr/workspace/$USER/datacrumbs-install -1. Build and Install Dependencies for datacrumbs ------------------------------------------------ +Build and Install Dependencies +------------------------------- -The following dependencies are required for building `datacrumbs`: +The following dependencies are required for building DataCrumbs: -- bpftool (v7.5.0) and libbpf (v1.5.0) -- json-c -- yaml-cpp -- llvm -- (Optional) bpftime for user-space +**Runtime Dependencies:** -**bpftool (v7.5.0) and libbpf (v1.5.0):** +* bpftool (v7.5.0) and libbpf (v1.5.0) +* json-c +* yaml-cpp +* llvm +- (Optional) bpftime for user-space (experimental) + +**1. Build bpftool (v7.5.0) and libbpf (v1.5.0)** .. code-block:: bash @@ -39,15 +114,35 @@ The following dependencies are required for building `datacrumbs`: pushd bpftool git checkout tags/v7.5.0 -b v7.5.0 git submodule update --init --recursive + + # Build libbpf pushd libbpf git checkout tags/v1.5.0 -b v1.5.0 cd src DESTDIR=$PREFIX make install -j popd + + # Build bpftool cd src DESTDIR=$PREFIX make install -j popd + +.. important:: + **Understanding Prefix-Style Installation Structure** + + When building with ``DESTDIR=$PREFIX``, the build system installs files into nested directories + under ``$PREFIX`` (e.g., ``$PREFIX/usr/local/lib`` instead of ``$PREFIX/lib``). You must move + these files to the correct locations within your ``$PREFIX`` directory for DataCrumbs to find them. + +**2. Move Files to Correct Prefix Structure** + +After building, use ``find`` to locate and move files to the correct locations: + +.. code-block:: bash + pushd $PREFIX + + # Find and move bpf.h and libbpf bpf_header=$(find . -name bpf.h | head -n 1) bpf_header=$(readlink -f $bpf_header) bpf_install_dir=$(dirname $(dirname $(dirname $bpf_header))) @@ -56,13 +151,22 @@ The following dependencies are required for building `datacrumbs`: mv $bpf_install_dir/lib* $PREFIX fi + # Find and move bpftool bpftool=$(find . -name bpftool | head -n 1) bpftool=$(readlink -f $bpftool) bpftool_install_dir=$(dirname $(dirname $bpftool)) if [[ "$bpftool_install_dir" != "$PREFIX" ]]; then mv $bpftool_install_dir/* $PREFIX fi + popd + +**3. Verify Installation** + +Check that files are in the correct locations: + +.. code-block:: bash + echo "Checking installed files under \$PREFIX:" echo "bpf.h:" find $PREFIX -name bpf.h @@ -76,50 +180,25 @@ The following dependencies are required for building `datacrumbs`: echo "bpftool:" find $PREFIX -name bpftool -Expected Output (with PREFIX=/home/haridev/temp/install) --------------------------------------------------------- - -After running the above commands, you should see output similar to: - -bpf.h: - /home/haridev/temp/install/include/bpf/bpf.h - -libbpf.so: - /home/haridev/temp/install/lib/libbpf.so - -libbpf.pc: - /home/haridev/temp/install/lib/pkgconfig/libbpf.pc - -bpftool: - /home/haridev/temp/install/sbin/bpftool +Expected output (with PREFIX=/home/user/install): - This confirms that bpftool and libbpf have been installed under your custom prefix directory. +.. code-block:: text -**Clone datacrumbs:** + bpf.h: + /home/user/install/include/bpf/bpf.h -.. code-block:: bash - - git clone https://github.com/eunomia-bpf/datacrumbs.git - export DATACRUMBS_DIR=$(realpath datacrumbs) + libbpf.so: + /home/user/install/lib/libbpf.so -**(Optional) bpftime for User-space:** - -.. code-block:: bash - - git clone https://github.com/eunomia-bpf/bpftime.git - pushd bpftime - git checkout tags/v0.2.0 -b v0.2.0 - git apply $DATACRUMBS_DIR/docs/patch/bpftime-v0.2.0.patch - mkdir build && cd build - cmake -DCMAKE_INSTALL_PREFIX=$PREFIX .. - make - make install - popd + libbpf.pc: + /home/user/install/lib/pkgconfig/libbpf.pc + bpftool: + /home/user/install/sbin/bpftool +This confirms that bpftool and libbpf have been correctly installed under your custom prefix directory. -1. Install Remaining Dependencies: json-c, yaml-cpp, llvm ---------------------------------------------------------- +**4. Install Remaining Dependencies: json-c, yaml-cpp, llvm** **Recommended: Use Spack** @@ -131,7 +210,7 @@ bpftool: **If Spack is not available:** -- **LLVM:** Install via your package manager +* **LLVM:** Install via your package manager - Fedora/RHEL: .. code-block:: bash @@ -143,51 +222,76 @@ bpftool: sudo apt-get install llvm-dev -- **json-c:** Build from source +* **json-c:** Build from source .. code-block:: bash git clone https://github.com/json-c/json-c.git pushd json-c - git checkout tags/json-c-0.18-20240915 -b json-c-0.18-20240915 + git checkout tags/json-c-0.18-20240915 -b json-c-0.18-20240915 mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=$PREFIX .. make -j make install -j popd -- **yaml-cpp:** Build from source +* **yaml-cpp:** Build from source .. code-block:: bash git clone https://github.com/jbeder/yaml-cpp.git pushd yaml-cpp - git checkout tags/yaml-cpp-0.7.0 -b yaml-cpp-0.7.0 + git checkout tags/yaml-cpp-0.7.0 -b yaml-cpp-0.7.0 mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=$PREFIX .. make -j make install -j popd -Set all paths +**5. Update Environment Paths** .. code-block:: bash export PATH=$PREFIX/bin:$PREFIX/sbin:$PATH export LD_LIBRARY_PATH=$PREFIX/lib:$PREFIX/lib64:$LD_LIBRARY_PATH + export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PREFIX/lib64/pkgconfig:$PKG_CONFIG_PATH -2. Build and Install datacrumbs ---------------------------------- -With all dependencies installed under your custom prefix directory, you can now build and install `datacrumbs`: +**6. (Optional) BPFTime for Userspace Tracing** -Create a probe YAML for the system: +For experimental userspace eBPF support: .. code-block:: bash - cp $DATACRUMBS_DIR/docs/example/example.yaml $DATACRUMBS_DIR/etc/datacrumbs/configs/probe.yaml - # Edit the probe.yaml as needed + git clone https://github.com/eunomia-bpf/bpftime.git + pushd bpftime + git checkout tags/v0.2.0 -b v0.2.0 + git apply $DATACRUMBS_DIR/docs/patch/bpftime-v0.2.0.patch + mkdir build && cd build + cmake -DCMAKE_INSTALL_PREFIX=$PREFIX .. + make + make install + popd + +Configure BPFTime environment: + +.. code-block:: bash + + export BPFTIME_SHM_MEMORY_MB=10240 + export BPFTIME_MAX_FD_COUNT=128000 + +Build DataCrumbs with Custom Prefix +------------------------------------ -Set CMake arguments: +With all dependencies installed under your custom prefix directory, you can now build and install DataCrumbs: + +**1. Create Host Configuration** + +.. code-block:: bash + + cp $DATACRUMBS_DIR/docs/example/example.yaml $DATACRUMBS_DIR/etc/datacrumbs/configs/$(hostname).yaml + # Edit the configuration file as needed for your system + +**2. Set CMake Arguments** .. code-block:: bash @@ -206,13 +310,611 @@ If you want to use a custom host name or user, set them explicitly: # cmake_args+=(-DDATACRUMBS_HOST=) # cmake_args+=(-DDATACRUMBS_USER=) -Build and install datacrumbs: +**3. Build and Install** .. code-block:: bash - export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PREFIX/lib64/pkgconfig:$PKG_CONFIG_PATH pushd $DATACRUMBS_DIR mkdir -p build && cd build cmake "${cmake_args[@]}" .. make -j + make install popd + +Build with Environment Modules (HPC Systems) +============================================= + +On HPC systems using environment modules (e.g., Tuolumne supercomputer): + +.. code-block:: bash + + # Load required modules + module load gcc/11.2.0 + export CC=$(which gcc) + export CXX=$(which g++) + + # Create build directory + mkdir build + cd build + + # Configure and build + cmake -DCMAKE_INSTALL_PREFIX=$HOME/datacrumbs-install \ + -DDATACRUMBS_HOST=$(hostname) \ + -DDATACRUMBS_USER=$USER \ + .. + + make -j$(nproc) + make install + +CMake Configuration Options +============================ + +All DataCrumbs scripts support common options: + +- ``--verbose``: Enable detailed output +- ``--quiet``: Suppress informational messages +- ``--dry-run``: Show what would be done without executing + +The following table lists all available CMake configuration options: + +.. list-table:: CMake Configuration Options + :header-rows: 1 + :widths: 35 15 50 + + * - Option + - Default + - Description + * - **Core Options** + - + - + * - ``CMAKE_INSTALL_PREFIX`` + - ``/usr/local`` + - Installation prefix for DataCrumbs + * - ``DATACRUMBS_HOST`` + - Auto-detected + - Host identifier for configuration files (must have matching .yaml file in ``etc/datacrumbs/configs/``) + * - ``DATACRUMBS_USER`` + - ``$USER`` + - User name for runtime operations + * - ``DATACRUMBS_INSTALL_USER`` + - ``$USER`` + - User name for installation file naming (for shared installations) + * - **Tracing Configuration** + - + - + * - ``DATACRUMBS_ENABLE_OPT`` + - ``ON`` + - Enable or disable tracing functionality. Values: ``ON``, ``OFF`` + * - ``DATACRUMBS_MODE_STR`` + - ``TRACE`` + - Operation mode. Values: ``TRACE`` (full event tracing), ``PROFILE`` (sampling-based profiling) + * - ``DATACRUMBS_TRACE_ALL_PROCESSES_OPT`` + - ``OFF`` + - Trace all processes on the system (not just target application). Values: ``ON``, ``OFF`` + * - ``DATACRUMBS_INCLUSION_PATH`` + - ``NONE`` + - Filter tracing to specific file paths (e.g., ``/scratch/data``) + * - ``DATACRUMBS_TRACE_RINGBUF_SIZE_MB`` + - ``16`` + - Size of eBPF ring buffer in megabytes. Larger buffers reduce event loss but consume more memory + * - ``DATACRUMBS_SKIP_SMALL_EVENTS_THRESHOLD_NS`` + - ``1000`` + - Skip events with duration below threshold (nanoseconds). Default is 1 microsecond + * - **Profiling Configuration** + - + - + * - ``DATACRUMBS_TIME_INTERVAL_NS`` + - ``1000000`` + - Sampling interval for profiling mode (nanoseconds). Default is 1 millisecond + * - **Directory Configuration** + - + - + * - ``DATACRUMBS_CONFIGURED_TRACE_DIR`` + - ``/tmp`` + - Default directory for trace output + * - ``DATACRUMBS_CONFIGURED_LOG_DIR`` + - ``/tmp`` + - Default directory for log files + * - ``DATACRUMBS_CONFIGURED_RUN_DIR`` + - ``NONE`` + - Directory for runtime state files (PIDs, lock files). Auto-determined if not set + * - **Kernel Configuration** + - + - + * - ``DATACRUMBS_KERNEL_VERSION`` + - Auto-detected + - Override detected kernel version (e.g., ``5.15.0``) + * - ``DATACRUMBS_KERNEL_HEADERS_PATH`` + - Auto-detected + - Path to kernel headers for eBPF compilation. Default: ``/lib/modules/$(uname -r)/build`` + * - ``DATACRUMBS_KERNEL_PATH`` + - Empty + - Path to kernel source tree (if different from headers) + * - **Scheduler Integration** + - + - + * - ``DATACRUMBS_SCHEDULER_TYPE`` + - ``FLUX`` + - Job scheduler type for multi-node support. Values: ``FLUX``, ``SLURM``, ``OPENMPI``, ``NONE`` + * - ``DATACRUMBS_SCHEDULER_JOBID_ENV_VAR`` + - ``NONE`` + - Environment variable containing job ID (e.g., ``SLURM_JOB_ID``). Auto-determined from scheduler type + * - ``DATACRUMBS_SCHEDULER_NODES_CMD_OPT`` + - ``NONE`` + - Scheduler option for specifying node count (e.g., ``-N``). Auto-determined from scheduler type + * - ``DATACRUMBS_SCHEDULER_PPN_CMD_OPT`` + - ``NONE`` + - Scheduler option for processes per node (e.g., ``-n``). Auto-determined from scheduler type + * - ``DATACRUMBS_SCHEDULER_RUN_CMD`` + - ``NONE`` + - Scheduler job launch command (e.g., ``srun``). Auto-determined from scheduler type + * - ``DATACRUMBS_SCHEDULER_RUN_EXTRA_ARGS`` + - Empty + - Additional arguments for scheduler run command (e.g., ``--exclusive --mem=0``) + * - **Build Control Options** + - + - + * - ``DATACRUMBS_SKIP_PROBE_EXPLORING`` + - ``OFF`` + - Skip the probe exploration step during build. Values: ``ON``, ``OFF`` + * - ``DATACRUMBS_SKIP_PROBE_GENERATION`` + - ``OFF`` + - Skip the probe generation step during build. Values: ``ON``, ``OFF`` + * - ``DATACRUMBS_BUILD_ONLY`` + - ``OFF`` + - Build libraries only without installation or full setup. Values: ``ON``, ``OFF`` + * - **Debug and Development** + - + - + * - ``DATACRUMBS_LOG_LEVEL_STR`` + - ``INFO`` + - Logging verbosity level. Values: ``ERROR``, ``WARN``, ``INFO``, ``DEBUG``, ``TRACE`` + * - ``DATACRUMBS_BPF_PRINT_ENABLE`` + - ``OFF`` + - Enable debug printing from eBPF programs. Values: ``ON``, ``OFF``. Warning: impacts performance! + * - **Tool Paths** + - + - + * - ``BPFTOOL_EXECUTABLE`` + - Auto-detected + - Path to bpftool binary (e.g., ``/usr/local/bin/bpftool``). Auto-detected from ``PATH`` + * - **Compatibility Options** + - + - + * - ``DATACRUMBS_BPFTIME_COMPATIBLE`` + - ``OFF`` + - Enable compatibility with bpftime userspace eBPF runtime. Values: ``ON``, ``OFF`` + +Configuration Examples +---------------------- + +**Basic configuration:** + +.. code-block:: bash + + cmake -DCMAKE_INSTALL_PREFIX=/opt/datacrumbs \ + -DDATACRUMBS_HOST=myhost \ + .. + +**HPC configuration with custom paths:** + +.. code-block:: bash + + cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DDATACRUMBS_HOST=tuolumne \ + -DDATACRUMBS_USER=$USER \ + -DDATACRUMBS_SCHEDULER_TYPE=FLUX \ + -DDATACRUMBS_CONFIGURED_TRACE_DIR=/lustre/traces \ + -DDATACRUMBS_CONFIGURED_LOG_DIR=/lustre/logs \ + -DBPFTOOL_EXECUTABLE=$PREFIX/sbin/bpftool \ + .. + +**Debug configuration:** + +.. code-block:: bash + + cmake -DDATACRUMBS_LOG_LEVEL_STR=DEBUG \ + -DDATACRUMBS_BPF_PRINT_ENABLE=ON \ + .. + +**Profiling mode with reduced overhead:** + +.. code-block:: bash + + cmake -DDATACRUMBS_MODE_STR=PROFILE \ + -DDATACRUMBS_TIME_INTERVAL_NS=10000000 \ + -DDATACRUMBS_SKIP_SMALL_EVENTS_THRESHOLD_NS=10000 \ + .. + +Important Notes +--------------- + +.. important:: + **DATACRUMBS_HOST Configuration File** + + A configuration file named ``.yaml`` **must exist** in ``etc/datacrumbs/configs/`` for the specified hostname. + This is the most common build error. You can: + + - Copy an existing configuration (e.g., ``lead.yaml``, ``docker.yaml``) and modify it + - Create a new one based on the examples in ``docs/example/`` + - See the :doc:`setup` section for details on configuration file structure + +.. warning:: + **Performance Impact** + + - ``DATACRUMBS_TRACE_ALL_PROCESSES_OPT=ON`` generates significantly more trace data + - ``DATACRUMBS_BPF_PRINT_ENABLE=ON`` can severely impact performance + - Use ``DATACRUMBS_MODE_STR=PROFILE`` for lower overhead in production + +Docker Build +============ + +Build DataCrumbs in a Docker container for a consistent environment. + +Building the Docker Image +-------------------------- + +.. code-block:: bash + + cd infrastructure/docker + # Use Dockerfile for standard build, or Dockerfile.build for build-only image + docker build -t datacrumbs:latest -f Dockerfile . + +The Dockerfile performs: + +1. Starts from base image with dependencies +2. Copies source code to ``/opt/datacrumbs`` +3. Configures with CMake for Docker environment +4. Builds and installs DataCrumbs +5. Sets up environment variables + +Running the Container +--------------------- + +.. code-block:: bash + + # Run with required privileges for eBPF + docker run --privileged --cap-add=ALL \ + -v /sys/kernel/debug:/sys/kernel/debug:rw \ + -v /lib/modules:/lib/modules:ro \ + -it datacrumbs:latest bash + +.. warning:: + eBPF requires ``--privileged`` and ``--cap-add=ALL`` capabilities! + +Custom Docker Build +------------------- + +Modify the Dockerfile for your environment: + +.. code-block:: dockerfile + + # Example custom configuration + cmake -DDATACRUMBS_HOST=myhost \ + -DDATACRUMBS_USER=myuser \ + -DDATACRUMBS_KERNEL_HEADERS_PATH=/usr/src/kernels/$(uname -r) \ + -DCMAKE_INSTALL_PREFIX=/opt/datacrumbs-install \ + /opt/datacrumbs/ + +Lima Build (macOS Development) +============================== + +Lima provides a Linux VM environment on macOS for eBPF development. + +Initial Setup +------------- + +.. code-block:: bash + + # Install Lima (macOS) + brew install lima + + # Start Lima VM with DataCrumbs configuration + cd infrastructure/lima + limactl start --network=lima:user-v2 --name=ebpf ebpf.yaml + +The ``ebpf.yaml`` configuration: + +* Creates Ubuntu 22.04 VM +* Installs all DataCrumbs dependencies +* Sets up BCC, spack, and OpenMPI +* Configures 4 CPU cores and 4GB RAM + +Connecting to Lima +------------------ + +.. code-block:: bash + + # Connect to VM + limactl shell ebpf + +Building in Lima +---------------- + +Inside the Lima VM: + +.. code-block:: bash + + # Set environment variables + export DATACRUMBS_DIR=/home/lima.linux/datacrumbs + export DATACRUMBS_INSTALL_DIR=/home/lima.linux/datacrumbs/install + + # Clone repository (if not mounted) + git clone https://github.com/LLNL/datacrumbs.git $DATACRUMBS_DIR + + # Build + cd $DATACRUMBS_DIR + mkdir build + cd build + + cmake -DCMAKE_INSTALL_PREFIX=$DATACRUMBS_INSTALL_DIR \ + -DDATACRUMBS_HOST=lima \ + -DDATACRUMBS_USER=$USER \ + .. + + make -j$(nproc) + make install + +Using Spack (Optional) +---------------------- + +Lima setup includes Spack for dependency management: + +.. code-block:: bash + + # Inside Lima VM + export SPACK_ROOT=/opt/spack + source $SPACK_ROOT/share/spack/setup-env.sh + + # Install dependencies via Spack + spack install openmpi@5.0.5 + spack load openmpi + +Building for Tuolumne Supercomputer +==================================== + +Tuolumne (Tuo) is an LLNL supercomputer requiring specific build procedures. This section provides complete build instructions including dependency installation with custom prefix. + +Prerequisites for Tuolumne +--------------------------- + +Load required modules: + +.. code-block:: bash + + module load gcc/11.2.0 + export CC=$(which gcc) + export CXX=$(which g++) + +Set Installation Prefix +------------------------ + +All dependencies and DataCrumbs will be installed under a custom prefix: + +.. code-block:: bash + + export PREFIX=/usr/workspace/$USER/datacrumbs-install + +Build DataCrumbs for Tuolumne +------------------------------ + +Follow the instructions in the :ref:`Custom Prefix Installation` section above to build and install all dependencies. + +Once dependencies are installed, clone and configure DataCrumbs: + +.. code-block:: bash + + git clone https://github.com/LLNL/datacrumbs.git + export DATACRUMBS_DIR=$(realpath datacrumbs) + +Create host configuration: + +.. code-block:: bash + + cp $DATACRUMBS_DIR/docs/example/example.yaml \ + $DATACRUMBS_DIR/etc/datacrumbs/configs/tuolumne.yaml + # Edit tuolumne.yaml as needed for your system + +Configure CMake arguments: + +.. code-block:: bash + + cmake_args=( + -DCMAKE_PREFIX_PATH=$PREFIX + -DCMAKE_INSTALL_PREFIX=$PREFIX + -DBPFTOOL_EXECUTABLE=$PREFIX/sbin/bpftool + -DDATACRUMBS_HOST=tuolumne + -DDATACRUMBS_USER=$USER + -DDATACRUMBS_SCHEDULER_TYPE=FLUX + -DDATACRUMBS_CONFIGURED_TRACE_DIR=/p/lustre1/$USER/traces + -DDATACRUMBS_CONFIGURED_LOG_DIR=/p/lustre1/$USER/logs + ) + +Build and install: + +.. code-block:: bash + + pushd $DATACRUMBS_DIR + mkdir -p build && cd build + cmake "${cmake_args[@]}" .. + make -j16 + make install + popd + +Running DataCrumbs on Tuolumne +------------------------------- + +Load environment: + +.. code-block:: bash + + module load gcc/11.2.0 + export PATH=$PREFIX/bin:$PREFIX/sbin:$PATH + export LD_LIBRARY_PATH=$PREFIX/lib:$PREFIX/lib64:$LD_LIBRARY_PATH + +Run with BPFTime (if installed): + +.. code-block:: bash + + export BPFTIME_SHM_MEMORY_MB=10240 + export BPFTIME_MAX_FD_COUNT=128000 + + bpftime --install-location $PREFIX/lib load \ + $PREFIX/sbin/datacrumbs "run" "tuolumne-mpiio" \ + "--user" "$USER" \ + "--config_path" "$PREFIX/etc/datacrumbs/configs" \ + "--data_dir" "$PREFIX/etc/datacrumbs/data" \ + "--trace_log_dir" "$PREFIX/etc/datacrumbs/logs" + +For debugging with GDB: + +.. code-block:: bash + + gdb $PREFIX/sbin/datacrumbs + # Inside GDB: + add-auto-load-safe-path /opt/cray/pe/gcc/11.2.0/snos/lib64/libstdc++.so.6.0.29-gdb.py + set follow-fork-mode child + set detach-on-fork off + set print-frame-arguments all + +Standard usage (without BPFTime): + +.. code-block:: bash + + # See Usage section for complete examples + datacrumbs_server_run.sh + datacrumbs_run --help + +Build Verification +================== + +After installation, verify the build: + +.. code-block:: bash + + # Check binaries + ls -la $PREFIX/bin/datacrumbs_* + ls -la $PREFIX/sbin/datacrumbs* + + # Check libraries (may be in lib or lib64 depending on system) + ls -la $PREFIX/lib*/libdatacrumbs_*.so + + # Check module file + ls -la $PREFIX/etc/datacrumbs/modulefiles/ + + # Test validator + $PREFIX/sbin/datacrumbs_validator + +Troubleshooting +=============== + +Build Errors +------------ + +**"Cannot find configuration file for host"** + +.. code-block:: text + + CMake Error: Configuration file etc/datacrumbs/configs/myhost.yaml not found + +**This is the most common build error.** DataCrumbs requires a host-specific configuration file. + +.. code-block:: bash + + # Solution 1: Copy an existing configuration + cd etc/datacrumbs/configs/ + cp lead.yaml myhost.yaml + # Edit myhost.yaml to match your system + + # Solution 2: Specify a different host + cmake -DDATACRUMBS_HOST=lead ... + + # Solution 3: Create minimal configuration + cat > etc/datacrumbs/configs/myhost.yaml << 'EOF' + capture_probes: + - name: sys + probe: syscalls + type: header + file: /usr/src/kernels/$(uname -r)/include/linux/syscalls.h + regex: sys_.* + EOF + +See the :doc:`setup` section for more details on configuration file structure. + +**"Cannot find vmlinux BTF"** + +.. code-block:: bash + + # Verify BTF exists + ls /sys/kernel/btf/vmlinux + + # If missing, specify kernel headers path + cmake -DDATACRUMBS_KERNEL_HEADERS_PATH=/usr/src/kernels/$(uname -r) ... + +**"libbpf not found"** + +.. code-block:: bash + + # Install libbpf or set PKG_CONFIG_PATH + export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH + +**"Clang not found for eBPF compilation"** + +.. code-block:: bash + + # Install clang + sudo dnf install clang llvm + + # Verify + which clang + +**"Permission denied" during eBPF operations** + +The build process tests eBPF capabilities. Ensure: + +.. code-block:: bash + + # Run make with appropriate privileges if needed + sudo make + +Rebuild from Scratch +-------------------- + +To completely rebuild: + +.. code-block:: bash + + # Remove build directory + rm -rf build + + # Recreate and rebuild + mkdir build + cd build + cmake .. + make clean + make -j$(nproc) + +Partial Rebuild +--------------- + +To rebuild only changed components: + +.. code-block:: bash + + # Rebuild specific targets + make datacrumbs_bpf + make datacrumbs + + # Reinstall + make install + +Clean Build Artifacts +--------------------- + +.. code-block:: bash + + # Clean BPF artifacts + make clean_all + + # Clean everything + make clean diff --git a/docs/composability.rst b/docs/composability.rst new file mode 100755 index 00000000..ff99c707 --- /dev/null +++ b/docs/composability.rst @@ -0,0 +1,597 @@ +=================== +Composability Guide +=================== + +DataCrumbs provides a powerful composability feature that allows users to create custom tracing configurations by selecting specific probes. This enables optimized tracing tailored to specific workload requirements, reducing overhead and improving performance. + +Overview +======== + +During the build and installation process, DataCrumbs: + +1. Discovers available probes in system libraries and kernel functions +2. Compiles each probe as a separate eBPF object file +3. Installs individual probe objects to ``/libexec/datacrumbs/objects/`` +4. Provides tools for discovering and composing custom configurations + +This modular approach allows users to: + +- Select only the probes relevant to their workload +- Reduce tracing overhead by excluding unnecessary probes +- Create multiple configurations for different applications +- Share configurations across users in multi-tenant environments + +Probe Objects +============= + +After installation, individual probe objects are available in: + +.. code-block:: bash + + $PREFIX/libexec/datacrumbs/objects/ + +Example probe objects: + +- ``open.o`` - open() system call +- ``read.o`` - read() system call +- ``write.o`` - write() system call +- ``H5Fopen.o`` - HDF5 file open +- ``MPI_File_open.o`` - MPI-IO file open +- ``pread64.o``, ``pwrite64.o`` - POSIX I/O functions +- And many more depending on your system configuration + +Common objects (always required): + +- ``common.o`` - Shared eBPF code +- ``init.bpf.o`` - Initialization code + +Discovering Available Probes +============================= + +Use ``datacrumbs_compose`` to discover all available probes: + +**Command:** + +.. code-block:: bash + + sudo datacrumbs_compose --action discover + +**Output:** + +.. code-block:: text + + [INFO 2025-11-21 21:19:50] After loading yaml for docker + [INFO 2025-11-21 21:19:50] Discovering probe objects in /workspaces/datacrumbs/install/libexec/datacrumbs/objects... + [INFO 2025-11-21 21:19:50] custom1 + [INFO 2025-11-21 21:19:50] sys + [INFO 2025-11-21 21:19:50] libc + [INFO 2025-11-21 21:19:50] os_page_cache + [INFO 2025-11-21 21:19:50] python + [INFO 2025-11-21 21:19:50] xfs + [INFO 2025-11-21 21:19:50] iomap + ... + +The discover action lists all probes that can be composed into custom configurations. + +Creating Composable Configurations +=================================== + +Use ``datacrumbs_compose`` to create a custom configuration: + +**Command Syntax:** + +.. code-block:: bash + + sudo datacrumbs_compose --action compose --name CONFIG_NAME --probes PROBE1,PROBE2,... + +**Arguments:** + +``--action compose`` + Create a new composable configuration + +``--name NAME`` + Name for the custom configuration (alphanumeric and underscore only) + +``--probes PROBES`` + Comma-separated list of probe names (no spaces) + +Example: Local I/O Only +----------------------- + +Create a configuration that traces only POSIX I/O operations: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name local_io \ + --probes custom1,sys,os_page_cache,xfs,iomap + +This creates: ``$PREFIX/libexec/datacrumbs/sbin//datacrumbs_local_io`` + +Example: HDF5 Only +------------------ + +Create a configuration for HDF5 applications: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name hdf5_only \ + --probes h5a,h5d,h5all + +Example: MPI-IO Only +-------------------- + +Create a configuration for MPI-IO tracing: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name mpiio_only \ + --probes mpiio,sys + +Example: Mixed Workload +----------------------- + +Create a configuration for applications using POSIX and HDF5: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name posix_hdf5 \ + --probes custom1,sys,hdf5 + +Using Composable Configurations +================================ + +Once created, composable configurations can be used with any DataCrumbs execution mode. + +With datacrumbs_run +------------------- + +.. code-block:: bash + + # Use default configuration + datacrumbs_run --app "./myapp" + + # Use custom configuration + datacrumbs_compose_run --composite-name local_io --app "./myapp" + +With Server Mode +---------------- + +.. code-block:: bash + + # Start server with custom configuration + sudo datacrumbs_server_run.sh --composite-name hdf5_only + + # Run application (uses custom config) + datacrumbs_track --executable ./hdf5_app + ./hdf5_app + + # Stop server + sudo datacrumbs_server_stop.sh --composite-name hdf5_only + +With Service Mode +----------------- + +.. code-block:: bash + + # Set environment variable for service + export DATACRUMBS_COMPOSABLE_NAME=mpiio_only + + # Start service + sudo datacrumbs_service_run.sh + + # Applications will use the mpiio_only configuration + +With Flux Integration +--------------------- + +.. code-block:: bash + + # Submit job with custom configuration + flux run --datacrumbs-enable --datacrumbs-composite=posix_hdf5 \ + -N 4 -n 32 ./parallel_app + + # Or with default configuration + flux run --datacrumbs-enable -N 4 -n 32 ./parallel_app + +Command Reference: datacrumbs_compose +====================================== + +**Synopsis:** + +.. code-block:: bash + + datacrumbs_compose --action ACTION [OPTIONS] + +**Required Arguments:** + +``--action ACTION`` + Action to perform: + + - ``discover``: List all available probes + - ``compose``: Create a new composable configuration + +**Optional Arguments:** + +``--name NAME`` + Name for the composable configuration (required for ``compose`` action) + + - Must contain only alphanumeric characters and underscores + - Will create binary: ``datacrumbs_`` + +``--probes PROBES`` + Comma-separated list of probe names (required for ``compose`` action) + + - No spaces between probe names + - Probe names must exist (use ``discover`` to list) + +``--verbose`` + Enable verbose output + +``--quiet`` + Suppress informational messages + +``--dry-run`` + Show what would be done without executing + +**Examples:** + +.. code-block:: bash + + # Discover available probes + sudo datacrumbs_compose --action discover + + # Create simple configuration + sudo datacrumbs_compose --action compose \ + --name basic_io \ + --probes custom1,sys,os_page_cache + + # Create with verbose output + sudo datacrumbs_compose --action compose \ + --name debug_config \ + --probes custom1,sys,os_page_cache \ + --verbose + + # Dry run to see what would happen + sudo datacrumbs_compose --action compose \ + --name test_config \ + --probes custom1 \ + --dry-run + +Composable Binary Locations +============================ + +Composable binaries are installed per-user: + +.. code-block:: text + + /libexec/datacrumbs/sbin//datacrumbs_ + +Example: + +.. code-block:: bash + + # For user 'alice' with config 'local_io' + /opt/datacrumbs/libexec/datacrumbs/sbin/alice/datacrumbs_local_io + + # For user 'bob' with config 'hdf5_only' + /opt/datacrumbs/libexec/datacrumbs/sbin/bob/datacrumbs_hdf5_only + +This per-user structure allows: + +- Multiple users to have different configurations +- Configuration isolation between users +- Shared installations with user-specific customizations + +Managing Composables +==================== + +Listing Composables +------------------- + +List all composable configurations for the current user: + +.. code-block:: bash + + ls $PREFIX/libexec/datacrumbs/sbin/$USER/ + +Removing Composables +-------------------- + +Remove a composable configuration: + +.. code-block:: bash + + rm $PREFIX/libexec/datacrumbs/sbin/$USER/datacrumbs_ + +Example: + +.. code-block:: bash + + rm $PREFIX/libexec/datacrumbs/sbin/$USER/datacrumbs_posix_io + +Updating Composables +-------------------- + +To update a composable configuration, simply recreate it: + +.. code-block:: bash + + # Recreate with updated probe list + sudo datacrumbs_compose --action compose \ + --name local_io \ + --probes custom1,sys,os_page_cache,xfs,iomap + +The old configuration is automatically replaced. + +Composability Best Practices +============================= + +1. **Start Small**: Begin with minimal probe sets and add more as needed +2. **Profile First**: Use the full configuration to identify which probes are relevant +3. **Workload-Specific**: Create different configurations for different application types +4. **Test Configurations**: Verify custom configurations work before production use +5. **Document Configs**: Maintain a list of configurations and their purposes +6. **Share Configs**: Coordinate configurations across team members for consistency +7. **Monitor Overhead**: Compare overhead between full and custom configurations +8. **Version Control**: Keep track of which probe combinations work best + +Common Configuration Patterns +============================== + +System Call Level +----------------- + +Trace only low-level system calls: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name syscalls_only \ + --probes custom1,sys + +Local I/O Level +--------------- + +Trace local I/O operations: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name local_io \ + --probes custom1,sys,os_page_cache,xfs,iomap + +High-Level Libraries +-------------------- + +Trace only high-level I/O libraries: + +.. code-block:: bash + + sudo datacrumbs_compose --action compose \ + --name high_level \ + --probes h5a,h5d,mpiio + + +Troubleshooting Composables +============================ + +Probe Not Found +--------------- + +.. code-block:: text + + Error: Probe object 'invalid_probe.o' not found. + +**Solution**: Run ``discover`` to see available probes: + +.. code-block:: bash + + sudo datacrumbs_compose --action discover + +Invalid Configuration Name +-------------------------- + +.. code-block:: text + + Error: Invalid composable name + +**Solution**: Use only alphanumeric characters and underscores: + +.. code-block:: bash + + # Invalid + sudo datacrumbs_compose --action compose --name my-config ... # Hyphen not allowed + + # Valid + sudo datacrumbs_compose --action compose --name my_config ... + +Composable Not Used +------------------- + +If the composable binary is created but not being used: + +.. code-block:: bash + + # Verify binary exists + ls -la $PREFIX/libexec/datacrumbs/sbin/$USER/datacrumbs_* + + # Check permissions + # Should be: -r-x------ (500) + + # Verify you're specifying the name correctly + datacrumbs_compose_run --composite-name exact_name + +Build Failures +-------------- + +If composable build fails: + +.. code-block:: bash + + # Check build logs in the dry-run output + sudo datacrumbs_compose --action compose \ + --name test \ + --probes open,close \ + --verbose + + # Verify CMake and build tools are available + which cmake + + # Check probe objects exist + ls $PREFIX/libexec/datacrumbs/objects/ + +Advanced Usage +============== + +Programmatic Composition +------------------------ + +Create multiple configurations programmatically: + +.. code-block:: bash + + #!/bin/bash + + # Define configurations + declare -A configs + configs[posix]="open,close,read,write,lseek" + configs[hdf5]="H5Fopen,H5Fclose,H5Dread,H5Dwrite" + configs[mpiio]="MPI_File_open,MPI_File_close,MPI_File_read,MPI_File_write" + + # Create all configurations + for name in "${!configs[@]}"; do + echo "Creating configuration: $name" + sudo datacrumbs_compose --action compose \ + --name "$name" \ + --probes "${configs[$name]}" + done + +Dynamic Probe Selection +----------------------- + +Select probes based on application analysis: + +.. code-block:: bash + + # Run with full tracing first + datacrumbs_run --app "./myapp" + + # Analyze trace to find used functions + # (Analysis script not shown) + + # Create optimized configuration with only used probes + sudo datacrumbs_compose --action compose \ + --name myapp_optimized \ + --probes open,read,write,close,H5Dread,H5Dwrite + +Integration with Workflows +--------------------------- + +Include composable creation in workflow scripts: + +.. code-block:: bash + + #!/bin/bash + # workflow.sh + + # Create workflow-specific configuration + sudo datacrumbs_compose --action compose \ + --name workflow_io \ + --probes open,close,read,write,H5Fopen,H5Fclose + + # Run workflow stages with custom configuration + datacrumbs_server_run --composite-name workflow_io + datacrumbs_track --executable ./stage1_preprocess + ./stage1_preprocess + datacrumbs_track --executable ./stage2_compute + ./stage2_compute + datacrumbs_track --executable ./stage3_postprocess + ./stage3_postprocess + datacrumbs_server_stop --composite-name workflow_io + +Examples +======== + +Example 1: Lightweight POSIX Tracing +------------------------------------- + +.. code-block:: bash + + # Discover available probes + sudo datacrumbs_compose --action discover + + # Create lightweight configuration + sudo datacrumbs_compose --action compose \ + --name light_posix \ + --probes open,close,read,write + + # Use with application + datacrumbs_compose_run --composite-name light_posix \ + --app "./io_benchmark" + + # Compare overhead with full tracing + # Lightweight typically has 2-3% overhead vs 5-8% for full + +Example 2: HDF5 Application Optimization +----------------------------------------- + +.. code-block:: bash + + # Initial run with full tracing + datacrumbs_run --app "./hdf5_app dataset.h5" + + # Analyze trace - shows only H5 functions are used + + # Create HDF5-only configuration + sudo datacrumbs_compose --action compose \ + --name hdf5_optimized \ + --probes H5Fopen,H5Fclose,H5Fcreate,H5Dopen,H5Dclose,H5Dcreate,H5Dread,H5Dwrite + + # Use optimized configuration + datacrumbs_compose_run --composite-name hdf5_optimized \ + --app "./hdf5_app large_dataset.h5" + +Example 3: Multi-User Environment +---------------------------------- + +.. code-block:: bash + + # Administrator creates common configurations + sudo su - admin + + # POSIX configuration + sudo datacrumbs_compose --action compose \ + --name std_posix \ + --probes open,close,read,write,pread64,pwrite64 + + # HDF5 configuration + sudo datacrumbs_compose --action compose \ + --name std_hdf5 \ + --probes H5Fopen,H5Fclose,H5Dread,H5Dwrite + + # Users can now use these configurations + # User 1 + datacrumbs_compose_run --composite-name std_posix --app "./user1_app" + + # User 2 + datacrumbs_compose_run --composite-name std_hdf5 --app "./user2_app" + +Example 4: Flux Workflow +------------------------- + +.. code-block:: bash + + # Create configuration for workflow + sudo datacrumbs_compose --action compose \ + --name workflow_trace \ + --probes open,close,read,write,H5Dread,H5Dwrite,MPI_File_read,MPI_File_write + + # Submit Flux job with custom configuration + flux run --datacrumbs-enable \ + --datacrumbs-composite=workflow_trace \ + -N 8 -n 64 \ + ./parallel_workflow diff --git a/docs/conf.py b/docs/conf.py index ded7eddf..722f32a2 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,14 +19,14 @@ # -- Project information ----------------------------------------------------- -project = u'dftracer' -copyright = u'2018, Lawrence Livermore National Security, LLC' +project = u'DataCrumbs' +copyright = u'2024, Lawrence Livermore National Security, LLC' author = u'Hariharan Devarajan' # The short X.Y version version = u'0.0' # The full version, including alpha/beta/rc tags -release = u'1.0.2' +release = u'0.0.4' # -- General configuration --------------------------------------------------- @@ -90,9 +90,12 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +# Add custom CSS +html_css_files = ['custom.css'] + # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = 'images/dftracer-logo.png' +# html_logo = 'images/datacrumbs-logo.png' # Update when logo is available # Custom sidebar templates, must be a dictionary that maps document names # to template names. @@ -110,7 +113,7 @@ # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. -htmlhelp_basename = 'dftracer-doc' +htmlhelp_basename = 'datacrumbs-doc' # -- Options for LaTeX output ------------------------------------------------ @@ -137,13 +140,13 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'dftracer.tex', u'DFTracer Documentation', + (master_doc, 'datacrumbs.tex', u'DataCrumbs Documentation', author, 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -latex_logo = 'images/dftracer-logo.png' +# latex_logo = 'images/datacrumbs-logo.png' # -- Options for manual page output ------------------------------------------ @@ -151,7 +154,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'dftracer', u'DFTracer Documentation', + (master_doc, 'datacrumbs', u'DataCrumbs Documentation', [author], 1) ] @@ -162,7 +165,7 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'dftracer', u'DFTracer Documentation', - author, 'dftracer', 'DFTracer is a library for wrapping function calls in shared libraries.', + (master_doc, 'datacrumbs', u'DataCrumbs Documentation', + author, 'datacrumbs', 'DataCrumbs is an eBPF-based I/O profiling and tracing tool for HPC applications.', 'Miscellaneous'), ] diff --git a/docs/dependencies.rst b/docs/dependencies.rst new file mode 100755 index 00000000..1c9f6273 --- /dev/null +++ b/docs/dependencies.rst @@ -0,0 +1,485 @@ +============ +Dependencies +============ + +DataCrumbs has several system and library dependencies that must be satisfied before building and running the tool. + +System Requirements +=================== + +Operating System +---------------- + +DataCrumbs requires a Linux-based operating system with eBPF support. Tested distributions include: + +* CentOS 8+ +* Rocky Linux 8+ +* Ubuntu 20.04+ +* Debian 11+ + +Kernel Requirements +------------------- + +**Recommended: Linux Kernel 5.8 or later** + +DataCrumbs works best with modern kernel versions that have full eBPF feature support: + +* **Linux 5.8+**: Full eBPF features including bounded loops, advanced helpers, and BPF ring buffers (recommended) +* **Linux 5.1+**: Supported with most features +* **Linux 4.18+**: Supported with compatibility layers (reduced functionality) + +For kernels older than 5.8, DataCrumbs can use compatibility mechanisms, but some features may be limited. + +To check your kernel version: + +.. code-block:: bash + + uname -r + +Kernel Configuration +-------------------- + +The kernel must be built with eBPF support enabled. Required kernel configuration options: + +.. code-block:: text + + CONFIG_BPF=y + CONFIG_BPF_SYSCALL=y + CONFIG_BPF_JIT=y + CONFIG_HAVE_EBPF_JIT=y + CONFIG_BPF_EVENTS=y + CONFIG_DEBUG_INFO_BTF=y + +Most modern distributions enable these by default. To verify: + +.. code-block:: bash + + # Check if BTF is available + ls -la /sys/kernel/btf/vmlinux + + # Check BPF support + zgrep BPF /proc/config.gz + +Build Dependencies +================== + +Compiler Requirements +--------------------- + +**GCC 11.2.0 or later** (recommended) + +.. code-block:: bash + + # Check GCC version + gcc --version + + # Set compiler for CMake + export CC=$(which gcc) + export CXX=$(which g++) + +**Clang/LLVM** (for eBPF compilation) + +Clang is required to compile eBPF programs. Version 10+ recommended. + +.. code-block:: bash + + # Check Clang version + clang --version + +Build Tools +----------- + +Required build tools: + +* **CMake 3.5+**: Build system generator +* **Make**: Build automation +* **Git**: Version control (for obtaining source) +* **pkg-config**: Dependency detection + +.. code-block:: bash + + # On CentOS/Rocky Linux + sudo dnf install cmake make git pkg-config + + # On Ubuntu/Debian + sudo apt-get install cmake build-essential git pkg-config + +Core eBPF Dependencies +====================== + +libbpf (v1.5.0+) +---------------- + +**Required Version: 1.5.0 or later** + +libbpf is the core library for loading and managing eBPF programs. DataCrumbs requires a recent version with support for: + +* Modern BPF features (ring buffers, etc.) +* BTF support +* CO-RE (Compile Once - Run Everywhere) + +Installation from Source +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + # Clone libbpf + git clone https://github.com/libbpf/libbpf.git + cd libbpf/src + + # Build and install + make + sudo make install + sudo ldconfig + + # Verify installation + pkg-config --modversion libbpf + +Installation from Package Manager +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install libbpf-devel + + # Ubuntu 22.04+ + sudo apt-get install libbpf-dev + +.. note:: + Package manager versions may be older than 1.5.0. Building from source is recommended for the latest features. + +bpftool (v7.5.0+) +----------------- + +**Required Version: 7.5.0 or later** + +bpftool is used during the build process to generate eBPF-related headers and skeleton files. + +Installation from Source +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + # Install dependencies + sudo dnf install libelf-devel libcap-devel + + # Clone Linux kernel tools + git clone --depth 1 --branch v6.1 https://github.com/torvalds/linux.git + cd linux/tools/bpf/bpftool + + # Build and install + make + sudo make install + + # Verify installation + bpftool version + +System Installation +^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install bpftool + + # Ubuntu + sudo apt-get install linux-tools-common linux-tools-generic + +.. note:: + The bpftool version often matches the kernel version. Ensure you have a recent version installed. + +Additional Library Dependencies +================================ + +yaml-cpp +-------- + +**Purpose**: Configuration file parsing (YAML format) + +DataCrumbs uses YAML for configuration files that define: + +* Host-specific settings +* Probe configurations +* Capture rules + +Installation: + +.. code-block:: bash + + # From source + git clone https://github.com/jbeder/yaml-cpp.git + cd yaml-cpp + mkdir build && cd build + cmake -DYAML_BUILD_SHARED_LIBS=ON .. + make + sudo make install + + # From package manager + # CentOS/Rocky Linux + sudo dnf install yaml-cpp-devel + + # Ubuntu/Debian + sudo apt-get install libyaml-cpp-dev + +json-c +------ + +**Purpose**: JSON data handling for trace output and data files + +DataCrumbs uses JSON for: + +* Probe metadata storage +* Category definitions +* Internal data exchange + +Installation: + +.. code-block:: bash + + # From package manager + # CentOS/Rocky Linux + sudo dnf install json-c-devel + + # Ubuntu/Debian + sudo apt-get install libjson-c-dev + +libelf +------ + +**Purpose**: ELF (Executable and Linkable Format) file parsing + +Required for: + +* Discovering symbols in libraries +* Attaching probes to functions +* Reading binary metadata + +Installation: + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install elfutils-libelf-devel + + # Ubuntu/Debian + sudo apt-get install libelf-dev + +zlib +---- + +**Purpose**: Trace data compression + +DataCrumbs can compress trace output to reduce storage requirements. + +Installation: + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install zlib-devel + + # Ubuntu/Debian + sudo apt-get install zlib1g-dev + +Optional Dependencies +===================== + +patchelf +-------- + +**Purpose**: Binary patching for track/untrack functionality + +Required only if you plan to use ``datacrumbs_track`` and ``datacrumbs_untrack`` scripts to permanently instrument binaries. + +Installation: + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install patchelf + + # Ubuntu/Debian + sudo apt-get install patchelf + +MPI Implementation +------------------ + +**Purpose**: MPI-IO tracing support + +If tracing MPI applications, install an MPI implementation: + +.. code-block:: bash + + # OpenMPI + sudo dnf install openmpi-devel + + # Or MPICH + sudo dnf install mpich-devel + + # Load MPI module (if using environment modules) + module load openmpi + +HDF5 +---- + +**Purpose**: HDF5 I/O tracing support + +For applications using HDF5: + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install hdf5-devel + + # Ubuntu/Debian + sudo apt-get install libhdf5-dev + +Python Dependencies (for Analysis) +=================================== + +The analysis tools in ``analysis/`` directory require Python 3.8+ with the following packages: + +.. code-block:: bash + + pip install -r analysis/requirements.txt + +Key packages: + +- ``pandas``: Data analysis +- ``matplotlib``: Visualization +- ``jupyter``: Interactive notebooks +- ``numpy``: Numerical operations + +Kernel Headers +============== + +DataCrumbs needs access to kernel headers for eBPF compilation. + +Installation: + +.. code-block:: bash + + # CentOS/Rocky Linux + sudo dnf install kernel-devel kernel-headers + + # Ubuntu/Debian + sudo apt-get install linux-headers-$(uname -r) + +The kernel headers should be located at: + +- ``/usr/src/kernels/`` +- ``/lib/modules/$(uname -r)/build`` + +You can specify a custom path using the ``DATACRUMBS_KERNEL_HEADERS_PATH`` CMake variable. + +Verifying Dependencies +====================== + +Before building, verify all required dependencies are available: + +.. code-block:: bash + + # Check kernel version + uname -r + + # Check for BTF support + ls /sys/kernel/btf/vmlinux + + # Check libbpf + pkg-config --modversion libbpf + + # Check bpftool + bpftool version + + # Check compiler + gcc --version + clang --version + +Complete Dependency Installation +================================= + +CentOS/Rocky Linux 8 +-------------------- + +.. code-block:: bash + + # System tools + sudo dnf install -y gcc gcc-c++ clang llvm make cmake git + sudo dnf install -y kernel-devel kernel-headers + + # eBPF tools + sudo dnf install -y libbpf-devel bpftool + + # Libraries + sudo dnf install -y elfutils-libelf-devel yaml-cpp-devel json-c-devel zlib-devel + + # Optional tools + sudo dnf install -y patchelf + + # MPI (optional) + sudo dnf install -y openmpi-devel + + # HDF5 (optional) + sudo dnf install -y hdf5-devel + +Ubuntu 22.04 +------------ + +.. code-block:: bash + + # System tools + sudo apt-get update + sudo apt-get install -y build-essential clang llvm cmake git + sudo apt-get install -y linux-headers-$(uname -r) + + # eBPF tools + sudo apt-get install -y libbpf-dev linux-tools-common linux-tools-generic + + # Libraries + sudo apt-get install -y libelf-dev libyaml-cpp-dev libjson-c-dev zlib1g-dev + + # Optional tools + sudo apt-get install -y patchelf + + # MPI (optional) + sudo apt-get install -y libopenmpi-dev + + # HDF5 (optional) + sudo apt-get install -y libhdf5-dev + +Troubleshooting +=============== + +BTF Not Available +----------------- + +If ``/sys/kernel/btf/vmlinux`` doesn't exist: + +1. Upgrade to a newer kernel (5.8+ recommended) +2. Rebuild kernel with ``CONFIG_DEBUG_INFO_BTF=y`` +3. Use ``DATACRUMBS_KERNEL_HEADERS_PATH`` to point to kernel sources + +libbpf Version Too Old +---------------------- + +If package manager version is < 1.5.0: + +.. code-block:: bash + + # Build from source + git clone https://github.com/libbpf/libbpf.git + cd libbpf/src + git checkout v1.5.0 + make + sudo make install + sudo ldconfig + +Permission Issues +----------------- + +eBPF operations require elevated privileges: + +* Run DataCrumbs server components with ``sudo`` +* Ensure user is in appropriate groups (e.g., ``bpf`` group if available) +* Check ``/proc/sys/kernel/unprivileged_bpf_disabled`` setting diff --git a/docs/deployment.rst b/docs/deployment.rst new file mode 100755 index 00000000..b9abca9b --- /dev/null +++ b/docs/deployment.rst @@ -0,0 +1,595 @@ +=================== +Deployment for HPC +=================== + +DataCrumbs can be deployed on HPC systems in multiple ways to allow users to trace their applications. This guide covers deployment methods for multi-user environments where administrators need to grant users access to DataCrumbs functionality. + +Deployment Overview +=================== + +There are two primary deployment approaches: + +1. **Sudoers Access**: Grant specific users permission to start/stop the DataCrumbs server via sudo +2. **Scheduler Integration**: Use job scheduler prolog/epilog scripts to manage DataCrumbs automatically + +.. list-table:: Deployment Method Comparison + :header-rows: 1 + :widths: 25 35 40 + + * - Method + - Best For + - Characteristics + * - Sudoers Access + - Interactive development, small teams + - User-initiated, explicit control, manual start/stop + * - Scheduler Integration + - Production workloads, large deployments + - Automatic, transparent, per-job isolation + +Method 1: Sudoers File Access +============================== + +This method grants specific users permission to run DataCrumbs server control scripts without requiring full root privileges. + +Overview +-------- + +Users can: + +- Start DataCrumbs server with ``sudo datacrumbs_server_run.sh`` +- Stop DataCrumbs server with ``sudo datacrumbs_server_stop.sh`` +- Cannot modify DataCrumbs installation or configuration +- Cannot access other users' trace data + +Sudoers Configuration +--------------------- + +**Step 1: Create sudoers configuration file** + +Create ``/etc/sudoers.d/datacrumbs`` with the following content: + +.. code-block:: bash + + # Allow specific users to run DataCrumbs server control scripts + + # Define user aliases (customize for your site) + User_Alias DATACRUMBS_USERS = user1, user2, user3, %hpc_group + + # Define command aliases + Cmnd_Alias DATACRUMBS_START = /opt/datacrumbs/sbin/datacrumbs_server_run.sh + Cmnd_Alias DATACRUMBS_STOP = /opt/datacrumbs/sbin/datacrumbs_server_stop.sh + Cmnd_Alias DATACRUMBS_SERVICE_START = /opt/datacrumbs/sbin/datacrumbs_service_run.sh + Cmnd_Alias DATACRUMBS_SERVICE_STOP = /opt/datacrumbs/sbin/datacrumbs_service_stop.sh + + # Grant permissions (no password required) + DATACRUMBS_USERS ALL = (root) NOPASSWD: DATACRUMBS_START, DATACRUMBS_STOP + DATACRUMBS_USERS ALL = (root) NOPASSWD: DATACRUMBS_SERVICE_START, DATACRUMBS_SERVICE_STOP + +.. important:: + Replace ``/opt/datacrumbs`` with your actual DataCrumbs installation prefix. + +**Step 2: Set correct permissions** + +.. code-block:: bash + + # Set ownership and permissions + sudo chown root:root /etc/sudoers.d/datacrumbs + sudo chmod 0440 /etc/sudoers.d/datacrumbs + + # Validate sudoers syntax + sudo visudo -c -f /etc/sudoers.d/datacrumbs + +**Step 3: Verify configuration** + +.. code-block:: bash + + # Test as regular user + sudo -l + + # Expected output should include: + # User may run the following commands: + # (root) NOPASSWD: /opt/datacrumbs/sbin/datacrumbs_server_run.sh + # (root) NOPASSWD: /opt/datacrumbs/sbin/datacrumbs_server_stop.sh + +User-Specific Configuration +---------------------------- + +**Allow per-user DataCrumbs access:** + +.. code-block:: bash + + # In /etc/sudoers.d/datacrumbs + User_Alias DATACRUMBS_ADMINS = admin1, admin2 + User_Alias DATACRUMBS_BASIC_USERS = user1, user2, %research_group + + # Admins can run all DataCrumbs commands + DATACRUMBS_ADMINS ALL = (root) NOPASSWD: /opt/datacrumbs/sbin/* + + # Basic users can only start/stop their own servers + DATACRUMBS_BASIC_USERS ALL = (root) NOPASSWD: DATACRUMBS_START, DATACRUMBS_STOP + +Group-Based Access +------------------ + +Grant access to entire groups: + +.. code-block:: bash + + # In /etc/sudoers.d/datacrumbs + + # Allow all users in 'hpc' group + %hpc ALL = (root) NOPASSWD: DATACRUMBS_START, DATACRUMBS_STOP + + # Allow all users in multiple groups + User_Alias DATACRUMBS_USERS = %hpc, %research, %developers + +Usage by Regular Users +----------------------- + +Once configured, users can start and stop DataCrumbs: + +.. code-block:: bash + + # Start DataCrumbs server + sudo datacrumbs_server_run.sh --user $USER + + # Stop DataCrumbs server + sudo datacrumbs_server_stop.sh --user $USER + + # With service mode + sudo datacrumbs_service_run.sh --user $USER + sudo datacrumbs_service_stop.sh --user $USER + +Security Considerations +----------------------- + +.. warning:: + - Only grant access to trusted users + - Regularly audit sudoers configuration + - Monitor DataCrumbs server processes + - Review trace logs for unauthorized access + +Best practices: + +1. Use specific command paths (not wildcards like ``/opt/datacrumbs/*``) +2. Require users to specify ``--user $USER`` to prevent impersonation +3. Set up log monitoring: ``/var/log/auth.log`` tracks sudo usage +4. Implement quota limits on trace storage directories +5. Rotate trace logs regularly + +Restricting Commands +-------------------- + +Limit users to specific DataCrumbs configurations: + +.. code-block:: bash + + # Only allow specific configurations + Cmnd_Alias DATACRUMBS_SAFE_START = /opt/datacrumbs/sbin/datacrumbs_server_run.sh --user *, \ + --config standard + + DATACRUMBS_USERS ALL = (root) NOPASSWD: DATACRUMBS_SAFE_START + +Method 2: Scheduler Integration +================================ + +Automatic DataCrumbs management via job scheduler prolog and epilog scripts. This is the recommended approach for production HPC environments. + +Overview +-------- + +The scheduler automatically: + +- Starts DataCrumbs server when job begins (prolog) +- Stops DataCrumbs server when job completes (epilog) +- Isolates tracing to specific jobs +- No user intervention required + +Supported Schedulers +-------------------- + +* **Flux**: Full support with systemd integration +* **Slurm**: Supported via prolog/epilog scripts + +Flux Integration +================ + +DataCrumbs integrates with Flux resource manager using systemd services and prolog/epilog scripts. + +For complete Flux deployment instructions, see :doc:`flux_integration`. + +Quick Flux Setup +---------------- + +**Step 1: Install systemd service** + +.. code-block:: bash + + # Copy service file to all nodes + for node in node{1..10}; do + sudo scp $PREFIX/etc/datacrumbs/systemd/datacrumbs@.service \ + $node:/etc/systemd/system/ + done + + # Reload systemd + sudo systemctl daemon-reload + +**Step 2: Install prolog/epilog scripts** + +.. code-block:: bash + + # On all Flux nodes + sudo ln -s $PREFIX/sbin/datacrumbs_service_run.sh \ + /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + + sudo ln -s $PREFIX/sbin/datacrumbs_service_stop.sh \ + /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + + # Make executable + sudo chmod u+x /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + sudo chmod u+x /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + +**Step 3: Configure Flux job manager** + +Edit ``/etc/flux/system/conf.d/job-manager.toml``: + +.. code-block:: toml + + [job-manager] + plugins = [ + { load = "prolog-job-manager.so" }, + { load = "epilog.so" } + ] + +**Step 4: Install Flux CLI Plugin** + +The Flux CLI plugin can be installed system-wide or per-user. + +**Option A: System-wide installation (recommended for HPC)** + +.. code-block:: bash + + # Create flux plugins directory if it doesn't exist + sudo mkdir -p /etc/flux/cli/plugins + + # Copy the DataCrumbs plugin + sudo cp $PREFIX/etc/datacrumbs/flux/cli/plugins/datacrumbs.py \ + /etc/flux/cli/plugins/ + + # Set permissions for all users + sudo chmod 644 /etc/flux/cli/plugins/datacrumbs.py + +**Option B: Per-user installation** + +.. code-block:: bash + + # Create user plugin directory + mkdir -p ~/plugins + + # Copy the DataCrumbs plugin + cp $PREFIX/etc/datacrumbs/flux/cli/plugins/datacrumbs.py ~/plugins/ + + # Set environment variable (add to ~/.bashrc for persistence) + export FLUX_CLI_PLUGINPATH=~/plugins/ + + # Use with flux commands + flux run --datacrumbs-enable ./my-application + +**Step 5: Restart Flux** + +.. code-block:: bash + + # On broker-0 node + sudo /admin/scripts/flux_reconfig.sh + flux config reload + +Multi-Node Deployment +--------------------- + +Deploy to all nodes in a cluster: + +.. code-block:: bash + + #!/bin/bash + # deploy_datacrumbs.sh + + NODES="node{1..10}" + DATACRUMBS_INSTALL=/opt/datacrumbs + + for node in $(eval echo $NODES); do + echo "Deploying to $node..." + + # Install systemd service + sudo scp ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service \ + ${node}:/etc/systemd/system/ + + # Install prolog/epilog via symbolic links + sudo ssh $node << 'EOF' + # Remove old links + rm -f /etc/flux/system/prolog-job-manager.d/datacrumbs* + rm -f /etc/flux/system/epilog.d/datacrumbs* + + # Create new links + ln -s ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh \ + /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + ln -s ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh \ + /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + + # Set permissions + chmod u+x /etc/flux/system/prolog-job-manager.d/datacrumbs* + chmod u+x /etc/flux/system/epilog.d/datacrumbs* + + # Reload systemd + systemctl daemon-reload + EOF + done + + # Install Flux CLI plugin on broker node (system-wide) + echo "Installing Flux CLI plugin" + sudo mkdir -p /etc/flux/cli/plugins + sudo cp ${DATACRUMBS_INSTALL}/etc/datacrumbs/flux/cli/plugins/datacrumbs.py \ + /etc/flux/cli/plugins/ + sudo chmod 644 /etc/flux/cli/plugins/datacrumbs.py + + # Alternative: Install per-user (optional) + # mkdir -p ~/plugins + # cp ${DATACRUMBS_INSTALL}/etc/datacrumbs/flux/cli/plugins/datacrumbs.py ~/plugins/ + # echo "export FLUX_CLI_PLUGINPATH=~/plugins/" >> ~/.bashrc + +User Workflow with Flux +------------------------ + +Users submit jobs normally with optional DataCrumbs flags: + +.. code-block:: bash + + # Enable DataCrumbs for job + flux run -N 4 --datacrumbs-enable ./my-application + + # With composable configuration + flux run -N 4 \ + --datacrumbs-enable \ + --datacrumbs-composite=posix_only \ + ./my-application + +If using per-user plugin installation: + +.. code-block:: bash + + # Set plugin path (or add to ~/.bashrc) + export FLUX_CLI_PLUGINPATH=~/plugins/ + + # Then use flux commands normally + flux run -N 4 --datacrumbs-enable ./my-application + +No explicit DataCrumbs commands needed - prolog/epilog handle everything. + + + +Slurm Integration +================= + +DataCrumbs can be integrated with Slurm using similar prolog/epilog mechanisms. + +Slurm Configuration +------------------- + +**Step 1: Create prolog script** + +Create ``/etc/slurm/prolog.d/datacrumbs.sh``: + +.. code-block:: bash + + #!/bin/bash + # /etc/slurm/prolog.d/datacrumbs.sh + + # Load DataCrumbs environment + export DATACRUMBS_INSTALL=/opt/datacrumbs + source ${DATACRUMBS_INSTALL}/bin/datacrumbs_setup + + # Start DataCrumbs server for job user + if [[ "${SLURM_JOB_USER}" != "" ]]; then + ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh \ + --user ${SLURM_JOB_USER} \ + --jobid ${SLURM_JOB_ID} + fi + +**Step 2: Create epilog script** + +Create ``/etc/slurm/epilog.d/datacrumbs.sh``: + +.. code-block:: bash + + #!/bin/bash + # /etc/slurm/epilog.d/datacrumbs.sh + + export DATACRUMBS_INSTALL=/opt/datacrumbs + source ${DATACRUMBS_INSTALL}/bin/datacrumbs_setup + + # Stop DataCrumbs server for job user + if [[ "${SLURM_JOB_USER}" != "" ]]; then + ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh \ + --user ${SLURM_JOB_USER} \ + --jobid ${SLURM_JOB_ID} + fi + +**Step 3: Configure Slurm** + +Edit ``/etc/slurm/slurm.conf``: + +.. code-block:: ini + + # Enable prolog/epilog + Prolog=/etc/slurm/prolog.d/datacrumbs.sh + Epilog=/etc/slurm/epilog.d/datacrumbs.sh + + # Set timeouts + PrologFlags=Alloc + EpilogMsgTime=30 + +**Step 4: Set permissions and restart** + +.. code-block:: bash + + # Set script permissions + sudo chmod 755 /etc/slurm/prolog.d/datacrumbs.sh + sudo chmod 755 /etc/slurm/epilog.d/datacrumbs.sh + + # Restart Slurm + sudo systemctl restart slurmctld + sudo systemctl restart slurmd + +User Workflow with Slurm +------------------------- + +Users submit jobs normally: + +.. code-block:: bash + + # Submit batch job + sbatch --nodes=4 my-job.sh + + # Interactive job + salloc --nodes=4 + srun ./my-application + +DataCrumbs automatically traces the application. + +Verification and Testing +======================== + +After deployment, verify DataCrumbs is working correctly. + +Test Sudoers Access +------------------- + +.. code-block:: bash + + # As regular user + sudo datacrumbs_server_run.sh --user $USER --verbose + + # Check server is running + ps aux | grep datacrumbs + + # Stop server + sudo datacrumbs_server_stop.sh --user $USER --verbose + +Test Scheduler Integration +--------------------------- + +.. code-block:: bash + + # Submit simple test job (Flux) + flux run -N 1 hostname + + # Check for DataCrumbs traces + ls -la /tmp/datacrumbs_${USER}*/traces/ + + # Submit with explicit enable (Slurm) + sbatch test-job.sh + +Monitor Deployment +------------------ + +Check systemd service status: + +.. code-block:: bash + + # View service status + sudo systemctl status datacrumbs@${USER} + + # View service logs + sudo journalctl -u datacrumbs@${USER} -f + +Check prolog/epilog execution: + +.. code-block:: bash + + # Flux prolog/epilog logs + sudo journalctl -u flux* --no-pager | grep datacrumbs + + # Slurm logs + sudo tail -f /var/log/slurm/slurmctld.log | grep -i prolog + +Troubleshooting Deployment +=========================== + +Common Issues +------------- + +**"Permission denied" when starting server** + +.. code-block:: bash + + # Check sudoers configuration + sudo visudo -c -f /etc/sudoers.d/datacrumbs + + # Verify user is in allowed group + groups $USER + +**Prolog/epilog scripts not executing** + +.. code-block:: bash + + # Flux: Check plugin configuration + flux config get job-manager.plugins + + # Slurm: Check slurm.conf + grep -i prolog /etc/slurm/slurm.conf + + # Verify script permissions + ls -la /etc/flux/system/prolog-job-manager.d/ + ls -la /etc/slurm/prolog.d/ + +**Systemd service fails to start** + +.. code-block:: bash + + # Check service status + sudo systemctl status datacrumbs@${USER} + + # View detailed logs + sudo journalctl -xe -u datacrumbs@${USER} + + # Verify service file + sudo systemctl cat datacrumbs@.service + +**Traces not being generated** + +.. code-block:: bash + + # Check trace directory permissions + ls -la /tmp/datacrumbs_${USER}*/ + + # Verify DataCrumbs binary has correct capabilities + getcap $PREFIX/bin/datacrumbs + + # Should show: cap_bpf,cap_perfmon+ep + +Cleanup and Uninstallation +=========================== + +Remove sudoers configuration: + +.. code-block:: bash + + sudo rm /etc/sudoers.d/datacrumbs + +Remove Flux integration: + +.. code-block:: bash + + # On all nodes + sudo rm /etc/flux/system/prolog-job-manager.d/datacrumbs* + sudo rm /etc/flux/system/epilog.d/datacrumbs* + sudo rm /etc/systemd/system/datacrumbs@.service + sudo systemctl daemon-reload + +Remove Slurm integration: + +.. code-block:: bash + + sudo rm /etc/slurm/prolog.d/datacrumbs.sh + sudo rm /etc/slurm/epilog.d/datacrumbs.sh + # Edit /etc/slurm/slurm.conf to remove Prolog/Epilog lines + sudo systemctl restart slurmctld diff --git a/docs/ebpf_background.rst b/docs/ebpf_background.rst new file mode 100755 index 00000000..50167bdd --- /dev/null +++ b/docs/ebpf_background.rst @@ -0,0 +1,166 @@ +=================== +eBPF Background +=================== + +What is eBPF? +============= + +eBPF (extended Berkeley Packet Filter) is a revolutionary technology that allows running sandboxed programs in the Linux kernel without changing kernel source code or loading kernel modules. Originally designed for network packet filtering, eBPF has evolved into a general-purpose execution engine that can be used for a wide variety of use cases. + +How eBPF Works +============== + +eBPF programs are written in a restricted C subset, compiled to eBPF bytecode, and loaded into the kernel. The kernel verifies the program for safety before executing it, ensuring: + +* **Memory Safety**: Programs cannot access arbitrary memory locations +* **Termination**: Programs must terminate (no infinite loops) +* **Bounded Execution**: Programs have limited instruction count and stack size + +Key Components +-------------- + +1. **eBPF Programs**: Small programs that execute in kernel space +2. **eBPF Maps**: Key-value data structures for sharing data between kernel and user space +3. **eBPF Verifier**: Ensures program safety before execution +4. **BPF Type Format (BTF)**: Provides type information for eBPF programs +5. **Helper Functions**: Kernel-provided functions that eBPF programs can call + +eBPF in DataCrumbs +================== + +DataCrumbs leverages eBPF technology to provide low-overhead I/O tracing capabilities. The tool uses several eBPF features: + +Kprobes and Uprobes +------------------- + +* **Kprobes**: Attach eBPF programs to kernel functions for tracing system calls and kernel-level I/O operations +* **Uprobes**: Attach eBPF programs to user-space functions in libraries (libc, libhdf5, etc.) + +These probes allow DataCrumbs to intercept function calls without modifying the application or kernel code. + +Ring Buffers +------------ + +DataCrumbs uses eBPF ring buffers (introduced in Linux 5.8) for efficient data transfer from kernel to user space. Ring buffers provide: + +* High-throughput event delivery +* Low latency +* Memory efficiency +* Multi-producer, single-consumer semantics + +Maps for State Management +-------------------------- + +eBPF maps store: + +* Process tracking information +* File descriptor mappings +* Thread-local data +* Aggregated statistics + +Advantages of eBPF for I/O Tracing +=================================== + +Minimal Overhead +---------------- + +eBPF programs execute directly in the kernel with JIT compilation, resulting in near-native performance. DataCrumbs typically adds less than 5% overhead to application execution. + +Safety and Stability +-------------------- + +The eBPF verifier ensures that programs cannot crash the kernel or compromise system security. This makes DataCrumbs safe to use in production environments. + +Dynamic Instrumentation +------------------------ + +eBPF programs can be loaded and unloaded dynamically without rebooting the system or restarting applications. This allows DataCrumbs to: + +* Start and stop tracing on demand +* Update probe configurations at runtime +* Trace running applications without interruption + +No Code Modification +-------------------- + +Applications do not need to be recompiled or modified to be traced by DataCrumbs. The tool can trace: + +* Binary-only applications +* Third-party libraries +* System calls +* Custom functions + +eBPF Limitations +================ + +Kernel Version Requirements +--------------------------- + +eBPF features have evolved over time, with different capabilities available in different kernel versions: + +* **Linux 4.18**: Basic eBPF support with compatibility layers +* **Linux 5.1+**: Modern eBPF features +* **Linux 5.8+**: Full modern eBPF features with BPF ring buffers (recommended) + +Stack Size Limits +----------------- + +eBPF programs have a limited stack size (512 bytes). DataCrumbs works around this by: + +* Using per-CPU maps for temporary storage +* Minimizing stack variable usage +* Splitting complex operations across multiple helper functions + +Verifier Restrictions +--------------------- + +The eBPF verifier imposes restrictions on: + +* Loop complexity (bounded loops only in newer kernels) +* Function calls (limited call depth) +* Memory access patterns (must be verified safe) + +DataCrumbs handles these restrictions through careful program design and code generation. + +eBPF Tools and Ecosystem +========================= + +libbpf +------ + +DataCrumbs uses **libbpf** (version 1.5.0+) as the primary library for: + +* Loading eBPF programs into the kernel +* Managing eBPF maps +* Attaching probes to functions +* Handling BTF information + +bpftool +------- + +**bpftool** (version 7.5.0+) is used during the build process for: + +* Generating vmlinux.h (kernel type definitions) +* Creating BPF object files +* Generating skeleton headers for C programs +* Inspecting loaded eBPF programs (debugging) + +BCC vs libbpf +------------- + +DataCrumbs uses the **libbpf** approach rather than BCC (BPF Compiler Collection) because: + +* **Portability**: libbpf-based programs are compiled once and run anywhere +* **Performance**: No runtime compilation overhead +* **Dependencies**: Smaller dependency footprint +* **Distribution**: Easier to package and deploy + +Further Reading +=============== + +For more information about eBPF: + +- `eBPF.io `_ - Official eBPF documentation +- `libbpf Documentation `_ - libbpf API reference +- `Kernel Documentation `_ - Linux kernel eBPF docs +- `BPF Performance Tools `_ - Book by Brendan Gregg diff --git a/docs/flux_integration.rst b/docs/flux_integration.rst new file mode 100755 index 00000000..d77a1b80 --- /dev/null +++ b/docs/flux_integration.rst @@ -0,0 +1,670 @@ +============================ +Flux Scheduler Integration +============================ + +DataCrumbs provides deep integration with the Flux resource manager for automated tracing in HPC environments. This integration enables transparent tracing of batch jobs through Flux job manager prologs/epilogs and systemd service management. + +Overview +======== + +The Flux integration consists of three components: + +1. **Systemd Service**: Manages DataCrumbs server lifecycle +2. **Prolog Script**: Starts DataCrumbs before job execution +3. **Epilog Script**: Stops DataCrumbs after job completion +4. **Flux Plugin**: Provides command-line options for users + +Benefits +-------- + +* **Automatic Tracing**: Jobs are traced transparently without manual server management +* **Per-Job Isolation**: Each job gets its own tracing session +* **Custom Configurations**: Users can specify composable configurations +* **No Code Changes**: Applications remain unmodified +* **Centralized Management**: Administrators control tracing infrastructure + +Architecture +============ + +When a Flux job is submitted with ``--datacrumbs-enable``: + +1. **Prolog Phase** (before job starts): + + - ``datacrumbs_service_run.sh`` is executed + - Systemd service ``datacrumbs@`` is created and started + - DataCrumbs server begins collecting events + - Job waits for server to be ready + +2. **Execution Phase**: + + - Application runs normally with tracing active + - eBPF probes capture I/O events + - Events are written to trace files + +3. **Epilog Phase** (after job completes): + + - ``datacrumbs_service_stop.sh`` is executed + - Systemd service is stopped and disabled + - Server flushes remaining events + - Trace files are finalized + +Installation Steps +================== + +.. note:: + Installation requires root/administrator privileges on all compute nodes. + +Step 1: Enable Flux Prolog/Epilog +---------------------------------- + +Edit the Flux job manager configuration file on the broker node: + +.. code-block:: bash + + # On Flux broker-0 node + sudo vi /etc/flux/system/conf.d/job-manager.toml + +Add or ensure the following configuration: + +.. code-block:: toml + + [job-manager] + + # Enable prolog execution + prolog.command = [ + "/etc/flux/system/prolog-job-manager.d/*", + ] + + # Enable epilog execution + epilog.command = [ + "/etc/flux/system/epilog.d/*", + ] + +Step 2: Install Systemd Service +-------------------------------- + +Install the DataCrumbs systemd service file on all compute nodes: + +**Service file location:** ``/etc/datacrumbs/systemd/datacrumbs@.service`` + +.. code-block:: bash + + # On each compute node + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create symlink to systemd directory + sudo ln -s ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service \\ + /etc/systemd/system/datacrumbs@.service + + # Reload systemd + sudo systemctl daemon-reload + + # Verify service is recognized + systemctl status datacrumbs@test.service + +**Automated deployment** across multiple nodes: + +.. code-block:: bash + + # Example for nodes lead2-lead6, lead9-lead11 + NODES=\"lead{2..6} lead{9..11}\" + + for node in $NODES; do + echo \"Installing on $node\" + ssh $node \"sudo ln -sf ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service /etc/systemd/system/ && sudo systemctl daemon-reload\" + done + +Step 3: Install Prolog Script +------------------------------ + +Install the prolog script that starts DataCrumbs: + +**Script location:** ``/sbin/datacrumbs_service_run.sh`` + +.. code-block:: bash + + # On each compute node + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create symlink to prolog directory + sudo ln -s ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh \\ + /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + + # Make executable + sudo chmod u+x /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + +**Automated deployment:** + +.. code-block:: bash + + NODES=\"lead{2..6} lead{9..11}\" + + for node in $NODES; do + echo \"Installing prolog on $node\" + ssh $node \"sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh /etc/flux/system/prolog-job-manager.d/ && sudo chmod u+x /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh\" + done + +Step 4: Install Epilog Script +------------------------------ + +Install the epilog script that stops DataCrumbs: + +**Script location:** ``/sbin/datacrumbs_service_stop.sh`` + +.. code-block:: bash + + # On each compute node + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create symlink to epilog directory + sudo ln -s ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh \\ + /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + + # Make executable + sudo chmod u+x /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + +**Automated deployment:** + +.. code-block:: bash + + NODES=\"lead{2..6} lead{9..11}\" + + for node in $NODES; do + echo \"Installing epilog on $node\" + ssh $node \"sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh /etc/flux/system/epilog.d/ && sudo chmod u+x /etc/flux/system/epilog.d/datacrumbs_service_stop.sh\" + done + +Step 5: Install Flux Plugin +---------------------------- + +Install the Flux CLI plugin for DataCrumbs command-line options: + +**Plugin location:** ``/etc/datacrumbs/flux/cli/plugins/datacrumbs.py`` + +.. code-block:: bash + + # On Flux broker node (or all nodes with flux CLI) + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + + # Create flux plugins directory if it doesn't exist + sudo mkdir -p /etc/flux/cli/plugins + + # Copy plugin file + sudo cp ${DATACRUMBS_INSTALL}/etc/datacrumbs/flux/cli/plugins/datacrumbs.py \\ + /etc/flux/cli/plugins/ + + # Set permissions + sudo chmod 644 /etc/flux/cli/plugins/datacrumbs.py + +**Verify plugin installation:** + +.. code-block:: bash + + # Check if plugin is loaded + flux run --help | grep datacrumbs + + # Should show: + # --datacrumbs-enable Enable datacrumbs + # --datacrumbs-composite COMPOSITE + # Set composite name for datacrumbs + +Step 6: Restart Flux (if needed) +--------------------------------- + +After modifying ``job-manager.toml``, reload Flux configuration: + +.. code-block:: bash + + # On broker-0 node only + flux config reload + +If prolog/epilog entries were added for the first time, a full Flux restart may be required. Consult your system administrator. + +Complete Installation Script +============================= + +Here's a complete script for deploying across multiple nodes: + +.. code-block:: bash + + #!/bin/bash + # deploy_datacrumbs_flux.sh + + # Configuration + DATACRUMBS_INSTALL=/path/to/datacrumbs/install + NODES=\"lead{2..6} lead{9..11}\" + + echo \"Deploying DataCrumbs Flux integration...\" + + # Deploy to each node + for node in $(eval echo $NODES); do + echo \"==========================================\" + echo \"Deploying to $node\" + echo \"==========================================\" + + ssh $node << EOF + # Install systemd service + sudo ln -sf ${DATACRUMBS_INSTALL}/etc/datacrumbs/systemd/datacrumbs@.service \\ + /etc/systemd/system/datacrumbs@.service + sudo systemctl daemon-reload + + # Install prolog script + sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_run.sh \\ + /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + sudo chmod u+x /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + + # Install epilog script + sudo ln -sf ${DATACRUMBS_INSTALL}/sbin/datacrumbs_service_stop.sh \\ + /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + sudo chmod u+x /etc/flux/system/epilog.d/datacrumbs_service_stop.sh + + # Clean old runtime files + sudo rm -rf /tmp/datacrumbs* + sudo rm -rf /var/run/datacrumbs* + + echo \"✓ Installation complete on $node\" + EOF + done + + # Install Flux plugin on broker node + echo \"==========================================\" + echo \"Installing Flux plugin\" + echo \"==========================================\" + sudo mkdir -p /etc/flux/cli/plugins + sudo cp ${DATACRUMBS_INSTALL}/etc/datacrumbs/flux/cli/plugins/datacrumbs.py \\ + /etc/flux/cli/plugins/ + sudo chmod 644 /etc/flux/cli/plugins/datacrumbs.py + + echo \"✓ Flux plugin installed\" + echo \"\" + echo \"==========================================\" + echo \"Deployment complete!\" + echo \"==========================================\" + echo \"\" + echo \"Next steps:\" + echo \"1. Verify job-manager.toml has prolog/epilog configured\" + echo \"2. Run: flux config reload (on broker-0)\" + echo \"3. Test: flux run --datacrumbs-enable hostname\" + +Usage +===== + +Basic Usage +----------- + +Enable DataCrumbs for a Flux job: + +.. code-block:: bash + + flux run --datacrumbs-enable [OPTIONS] COMMAND + +Example: + +.. code-block:: bash + + # Single node job + flux run --datacrumbs-enable hostname + + # Multi-node job + flux run --datacrumbs-enable -N 4 -n 32 ./myapp + + # MPI application (Flux handles launch automatically) + flux run --datacrumbs-enable -N 8 -n 64 ./parallel_app + +With Custom Composable Configuration +------------------------------------- + +Specify a custom composable configuration: + +.. code-block:: bash + + flux run --datacrumbs-enable --datacrumbs-composite=CONFIG_NAME [OPTIONS] COMMAND + +Example: + +.. code-block:: bash + + # Use POSIX I/O configuration + flux run --datacrumbs-enable --datacrumbs-composite=posix_io \\ + -N 4 -n 32 ./io_benchmark + + # Use HDF5 configuration + flux run --datacrumbs-enable --datacrumbs-composite=hdf5_only \\ + -N 2 -n 16 ./hdf5_writer dataset.h5 + + # Use MPI-IO configuration + flux run --datacrumbs-enable --datacrumbs-composite=mpiio_only \\ + -N 8 -n 64 ./mpi_parallel_io + +Command Reference +================= + +Flux CLI Options +---------------- + +``--datacrumbs-enable`` + Enable DataCrumbs tracing for the job + + - Default: disabled + - No argument required + +``--datacrumbs-composite=NAME`` + Specify custom composable configuration + + - Requires ``--datacrumbs-enable`` + - NAME must be alphanumeric and underscores only + - Composable must exist (created with ``datacrumbs_compose``) + - If not specified, uses default full configuration + +Examples +======== + +Example 1: Simple Job with Tracing +----------------------------------- + +.. code-block:: bash + + # Submit job with tracing enabled + flux run --datacrumbs-enable -n 1 dd if=/dev/zero of=/tmp/test bs=1M count=100 + + # Check trace location (set in configuration) + ls $DATACRUMBS_TRACE_DIR/ + +Example 2: Batch Job with Custom Configuration +----------------------------------------------- + +.. code-block:: bash + + # Create custom configuration (one-time setup) + sudo datacrumbs_compose --action compose \\ + --name io_benchmark \\ + --probes open,close,read,write,pread64,pwrite64 + + # Submit batch job + flux batch --datacrumbs-enable --datacrumbs-composite=io_benchmark <---.pfw.gz + + # With MPI: + trace-----.pfw.gz + +**Example**: + +.. code-block:: bash + + # Single node job + /path/to/traces/25/11/21/trace-haridev-12345-node01-lead.pfw.gz + + # Multi-rank MPI job (4 ranks generate 4 trace files) + /path/to/traces/25/11/21/trace-haridev-67890-0-4-lead.pfw.gz + /path/to/traces/25/11/21/trace-haridev-67890-1-4-lead.pfw.gz + /path/to/traces/25/11/21/trace-haridev-67890-2-4-lead.pfw.gz + /path/to/traces/25/11/21/trace-haridev-67890-3-4-lead.pfw.gz + +Find traces for a specific job: + +.. code-block:: bash + + # Get job ID + JOBID=$(flux jobs --format=\"{id}\" | head -1) + + # Find trace files + find $DATACRUMBS_TRACE_DIR -name \"trace-*-${JOBID}-*.pfw.gz\" + + # List all traces from today + ls -lh $DATACRUMBS_TRACE_DIR/$(date +%y/%m/%d)/trace-*.pfw.gz + +Monitoring and Debugging +========================= + +Check Service Status +-------------------- + +.. code-block:: bash + + # Check if service is running for a job + JOBID= + systemctl status datacrumbs@${JOBID}.service + + # View service logs + sudo journalctl -u datacrumbs@${JOBID}.service -f + +Check Prolog/Epilog Execution +------------------------------ + +.. code-block:: bash + + # View Flux logs for prolog/epilog + flux dmesg | grep datacrumbs + + # View job exceptions + flux job eventlog | grep datacrumbs + +Debug Mode +---------- + +Enable verbose output in prolog/epilog scripts: + +.. code-block:: bash + + # Edit prolog script + sudo vi /etc/flux/system/prolog-job-manager.d/datacrumbs_service_run.sh + + # Add at the beginning: + export DATACRUMBS_VERBOSE=1 + +Troubleshooting +=============== + +Job Hangs at Prolog +-------------------- + +**Symptom**: Job hangs with message \"prolog running\" + +**Cause**: DataCrumbs server failed to start + +**Solution**: + +.. code-block:: bash + + # Check systemd service + sudo journalctl -u \"datacrumbs@*\" --no-pager + + # Check for permission issues + ls -la /var/run/datacrumbs/ + + # Verify server binary exists + ls -la $DATACRUMBS_INSTALL/sbin/datacrumbs + +Composable Not Found +-------------------- + +**Symptom**: Error about missing composable configuration + +**Cause**: Specified composable doesn't exist + +**Solution**: + +.. code-block:: bash + + # List available composables + ls $PREFIX/libexec/datacrumbs/sbin/$USER/ + + # Create if missing + sudo datacrumbs_compose --action compose --name --probes + +No Traces Generated +------------------- + +**Symptom**: Job completes but no trace files (``.pfw.gz``) created + +**Cause**: Multiple possible causes + +**Solution**: + +.. code-block:: bash + + # Check if trace files exist with correct naming + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + + # Check trace directory permissions + ls -la $DATACRUMBS_TRACE_DIR + + # Verify application was instrumented + # Applications MUST be tracked or wrapped before tracing works + ldd ./myapp | grep datacrumbs + + # Check service logs + sudo journalctl -u \"datacrumbs@*\" --since \"1 hour ago\" + + # Verify eBPF support + ls /sys/kernel/btf/vmlinux + + # Check for event drops + dmesg | grep -i bpf + +Service Won't Stop +------------------ + +**Symptom**: Epilog fails, service remains running + +**Cause**: Server process not responding + +**Solution**: + +.. code-block:: bash + + # Manually stop service + JOBID= + sudo systemctl stop datacrumbs@${JOBID}.service + + # Force kill if needed + sudo pkill -f \"datacrumbs.*${JOBID}\" + + # Clean up runtime files + sudo rm -rf /var/run/datacrumbs/*${JOBID}* + +Best Practices +============== + +1. **Test First**: Test integration on a single node before cluster-wide deployment +2. **Monitor Overhead**: Check that tracing overhead is acceptable for your workloads +3. **Use Composables**: Create workload-specific configurations to minimize overhead +4. **Regular Cleanup**: Periodically clean old trace files +5. **Log Rotation**: Configure log rotation for DataCrumbs and systemd logs +6. **Resource Limits**: Set appropriate ulimits in systemd service file +7. **Documentation**: Document custom composables and their use cases +8. **User Training**: Educate users on when and how to use ``--datacrumbs-enable`` +9. **Disk Space**: Ensure adequate space for trace files +10. **Backup Configs**: Keep backups of configuration files and composables + +Advanced Configuration +====================== + +Customizing Systemd Service +---------------------------- + +Edit the systemd service file to adjust timeouts, resources, etc.: + +.. code-block:: ini + + # /etc/systemd/system/datacrumbs@.service + [Unit] + Description=DataCrumbs I/O Tracer for Job %i + + [Service] + Type=forking + User=root + EnvironmentFile=/var/run/datacrumbs/datacrumbs-%i.env + ExecStart=/path/to/datacrumbs/sbin/datacrumbs ... + TimeoutStartSec=120s + TimeoutStopSec=60s + LimitNOFILE=1048576 + LimitMEMLOCK=infinity + +Per-User Trace Directories +--------------------------- + +Configure per-user trace directories in the project configuration: + +.. code-block:: yaml + + # project.yaml + trace: + dir_pattern: /scratch/${USER}/traces/%YY%/%MM%/%DD% + +Resource Quotas +--------------- + +Limit trace file size and count per user (filesystem-dependent): + +.. code-block:: bash + + # Example with XFS quotas + xfs_quota -x -c 'limit -u bsoft=100g bhard=120g $USER' /scratch + +Conditional Tracing +------------------- + +Enable tracing only for specific user groups or applications (modify prolog script): + +.. code-block:: bash + + # In datacrumbs_service_run.sh + # Only trace for specific users + if [[ ! \" user1 user2 user3 \" =~ \" $FLUX_JOB_USER \" ]]; then + exit 0 # Skip tracing + fi diff --git a/docs/index.rst b/docs/index.rst index e6f8ff48..a0e705e4 100755 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,20 +1,50 @@ -.. DFTracer documentation master file, created by +.. DataCrumbs documentation master file, created by sphinx-quickstart on Sun Nov 26 20:15:18 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. =============================================================================== -DFTracer: is a library for profiling I/O calls and application functions. +DataCrumbs: eBPF-based I/O Profiling and Tracing for HPC Applications =============================================================================== +DataCrumbs is a comprehensive I/O profiling and tracing tool designed for high-performance computing (HPC) environments. +It leverages eBPF (extended Berkeley Packet Filter) technology to provide low-overhead, real-time monitoring and +analysis of application I/O behavior at scale. + +.. toctree:: + :maxdepth: 2 + :caption: Getting Started + + introduction + ebpf_background + dependencies + +.. toctree:: + :maxdepth: 2 + :caption: Building and Setup + + build + setup + .. toctree:: :maxdepth: 2 :caption: User Guide + usage + integration + composability + +.. toctree:: + :maxdepth: 2 + :caption: Advanced Topics + + flux_integration + +.. toctree:: + :maxdepth: 2 + :caption: Legacy Documentation + overview - build - run - ================== Indices and tables diff --git a/docs/integration.rst b/docs/integration.rst new file mode 100755 index 00000000..f4f6f72d --- /dev/null +++ b/docs/integration.rst @@ -0,0 +1,762 @@ +========================= +Application Integration +========================= + +DataCrumbs provides multiple methods for integrating tracing into your applications without requiring source code modifications. + +Integration Methods +=================== + +DataCrumbs supports three primary integration methods: + +1. **Binary Tracking** (``datacrumbs_track``): Permanently modify executable to include tracing **(Recommended)** +2. **LD_PRELOAD Wrapping** (``datacrumbs_wrap``): Dynamically inject tracing at runtime +3. **Wrapper Mode** (``datacrumbs_run``): Automatic tracing with server management + +.. note:: + **Binary tracking is recommended** for most use cases. Tracked applications run normally when DataCrumbs is not active - they simply don't capture trace data. When the DataCrumbs server is running, data is automatically captured. + +Each method has different use cases and trade-offs. + +Method 1: Binary Tracking (Permanent) +====================================== + +Binary tracking uses ``patchelf`` to permanently add DataCrumbs client library as a dependency of your executable. + +When to Use +----------- + +**Recommended for most use cases:** + +- Applications you want traced every time they run +- Production deployments +- Applications that run frequently +- Long-running applications or daemons +- Scenarios where LD_PRELOAD is problematic +- Setuid/setgid binaries + +**Key benefit**: Tracked applications run normally when DataCrumbs is not active. When the server is running, data is captured automatically. When it's not running, the application executes with no tracing overhead. + +How It Works +------------ + +``datacrumbs_track`` modifies the ELF binary to add ``libdatacrumbs_client.so`` to the ``DT_NEEDED`` entries. The library is automatically loaded when the application starts. + +Tracking an Application +----------------------- + +**Command Reference:** + +.. code-block:: bash + + datacrumbs_track --executable PATH [OPTIONS] + +**Arguments:** + +``--executable PATH`` + Path to the executable to instrument (required) + +**Common Options:** + +``--verbose`` + Enable detailed output showing each step of the tracking process + +``--quiet`` + Suppress informational messages + +``--dry-run`` + Show what would be done without modifying the binary + +**Examples:** + +.. code-block:: bash + + # Track a local binary + datacrumbs_track --executable ./myapp + + # Track with verbose output + datacrumbs_track --executable ./myapp --verbose + + # Dry-run to see what would happen + datacrumbs_track --executable ./myapp --dry-run + + # Track a binary in PATH + datacrumbs_track --executable $(which python3) + + # Track with absolute path (quiet mode) + datacrumbs_track --executable /usr/local/bin/simulation --quiet + +Verification +------------ + +Verify the executable is tracked: + +.. code-block:: bash + + # Check for DataCrumbs library dependency + ldd ./myapp | grep datacrumbs + + # Should show: + # libdatacrumbs_client.so => /path/to/lib/libdatacrumbs_client.so + +Using Tracked Applications +--------------------------- + +Once tracked, the application is automatically traced whenever it runs (if the DataCrumbs server is active): + +.. code-block:: bash + + # Start server + sudo datacrumbs_server_run.sh + + # Run tracked application normally + ./myapp arg1 arg2 + + # Application is automatically traced + # Traces saved to $DATACRUMBS_TRACE_DIR + +Untracking an Application +-------------------------- + +Remove DataCrumbs instrumentation from a binary: + +**Command Reference:** + +.. code-block:: bash + + datacrumbs_untrack --executable PATH [OPTIONS] + +**Arguments:** + +``--executable PATH`` + Path to the executable to uninstrument (required) + +**Common Options:** + +``--verbose`` + Enable detailed output + +``--quiet`` + Suppress informational messages + +``--dry-run`` + Show what would be done without modifying the binary + +**Examples:** + +.. code-block:: bash + + # Untrack a binary + datacrumbs_untrack --executable ./myapp + + # Untrack with verbose output + datacrumbs_untrack --executable ./myapp --verbose + + # Dry-run to verify before untracking + datacrumbs_untrack --executable ./myapp --dry-run + + # Verify removal + ldd ./myapp | grep datacrumbs + # Should show no output + +Important Considerations +------------------------ + +**Backup Your Binaries** + +Always keep a backup before tracking: + +.. code-block:: bash + + cp myapp myapp.original + datacrumbs_track --executable myapp + +**Permissions** + +You need write permission on the binary: + +**Library Path** + +Ensure ``libdatacrumbs_client.so`` is in the library path: + +.. code-block:: bash + + # Add to LD_LIBRARY_PATH + export LD_LIBRARY_PATH=/path/to/datacrumbs/lib:$LD_LIBRARY_PATH + + # Or use module + module load datacrumbs/0.0.4 + +**Binary Compatibility** + +- Works with dynamically linked executables +- Does not work with static binaries +- May not work with binaries that check their own integrity + +Method 2: LD_PRELOAD Wrapping (Dynamic) +======================================== + +LD_PRELOAD wrapping dynamically injects the DataCrumbs client library without modifying the binary. + +When to Use +----------- + +- One-time or ad-hoc tracing +- Testing DataCrumbs before permanent tracking +- Binaries you cannot modify +- Applications where binary modification is undesirable +- System binaries or read-only executables + +How It Works +------------ + +``datacrumbs_wrap`` sets ``LD_PRELOAD`` to load ``libdatacrumbs_client.so`` before executing your application. The library intercepts I/O calls at runtime. + +Wrapping an Application +----------------------- + +**Command Reference:** + +.. code-block:: bash + + datacrumbs_wrap COMMAND [ARGS...] + +**Arguments:** + +``COMMAND`` + Command to execute with tracing + +``ARGS`` + Arguments to pass to the command + +**Examples:** + +.. code-block:: bash + + # Wrap a simple command + datacrumbs_wrap ./myapp input.dat + + # Wrap with multiple arguments + datacrumbs_wrap python3 analysis.py --input data.csv --output results.txt + + # Wrap a pipeline + datacrumbs_wrap bash -c "cat file.txt | ./process > output.txt" + + # Wrap with environment variables + datacrumbs_wrap env VAR=value ./myapp + +Using with Server +----------------- + +For LD_PRELOAD wrapping to work, the DataCrumbs server must be running: + +.. code-block:: bash + + # Start server + sudo datacrumbs_server_run.sh + + # Wrap and run application + datacrumbs_wrap ./myapp + + # Stop server when done + sudo datacrumbs_server_stop.sh + +Manual LD_PRELOAD +----------------- + +You can also manually set LD_PRELOAD: + +.. code-block:: bash + + # Set LD_PRELOAD + export LD_PRELOAD=/path/to/lib/libdatacrumbs_client.so + + # Run application + ./myapp + + # Unset when done + unset LD_PRELOAD + +Important Considerations +------------------------ + +**Security Restrictions** + +LD_PRELOAD is ignored for setuid/setgid binaries for security reasons: + +.. code-block:: bash + + # This won't work if myapp is setuid + datacrumbs_wrap /usr/bin/setuid_app + +**Environment Inheritance** + +Child processes inherit LD_PRELOAD: + +.. code-block:: bash + + # All processes in the pipeline are traced + datacrumbs_wrap bash -c "./step1 | ./step2 | ./step3" + +**Library Conflicts** + +Some applications may conflict with LD_PRELOAD: + +.. code-block:: bash + + # If application checks LD_PRELOAD + # Use track method instead + +**Performance** + +LD_PRELOAD adds minimal overhead compared to tracking (both use the same client library). + +Method 3: Wrapper Mode (Managed) +================================= + +The ``datacrumbs_run`` wrapper provides the easiest integration with automatic server management. + +When to Use +----------- + +- Quick, one-off tracing sessions +- Applications where you want automatic setup/teardown +- Testing or debugging scenarios +- When you don't want to manage the server manually + +How It Works +------------ + +``datacrumbs_run`` automatically: + +1. Configures the environment +2. Starts the DataCrumbs server +3. Runs your application (with internal tracking) +4. Stops the server +5. Collects and saves traces + +Using Wrapper Mode +------------------ + +See :doc:`usage` for detailed ``datacrumbs_run`` documentation. + +.. code-block:: bash + + # Simple usage + datacrumbs_run --app "./myapp args" + + # MPI application (launcher configured in project.yaml) + datacrumbs_run --app "./parallel_app" --enable_mpi --nodes 4 --ppn 8 + +Integration Comparison +====================== + ++------------------+-------------------+------------------+-------------------+-------------------+ +| Feature | Track | LD_PRELOAD | Wrapper | Best For | ++==================+===================+==================+===================+===================+ +| Setup Effort | One-time | Every run | Every run | Varies | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Binary Modified | Yes | No | No | LD_PRELOAD/Wrap | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Permanent | Yes | No | No | Track | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Server Needed | Manual start | Manual start | Auto-managed | Wrapper | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Overhead | Minimal | Minimal | Minimal | All equal | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Setuid Works | Yes | No | No | Track | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Ease of Use | Medium | Easy | Easiest | Wrapper | ++------------------+-------------------+------------------+-------------------+-------------------+ +| Production Use | Yes | Yes | Yes | All suitable | ++------------------+-------------------+------------------+-------------------+-------------------+ + +Recommendations +--------------- + +**Use Track (Recommended):** + +- **Primary recommendation for most use cases** +- Applications run normally when DataCrumbs is not running (no overhead) +- Data is captured automatically when DataCrumbs server is active +- One-time setup, always ready for tracing +- Suitable for production environments +- Works with setuid/setgid binaries + +**Use LD_PRELOAD when:** + +- You need one-time tracing +- Cannot modify binaries (system binaries, read-only filesystems) +- Testing different configurations +- Temporary tracing needs + +**Use Wrapper when:** + +- You want simplicity for ad-hoc analysis +- One-off analysis sessions +- Automatic server management is desired +- MPI applications with scheduler integration + +Advanced Integration Patterns +============================== + +Pattern 1: Selective Function Tracing +-------------------------------------- + +Configure which functions to trace by editing the host configuration file: + +.. code-block:: yaml + + # etc/datacrumbs/configs/myhost.yaml + capture_probes: + - name: open + library: libc + enabled: true + - name: H5Fopen + library: libhdf5 + enabled: true + - name: MPI_File_open + library: libmpi + enabled: false # Disabled + +Rebuild DataCrumbs after configuration changes. + +Pattern 2: Multi-Stage Pipeline Tracing +---------------------------------------- + +Trace complex pipelines with multiple stages: + +.. code-block:: bash + + # Start server once + sudo datacrumbs_server_run.sh + + # Track all stages + datacrumbs_track --executable ./stage1 + datacrumbs_track --executable ./stage2 + datacrumbs_track --executable ./stage3 + + # Run pipeline (all stages traced) + ./stage1 input.dat | ./stage2 | ./stage3 > output.dat + + # Stop server + sudo datacrumbs_server_stop.sh + +Pattern 3: Mixed Integration +----------------------------- + +Combine different methods for different components: + +.. code-block:: bash + + # Track main application permanently + datacrumbs_track --executable ./mainapp + + # Start server + sudo datacrumbs_server_run.sh + + # Run main app (tracked) + ./mainapp & + + # Run helper with wrap (not tracked permanently) + datacrumbs_wrap ./helper_script + + # Stop server + sudo datacrumbs_server_stop.sh + +Pattern 4: Conditional Tracing +------------------------------- + +Enable tracing only when needed: + +.. code-block:: bash + + # Track application + datacrumbs_track --executable ./myapp + + # Run WITHOUT tracing (server not running) + ./myapp # No traces generated + + # Run WITH tracing (start server first) + sudo datacrumbs_server_run.sh + ./myapp # Traces generated + sudo datacrumbs_server_stop.sh + +Integration with Build Systems +=============================== + +Makefile Integration +-------------------- + +.. code-block:: makefile + + # Makefile + myapp: src/*.c + $(CC) -o myapp src/*.c + + track: myapp + datacrumbs_track --executable ./myapp + + run-traced: track + sudo datacrumbs_server_run.sh + ./myapp + sudo datacrumbs_server_stop.sh + + untrack: + datacrumbs_untrack --executable ./myapp + +CMake Integration +----------------- + +.. code-block:: cmake + + # CMakeLists.txt + add_executable(myapp src/main.c) + + # Add custom target for tracking + add_custom_target(track + COMMAND datacrumbs_track --executable $ + DEPENDS myapp + ) + + # Add custom target for traced execution + add_custom_target(run-traced + COMMAND sudo datacrumbs_server_run.sh + COMMAND $ + COMMAND sudo datacrumbs_server_stop.sh + DEPENDS track + ) + +Container Integration +===================== + +Docker +------ + +.. code-block:: dockerfile + + # Dockerfile + FROM ubuntu:22.04 + + # Install DataCrumbs + RUN apt-get update && apt-get install -y datacrumbs + + # Copy application + COPY myapp /usr/local/bin/ + + # Track application at build time + RUN datacrumbs_track --executable /usr/local/bin/myapp + + # Run with tracing + CMD ["bash", "-c", "datacrumbs_server_run.sh && myapp && datacrumbs_server_stop.sh"] + +Running the container: + +.. code-block:: bash + + # Run with eBPF capabilities + docker run --privileged --cap-add=ALL \ + -v /sys/kernel/debug:/sys/kernel/debug:rw \ + myapp-traced + +Singularity +----------- + +.. code-block:: bash + + # Build container with DataCrumbs + singularity build myapp.sif myapp.def + + # Run with tracing + singularity exec --writable-tmpfs myapp.sif \ + bash -c "source /opt/datacrumbs/bin/datacrumbs_setup && \ + datacrumbs_run --app './myapp'" + +Programming Language Integration +================================= + +Python +------ + +Trace Python scripts and their I/O: + +.. code-block:: bash + + # Track Python interpreter + datacrumbs_track --executable $(which python3) + + # Or wrap + datacrumbs_wrap python3 myscript.py + +C/C++ Applications +------------------ + +No special handling needed: + +.. code-block:: bash + + # Compile application + gcc -o myapp myapp.c + + # Track + datacrumbs_track --executable ./myapp + +Fortran +------- + +.. code-block:: bash + + # Compile + gfortran -o simulation simulation.f90 + + # Track + datacrumbs_track --executable ./simulation + +Java +---- + +Trace Java applications' native I/O: + +.. code-block:: bash + + # Wrap Java + datacrumbs_wrap java -jar myapp.jar + +Troubleshooting Integration +============================ + +Tracking Fails +-------------- + +.. code-block:: bash + + # Check if patchelf is installed + which patchelf + + # Install if missing + sudo dnf install patchelf # CentOS/Rocky + sudo apt install patchelf # Ubuntu + + # Verify executable is not static + file ./myapp # Should show "dynamically linked" + +LD_PRELOAD Not Working +---------------------- + +.. code-block:: bash + + # Verify library exists + ls -la $PREFIX/lib/libdatacrumbs_client.so + + # Check LD_LIBRARY_PATH + echo $LD_LIBRARY_PATH | grep datacrumbs + + # Add if missing + export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH + +No Traces Generated +------------------- + +.. code-block:: bash + + # Verify server is running + ps aux | grep datacrumbs + + # Check if application is instrumented + ldd ./myapp | grep datacrumbs + + # Verify trace directory + ls -la $DATACRUMBS_TRACE_DIR + + # Check logs + cat $DATACRUMBS_TRACE_DIR/datacrumbs.log + +Application Crashes After Tracking +----------------------------------- + +.. code-block:: bash + + # Untrack immediately + datacrumbs_untrack --executable ./myapp + + # Check for library conflicts + ldd ./myapp + + # Try LD_PRELOAD method instead + datacrumbs_wrap ./myapp + +Best Practices +============== + +1. **Test First**: Try LD_PRELOAD before permanent tracking +2. **Backup Binaries**: Always keep unmodified copies +3. **Document Tracked Binaries**: Maintain a list of tracked executables +4. **Use Version Control**: Track modified binaries separately +5. **Verify Integration**: Check with ``ldd`` after tracking +6. **Clean Up**: Untrack when no longer needed +7. **Monitor Overhead**: Ensure tracing doesn't impact performance significantly +8. **Use Wrapper for Scripts**: Shell scripts work best with wrapper mode +9. **Check Library Paths**: Ensure DataCrumbs libraries are accessible +10. **Test in Development**: Validate integration before production use + +Examples +======== + +Example 1: Track HDF5 Application +---------------------------------- + +.. code-block:: bash + + # Track the application + datacrumbs_track --executable ./hdf5_writer + + # Verify + ldd ./hdf5_writer | grep datacrumbs + + # Start server + sudo datacrumbs_server_run.sh + + # Run application (automatically traced) + ./hdf5_writer output.h5 + + # Stop server + sudo datacrumbs_server_stop.sh + + # View trace files (.pfw.gz format) + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + +Example 2: Trace System Utility +-------------------------------- + +.. code-block:: bash + + # Cannot modify system binary, use wrap + sudo datacrumbs_server_run.sh + + # Wrap the system command + datacrumbs_wrap tar -czf backup.tar.gz /data + + # Stop server + sudo datacrumbs_server_stop.sh + + # View trace file + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + +Example 3: Pipeline Integration +-------------------------------- + +.. code-block:: bash + + # Track all components + datacrumbs_track --executable ./preprocess + datacrumbs_track --executable ./compute + datacrumbs_track --executable ./postprocess + + # Start server + sudo datacrumbs_server_run.sh + + # Run pipeline + ./preprocess input.dat | ./compute | ./postprocess > output.dat + + # All three stages traced + sudo datacrumbs_server_stop.sh diff --git a/docs/introduction.rst b/docs/introduction.rst new file mode 100755 index 00000000..3e0cdc9d --- /dev/null +++ b/docs/introduction.rst @@ -0,0 +1,101 @@ +============ +Introduction +============ + +Overview +======== + +DataCrumbs is a comprehensive I/O profiling and tracing tool designed for high-performance computing (HPC) environments. It leverages eBPF (extended Berkeley Packet Filter) technology to provide low-overhead, real-time monitoring and analysis of application I/O behavior at scale. + +Key Features +============ + +Low-Overhead Profiling +---------------------- + +DataCrumbs uses eBPF to achieve minimal performance overhead while capturing detailed I/O traces. Unlike traditional profiling tools that may introduce significant overhead, DataCrumbs operates in kernel space, minimizing interference with application execution. + +Scalable Architecture +--------------------- + +Designed for large-scale HPC systems, DataCrumbs can efficiently trace I/O operations across distributed applications running on thousands of nodes. The tool supports multiple job schedulers including: + +* FLUX +* SLURM +* OpenMPI +* Standalone execution + +Multi-Layer Tracing +------------------- + +DataCrumbs captures I/O operations at multiple layers: + +* **System Calls**: Low-level I/O operations (open, read, write, close, etc.) +* **POSIX I/O**: Standard C library I/O functions +* **MPI-IO**: Parallel I/O operations in MPI applications +* **HDF5**: High-level I/O library operations +* **Custom Functions**: User-defined function tracing through configuration + +Flexible Deployment +------------------- + +DataCrumbs supports multiple deployment modes: + +1. **Server Mode**: Long-running server process for continuous monitoring +2. **Service Mode**: Systemd service integration for managed execution +3. **Wrapper Mode**: Direct application wrapping for single executions +4. **Composable Mode**: Custom probe configurations for specific use cases + +Real-Time Analysis +------------------ + +The tool provides: + +* DFTracer format output (``.pfw.gz``) for efficient trace storage and analysis +* Event aggregation and correlation across processes +* Trace compression for efficient storage +* Real-time event processing with ring buffers + +Use Cases +========= + +DataCrumbs is particularly useful for: + +* **Performance Analysis**: Understanding I/O bottlenecks in HPC applications +* **I/O Pattern Discovery**: Identifying access patterns and optimization opportunities +* **Debugging**: Tracing file access patterns to diagnose issues +* **System Monitoring**: Continuous monitoring of I/O behavior in production environments +* **Research**: Studying I/O characteristics of scientific applications + +Architecture +============ + +DataCrumbs consists of several key components: + +1. **eBPF Probes**: Kernel-space programs that capture events with minimal overhead +2. **Explorer**: Discovers available probes and functions in libraries +3. **Generator**: Creates custom eBPF programs based on configuration +4. **Server**: User-space daemon that collects and processes events +5. **Client Library**: Injected into applications for tracking +6. **Writer**: Formats and outputs trace data in DFTracer format (``.pfw.gz``) + +Target Applications +=================== + +DataCrumbs is designed for profiling: + +* MPI applications +* Parallel I/O workloads +* Scientific computing applications +* Data-intensive applications +* Any application using POSIX, HDF5, MPI-IO, or custom I/O libraries + +License +======= + +DataCrumbs is developed at Lawrence Livermore National Laboratory and released under an open-source license. See the LICENSE file in the repository for details. + +Citation +======== + +If you use DataCrumbs in your research, please cite the appropriate publication. See CITATION.cff in the repository for citation information. diff --git a/docs/run.rst b/docs/run.rst old mode 100644 new mode 100755 index e6b2a2b7..a39d934f --- a/docs/run.rst +++ b/docs/run.rst @@ -1,7 +1,14 @@ -Run Datacrumbs -============== +=============== +Running DataCrumbs +=============== -To run Datacrumbs tests, follow these instructions: +This guide describes how to run DataCrumbs tests and trace applications, including examples with IOR benchmarking. + +Basic Test Execution +==================== + +Running Tests with CTest +------------------------ 1. **Navigate to the build directory:** @@ -15,28 +22,343 @@ To run Datacrumbs tests, follow these instructions: ctest -N -3. **View arguments for the Datacrumbs start test which is Daemonize script:** +3. **View arguments for the DataCrumbs start test (Daemonize script):** .. code-block:: bash ctest -R datacrumbs_start -VV - This will show verbose output and the arguments used for the `datacrumbs_start` test. + This will show verbose output and the arguments used for the ``datacrumbs_start`` test. -4. **View arguments for the Datacrumbs run test which is sync script:** +4. **View arguments for the DataCrumbs run test (sync script):** .. code-block:: bash ctest -R datacrumbs_run -VV - This will show verbose output and the arguments used for the `datacrumbs_run` test. + This will show verbose output and the arguments used for the ``datacrumbs_run`` test. -Refer to your project's `ctest` configuration for additional test options. - -5. **Run the `test_simple_dd` test:** +5. **Run the ``test_simple_dd`` test:** .. code-block:: bash ctest -R test_simple_dd -VV - This will execute the `test_simple_dd` test with verbose output from the build directory. \ No newline at end of file + This will execute the ``test_simple_dd`` test with verbose output from the build directory. + +Running Applications with IOR +============================== + +IOR (Interleaved Or Random) is a parallel file system benchmarking tool commonly used in HPC environments. This section demonstrates how to install and run IOR with DataCrumbs tracing. + +Installing IOR +-------------- + +To install IOR, follow these steps: + +1. **Clone the IOR repository:** + + .. code-block:: bash + + git clone https://github.com/hpc/ior.git + cd ior + +2. **Build IOR:** + + .. code-block:: bash + + ./bootstrap + ./configure --prefix=$PREFIX + make -j + make install + +3. **(Optional) Install system-wide:** + + .. code-block:: bash + + sudo make install + +For more details, refer to the official IOR documentation: https://github.com/hpc/ior + +Running IOR Benchmarks +---------------------- + +**Basic IOR Test:** + +.. code-block:: bash + + # Run a simple IOR test + ior -a POSIX -b 1m -t 256k -s 16 -F + +This runs IOR with: +- POSIX I/O API +- 1MB block size +- 256KB transfer size +- 16 segments per task +- File-per-process mode + +**Parallel IOR with MPI:** + +.. code-block:: bash + + # Run IOR with MPI across multiple processes + mpirun -np 4 ior -a MPIIO -b 4m -t 1m -s 8 -o /scratch/testfile + +This runs IOR with: +- MPI-IO API +- 4 MPI processes +- 4MB block size +- 1MB transfer size +- 8 segments per task +- Output file at ``/scratch/testfile`` + +Tracing IOR with DataCrumbs +---------------------------- + +**Prerequisites**: Instrument IOR before tracing: + +.. code-block:: bash + + # Track IOR binary (one-time setup) + datacrumbs_track --executable $(which ior) + + # Or use wrap mode (no pre-tracking needed) + +**Method 1: Using datacrumbs_run (Synchronous)** + +.. code-block:: bash + + # Trace a single-node IOR run (if IOR is tracked) + datacrumbs_run --app-name ior-test -- ior -a POSIX -b 1m -t 256k -s 16 -F + + # Or with wrap mode + datacrumbs_run --app-name ior-test -- datacrumbs_wrap ior -a POSIX -b 1m -t 256k -s 16 -F + +**Method 2: Using datacrumbs_server (Daemon Mode)** + +.. code-block:: bash + + # Start DataCrumbs daemon + datacrumbs_server_run.sh + + # Run your IOR benchmark + mpirun -np 8 ior -a MPIIO -b 4m -t 1m -s 8 -o /scratch/testfile + + # Stop DataCrumbs daemon + datacrumbs_server_stop.sh + +**Method 3: Multi-node IOR with Flux** + +.. code-block:: bash + + # Using Flux scheduler for multi-node execution + flux run -N 4 -n 16 datacrumbs_run --app-name ior-multinode -- \ + ior -a MPIIO -b 8m -t 2m -s 16 -o /lustre/testfile + +**Method 4: Multi-node IOR with SLURM** + +.. code-block:: bash + + # Using SLURM scheduler for multi-node execution + srun -N 4 -n 16 datacrumbs_run --app-name ior-multinode -- \ + ior -a MPIIO -b 8m -t 2m -s 16 -o /lustre/testfile + +IOR Test Examples with DataCrumbs +---------------------------------- + +**Example 1: Write Performance Test** + +.. code-block:: bash + + # Test write performance with different block sizes + datacrumbs_run --app-name ior-write-1m -- ior -a POSIX -w -b 1m -t 256k -s 32 -F + datacrumbs_run --app-name ior-write-4m -- ior -a POSIX -w -b 4m -t 1m -s 32 -F + datacrumbs_run --app-name ior-write-16m -- ior -a POSIX -w -b 16m -t 4m -s 32 -F + +**Example 2: Read Performance Test** + +.. code-block:: bash + + # Test read performance (requires existing files from write test) + datacrumbs_run --app-name ior-read-1m -- ior -a POSIX -r -b 1m -t 256k -s 32 -F + +**Example 3: Collective I/O Test** + +.. code-block:: bash + + # Test MPI-IO collective operations + mpirun -np 4 datacrumbs_run --app-name ior-collective -- \ + ior -a MPIIO -b 4m -t 1m -s 16 -c -o /scratch/collective-test + +The ``-c`` flag enables collective I/O operations. + +**Example 4: Random I/O Test** + +.. code-block:: bash + + # Test random I/O patterns + datacrumbs_run --app-name ior-random -- \ + ior -a POSIX -b 1m -t 64k -s 64 -z -o /scratch/random-test + +The ``-z`` flag enables random I/O instead of sequential. + +**Example 5: Shared File Test** + +.. code-block:: bash + + # All processes access a single shared file + mpirun -np 8 datacrumbs_run --app-name ior-shared -- \ + ior -a MPIIO -b 2m -t 512k -s 16 -o /scratch/shared-file + +Without the ``-F`` flag, all processes use a single shared file. + +Analyzing IOR Traces +-------------------- + +After running IOR with DataCrumbs, analyze the generated traces: + +.. code-block:: bash + + # View trace files in DFTracer format (.pfw.gz) + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + + # Example output: + # trace-root-12345-node01-docker.pfw.gz + # trace-haridev-67890-0-4-lead.pfw.gz (MPI rank 0) + # trace-haridev-67890-1-4-lead.pfw.gz (MPI rank 1) + +**Using DFTracer Utilities**: + +.. code-block:: bash + + # Install DFTracer utilities + pip install dftracer-utils + + # Merge traces from all MPI ranks + dftracer-merge --input "trace-*-67890-*.pfw.gz" --output ior-merged.pfw.gz + + # Get I/O statistics + dftracer-stats --input ior-merged.pfw.gz + + # Split large trace for easier handling + dftracer-split --input ior-merged.pfw.gz --output-dir ior-traces/ + +**Documentation**: https://dftracer.readthedocs.io/en/latest/bash_utilities.html + +**Using DFAnalyzer for Detailed Analysis**: + +.. code-block:: bash + + # Install DFAnalyzer + pip install dfanalyzer + + # Generate comprehensive report + dfanalyzer analyze --input ior-merged.pfw.gz --output ior-report.html + + # Interactive analysis session + dfanalyzer interactive --input ior-merged.pfw.gz + +**Documentation**: https://dftracer.readthedocs.io/projects/analyzer/en/latest/getting-started.html#usage + +**Trace Format**: DFTracer format - see https://dftracer.readthedocs.io/en/latest/trace_format.html + +For DataCrumbs-specific Jupyter notebook examples, refer to the ``analysis/`` directory in the repository. + +Advanced Configuration +====================== + +Trace and Log Directory Configuration +-------------------------------------- + +**Trace Directory** (Administrator Only): + +The trace directory is configured by the system administrator during installation and **cannot be changed by users at runtime**. + +.. code-block:: bash + + # Administrator sets trace directory at build time: + # cmake -DDATACRUMBS_CONFIGURED_TRACE_DIR=/scratch/traces .. + # + # Or via project YAML configuration: + # trace_dir: /lustre/traces + # trace_dir_pattern: /scratch/traces/%YY%/%MM%/%DD% + +**Log Directory**: + +Log directory may be configurable depending on administrator settings: + +.. code-block:: bash + + # If enabled by administrator, users can set log directory + export DATACRUMBS_CONFIGURED_LOG_DIR=/scratch/logs + datacrumbs_run --app-name myapp -- ./myapp + +Filtering Traced Paths +----------------------- + +**Administrator Configuration Only** + +Path filtering must be configured at build time by the system administrator: + +.. code-block:: bash + + # Administrator configures path filtering at build time + cmake -DDATACRUMBS_INCLUSION_PATH=/scratch/data .. + make install + + # After installation, only I/O to /scratch/data will be traced + datacrumbs_run --app-name filtered-app -- ./myapp + +.. note:: + Users cannot change the inclusion path at runtime. This must be set during installation. + +Troubleshooting +=============== + +Permission Issues +----------------- + +If you encounter permission errors: + +.. code-block:: bash + + # Ensure eBPF capabilities (datacrumbs binary is in sbin) + sudo setcap cap_sys_admin,cap_bpf,cap_perfmon+ep $PREFIX/sbin/datacrumbs + + # Or run with sudo + sudo -E datacrumbs_run --app-name myapp -- ./myapp + +Missing Traces +-------------- + +If traces are not generated: + +.. code-block:: bash + + # Check if DataCrumbs is running + ps aux | grep datacrumbs + + # Check logs (default is /tmp unless configured otherwise) + cat /tmp/datacrumbs*.log + # Or if you know your configured log directory: + # cat ${DATACRUMBS_CONFIGURED_LOG_DIR}/datacrumbs*.log + + # Verify trace directory permissions (default is /tmp) + ls -ld /tmp/*trace* 2>/dev/null || echo "No trace files found" + +Performance Impact +------------------ + +To reduce tracing overhead: + +.. code-block:: bash + + # Use profiling mode instead of full tracing + cmake -DDATACRUMBS_MODE_STR=PROFILE .. + make install + + # Skip small events + cmake -DDATACRUMBS_SKIP_SMALL_EVENTS_THRESHOLD_NS=10000 .. + make install + +For more information on running DataCrumbs in production environments, see the :doc:`usage` section. \ No newline at end of file diff --git a/docs/setup.rst b/docs/setup.rst new file mode 100755 index 00000000..9dad8442 --- /dev/null +++ b/docs/setup.rst @@ -0,0 +1,1551 @@ +==================== +Environment Setup +==================== + +After building and installing DataCrumbs, you need to set up your environment to use the tools. + +Setup Script Overview +===================== + +DataCrumbs provides a ``datacrumbs_setup`` script that configures the environment for running tracing sessions. + +Basic Setup +=========== + +Source the setup script to configure your environment: + +.. code-block:: bash + + # If using environment modules + module use /path/to/install/etc/datacrumbs/modulefiles + module load datacrumbs/ + + # Or source directly + source /path/to/install/bin/datacrumbs_setup + +What Setup Does +=============== + +The setup script: + +1. **Detects User Context**: Determines if running as root or regular user +2. **Loads Configuration**: Reads project and host-specific YAML configuration +3. **Sets Environment Variables**: Configures paths and runtime parameters +4. **Configures Resource Limits**: Sets appropriate ulimits for eBPF operations +5. **Creates Aliases**: Provides convenient command shortcuts +6. **Loads Module (optional)**: Integrates with environment modules if available + +Environment Variables Set +========================= + +After sourcing the setup script, the following variables are available: + +.. list-table:: Global Configuration Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_VERSION`` + - DataCrumbs version number (e.g., ``0.0.4``) + * - ``DATACRUMBS_LIB_VERSION`` + - Library version number (e.g., ``1.0.0``) + +.. list-table:: Installation Path Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_INSTALL_HOST`` + - Hostname where DataCrumbs is installed + * - ``DATACRUMBS_INSTALL_USER`` + - User who installed DataCrumbs + * - ``DATACRUMBS_INSTALL_PREFIX`` + - Installation prefix directory (e.g., ``/opt/datacrumbs``) + * - ``DATACRUMBS_INSTALL_BIN_DIR`` + - Directory for user command binaries + * - ``DATACRUMBS_INSTALL_SBIN_DIR`` + - Directory for system/admin binaries + * - ``DATACRUMBS_INSTALL_LIB_DIR`` + - Directory for shared libraries + * - ``DATACRUMBS_INSTALL_LIBEXEC_DIR`` + - Directory for internal executables and eBPF objects + * - ``DATACRUMBS_INSTALL_ETC_DIR`` + - Directory for configuration files + +.. list-table:: Client Configuration Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_CLIENT_LIB`` + - Path to the client library (``libdatacrumbs_client.so``) + * - ``DATACRUMBS_CLIENT_BIN`` + - Directory for user-specific client binaries + +.. list-table:: Trace Configuration Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_TRACE_DIR`` + - Directory for trace files. Supports date patterns: ``%YY%`` (year), ``%MM%`` (month), ``%DD%`` (day) + * - ``DATACRUMBS_TRACE_DIR_PATTERN`` + - Pattern template for trace directory (e.g., ``/scratch/traces/%YY%/%MM%/%DD%``) + +.. list-table:: Job Scheduler Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_JOB_SCHEDULER`` + - Active job scheduler (``FLUX``, ``SLURM``, ``OPENMPI``, etc.) + * - ``DATACRUMBS_JOB_RUN`` + - Command to run jobs (e.g., ``flux run``, ``srun``) + * - ``DATACRUMBS_JOB_NODE_FLAG`` + - Flag for specifying number of nodes (e.g., ``-N``) + * - ``DATACRUMBS_JOB_PPN_FLAG`` + - Flag for specifying processes per node (e.g., ``-n``) + * - ``DATACRUMBS_JOB_ID_VAR`` + - Environment variable containing job ID (e.g., ``FLUX_JOB_ID``, ``SLURM_JOB_ID``) + +.. list-table:: Server Configuration Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_SERVER_LOAD_TIMEOUT`` + - Timeout in seconds for server to load eBPF programs (default: ``600``) + * - ``DATACRUMBS_SERVER_RUN_DIR`` + - Directory for server runtime files (PID files, lock files) + * - ``DATACRUMBS_SERVER_RUN_ID`` + - Unique identifier for the current tracing session + * - ``DATACRUMBS_SERVER_MODULE`` + - Flag for module system integration (``0`` or ``1``) + +.. list-table:: Log Configuration Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_LOG_DIR`` + - Directory for log files (e.g., ``/var/log/datacrumbs``) + +.. list-table:: Runtime Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_USER`` + - Current user running DataCrumbs (auto-detected or from ``$USER``) + * - ``DATACRUMBS_IS_ROOT`` + - Flag indicating if running as root (``1``) or regular user (``0``) + +.. list-table:: System Path Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``PATH`` + - Updated to include ``$PREFIX/bin`` (user commands) and ``$PREFIX/sbin`` (admin commands) + * - ``LD_LIBRARY_PATH`` + - Updated to include ``$PREFIX/lib`` (DataCrumbs libraries) and dependency library paths + +.. list-table:: Module System Variables + :header-rows: 1 + :widths: 30 70 + + * - Variable + - Description + * - ``DATACRUMBS_MODULE_AVAILABLE`` + - Set to ``1`` if environment modules are available, ``0`` otherwise + * - ``DATACRUMBS_ENV_LOADED`` + - Set to ``1`` after successful setup to prevent re-initialization + +Using Environment Modules +========================== + +DataCrumbs integrates with environment modules (Lmod/TCL modules) for easy environment management. + +Module File Location +-------------------- + +The module file is installed at: + +.. code-block:: text + + /etc/datacrumbs/modulefiles/datacrumbs/.lua + +Loading the Module +------------------ + +.. code-block:: bash + + # Add module path + module use /path/to/install/etc/datacrumbs/modulefiles + + # Load DataCrumbs module + module load datacrumbs/0.0.4 + + # Verify loaded + module list + +The module automatically: + +- Adds binaries to ``PATH`` +- Adds libraries to ``LD_LIBRARY_PATH`` +- Sources ``datacrumbs_setup`` +- Sets up command aliases + +Module Information +------------------ + +View module details: + +.. code-block:: bash + + # Show module information + module show datacrumbs/0.0.4 + + # Show help text + module help datacrumbs/0.0.4 + +Unloading the Module +-------------------- + +.. code-block:: bash + + module unload datacrumbs + +Available Command Aliases +========================== + +After setup, the following aliases are available: + +Tracking Commands +----------------- + +``datacrumbs_track`` +^^^^^^^^^^^^^^^^^^^^ + +Permanently instrument a binary for tracing. + +.. code-block:: bash + + datacrumbs_track --executable /path/to/myapp + +``datacrumbs_untrack`` +^^^^^^^^^^^^^^^^^^^^^^ + +Remove DataCrumbs instrumentation from a binary. + +.. code-block:: bash + + datacrumbs_untrack --executable /path/to/myapp + +Execution Commands +------------------ + +``datacrumbs_run`` +^^^^^^^^^^^^^^^^^^ + +Run an application with DataCrumbs tracing. + +.. code-block:: bash + + datacrumbs_run --app "myapp arg1 arg2" + +``datacrumbs_compose_run`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run using a custom composable configuration. + +.. code-block:: bash + + datacrumbs_compose_run --composite-name myconfig + +Server Management +----------------- + +``datacrumbs_stop`` +^^^^^^^^^^^^^^^^^^^ + +Stop the DataCrumbs server (requires sudo). + +.. code-block:: bash + + datacrumbs_stop + +``datacrumbs_compose`` +^^^^^^^^^^^^^^^^^^^^^^ + +Manage composable configurations (requires sudo). + +.. code-block:: bash + + sudo datacrumbs_compose --action discover + +Utility Commands +---------------- + +``datacrumbs_wrap`` +^^^^^^^^^^^^^^^^^^^ + +Run a command with LD_PRELOAD-based tracing (requires sudo). + +.. code-block:: bash + + datacrumbs_wrap myapp arg1 arg2 + +``datacrumbs_create_log_dir`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create date-based log directory structure. + +.. code-block:: bash + + datacrumbs_create_log_dir + +Configuration Files +=================== + +DataCrumbs uses YAML configuration files to define tracing behavior. + +Project Configuration +--------------------- + +**Location**: ``/etc/datacrumbs/configs/project.yaml`` + +Contains project-wide settings including paths, scheduler configuration, and server parameters. + +Example: + +.. code-block:: yaml + + version: 0.0.4 + lib_version: 1.0.0 + install: + host: myhostname + user: myuser + prefix: /opt/datacrumbs + bin_dir: ${DATACRUMBS_INSTALL_PREFIX}/bin + sbin_dir: ${DATACRUMBS_INSTALL_PREFIX}/sbin + lib_dir: ${DATACRUMBS_INSTALL_PREFIX}/lib + client: + lib: ${DATACRUMBS_INSTALL_LIB_DIR}/libdatacrumbs_client.so + bin: ${DATACRUMBS_INSTALL_LIBEXEC_DIR}/sbin/${DATACRUMBS_USER} + trace: + dir_pattern: /scratch/traces/%YY%/%MM%/%DD% + job: + scheduler: FLUX + run: flux run + node_flag: -N + ppn_flag: -n + id_var: FLUX_JOB_ID + server: + load_timeout: 600 + run_dir: /var/run/datacrumbs + module: 0 + log: + dir: /var/log/datacrumbs + +.. _host-configuration: + +Host Configuration +------------------ + +**Location**: ``/etc/datacrumbs/configs/.yaml`` + +Contains host-specific settings for probe configurations and capture rules. This file **must exist** for the hostname specified during build (``DATACRUMBS_HOST``). + +.. important:: + The host configuration file is required for DataCrumbs to build successfully. Copy and modify an existing configuration file (e.g., ``lead.yaml``, ``docker.yaml``) or create a new one based on the examples in ``etc/datacrumbs/configs/``. + +Capture Probes Configuration +============================= + +The ``capture_probes`` section defines which functions, system calls, or events DataCrumbs should trace. Each capture probe specifies what to monitor and how to discover traceable functions. + +Capture probes use different mechanisms to discover and attach to functions. The capture type determines how symbols are discovered, while the probe type determines how they are instrumented at runtime. + +Common Fields +------------- + +All capture probe types share these base fields inherited from the ``CaptureProbe`` class: + +.. list-table:: + :header-rows: 1 + :widths: 20 15 65 + + * - Field + - Required + - Description + * - ``name`` + - Yes + - Unique identifier for this probe set + * - ``probe`` + - Yes + - Runtime probe mechanism: ``syscalls``, ``kprobe``, ``uprobe``, ``usdt``, or ``custom`` + * - ``type`` + - Yes + - Symbol discovery method: ``header``, ``binary``, ``ksym``, ``usdt``, or ``custom`` + * - ``regex`` + - Optional + - Regular expression to filter discovered function names (default: ``.*`` matches all) + * - ``enable_explorer`` + - Optional + - Enable/disable probe discovery at build time (default: ``true``) + +Capture Types Overview +---------------------- + +.. list-table:: + :header-rows: 1 + :widths: 20 30 50 + + * - Capture Type + - Discovery Method + - Compatible Probe Types + * - ``ksym`` + - Kernel symbol table (``/proc/kallsyms``) + - ``kprobe`` only + * - ``header`` + - Parse C header files with Clang + - ``syscalls``, ``kprobe``, ``uprobe`` + * - ``binary`` + - Parse ELF binary symbols + - ``kprobe`` (kernel modules), ``uprobe`` (user binaries) + * - ``usdt`` + - DTRACE probes in binaries + - ``usdt`` only + * - ``custom`` + - User-defined plugin interface + - ``custom`` (can use any underlying mechanism) + +Kernel Symbol Capture (ksym) +----------------------------- + +**Capture Type**: ``ksym`` | **Compatible Probes**: ``kprobe`` + +**Class**: ``KernelCaptureProbe`` + +Discovers kernel functions from the compiled kernel symbol table at ``/proc/kallsyms``. This method queries the running kernel for available functions with type 'T' (global) or 't' (local). + +**Required Fields**: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Field + - Description + * - ``name`` + - Identifier for the probe set + * - ``probe`` + - Must be ``kprobe`` + * - ``type`` + - Must be ``ksym`` + * - ``regex`` + - Pattern to match kernel symbol names from ``/proc/kallsyms`` + +**Advantages**: +* Discovers only functions available in the running kernel +* No need for kernel source or headers +* Fast symbol lookup + +**Example - XFS Filesystem Functions**: + +.. code-block:: yaml + + - name: xfs + probe: kprobe + type: ksym + regex: ^xfs(?!.*cold).* + +**Example - IOMAP Functions**: + +.. code-block:: yaml + + - name: iomap + probe: kprobe + type: ksym + regex: ^iomap(?!.*cold).* + +**Example - All VFS Functions**: + +.. code-block:: yaml + + - name: vfs + probe: kprobe + type: ksym + regex: ^vfs_.* + +Header File Capture +-------------------- + +**Capture Type**: ``header`` | **Compatible Probes**: ``syscalls``, ``kprobe``, ``uprobe`` + +**Class**: ``HeaderCaptureProbe`` + +Parses C header files using Clang to discover function declarations. This method extracts function signatures from header files without requiring compiled binaries. + +**Required Fields**: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Field + - Description + * - ``name`` + - Identifier for the probe set + * - ``probe`` + - ``syscalls``, ``kprobe``, or ``uprobe`` + * - ``type`` + - Must be ``header`` + * - ``file`` + - Path to C header file + * - ``regex`` + - Optional pattern to filter function names + * - ``enable_explorer`` + - Optional: Disable if header parsing is slow (default: ``true``) + +**Advantages**: +* Works without compiled binaries +* Extracts complete function signatures +* Useful for system calls and kernel headers + +Use Case: System Calls +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: yaml + + - name: sys + probe: syscalls + type: header + file: @DATACRUMBS_KERNEL_HEADERS_PATH@/include/linux/syscalls.h + regex: sys_.* + +Use Case: Kernel Page Cache +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: yaml + + - name: os_page_cache + probe: kprobe + type: header + file: @DATACRUMBS_KERNEL_HEADERS_PATH@/include/linux/pagemap.h + +Use Case: Kernel Functions (Alternative to ksym) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: yaml + + - name: kernel_fs + probe: kprobe + type: header + file: @DATACRUMBS_KERNEL_HEADERS_PATH@/include/linux/fs.h + regex: (inode|dentry)_.* + +Binary Symbol Capture +---------------------- + +**Capture Type**: ``binary`` | **Compatible Probes**: ``kprobe`` (kernel modules), ``uprobe`` (user binaries) + +**Class**: ``BinaryCaptureProbe`` + +Extracts symbols from compiled ELF binaries using symbol table parsing. Works for both kernel modules (.ko) and user-space binaries/libraries. + +**Required Fields**: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Field + - Description + * - ``name`` + - Identifier for the probe set + * - ``probe`` + - ``kprobe`` (for .ko files) or ``uprobe`` (for binaries/libraries) + * - ``type`` + - Must be ``binary`` + * - ``file`` + - Path to binary, shared library, or kernel module + * - ``regex`` + - Pattern to filter symbol names (recommended to exclude compiler-generated names) + * - ``include_offsets`` + - Optional: Include function offsets in output (default: ``false``) + +**Advantages**: +* No source code or headers needed +* Works with any ELF binary +* Discovers actual available functions + +Use Case: Kernel Modules (kprobe) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Example - Lustre Filesystem Module**: + +.. code-block:: yaml + + - name: lustre + probe: kprobe + type: binary + file: /usr/lib/modules/5.14.0/weak-updates/lustre/fs/lustre.ko + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + +**Regex Explanation**: Excludes compiler-generated names: +* ``(?!.*__)`` - Exclude functions with double underscores +* ``(?!.*:)`` - Exclude namespaced symbols +* ``(?!.*constprop)`` - Exclude const propagation variants +* ``(?!.*isra)`` - Exclude interprocedural scalar replacement variants + +**Example - Lustre OSC Module**: + +.. code-block:: yaml + + - name: osc + probe: kprobe + type: binary + file: /usr/lib/modules/5.14.0/weak-updates/lustre/fs/osc.ko + regex: (?!.*__)(?!.*:)(?!.*constprop)(?!.*isra).* + +Use Case: User-Space Libraries (uprobe) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Example - Standard C Library**: + +.. code-block:: yaml + + - name: libc + probe: uprobe + type: binary + file: @DATACRUMBS_LIBC_SO@ + regex: .*(open|close|read|write|fork).* + +**Example - MPI Library**: + +.. code-block:: yaml + + - name: mpi + probe: uprobe + type: binary + file: /opt/openmpi/lib/libmpi.so + regex: MPI_File_.* + +**Example - HDF5 Library**: + +.. code-block:: yaml + + - name: hdf5 + probe: uprobe + type: binary + file: /usr/lib64/libhdf5.so.200 + regex: H5[FD].* + +Use Case: Application Binaries (uprobe) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Example - IOR Benchmark**: + +.. code-block:: yaml + + - name: ior + probe: uprobe + type: binary + file: /home/user/software/ior/bin/ior + regex: .* + +USDT Capture +------------ + +**Capture Type**: ``usdt`` | **Compatible Probes**: ``usdt`` + +**Class**: ``USDTCaptureProbe`` + +Discovers User-level Statically Defined Tracing (USDT) probes using the DTRACE mechanism. USDT probes are embedded in applications and libraries for tracing, commonly used in interpreted languages like Python. + +**Required Fields**: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Field + - Description + * - ``name`` + - Identifier for the probe set + * - ``probe`` + - Must be ``usdt`` + * - ``type`` + - Must be ``usdt`` + * - ``binary_path`` + - Path to binary containing USDT probes + * - ``provider`` + - USDT provider name (namespace for probes) + * - ``regex`` + - Optional pattern to filter probe names + +**Advantages**: +* Low overhead for interpreted languages +* Standardized tracing interface +* Application-specific semantic probes + +**Currently Supported**: Python + +**Example - Python USDT Probes**: + +.. code-block:: yaml + + - name: python + probe: usdt + type: usdt + binary_path: /lib64/libpython3.6m.so.1.0 + provider: python + +**Example - Python GC Probes**: + +.. code-block:: yaml + + - name: python_gc + probe: usdt + type: usdt + binary_path: /lib64/libpython3.6m.so.1.0 + provider: python + regex: gc.* + +Custom Capture +-------------- + +**Capture Type**: ``custom`` | **Compatible Probes**: ``custom`` + +**Class**: ``CustomCaptureProbe`` + +Provides a plugin interface for user-defined probe discovery, function mapping, and event processing. Custom probes can work with any underlying probe mechanism (kprobe, uprobe, etc.) but with complete control over probe logic. + +**Required Fields**: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Field + - Description + * - ``name`` + - Identifier for the custom probe + * - ``probe`` + - Must be ``custom`` + * - ``type`` + - Must be ``custom`` + * - ``file`` + - Path to custom BPF source file (.bpf.c) with probe implementations + * - ``probes`` + - Path to JSON file defining probe points and function mappings + * - ``process_header`` + - Path to C header file with event processing functions + * - ``start_event_id`` + - Starting event ID for this probe set (must be unique, typically 100000+) + * - ``event_type`` + - Event classification: ``1`` (duration events), ``2`` (instant events) + +**Advantages**: +* Complete control over probe behavior +* Custom event processing logic +* Can combine multiple probe types +* Plugin architecture for extensibility + +**Use Cases**: +* Complex multi-probe workflows +* Custom data collection beyond function tracing +* Specialized performance analysis +* Domain-specific instrumentation + +**Example - Custom System I/O Probe**: + +.. code-block:: yaml + + - name: custom1 + start_event_id: 100000 + probe: custom + type: custom + file: /opt/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c + probes: /opt/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/probes.json + process_header: /opt/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h + event_type: 2 + +**Plugin Structure**: + +* **BPF file** (``file``): Contains eBPF programs with probe logic +* **Probes JSON** (``probes``): Defines which functions to attach to and their metadata +* **Process header** (``process_header``): C header with functions to process events in user-space + +CMake Variable Substitution +============================ + +Configuration files support CMake variable substitution at build time: + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Variable + - Expands To + * - ``@DATACRUMBS_PROJECT_PATH@`` + - Build directory path + * - ``@DATACRUMBS_LIBC_SO@`` + - Detected libc library path + * - ``@DATACRUMBS_KERNEL_HEADERS_PATH@`` + - Kernel headers directory + * - ``@DATACRUMBS_KERNEL_UNAME_R@`` + - Kernel release version + +**Example Using Variables**: + +.. code-block:: yaml + + - name: libc + probe: uprobe + type: binary + file: @DATACRUMBS_LIBC_SO@ + regex: .*(open|close|read|write).* + + - name: page_cache + probe: kprobe + type: header + file: @DATACRUMBS_KERNEL_HEADERS_PATH@/include/linux/pagemap.h + +Choosing the Right Capture Type +================================ + +.. list-table:: + :header-rows: 1 + :widths: 20 40 40 + + * - Capture Type + - When to Use + - Limitations + * - **ksym** + - Kernel functions only; fast discovery; no headers needed + - Linux kernel only; no source information + * - **header** + - Have header files; need function signatures; build-time discovery + - Requires header files; slower parsing + * - **binary** + - Have compiled binary; no source; runtime symbol discovery + - No function signatures; binary must have symbols + * - **usdt** + - Tracing interpreted languages; application-specific probes + - Limited language support (Python) + * - **custom** + - Complex instrumentation; custom logic; plugin development + - Requires custom BPF programming + +Complete Configuration Examples +================================ + +Available example configurations in ``etc/datacrumbs/configs/``: + +.. list-table:: + :header-rows: 1 + :widths: 25 75 + + * - File + - Description + * - ``lead.yaml`` + - Full HPC cluster: custom probes, syscalls, Lustre modules, MPI, kernel symbols + * - ``docker.yaml`` + - Container environment: custom probes, libc uprobe, Python USDT, kernel headers + * - ``corona.yaml`` + - LLNL Corona system with comprehensive instrumentation + * - ``tuolumne.yaml`` + - LLNL Tuolumne system focused on MPI-IO workflows + * - ``hdf.yaml`` + - HDF5-focused configuration for scientific applications + +Data Files +========== + +DataCrumbs generates and maintains several data files during build and runtime to manage probe discovery, validation, and event mapping. These files use the naming pattern ``--.`` where: + +* ```` - Hostname from project configuration +* ```` - Install user from project configuration + +File Locations +-------------- + +All data files are stored in: ``/etc/datacrumbs/data/`` + +Probe Discovery Files +--------------------- + +probes-HOST-USER.json +^^^^^^^^^^^^^^^^^^^^^ + +**Generated**: Build time (explorer phase) + +**Purpose**: Master list of discovered probe points organized by capture probe configuration + +Contains all functions discovered by the explorer during the build process. Each entry represents a complete capture probe configuration with its discovered functions. + +**Structure**: Array of capture probe objects, where each object contains: + +* ``type`` - Probe type (0=syscalls, 1=kprobe, 2=uprobe, 3=usdt, 4=custom) +* ``name`` - Capture probe name from configuration +* ``functions`` - Array of discovered function names +* Additional fields specific to probe type (binary_path, provider, bpf_path, etc.) + +**Example Entry (uprobe)**: + +.. code-block:: json + + { + "type": 2, + "name": "libc", + "functions": ["__GI___fork", "__GI___register_atfork", "__GI___vfork"], + "binary_path": "/usr/lib64/libc.so.6", + "function_offsets": ["0xf96b8", "0x841c0", "0x73458"] + } + +**Example Entry (kprobe)**: + +.. code-block:: json + + { + "type": 1, + "name": "xfs", + "functions": ["xfs_file_read_iter", "xfs_file_write_iter", "xfs_file_open"] + } + +**Example Entry (custom)**: + +.. code-block:: json + + { + "type": 4, + "name": "custom1", + "functions": ["openat", "read", "write", "close"], + "bpf_path": "/opt/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio.bpf.c", + "start_event_id": 100000, + "process_header": "/opt/datacrumbs/etc/datacrumbs/plugins/custom_probes/sys_io/sysio_process.h", + "event_type": 2 + } + +probes-exclusion-HOST-USER.json +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Managed by**: User (manual editing) + +**Purpose**: User-defined probe exclusion list + +Contains exclusion lists for each capture probe. Only three fields are used: ``type``, ``name``, and ``functions``. All other fields (binary_path, bpf_path, etc.) are ignored. + +**Structure**: Array of objects with required fields: + +* ``type`` - Probe type (must match capture probe type) +* ``name`` - Capture probe name (must match configuration) +* ``functions`` - Array of function names to exclude + +**Example**: + +.. code-block:: json + + [ + { + "type": 0, + "name": "sys", + "functions": ["bdflush", "fork", "ioctl", "ni_syscall"] + }, + { + "type": 2, + "name": "libc", + "functions": ["fnmatch@@GLIBC_2.2.5", "sysctl@GLIBC_2.2.5"] + }, + { + "type": 1, + "name": "xfs", + "functions": ["xfs_buf_cold", "xfs_attr_check_namespace"] + } + ] + +**Use Cases**: +* Exclude functions that cause issues or crashes +* Reduce probe count for performance +* Filter out noisy or irrelevant functions +* Avoid versioned symbols that may not exist on all systems + +**Note**: The exclusion file may contain additional fields from copying the probes file, but only ``type``, ``name``, and ``functions`` are processed during probe discovery. + +categories-HOST-USER.json +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Generated**: Build time (generator phase) + +**Purpose**: Event ID to probe information mapping + +Maps unique event IDs to their corresponding capture probe categories and function names. This is the key lookup table for trace analysis, generated during the same phase as eBPF object compilation. + +**Structure**: Object with event IDs as keys, each mapping to probe metadata + +**Example Structure**: + +.. code-block:: json + + { + "1000": { + "probe_name": "libc", + "function_name": "__GI___fork" + }, + "1010": { + "probe_name": "os_page_cache", + "function_name": "add_to_page_cache_lru" + }, + "100000": { + "probe_name": "custom1", + "function_name": "openat" + } + } + +**Event ID Ranges**: +* **1000-99999**: Standard probes (kprobe, uprobe, syscalls, usdt) +* **100000+**: Custom probes (user-defined via ``start_event_id``) + +This mapping enables: +* Event ID → Function name resolution during trace analysis +* Category grouping for aggregated analysis +* Human-readable trace output + +manual-probes-HOST-USER.json +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Generated**: Build time (generator phase) + +**Purpose**: Probes that cannot be compiled into the eBPF object files + +Contains probes discovered during the generator phase that cannot be statically compiled into eBPF objects. These require runtime resolution and attachment. + +**Structure**: Array of capture probe objects (same as probes file) + +**Common Cases**: +* **Multi-offset symbols**: Functions with multiple addresses due to compiler optimizations or inlining +* **Dynamic libraries**: Symbols only available when library is loaded at runtime +* **Runtime-specific paths**: Kernel modules loaded after boot +* **Unresolvable symbols**: Functions that exist but cannot be compiled into static eBPF programs + +**Example Entry (multiple offsets)**: + +.. code-block:: json + + [ + { + "type": 2, + "name": "ior", + "functions": ["2060", "2061"], + "binary_path": "/home/user/software/ior/bin/ior", + "include_offsets": false + } + ] + +**Note**: The numbers in the ``functions`` array are **event IDs** that correspond to entries in ``categories-HOST-USER.json``. These event IDs reference the actual function names and metadata. These probes are attached dynamically when the DataCrumbs server starts. + +probes-invalid-HOST-USER.json +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Generated**: Runtime (by ``datacrumbs_validator``) + +**Purpose**: Validated probe blacklist - tracks probes that failed validation + +Maintains the same structure as other probe files but lists functions deemed invalid during validation. + +**Structure**: Array of capture probe objects with invalid function lists + +Probes are marked invalid when: +* Attachment fails during validation +* Probe causes system instability +* Symbol no longer exists in current kernel/binary +* Function signature incompatible with tracing + +**Example**: + +.. code-block:: json + + [ + { + "type": 1, + "name": "lustre", + "functions": ["ll_dom_readpage", "lustre_exit", "lustre_init"] + }, + { + "type": 1, + "name": "os_page_cache", + "functions": ["page_cache_sync_readahead"] + } + ] + +Run ``datacrumbs_validator`` after system updates or configuration changes to refresh this list. + +Key Artifacts for Analysis +--------------------------- + +The two most important files for understanding your current tracing configuration: + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - File + - Purpose + * - ``probes-HOST-USER.json`` + - Complete list of active probes organized by capture probe name with all discovered functions + * - ``categories-HOST-USER.json`` + - Event ID → (probe name, function name) mapping for decoding trace events + +**Workflow Integration**: + +1. **Build time - Explorer phase**: Generates ``probes-*.json`` from capture_probes config +2. **User customization**: Edit ``probes-exclusion-*.json`` to exclude unwanted probes +3. **Build time - Generator phase**: Creates ``categories-*.json`` (event ID mappings) and ``manual-probes-*.json`` (probes that cannot be compiled) +4. **Runtime - Validation**: Failed probes recorded in ``probes-invalid-*.json`` by validator +5. **Runtime - Server startup**: Manual probes from step 3 are dynamically attached using event IDs from categories file +6. **Analysis**: Use ``categories-*.json`` to decode event IDs in trace files + +File Management +--------------- + +**Regenerating Data Files**: + +.. code-block:: bash + + # Rebuild to regenerate probes and categories + cd build && make install + +**Viewing Active Probes by Category**: + +.. code-block:: bash + + # Show probe counts per capture probe + jq -r '.[] | "\(.name): \(.functions | length) functions"' \ + /opt/datacrumbs/etc/datacrumbs/data/probes-*.json + +**Checking Event ID Assignments**: + +.. code-block:: bash + + # View event ID mappings + jq '.' /opt/datacrumbs/etc/datacrumbs/data/categories-*.json + +**Finding Specific Function's Event ID**: + +.. code-block:: bash + + # Search for function in categories + jq -r 'to_entries[] | select(.value.function_name=="xfs_file_read_iter") | + "Event ID: \(.key), Probe: \(.value.probe_name)"' \ + /opt/datacrumbs/etc/datacrumbs/data/categories-*.json + +Output Files +============ + +DataCrumbs generates trace and log files during runtime. Understanding the naming conventions and formats is essential for trace analysis. + +Trace Files +----------- + +**Format**: DFTracer format (``.pfw.gz``) + +**Documentation**: https://dftracer.readthedocs.io/en/latest/trace_format.html + +Trace files are compressed binary files containing timestamped events captured by eBPF probes. Each trace file represents the activity of a single process or MPI rank. + +**Naming Convention**: + +The trace file naming convention depends on whether MPI is enabled: + +**Without MPI** (``--disable-mpi``): + +.. code-block:: text + + trace----.pfw.gz + +**Example**: + +.. code-block:: text + + trace-root-12345-node01-docker.pfw.gz + +**With MPI**: + +.. code-block:: text + + trace-----.pfw.gz + +**Example**: + +.. code-block:: text + + trace-haridev-67890-0-4-lead.pfw.gz + trace-haridev-67890-1-4-lead.pfw.gz + trace-haridev-67890-2-4-lead.pfw.gz + trace-haridev-67890-3-4-lead.pfw.gz + +**Filename Components**: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Component + - Description + * - ```` + - Runtime user (from ``DATACRUMBS_USER`` or ``--user``) + * - ```` + - Unique run identifier (from ``--run_id`` argument) + * - ```` + - System hostname (non-MPI mode only) + * - ```` + - MPI process rank (0 to N-1, MPI mode only) + * - ```` + - Total number of MPI processes (MPI mode only) + * - ```` + - Configuration name from command line (e.g., ``lead``, ``docker``) + +**Location**: + +Trace files are written to the directory specified by ``DATACRUMBS_TRACE_DIR`` (or ``--trace_log_dir`` argument). + +**Default**: ``/var/log/datacrumbs`` or configured ``trace_log_dir`` from YAML. + +**Analysis**: + +Trace files can be analyzed using **DFTracer tools**: + +**DFTracer Utilities** - Trace manipulation and statistics: + +.. code-block:: bash + + pip install dftracer-utils + dftracer-stats --input trace-*.pfw.gz + dftracer-merge --input "trace-*-67890-*.pfw.gz" --output merged.pfw.gz + dftracer-split --input merged.pfw.gz --output-dir split-traces/ + +**Documentation**: https://dftracer.readthedocs.io/en/latest/bash_utilities.html + +**DFAnalyzer** - Comprehensive analysis: + +.. code-block:: bash + + pip install dfanalyzer + dfanalyzer analyze --input trace-*.pfw.gz --output report.html + dfanalyzer interactive --input trace-*.pfw.gz + +**Documentation**: https://dftracer.readthedocs.io/projects/analyzer/en/latest/getting-started.html#usage + +The DFTracer format includes: + +* Event timestamps (nanosecond precision) +* Event IDs (mapped via ``categories-*.json``) +* Process/thread information +* Function entry/exit pairs (for duration events) +* Custom event data (for instant events) + +Log Files +--------- + +**Format**: Plain text (``.log``) + +Log files contain human-readable diagnostic and debugging information from the DataCrumbs server and client components. + +**Naming Convention**: + +.. code-block:: text + + datacrumbs--.log + +**Example**: + +.. code-block:: text + + datacrumbs-server-20250122-143052.log + datacrumbs-client-20250122-143105.log + +**Location**: + +Log files are written to the directory specified by ``DATACRUMBS_LOG_DIR`` (or ``--log_dir`` argument). + +**Default**: Current working directory or configured ``log_dir``. + +**Log Levels**: + +* ``ERROR``: Critical errors requiring attention +* ``WARN``: Warnings about potential issues +* ``INFO``: General information about execution +* ``DEBUG``: Detailed debugging information +* ``TRACE``: Fine-grained execution traces + +**Viewing Logs**: + +.. code-block:: bash + + # View recent server logs + tail -f /var/log/datacrumbs/datacrumbs-server-*.log + + # Search for errors + grep ERROR /var/log/datacrumbs/*.log + + # Filter by component + grep "\[ConfigurationManager\]" /var/log/datacrumbs/*.log + +Output Management +----------------- + +**Disk Space Considerations**: + +* Trace files can grow large in high-frequency tracing scenarios +* Compression (``.gz``) reduces file size by ~10x +* Plan storage capacity based on trace duration and probe count + +**Cleanup**: + +.. code-block:: bash + + # Remove old traces (older than 7 days) + find $DATACRUMBS_TRACE_DIR -name "trace-*.pfw.gz" -mtime +7 -delete + + # Archive traces before cleanup + tar czf traces-archive-$(date +%Y%m%d).tar.gz $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + +**Aggregating MPI Traces**: + +For MPI applications, use DFTracer utilities to merge traces from all ranks: + +.. code-block:: bash + + # Install DFTracer utilities + pip install dftracer-utils + + # Merge all ranks for a specific run + dftracer-merge --input "$DATACRUMBS_TRACE_DIR/trace-*-67890-*.pfw.gz" \ + --output "$DATACRUMBS_TRACE_DIR/merged-67890.pfw.gz" + + # Split large merged trace if needed + dftracer-split --input "$DATACRUMBS_TRACE_DIR/merged-67890.pfw.gz" \ + --output-dir "$DATACRUMBS_TRACE_DIR/split-67890/" + + # Analyze merged trace + pip install dfanalyzer + dfanalyzer analyze --input "$DATACRUMBS_TRACE_DIR/merged-67890.pfw.gz" \ + --output "$DATACRUMBS_TRACE_DIR/report-67890.html" + +**Documentation**: + +* DFTracer utilities: https://dftracer.readthedocs.io/en/latest/bash_utilities.html +* DFAnalyzer: https://dftracer.readthedocs.io/projects/analyzer/en/latest/getting-started.html#usage + +Resource Limits +=============== + +DataCrumbs automatically configures system resource limits for optimal eBPF operation: + +File Descriptors +---------------- + +.. code-block:: bash + + # Automatically set to maximum + ulimit -n $(ulimit -H -n) + +eBPF requires many file descriptors for maps, programs, and ring buffers. + +Locked Memory +------------- + +.. code-block:: bash + + # Automatically set to maximum + ulimit -l $(ulimit -H -l) + +eBPF maps and ring buffers use locked memory that cannot be swapped. + +Manual Adjustment +----------------- + +If automatic limits are insufficient: + +.. code-block:: bash + + # Increase hard limits (requires root) + sudo bash -c "echo '* hard nofile 1048576' >> /etc/security/limits.conf" + sudo bash -c "echo '* soft nofile 1048576' >> /etc/security/limits.conf" + + # For current session + ulimit -n 1048576 + ulimit -l unlimited + +Directory Structure After Setup +================================ + +DataCrumbs creates the following directory structure: + +.. code-block:: text + + / + ├── bin/ # User commands + │ ├── datacrumbs_setup + │ ├── datacrumbs_run + │ ├── datacrumbs_track + │ ├── datacrumbs_untrack + │ ├── datacrumbs_wrap + │ └── ... + ├── sbin/ # Admin commands + │ ├── datacrumbs # Main server binary + │ ├── datacrumbs_server_run.sh + │ ├── datacrumbs_server_stop.sh + │ ├── datacrumbs_service_run.sh + │ ├── datacrumbs_service_stop.sh + │ └── ... + ├── lib/ # Libraries + │ ├── libdatacrumbs_client.so + │ ├── libdatacrumbs_obj.so + │ └── ... + ├── libexec/ # Internal components + │ └── datacrumbs/ + │ ├── objects/ # eBPF object files + │ └── composable/ # Composable configurations + └── etc/ + └── datacrumbs/ + ├── configs/ # YAML configuration files + ├── data/ # Probe metadata + ├── modulefiles/ # Environment module files + ├── systemd/ # Systemd service files + └── flux/ # Flux plugin files + +Verification +============ + +Verify your setup is correct: + +.. code-block:: bash + + # Check environment variables + echo $DATACRUMBS_USER + echo $DATACRUMBS_TRACE_DIR + echo $PATH | grep datacrumbs + + # Check resource limits + ulimit -n + ulimit -l + + # Check available commands + which datacrumbs_run + which datacrumbs_track + + # Test validator + datacrumbs_validator + +Multiple User Setup +=================== + +For shared installations where multiple users will use DataCrumbs: + +Build Configuration +------------------- + +.. code-block:: bash + + # Build with shared install user + cmake -DCMAKE_INSTALL_PREFIX=/opt/datacrumbs \ + -DDATACRUMBS_INSTALL_USER=shared \ + .. + +Each User Setup +--------------- + +.. code-block:: bash + + # Each user loads the module + module use /opt/datacrumbs/etc/datacrumbs/modulefiles + module load datacrumbs/0.0.4 + + # User-specific trace directory + export DATACRUMBS_TRACE_DIR=/scratch/$USER/traces + +Per-User Configuration +---------------------- + +Users can override some default settings: + +.. code-block:: bash + + # Custom log directory (if administrator enabled this) + export DATACRUMBS_CONFIGURED_LOG_DIR=/custom/logs + +.. note:: + **Trace directory cannot be overridden at runtime**. The trace directory (``DATACRUMBS_TRACE_DIR``) is set by the administrator during installation via the ``trace_dir`` or ``trace_dir_pattern`` configuration in the project YAML file. Users cannot change this location. + +Troubleshooting +=============== + +Setup Script Not Found +----------------------- + +.. code-block:: bash + + # Verify installation + ls /path/to/install/bin/datacrumbs_setup + + # Check PATH + export PATH=/path/to/install/bin:$PATH + +Permission Issues +----------------- + +.. code-block:: bash + + # Ensure directories are accessible + ls -la $DATACRUMBS_TRACE_DIR + ls -la $DATACRUMBS_SERVER_RUN_DIR + + # Create if needed + mkdir -p $DATACRUMBS_TRACE_DIR + mkdir -p $DATACRUMBS_SERVER_RUN_DIR + +Module Not Found +---------------- + +.. code-block:: bash + + # Verify module path + module use /path/to/install/etc/datacrumbs/modulefiles + + # List available modules + module avail datacrumbs + +Resource Limit Errors +--------------------- + +.. code-block:: bash + + # Check current limits + ulimit -a + + # Increase if needed (as root) + sudo pam_limits.so + +Configuration File Errors +------------------------- + +.. code-block:: bash + + # Verify configuration files exist + ls $PREFIX/etc/datacrumbs/configs/ + + # Check YAML syntax + python3 -c "import yaml; yaml.safe_load(open('config.yaml'))" diff --git a/docs/tuo.rst b/docs/tuo.rst deleted file mode 100644 index 58a8c31e..00000000 --- a/docs/tuo.rst +++ /dev/null @@ -1,20 +0,0 @@ - -1. Modules to be loaded - - .. code-block:: bash - - module load gcc/11.2.0 - export CC=`which gcc` - export CXX=`which g++` - -2. BPF Time configuration for Tuo - - .. code-block:: bash - - export BPFTIME_SHM_MEMORY_MB=10240 - export BPFTIME_MAX_FD_COUNT=128000 - bpftime --install-location $PREFIX/lib load /usr/workspace/haridev/datacrumbs/build/bin/datacrumbs "run" "tuolumne-mpiio" "--user" "haridev" "--config_path" "/usr/workspace/haridev/datacrumbs/etc/datacrumbs/configs" "--data_dir" "/usr/workspace/haridev/datacrumbs/etc/datacrumbs/data" "--trace_log_dir" "/usr/workspace/haridev/datacrumbs/etc/datacrumbs/logs" - add-auto-load-safe-path /opt/cray/pe/gcc/11.2.0/snos/lib64/libstdc++.so.6.0.29-gdb.py - set follow-fork-mode child - set detach-on-fork off - set print-frame-arguments all \ No newline at end of file diff --git a/docs/usage.rst b/docs/usage.rst new file mode 100755 index 00000000..b9e986dd --- /dev/null +++ b/docs/usage.rst @@ -0,0 +1,832 @@ +================= +Using DataCrumbs +================= + +DataCrumbs provides multiple modes of operation for tracing applications. This guide covers all usage patterns. + +Quick Start +=========== + +**Recommended: Use Binary Tracking** + +Applications should be instrumented using ``datacrumbs_track`` (recommended) or ``datacrumbs_wrap``: + +.. code-block:: bash + + # Source setup + source /path/to/install/bin/datacrumbs_setup + + # Recommended: Track the application (permanent instrumentation) + datacrumbs_track --executable ./myapp + datacrumbs_run --app "./myapp arg1 arg2" + + # Alternative: Wrap the application (runtime instrumentation) + datacrumbs_run --app "datacrumbs_wrap ./myapp arg1 arg2" + +This automatically: + +1. Starts the DataCrumbs server +2. Runs your instrumented application with tracing enabled +3. Stops the server and collects traces + +.. note:: + **Tracked applications work normally when DataCrumbs is not running** - they simply won't capture trace data. When the DataCrumbs server is running, data is automatically captured. When it's not running, the application executes normally with no tracing overhead. + +Common Script Options +===================== + +All DataCrumbs scripts support the following options: + +.. list-table:: Common Script Options + :header-rows: 1 + :widths: 20 80 + + * - Option + - Description + * - ``--verbose`` + - Enable detailed output for debugging and monitoring + * - ``--quiet`` + - Suppress informational messages (errors still shown) + * - ``--dry-run`` + - Show what would be executed without actually running commands + +Example usage: + +.. code-block:: bash + + # Verbose mode to see detailed operations + datacrumbs_run --verbose --app "./myapp" + + # Quiet mode for automated scripts + datacrumbs_run --quiet --app "./batch_job" + + # Dry-run to preview actions + datacrumbs_track --dry-run --executable ./myapp + + # Combine options + datacrumbs_compose --action discover --verbose + +Usage Modes +=========== + +DataCrumbs supports three primary usage modes: + +1. **Wrapper Mode** (``datacrumbs_run``): Easiest - wraps application execution +2. **Server Mode** (``datacrumbs_server_run.sh``): Long-running server for multiple sessions +3. **Service Mode** (``datacrumbs_service_run.sh``): Systemd service integration + +Wrapper Mode +============ + +Use ``datacrumbs_run`` for single application tracing sessions. + +Basic Usage +----------- + +.. code-block:: bash + + datacrumbs_run --app "command args" + +Example: Trace a Simple Program +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + # Trace dd command + datacrumbs_run --app "dd if=/dev/zero of=/tmp/test.dat bs=1M count=100" + + # Trace Python script + datacrumbs_run --app "python3 myanalysis.py" + + # Trace with complex arguments + datacrumbs_run --app "tar -czf backup.tar.gz /data/important" + +MPI Applications +---------------- + +For MPI applications, specify node and process configuration. The MPI launcher (e.g., ``mpirun``, ``srun``, ``flux run``) is configured in the project YAML and automatically used by DataCrumbs. + +.. code-block:: bash + + datacrumbs_run --app "./mpiapp input.dat" --enable_mpi --nodes 4 --ppn 8 + +**Options:** + +- ``--enable_mpi``: Enable MPI mode +- ``--nodes N``: Number of nodes to use +- ``--ppn N``: Processes per node + +.. note:: + Do not include the MPI launcher (``mpirun``, ``srun``, etc.) in the ``--app`` command. DataCrumbs automatically uses the launcher configured in ``project.yaml`` (``job.run`` setting). + +Example: MPI Application +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + # Run 32 processes (4 nodes × 8 processes/node) + datacrumbs_run --app "./myapp" --enable_mpi --nodes 4 --ppn 8 + + # With arguments + datacrumbs_run --app "./simulation input.dat" --enable_mpi --nodes 2 --ppn 16 + +Command Reference: datacrumbs_run +---------------------------------- + +**Synopsis:** + +.. code-block:: bash + + datacrumbs_run --app "COMMAND" [OPTIONS] + +**Required Arguments:** + +``--app "COMMAND"`` + Application command with arguments (quoted) + +**Optional Arguments:** + +``--enable_mpi`` + Enable MPI support (default: disabled) + +``--nodes N`` + Number of nodes for MPI execution (default: 1) + +``--ppn N`` + Processes per node for MPI execution (default: 1) + +**Examples:** + +.. code-block:: bash + + # Single process + datacrumbs_run --app "./myapp input.txt" + + # MPI with 16 processes on 2 nodes + datacrumbs_run --app "./parallel_app" --enable_mpi --nodes 2 --ppn 8 + + # Complex command with pipes and redirection + datacrumbs_run --app "cat largefile.dat | ./process > output.txt" + +Output Location +--------------- + +**Trace Files** (DFTracer format): + +Traces are saved to ``$DATACRUMBS_TRACE_DIR`` with naming based on MPI mode: + +.. code-block:: bash + + # Without MPI: + $DATACRUMBS_TRACE_DIR/trace----.pfw.gz + + # With MPI: + $DATACRUMBS_TRACE_DIR/trace-----.pfw.gz + +**Example filenames**: + +.. code-block:: text + + trace-root-12345-node01-docker.pfw.gz # Non-MPI mode + trace-haridev-67890-0-4-lead.pfw.gz # MPI rank 0 of 4 + trace-haridev-67890-3-4-lead.pfw.gz # MPI rank 3 of 4 + +**Log Files**: + +Logs are saved to ``$DATACRUMBS_LOG_DIR``: + +.. code-block:: bash + + $DATACRUMBS_LOG_DIR/datacrumbs-server-.log + $DATACRUMBS_LOG_DIR/datacrumbs-client-.log + +See :doc:`setup` Output Files section for detailed format information. + +Server Mode +=========== + +Use server mode when you want to run multiple tracing sessions without restarting the server. + +**Prerequisites**: Applications must be instrumented before the server can trace them. + +Starting the Server +------------------- + +.. code-block:: bash + + sudo datacrumbs_server_run.sh + +The server: + +- Runs in the background +- Listens for traced applications +- Collects events from all traced processes +- Writes traces continuously to ``.pfw.gz`` files + +Starting with Composable Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: bash + + sudo datacrumbs_server_run.sh --composite-name myconfig + +Instrumenting Applications +-------------------------- + +**Before** running the server, instrument your applications: + +.. code-block:: bash + + # Method 1: Track binary (permanent modification) + datacrumbs_track --executable ./myapp + + # Method 2: Use wrap script (runtime injection) + # No pre-tracking needed for wrap mode + +Running Applications +-------------------- + +With the server running and applications instrumented: + +.. code-block:: bash + + # Run tracked binary + ./myapp + + # Or use wrap mode + datacrumbs_wrap ./otherapp arg1 arg2 + +Stopping the Server +------------------- + +.. code-block:: bash + + sudo datacrumbs_server_stop.sh + +This: + +- Stops the eBPF programs +- Flushes remaining events +- Closes trace files +- Cleans up resources + +Command Reference: datacrumbs_server_run.sh +------------------------------------------- + +**Synopsis:** + +.. code-block:: bash + + sudo datacrumbs_server_run.sh [OPTIONS] + +**Optional Arguments:** + +``--composite-name NAME`` + Use custom composable configuration (default: standard configuration) + +``--enable-mpi`` + Enable MPI support + +``--nodes N`` + Number of nodes (default: 1) + +``--ppn N`` + Processes per node (default: 1) + +**Examples:** + +.. code-block:: bash + + # Start standard server + sudo datacrumbs_server_run.sh + + # Start with custom configuration + sudo datacrumbs_server_run.sh --composite-name hdf5_only + + # Start for MPI environment + sudo datacrumbs_server_run.sh --enable-mpi --nodes 4 --ppn 16 + +Command Reference: datacrumbs_server_stop.sh +-------------------------------------------- + +**Synopsis:** + +.. code-block:: bash + + sudo datacrumbs_server_stop.sh [OPTIONS] + +**Optional Arguments:** + +``--composite-name NAME`` + Stop server for specific composable configuration + +**Examples:** + +.. code-block:: bash + + # Stop standard server + sudo datacrumbs_server_stop.sh + + # Stop specific composable server + sudo datacrumbs_server_stop.sh --composite-name hdf5_only + +Service Mode (Systemd) +======================= + +Service mode integrates DataCrumbs with systemd for managed, persistent tracing. + +Service Installation +-------------------- + +The systemd service file is installed at: + +.. code-block:: text + + /etc/datacrumbs/systemd/datacrumbs@.service + +Starting the Service +-------------------- + +.. code-block:: bash + + # Enable and start service for current user + sudo systemctl enable datacrumbs@$USER.service + sudo systemctl start datacrumbs@$USER.service + +The service: + +- Starts automatically at boot +- Restarts on failure +- Logs to systemd journal +- Runs with appropriate privileges + +Using Service Scripts +^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, use the provided scripts: + +.. code-block:: bash + + # Start service + sudo datacrumbs_service_run.sh + + # Stop service + sudo datacrumbs_service_stop.sh + +Checking Service Status +----------------------- + +.. code-block:: bash + + # Check status + sudo systemctl status datacrumbs@$USER.service + + # View logs + sudo journalctl -u datacrumbs@$USER.service -f + + # Check if running + ps aux | grep datacrumbs + +Stopping the Service +-------------------- + +.. code-block:: bash + + # Stop service + sudo systemctl stop datacrumbs@$USER.service + + # Disable automatic startup + sudo systemctl disable datacrumbs@$USER.service + + # Or use script + sudo datacrumbs_service_stop.sh + +Command Reference: datacrumbs_service_run.sh +-------------------------------------------- + +**Synopsis:** + +.. code-block:: bash + + sudo datacrumbs_service_run.sh + +**Description:** + +Starts DataCrumbs as a systemd service. The service is automatically enabled and started. + +**Prerequisites:** + +- Root or sudo access +- Systemd service file installed +- Environment configured via ``datacrumbs_setup`` + +Command Reference: datacrumbs_service_stop.sh +--------------------------------------------- + +**Synopsis:** + +.. code-block:: bash + + sudo datacrumbs_service_stop.sh + +**Description:** + +Stops the DataCrumbs systemd service. + +Composable Mode +=============== + +Composable mode allows using custom-built DataCrumbs configurations for specialized tracing scenarios. + +Creating a Composable Configuration +------------------------------------ + +.. code-block:: bash + + # Discover available probes + sudo datacrumbs_compose --action discover + + # Build custom configuration + sudo datacrumbs_compose --action build --name myconfig + +Running with Composable +------------------------ + +.. code-block:: bash + + # Using run wrapper + datacrumbs_compose_run --composite-name myconfig + + # Or start server with composable + sudo datacrumbs_server_run.sh --composite-name myconfig + +Command Reference: datacrumbs_compose +------------------------------------- + +**Synopsis:** + +.. code-block:: bash + + sudo datacrumbs_compose --action ACTION [OPTIONS] + +**Arguments:** + +``--action ACTION`` + Action to perform: ``discover``, ``build``, ``clean`` + +``--name NAME`` + Name for the composable configuration + +**Examples:** + +.. code-block:: bash + + # Discover available probes + sudo datacrumbs_compose --action discover + + # Build custom config + sudo datacrumbs_compose --action build --name hdf5_posix + + # Clean composable builds + sudo datacrumbs_compose --action clean + +Advanced Usage +============== + +Filtering by Path +----------------- + +**Administrator Configuration Only** + +Path filtering must be configured by the system administrator at build time and cannot be changed by users at runtime. + +.. code-block:: bash + + # Administrator sets inclusion path at build time: + # cmake -DDATACRUMBS_INCLUSION_PATH=/scratch/data .. + # make install + # + # Or via project YAML configuration: + # inclusion_path: /scratch/data + +Once configured, only I/O operations on files under the specified path (e.g., ``/scratch/data``) will be traced. + +.. note:: + Users cannot change the inclusion path at runtime. Contact your system administrator to modify path filtering. + +Multi-Node Tracing +------------------ + +For distributed tracing across multiple nodes: + +.. code-block:: bash + + # Start server on each node (via scheduler) + srun -N 4 sudo datacrumbs_server_run.sh --enable-mpi --nodes 4 + + # Run application + srun -N 4 -n 32 ./mpi_app + + # Stop servers + srun -N 4 sudo datacrumbs_server_stop.sh + +Traces are collected independently on each node. + +Integration with Job Schedulers +================================ + +SLURM +----- + +.. code-block:: bash + + #!/bin/bash + #SBATCH -N 4 + #SBATCH -n 32 + #SBATCH -t 1:00:00 + + # Load DataCrumbs + module load datacrumbs/0.0.4 + + # Run with tracing + datacrumbs_run --app "./myapp" --enable_mpi --nodes 4 --ppn 8 + +FLUX +---- + +.. code-block:: bash + + #!/bin/bash + + # Load DataCrumbs + module load datacrumbs/0.0.4 + + # Submit job with tracing + flux run -N 4 -n 32 datacrumbs_run --app "./myapp" --enable_mpi + +OpenMPI (Standalone) +-------------------- + +.. code-block:: bash + + # Load DataCrumbs and MPI + module load datacrumbs/0.0.4 + module load openmpi + + # Run with tracing (MPI launcher configured in project.yaml) + datacrumbs_run --app "./myapp" --enable_mpi --nodes 4 --ppn 8 + +Trace Analysis +============== + +Viewing Traces +-------------- + +DataCrumbs outputs traces in **DFTracer format** (``.pfw.gz`` compressed files): + +.. code-block:: bash + + # Find your traces + ls $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + + # Example output: + # trace-root-12345-node01-docker.pfw.gz + # trace-haridev-67890-0-4-lead.pfw.gz + +**Format**: DFTracer format - see https://dftracer.readthedocs.io/en/latest/trace_format.html + +The trace includes: + +- Timestamped events (nanosecond precision) +- Event IDs (mapped via ``categories-*.json``) +- Function entry/exit pairs +- Process/thread/rank information +- File access patterns + +Analyzing Traces with DFTracer Tools +------------------------------------- + +**DFTracer Utilities** + +Use DFTracer utilities for trace manipulation and inspection: + +.. code-block:: bash + + # Install DFTracer utilities + pip install dftracer-utils + + # Get trace statistics + dftracer-stats --input trace-*.pfw.gz + + # Merge multiple trace files (e.g., from MPI ranks) + dftracer-merge --input "trace-*-67890-*.pfw.gz" --output merged-trace.pfw.gz + + # Split large trace files + dftracer-split --input merged-trace.pfw.gz --output-dir split-traces/ + +**Documentation**: https://dftracer.readthedocs.io/en/latest/bash_utilities.html + +**DFAnalyzer - Comprehensive Analysis** + +For detailed analysis, use DFAnalyzer: + +.. code-block:: bash + + # Install DFAnalyzer + pip install dfanalyzer + + # Generate analysis report + dfanalyzer analyze --input trace-*.pfw.gz --output report.html + + # Interactive analysis + dfanalyzer interactive --input trace-*.pfw.gz + + # Export to CSV for custom analysis + dfanalyzer export --input trace-*.pfw.gz --format csv --output trace-data.csv + +**Documentation**: https://dftracer.readthedocs.io/projects/analyzer/en/latest/getting-started.html#usage + +Custom Analysis Scripts +----------------------- + +DataCrumbs also includes Jupyter notebooks for custom analysis: + +.. code-block:: bash + + # Navigate to analysis directory + cd $DATACRUMBS_INSTALL/share/datacrumbs/analysis + + # Install dependencies + pip install -r requirements.txt + + # Run analysis notebook + jupyter notebook analysis.ipynb + +Troubleshooting +=============== + +Permission Denied Errors +------------------------ + +.. code-block:: bash + + # Ensure sudo for server operations + sudo datacrumbs_server_run.sh + + # Check ulimits + ulimit -n + ulimit -l + + # Increase if needed + ulimit -n 1048576 + ulimit -l unlimited + +Server Won't Start +------------------ + +.. code-block:: bash + + # Check if already running + ps aux | grep datacrumbs + + # Check logs + cat $DATACRUMBS_TRACE_DIR/datacrumbs.log + + # Verify eBPF support + ls /sys/kernel/btf/vmlinux + + # Check for port conflicts + sudo lsof -i -P -n | grep datacrumbs + +No Traces Generated +------------------- + +.. code-block:: bash + + # Verify server is running + ps aux | grep datacrumbs + + # Check trace directory exists + ls -la $DATACRUMBS_TRACE_DIR + + # Verify application is instrumented + ldd ./myapp | grep datacrumbs + + # Check logs for errors + tail -f $DATACRUMBS_TRACE_DIR/datacrumbs.log + +High Overhead +------------- + +.. code-block:: bash + + # Reduce traced events + export DATACRUMBS_SKIP_SMALL_EVENTS_THRESHOLD_NS=10000 + + # Use profiling mode instead of tracing + # (Administrator must rebuild with -DDATACRUMBS_MODE_STR=PROFILE) + + # Path filtering (Administrator only - set at build time) + # Contact your administrator to enable path filtering + +Missing Events +-------------- + +.. code-block:: bash + + # Increase ring buffer size + # (Rebuild with -DDATACRUMBS_TRACE_RINGBUF_SIZE_MB=64) + + # Check for event drops + grep "dropped" $DATACRUMBS_TRACE_DIR/datacrumbs.log + +Best Practices +============== + +1. **Use binary tracking** (``datacrumbs_track``) - recommended for most use cases; apps run normally when DataCrumbs is not active +2. **Use wrapper mode** (``datacrumbs_run``) for simplicity and automatic server management +3. **Use server mode** for multiple short-running applications +4. **Use service mode** for continuous, production monitoring +5. **Path filtering** (administrator only) - contact your admin to enable filtering by specific paths +6. **Increase ring buffer** for high-throughput I/O applications +7. **Check logs** regularly for warnings or errors +8. **Clean old traces** periodically to free disk space +9. **Test on small workloads** before production runs +10. **Use composables** for specialized tracing needs +11. **Monitor overhead** and adjust thresholds as needed + +Examples +======== + +Example 1: Trace HDF5 Application +---------------------------------- + +.. code-block:: bash + + # Load environment + module load datacrumbs/0.0.4 + module load hdf5 + + # Run with tracing + datacrumbs_run --app "./hdf5_writer dataset.h5" + + # View trace files (.pfw.gz format) + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + +Example 2: Trace MPI-IO Application +------------------------------------ + +.. code-block:: bash + + # Load modules + module load datacrumbs/0.0.4 + module load openmpi + + # Run MPI application with tracing (64 processes on 4 nodes) + datacrumbs_run --app "./parallel_io" \ + --enable_mpi --nodes 4 --ppn 16 + + # View traces from all ranks (64 .pfw.gz files, one per rank) + ls -lh $DATACRUMBS_TRACE_DIR/trace-*-*-64-*.pfw.gz + +Example 3: Long-Running Server +------------------------------- + +.. code-block:: bash + + # Start server + sudo datacrumbs_server_run.sh + + # Track multiple applications + datacrumbs_track --executable ./app1 + datacrumbs_track --executable ./app2 + + # Run applications (they're automatically traced) + ./app1 & + ./app2 & + + # Wait for completion + wait + + # Stop server + sudo datacrumbs_server_stop.sh + + # View collected traces + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz + +Example 4: Filtered Tracing +---------------------------- + +**Prerequisite**: Administrator must have configured path filtering at build time. + +.. code-block:: bash + + # If administrator configured filtering for /scratch filesystem: + # cmake -DDATACRUMBS_INCLUSION_PATH=/scratch .. + + # Run application - only /scratch I/O will be traced + datacrumbs_run --app "./mixed_io" + + # Only /scratch I/O operations are in the trace + # View the generated trace file + ls -lh $DATACRUMBS_TRACE_DIR/trace-*.pfw.gz From f6a8428186d48f1d534de846ff2a18b03c3bbe6c Mon Sep 17 00:00:00 2001 From: Hariharan Devarajan Date: Fri, 28 Nov 2025 17:40:45 -0800 Subject: [PATCH 5/6] add linting for sh and cmake files. --- .cmake-format | 7 + .editorconfig | 17 + .github/workflows/format-check.yml | 15 + .shellcheckrc | 15 + cmake/modules/datacrumbs-utils.cmake | 1142 ++++++++++------- etc/datacrumbs/data/compact.sh | 6 +- infrastructure/docker/Dockerfile | 1 + infrastructure/docker/build-multiarch.sh | 269 ++-- scripts/datacrumbs/datacrumbs_args.in | 1028 ++++++++------- scripts/datacrumbs/datacrumbs_compose.in | 162 +-- scripts/datacrumbs/datacrumbs_compose_run.in | 86 +- .../datacrumbs/datacrumbs_compose_wrapper.in | 6 +- .../datacrumbs/datacrumbs_create_log_dir.in | 12 +- scripts/datacrumbs/datacrumbs_logging.in | 84 +- scripts/datacrumbs/datacrumbs_run.in | 40 +- .../datacrumbs/datacrumbs_run_validator.in | 2 +- scripts/datacrumbs/datacrumbs_salloc.in | 1 - .../datacrumbs/datacrumbs_server_run.sh.in | 25 +- .../datacrumbs/datacrumbs_server_stop.sh.in | 27 +- .../datacrumbs_service_common.sh.in | 118 +- .../datacrumbs/datacrumbs_service_run.sh.in | 10 +- .../datacrumbs/datacrumbs_service_stop.sh.in | 5 +- scripts/datacrumbs/datacrumbs_setup.in | 85 +- scripts/datacrumbs/datacrumbs_stop.in | 11 +- scripts/datacrumbs/datacrumbs_track.in | 57 +- scripts/datacrumbs/datacrumbs_untrack.in | 58 +- scripts/datacrumbs/datacrumbs_utility.in | 369 +++--- scripts/datacrumbs/datacrumbs_wrap.in | 6 +- scripts/docker-build.sh | 228 ++-- scripts/formatting/autoformat.sh | 60 +- scripts/formatting/check-formatting.sh | 76 +- src/datacrumbs/composable/CMakeLists.txt.in | 131 +- tests/CMakeLists.txt | 2 +- tests/benchmarks/ior/CMakeLists.txt | 89 +- tests/unittests/CMakeLists.txt | 2 +- tests/unittests/io_tests/CMakeLists.txt | 26 +- tests/unittests/io_tests/scripts/ior.sh | 7 +- .../io_tests/scripts/ior_hdf5_fpp.sh | 6 +- tests/unittests/io_tests/scripts/ior_mpiio.sh | 6 +- .../unittests/io_tests/scripts/test_posix.sh | 9 +- .../io_tests/scripts/test_posix_overhead.sh | 24 +- .../io_tests/scripts/test_posix_read.sh | 7 +- .../unittests/io_tests/scripts/test_stdio.sh | 7 +- tools/CMakeLists.txt | 2 +- tools/analyze_trace.sh | 152 +-- tools/separator.sh | 24 +- 46 files changed, 2425 insertions(+), 2097 deletions(-) create mode 100644 .cmake-format create mode 100644 .editorconfig create mode 100644 .shellcheckrc diff --git a/.cmake-format b/.cmake-format new file mode 100644 index 00000000..120fb4c6 --- /dev/null +++ b/.cmake-format @@ -0,0 +1,7 @@ +format: + tab_size: 2 + line_width: 100 + dangle_parens: true + max_pargs_hwrap: 3 + separate_ctrl_name_with_space: false + separate_fn_name_with_space: false \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..b3319554 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[CMakeLists.txt] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{sh,sh.in}] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 88af70ce..47c797b2 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -13,12 +13,27 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.21' + - name: Install clang-format run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ build-essential \ clang-format-19 + + - name: Install shfmt + run: | + go install mvdan.cc/sh/v3/cmd/shfmt@latest + echo "$HOME/go/bin" >> $GITHUB_PATH + + - name: Install cmake-format + run: | + sudo apt-get install -y python3-pip + sudo pip3 install cmake-format - name: Test formatting run: | diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 00000000..3daa6cfe --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,15 @@ +# .shellcheckrc for CMake templates +# Allow @placeholder@ sourcing +disable=SC1090,SC1091 +# Allow sed patterns with @ symbols +disable=SC2001 +# Allow @VAR@ unquoted (will be replaced) +disable=SC2086 +disable=SC2050 +disable=SC2155 + +# Enforce style +# Use [[ ]] consistently +enable=require-double-brackets +# Use ${var} consistently +enable=require-variable-braces \ No newline at end of file diff --git a/cmake/modules/datacrumbs-utils.cmake b/cmake/modules/datacrumbs-utils.cmake index 1c86f0fb..2091fdc4 100644 --- a/cmake/modules/datacrumbs-utils.cmake +++ b/cmake/modules/datacrumbs-utils.cmake @@ -1,527 +1,693 @@ function(print_all_variables) - message(STATUS "CMake Variables:") - get_cmake_property(_variableNames VARIABLES) - list(SORT _variableNames) + message(STATUS "CMake Variables:") + get_cmake_property(_variableNames VARIABLES) + list(SORT _variableNames) - foreach(_variableName ${_variableNames}) - message(STATUS "${_variableName}=${${_variableName}}") - endforeach() + foreach(_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") + endforeach() endfunction() macro(include_dependencies) - # ------------------------------------------------------------------------------ - # Find all dependencies - # ------------------------------------------------------------------------------ - set(DEPENDENCY_LIBRARY_DIRS "") - set(DEPENDENCY_LIB ${CMAKE_EXE_LINKER_FLAGS} $ENV{LDFLAGS} -lpthread) - - message(STATUS "[${UPPER_PROJECT_NAME}] Detecting dependencies") - - # find packages - find_package(PkgConfig REQUIRED) - pkg_check_modules(LIBBPF libbpf) - find_package(yaml-cpp REQUIRED) - find_package(LLVM REQUIRED CONFIG COMPONENTS Clang) - find_package(json-c REQUIRED) - find_package(ZLIB REQUIRED) - find_package(MPI REQUIRED COMPONENTS CXX QUIET) - - # all validator - if(LIBBPF_VERSION VERSION_LESS "1.0.0") - message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] libbpf version 1.0.0 or newer is required, but found ${LIBBPF_VERSION}") - endif() - - set(PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}) - - # include all links - if(LIBBPF_FOUND) - include_directories(${LIBBPF_INCLUDEDIR}) - link_directories(${LIBBPF_LIBRARY_DIRS}) - - # If LIBBPF_LIBRARY_DIRS is not set, try LIBBPF_LIBDIR, else get parent dir of LIBBPF_LINK_LIBRARIES - if(NOT LIBBPF_LIBRARY_DIRS) - if(LIBBPF_LIBDIR) - set(LIBBPF_LIBRARY_DIRS "${LIBBPF_LIBDIR}") - elseif(LIBBPF_LINK_LIBRARIES) - get_filename_component(_LIBBPF_LIB_PARENT "${LIBBPF_LINK_LIBRARIES}" DIRECTORY) - set(LIBBPF_LIBRARY_DIRS "${_LIBBPF_LIB_PARENT}") - endif() - endif() - - list(APPEND DEPENDENCY_LIBRARY_DIRS ${LIBBPF_LIBRARY_DIRS}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -L${LIBBPF_LIBRARY_DIRS} -lbpf -lelf) - else() - message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] libbpf not found!") - endif() - - if(${yaml-cpp_FOUND}) - get_filename_component(YAML_CPP_INCLUDE_DIR "${YAML_CPP_INCLUDE_DIR}" ABSOLUTE) - include_directories(${YAML_CPP_INCLUDE_DIR}) - - if(NOT DEFINED YAML_CPP_LIBRARY_DIR) - get_filename_component(YAML_CPP_LIBRARY_DIR "${YAML_CPP_CMAKE_DIR}/../../" ABSOLUTE) - get_filename_component(YAML_CPP_LIBRARY_DIR "${YAML_CPP_LIBRARY_DIR}" ABSOLUTE) - endif() - - list(APPEND DEPENDENCY_LIBRARY_DIRS ${YAML_CPP_LIBRARY_DIR}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -L${YAML_CPP_LIBRARY_DIR} -lyaml-cpp) - else() - message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] yaml-cpp is needed for ${PROJECT_NAME} build") - endif() - - if(LLVM_FOUND) - include_directories(${LLVM_INCLUDE_DIRS}) - link_directories(${LLVM_LIBRARY_DIRS}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} ${LLVM_LIBRARIES} -lclang) - set(CLANG_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/clang) - - if(NOT EXISTS ${CLANG_EXECUTABLE}) - message(FATAL_ERROR "clang executable not found at ${CLANG_EXECUTABLE}. Please check your LLVM installation.") - else() - execute_process( - COMMAND ${CLANG_EXECUTABLE} --version - OUTPUT_VARIABLE CLANG_VERSION_OUTPUT - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET - COMMAND_ECHO NONE - ) - - # message(STATUS "[${UPPER_PROJECT_NAME}] Found clang executable: ${CLANG_EXECUTABLE}") - # message(STATUS "[${UPPER_PROJECT_NAME}] clang version: ${CLANG_VERSION_OUTPUT}") - endif() - else() - message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] LLVM is needed for ${PROJECT_NAME} build") - endif() - - if(json-c_FOUND) - get_filename_component(json-c_INCLUDE_DIR "${json-c_DIR}/../../../include" ABSOLUTE) - get_filename_component(json-c_LIBRARY_DIR "${json-c_DIR}/../../" ABSOLUTE) - include_directories(${json-c_INCLUDE_DIR}) - list(APPEND DEPENDENCY_LIBRARY_DIRS ${json-c_LIBRARY_DIR}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -ljson-c) - else() - message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] json-c is needed for ${PROJECT_NAME} build") - endif() - - if(ZLIB_FOUND) - include_directories(${ZLIB_INCLUDE_DIRS}) - get_filename_component(ZLIB_LIBRARY_DIRS "${ZLIB_LIBRARIES}/../" ABSOLUTE) - list(APPEND DEPENDENCY_LIBRARY_DIRS ${ZLIB_LIBRARY_DIRS}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -lz) - else() - message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] zlib is needed for ${PROJECT_NAME} build") - endif() - - if(${MPI_CXX_FOUND}) - # MPI_CXX_FOUND MPI_CXX_VERSION MPI_CXX_INCLUDE_DIRS MPI_CXX_LIBRARIES - get_filename_component(MPI_CXX_INCLUDE_DIRS "${MPI_CXX_INCLUDE_DIRS}" ABSOLUTE) - include_directories(${MPI_CXX_INCLUDE_DIRS}) - - if(NOT DEFINED MPI_CXX_LIBRARY_DIR) - if(MPI_CXX_LIBRARIES) - # If MPI_CXX_LIBRARIES is a list, get parent dir of each library - set(MPI_CXX_LIBRARY_DIR "") - - foreach(_lib ${MPI_CXX_LIBRARIES}) - get_filename_component(_lib_dir "${_lib}" DIRECTORY) - get_filename_component(_lib_dir "${_lib_dir}" ABSOLUTE) - list(APPEND MPI_CXX_LIBRARY_DIR "${_lib_dir}") - endforeach() - - list(REMOVE_DUPLICATES MPI_CXX_LIBRARY_DIR) - else() - get_filename_component(MPI_CXX_LIBRARY_DIR "${MPI_CXX_LIBRARIES}" DIRECTORY) - set(MPI_CXX_LIBRARY_DIR "${MPI_CXX_LIBRARY_DIR}") - endif() - endif() - - list(APPEND DEPENDENCY_LIBRARY_DIRS ${MPI_CXX_LIBRARY_DIR}) - set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -L${MPI_CXX_LIBRARY_DIR} ${MPI_CXX_LIBRARIES}) + # ------------------------------------------------------------------------------ + # Find all dependencies + # ------------------------------------------------------------------------------ + set(DEPENDENCY_LIBRARY_DIRS "") + set(DEPENDENCY_LIB ${CMAKE_EXE_LINKER_FLAGS} $ENV{LDFLAGS} -lpthread) + + message(STATUS "[${UPPER_PROJECT_NAME}] Detecting dependencies") + + # find packages + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBBPF libbpf) + find_package(yaml-cpp REQUIRED) + find_package(LLVM REQUIRED CONFIG COMPONENTS Clang) + find_package(json-c REQUIRED) + find_package(ZLIB REQUIRED) + find_package( + MPI REQUIRED + COMPONENTS CXX + QUIET + ) + + # all validator + if(LIBBPF_VERSION VERSION_LESS "1.0.0") + message( + FATAL_ERROR + "[${UPPER_PROJECT_NAME}] libbpf version 1.0.0 or newer is required, but found ${LIBBPF_VERSION}" + ) + endif() + + set(PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}) + + # include all links + if(LIBBPF_FOUND) + include_directories(${LIBBPF_INCLUDEDIR}) + link_directories(${LIBBPF_LIBRARY_DIRS}) + + # If LIBBPF_LIBRARY_DIRS is not set, try LIBBPF_LIBDIR, else get parent dir of + # LIBBPF_LINK_LIBRARIES + if(NOT LIBBPF_LIBRARY_DIRS) + if(LIBBPF_LIBDIR) + set(LIBBPF_LIBRARY_DIRS "${LIBBPF_LIBDIR}") + elseif(LIBBPF_LINK_LIBRARIES) + get_filename_component(_LIBBPF_LIB_PARENT "${LIBBPF_LINK_LIBRARIES}" DIRECTORY) + set(LIBBPF_LIBRARY_DIRS "${_LIBBPF_LIB_PARENT}") + endif() + endif() + + list(APPEND DEPENDENCY_LIBRARY_DIRS ${LIBBPF_LIBRARY_DIRS}) + set(DEPENDENCY_LIB + ${DEPENDENCY_LIB} + -L${LIBBPF_LIBRARY_DIRS} + -lbpf + -lelf + ) + else() + message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] libbpf not found!") + endif() + + if(${yaml-cpp_FOUND}) + get_filename_component(YAML_CPP_INCLUDE_DIR "${YAML_CPP_INCLUDE_DIR}" ABSOLUTE) + include_directories(${YAML_CPP_INCLUDE_DIR}) + + if(NOT DEFINED YAML_CPP_LIBRARY_DIR) + get_filename_component(YAML_CPP_LIBRARY_DIR "${YAML_CPP_CMAKE_DIR}/../../" ABSOLUTE) + get_filename_component(YAML_CPP_LIBRARY_DIR "${YAML_CPP_LIBRARY_DIR}" ABSOLUTE) + endif() + + list(APPEND DEPENDENCY_LIBRARY_DIRS ${YAML_CPP_LIBRARY_DIR}) + set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -L${YAML_CPP_LIBRARY_DIR} -lyaml-cpp) + else() + message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] yaml-cpp is needed for ${PROJECT_NAME} build") + endif() + + if(LLVM_FOUND) + include_directories(${LLVM_INCLUDE_DIRS}) + link_directories(${LLVM_LIBRARY_DIRS}) + set(DEPENDENCY_LIB ${DEPENDENCY_LIB} ${LLVM_LIBRARIES} -lclang) + set(CLANG_EXECUTABLE ${LLVM_TOOLS_BINARY_DIR}/clang) + + if(NOT EXISTS ${CLANG_EXECUTABLE}) + message( + FATAL_ERROR + "clang executable not found at ${CLANG_EXECUTABLE}. Please check your LLVM installation." + ) else() - message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] mpi is needed for ${PROJECT_NAME} build") - endif() + execute_process( + COMMAND ${CLANG_EXECUTABLE} --version + OUTPUT_VARIABLE CLANG_VERSION_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + COMMAND_ECHO + NONE + ) + + # message(STATUS "[${UPPER_PROJECT_NAME}] Found clang executable: ${CLANG_EXECUTABLE}") + # message(STATUS "[${UPPER_PROJECT_NAME}] clang version: ${CLANG_VERSION_OUTPUT}") + endif() + else() + message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] LLVM is needed for ${PROJECT_NAME} build") + endif() + + if(json-c_FOUND) + get_filename_component(json-c_INCLUDE_DIR "${json-c_DIR}/../../../include" ABSOLUTE) + get_filename_component(json-c_LIBRARY_DIR "${json-c_DIR}/../../" ABSOLUTE) + include_directories(${json-c_INCLUDE_DIR}) + list(APPEND DEPENDENCY_LIBRARY_DIRS ${json-c_LIBRARY_DIR}) + set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -ljson-c) + else() + message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] json-c is needed for ${PROJECT_NAME} build") + endif() + + if(ZLIB_FOUND) + include_directories(${ZLIB_INCLUDE_DIRS}) + get_filename_component(ZLIB_LIBRARY_DIRS "${ZLIB_LIBRARIES}/../" ABSOLUTE) + list(APPEND DEPENDENCY_LIBRARY_DIRS ${ZLIB_LIBRARY_DIRS}) + set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -lz) + else() + message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] zlib is needed for ${PROJECT_NAME} build") + endif() + + if(${MPI_CXX_FOUND}) + # MPI_CXX_FOUND MPI_CXX_VERSION MPI_CXX_INCLUDE_DIRS MPI_CXX_LIBRARIES + get_filename_component(MPI_CXX_INCLUDE_DIRS "${MPI_CXX_INCLUDE_DIRS}" ABSOLUTE) + include_directories(${MPI_CXX_INCLUDE_DIRS}) + + if(NOT DEFINED MPI_CXX_LIBRARY_DIR) + if(MPI_CXX_LIBRARIES) + # If MPI_CXX_LIBRARIES is a list, get parent dir of each library + set(MPI_CXX_LIBRARY_DIR "") + + foreach(_lib ${MPI_CXX_LIBRARIES}) + get_filename_component(_lib_dir "${_lib}" DIRECTORY) + get_filename_component(_lib_dir "${_lib_dir}" ABSOLUTE) + list(APPEND MPI_CXX_LIBRARY_DIR "${_lib_dir}") + endforeach() - list(APPEND DEPENDENCY_LIBRARY_DIRS ${DATACRUMBS_INSTALL_LIB_DIR}) - list(REMOVE_DUPLICATES DEPENDENCY_LIBRARY_DIRS) - - # print found packages - message(STATUS " - Found libbpf:${LIBBPF_VERSION} at include:${LIBBPF_INCLUDEDIR} lib:${LIBBPF_LIBRARY_DIRS}") - message(STATUS " - Found yaml-cpp:${yaml-cpp_VERSION} at include:${YAML_CPP_INCLUDE_DIR} lib:${YAML_CPP_LIBRARY_DIR}") - message(STATUS " - Found llvm:${LLVM_VERSION} at include:${LLVM_INCLUDE_DIRS} lib:${LLVM_LIBRARY_DIRS} clang:${CLANG_EXECUTABLE}") - message(STATUS " - Found json-c:${json-c_CONSIDERED_VERSIONS} at include:${json-c_INCLUDE_DIR} lib:${json-c_LIBRARY_DIR}") - message(STATUS " - Found zlib:${ZLIB_VERSION} at include:${ZLIB_INCLUDE_DIRS} lib:${ZLIB_LIBRARY_DIRS}") - message(STATUS " - Found mpi:${MPI_CXX_VERSION} at include:${MPI_CXX_INCLUDE_DIRS} lib:${MPI_CXX_LIBRARY_DIR}") - message(STATUS " - DEPENDENCY_LIBRARY_DIRS for RPATH:${DEPENDENCY_LIBRARY_DIRS}") - message(STATUS " - DEPENDENCY_LIB for linking :${DEPENDENCY_LIB}") - string(REPLACE ";" ":" DEPENDENCY_LIBRARY_DIRS_COLON "${DEPENDENCY_LIBRARY_DIRS}") - set(CMAKE_INSTALL_RPATH "${DEPENDENCY_LIBRARY_DIRS}") - set(CMAKE_BUILD_RPATH "${DEPENDENCY_LIBRARY_DIRS}") - - # print_all_variables() + list(REMOVE_DUPLICATES MPI_CXX_LIBRARY_DIR) + else() + get_filename_component(MPI_CXX_LIBRARY_DIR "${MPI_CXX_LIBRARIES}" DIRECTORY) + set(MPI_CXX_LIBRARY_DIR "${MPI_CXX_LIBRARY_DIR}") + endif() + endif() + + list(APPEND DEPENDENCY_LIBRARY_DIRS ${MPI_CXX_LIBRARY_DIR}) + set(DEPENDENCY_LIB ${DEPENDENCY_LIB} -L${MPI_CXX_LIBRARY_DIR} ${MPI_CXX_LIBRARIES}) + else() + message(FATAL_ERROR "-- [${UPPER_PROJECT_NAME}] mpi is needed for ${PROJECT_NAME} build") + endif() + + list(APPEND DEPENDENCY_LIBRARY_DIRS ${DATACRUMBS_INSTALL_LIB_DIR}) + list(REMOVE_DUPLICATES DEPENDENCY_LIBRARY_DIRS) + + # print found packages + message( + STATUS + " - Found libbpf:${LIBBPF_VERSION} at include:${LIBBPF_INCLUDEDIR} lib:${LIBBPF_LIBRARY_DIRS}" + ) + message( + STATUS + " - Found yaml-cpp:${yaml-cpp_VERSION} at include:${YAML_CPP_INCLUDE_DIR} lib:${YAML_CPP_LIBRARY_DIR}" + ) + message( + STATUS + " - Found llvm:${LLVM_VERSION} at include:${LLVM_INCLUDE_DIRS} lib:${LLVM_LIBRARY_DIRS} clang:${CLANG_EXECUTABLE}" + ) + message( + STATUS + " - Found json-c:${json-c_CONSIDERED_VERSIONS} at include:${json-c_INCLUDE_DIR} lib:${json-c_LIBRARY_DIR}" + ) + message( + STATUS + " - Found zlib:${ZLIB_VERSION} at include:${ZLIB_INCLUDE_DIRS} lib:${ZLIB_LIBRARY_DIRS}" + ) + message( + STATUS + " - Found mpi:${MPI_CXX_VERSION} at include:${MPI_CXX_INCLUDE_DIRS} lib:${MPI_CXX_LIBRARY_DIR}" + ) + message(STATUS " - DEPENDENCY_LIBRARY_DIRS for RPATH:${DEPENDENCY_LIBRARY_DIRS}") + message(STATUS " - DEPENDENCY_LIB for linking :${DEPENDENCY_LIB}") + string( + REPLACE ";" + ":" + DEPENDENCY_LIBRARY_DIRS_COLON + "${DEPENDENCY_LIBRARY_DIRS}" + ) + set(CMAKE_INSTALL_RPATH "${DEPENDENCY_LIBRARY_DIRS}") + set(CMAKE_BUILD_RPATH "${DEPENDENCY_LIBRARY_DIRS}") + + # print_all_variables() endmacro(include_dependencies) macro(derive_configurations) - if(DATACRUMBS_BPFTIME_COMPATIBLE) - set(DATACRUMBS_BPFTIME_COMPATIBLE_FLAG 1) - else() - set(DATACRUMBS_BPFTIME_COMPATIBLE_FLAG 0) - endif() - - if(DATACRUMBS_LOG_LEVEL_STR STREQUAL "ERROR") - set(DATACRUMBS_LOG_LEVEL 1) - elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "WARN") - set(DATACRUMBS_LOG_LEVEL 2) - elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "INFO") - set(DATACRUMBS_LOG_LEVEL 3) - elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "DEBUG") - set(DATACRUMBS_LOG_LEVEL 4) - elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "TRACE") - set(DATACRUMBS_LOG_LEVEL 5) - endif() - - if(DATACRUMBS_MODE_STR AND DATACRUMBS_MODE_STR STREQUAL "TRACE") - set(DATACRUMBS_MODE 1) - else() - set(DATACRUMBS_MODE 2) - endif() - - if(DATACRUMBS_TRACE_ALL_PROCESSES_OPT AND DATACRUMBS_TRACE_ALL_PROCESSES_OPT STREQUAL "ON") - set(DATACRUMBS_TRACE_ALL_PROCESSES 1) - else() - set(DATACRUMBS_TRACE_ALL_PROCESSES 0) - endif() - - option(BPFTOOL_EXECUTABLE "Path to bpftool executable" "") - - if(BPFTOOL_EXECUTABLE STREQUAL "NONE") - set(BPFTOOL_EXECUTABLE "") - endif() - - if(NOT DATACRUMBS_SKIP_PROBE_EXPLORING) - set(ENABLE_PROBE_EXPLORER 1) - else() - set(ENABLE_PROBE_EXPLORER 0) - endif() - - if(NOT DATACRUMBS_SKIP_PROBE_GENERATION) - set(ENABLE_PROBE_GENERATOR 1) - else() - set(ENABLE_PROBE_GENERATOR 0) - endif() - - if(DATACRUMBS_INCLUSION_PATH STREQUAL "NONE") - set(DATACRUMBS_ENABLE_INCLUSION_PATH 0) - else() - set(DATACRUMBS_ENABLE_INCLUSION_PATH 1) - endif() - - if(DATACRUMBS_BPF_PRINT_ENABLE) - set(DATACRUMBS_BPF_PRINT_ENABLE_FLAG 1) - else() - set(DATACRUMBS_BPF_PRINT_ENABLE_FLAG 0) - endif() - - set(DATACRUMBS_SRC_GEN_PATH ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}) - set(DATACRUMBS_VARS --user ${DATACRUMBS_USER} --config_path ${CMAKE_CONFIG_OUTPUT_DIRECTORY} --data_dir ${CMAKE_DATA_OUTPUT_DIRECTORY} --trace_log_dir ${CMAKE_BINARY_DIR}/logs) - - if(NOT DATACRUMBS_INCLUSION_PATH STREQUAL "NONE") - set(DATACRUMBS_VARS ${DATACRUMBS_VARS} --inclusion_path ${DATACRUMBS_INCLUSION_PATH}) - endif() - - set(DATACRUMBS_BUILD_CLIENT_SO ${DATACRUMBS_INSTALL_LIB_DIR}/libdatacrumbs_client.so) - - set(DATACRUMBS_CONFIG_PATH ${CMAKE_CONFIG_OUTPUT_DIRECTORY}) - set(DATACRUMBS_DATA_DIR ${CMAKE_DATA_OUTPUT_DIRECTORY}) - set(DATACRUMBS_LOG_DIR ${CMAKE_BINARY_DIR}/logs) - file(MAKE_DIRECTORY ${DATACRUMBS_LOG_DIR}) - - if(DATACRUMBS_ENABLE_OPT AND DATACRUMBS_ENABLE_OPT STREQUAL "ON") - set(DATACRUMBS_ENABLE 1) - else() - set(DATACRUMBS_ENABLE 0) - endif() - - set(DATACRUMBS_PROJECT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) - - # Detect system kernel version: major, minor, patch - execute_process( - COMMAND uname -r - OUTPUT_VARIABLE DATACRUMBS_KERNEL_UNAME_R - OUTPUT_STRIP_TRAILING_WHITESPACE + if(DATACRUMBS_BPFTIME_COMPATIBLE) + set(DATACRUMBS_BPFTIME_COMPATIBLE_FLAG 1) + else() + set(DATACRUMBS_BPFTIME_COMPATIBLE_FLAG 0) + endif() + + if(DATACRUMBS_LOG_LEVEL_STR STREQUAL "ERROR") + set(DATACRUMBS_LOG_LEVEL 1) + elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "WARN") + set(DATACRUMBS_LOG_LEVEL 2) + elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "INFO") + set(DATACRUMBS_LOG_LEVEL 3) + elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "DEBUG") + set(DATACRUMBS_LOG_LEVEL 4) + elseif(DATACRUMBS_LOG_LEVEL_STR STREQUAL "TRACE") + set(DATACRUMBS_LOG_LEVEL 5) + endif() + + if(DATACRUMBS_MODE_STR AND DATACRUMBS_MODE_STR STREQUAL "TRACE") + set(DATACRUMBS_MODE 1) + else() + set(DATACRUMBS_MODE 2) + endif() + + if(DATACRUMBS_TRACE_ALL_PROCESSES_OPT AND DATACRUMBS_TRACE_ALL_PROCESSES_OPT STREQUAL "ON") + set(DATACRUMBS_TRACE_ALL_PROCESSES 1) + else() + set(DATACRUMBS_TRACE_ALL_PROCESSES 0) + endif() + + option(BPFTOOL_EXECUTABLE "Path to bpftool executable" "") + + if(BPFTOOL_EXECUTABLE STREQUAL "NONE") + set(BPFTOOL_EXECUTABLE "") + endif() + + if(NOT DATACRUMBS_SKIP_PROBE_EXPLORING) + set(ENABLE_PROBE_EXPLORER 1) + else() + set(ENABLE_PROBE_EXPLORER 0) + endif() + + if(NOT DATACRUMBS_SKIP_PROBE_GENERATION) + set(ENABLE_PROBE_GENERATOR 1) + else() + set(ENABLE_PROBE_GENERATOR 0) + endif() + + if(DATACRUMBS_INCLUSION_PATH STREQUAL "NONE") + set(DATACRUMBS_ENABLE_INCLUSION_PATH 0) + else() + set(DATACRUMBS_ENABLE_INCLUSION_PATH 1) + endif() + + if(DATACRUMBS_BPF_PRINT_ENABLE) + set(DATACRUMBS_BPF_PRINT_ENABLE_FLAG 1) + else() + set(DATACRUMBS_BPF_PRINT_ENABLE_FLAG 0) + endif() + + set(DATACRUMBS_SRC_GEN_PATH ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}) + set(DATACRUMBS_VARS + --user + ${DATACRUMBS_USER} + --config_path + ${CMAKE_CONFIG_OUTPUT_DIRECTORY} + --data_dir + ${CMAKE_DATA_OUTPUT_DIRECTORY} + --trace_log_dir + ${CMAKE_BINARY_DIR}/logs + ) + + if(NOT + DATACRUMBS_INCLUSION_PATH + STREQUAL + "NONE" + ) + set(DATACRUMBS_VARS ${DATACRUMBS_VARS} --inclusion_path ${DATACRUMBS_INCLUSION_PATH}) + endif() + + set(DATACRUMBS_BUILD_CLIENT_SO ${DATACRUMBS_INSTALL_LIB_DIR}/libdatacrumbs_client.so) + + set(DATACRUMBS_CONFIG_PATH ${CMAKE_CONFIG_OUTPUT_DIRECTORY}) + set(DATACRUMBS_DATA_DIR ${CMAKE_DATA_OUTPUT_DIRECTORY}) + set(DATACRUMBS_LOG_DIR ${CMAKE_BINARY_DIR}/logs) + file(MAKE_DIRECTORY ${DATACRUMBS_LOG_DIR}) + + if(DATACRUMBS_ENABLE_OPT AND DATACRUMBS_ENABLE_OPT STREQUAL "ON") + set(DATACRUMBS_ENABLE 1) + else() + set(DATACRUMBS_ENABLE 0) + endif() + + set(DATACRUMBS_PROJECT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + + # Detect system kernel version: major, minor, patch + execute_process( + COMMAND uname -r + OUTPUT_VARIABLE DATACRUMBS_KERNEL_UNAME_R + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Split kernel version string (e.g., "6.5.0-101-generic") into major, minor, patch + string( + REGEX MATCH + "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" + KERNEL_VERSION_MATCH + "${DATACRUMBS_KERNEL_UNAME_R}" + ) + + if(KERNEL_VERSION_MATCH) + string( + REGEX + REPLACE "^([0-9]+)\\..*" + "\\1" + KERNEL_VERSION_MAJOR + "${DATACRUMBS_KERNEL_UNAME_R}" ) - - # Split kernel version string (e.g., "6.5.0-101-generic") into major, minor, patch - string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" KERNEL_VERSION_MATCH "${DATACRUMBS_KERNEL_UNAME_R}") - - if(KERNEL_VERSION_MATCH) - string(REGEX REPLACE "^([0-9]+)\\..*" "\\1" KERNEL_VERSION_MAJOR "${DATACRUMBS_KERNEL_UNAME_R}") - string(REGEX REPLACE "^[0-9]+\\.([0-9]+)\\..*" "\\1" KERNEL_VERSION_MINOR "${DATACRUMBS_KERNEL_UNAME_R}") - string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" KERNEL_VERSION_PATCH "${DATACRUMBS_KERNEL_UNAME_R}") - else() - set(KERNEL_VERSION_MAJOR "0") - set(KERNEL_VERSION_MINOR "0") - set(KERNEL_VERSION_PATCH "0") - endif() - - set(DATACRUMBS_CMAKE_KERNEL_VERSION "(${KERNEL_VERSION_MAJOR}, ${KERNEL_VERSION_MINOR}, ${KERNEL_VERSION_PATCH})") - - # Set Scheduler options - # Check if scheduler configuration is complete - if((DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE" OR - DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE" OR - DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE" OR - DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE") AND - DATACRUMBS_SCHEDULER_TYPE STREQUAL "NONE") - message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] Incomplete scheduler configuration. Either use a predefined scheduler option by setting DATACRUMBS_SCHEDULER_TYPE, or set all of the following variables: DATACRUMBS_SCHEDULER_ALLOC_CMD, DATACRUMBS_SCHEDULER_JOBID_ENV_VAR, DATACRUMBS_SCHEDULER_NODES_CMD_OPT, DATACRUMBS_SCHEDULER_PPN_CMD_OPT, DATACRUMBS_SCHEDULER_RUN_CMD") - endif() - - if (DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") - set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "SLURM_JOB_ID") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") - set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "OMPI_COMM_WORLD_RANK") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") - set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "FLUX_JOB_ID") - endif() - endif() - - if (DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") - set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") - set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") - set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") - endif() - endif() - - if (DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") - set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--ntasks-per-node") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") - set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--map-by ppr:") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") - set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--tasks-per-node") - endif() - endif() - - if (DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") - set(DATACRUMBS_SCHEDULER_RUN_CMD "srun") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") - set(DATACRUMBS_SCHEDULER_RUN_CMD "mpirun") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") - set(DATACRUMBS_SCHEDULER_RUN_CMD "flux run") - endif() - endif() - - + string( + REGEX + REPLACE "^[0-9]+\\.([0-9]+)\\..*" + "\\1" + KERNEL_VERSION_MINOR + "${DATACRUMBS_KERNEL_UNAME_R}" + ) + string( + REGEX + REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" + "\\1" + KERNEL_VERSION_PATCH + "${DATACRUMBS_KERNEL_UNAME_R}" + ) + else() + set(KERNEL_VERSION_MAJOR "0") + set(KERNEL_VERSION_MINOR "0") + set(KERNEL_VERSION_PATCH "0") + endif() + + set(DATACRUMBS_CMAKE_KERNEL_VERSION + "(${KERNEL_VERSION_MAJOR}, ${KERNEL_VERSION_MINOR}, ${KERNEL_VERSION_PATCH})" + ) + + # Set Scheduler options Check if scheduler configuration is complete + if((DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE" + OR DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE" + OR DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE" + OR DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE" + ) + AND DATACRUMBS_SCHEDULER_TYPE STREQUAL "NONE" + ) + message( + FATAL_ERROR + "[${UPPER_PROJECT_NAME}] Incomplete scheduler configuration. Either use a predefined scheduler option by setting DATACRUMBS_SCHEDULER_TYPE, or set all of the following variables: DATACRUMBS_SCHEDULER_ALLOC_CMD, DATACRUMBS_SCHEDULER_JOBID_ENV_VAR, DATACRUMBS_SCHEDULER_NODES_CMD_OPT, DATACRUMBS_SCHEDULER_PPN_CMD_OPT, DATACRUMBS_SCHEDULER_RUN_CMD" + ) + endif() + + if(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "SLURM_JOB_ID") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "OMPI_COMM_WORLD_RANK") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "FLUX_JOB_ID") + endif() + endif() + + if(DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") + endif() + endif() + + if(DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--ntasks-per-node") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--map-by ppr:") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--tasks-per-node") + endif() + endif() + + if(DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE") + if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + set(DATACRUMBS_SCHEDULER_RUN_CMD "srun") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + set(DATACRUMBS_SCHEDULER_RUN_CMD "mpirun") + elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + set(DATACRUMBS_SCHEDULER_RUN_CMD "flux run") + endif() + endif() endmacro(derive_configurations) macro(find_system_details) - message(STATUS "[${UPPER_PROJECT_NAME}] Detecting system details") - - find_library(LIBC_SO NAMES libc.so.6 libc.so PATHS /lib /usr/lib /lib64 /usr/lib64 /usr/local/lib /usr/local/lib64 /usr/lib/x86_64-linux-gnu NO_DEFAULT_PATH) - - if(LIBC_SO) - message(STATUS " - Found libc: ${LIBC_SO}") - set(DATACRUMBS_LIBC_SO ${LIBC_SO}) - else() - message(FATAL_ERROR " - libc.so not found!") - endif() - - if(DATACRUMBS_HOST STREQUAL "NONE") - # Get the system hostname - execute_process( - COMMAND hostname - OUTPUT_VARIABLE RAW_HOSTNAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - # Remove all numbers from the hostname - string(REGEX REPLACE "[0-9]" "" DATACRUMBS_HOST "${RAW_HOSTNAME}") - message(STATUS " - Derived hostname: ${DATACRUMBS_HOST}") - else() - message(STATUS " - Using provided hostname: ${DATACRUMBS_HOST}") - endif() - - # Generate vmlinux.h using bpftool before building datacrumbs_bpf - if(BPFTOOL_EXECUTABLE AND NOT BPFTOOL_EXECUTABLE STREQUAL "NONE") - message(STATUS " - Using provided bpftool executable: ${BPFTOOL_EXECUTABLE}") - else() - find_program(BPFTOOL_EXECUTABLE_SEARCH bpftool PATHS /usr/sbin/ /usr/bin/ /usr/local/bin/ /usr/local/sbin/) - set(BPFTOOL_EXECUTABLE ${BPFTOOL_EXECUTABLE_SEARCH}) + message(STATUS "[${UPPER_PROJECT_NAME}] Detecting system details") + + find_library( + LIBC_SO + NAMES libc.so.6 libc.so + PATHS /lib + /usr/lib + /lib64 + /usr/lib64 + /usr/local/lib + /usr/local/lib64 + /usr/lib/x86_64-linux-gnu + NO_DEFAULT_PATH + ) + + if(LIBC_SO) + message(STATUS " - Found libc: ${LIBC_SO}") + set(DATACRUMBS_LIBC_SO ${LIBC_SO}) + else() + message(FATAL_ERROR " - libc.so not found!") + endif() + + if(DATACRUMBS_HOST STREQUAL "NONE") + # Get the system hostname + execute_process( + COMMAND hostname + OUTPUT_VARIABLE RAW_HOSTNAME + OUTPUT_STRIP_TRAILING_WHITESPACE + ) - if(NOT BPFTOOL_EXECUTABLE) - message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] bpftool executable not found! Please install bpftool or specify its path via BPFTOOL_EXECUTABLE.") - endif() + # Remove all numbers from the hostname + string( + REGEX + REPLACE "[0-9]" + "" + DATACRUMBS_HOST + "${RAW_HOSTNAME}" + ) + message(STATUS " - Derived hostname: ${DATACRUMBS_HOST}") + else() + message(STATUS " - Using provided hostname: ${DATACRUMBS_HOST}") + endif() + + # Generate vmlinux.h using bpftool before building datacrumbs_bpf + if(BPFTOOL_EXECUTABLE + AND NOT + BPFTOOL_EXECUTABLE + STREQUAL + "NONE" + ) + message(STATUS " - Using provided bpftool executable: ${BPFTOOL_EXECUTABLE}") + else() + find_program( + BPFTOOL_EXECUTABLE_SEARCH bpftool + PATHS /usr/sbin/ + /usr/bin/ + /usr/local/bin/ + /usr/local/sbin/ + ) + set(BPFTOOL_EXECUTABLE ${BPFTOOL_EXECUTABLE_SEARCH}) - message(STATUS " - Found bpftool executable: ${BPFTOOL_EXECUTABLE}") + if(NOT BPFTOOL_EXECUTABLE) + message( + FATAL_ERROR + "[${UPPER_PROJECT_NAME}] bpftool executable not found! Please install bpftool or specify its path via BPFTOOL_EXECUTABLE." + ) endif() - find_file(VMLINUX_BTF_PATH vmlinux PATHS /sys/kernel/btf NO_DEFAULT_PATH) + message(STATUS " - Found bpftool executable: ${BPFTOOL_EXECUTABLE}") + endif() - if(NOT VMLINUX_BTF_PATH) - message(FATAL_ERROR "[${UPPER_PROJECT_NAME}] vmlinux BTF file not found in /sys/kernel/btf. Please ensure your kernel provides BTF information at /sys/kernel/btf/vmlinux.") - else() - message(STATUS " - Found vmlinux BTF file at: ${VMLINUX_BTF_PATH}") - endif() + find_file( + VMLINUX_BTF_PATH vmlinux + PATHS /sys/kernel/btf + NO_DEFAULT_PATH + ) - if(CMAKE_SYSTEM_PROCESSOR) - set(DATACRUMBS_ARCH "${CMAKE_SYSTEM_PROCESSOR}") - elseif(DEFINED ENV{ARCH}) - set(DATACRUMBS_ARCH "$ENV{ARCH}") - else() - execute_process( - COMMAND uname -m - OUTPUT_VARIABLE DATACRUMBS_ARCH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif() + if(NOT VMLINUX_BTF_PATH) + message( + FATAL_ERROR + "[${UPPER_PROJECT_NAME}] vmlinux BTF file not found in /sys/kernel/btf. Please ensure your kernel provides BTF information at /sys/kernel/btf/vmlinux." + ) + else() + message(STATUS " - Found vmlinux BTF file at: ${VMLINUX_BTF_PATH}") + endif() + + if(CMAKE_SYSTEM_PROCESSOR) + set(DATACRUMBS_ARCH "${CMAKE_SYSTEM_PROCESSOR}") + elseif(DEFINED ENV{ARCH}) + set(DATACRUMBS_ARCH "$ENV{ARCH}") + else() + execute_process( + COMMAND uname -m + OUTPUT_VARIABLE DATACRUMBS_ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + endif() + + if(DATACRUMBS_KERNEL_VERSION + AND NOT + DATACRUMBS_KERNEL_VERSION + STREQUAL + "" + ) + set(DATACRUMBS_KERNEL_VERSION "${DATACRUMBS_KERNEL_VERSION}") + else() + set(DATACRUMBS_KERNEL_VERSION + "${KERNEL_VERSION_MAJOR}.${KERNEL_VERSION_MINOR}.${KERNEL_VERSION_PATCH}" + ) + endif() - if(DATACRUMBS_KERNEL_VERSION AND NOT DATACRUMBS_KERNEL_VERSION STREQUAL "") - set(DATACRUMBS_KERNEL_VERSION "${DATACRUMBS_KERNEL_VERSION}") - else() - set(DATACRUMBS_KERNEL_VERSION "${KERNEL_VERSION_MAJOR}.${KERNEL_VERSION_MINOR}.${KERNEL_VERSION_PATCH}") - endif() + # Detect kernel headers path if not set or empty + if(NOT DEFINED DATACRUMBS_KERNEL_HEADERS_PATH OR DATACRUMBS_KERNEL_HEADERS_PATH STREQUAL "") + set(_kernel_headers_candidates "/usr/src/${DATACRUMBS_KERNEL_UNAME_R}" + "/usr/src/kernels/${DATACRUMBS_KERNEL_UNAME_R}" + ) + set(DATACRUMBS_KERNEL_HEADERS_PATH "") - # Detect kernel headers path if not set or empty - if(NOT DEFINED DATACRUMBS_KERNEL_HEADERS_PATH OR DATACRUMBS_KERNEL_HEADERS_PATH STREQUAL "") - set(_kernel_headers_candidates - "/usr/src/${DATACRUMBS_KERNEL_UNAME_R}" - "/usr/src/kernels/${DATACRUMBS_KERNEL_UNAME_R}" - ) - set(DATACRUMBS_KERNEL_HEADERS_PATH "") - - foreach(_candidate ${_kernel_headers_candidates}) - if(EXISTS "${_candidate}") - set(DATACRUMBS_KERNEL_HEADERS_PATH "${_candidate}") - break() - endif() - endforeach() + foreach(_candidate ${_kernel_headers_candidates}) + if(EXISTS "${_candidate}") + set(DATACRUMBS_KERNEL_HEADERS_PATH "${_candidate}") + break() + endif() + endforeach() - if(DATACRUMBS_KERNEL_HEADERS_PATH STREQUAL "") - message(WARNING "[${UPPER_PROJECT_NAME}] Kernel headers not found for ${DATACRUMBS_UNAME_R} in /usr/src or /usr/src/kernels.") - endif() + if(DATACRUMBS_KERNEL_HEADERS_PATH STREQUAL "") + message( + WARNING + "[${UPPER_PROJECT_NAME}] Kernel headers not found for ${DATACRUMBS_UNAME_R} in /usr/src or /usr/src/kernels." + ) endif() + endif() - # Normalize architecture names - if(DATACRUMBS_ARCH STREQUAL "x86_64") - set(DATACRUMBS_ARCH "x86") - elseif(DATACRUMBS_ARCH STREQUAL "aarch64") - set(DATACRUMBS_ARCH "arm64") - endif() + # Normalize architecture names + if(DATACRUMBS_ARCH STREQUAL "x86_64") + set(DATACRUMBS_ARCH "x86") + elseif(DATACRUMBS_ARCH STREQUAL "aarch64") + set(DATACRUMBS_ARCH "arm64") + endif() - message(STATUS " - Detected architecture: ${DATACRUMBS_ARCH}") + message(STATUS " - Detected architecture: ${DATACRUMBS_ARCH}") endmacro(find_system_details) function(datacrumbs_composable_install_headers public_headers) - # message("-- [${PROJECT_NAME}] " "installing headers ${public_headers}") - foreach(header ${public_headers}) - file(RELATIVE_PATH header_file_path "${PROJECT_SOURCE_DIR}/src" "${header}") - get_filename_component(header_directory_path "${header_file_path}" DIRECTORY) - - # message(STATUS " - Installing header ${header} to ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_directory_path}") - # file(MAKE_DIRECTORY "${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_directory_path}") - configure_file(${header} - "${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_file_path}" @ONLY) - install( - FILES ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_file_path} + # message("-- [${PROJECT_NAME}] " "installing headers ${public_headers}") + foreach(header ${public_headers}) + file( + RELATIVE_PATH + header_file_path + "${PROJECT_SOURCE_DIR}/src" + "${header}" + ) + get_filename_component(header_directory_path "${header_file_path}" DIRECTORY) + + # message(STATUS " - Installing header ${header} to + # ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_directory_path}") + # file(MAKE_DIRECTORY + # "${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_directory_path}") + configure_file( + ${header} "${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_file_path}" @ONLY + ) + install(FILES ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/include/${header_file_path} DESTINATION "${DATACRUMBS_INSTALL_LIBEXEC}/composable/include/${header_directory_path}" - ) - endforeach() + ) + endforeach() endfunction() function(datacrumbs_composable_install_src public_src) - # message("-- [${PROJECT_NAME}] " "installing src files ${public_src}") - foreach(src ${public_src}) - file(RELATIVE_PATH src_file_path "${PROJECT_SOURCE_DIR}/src" "${src}") - get_filename_component(src_directory_path "${src_file_path}" DIRECTORY) - install( - FILES ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/src/${src_file_path} + # message("-- [${PROJECT_NAME}] " "installing src files ${public_src}") + foreach(src ${public_src}) + file( + RELATIVE_PATH + src_file_path + "${PROJECT_SOURCE_DIR}/src" + "${src}" + ) + get_filename_component(src_directory_path "${src_file_path}" DIRECTORY) + install(FILES ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/src/${src_file_path} DESTINATION "${DATACRUMBS_INSTALL_LIBEXEC}/composable/src/${src_directory_path}" - ) - configure_file(${src} - "${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/src/${src_file_path}" @ONLY) - endforeach() + ) + configure_file(${src} "${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/composable/src/${src_file_path}" @ONLY) + endforeach() endfunction() macro(load_build_variables) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Single Directory for all Executables.") - set(CMAKE_INCLUDE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/include CACHE PATH "Store the headers.") - set(CMAKE_CONFIG_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/configs CACHE PATH "Store the configuration generated.") - set(CMAKE_DATA_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/data CACHE PATH "Store the data generated.") - set(EXECUTABLE_OUTPUT_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${DATACRUMBS_LIBDIR} CACHE PATH "Single Directory for all Libraries") - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${DATACRUMBS_LIBDIR} CACHE PATH "Single Directory for all static libraries.") - set(CMAKE_LIBEXEC_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/libexec/${PROJECT_NAME}) - set(CMAKE_ETC_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}) - set(CMAKE_MODULES_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}/modulefiles) - set(CMAKE_FLUX_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}/flux) - set(CMAKE_SYSTEMD_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}/systemd) - - if(NOT DATACRUMBS_BUILD_ONLY) - # Get installation directories -- these get used in various places; - # best to just make them available - option(DATACRUMBS_LIBDIR_AS_LIB OFF) - - if(NOT DATACRUMBS_LIBDIR_AS_LIB) - include(GNUInstallDirs) - endif() - - if(NOT CMAKE_INSTALL_LIBDIR OR DATACRUMBS_LIBDIR_AS_LIB) - set(CMAKE_INSTALL_BINDIR bin) - set(CMAKE_INSTALL_SBINDIR sbin) - set(CMAKE_INSTALL_LIBDIR lib) - set(CMAKE_INSTALL_INCLUDEDIR include) - set(CMAKE_INSTALL_DOCDIR doc) - set(CMAKE_INSTALL_SYSCONFDIR etc) - set(CMAKE_INSTALL_LIBEXECDIR libexec) - set(CMAKE_INSTALL_RUNSTATEDIR run) - endif() - - set(DATACRUMBS_INSTALL_BINARYDIR - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}) - set(DATACRUMBS_INSTALL_SBINARYDIR - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_SBINDIR}) - set(DATACRUMBS_LIBDIR ${CMAKE_INSTALL_LIBDIR}) - set(DATACRUMBS_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) - set(DATACRUMBS_INSTALL_INCLUDE_DIR - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}) - set(DATACRUMBS_INSTALL_DOCDIR - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DOCDIR}) - set(DATACRUMBS_INSTALL_SYSCONFDIR - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME}) - set(DATACRUMBS_INSTALL_LIBEXEC - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBEXECDIR}/${PROJECT_NAME}) - else() - set(DATACRUMBS_INSTALL_BINARYDIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") - set(DATACRUMBS_INSTALL_SBINARYDIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") - set(DATACRUMBS_INSTALL_LIB_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") - set(DATACRUMBS_INSTALL_INCLUDE_DIR "${CMAKE_INCLUDE_OUTPUT_DIRECTORY}") - set(DATACRUMBS_INSTALL_DOCDIR "${CMAKE_BINARY_DIR}/doc") - set(DATACRUMBS_INSTALL_SYSCONFDIR "${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}") - set(DATACRUMBS_INSTALL_LIBEXEC ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}) - set(DATACRUMBS_RUNSTATEDIR "run") - endif() - set(CMAKE_INSTALL_CONFIGS_DIR configs) - set(CMAKE_INSTALL_DATA_DIR data) - set(CMAKE_INSTALL_MODULES_DIR lmod/modulefiles) - - set(DATACRUMBS_INSTALL_DATADIR ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_DATA_DIR}) - set(DATACRUMBS_INSTALL_ETC_CONFIGSDIR ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_CONFIGS_DIR}) - set(DATACRUMBS_INSTALL_ETC_MODULESDIR ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_MODULES_DIR}) - set(DATACRUMBS_INSTALL_ETC_DATADIR ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_DATA_DIR}) - set(DATACRUMBS_INSTALL_ETC_CMAKE ${DATACRUMBS_INSTALL_SYSCONFDIR}/cmake) - set(DATACRUMBS_INSTALL_ETC_SYSTEMD ${DATACRUMBS_INSTALL_SYSCONFDIR}/systemd) - set(DATACRUMBS_INSTALL_ETC_FLUX ${DATACRUMBS_INSTALL_SYSCONFDIR}/flux) - if (DATACRUMBS_CONFIGURED_RUN_DIR AND NOT DATACRUMBS_CONFIGURED_RUN_DIR STREQUAL "" AND NOT DATACRUMBS_CONFIGURED_RUN_DIR STREQUAL "NONE") - set(DATACRUMBS_INSTALL_RUNSTATEDIR ${DATACRUMBS_CONFIGURED_RUN_DIR}) - else() - set(DATACRUMBS_INSTALL_RUNSTATEDIR /${CMAKE_INSTALL_RUNSTATEDIR}) - endif() - - # Set this at the top level of your project, before any install commands - set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY TRUE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/bin + CACHE PATH "Single Directory for all Executables." + ) + set(CMAKE_INCLUDE_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/include + CACHE PATH "Store the headers." + ) + set(CMAKE_CONFIG_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/configs + CACHE PATH "Store the configuration generated." + ) + set(CMAKE_DATA_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/data + CACHE PATH "Store the data generated." + ) + set(EXECUTABLE_OUTPUT_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/${DATACRUMBS_LIBDIR} + CACHE PATH "Single Directory for all Libraries" + ) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/${DATACRUMBS_LIBDIR} + CACHE PATH "Single Directory for all static libraries." + ) + set(CMAKE_LIBEXEC_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/libexec/${PROJECT_NAME}) + set(CMAKE_ETC_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}) + set(CMAKE_MODULES_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}/modulefiles) + set(CMAKE_FLUX_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}/flux) + set(CMAKE_SYSTEMD_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}/systemd) + + if(NOT DATACRUMBS_BUILD_ONLY) + # Get installation directories -- these get used in various places; best to just make them + # available + option(DATACRUMBS_LIBDIR_AS_LIB OFF) + + if(NOT DATACRUMBS_LIBDIR_AS_LIB) + include(GNUInstallDirs) + endif() + + if(NOT CMAKE_INSTALL_LIBDIR OR DATACRUMBS_LIBDIR_AS_LIB) + set(CMAKE_INSTALL_BINDIR bin) + set(CMAKE_INSTALL_SBINDIR sbin) + set(CMAKE_INSTALL_LIBDIR lib) + set(CMAKE_INSTALL_INCLUDEDIR include) + set(CMAKE_INSTALL_DOCDIR doc) + set(CMAKE_INSTALL_SYSCONFDIR etc) + set(CMAKE_INSTALL_LIBEXECDIR libexec) + set(CMAKE_INSTALL_RUNSTATEDIR run) + endif() + + set(DATACRUMBS_INSTALL_BINARYDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}) + set(DATACRUMBS_INSTALL_SBINARYDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_SBINDIR}) + set(DATACRUMBS_LIBDIR ${CMAKE_INSTALL_LIBDIR}) + set(DATACRUMBS_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) + set(DATACRUMBS_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}) + set(DATACRUMBS_INSTALL_DOCDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DOCDIR}) + set(DATACRUMBS_INSTALL_SYSCONFDIR + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME} + ) + set(DATACRUMBS_INSTALL_LIBEXEC + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBEXECDIR}/${PROJECT_NAME} + ) + else() + set(DATACRUMBS_INSTALL_BINARYDIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") + set(DATACRUMBS_INSTALL_SBINARYDIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") + set(DATACRUMBS_INSTALL_LIB_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + set(DATACRUMBS_INSTALL_INCLUDE_DIR "${CMAKE_INCLUDE_OUTPUT_DIRECTORY}") + set(DATACRUMBS_INSTALL_DOCDIR "${CMAKE_BINARY_DIR}/doc") + set(DATACRUMBS_INSTALL_SYSCONFDIR "${CMAKE_BINARY_DIR}/etc/${PROJECT_NAME}") + set(DATACRUMBS_INSTALL_LIBEXEC ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}) + set(DATACRUMBS_RUNSTATEDIR "run") + endif() + set(CMAKE_INSTALL_CONFIGS_DIR configs) + set(CMAKE_INSTALL_DATA_DIR data) + set(CMAKE_INSTALL_MODULES_DIR lmod/modulefiles) + + set(DATACRUMBS_INSTALL_DATADIR ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_DATA_DIR}) + set(DATACRUMBS_INSTALL_ETC_CONFIGSDIR + ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_CONFIGS_DIR} + ) + set(DATACRUMBS_INSTALL_ETC_MODULESDIR + ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_MODULES_DIR} + ) + set(DATACRUMBS_INSTALL_ETC_DATADIR ${DATACRUMBS_INSTALL_SYSCONFDIR}/${CMAKE_INSTALL_DATA_DIR}) + set(DATACRUMBS_INSTALL_ETC_CMAKE ${DATACRUMBS_INSTALL_SYSCONFDIR}/cmake) + set(DATACRUMBS_INSTALL_ETC_SYSTEMD ${DATACRUMBS_INSTALL_SYSCONFDIR}/systemd) + set(DATACRUMBS_INSTALL_ETC_FLUX ${DATACRUMBS_INSTALL_SYSCONFDIR}/flux) + if(DATACRUMBS_CONFIGURED_RUN_DIR + AND NOT + DATACRUMBS_CONFIGURED_RUN_DIR + STREQUAL + "" + AND NOT + DATACRUMBS_CONFIGURED_RUN_DIR + STREQUAL + "NONE" + ) + set(DATACRUMBS_INSTALL_RUNSTATEDIR ${DATACRUMBS_CONFIGURED_RUN_DIR}) + else() + set(DATACRUMBS_INSTALL_RUNSTATEDIR /${CMAKE_INSTALL_RUNSTATEDIR}) + endif() + + # Set this at the top level of your project, before any install commands + set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY TRUE) endmacro(load_build_variables) diff --git a/etc/datacrumbs/data/compact.sh b/etc/datacrumbs/data/compact.sh index b8ca64fd..84d580fb 100755 --- a/etc/datacrumbs/data/compact.sh +++ b/etc/datacrumbs/data/compact.sh @@ -1,6 +1,6 @@ #!/bin/bash for file in *.json; do - [ -e "$file" ] || continue - jq -c . "$file" > "${file}.tmp" && mv "${file}.tmp" "$file" -done \ No newline at end of file + [ -e "$file" ] || continue + jq -c . "$file" >"${file}.tmp" && mv "${file}.tmp" "$file" +done diff --git a/infrastructure/docker/Dockerfile b/infrastructure/docker/Dockerfile index 1deb1045..e0149e73 100644 --- a/infrastructure/docker/Dockerfile +++ b/infrastructure/docker/Dockerfile @@ -13,6 +13,7 @@ RUN . /opt/rh/gcc-toolset-11/enable && \ -DDATACRUMBS_KERNEL_HEADERS_PATH=/usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64 \ -DCMAKE_PREFIX_PATH=/usr/lib64/openmpi \ -DCMAKE_INSTALL_PREFIX=/opt/datacrumbs-install \ + -DDATACRUMBS_CONFIGURED_RUN_DIR=/tmp \ /opt/datacrumbs/ && \ make -j $(nproc) && \ make install diff --git a/infrastructure/docker/build-multiarch.sh b/infrastructure/docker/build-multiarch.sh index dd1bb2c5..7e7cd574 100755 --- a/infrastructure/docker/build-multiarch.sh +++ b/infrastructure/docker/build-multiarch.sh @@ -19,78 +19,78 @@ LOAD=false RUN=false print_usage() { - echo "Usage: $0 [OPTIONS]" - echo "" - echo "Options:" - echo " --push Push the built images to the registry" - echo " --load Load the image into local Docker (only works for single platform)" - echo " --run Run the container after loading (implies --load)" - echo " --platform ARCH Comma-separated list of platforms (default: linux/amd64,linux/arm64)" - echo " --tag TAG Image tag (default: latest)" - echo " --name NAME Image name (default: datacrumbs)" - echo " --registry REG Registry URL (default: docker.io)" - echo " --username USER Registry username (default: hdevarajan92)" - echo " -h, --help Show this help message" - echo "" - echo "Examples:" - echo " $0 --push # Build and push multi-arch images" - echo " $0 --load --platform linux/amd64 # Build and load amd64 only" - echo " $0 --run --platform linux/amd64 # Build, load and run container" - echo " $0 --push --tag v1.0.0 --name myimage # Custom tag and name" + echo "Usage: $0 [OPTIONS]" + echo "" + echo "Options:" + echo " --push Push the built images to the registry" + echo " --load Load the image into local Docker (only works for single platform)" + echo " --platform ARCH Comma-separated list of platforms (default: linux/amd64,linux/arm64)" + echo " --tag TAG Image tag (default: latest)" + echo " --name NAME Image name (default: datacrumbs)" + echo " --run Run the container after loading (implies --load)" + echo " --registry REG Registry URL (default: docker.io)" + echo " --username USER Registry username (default: hdevarajan92)" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " $0 --push # Build and push multi-arch images" + echo " $0 --load --platform linux/amd64 # Build and load amd64 only" + echo " $0 --run --platform linux/amd64 # Build, load and run container" + echo " $0 --push --tag v1.0.0 --name myimage # Custom tag and name" } while [[ $# -gt 0 ]]; do - case $1 in - --push) - PUSH=true - shift - ;; - --load) - LOAD=true - shift - ;; - --run) - RUN=true - LOAD=true - shift - ;; - --platform) - PLATFORMS="$2" - shift 2 - ;; - --tag) - IMAGE_TAG="$2" - shift 2 - ;; - --name) - IMAGE_NAME="$2" - shift 2 - ;; - --registry) - REGISTRY="$2" - shift 2 - ;; - --username) - USERNAME="$2" - shift 2 - ;; - -h|--help) - print_usage - exit 0 - ;; - *) - echo "Unknown option: $1" - print_usage - exit 1 - ;; - esac + case $1 in + --push) + PUSH=true + shift + ;; + --load) + LOAD=true + shift + ;; + --run) + RUN=true + LOAD=true + shift + ;; + --platform) + PLATFORMS="$2" + shift 2 + ;; + --tag) + IMAGE_TAG="$2" + shift 2 + ;; + --name) + IMAGE_NAME="$2" + shift 2 + ;; + --registry) + REGISTRY="$2" + shift 2 + ;; + --username) + USERNAME="$2" + shift 2 + ;; + -h | --help) + print_usage + exit 0 + ;; + *) + echo "Unknown option: $1" + print_usage + exit 1 + ;; + esac done # Construct full image name if [ "$REGISTRY" = "docker.io" ]; then - FULL_IMAGE_NAME="${USERNAME}/${IMAGE_NAME}:${IMAGE_TAG}" + FULL_IMAGE_NAME="${USERNAME}/${IMAGE_NAME}:${IMAGE_TAG}" else - FULL_IMAGE_NAME="${REGISTRY}/${USERNAME}/${IMAGE_NAME}:${IMAGE_TAG}" + FULL_IMAGE_NAME="${REGISTRY}/${USERNAME}/${IMAGE_NAME}:${IMAGE_TAG}" fi echo "======================================" @@ -105,19 +105,19 @@ echo "======================================" echo "" # Check if Docker Buildx is available -if ! docker buildx version &> /dev/null; then - echo "Error: Docker Buildx is not available. Please install Docker Buildx." - exit 1 +if ! docker buildx version &>/dev/null; then + echo "Error: Docker Buildx is not available. Please install Docker Buildx." + exit 1 fi # Create a new builder instance if it doesn't exist BUILDER_NAME="datacrumbs-multiarch-builder" -if ! docker buildx inspect "$BUILDER_NAME" &> /dev/null; then - echo "Creating new buildx builder: $BUILDER_NAME" - docker buildx create --name "$BUILDER_NAME" --use --platform "$PLATFORMS" +if ! docker buildx inspect "$BUILDER_NAME" &>/dev/null; then + echo "Creating new buildx builder: $BUILDER_NAME" + docker buildx create --name "$BUILDER_NAME" --use --platform "$PLATFORMS" else - echo "Using existing buildx builder: $BUILDER_NAME" - docker buildx use "$BUILDER_NAME" + echo "Using existing buildx builder: $BUILDER_NAME" + docker buildx use "$BUILDER_NAME" fi # Bootstrap the builder @@ -131,24 +131,24 @@ BUILD_CMD+=" -t ${FULL_IMAGE_NAME}" BUILD_CMD+=" -f ${DOCKERFILE}" if [ "$PUSH" = true ] && [ "$LOAD" = true ]; then - echo "Error: Cannot use --push and --load together. Use --load for single platform only." - exit 1 + echo "Error: Cannot use --push and --load together. Use --load for single platform only." + exit 1 fi if [ "$PUSH" = true ]; then - BUILD_CMD+=" --push" - echo "Images will be pushed to registry after build." + BUILD_CMD+=" --push" + echo "Images will be pushed to registry after build." elif [ "$LOAD" = true ]; then - BUILD_CMD+=" --load" - echo "Image will be loaded into local Docker." - if [[ "$PLATFORMS" == *","* ]]; then - echo "Warning: --load only works with a single platform. Building first platform only." - PLATFORMS=$(echo "$PLATFORMS" | cut -d',' -f1) - BUILD_CMD="docker buildx build --platform ${PLATFORMS} -t ${FULL_IMAGE_NAME} -f ${DOCKERFILE} --load" - fi + BUILD_CMD+=" --load" + echo "Image will be loaded into local Docker." + if [[ "$PLATFORMS" == *","* ]]; then + echo "Warning: --load only works with a single platform. Building first platform only." + PLATFORMS=$(echo "$PLATFORMS" | cut -d',' -f1) + BUILD_CMD="docker buildx build --platform ${PLATFORMS} -t ${FULL_IMAGE_NAME} -f ${DOCKERFILE} --load" + fi else - echo "Note: Images will be built but not pushed or loaded." - echo "Use --push to push to registry or --load to load locally." + echo "Note: Images will be built but not pushed or loaded." + echo "Use --push to push to registry or --load to load locally." fi BUILD_CMD+=" ." @@ -166,57 +166,56 @@ cd "$REPO_ROOT" eval "$BUILD_CMD" if [ $? -eq 0 ]; then + echo "" + echo "======================================" + echo "Build completed successfully!" + echo "======================================" + echo "Image: ${FULL_IMAGE_NAME}" + echo "Platforms: ${PLATFORMS}" + + if [ "$PUSH" = true ]; then + echo "" + echo "Images have been pushed to the registry." + echo "You can pull them with:" + echo " docker pull ${FULL_IMAGE_NAME}" + elif [ "$LOAD" = true ]; then echo "" - echo "======================================" - echo "Build completed successfully!" - echo "======================================" - echo "Image: ${FULL_IMAGE_NAME}" - echo "Platforms: ${PLATFORMS}" - - if [ "$PUSH" = true ]; then - echo "" - echo "Images have been pushed to the registry." - echo "You can pull them with:" - echo " docker pull ${FULL_IMAGE_NAME}" - elif [ "$LOAD" = true ]; then - echo "" - echo "Image has been loaded into local Docker." - - if [ "$RUN" = true ]; then - echo "" - echo "Starting container with workspace mounted at /opt/datacrumbs..." - docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \ - --net=host --pid=host --hostname docker \ - -v /lib/modules/:/lib/modules:ro \ - -v /sys/kernel/debug/:/sys/kernel/debug:rw \ - -v /sys/fs/bpf:/sys/fs/bpf \ - -v "$(pwd):/opt/datacrumbs" -w /opt/datacrumbs \ - ${FULL_IMAGE_NAME} - else - echo "" - echo "To run with current workspace mounted (replaces built version in container):" - echo " docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \\" - echo " --net=host --pid=host --hostname docker \\" - echo " -v /lib/modules/:/lib/modules:ro \\" - echo " -v /sys/kernel/debug/:/sys/kernel/debug:rw \\" - echo " -v /sys/fs/bpf:/sys/fs/bpf \\" - echo " -v \"\$(pwd):/opt/datacrumbs\" -w /opt/datacrumbs \\" - echo " ${FULL_IMAGE_NAME}" - echo "" - echo "To run with workspace mounted at /workspace (keeps built version):" - echo " docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \\" - echo " --net=host --pid=host --hostname docker \\" - echo " -v /lib/modules/:/lib/modules:ro \\" - echo " -v /sys/kernel/debug/:/sys/kernel/debug:rw \\" - echo " -v /sys/fs/bpf:/sys/fs/bpf \\" - echo " -v \"\$(pwd):/workspace\" -w /workspace \\" - echo " ${FULL_IMAGE_NAME}" - fi + echo "Image has been loaded into local Docker." + if [ "$RUN" = true ]; then + echo "" + echo "Starting container with workspace mounted at /opt/datacrumbs..." + docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \ + --net=host --pid=host --hostname docker \ + -v /lib/modules/:/lib/modules:ro \ + -v /sys/kernel/debug/:/sys/kernel/debug:rw \ + -v /sys/fs/bpf:/sys/fs/bpf \ + -v "$(pwd):/opt/datacrumbs" -w /opt/datacrumbs \ + ${FULL_IMAGE_NAME} + else + echo "" + echo "To run with current workspace mounted (replaces built version in container):" + echo " docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \\" + echo " --net=host --pid=host --hostname docker \\" + echo " -v /lib/modules/:/lib/modules:ro \\" + echo " -v /sys/kernel/debug/:/sys/kernel/debug:rw \\" + echo " -v /sys/fs/bpf:/sys/fs/bpf \\" + echo " -v \"\$(pwd):/opt/datacrumbs\" -w /opt/datacrumbs \\" + echo " ${FULL_IMAGE_NAME}" + echo "" + echo "To run with workspace mounted at /workspace (keeps built version):" + echo " docker run -ti --privileged --cap-add sys_admin --cap-add sys_ptrace \\" + echo " --net=host --pid=host --hostname docker \\" + echo " -v /lib/modules/:/lib/modules:ro \\" + echo " -v /sys/kernel/debug/:/sys/kernel/debug:rw \\" + echo " -v /sys/fs/bpf:/sys/fs/bpf \\" + echo " -v \"\$(pwd):/workspace\" -w /workspace \\" + echo " ${FULL_IMAGE_NAME}" fi + fi else - echo "" - echo "======================================" - echo "Build failed!" - echo "======================================" - exit 1 + echo "" + echo "======================================" + echo "Build failed!" + echo "======================================" + exit 1 fi diff --git a/scripts/datacrumbs/datacrumbs_args.in b/scripts/datacrumbs/datacrumbs_args.in index adf6c221..1c7c3115 100755 --- a/scripts/datacrumbs/datacrumbs_args.in +++ b/scripts/datacrumbs/datacrumbs_args.in @@ -6,30 +6,30 @@ set -eo pipefail SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Fallback to script directory if placeholder wasn't substituted if [[ -z "$SCRIPT_DIR" || "$SCRIPT_DIR" == @DATACRUMBS_INSTALL_BINARYDIR@ ]]; then - SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" fi # Load logging script if available; warn but do not exit if missing if [[ -f "$SCRIPT_DIR/datacrumbs_logging" ]]; then - source "$SCRIPT_DIR/datacrumbs_logging" + source "$SCRIPT_DIR/datacrumbs_logging" else - echo "Error: datacrumbs_logging not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_logging not found in $SCRIPT_DIR" + exit 1 fi # Ensure GNU getopt is available dc__ensure_gnu_getopt() { - if ! command -v getopt >/dev/null 2>&1; then - error "'getopt' not found. Please install GNU getopt." - return 127 - fi - # GNU getopt returns status 4 with --test/-T - getopt --test >/dev/null 2>&1 - local rc=$? - if [[ $rc -ne 4 ]]; then - error "Enhanced GNU getopt not available. Please install GNU getopt." - return 127 - fi + if ! command -v getopt >/dev/null 2>&1; then + error "'getopt' not found. Please install GNU getopt." + return 127 + fi + # GNU getopt returns status 4 with --test/-T + getopt --test >/dev/null 2>&1 + local rc=$? + if [[ $rc -ne 4 ]]; then + error "Enhanced GNU getopt not available. Please install GNU getopt." + return 127 + fi } # Case helpers @@ -38,147 +38,177 @@ dc__lower() { tr '[:upper:]' '[:lower:]'; } # Make VAR name from prefix + long option (convert - to _ and uppercase) dc__make_var_name() { - local prefix="$1" opt="$2" - local p u - p="$(echo -n "$prefix" | dc__upper)" - u="$(echo -n "$opt" | tr '-' '_' | dc__upper)" - printf "%s_%s" "$p" "$u" + local prefix="$1" opt="$2" + local p u + p="$(echo -n "$prefix" | dc__upper)" + u="$(echo -n "$opt" | tr '-' '_' | dc__upper)" + printf "%s_%s" "$p" "$u" } # Make global (unprefixed) VAR name from long option dc__make_global_var_name() { - local opt="$1" - echo -n "$opt" | tr '-' '_' | dc__upper + local opt="$1" + echo -n "$opt" | tr '-' '_' | dc__upper } # Declare a global variable name and set value dc__setvar() { - local varname="$1" val="${2-}" - declare -g "$varname" - printf -v "$varname" '%s' "$val" + local varname="$1" val="${2-}" + declare -g "$varname" + printf -v "$varname" '%s' "$val" } # Declare a global variable but preserve existing value if already set dc__declvar_preserve() { - local varname="$1" def="${2-}" - declare -g "$varname" - if [[ "${!varname+x}" != x ]]; then - printf -v "$varname" '%s' "$def" - fi + local varname="$1" def="${2-}" + declare -g "$varname" + if [[ "${!varname+x}" != x ]]; then + printf -v "$varname" '%s' "$def" + fi } # Bind per-prefix spec arrays via namerefs # NOTE: declare -n without 'local' so namerefs are visible to caller dc__bind_spec() { - local prefix="$1" - declare -gn N="__dc_${prefix}_names" - declare -gn R="__dc_${prefix}_reqs" - declare -gn T="__dc_${prefix}_types" - declare -gn D="__dc_${prefix}_descs" - declare -gn V="__dc_${prefix}_varnames" - declare -gn DF="__dc_${prefix}_defs" - declare -gn IDX="__dc_${prefix}_index_by_name" - declare -gn PN="__dc_${prefix}_pos_names" - declare -gn PR="__dc_${prefix}_pos_reqs" - declare -gn PD="__dc_${prefix}_pos_descs" - declare -gn PV="__dc_${prefix}_pos_varnames" - declare -gn SUBCMDS="__dc_${prefix}_subcommands" - declare -gn SUBCMD_OPT="__dc_${prefix}_subcommand_option" + local prefix="$1" + declare -gn N="__dc_${prefix}_names" + declare -gn R="__dc_${prefix}_reqs" + declare -gn T="__dc_${prefix}_types" + declare -gn D="__dc_${prefix}_descs" + declare -gn V="__dc_${prefix}_varnames" + declare -gn DF="__dc_${prefix}_defs" + declare -gn IDX="__dc_${prefix}_index_by_name" + declare -gn PN="__dc_${prefix}_pos_names" + declare -gn PR="__dc_${prefix}_pos_reqs" + declare -gn PD="__dc_${prefix}_pos_descs" + declare -gn PV="__dc_${prefix}_pos_varnames" + declare -gn SUBCMDS="__dc_${prefix}_subcommands" + declare -gn SUBCMD_OPT="__dc_${prefix}_subcommand_option" } # Initialize per-prefix argument spec arrays and add common options # Usage: dc_args_init PREFIX dc_args_init() { - local prefix="$1" - [[ -z "$prefix" ]] && { error "dc_args_init: missing prefix"; return 64; } - - # Define the arrays for this prefix - declare -ga "__dc_${prefix}_names=()" - declare -ga "__dc_${prefix}_reqs=()" - declare -ga "__dc_${prefix}_types=()" - declare -ga "__dc_${prefix}_descs=()" - declare -ga "__dc_${prefix}_varnames=()" - declare -ga "__dc_${prefix}_defs=()" - declare -gA "__dc_${prefix}_index_by_name=()" - - # Positional arguments spec (names, req flags, descriptions, varnames) - declare -ga "__dc_${prefix}_pos_names=()" - declare -ga "__dc_${prefix}_pos_reqs=()" - declare -ga "__dc_${prefix}_pos_descs=()" - declare -ga "__dc_${prefix}_pos_varnames=()" - - # Subcommand support: store conditional requirements - # Maps option names to required subcommand values and their required options - declare -gA "__dc_${prefix}_subcommands=()" - declare -g "__dc_${prefix}_subcommand_option=" - - # Add common inherited options (optional bools) for every app - dc__ensure_common_options "$prefix" + local prefix="$1" + [[ -z "$prefix" ]] && { + error "dc_args_init: missing prefix" + return 64 + } + + # Define the arrays for this prefix + declare -ga "__dc_${prefix}_names=()" + declare -ga "__dc_${prefix}_reqs=()" + declare -ga "__dc_${prefix}_types=()" + declare -ga "__dc_${prefix}_descs=()" + declare -ga "__dc_${prefix}_varnames=()" + declare -ga "__dc_${prefix}_defs=()" + declare -gA "__dc_${prefix}_index_by_name=()" + + # Positional arguments spec (names, req flags, descriptions, varnames) + declare -ga "__dc_${prefix}_pos_names=()" + declare -ga "__dc_${prefix}_pos_reqs=()" + declare -ga "__dc_${prefix}_pos_descs=()" + declare -ga "__dc_${prefix}_pos_varnames=()" + + # Subcommand support: store conditional requirements + # Maps option names to required subcommand values and their required options + declare -gA "__dc_${prefix}_subcommands=()" + declare -g "__dc_${prefix}_subcommand_option=" + + # Add common inherited options (optional bools) for every app + dc__ensure_common_options "$prefix" } # Core adder (nameref-based, reliable) dc__add_option_core() { - local prefix="$1" opt="$2" req="$3" desc="$4" type="$5" varname="$6" default="${7-}" - dc__bind_spec "$prefix" - # Avoid duplicate option registration - if [[ -n "${IDX[$opt]+_}" ]]; then - return 0 - fi - local i; i="${#N[@]}" - N[i]="$opt"; R[i]="$req"; T[i]="$type"; D[i]="$desc"; V[i]="$varname"; DF[i]="$default" - IDX["$opt"]="$i" - # Do not force initial value; allow parse to set defaults and normalize - dc__declvar_preserve "$varname" "" + local prefix="$1" opt="$2" req="$3" desc="$4" type="$5" varname="$6" default="${7-}" + dc__bind_spec "$prefix" + # Avoid duplicate option registration + if [[ -n "${IDX[$opt]+_}" ]]; then + return 0 + fi + local i + i="${#N[@]}" + N[i]="$opt" + R[i]="$req" + T[i]="$type" + D[i]="$desc" + V[i]="$varname" + DF[i]="$default" + IDX["$opt"]="$i" + # Do not force initial value; allow parse to set defaults and normalize + dc__declvar_preserve "$varname" "" } # Add an option to the spec: NAME MANDATORY|OPTIONAL DESCRIPTION [TYPE] # TYPE defaults to "string". Supported: string, int, bool dc_args_add_option() { - local prefix="$1" opt="$2" req="$3" desc="$4" type="${5:-string}" default="${6-}" - [[ -z "$prefix" || -z "$opt" || -z "$req" ]] && { error "dc_args_add_option: missing args"; exit 1; } - case "$req" in - MANDATORY|OPTIONAL) ;; - *) error "dc_args_add_option: req must be MANDATORY or OPTIONAL"; exit 1;; - esac - case "$type" in - string|int|bool) ;; - *) error "dc_args_add_option: unsupported type '$type'"; exit 1;; - esac - local var; var="$(dc__make_var_name "$prefix" "$opt")" - dc__add_option_core "$prefix" "$opt" "$req" "$desc" "$type" "$var" "$default" + local prefix="$1" opt="$2" req="$3" desc="$4" type="${5:-string}" default="${6-}" + [[ -z "$prefix" || -z "$opt" || -z "$req" ]] && { + error "dc_args_add_option: missing args" + exit 1 + } + case "$req" in + MANDATORY | OPTIONAL) ;; + *) + error "dc_args_add_option: req must be MANDATORY or OPTIONAL" + exit 1 + ;; + esac + case "$type" in + string | int | bool) ;; + *) + error "dc_args_add_option: unsupported type '$type'" + exit 1 + ;; + esac + local var + var="$(dc__make_var_name "$prefix" "$opt")" + dc__add_option_core "$prefix" "$opt" "$req" "$desc" "$type" "$var" "$default" } # Add a positional argument to the spec: NAME MANDATORY|OPTIONAL DESCRIPTION dc_args_add_positional() { - local prefix="$1" name="$2" req="$3" desc="$4" - [[ -z "$prefix" || -z "$name" || -z "$req" ]] && { error "dc_args_add_positional: missing args"; return 64; } - case "$req" in - MANDATORY|OPTIONAL) ;; - *) error "dc_args_add_positional: req must be MANDATORY or OPTIONAL"; return 64;; - esac - dc__bind_spec "$prefix" - local i; i="${#PN[@]}" - PN[i]="$name"; PR[i]="$req"; PD[i]="$desc" - local var; var="$(dc__make_var_name "$prefix" "$name")" - PV[i]="$var" - dc__declvar_preserve "$var" "" + local prefix="$1" name="$2" req="$3" desc="$4" + [[ -z "$prefix" || -z "$name" || -z "$req" ]] && { + error "dc_args_add_positional: missing args" + return 64 + } + case "$req" in + MANDATORY | OPTIONAL) ;; + *) + error "dc_args_add_positional: req must be MANDATORY or OPTIONAL" + return 64 + ;; + esac + dc__bind_spec "$prefix" + local i + i="${#PN[@]}" + PN[i]="$name" + PR[i]="$req" + PD[i]="$desc" + local var + var="$(dc__make_var_name "$prefix" "$name")" + PV[i]="$var" + dc__declvar_preserve "$var" "" } # Add global inherited bool (unprefixed) if missing dc__add_global_bool() { - local prefix="$1" opt="$2" desc="$3" - dc__bind_spec "$prefix" - if [[ -n "${IDX[$opt]+_}" ]]; then return 0; fi - local var; var="$(dc__make_global_var_name "$opt")" - dc__add_option_core "$prefix" "$opt" "OPTIONAL" "$desc" "bool" "$var" "" + local prefix="$1" opt="$2" desc="$3" + dc__bind_spec "$prefix" + if [[ -n "${IDX[$opt]+_}" ]]; then return 0; fi + local var + var="$(dc__make_global_var_name "$opt")" + dc__add_option_core "$prefix" "$opt" "OPTIONAL" "$desc" "bool" "$var" "" } # Ensure the common inherited options exist for this prefix dc__ensure_common_options() { - local prefix="$1" - dc__add_global_bool "$prefix" "verbose" "Enable verbose output" - dc__add_global_bool "$prefix" "quiet" "Suppress non-error output" - dc__add_global_bool "$prefix" "dry-run" "Show what would be done, without making changes" - dc__add_global_bool "$prefix" "help" "Show this help and exit" + local prefix="$1" + dc__add_global_bool "$prefix" "verbose" "Enable verbose output" + dc__add_global_bool "$prefix" "quiet" "Suppress non-error output" + dc__add_global_bool "$prefix" "dry-run" "Show what would be done, without making changes" + dc__add_global_bool "$prefix" "help" "Show this help and exit" } # Register subcommand-specific required options @@ -186,388 +216,438 @@ dc__ensure_common_options() { # Example: dc_args_add_subcommand "MYAPP" "action" "compose" "name" "probes" # When --action=compose, then --name and --probes become MANDATORY dc_args_add_subcommand() { - local prefix="$1" option="$2" value="$3" - shift 3 - local required_opts=("$@") - - [[ -z "$prefix" || -z "$option" || -z "$value" ]] && { - error "dc_args_add_subcommand: missing prefix, option, or value" - return 64 - } - - dc__bind_spec "$prefix" - - # Store the subcommand option if not already set - if [[ -z "$SUBCMD_OPT" ]]; then - SUBCMD_OPT="$option" - elif [[ "$SUBCMD_OPT" != "$option" ]]; then - error "dc_args_add_subcommand: cannot use multiple subcommand options ($SUBCMD_OPT vs $option)" - return 64 - fi - - # Store the required options for this subcommand value - # Format: "value:opt1,opt2,opt3" - local opts_str - opts_str="$(IFS=','; echo "${required_opts[*]}")" - SUBCMDS["$value"]="$opts_str" + local prefix="$1" option="$2" value="$3" + shift 3 + local required_opts=("$@") + + [[ -z "$prefix" || -z "$option" || -z "$value" ]] && { + error "dc_args_add_subcommand: missing prefix, option, or value" + return 64 + } + + dc__bind_spec "$prefix" + + # Store the subcommand option if not already set + if [[ -z "$SUBCMD_OPT" ]]; then + SUBCMD_OPT="$option" + elif [[ "$SUBCMD_OPT" != "$option" ]]; then + error "dc_args_add_subcommand: cannot use multiple subcommand options ($SUBCMD_OPT vs $option)" + return 64 + fi + + # Store the required options for this subcommand value + # Format: "value:opt1,opt2,opt3" + local opts_str + opts_str="$( + IFS=',' + echo "${required_opts[*]}" + )" + SUBCMDS["$value"]="$opts_str" } # Build long option string for getopt dc__build_longopts() { - local prefix="$1" - dc__bind_spec "$prefix" - local i long="" - for ((i=0; i<${#N[@]}; ++i)); do - if [[ "${T[i]}" == "bool" ]]; then - long+="${N[i]}," - else - long+="${N[i]}:," - fi - done - printf "%s" "${long%,}" + local prefix="$1" + dc__bind_spec "$prefix" + local i long="" + for ((i = 0; i < ${#N[@]}; ++i)); do + if [[ "${T[i]}" == "bool" ]]; then + long+="${N[i]}," + else + long+="${N[i]}:," + fi + done + printf "%s" "${long%,}" } # Print usage with positional suffix and grouped options dc_args_usage() { - local prefix="$1" prog="$2" - [[ -z "$prog" ]] && prog="$0" - dc__bind_spec "$prefix" - - local i pos_usage="" - for ((i=0; i<${#PN[@]}; ++i)); do - if [[ "${PR[i]}" == "MANDATORY" ]]; then - pos_usage+=" ${PN[i]}" - else - pos_usage+=" [${PN[i]}]" - fi - done - - log "Usage: $prog [OPTIONS]${pos_usage} -- [args...]" - log "" - local print_group - print_group() { - local want="$1" header="$2" - local any=0 i - for ((i=0; i<${#N[@]}; ++i)); do - if [[ "${R[i]}" == "$want" ]]; then - (( any==0 )) && { log "$header"; any=1; } - # Determine conditional requirement note based on subcommands - local note="" - if [[ -n "$SUBCMD_OPT" ]]; then - local __vals=() - local __k - for __k in "${!SUBCMDS[@]}"; do - local __opts_str="${SUBCMDS[$__k]}" - IFS=',' read -ra __opts <<< "$__opts_str" - local __o - for __o in "${__opts[@]}"; do - if [[ "$__o" == "${N[i]}" ]]; then - __vals+=("$__k") - break - fi - done - done - if (( ${#__vals[@]} > 0 )); then - # Check if the subcommand option is a bool type - local __subcmd_idx="${IDX[$SUBCMD_OPT]}" - local __subcmd_type="${T[$__subcmd_idx]}" - - if [[ "$__subcmd_type" == "bool" ]]; then - # For bool, just show --option without =value - note=" (required when --$SUBCMD_OPT)" - else - # For non-bool, show --option=value1|value2 - local __vals_joined - IFS='|' read -r __vals_joined <<< "${__vals[*]}" - note=" (required when --$SUBCMD_OPT=$__vals_joined)" - fi - fi - fi - if [[ "${T[i]}" == "bool" ]]; then - log " --%-18s %s%s\n" "${N[i]}" "${D[i]}" "$note" - else - log " --%-18s %s%s\n" "${N[i]} <${T[i]}>" "${D[i]}" "$note" - fi - fi - done - (( any==1 )) && log "" - } - print_group "MANDATORY" "Mandatory options:" - print_group "OPTIONAL" "Optional options:" - - if (( ${#PN[@]} > 0 )); then - log "Positional arguments:" - for ((i=0; i<${#PN[@]}; ++i)); do - log " %-20s %s" "${PN[i]}" "${PD[i]}" - done - log "" - fi + local prefix="$1" prog="$2" + [[ -z "$prog" ]] && prog="$0" + dc__bind_spec "$prefix" + + local i pos_usage="" + for ((i = 0; i < ${#PN[@]}; ++i)); do + if [[ "${PR[i]}" == "MANDATORY" ]]; then + pos_usage+=" ${PN[i]}" + else + pos_usage+=" [${PN[i]}]" + fi + done + + log "Usage: $prog [OPTIONS]${pos_usage} -- [args...]" + log "" + local print_group + print_group() { + local want="$1" header="$2" + local any=0 i + for ((i = 0; i < ${#N[@]}; ++i)); do + if [[ "${R[i]}" == "$want" ]]; then + ((any == 0)) && { + log "$header" + any=1 + } + # Determine conditional requirement note based on subcommands + local note="" + if [[ -n "$SUBCMD_OPT" ]]; then + local __vals=() + local __k + for __k in "${!SUBCMDS[@]}"; do + local __opts_str="${SUBCMDS[$__k]}" + IFS=',' read -ra __opts <<<"$__opts_str" + local __o + for __o in "${__opts[@]}"; do + if [[ "$__o" == "${N[i]}" ]]; then + __vals+=("$__k") + break + fi + done + done + if ((${#__vals[@]} > 0)); then + # Check if the subcommand option is a bool type + local __subcmd_idx="${IDX[$SUBCMD_OPT]}" + local __subcmd_type="${T[$__subcmd_idx]}" + + if [[ "$__subcmd_type" == "bool" ]]; then + # For bool, just show --option without =value + note=" (required when --$SUBCMD_OPT)" + else + # For non-bool, show --option=value1|value2 + local __vals_joined + IFS='|' read -r __vals_joined <<<"${__vals[*]}" + note=" (required when --$SUBCMD_OPT=$__vals_joined)" + fi + fi + fi + if [[ "${T[i]}" == "bool" ]]; then + log " --%-18s %s%s\n" "${N[i]}" "${D[i]}" "$note" + else + log " --%-18s %s%s\n" "${N[i]} <${T[i]}>" "${D[i]}" "$note" + fi + fi + done + ((any == 1)) && log "" + } + print_group "MANDATORY" "Mandatory options:" + print_group "OPTIONAL" "Optional options:" + + if ((${#PN[@]} > 0)); then + log "Positional arguments:" + for ((i = 0; i < ${#PN[@]}; ++i)); do + log " %-20s %s" "${PN[i]}" "${PD[i]}" + done + log "" + fi } dc_args_show_help() { - local prefix="$1" prog="$2" - [[ -z "$prefix" ]] && { log "dc_args_show_help: missing prefix"; exit 1; } - [[ -z "$prog" ]] && prog="$0" - dc_args_usage "$prefix" "$prog" + local prefix="$1" prog="$2" + [[ -z "$prefix" ]] && { + log "dc_args_show_help: missing prefix" + exit 1 + } + [[ -z "$prog" ]] && prog="$0" + dc_args_usage "$prefix" "$prog" } dc__normalize_bool_var() { - local varname="$1" v lc - v="${!varname}" - lc="$(echo -n "${v:-}" | dc__lower)" - case "$lc" in - 1|true|t|yes|y|on) dc__setvar "$varname" "1" ;; - 0|false|f|no|n|off|"") dc__setvar "$varname" "0" ;; - *) dc__setvar "$varname" "0" ;; - esac + local varname="$1" v lc + v="${!varname}" + lc="$(echo -n "${v:-}" | dc__lower)" + case "$lc" in + 1 | true | t | yes | y | on) dc__setvar "$varname" "1" ;; + 0 | false | f | no | n | off | "") dc__setvar "$varname" "0" ;; + *) dc__setvar "$varname" "0" ;; + esac } dc__validate_value() { - local type="$1" value="$2" - case "$type" in - int) - [[ "$value" =~ ^-?[0-9]+$ ]] || { error "expects integer, got '$value'"; return 1; } - ;; - string|bool|*) ;; - esac - return 0 + local type="$1" value="$2" + case "$type" in + int) + [[ "$value" =~ ^-?[0-9]+$ ]] || { + error "expects integer, got '$value'" + return 1 + } + ;; + string | bool | *) ;; + esac + return 0 } dc_args_parse() { - local prefix="$1" prog="$2"; shift 2 || true - - dc__ensure_gnu_getopt || return $? - - local longopts; longopts="$(dc__build_longopts "$prefix")" - local parsed - if ! parsed="$(getopt --name "$prog" --options "" --longoptions "$longopts" -- "$@")"; then - log "" - dc_args_usage "$prefix" "$prog" - exit 1 - fi - eval "set -- $parsed" - - dc__bind_spec "$prefix" - local i var - for ((i=0; i<${#N[@]}; ++i)); do - var="${V[i]}" - if [[ "${T[i]}" == "bool" ]]; then - # If a non-empty value already exists (e.g., from environment), normalize it. - if [[ -n "${!var-}" ]]; then - dc__normalize_bool_var "$var" - else - # Otherwise, initialize from default if provided; fallback to 0. - if [[ -n "${DF[i]-}" ]]; then - dc__setvar "$var" "${DF[i]}" - dc__normalize_bool_var "$var" - else - dc__setvar "$var" "0" - fi - fi - else - # Initialize non-bool to default if provided; else empty - if [[ -n "${DF[i]-}" ]]; then - dc__setvar "$var" "${DF[i]}" - else - dc__setvar "$var" "" - fi - fi - done - - while true; do - case "$1" in - --) - shift; break ;; - --*) - local opt="${1#--}" - local idx="${IDX[$opt]}" - local type varname - type="${T[idx]}"; varname="${V[idx]}" - if [[ "$type" == "bool" ]]; then - dc__setvar "$varname" "1"; shift - else - if [[ -z "${2-}" ]]; then - error "--$opt requires a value" - log "" - dc_args_usage "$prefix" "$prog" - exit 1 - fi - if ! err="$(dc__validate_value "$type" "$2" 2>&1)"; then - error "--$opt $err" - log "" - dc_args_usage "$prefix" "$prog" - exit 1 - fi - dc__setvar "$varname" "$2"; shift 2 - fi - ;; - *) break ;; - esac - done - - local argsvar; argsvar="$(echo -n "${prefix}_ARGS" | dc__upper)" - declare -ga "$argsvar" - local -n __dc_args_ref="$argsvar" - __dc_args_ref=() - while (( $# )); do __dc_args_ref+=("$1"); shift; done - - local missing_pos=() - for ((i=0; i<${#PN[@]}; ++i)); do - local name="${PN[i]}" req="${PR[i]}" pvar="${PV[i]}" - local val="${__dc_args_ref[i]-}" - dc__setvar "$pvar" "${val-}" - if [[ "$req" == "MANDATORY" && -z "${val-}" ]]; then missing_pos+=("$name"); fi - done - if (( ${#missing_pos[@]} > 0 )); then - error "missing mandatory positional argument(s): ${missing_pos[*]}" - log "" - dc_args_usage "$prefix" "$prog" - exit 1 - fi - - # Defaults were initialized prior to parsing; no further action needed here. - - if [[ "${HELP:-0}" == "1" ]]; then dc_args_show_help "$prefix" "$prog"; exit 0; fi - - if [[ "${QUIET:-0}" == "1" ]]; then dc__setvar "VERBOSE" "0"; fi - if [[ "${VERBOSE:-0}" == "1" ]]; then dc__setvar "QUIET" "0"; fi - - local missing=() - for ((i=0; i<${#N[@]}; ++i)); do - if [[ "${R[i]}" == "MANDATORY" ]]; then - var="${V[i]}"; local v; v="${!var}" - if [[ "${T[i]}" == "bool" ]]; then [[ "$v" == "1" ]] || missing+=("--${N[i]}"); - else [[ -n "$v" ]] || missing+=("--${N[i]}"); fi - fi - done - if (( ${#missing[@]} > 0 )); then - error "missing mandatory option(s): ${missing[*]}" - log "" - dc_args_usage "$prefix" "$prog" - exit 1 - fi - - # Validate subcommand-specific requirements - if [[ -n "$SUBCMD_OPT" ]]; then - # Get the subcommand option's variable name and value - local subcmd_var; subcmd_var="$(dc__make_var_name "$prefix" "$SUBCMD_OPT")" - local subcmd_val; subcmd_val="${!subcmd_var}" - - # Check if this subcommand value has specific requirements - if [[ -n "${SUBCMDS[$subcmd_val]+_}" ]]; then - local required_opts_str="${SUBCMDS[$subcmd_val]}" - IFS=',' read -ra required_opts <<< "$required_opts_str" - - local subcmd_missing=() - for req_opt in "${required_opts[@]}"; do - # Find this option in the spec - if [[ -n "${IDX[$req_opt]+_}" ]]; then - local req_idx="${IDX[$req_opt]}" - local req_var="${V[req_idx]}" - local req_val="${!req_var}" - - if [[ -z "$req_val" ]]; then - subcmd_missing+=("--$req_opt") - fi - fi - done - - if (( ${#subcmd_missing[@]} > 0 )); then - error "subcommand '$subcmd_val' requires: ${subcmd_missing[*]}" - log "" - dc_args_usage "$prefix" "$prog" - exit 1 - fi - fi - fi - - if [[ "${VERBOSE:-0}" == "1" ]]; then - dc_args_pretty_print "$prefix" "$prog" - fi + local prefix="$1" prog="$2" + shift 2 || true + + dc__ensure_gnu_getopt || return $? + + local longopts + longopts="$(dc__build_longopts "$prefix")" + local parsed + if ! parsed="$(getopt --name "$prog" --options "" --longoptions "$longopts" -- "$@")"; then + log "" + dc_args_usage "$prefix" "$prog" + exit 1 + fi + eval "set -- $parsed" + + dc__bind_spec "$prefix" + local i var + for ((i = 0; i < ${#N[@]}; ++i)); do + var="${V[i]}" + if [[ "${T[i]}" == "bool" ]]; then + # If a non-empty value already exists (e.g., from environment), normalize it. + if [[ -n "${!var-}" ]]; then + dc__normalize_bool_var "$var" + else + # Otherwise, initialize from default if provided; fallback to 0. + if [[ -n "${DF[i]-}" ]]; then + dc__setvar "$var" "${DF[i]}" + dc__normalize_bool_var "$var" + else + dc__setvar "$var" "0" + fi + fi + else + # Initialize non-bool to default if provided; else empty + if [[ -n "${DF[i]-}" ]]; then + dc__setvar "$var" "${DF[i]}" + else + dc__setvar "$var" "" + fi + fi + done + + while true; do + case "$1" in + --) + shift + break + ;; + --*) + local opt="${1#--}" + local idx="${IDX[$opt]}" + local type varname + type="${T[idx]}" + varname="${V[idx]}" + if [[ "$type" == "bool" ]]; then + dc__setvar "$varname" "1" + shift + else + if [[ -z "${2-}" ]]; then + error "--$opt requires a value" + log "" + dc_args_usage "$prefix" "$prog" + exit 1 + fi + if ! err="$(dc__validate_value "$type" "$2" 2>&1)"; then + error "--$opt $err" + log "" + dc_args_usage "$prefix" "$prog" + exit 1 + fi + dc__setvar "$varname" "$2" + shift 2 + fi + ;; + *) break ;; + esac + done + + local argsvar + argsvar="$(echo -n "${prefix}_ARGS" | dc__upper)" + declare -ga "$argsvar" + local -n __dc_args_ref="$argsvar" + __dc_args_ref=() + while (($#)); do + __dc_args_ref+=("$1") + shift + done + + local missing_pos=() + for ((i = 0; i < ${#PN[@]}; ++i)); do + local name="${PN[i]}" req="${PR[i]}" pvar="${PV[i]}" + local val="${__dc_args_ref[i]-}" + dc__setvar "$pvar" "${val-}" + if [[ "$req" == "MANDATORY" && -z "${val-}" ]]; then missing_pos+=("$name"); fi + done + if ((${#missing_pos[@]} > 0)); then + error "missing mandatory positional argument(s): ${missing_pos[*]}" + log "" + dc_args_usage "$prefix" "$prog" + exit 1 + fi + + # Defaults were initialized prior to parsing; no further action needed here. + + if [[ "${HELP:-0}" == "1" ]]; then + dc_args_show_help "$prefix" "$prog" + exit 0 + fi + + if [[ "${QUIET:-0}" == "1" ]]; then dc__setvar "VERBOSE" "0"; fi + if [[ "${VERBOSE:-0}" == "1" ]]; then dc__setvar "QUIET" "0"; fi + + local missing=() + for ((i = 0; i < ${#N[@]}; ++i)); do + if [[ "${R[i]}" == "MANDATORY" ]]; then + var="${V[i]}" + local v + v="${!var}" + if [[ "${T[i]}" == "bool" ]]; then + [[ "$v" == "1" ]] || missing+=("--${N[i]}") + else [[ -n "$v" ]] || missing+=("--${N[i]}"); fi + fi + done + if ((${#missing[@]} > 0)); then + error "missing mandatory option(s): ${missing[*]}" + log "" + dc_args_usage "$prefix" "$prog" + exit 1 + fi + + # Validate subcommand-specific requirements + if [[ -n "$SUBCMD_OPT" ]]; then + # Get the subcommand option's variable name and value + local subcmd_var + subcmd_var="$(dc__make_var_name "$prefix" "$SUBCMD_OPT")" + local subcmd_val + subcmd_val="${!subcmd_var}" + + # Check if this subcommand value has specific requirements + if [[ -n "${SUBCMDS[$subcmd_val]+_}" ]]; then + local required_opts_str="${SUBCMDS[$subcmd_val]}" + IFS=',' read -ra required_opts <<<"$required_opts_str" + + local subcmd_missing=() + for req_opt in "${required_opts[@]}"; do + # Find this option in the spec + if [[ -n "${IDX[$req_opt]+_}" ]]; then + local req_idx="${IDX[$req_opt]}" + local req_var="${V[req_idx]}" + local req_val="${!req_var}" + + if [[ -z "$req_val" ]]; then + subcmd_missing+=("--$req_opt") + fi + fi + done + + if ((${#subcmd_missing[@]} > 0)); then + error "subcommand '$subcmd_val' requires: ${subcmd_missing[*]}" + log "" + dc_args_usage "$prefix" "$prog" + exit 1 + fi + fi + fi + + if [[ "${VERBOSE:-0}" == "1" ]]; then + dc_args_pretty_print "$prefix" "$prog" + fi } dc_args_pretty_print() { - local prefix="$1" prog="$2"; [[ -z "$prefix" ]] && { error "dc_args_pretty_print: missing prefix"; return 64; } - [[ -z "$prog" ]] && prog="$0" - dc__bind_spec "$prefix" - debug "$prog arguments:"; debug "" - local i max=0; for ((i=0; i<${#N[@]}; ++i)); do (( ${#N[i]}>max )) && max=${#N[i]}; done - local print_group - print_group() { - local want="$1" header="$2" any=0 - for ((i=0; i<${#N[@]}; ++i)); do - if [[ "${R[i]}" == "$want" ]]; then - (( any==0 )) && { debug "$header"; any=1; } - local var val disp; var="${V[i]}"; val="${!var}"; disp="" - # Compute conditional requirement note for this option (if any) - local note="" - if [[ -n "$SUBCMD_OPT" ]]; then - local __vals=() __k - for __k in "${!SUBCMDS[@]}"; do - local __opts_str="${SUBCMDS[$__k]}" - IFS=',' read -ra __opts <<< "$__opts_str" - local __o - for __o in "${__opts[@]}"; do - if [[ "$__o" == "${N[i]}" ]]; then - __vals+=("$__k") - break - fi - done - done - if (( ${#__vals[@]} > 0 )); then - # Check if the subcommand option is a bool type - local __subcmd_idx="${IDX[$SUBCMD_OPT]}" - local __subcmd_type="${T[$__subcmd_idx]}" - - if [[ "$__subcmd_type" == "bool" ]]; then - # For bool, just show --option without =value - note=" (required when --$SUBCMD_OPT)" - else - # For non-bool, show --option=value1|value2|... - local __joined=""; local __idx - for __idx in "${!__vals[@]}"; do - [[ "$__idx" -gt 0 ]] && __joined+="|" - __joined+="${__vals[$__idx]}" - done - note=" (required when --$SUBCMD_OPT=$__joined)" - fi - fi - fi - - if [[ "${T[i]}" == "bool" ]]; then - if [[ "$val" == "1" ]]; then val="true"; else val="false"; fi - debug " --%-*s : %s%s" "$max" "${N[i]}" "$val" "$note" - else - # Prefer actual value; if empty, fall back to default (if any) for display - if [[ -n "$val" ]]; then - disp="$val" - elif [[ -n "${DF[i]-}" ]]; then - disp="${DF[i]}" - else - disp="" - fi - if [[ -z "$disp" ]]; then - debug " --%-*s : %s%s" "$max" "${N[i]}" "" "$note" - else - local qv - printf -v qv "%q" "$disp" - debug " --%-*s : %s%s" "$max" "${N[i]}" "$qv" "$note" - fi - fi - fi - done; (( any==1 )) && debug "" - } - print_group "MANDATORY" "Mandatory options:"; print_group "OPTIONAL" "Optional options:" - local argsvar; argsvar="$(echo -n "${prefix}_ARGS" | dc__upper)"; local -n __dc_args_ref="$argsvar" - if (( ${#__dc_args_ref[@]} > 0 )); then - debug "Positional arguments:" - for ((i=0; i<${#__dc_args_ref[@]}; ++i)); do - local q - printf -v q "%q" "${__dc_args_ref[i]}" - debug " [%d] %s" "$i" "$q" - done - debug "" - fi + local prefix="$1" prog="$2" + [[ -z "$prefix" ]] && { + error "dc_args_pretty_print: missing prefix" + return 64 + } + [[ -z "$prog" ]] && prog="$0" + dc__bind_spec "$prefix" + debug "$prog arguments:" + debug "" + local i max=0 + for ((i = 0; i < ${#N[@]}; ++i)); do ((${#N[i]} > max)) && max=${#N[i]}; done + local print_group + print_group() { + local want="$1" header="$2" any=0 + for ((i = 0; i < ${#N[@]}; ++i)); do + if [[ "${R[i]}" == "$want" ]]; then + ((any == 0)) && { + debug "$header" + any=1 + } + local var val disp + var="${V[i]}" + val="${!var}" + disp="" + # Compute conditional requirement note for this option (if any) + local note="" + if [[ -n "$SUBCMD_OPT" ]]; then + local __vals=() __k + for __k in "${!SUBCMDS[@]}"; do + local __opts_str="${SUBCMDS[$__k]}" + IFS=',' read -ra __opts <<<"$__opts_str" + local __o + for __o in "${__opts[@]}"; do + if [[ "$__o" == "${N[i]}" ]]; then + __vals+=("$__k") + break + fi + done + done + if ((${#__vals[@]} > 0)); then + # Check if the subcommand option is a bool type + local __subcmd_idx="${IDX[$SUBCMD_OPT]}" + local __subcmd_type="${T[$__subcmd_idx]}" + + if [[ "$__subcmd_type" == "bool" ]]; then + # For bool, just show --option without =value + note=" (required when --$SUBCMD_OPT)" + else + # For non-bool, show --option=value1|value2|... + local __joined="" + local __idx + for __idx in "${!__vals[@]}"; do + [[ "$__idx" -gt 0 ]] && __joined+="|" + __joined+="${__vals[$__idx]}" + done + note=" (required when --$SUBCMD_OPT=$__joined)" + fi + fi + fi + + if [[ "${T[i]}" == "bool" ]]; then + if [[ "$val" == "1" ]]; then val="true"; else val="false"; fi + debug " --%-*s : %s%s" "$max" "${N[i]}" "$val" "$note" + else + # Prefer actual value; if empty, fall back to default (if any) for display + if [[ -n "$val" ]]; then + disp="$val" + elif [[ -n "${DF[i]-}" ]]; then + disp="${DF[i]}" + else + disp="" + fi + if [[ -z "$disp" ]]; then + debug " --%-*s : %s%s" "$max" "${N[i]}" "" "$note" + else + local qv + printf -v qv "%q" "$disp" + debug " --%-*s : %s%s" "$max" "${N[i]}" "$qv" "$note" + fi + fi + fi + done + if ((any == 1)); then + debug "" + fi + } + print_group "MANDATORY" "Mandatory options:" + print_group "OPTIONAL" "Optional options:" + local argsvar + argsvar="$(echo -n "${prefix}_ARGS" | dc__upper)" + local -n __dc_args_ref="$argsvar" + if ((${#__dc_args_ref[@]} > 0)); then + debug "Positional arguments:" + for ((i = 0; i < ${#__dc_args_ref[@]}; ++i)); do + local q + printf -v q "%q" "${__dc_args_ref[i]}" + debug " [%d] %s" "$i" "$q" + done + debug "" + fi } # Example: @@ -578,7 +658,7 @@ dc_args_pretty_print() { # dc_args_pretty_print "MYAPP" "myprog" # dc_args_usage "MYAPP" "myprog" # echo "$MYAPP_INPUT" "$MYAPP_COUNT" "$VERBOSE" "$QUIET" "$DRY_RUN" -# +# # Example with subcommands: # dc_args_init "MYAPP" # dc_args_add_option "MYAPP" "user" "MANDATORY" "User name" "string" diff --git a/scripts/datacrumbs/datacrumbs_compose.in b/scripts/datacrumbs/datacrumbs_compose.in index ae272db7..17d957e8 100755 --- a/scripts/datacrumbs/datacrumbs_compose.in +++ b/scripts/datacrumbs/datacrumbs_compose.in @@ -6,26 +6,26 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Load argument parser if [[ -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - source "$SCRIPT_DIR/datacrumbs_args" + source "$SCRIPT_DIR/datacrumbs_args" else - error "datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + error "datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi APP="DATACRUMBS_COMPOSE" dc_args_init "$APP" -dc_args_add_option "$APP" "action" "MANDATORY" "Action to perform: discover or compose" "string" -dc_args_add_option "$APP" "name" "OPTIONAL" "Composable name (required for compose)" "string" -dc_args_add_option "$APP" "probes" "OPTIONAL" "Comma-separated probe list (required for compose)" "string" +dc_args_add_option "$APP" "action" "MANDATORY" "Action to perform: discover or compose" "string" +dc_args_add_option "$APP" "name" "OPTIONAL" "Composable name (required for compose)" "string" +dc_args_add_option "$APP" "probes" "OPTIONAL" "Comma-separated probe list (required for compose)" "string" dc_args_add_subcommand "$APP" "action" "compose" "name" "probes" # If --help was requested, show help using the already-registered spec and exit for __dc_a in "$@"; do - [[ "$__dc_a" == "--" ]] && break - if [[ "$__dc_a" == "--help" ]]; then - dc_args_show_help "$APP" "datacrumbs_compose" - exit 0 - fi + [[ "$__dc_a" == "--" ]] && break + if [[ "$__dc_a" == "--help" ]]; then + dc_args_show_help "$APP" "datacrumbs_compose" + exit 0 + fi done dc_args_parse "$APP" "datacrumbs_compose" "$@" @@ -34,9 +34,9 @@ ACTION="${DATACRUMBS_COMPOSE_ACTION}" # Validate action if [[ "$ACTION" != "compose" && "$ACTION" != "discover" ]]; then - error "--action must be either 'compose' or 'discover'." - dc_args_show_help "$APP" "datacrumbs_compose" - exit 1 + error "--action must be either 'compose' or 'discover'." + dc_args_show_help "$APP" "datacrumbs_compose" + exit 1 fi dc_args_pretty_print "$APP" "datacrumbs_compose" @@ -49,63 +49,63 @@ check_sudo_user # Dry run support DRY_RUN_MODE=0 if [[ -n "${DRY_RUN}" && "${DRY_RUN}" != "0" ]]; then - DRY_RUN_MODE=1 - log "Dry-run mode active. Commands will be printed but not executed." + DRY_RUN_MODE=1 + log "Dry-run mode active. Commands will be printed but not executed." fi run() { - if [[ "$DRY_RUN_MODE" == "1" ]]; then - printf "[DRY-RUN]" - printf " %q" "$@" - printf "\n" - return 0 - else - "$@" - fi + if [[ "$DRY_RUN_MODE" == "1" ]]; then + printf "[DRY-RUN]" + printf " %q" "$@" + printf "\n" + return 0 + else + "$@" + fi } PROBE_OBJECTS_DIR="$DATACRUMBS_INSTALL_PROBE_OBJECTS_DIR" if [[ "$ACTION" == "discover" ]]; then - log "Discovering probe objects in $PROBE_OBJECTS_DIR..." - for file in "$PROBE_OBJECTS_DIR"/*.o; do - fname=$(basename "$file") - if [[ "$fname" != "common.o" && "$fname" != "datacrumbs.bpf.o" && "$fname" != "init.o" ]]; then - log "${fname%.o}" - fi - done + log "Discovering probe objects in $PROBE_OBJECTS_DIR..." + for file in "$PROBE_OBJECTS_DIR"/*.o; do + fname=$(basename "$file") + if [[ "$fname" != "common.o" && "$fname" != "datacrumbs.bpf.o" && "$fname" != "init.o" ]]; then + log "${fname%.o}" + fi + done elif [[ "$ACTION" == "compose" ]]; then - COMPOSABLE_NAME="${DATACRUMBS_COMPOSE_NAME}" - PROBES="${DATACRUMBS_COMPOSE_PROBES}" - - if [[ -z "$COMPOSABLE_NAME" || -z "$PROBES" ]]; then - error "--name and --probes are required for --action compose" - dc_args_pretty_print "$APP" "datacrumbs_compose" - exit 1 - fi - - IFS=',' read -ra PROBES_ARRAY <<< "$PROBES" - for probe in "${PROBES_ARRAY[@]}"; do - probe_file="${PROBE_OBJECTS_DIR}/${probe}.o" - if [[ ! -f "$probe_file" ]]; then - error "Probe object '$probe_file' not found." - exit 1 - fi - done - - log "Composing $COMPOSABLE_NAME for: ${DATACRUMBS_USER}" - BUILD_DIR="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_$(date +%s%N)" - if [[ -d "${BUILD_DIR}" ]]; then - warn "Cleaning existing build directory: ${BUILD_DIR}" - run rm -rf "${BUILD_DIR}" - fi - - log "Creating build directory: ${BUILD_DIR}" - run mkdir -p "${BUILD_DIR}" - run chown "${DATACRUMBS_USER}:${DATACRUMBS_USER}" "${BUILD_DIR}" - - log "Running build process as ${DATACRUMBS_USER}" - run su - ${DATACRUMBS_USER} << 'EOF' + COMPOSABLE_NAME="${DATACRUMBS_COMPOSE_NAME}" + PROBES="${DATACRUMBS_COMPOSE_PROBES}" + + if [[ -z "$COMPOSABLE_NAME" || -z "$PROBES" ]]; then + error "--name and --probes are required for --action compose" + dc_args_pretty_print "$APP" "datacrumbs_compose" + exit 1 + fi + + IFS=',' read -ra PROBES_ARRAY <<<"$PROBES" + for probe in "${PROBES_ARRAY[@]}"; do + probe_file="${PROBE_OBJECTS_DIR}/${probe}.o" + if [[ ! -f "$probe_file" ]]; then + error "Probe object '$probe_file' not found." + exit 1 + fi + done + + log "Composing $COMPOSABLE_NAME for: ${DATACRUMBS_USER}" + BUILD_DIR="@DATACRUMBS_INSTALL_RUNSTATEDIR@/datacrumbs_${DATACRUMBS_USER}_$(date +%s%N)" + if [[ -d "${BUILD_DIR}" ]]; then + warn "Cleaning existing build directory: ${BUILD_DIR}" + run rm -rf "${BUILD_DIR}" + fi + + log "Creating build directory: ${BUILD_DIR}" + run mkdir -p "${BUILD_DIR}" + run chown "${DATACRUMBS_USER}:${DATACRUMBS_USER}" "${BUILD_DIR}" + + log "Running build process as ${DATACRUMBS_USER}" + run su - ${DATACRUMBS_USER} <<'EOF' set -e cp -r '${DATACRUMBS_INSTALL_COMPOSABLE_DIR}/'* '${BUILD_DIR}/' @CMAKE_COMMAND@ -B'${BUILD_DIR}/build' -DCMAKE_INSTALL_PREFIX='${BUILD_DIR}/install' \ @@ -116,23 +116,23 @@ elif [[ "$ACTION" == "compose" ]]; then @CMAKE_COMMAND@ --build '${BUILD_DIR}/build' --target all -- -j @CMAKE_COMMAND@ --install '${BUILD_DIR}/build' EOF - if [[ $? -ne 0 ]]; then - error "Build process failed" - run rm -rf "${BUILD_DIR}" - exit 1 - fi - - log "Copying final binary to client bin" - run sudo -u ${DATACRUMBS_INSTALL_USER} mkdir -p "${DATACRUMBS_CLIENT_BIN}" - run rm -f "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" - run cp "${BUILD_DIR}/install/sbin/datacrumbs_${COMPOSABLE_NAME}" "${DATACRUMBS_CLIENT_BIN}" - run chown ${DATACRUMBS_USER}:${DATACRUMBS_USER} "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" - run chmod u+xr,o-rwx,g-rwx "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" - run rm -rf "${BUILD_DIR}" - debug "Created composable binary at ${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" - log "Compose action completed successfully" + if [[ $? -ne 0 ]]; then + error "Build process failed" + run rm -rf "${BUILD_DIR}" + exit 1 + fi + + log "Copying final binary to client bin" + run sudo -u ${DATACRUMBS_INSTALL_USER} mkdir -p "${DATACRUMBS_CLIENT_BIN}" + run rm -f "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" + run cp "${BUILD_DIR}/install/sbin/datacrumbs_${COMPOSABLE_NAME}" "${DATACRUMBS_CLIENT_BIN}" + run chown ${DATACRUMBS_USER}:${DATACRUMBS_USER} "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" + run chmod u+xr,o-rwx,g-rwx "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" + run rm -rf "${BUILD_DIR}" + debug "Created composable binary at ${DATACRUMBS_CLIENT_BIN}/datacrumbs_${COMPOSABLE_NAME}" + log "Compose action completed successfully" else - error "Invalid usage" - dc_args_pretty_print "$APP" "datacrumbs_compose" - exit 1 -fi \ No newline at end of file + error "Invalid usage" + dc_args_pretty_print "$APP" "datacrumbs_compose" + exit 1 +fi diff --git a/scripts/datacrumbs/datacrumbs_compose_run.in b/scripts/datacrumbs/datacrumbs_compose_run.in index 3a934836..ddfb894d 100755 --- a/scripts/datacrumbs/datacrumbs_compose_run.in +++ b/scripts/datacrumbs/datacrumbs_compose_run.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -23,14 +23,13 @@ dc_args_add_option "DATACRUMBS_COMPOSE_RUN" "ppn" "OPTIONAL" "Set processes per dc_args_add_subcommand "DATACRUMBS_COMPOSE_RUN" "enable_mpi" "1" "nodes" "ppn" # The rest of the arguments are arbitrary and will be captured as APP_ARGS - # Parse arguments dc_args_parse "DATACRUMBS_COMPOSE_RUN" "$0" "$@" if [[ $? -ne 0 ]]; then - echo "Error: Argument parsing failed." - show_help - exit 1 + echo "Error: Argument parsing failed." + show_help + exit 1 fi DATACRUMBS_COMPOSABLE_NAME="${DATACRUMBS_COMPOSE_RUN_COMPOSITE_NAME:-}" @@ -41,68 +40,63 @@ export DATACRUMBS_JOB_NODES=${DATACRUMBS_COMPOSE_RUN_NODES:-1} export DATACRUMBS_JOB_PPN=${DATACRUMBS_COMPOSE_RUN_PPN:-1} if [[ -z "$DATACRUMBS_COMPOSABLE_NAME" || "$DATACRUMBS_COMPOSABLE_NAME" == "NONE" ]]; then - echo "Error: COMPOSITE_NAME argument is required." - show_help - exit 1 + echo "Error: COMPOSITE_NAME argument is required." + show_help + exit 1 fi if [[ -z "${DATACRUMBS_COMPOSE_RUN_APP}" ]]; then - echo "Error: APP command is required." - show_help - exit 1 + echo "Error: APP command is required." + show_help + exit 1 +fi + +if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then + error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" + exit 1 fi # Convert APP_CMD string into array, splitting on spaces -read -ra APP_CMD <<< "${DATACRUMBS_COMPOSE_RUN_APP}" +read -ra APP_CMD <<<"${DATACRUMBS_COMPOSE_RUN_APP}" # Load environment source "$SCRIPT_DIR/datacrumbs_setup" if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then - error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" - exit 1 + error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" + exit 1 fi check_regular_user log "Running cmd: ${APP_CMD[*]} as USER = $DATACRUMBS_USER using composable $DATACRUMBS_COMPOSABLE_NAME" -# Build args to pass to server scripts -server_args=() -if [[ -n "${DATACRUMBS_COMPOSABLE_NAME}" && "${DATACRUMBS_COMPOSABLE_NAME}" != "NONE" ]]; then - server_args+=("--composite-name" "${DATACRUMBS_COMPOSABLE_NAME}") -fi -if [[ "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then - server_args+=("--enable-mpi") - server_args+=("--nodes" "${DATACRUMBS_JOB_NODES}") - server_args+=("--ppn" "${DATACRUMBS_JOB_PPN}") -fi -if [[ "${VERBOSE:-0}" == "1" ]]; then - server_args+=("--verbose") -fi -if [[ "${QUIET:-0}" == "1" ]]; then - server_args+=("--quiet") -fi -if [[ "${DRY_RUN:-0}" == "1" ]]; then - server_args+=("--dry-run") +if [[ -z "$DRY_RUN" ]]; then + datacrumbs_init "$DATACRUMBS_USER" "$DATACRUMBS_TRACE_DIR" fi -SERVER_RUN_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_run.sh -SERVER_STOP_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_stop.sh +debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" +debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" +debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" +debug "DATACRUMBS_LOG_FILE: $DATACRUMBS_LOG_FILE" +debug "DATACRUMBS_SERVER_READY_FILE: $DATACRUMBS_SERVER_READY_FILE" + +exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSABLE_NAME}") +debug "Starting datacrumbs server with exec: ${exec[*]}" +datacrumbs_start_server "${exec[*]}" -echo "Starting DataCrumbs server via: $SERVER_RUN_BIN ${server_args[*]}" -sudo "$SERVER_RUN_BIN" "${server_args[@]}" -if [[ $? -ne 0 ]]; then - echo "Error: Failed to start DataCrumbs server" - exit 1 -fi log "Running App: ${APP_CMD[*]}" job_launch "${APP_CMD[@]}" log "Finished App" -echo "Stopping DataCrumbs server via: $SERVER_STOP_BIN ${server_args[*]}" -sudo "$SERVER_STOP_BIN" "${server_args[@]}" -if [[ $? -ne 0 ]]; then - echo "Error: Failed to stop DataCrumbs server" - exit 1 +debug "Stopping datacrumbs server with exec: ${exec[*]}" +datacrumbs_stop_server "${exec[*]}" $PROG_NAME +if [[ "$DRY_RUN" == "1" ]]; then + debug "[DRY_RUN] Would print datacrumbs status" + debug "[DRY_RUN] Would finalize datacrumbs for user: $DATACRUMBS_USER" +else + debug "Printing datacrumbs status" + datacrumbs_print_status + debug "Finalizing datacrumbs for user: $DATACRUMBS_USER" + datacrumbs_finalize "$DATACRUMBS_USER" fi diff --git a/scripts/datacrumbs/datacrumbs_compose_wrapper.in b/scripts/datacrumbs/datacrumbs_compose_wrapper.in index 0046d6ac..6940b393 100755 --- a/scripts/datacrumbs/datacrumbs_compose_wrapper.in +++ b/scripts/datacrumbs/datacrumbs_compose_wrapper.in @@ -13,8 +13,8 @@ DATACRUMBS_COMPOSABLE_NAME=$1 shift if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSABLE_NAME}"; then - error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" - exit 1 + error "Invalid composable name: ${DATACRUMBS_COMPOSABLE_NAME}" + exit 1 fi -${DATACRUMBS_CLIENT_BIN}/datacrumbs_${DATACRUMBS_COMPOSABLE_NAME} $@ \ No newline at end of file +${DATACRUMBS_CLIENT_BIN}/datacrumbs_${DATACRUMBS_COMPOSABLE_NAME} $@ diff --git a/scripts/datacrumbs/datacrumbs_create_log_dir.in b/scripts/datacrumbs/datacrumbs_create_log_dir.in index 9bdd1db1..03a91693 100755 --- a/scripts/datacrumbs/datacrumbs_create_log_dir.in +++ b/scripts/datacrumbs/datacrumbs_create_log_dir.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -27,9 +27,9 @@ done dc_args_parse "$APP" "datacrumbs_create_log_dir" "$@" if [[ $? -ne 0 ]]; then - echo "Error: Argument parsing failed." - show_help - exit 1 + echo "Error: Argument parsing failed." + show_help + exit 1 fi PROG_NAME=$(basename "$0") @@ -39,4 +39,4 @@ source $SCRIPT_DIR/datacrumbs_setup check_install_user mkdir -p $DATACRUMBS_TRACE_DIR -log "Created log directory: $DATACRUMBS_TRACE_DIR" \ No newline at end of file +log "Created log directory: $DATACRUMBS_TRACE_DIR" diff --git a/scripts/datacrumbs/datacrumbs_logging.in b/scripts/datacrumbs/datacrumbs_logging.in index 87bcaf8a..caddcedc 100755 --- a/scripts/datacrumbs/datacrumbs_logging.in +++ b/scripts/datacrumbs/datacrumbs_logging.in @@ -3,67 +3,67 @@ set -eo pipefail log() { - if [[ "${QUIET:-0}" == "0" ]]; then - printf "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" - printf "\n" - fi + if [[ "${QUIET:-0}" == "0" ]]; then + printf "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" + printf "\n" + fi } debug() { - if [[ "${VERBOSE:-0}" == "1" ]] && [[ "${QUIET:-1}" == "0" ]]; then - printf "[DEBUG $(date '+%Y-%m-%d %H:%M:%S')] $@" - printf "\n" - fi + if [[ "${VERBOSE:-0}" == "1" ]] && [[ "${QUIET:-1}" == "0" ]]; then + printf "[DEBUG $(date '+%Y-%m-%d %H:%M:%S')] $@" + printf "\n" + fi } error() { - printf "[ERROR $(date '+%Y-%m-%d %H:%M:%S')] $@" >&2 - printf "\n" >&2 + printf "[ERROR $(date '+%Y-%m-%d %H:%M:%S')] $@" >&2 + printf "\n" >&2 } warn() { - if [[ "${QUIET:-1}" != "" ]] && [[ "${QUIET:-1}" == "0" ]]; then - printf "[WARN $(date '+%Y-%m-%d %H:%M:%S')] $@" >&2 - printf "\n" >&2 - fi + if [[ "${QUIET:-1}" != "" ]] && [[ "${QUIET:-1}" == "0" ]]; then + printf "[WARN $(date '+%Y-%m-%d %H:%M:%S')] $@" >&2 + printf "\n" >&2 + fi } log_system() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then - logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" - else - logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" - fi + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi } log_user() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - flux job raise --severity=7 ${FLUX_JOB_ID} "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then - logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" - else - logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" - fi + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + flux job raise --severity=7 ${FLUX_JOB_ID} "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi } warn_user() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - flux job raise --severity=1 ${FLUX_JOB_ID} "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then - logger "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" - else - logger "[WARN $(date '+%Y-%m-%d %H:%M:%S')] $@" - fi + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + flux job raise --severity=1 ${FLUX_JOB_ID} "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[WARN $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi } error_user() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - flux job raise --severity=1 ${FLUX_JOB_ID} "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then - logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" - else - logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S')] $@" - fi + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + flux job raise --severity=1 ${FLUX_JOB_ID} "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" + else + logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S')] $@" + fi } diff --git a/scripts/datacrumbs/datacrumbs_run.in b/scripts/datacrumbs/datacrumbs_run.in index 5182aa36..4c19fe08 100755 --- a/scripts/datacrumbs/datacrumbs_run.in +++ b/scripts/datacrumbs/datacrumbs_run.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -20,18 +20,18 @@ dc_args_add_option "DATACRUMBS" "nodes" "OPTIONAL" "Set number of nodes" "int" " dc_args_add_option "DATACRUMBS" "ppn" "OPTIONAL" "Set processes per node" "int" "1" dc_args_add_subcommand "DATACRUMBS" "enable_mpi" "1" "nodes" "ppn" -dc_args_parse "DATACRUMBS" "datacrumbs_run" "$@" +dc_args_parse "DATACRUMBS" "datacrumbs_run" "$@" || true if [[ $? -ne 0 ]]; then - echo "Error: Argument parsing failed." - dc_args_show_help "DATACRUMBS" "datacrumbs_run" - exit 1 + echo "Error: Argument parsing failed." + dc_args_show_help "DATACRUMBS" "datacrumbs_run" + exit 1 fi if [[ -z "${DATACRUMBS_APP}" ]]; then - echo "Error: APP command is required." - dc_args_show_help "DATACRUMBS" "datacrumbs_run" - exit 1 + echo "Error: APP command is required." + dc_args_show_help "DATACRUMBS" "datacrumbs_run" + exit 1 fi export DATACRUMBS_JOB_ENABLE_MPI=${DATACRUMBS_ENABLE_MPI:-0} @@ -39,7 +39,7 @@ export DATACRUMBS_JOB_NODES=${DATACRUMBS_NODES:-1} export DATACRUMBS_JOB_PPN=${DATACRUMBS_PPN:-1} # Convert APP_CMD string into array, splitting on spaces -read -ra APP_CMD <<< "${DATACRUMBS_APP}" +read -ra APP_CMD <<<"${DATACRUMBS_APP}" PROG_NAME=$(basename "$0") @@ -50,18 +50,18 @@ check_regular_user # Build args to pass to server scripts server_args=() if [[ "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then - server_args+=("--enable-mpi") - server_args+=("--nodes" "${DATACRUMBS_JOB_NODES}") - server_args+=("--ppn" "${DATACRUMBS_JOB_PPN}") + server_args+=("--enable-mpi") + server_args+=("--nodes" "${DATACRUMBS_JOB_NODES}") + server_args+=("--ppn" "${DATACRUMBS_JOB_PPN}") fi if [[ "${VERBOSE:-0}" == "1" ]]; then - server_args+=("--verbose") + server_args+=("--verbose") fi if [[ "${QUIET:-0}" == "1" ]]; then - server_args+=("--quiet") + server_args+=("--quiet") fi if [[ "${DRY_RUN:-0}" == "1" ]]; then - server_args+=("--dry-run") + server_args+=("--dry-run") fi SERVER_RUN_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server_run.sh @@ -70,8 +70,8 @@ SERVER_STOP_BIN=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs_server echo "Starting DataCrumbs server via: $SERVER_RUN_BIN ${server_args[*]}" sudo "$SERVER_RUN_BIN" "${server_args[@]}" if [[ $? -ne 0 ]]; then - echo "Error: Failed to start DataCrumbs server" - exit 1 + echo "Error: Failed to start DataCrumbs server" + exit 1 fi log "Running App: ${APP_CMD[*]}" job_launch "${APP_CMD[@]}" @@ -80,6 +80,6 @@ log "Finished App" echo "Stopping DataCrumbs server via: $SERVER_STOP_BIN ${server_args[*]}" sudo "$SERVER_STOP_BIN" "${server_args[@]}" if [[ $? -ne 0 ]]; then - echo "Error: Failed to stop DataCrumbs server" - exit 1 + echo "Error: Failed to stop DataCrumbs server" + exit 1 fi diff --git a/scripts/datacrumbs/datacrumbs_run_validator.in b/scripts/datacrumbs/datacrumbs_run_validator.in index d4b8c106..e3c8917b 100755 --- a/scripts/datacrumbs/datacrumbs_run_validator.in +++ b/scripts/datacrumbs/datacrumbs_run_validator.in @@ -31,4 +31,4 @@ log "Running compact.sh..." chown @DATACRUMBS_INSTALL_USER@:@DATACRUMBS_INSTALL_USER@ * -log "Script completed." \ No newline at end of file +log "Script completed." diff --git a/scripts/datacrumbs/datacrumbs_salloc.in b/scripts/datacrumbs/datacrumbs_salloc.in index 83bff2d4..bf8533e4 100755 --- a/scripts/datacrumbs/datacrumbs_salloc.in +++ b/scripts/datacrumbs/datacrumbs_salloc.in @@ -1,6 +1,5 @@ #!/bin/bash - function usage() { echo "Usage: $0 [SLURM_OPTIONS] [--datacrumbs-composite NAME]" echo "" diff --git a/scripts/datacrumbs/datacrumbs_server_run.sh.in b/scripts/datacrumbs/datacrumbs_server_run.sh.in index 8c589e11..6960ff72 100755 --- a/scripts/datacrumbs/datacrumbs_server_run.sh.in +++ b/scripts/datacrumbs/datacrumbs_server_run.sh.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -23,9 +23,9 @@ dc_args_add_subcommand "DATACRUMBS" "enable-mpi" "1" "nodes" "ppn" dc_args_parse "DATACRUMBS" "datacrumbs_run" "$@" if [[ $? -ne 0 ]]; then - echo "Error: Argument parsing failed." - show_help - exit 1 + echo "Error: Argument parsing failed." + show_help + exit 1 fi export DATACRUMBS_JOB_ENABLE_MPI=${DATACRUMBS_ENABLE_MPI:-0} @@ -37,15 +37,14 @@ PROG_NAME=$(basename "$0") source $SCRIPT_DIR/datacrumbs_setup if [[ "$DATACRUMBS_COMPOSITE_NAME" != "" ]] && [[ "$DATACRUMBS_COMPOSITE_NAME" != "NONE" ]]; then - if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSITE_NAME}"; then - error "Invalid composable name: ${DATACRUMBS_COMPOSITE_NAME}" - exit 1 - fi + if ! validate_datacrumbs_composite_name "${DATACRUMBS_COMPOSITE_NAME}"; then + error "Invalid composable name: ${DATACRUMBS_COMPOSITE_NAME}" + exit 1 + fi fi - check_sudo_user - + debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" @@ -55,9 +54,9 @@ log "Running as USER = $DATACRUMBS_USER and storing traces in $DATACRUMBS_TRACE_ datacrumbs_init $DATACRUMBS_USER $DATACRUMBS_TRACE_DIR exec=() if [[ "$DATACRUMBS_COMPOSITE_NAME" != "" ]] && [[ "$DATACRUMBS_COMPOSITE_NAME" != "NONE" ]]; then - exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSITE_NAME}") + exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSITE_NAME}") else - exec=(@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs) + exec=(@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs) fi datacrumbs_start_server "${exec[*]}" diff --git a/scripts/datacrumbs/datacrumbs_server_stop.sh.in b/scripts/datacrumbs/datacrumbs_server_stop.sh.in index 4fc81d82..296c4590 100755 --- a/scripts/datacrumbs/datacrumbs_server_stop.sh.in +++ b/scripts/datacrumbs/datacrumbs_server_stop.sh.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -23,34 +23,31 @@ dc_args_add_subcommand "DATACRUMBS" "enable-mpi" "1" "nodes" "ppn" dc_args_parse "DATACRUMBS" "datacrumbs_run" "$@" if [[ $? -ne 0 ]]; then - echo "Error: Argument parsing failed." - show_help - exit 1 + echo "Error: Argument parsing failed." + show_help + exit 1 fi export DATACRUMBS_JOB_ENABLE_MPI=${DATACRUMBS_ENABLE_MPI:-0} export DATACRUMBS_JOB_NODES=${DATACRUMBS_NODES:-1} export DATACRUMBS_JOB_PPN=${DATACRUMBS_PPN:-1} - PROG_NAME=$(basename "$0") source $SCRIPT_DIR/datacrumbs_setup if [[ "$DATACRUMBS_COMPOSITE_NAME" != "" ]] && [[ "$DATACRUMBS_COMPOSITE_NAME" != "NONE" ]]; then - if [[ ! -f "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${DATACRUMBS_COMPOSITE_NAME}" ]]; then - error "Composite ${DATACRUMBS_COMPOSITE_NAME} not found for ${DATACRUMBS_USER}" - exit 1 - fi + if [[ ! -f "${DATACRUMBS_CLIENT_BIN}/datacrumbs_${DATACRUMBS_COMPOSITE_NAME}" ]]; then + error "Composite ${DATACRUMBS_COMPOSITE_NAME} not found for ${DATACRUMBS_USER}" + exit 1 + fi fi # Convert APP_CMD string into array, splitting on spaces -read -ra APP_CMD <<< "${DATACRUMBS_APP}" - +read -ra APP_CMD <<<"${DATACRUMBS_APP}" check_sudo_user - debug "DATACRUMBS_SERVER_RUN_ID: $DATACRUMBS_SERVER_RUN_ID" debug "DATACRUMBS_JOB_ID_VAR: $DATACRUMBS_JOB_ID_VAR" debug "value DATACRUMBS_JOB_ID_VAR: ${!DATACRUMBS_JOB_ID_VAR}" @@ -60,9 +57,9 @@ echo "Running cmd: ${APP_CMD[*]} as USER = $DATACRUMBS_USER and storing traces i exec=() if [[ "$DATACRUMBS_COMPOSITE_NAME" != "" ]] && [[ "$DATACRUMBS_COMPOSITE_NAME" != "NONE" ]]; then - exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSITE_NAME}") + exec=("${DATACRUMBS_INSTALL_SBIN_DIR}/datacrumbs_compose_wrapper" "${DATACRUMBS_COMPOSITE_NAME}") else - exec=(@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs) + exec=(@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_SBINDIR@/datacrumbs) fi datacrumbs_stop_server "${exec[*]}" $PROG_NAME diff --git a/scripts/datacrumbs/datacrumbs_service_common.sh.in b/scripts/datacrumbs/datacrumbs_service_common.sh.in index 9de2d14d..883a78ad 100755 --- a/scripts/datacrumbs/datacrumbs_service_common.sh.in +++ b/scripts/datacrumbs/datacrumbs_service_common.sh.in @@ -5,30 +5,30 @@ set -e pipefail source @DATACRUMBS_INSTALL_BINARYDIR@/datacrumbs_setup function get_general_datacrumbs_enabled() { - local enabled=${DATACRUMBS_ENABLED:-0} - enabled_value="no" - if [[ "${enabled}" -eq "1" ]]; then - enabled_value="yes" - fi - log_system "get_general_datacrumbs_enabled returned enabled:${enabled_value}" - echo "${enabled_value}" + local enabled=${DATACRUMBS_ENABLED:-0} + enabled_value="no" + if [[ "${enabled}" -eq "1" ]]; then + enabled_value="yes" + fi + log_system "get_general_datacrumbs_enabled returned enabled:${enabled_value}" + echo "${enabled_value}" } function get_flux_datacrumbs_enabled() { - local enabled=$(flux job info $FLUX_JOB_ID jobspec 2>/dev/null | jq -r .attributes.system.datacrumbs 2>/dev/null) - enabled_value="no" - if [[ ${enabled} == "null" ]]; then - log_system "User hasn't requested datacrumbs feature enabled:${enabled}, exiting." + local enabled=$(flux job info $FLUX_JOB_ID jobspec 2>/dev/null | jq -r .attributes.system.datacrumbs 2>/dev/null) + enabled_value="no" + if [[ ${enabled} == "null" ]]; then + log_system "User hasn't requested datacrumbs feature enabled:${enabled}, exiting." + else + FLUX_DATACRUMBS=$(flux job info $FLUX_JOB_ID jobspec 2>/dev/null | jq -r .attributes.system.datacrumbs.enable 2>/dev/null) + if [[ ${FLUX_DATACRUMBS} == "null" || "${FLUX_DATACRUMBS}" != "yes" ]]; then + log_system "User hasn't requested datacrumbs feature FLUX_DATACRUMBS:${FLUX_DATACRUMBS}, exiting." else - FLUX_DATACRUMBS=$(flux job info $FLUX_JOB_ID jobspec 2>/dev/null | jq -r .attributes.system.datacrumbs.enable 2>/dev/null) - if [[ ${FLUX_DATACRUMBS} == "null" || "${FLUX_DATACRUMBS}" != "yes" ]]; then - log_system "User hasn't requested datacrumbs feature FLUX_DATACRUMBS:${FLUX_DATACRUMBS}, exiting." - else - enabled_value="yes" - fi + enabled_value="yes" fi - log_system "get_flux_datacrumbs_enabled returned enabled:${enabled_value}" - echo "${enabled_value}" + fi + log_system "get_flux_datacrumbs_enabled returned enabled:${enabled_value}" + echo "${enabled_value}" } function get_slurm_comment() { @@ -50,36 +50,36 @@ function get_slurm_datacrumbs_enabled() { } function get_datacrumbs_enabled() { - local enabled="no" - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - enabled=$(get_flux_datacrumbs_enabled) - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then - local slurm_job_comment=$(get_slurm_comment) - log_system "Slurm comment: $slurm_job_comment" - enabled=$(get_slurm_datacrumbs_enabled) - else - enabled=$(get_general_datacrumbs_enabled) - fi - log_system "get_datacrumbs_enabled returned enabled:${enabled}" - echo "${enabled}" + local enabled="no" + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + enabled=$(get_flux_datacrumbs_enabled) + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + local slurm_job_comment=$(get_slurm_comment) + log_system "Slurm comment: $slurm_job_comment" + enabled=$(get_slurm_datacrumbs_enabled) + else + enabled=$(get_general_datacrumbs_enabled) + fi + log_system "get_datacrumbs_enabled returned enabled:${enabled}" + echo "${enabled}" } function get_flux_datacrumbs_composite_name() { - local composite_name=$(flux job info $FLUX_JOB_ID jobspec | jq -r .attributes.system.datacrumbs.composite 2>/dev/null) - if [[ ${composite_name} == "null" || ${composite_name} == "" ]]; then - log_system "User hasn't requested datacrumbs' composite feature using ${composite_name}.""ERROR" - else - log_system "User has requested datacrumbs' composite feature using ${composite_name}." - fi - log_system "get_flux_datacrumbs_composite_name returned composite_name:${composite_name}" - echo "${composite_name}" + local composite_name=$(flux job info $FLUX_JOB_ID jobspec | jq -r .attributes.system.datacrumbs.composite 2>/dev/null) + if [[ ${composite_name} == "null" || ${composite_name} == "" ]]; then + log_system "User hasn't requested datacrumbs' composite feature using ${composite_name}.""ERROR" + else + log_system "User has requested datacrumbs' composite feature using ${composite_name}." + fi + log_system "get_flux_datacrumbs_composite_name returned composite_name:${composite_name}" + echo "${composite_name}" } function get_slurm_datacrumbs_composite_name() { local composite_name=$(get_default_datacrumbs_composite_name) local slurm_job_comment=$(get_slurm_comment) local slurm_composite="$(echo ${slurm_job_comment} | jq -r .datacrumbs.composite 2>/dev/null)" - if [[ + if [[ ${slurm_composite} == "" || ${slurm_composite} == "NONE" || ${slurm_composite} == "null" || @@ -105,36 +105,36 @@ function get_general_datacrumbs_composite_name() { } function get_datacrumbs_composite_name() { - local name=$(get_default_datacrumbs_composite_name) - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - name=$(get_flux_datacrumbs_composite_name) - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then - name=$(get_slurm_datacrumbs_composite_name) - else - name=$(get_general_datacrumbs_composite_name) - fi - if [[ "${name}" != "$(get_default_datacrumbs_composite_name)" && "${name}" != "ERROR" ]]; then - if ! validate_datacrumbs_composite_name "${name}"; then - name="ERROR" - fi + local name=$(get_default_datacrumbs_composite_name) + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + name=$(get_flux_datacrumbs_composite_name) + elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + name=$(get_slurm_datacrumbs_composite_name) + else + name=$(get_general_datacrumbs_composite_name) + fi + if [[ "${name}" != "$(get_default_datacrumbs_composite_name)" && "${name}" != "ERROR" ]]; then + if ! validate_datacrumbs_composite_name "${name}"; then + name="ERROR" fi - log_system "get_datacrumbs_composite_name returned name:${name}" - echo "${name}" + fi + log_system "get_datacrumbs_composite_name returned name:${name}" + echo "${name}" } DATACRUMBS_ENABLED=$(get_datacrumbs_enabled) if [[ "${DATACRUMBS_ENABLED}" != "yes" ]]; then - log_system "User hasn't requested datacrumbs feature, exiting." - return 1 + log_system "User hasn't requested datacrumbs feature, exiting." + return 1 fi DATACRUMBS_COMPOSABLE_NAME=$(get_datacrumbs_composite_name) if [[ "${DATACRUMBS_COMPOSABLE_NAME}" == "ERROR" ]]; then - return 1 + return 1 fi if [[ "${DATACRUMBS_COMPOSABLE_NAME}" == "$(get_default_datacrumbs_composite_name)" ]]; then - log_user "Running system datacrumbs" + log_user "Running system datacrumbs" else - log_user "Running a composite datacrumbs with name: ${DATACRUMBS_COMPOSABLE_NAME}" + log_user "Running a composite datacrumbs with name: ${DATACRUMBS_COMPOSABLE_NAME}" fi readonly DATACRUMBS_COMPOSABLE_NAME diff --git a/scripts/datacrumbs/datacrumbs_service_run.sh.in b/scripts/datacrumbs/datacrumbs_service_run.sh.in index d49b083d..82044695 100755 --- a/scripts/datacrumbs/datacrumbs_service_run.sh.in +++ b/scripts/datacrumbs/datacrumbs_service_run.sh.in @@ -4,9 +4,9 @@ set -e pipefail source @DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_service_common.sh if [[ $? -eq 0 ]]; then - umask 022 - printenv > /run/datacrumbs.env - echo datacrumbs_service_run "Starting datacrumbs service run script on job ${FLUX_JOB_ID}" - sudo systemctl start datacrumbs@$DATACRUMBS_COMPOSABLE_NAME.service + umask 022 + printenv >/run/datacrumbs.env + echo datacrumbs_service_run "Starting datacrumbs service run script on job ${DATACRUMBS_SERVER_RUN_ID}" + sudo systemctl start datacrumbs@${DATACRUMBS_SERVER_RUN_ID}.service fi -exit 0 \ No newline at end of file +exit 0 diff --git a/scripts/datacrumbs/datacrumbs_service_stop.sh.in b/scripts/datacrumbs/datacrumbs_service_stop.sh.in index f604ddb4..43174611 100755 --- a/scripts/datacrumbs/datacrumbs_service_stop.sh.in +++ b/scripts/datacrumbs/datacrumbs_service_stop.sh.in @@ -4,8 +4,7 @@ set -e pipefail source @DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_service_common.sh if [[ $? -eq 0 ]]; then - sudo systemctl stop datacrumbs@${DATACRUMBS_SERVER_RUN_ID}.service - sudo rm ${DATACRUMBS_SERVER_ENV_FILE} + sudo systemctl stop datacrumbs@${DATACRUMBS_SERVER_RUN_ID}.service + sudo rm ${DATACRUMBS_SERVER_ENV_FILE} fi exit 0 - diff --git a/scripts/datacrumbs/datacrumbs_setup.in b/scripts/datacrumbs/datacrumbs_setup.in index 03a290aa..a9381dd4 100755 --- a/scripts/datacrumbs/datacrumbs_setup.in +++ b/scripts/datacrumbs/datacrumbs_setup.in @@ -3,69 +3,68 @@ set -eo pipefail if [[ -z "${BASH_VERSION}" ]]; then - error "This script requires bash" - exit 1 + error "This script requires bash" + exit 1 fi SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ CONFIG_FILE=@DATACRUMBS_INSTALL_ETC_CONFIGSDIR@/project.env.local - source ${SCRIPT_DIR}/datacrumbs_utility if [[ "$(id -u)" != "0" ]]; then - export DATACRUMBS_IS_ROOT=0 - export DATACRUMBS_USER=$(id -un) + export DATACRUMBS_IS_ROOT=0 + export DATACRUMBS_USER=$(id -un) else - export DATACRUMBS_IS_ROOT=1 - export DATACRUMBS_USER=$SUDO_USER - if [[ -z "$DATACRUMBS_USER" ]]; then - DATACRUMBS_USER=$USER - debug "User is root." - fi - if [[ -z "$DATACRUMBS_USER" ]] || [[ "$DATACRUMBS_USER" = "root" ]]; then - DATACRUMBS_USER=$(get_actual_user) - fi + export DATACRUMBS_IS_ROOT=1 + export DATACRUMBS_USER=$SUDO_USER + if [[ -z "$DATACRUMBS_USER" ]]; then + DATACRUMBS_USER=$USER + debug "User is root." + fi + if [[ -z "$DATACRUMBS_USER" ]] || [[ "$DATACRUMBS_USER" = "root" ]]; then + DATACRUMBS_USER=$(get_actual_user) + fi fi if [[ "${DATACRUMBS_ENV_LOADED:-0}" == "0" ]]; then - if command -v direnv &> /dev/null; then - eval "$(direnv exec ${CONFIG_FILE%/*} bash -c 'source ${CONFIG_FILE}; env')" - else - source ${CONFIG_FILE} - fi - log "After loading env file for $DATACRUMBS_USER" - YEAR=$(date +%y) - MONTH=$(date +%m) - DAY=$(date +%d) - export DATACRUMBS_TRACE_DIR=$(echo "$DATACRUMBS_TRACE_DIR_PATTERN" | sed "s|%YY%|$YEAR|g; s|%MM%|$MONTH|g; s|%DD%|$DAY|g") - readonly DATACRUMBS_TRACE_DIR - debug "Log directory set to $DATACRUMBS_TRACE_DIR" + if command -v direnv &>/dev/null; then + eval "$(direnv exec ${CONFIG_FILE%/*} bash -c 'source ${CONFIG_FILE}; env')" + else + source ${CONFIG_FILE} + fi + log "After loading env file for $DATACRUMBS_USER" + YEAR=$(date +%y) + MONTH=$(date +%m) + DAY=$(date +%d) + export DATACRUMBS_TRACE_DIR=$(echo "$DATACRUMBS_TRACE_DIR_PATTERN" | sed "s|%YY%|$YEAR|g; s|%MM%|$MONTH|g; s|%DD%|$DAY|g") + readonly DATACRUMBS_TRACE_DIR + debug "Log directory set to $DATACRUMBS_TRACE_DIR" - mkdir -p "${DATACRUMBS_SERVER_RUN_DIR}" 2> /dev/null + mkdir -p "${DATACRUMBS_SERVER_RUN_DIR}" 2>/dev/null - export DATACRUMBS_ENV_LOADED=1 - readonly DATACRUMBS_ENV_LOADED + export DATACRUMBS_ENV_LOADED=1 + readonly DATACRUMBS_ENV_LOADED - if command -v module &> /dev/null; then - export DATACRUMBS_MODULE_AVAILABLE=1 - else - export DATACRUMBS_MODULE_AVAILABLE=0 - fi - readonly DATACRUMBS_MODULE_AVAILABLE + if command -v module &>/dev/null; then + export DATACRUMBS_MODULE_AVAILABLE=1 + else + export DATACRUMBS_MODULE_AVAILABLE=0 + fi + readonly DATACRUMBS_MODULE_AVAILABLE - eval $DATACRUMBS_SERVER_PREAMBLE + eval $DATACRUMBS_SERVER_PREAMBLE fi if [[ "$DATACRUMBS_MODULE_AVAILABLE" == "1" ]] && [[ "$DATACRUMBS_SERVER_MODULE" == "1" ]]; then - if ! module is-loaded datacrumbs/@DATACRUMBS_RELEASE_VERSION_STRING@; then - module use @DATACRUMBS_INSTALL_ETC_MODULESDIR@ - module load datacrumbs/@DATACRUMBS_RELEASE_VERSION_STRING@ - fi + if ! module is-loaded datacrumbs/@DATACRUMBS_RELEASE_VERSION_STRING@; then + module use @DATACRUMBS_INSTALL_ETC_MODULESDIR@ + module load datacrumbs/@DATACRUMBS_RELEASE_VERSION_STRING@ + fi else - export PATH="$DATACRUMBS_INSTALL_BIN_DIR:$DATACRUMBS_INSTALL_SBIN_DIR:$PATH" - export LD_LIBRARY_PATH="$DATACRUMBS_INSTALL_LIB_DIR:@DEPENDENCY_LIBRARY_DIRS_COLON@:$LD_LIBRARY_PATH" + export PATH="$DATACRUMBS_INSTALL_BIN_DIR:$DATACRUMBS_INSTALL_SBIN_DIR:$PATH" + export LD_LIBRARY_PATH="$DATACRUMBS_INSTALL_LIB_DIR:@DEPENDENCY_LIBRARY_DIRS_COLON@:$LD_LIBRARY_PATH" fi ulimit -n $(ulimit -H -n) @@ -79,4 +78,4 @@ alias datacrumbs_stop='sudo @DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_stop' alias datacrumbs_compose='sudo @DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_compose' alias datacrumbs_compose_discover='sudo @DATACRUMBS_INSTALL_SBINARYDIR@/datacrumbs_compose --action discover' alias datacrumbs_wrap='sudo @DATACRUMBS_INSTALL_BINARYDIR@/datacrumbs_wrap' -alias datacrumbs_create_log_dir='@DATACRUMBS_INSTALL_BINARYDIR@/datacrumbs_create_log_dir' \ No newline at end of file +alias datacrumbs_create_log_dir='@DATACRUMBS_INSTALL_BINARYDIR@/datacrumbs_create_log_dir' diff --git a/scripts/datacrumbs/datacrumbs_stop.in b/scripts/datacrumbs/datacrumbs_stop.in index 27fce534..d6b53c25 100755 --- a/scripts/datacrumbs/datacrumbs_stop.in +++ b/scripts/datacrumbs/datacrumbs_stop.in @@ -9,14 +9,13 @@ PROG_NAME=$1 # Load environment source "$SCRIPT_DIR/datacrumbs_setup" - if [[ "$DATACRUMBS_IS_ROOT" != "1" ]]; then - error "This script should be run as root." - exit 1 + error "This script should be run as root." + exit 1 fi if [[ "$PROG_NAME" == "" ]]; then - ps -aef | grep 'datacrumbs' | grep ${DATACRUMBS_USER} | awk '{print $2}' | xargs kill -9 + ps -aef | grep 'datacrumbs' | grep ${DATACRUMBS_USER} | awk '{print $2}' | xargs kill -9 else - ps -aef | grep 'datacrumbs' | grep ${DATACRUMBS_USER} | grep -v $PROG_NAME | awk '{print $2}' | xargs kill -9 -fi \ No newline at end of file + ps -aef | grep 'datacrumbs' | grep ${DATACRUMBS_USER} | grep -v $PROG_NAME | awk '{print $2}' | xargs kill -9 +fi diff --git a/scripts/datacrumbs/datacrumbs_track.in b/scripts/datacrumbs/datacrumbs_track.in index 0c622424..2f47056c 100755 --- a/scripts/datacrumbs/datacrumbs_track.in +++ b/scripts/datacrumbs/datacrumbs_track.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -20,8 +20,8 @@ dc_args_parse "DC_TRACK" "datacrumbs_track" "$@" EXECUTABLE="$DC_TRACK_EXECUTABLE" if [[ -z "$EXECUTABLE" ]]; then - dc_args_usage "DC_TRACK" "datacrumbs_track" - exit 1 + dc_args_usage "DC_TRACK" "datacrumbs_track" + exit 1 fi source $SCRIPT_DIR/datacrumbs_setup @@ -30,35 +30,40 @@ check_regular_user log "Checking executable: $EXECUTABLE" if [[ "$DRY_RUN" == "1" ]]; then - log "[DRY RUN] Check if executable is valid: $EXECUTABLE" - MAIN_PROGRAM="$EXECUTABLE" + log "[DRY RUN] Check if executable is valid: $EXECUTABLE" + MAIN_PROGRAM="$EXECUTABLE" else - if [[ -x "$EXECUTABLE" ]]; then - MAIN_PROGRAM="$EXECUTABLE" - log "Found executable at: $MAIN_PROGRAM" - elif MAIN_PROGRAM="$(which "$EXECUTABLE" 2>/dev/null)"; [[ -x "$MAIN_PROGRAM" ]]; then - log "Found executable in PATH: $MAIN_PROGRAM" - elif MAIN_PROGRAM="$(realpath "$EXECUTABLE" 2>/dev/null)"; [[ -x "$MAIN_PROGRAM" ]]; then - log "Found executable at realpath: $MAIN_PROGRAM" - else - error "Executable '$EXECUTABLE' not found." - exit 1 - fi + if [[ -x "$EXECUTABLE" ]]; then + MAIN_PROGRAM="$EXECUTABLE" + log "Found executable at: $MAIN_PROGRAM" + elif + MAIN_PROGRAM="$(which "$EXECUTABLE" 2>/dev/null)" + [[ -x "$MAIN_PROGRAM" ]] + then + log "Found executable in PATH: $MAIN_PROGRAM" + elif + MAIN_PROGRAM="$(realpath "$EXECUTABLE" 2>/dev/null)" + [[ -x "$MAIN_PROGRAM" ]] + then + log "Found executable at realpath: $MAIN_PROGRAM" + else + error "Executable '$EXECUTABLE' not found." + exit 1 + fi fi - if [[ "$DRY_RUN" == "1" ]]; then - log "[DRY RUN] Checking for patchelf command" + log "[DRY RUN] Checking for patchelf command" else - if ! command -v patchelf >/dev/null 2>&1; then - error "'patchelf' not found. Please install it and ensure it is in your PATH." - exit 1 - fi + if ! command -v patchelf >/dev/null 2>&1; then + error "'patchelf' not found. Please install it and ensure it is in your PATH." + exit 1 + fi fi debug "Adding needed library: ${DATACRUMBS_CLIENT_LIB} to $MAIN_PROGRAM" if [[ "$DRY_RUN" == "1" ]]; then - log "[DRY RUN] Patching $MAIN_PROGRAM with patchelf --add-needed ${DATACRUMBS_CLIENT_LIB}" + log "[DRY RUN] Patching $MAIN_PROGRAM with patchelf --add-needed ${DATACRUMBS_CLIENT_LIB}" else -datacrumbs_run_command "Unable to patch $MAIN_PROGRAM" patchelf --add-needed ${DATACRUMBS_CLIENT_LIB} "$MAIN_PROGRAM" + datacrumbs_run_command "Unable to patch $MAIN_PROGRAM" patchelf --add-needed ${DATACRUMBS_CLIENT_LIB} "$MAIN_PROGRAM" fi -log "Enabling tracking of $EXECUTABLE completed." \ No newline at end of file +log "Enabling tracking of $EXECUTABLE completed." diff --git a/scripts/datacrumbs/datacrumbs_untrack.in b/scripts/datacrumbs/datacrumbs_untrack.in index b4f9dd6d..5b9f9a54 100755 --- a/scripts/datacrumbs/datacrumbs_untrack.in +++ b/scripts/datacrumbs/datacrumbs_untrack.in @@ -6,8 +6,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Check if datacrumbs_args exists in scripts directory if [[ ! -f "$SCRIPT_DIR/datacrumbs_args" ]]; then - echo "Error: datacrumbs_args not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_args not found in $SCRIPT_DIR" + exit 1 fi # Source argument parser @@ -20,8 +20,8 @@ dc_args_parse "DC_UNTRACK" "datacrumbs_untrack" "$@" EXECUTABLE="$DC_UNTRACK_EXECUTABLE" if [[ -z "$EXECUTABLE" ]]; then - dc_args_show_help "DC_UNTRACK" "$@" - exit 1 + dc_args_show_help "DC_UNTRACK" "$@" + exit 1 fi source $SCRIPT_DIR/datacrumbs_setup @@ -30,37 +30,41 @@ check_regular_user log "Checking executable: $EXECUTABLE" if [[ "$DRY_RUN" == "1" ]]; then - log "[DRY RUN] Check if executable is valid: $EXECUTABLE" - MAIN_PROGRAM="$EXECUTABLE" + log "[DRY RUN] Check if executable is valid: $EXECUTABLE" + MAIN_PROGRAM="$EXECUTABLE" else - if [[ -x "$EXECUTABLE" ]]; then - MAIN_PROGRAM="$EXECUTABLE" - log "Found executable: $MAIN_PROGRAM" - elif MAIN_PROGRAM="$(which "$EXECUTABLE" 2>/dev/null)"; [[ -x "$MAIN_PROGRAM" ]]; then - log "Found executable via which: $MAIN_PROGRAM" - elif MAIN_PROGRAM="$(realpath "$EXECUTABLE" 2>/dev/null)"; [[ -x "$MAIN_PROGRAM" ]]; then - log "Found executable via realpath: $MAIN_PROGRAM" - else - error "Executable '$EXECUTABLE' not found." - exit 1 - fi + if [[ -x "$EXECUTABLE" ]]; then + MAIN_PROGRAM="$EXECUTABLE" + log "Found executable: $MAIN_PROGRAM" + elif + MAIN_PROGRAM="$(which "$EXECUTABLE" 2>/dev/null)" + [[ -x "$MAIN_PROGRAM" ]] + then + log "Found executable via which: $MAIN_PROGRAM" + elif + MAIN_PROGRAM="$(realpath "$EXECUTABLE" 2>/dev/null)" + [[ -x "$MAIN_PROGRAM" ]] + then + log "Found executable via realpath: $MAIN_PROGRAM" + else + error "Executable '$EXECUTABLE' not found." + exit 1 + fi fi - - if [[ "$DRY_RUN" == "1" ]]; then - log "[DRY RUN] Checking for patchelf command" + log "[DRY RUN] Checking for patchelf command" else - if ! command -v patchelf >/dev/null 2>&1; then - error "'patchelf' not found. Please install it and ensure it is in your PATH." - exit 1 - fi + if ! command -v patchelf >/dev/null 2>&1; then + error "'patchelf' not found. Please install it and ensure it is in your PATH." + exit 1 + fi fi debug "Removing dependency '${DATACRUMBS_CLIENT_LIB}' from '$MAIN_PROGRAM'..." if [[ "$DRY_RUN" == "1" ]]; then - log "[DRY RUN] Patching $MAIN_PROGRAM with patchelf --remove-needed ${DATACRUMBS_CLIENT_LIB}" + log "[DRY RUN] Patching $MAIN_PROGRAM with patchelf --remove-needed ${DATACRUMBS_CLIENT_LIB}" else - datacrumbs_run_command "Unable to patch $MAIN_PROGRAM" patchelf --remove-needed ${DATACRUMBS_CLIENT_LIB} "$MAIN_PROGRAM" + datacrumbs_run_command "Unable to patch $MAIN_PROGRAM" patchelf --remove-needed ${DATACRUMBS_CLIENT_LIB} "$MAIN_PROGRAM" fi -log "Disabling tracking of $EXECUTABLE completed." \ No newline at end of file +log "Disabling tracking of $EXECUTABLE completed." diff --git a/scripts/datacrumbs/datacrumbs_utility.in b/scripts/datacrumbs/datacrumbs_utility.in index 96f1db27..d31ee639 100755 --- a/scripts/datacrumbs/datacrumbs_utility.in +++ b/scripts/datacrumbs/datacrumbs_utility.in @@ -6,50 +6,50 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ # Load logging script if [[ -f "$SCRIPT_DIR/datacrumbs_logging" ]]; then - source "$SCRIPT_DIR/datacrumbs_logging" + source "$SCRIPT_DIR/datacrumbs_logging" else - echo "Error: datacrumbs_logging not found in $SCRIPT_DIR" - exit 1 + echo "Error: datacrumbs_logging not found in $SCRIPT_DIR" + exit 1 fi function datacrumbs_run_command() { - local err_msg="$1" - shift - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would run: $*" - return 0 - fi - "$@" - local status=$? - if [[ $status -ne 0 ]]; then - log "Error: $err_msg" - exit $status - fi + local err_msg="$1" + shift + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would run: $*" + return 0 + fi + "$@" + local status=$? + if [[ $status -ne 0 ]]; then + log "Error: $err_msg" + exit $status + fi } # Usage example: # datacrumbs_run_command "Failed to list directory" ls /nonexistent/path function datacrumbs_finalize() { - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would finalize for user: $DATACRUMBS_USER, log path: $DATACRUMBS_TRACE_DIR" - return 0 - fi + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would finalize for user: $DATACRUMBS_USER, log path: $DATACRUMBS_TRACE_DIR" + return 0 + fi } function datacrumbs_init() { - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would create log directory: ${DATACRUMBS_TRACE_DIR}" - return 0 - fi - if [[ ! -d "${DATACRUMBS_TRACE_DIR}" ]]; then - mkdir -p "${DATACRUMBS_TRACE_DIR}" - if [[ $? -ne 0 ]]; then - error "Failed to create trace directory: ${DATACRUMBS_TRACE_DIR}" - exit 1 - fi - chown "$DATACRUMBS_INSTALL_USER:$DATACRUMBS_INSTALL_USER" "${DATACRUMBS_TRACE_DIR}" - fi + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would create log directory: ${DATACRUMBS_TRACE_DIR}" + return 0 + fi + if [[ ! -d "${DATACRUMBS_TRACE_DIR}" ]]; then + mkdir -p "${DATACRUMBS_TRACE_DIR}" + if [[ $? -ne 0 ]]; then + error "Failed to create trace directory: ${DATACRUMBS_TRACE_DIR}" + exit 1 + fi + chown "$DATACRUMBS_INSTALL_USER:$DATACRUMBS_INSTALL_USER" "${DATACRUMBS_TRACE_DIR}" + fi } function datacrumbs_start_server() { @@ -73,51 +73,50 @@ function datacrumbs_start_server() { WAIT_INTERVAL=2 ELAPSED=0 - log "Starting Server: ${cmd[*]}" - if [[ "${DRY_RUN:-0}" == "1" ]]; then - server_launch "${cmd[@]}" - else - server_launch "${cmd[@]}" > $DATACRUMBS_LOG_FILE 2>&1 & - PID=$! - echo $PID > "$DATACRUMBS_SERVER_SYSTEMD_PID_FILE" - log "Service started with PID: $PID" - chown ${DATACRUMBS_USER}:${DATACRUMBS_USER} $DATACRUMBS_LOG_FILE - fi - - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would wait for ready file: $DATACRUMBS_SERVER_READY_FILE (DATACRUMBS_SERVER_LOAD_TIMEOUT: $DATACRUMBS_SERVER_LOAD_TIMEOUT seconds)" - return 0 - fi + log "Starting Server: ${cmd[*]}" + if [[ "${DRY_RUN:-0}" == "1" ]]; then + server_launch "${cmd[@]}" + else + server_launch "${cmd[@]}" >$DATACRUMBS_LOG_FILE 2>&1 & + PID=$! + echo $PID >"$DATACRUMBS_SERVER_SYSTEMD_PID_FILE" + log "Service started with PID: $PID" + chown ${DATACRUMBS_USER}:${DATACRUMBS_USER} $DATACRUMBS_LOG_FILE + fi + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would wait for ready file: $DATACRUMBS_SERVER_READY_FILE (DATACRUMBS_SERVER_LOAD_TIMEOUT: $DATACRUMBS_SERVER_LOAD_TIMEOUT seconds)" + return 0 + fi - while [[ ! -f "$DATACRUMBS_SERVER_READY_FILE" ]]; do - sleep $WAIT_INTERVAL - log "Waiting for ${ELAPSED} seconds $Server..." - ELAPSED=$((ELAPSED + WAIT_INTERVAL)) - if [[ $ELAPSED -ge $DATACRUMBS_SERVER_LOAD_TIMEOUT ]]; then - log "DATACRUMBS_SERVER_LOAD_TIMEOUT waiting for $DATACRUMBS_SERVER_READY_FILE" - server_launch $DATACRUMBS_INSTALL_SBIN_DIR/datacrumbs_stop - cat $DATACRUMBS_LOG_FILE - exit 1 - fi - done - echo $DATACRUMBS_SERVER_RUN_ID > "${DATACRUMBS_SERVER_RUN_ID_FILE}" - log "Started server" + while [[ ! -f "$DATACRUMBS_SERVER_READY_FILE" ]]; do + sleep $WAIT_INTERVAL + log "Waiting for ${ELAPSED} seconds $Server..." + ELAPSED=$((ELAPSED + WAIT_INTERVAL)) + if [[ $ELAPSED -ge $DATACRUMBS_SERVER_LOAD_TIMEOUT ]]; then + log "DATACRUMBS_SERVER_LOAD_TIMEOUT waiting for $DATACRUMBS_SERVER_READY_FILE" + server_launch $DATACRUMBS_INSTALL_SBIN_DIR/datacrumbs_stop + cat $DATACRUMBS_LOG_FILE + exit 1 + fi + done + echo $DATACRUMBS_SERVER_RUN_ID >"${DATACRUMBS_SERVER_RUN_ID_FILE}" + log "Started server" } function datacrumbs_stop_server() { - exec=$1 - prog_name=$2 - exec=($exec) - common_cmd=("$DATACRUMBS_INSTALL_HOST" "--user" "$DATACRUMBS_USER" "--config_path" "$DATACRUMBS_INSTALL_CONFIGS_DIR" "--data_dir" "$DATACRUMBS_INSTALL_DATA_DIR" "--trace_log_dir" "$DATACRUMBS_TRACE_DIR" --run_id "$DATACRUMBS_SERVER_RUN_ID") - cmd=("${exec[@]}" "stop" "${common_cmd[@]}") + exec=$1 + prog_name=$2 + exec=($exec) + common_cmd=("$DATACRUMBS_INSTALL_HOST" "--user" "$DATACRUMBS_USER" "--config_path" "$DATACRUMBS_INSTALL_CONFIGS_DIR" "--data_dir" "$DATACRUMBS_INSTALL_DATA_DIR" "--trace_log_dir" "$DATACRUMBS_TRACE_DIR" --run_id "$DATACRUMBS_SERVER_RUN_ID") + cmd=("${exec[@]}" "stop" "${common_cmd[@]}") - log "Stopping Server: ${cmd[*]}" - if [[ "${DRY_RUN:-0}" == "1" ]]; then - server_launch "${cmd[@]}" - else - server_launch "${cmd[@]}" >> $DATACRUMBS_LOG_FILE 2>&1 - fi + log "Stopping Server: ${cmd[*]}" + if [[ "${DRY_RUN:-0}" == "1" ]]; then + server_launch "${cmd[@]}" + else + server_launch "${cmd[@]}" >>$DATACRUMBS_LOG_FILE 2>&1 + fi if [[ "${DRY_RUN:-0}" == "1" ]]; then log "[DRY RUN] Would find and kill process(es) with DATACRUMBS_SERVER_RUN_ID ${DATACRUMBS_SERVER_RUN_ID}" @@ -143,152 +142,152 @@ function datacrumbs_stop_server() { } function datacrumbs_print_status() { - local status_file=${DATACRUMBS_SERVER_STATUS_FILE} - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would print status from: $status_file" - log "[DRY RUN] Would remove status file: $status_file" - return 0 - fi + local status_file=${DATACRUMBS_SERVER_STATUS_FILE} + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would print status from: $status_file" + log "[DRY RUN] Would remove status file: $status_file" + return 0 + fi - if [[ ! -f "$status_file" ]]; then - log "Status file not found: $status_file" - return 1 - fi + if [[ ! -f "$status_file" ]]; then + log "Status file not found: $status_file" + return 1 + fi - local trace_file total_events_captured events_failed - trace_file=$(jq -r '.trace_file' "$status_file") - total_events_captured=$(jq -r '.total_events_captured' "$status_file") - events_failed=$(jq -r '.events_failed' "$status_file") + local trace_file total_events_captured events_failed + trace_file=$(jq -r '.trace_file' "$status_file") + total_events_captured=$(jq -r '.total_events_captured' "$status_file") + events_failed=$(jq -r '.events_failed' "$status_file") - log "trace_file: $trace_file" - log "total_events_captured: $total_events_captured" - log "events_failed: $events_failed" - rm -f "$status_file" + log "trace_file: $trace_file" + log "total_events_captured: $total_events_captured" + log "events_failed: $events_failed" + rm -f "$status_file" } function check_regular_user() { - if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then - error "This script should be run as a regular user, not as root." - exit 1 - fi + if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then + error "This script should be run as a regular user, not as root." + exit 1 + fi } function check_sudo_user() { - if [[ "$DATACRUMBS_IS_ROOT" != "1" ]]; then - error "This script should be run as root." - exit 1 -fi + if [[ "$DATACRUMBS_IS_ROOT" != "1" ]]; then + error "This script should be run as root." + exit 1 + fi } function check_install_user() { - if [[ "${DATACRUMBS_USER}" != "${DATACRUMBS_INSTALL_USER}" ]]; then - error "DATACRUMBS_USER does not match DATACRUMBS_INSTALL_USER: ${DATACRUMBS_USER}" - exit 1 - fi + if [[ "${DATACRUMBS_USER}" != "${DATACRUMBS_INSTALL_USER}" ]]; then + error "DATACRUMBS_USER does not match DATACRUMBS_INSTALL_USER: ${DATACRUMBS_USER}" + exit 1 + fi } function job_launch() { - local cmd=() - if [[ -z "${DATACRUMBS_JOB_ENABLE_MPI}" || "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then - debug "Launching job with MPI" - cmd=(${DATACRUMBS_JOB_RUN} "${DATACRUMBS_JOB_NODE_FLAG}" "${DATACRUMBS_JOB_NODES}" "${DATACRUMBS_JOB_PPN_FLAG}" "${DATACRUMBS_JOB_PPN}" ${DATACRUMBS_JOB_OTHER_FLAGS} "$@") - else - debug "Launching job without MPI" - cmd=("$@") - fi - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would launch job: ${cmd[*]}" - return 0 - fi - log "Launching job command: ${cmd[*]}" - "${cmd[@]}" + local cmd=() + if [[ -z "${DATACRUMBS_JOB_ENABLE_MPI}" || "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then + debug "Launching job with MPI" + cmd=(${DATACRUMBS_JOB_RUN} "${DATACRUMBS_JOB_NODE_FLAG}" "${DATACRUMBS_JOB_NODES}" "${DATACRUMBS_JOB_PPN_FLAG}" "${DATACRUMBS_JOB_PPN}" ${DATACRUMBS_JOB_OTHER_FLAGS} "$@") + else + debug "Launching job without MPI" + cmd=("$@") + fi + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would launch job: ${cmd[*]}" + return 0 + fi + log "Launching job command: ${cmd[*]}" + "${cmd[@]}" } function server_launch() { - local mpi_cmd=() - if [[ -z "${DATACRUMBS_JOB_ENABLE_MPI}" || "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then - debug "Launching server with MPI" - mpi_cmd=(${DATACRUMBS_JOB_RUN} "${DATACRUMBS_JOB_NODE_FLAG}" "${DATACRUMBS_JOB_NODES}" "${DATACRUMBS_JOB_PPN_FLAG}" "1" ${DATACRUMBS_JOB_OTHER_FLAGS}) - else - debug "Launching server without MPI" - mpi_cmd=() - fi - if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then - cmd=("${mpi_cmd[@]}" "$@") - else - cmd=("${mpi_cmd[@]}" "sudo" "$@") - fi - if [[ -z "${DATACRUMBS_JOB_ENABLE_MPI}" || "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then - debug "Launching server with MPI" - cmd=( "${cmd[@]}" ) - else - debug "Launching server without MPI" - cmd=( "${cmd[@]}" --disable-mpi) - fi - if [[ "${DRY_RUN:-0}" == "1" ]]; then - log "[DRY RUN] Would launch server: ${cmd[*]}" - return 0 - fi - log "Launching server command: ${cmd[*]}" - "${cmd[@]}" + local mpi_cmd=() + if [[ -z "${DATACRUMBS_JOB_ENABLE_MPI}" || "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then + debug "Launching server with MPI" + mpi_cmd=(${DATACRUMBS_JOB_RUN} "${DATACRUMBS_JOB_NODE_FLAG}" "${DATACRUMBS_JOB_NODES}" "${DATACRUMBS_JOB_PPN_FLAG}" "1" ${DATACRUMBS_JOB_OTHER_FLAGS}) + else + debug "Launching server without MPI" + mpi_cmd=() + fi + if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then + cmd=("${mpi_cmd[@]}" "$@") + else + cmd=("${mpi_cmd[@]}" "sudo" "$@") + fi + if [[ -z "${DATACRUMBS_JOB_ENABLE_MPI}" || "${DATACRUMBS_JOB_ENABLE_MPI}" == "1" ]]; then + debug "Launching server with MPI" + cmd=("${cmd[@]}") + else + debug "Launching server without MPI" + cmd=("${cmd[@]}" --disable-mpi) + fi + if [[ "${DRY_RUN:-0}" == "1" ]]; then + log "[DRY RUN] Would launch server: ${cmd[*]}" + return 0 + fi + log "Launching server command: ${cmd[*]}" + "${cmd[@]}" } function get_actual_user() { - local user=$(whoami) - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - if [[ -n "$FLUX_JOB_USERID" ]]; then - user=$(id -nu $FLUX_JOB_USERID) - fi - elif [[ "SLURM" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then - if [[ -n "$SLURM_JOB_UID" ]]; then - user=$(id -nu $SLURM_JOB_UID) - fi - fi - log_system "get_actual_user returned user:${user}" - echo "${user}" + local user=$(whoami) + if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ -n "$FLUX_JOB_USERID" ]]; then + user=$(id -nu $FLUX_JOB_USERID) + fi + elif [[ "SLURM" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ -n "$SLURM_JOB_UID" ]]; then + user=$(id -nu $SLURM_JOB_UID) + fi + fi + log_system "get_actual_user returned user:${user}" + echo "${user}" } function check_composite_location() { - local name="$1" - local selected_location="" - local user_location=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_USER}/datacrumbs_${name} - local system_location=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_INSTALL_USER}/datacrumbs_${name} - if [[ -f "${user_location}" ]]; then - selected_location="${user_location}" - elif [[ -f "${system_location}" ]]; then - selected_location="${system_location}" - else - selected_location="NA" - fi - log_system "check_composite_location for name:${name} selected_location:${selected_location}" - echo "${selected_location}" + local name="$1" + local selected_location="" + local user_location=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_USER}/datacrumbs_${name} + local system_location=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/@PROJECT_NAME@/@CMAKE_INSTALL_SBINDIR@/${DATACRUMBS_INSTALL_USER}/datacrumbs_${name} + if [[ -f "${user_location}" ]]; then + selected_location="${user_location}" + elif [[ -f "${system_location}" ]]; then + selected_location="${system_location}" + else + selected_location="NA" + fi + log_system "check_composite_location for name:${name} selected_location:${selected_location}" + echo "${selected_location}" } function validate_datacrumbs_enable_value() { - local value="$1" - if [[ "$value" == "yes" || "$value" == "no" ]]; then - return 0 - else - return 1 - fi + local value="$1" + if [[ "$value" == "yes" || "$value" == "no" ]]; then + return 0 + else + return 1 + fi } function validate_datacrumbs_composite_name() { - local name="$1" - return_code=0 - if [[ ! ${name} =~ ^[a-zA-Z_]+$ ]]; then - warn_user "Error: DATACRUMBS_COMPOSABLE_NAME: ${name} contains invalid characters. Only alphabets and underscores are allowed." - return_code=1 - fi - local selected_location=$(check_composite_location "${name}") - if [[ ${return_code} -eq 0 && "${selected_location}" == "NA" ]]; then - warn_user "Error: Composable name ${name} does not exist." - return_code=1 - fi - log_system "validate_datacrumbs_composite_name validated name:${name} return_code:${return_code}" - return ${return_code} + local name="$1" + return_code=0 + if [[ ! ${name} =~ ^[a-zA-Z_]+$ ]]; then + warn_user "Error: DATACRUMBS_COMPOSABLE_NAME: ${name} contains invalid characters. Only alphabets and underscores are allowed." + return_code=1 + fi + local selected_location=$(check_composite_location "${name}") + if [[ ${return_code} -eq 0 && "${selected_location}" == "NA" ]]; then + warn_user "Error: Composable name ${name} does not exist." + return_code=1 + fi + log_system "validate_datacrumbs_composite_name validated name:${name} return_code:${return_code}" + return ${return_code} } function get_default_datacrumbs_composite_name() { - echo "NONE" + echo "NONE" } diff --git a/scripts/datacrumbs/datacrumbs_wrap.in b/scripts/datacrumbs/datacrumbs_wrap.in index 4b77e718..92e93081 100755 --- a/scripts/datacrumbs/datacrumbs_wrap.in +++ b/scripts/datacrumbs/datacrumbs_wrap.in @@ -7,8 +7,8 @@ SCRIPT_DIR=@DATACRUMBS_INSTALL_BINARYDIR@ source $SCRIPT_DIR/datacrumbs_setup if [[ "$DATACRUMBS_IS_ROOT" == "1" ]]; then - error "This script should be run as a regular user, not as root." - exit 1 + error "This script should be run as a regular user, not as root." + exit 1 fi -LD_PRELOAD=${DATACRUMBS_CLIENT_LIB} "$@" \ No newline at end of file +LD_PRELOAD=${DATACRUMBS_CLIENT_LIB} "$@" diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh index 53972794..68af1278 100755 --- a/scripts/docker-build.sh +++ b/scripts/docker-build.sh @@ -19,88 +19,88 @@ NC='\033[0m' # No Color # Function to print colored output print_status() { - echo -e "${GREEN}[INFO]${NC} $1" + echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" + echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { - echo -e "${RED}[ERROR]${NC} $1" + echo -e "${RED}[ERROR]${NC} $1" } # Check if we're in the correct directory if [[ ! -f "$DOCKERFILE_PATH" ]]; then - print_error "Dockerfile not found at $DOCKERFILE_PATH" - print_error "Please run this script from the datacrumbs root directory" - exit 1 + print_error "Dockerfile not found at $DOCKERFILE_PATH" + print_error "Please run this script from the datacrumbs root directory" + exit 1 fi # Function to show usage usage() { - echo "Usage: $0 [OPTIONS]" - echo "Options:" - echo " -u, --username USERNAME Docker Hub username (default: $DOCKER_HUB_USERNAME)" - echo " -v, --version VERSION Image version tag (default: $VERSION)" - echo " -p, --push Push to Docker Hub after building" - echo " -h, --help Show this help message" - echo "" - echo "Environment variables:" - echo " DOCKER_HUB_USERNAME Docker Hub username" - echo " VERSION Image version tag" - echo "" - echo "Examples:" - echo " $0 # Build image locally" - echo " $0 -u myusername -v v1.0 # Build with specific username and version" - echo " $0 -p # Build and push to Docker Hub" + echo "Usage: $0 [OPTIONS]" + echo "Options:" + echo " -u, --username USERNAME Docker Hub username (default: $DOCKER_HUB_USERNAME)" + echo " -v, --version VERSION Image version tag (default: $VERSION)" + echo " -p, --push Push to Docker Hub after building" + echo " -h, --help Show this help message" + echo "" + echo "Environment variables:" + echo " DOCKER_HUB_USERNAME Docker Hub username" + echo " VERSION Image version tag" + echo "" + echo "Examples:" + echo " $0 # Build image locally" + echo " $0 -u myusername -v v1.0 # Build with specific username and version" + echo " $0 -p # Build and push to Docker Hub" } # Parse command line arguments PUSH_TO_HUB=false while [[ $# -gt 0 ]]; do - case $1 in - -u|--username) - DOCKER_HUB_USERNAME="$2" - shift 2 - ;; - -v|--version) - VERSION="$2" - shift 2 - ;; - -p|--push) - PUSH_TO_HUB=true - shift - ;; - -h|--help) - usage - exit 0 - ;; - *) - print_error "Unknown option: $1" - usage - exit 1 - ;; - esac + case $1 in + -u | --username) + DOCKER_HUB_USERNAME="$2" + shift 2 + ;; + -v | --version) + VERSION="$2" + shift 2 + ;; + -p | --push) + PUSH_TO_HUB=true + shift + ;; + -h | --help) + usage + exit 0 + ;; + *) + print_error "Unknown option: $1" + usage + exit 1 + ;; + esac done # Validate Docker Hub username if pushing if [[ "$PUSH_TO_HUB" = true ]] && [[ "$DOCKER_HUB_USERNAME" = "your-dockerhub-username" ]]; then - print_error "Please provide a valid Docker Hub username with -u or set DOCKER_HUB_USERNAME environment variable" - exit 1 + print_error "Please provide a valid Docker Hub username with -u or set DOCKER_HUB_USERNAME environment variable" + exit 1 fi # Detect container runtime (Docker or Podman) if command -v podman >/dev/null 2>&1 && ! command -v docker >/dev/null 2>&1; then - CONTAINER_CMD="podman" - print_status "Using Podman as container runtime" + CONTAINER_CMD="podman" + print_status "Using Podman as container runtime" elif command -v docker >/dev/null 2>&1; then - CONTAINER_CMD="docker" - print_status "Using Docker as container runtime" + CONTAINER_CMD="docker" + print_status "Using Docker as container runtime" else - print_error "Neither Docker nor Podman found. Please install one of them." - exit 1 + print_error "Neither Docker nor Podman found. Please install one of them." + exit 1 fi # Image tags @@ -114,78 +114,78 @@ print_status "Dockerfile: $DOCKERFILE_PATH" # Build the Docker image if $CONTAINER_CMD build -f "$DOCKERFILE_PATH" -t "$LOCAL_TAG" .; then - print_status "✅ Docker image built successfully: $LOCAL_TAG" + print_status "✅ Docker image built successfully: $LOCAL_TAG" else - print_error "❌ Failed to build Docker image" - exit 1 + print_error "❌ Failed to build Docker image" + exit 1 fi # Tag for Docker Hub if pushing if [[ "$PUSH_TO_HUB" = true ]]; then - print_status "Tagging image for Docker Hub..." - - # Tag with version - if $CONTAINER_CMD tag "$LOCAL_TAG" "$HUB_TAG"; then - print_status "✅ Tagged as $HUB_TAG" + print_status "Tagging image for Docker Hub..." + + # Tag with version + if $CONTAINER_CMD tag "$LOCAL_TAG" "$HUB_TAG"; then + print_status "✅ Tagged as $HUB_TAG" + else + print_error "❌ Failed to tag image for Docker Hub" + exit 1 + fi + + # Tag as latest if version is not already latest + if [[ "$VERSION" != "latest" ]]; then + if $CONTAINER_CMD tag "$LOCAL_TAG" "$HUB_LATEST_TAG"; then + print_status "✅ Tagged as $HUB_LATEST_TAG" else - print_error "❌ Failed to tag image for Docker Hub" - exit 1 - fi - - # Tag as latest if version is not already latest - if [[ "$VERSION" != "latest" ]]; then - if $CONTAINER_CMD tag "$LOCAL_TAG" "$HUB_LATEST_TAG"; then - print_status "✅ Tagged as $HUB_LATEST_TAG" - else - print_error "❌ Failed to tag image as latest" - exit 1 - fi + print_error "❌ Failed to tag image as latest" + exit 1 fi - - print_status "Pushing to Docker Hub..." - print_warning "Make sure you're logged into Docker Hub (run 'docker login docker.io' for Podman)" - print_warning "Make sure the repository '$DOCKER_HUB_USERNAME/datacrumbs' exists on Docker Hub" - - # Check if we're using podman - PUSH_CMD="$CONTAINER_CMD push" - - # Push version tag - if $PUSH_CMD "$HUB_TAG"; then - print_status "✅ Pushed $HUB_TAG" + fi + + print_status "Pushing to Docker Hub..." + print_warning "Make sure you're logged into Docker Hub (run 'docker login docker.io' for Podman)" + print_warning "Make sure the repository '$DOCKER_HUB_USERNAME/datacrumbs' exists on Docker Hub" + + # Check if we're using podman + PUSH_CMD="$CONTAINER_CMD push" + + # Push version tag + if $PUSH_CMD "$HUB_TAG"; then + print_status "✅ Pushed $HUB_TAG" + else + print_error "❌ Failed to push $HUB_TAG" + print_error "Please ensure:" + print_error "1. You're logged in: docker login docker.io (or podman login docker.io)" + print_error "2. Repository exists: https://hub.docker.com/r/$DOCKER_HUB_USERNAME/datacrumbs" + print_error "3. You have push permissions to the repository" + exit 1 + fi + + # Push latest tag if different from version + if [[ "$VERSION" != "latest" ]]; then + if $PUSH_CMD "$HUB_LATEST_TAG"; then + print_status "✅ Pushed $HUB_LATEST_TAG" else - print_error "❌ Failed to push $HUB_TAG" - print_error "Please ensure:" - print_error "1. You're logged in: docker login docker.io (or podman login docker.io)" - print_error "2. Repository exists: https://hub.docker.com/r/$DOCKER_HUB_USERNAME/datacrumbs" - print_error "3. You have push permissions to the repository" - exit 1 - fi - - # Push latest tag if different from version - if [[ "$VERSION" != "latest" ]]; then - if $PUSH_CMD "$HUB_LATEST_TAG"; then - print_status "✅ Pushed $HUB_LATEST_TAG" - else - print_error "❌ Failed to push $HUB_LATEST_TAG" - exit 1 - fi - fi - - print_status "🎉 Successfully pushed DataCrumbs image to Docker Hub!" - echo "" - echo "Your image is now available at:" - echo " docker pull $HUB_TAG" - if [[ "$VERSION" != "latest" ]]; then - echo " docker pull $HUB_LATEST_TAG" + print_error "❌ Failed to push $HUB_LATEST_TAG" + exit 1 fi + fi + + print_status "🎉 Successfully pushed DataCrumbs image to Docker Hub!" + echo "" + echo "Your image is now available at:" + echo " docker pull $HUB_TAG" + if [[ "$VERSION" != "latest" ]]; then + echo " docker pull $HUB_LATEST_TAG" + fi else - print_status "🎉 Successfully built DataCrumbs image locally!" - echo "" - echo "To run the container:" - echo " $CONTAINER_CMD run -it --privileged --cap-add=ALL $LOCAL_TAG" - echo "" - echo "To push to Docker Hub, run:" - echo " $0 -u -p" + print_status "🎉 Successfully built DataCrumbs image locally!" + echo "" + echo "To run the container:" + echo " $CONTAINER_CMD run -it --privileged --cap-add=ALL $LOCAL_TAG" + echo "" + echo "To push to Docker Hub, run:" + echo " $0 -u -p" fi echo "" diff --git a/scripts/formatting/autoformat.sh b/scripts/formatting/autoformat.sh index b397ab82..3e50cea5 100755 --- a/scripts/formatting/autoformat.sh +++ b/scripts/formatting/autoformat.sh @@ -2,41 +2,51 @@ clang_format_exe="clang-format" if [[ $# -ge 1 ]]; then - clang_format_exe="$1" + clang_format_exe="$1" fi SUPPORTED_CLANG_FORMAT_VERSION="19.1.7" -if [ command -v $clang_format_exe >/dev/null 2>&1 ]; then - echo "You must have 'clang-format' in PATH to use 'autoformat.sh'" - exit 1 +if ! command -v $clang_format_exe >/dev/null 2>&1; then + echo "You must have 'clang-format' in PATH to use 'autoformat.sh'" + exit 1 fi clang_format_version_str=$($clang_format_exe --version) clang_format_version=$(echo "$clang_format_version_str" | grep -oP 'clang-format version \K\d+(\.\d+)+') if [ "$clang_format_version" != "$SUPPORTED_CLANG_FORMAT_VERSION" ]; then - echo "WARNING: the .clang-format file in this repo is designed for version 18.1.8." - echo " You are running with clang-format v$clang_format_version." - echo " The resulting formatting is highly likely to be incorrect." + echo "WARNING: the .clang-format file in this repo is designed for version 18.1.8." + echo " You are running with clang-format v$clang_format_version." + echo " The resulting formatting is highly likely to be incorrect." fi -if [ command -v find >/dev/null 2>&1 ]; then - echo "You must have 'find' in PATH to use 'autoformat.sh'" - exit 1 +if ! command -v find >/dev/null 2>&1; then + echo "You must have 'find' in PATH to use 'autoformat.sh'" + exit 1 fi -if [ command -v dirname >/dev/null 2>&1 ]; then - echo "You must have 'dirname' in PATH to use 'autoformat.sh'" - exit 1 +if ! command -v dirname >/dev/null 2>&1; then + echo "You must have 'dirname' in PATH to use 'autoformat.sh'" + exit 1 fi -if [ command -v xargs >/dev/null 2>&1 ]; then - echo "You must have 'dirname' in PATH to use 'autoformat.sh'" - exit 1 +if ! command -v xargs >/dev/null 2>&1; then + echo "You must have 'xargs' in PATH to use 'autoformat.sh'" + exit 1 fi -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +if ! command -v shfmt >/dev/null 2>&1; then + echo "You must have 'shfmt' in PATH to use 'autoformat.sh'" + exit 1 +fi + +if ! command -v cmake-format >/dev/null 2>&1; then + echo "You must have 'cmake-format' in PATH to use 'autoformat.sh'" + exit 1 +fi + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) curr_dir=$(pwd) @@ -44,16 +54,14 @@ cd $SCRIPT_DIR cd .. cd .. -echo "Formatting C/C++ code in 'src'" -find src \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe -i -echo "Formatting C/C++ code in 'etc/datacrumbs/plugins'" -find etc/datacrumbs/plugins \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe -i +echo "Check formatting of C/C++ code in '.'" +find . \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) \( -path "./src/*" -o -path "./tools/*" -o -path "./tests/*" -o -path "./etc/datacrumbs/plugins/*" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe -i -echo "Formatting C/C++ code in 'tests'" -find tests \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe -i +echo "Formatting shell scripts in '.'" +find . \( -name "*.sh" -o -name "*.in" \) \( -path "./etc/datacrumbs/data/*" -o -path "./infrastructure/docker/*" -o -path "./scripts/datacrumbs/*" -o -path "./tests/*" -o -path "./tools/*" \) -not -path "*.txt.in" -print0 | xargs -0 shfmt -w -echo "Formatting C/C++ code in 'tools'" -find tools \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe -i +echo "Formatting CMake files in '.'" +find . \( -name "CMakeLists.txt*" -o -name "*.cmake" \) \( -path "./src/*" -o -path "./tools/*" -o -path "./tests/*" -o -path "./cmake/*" \) -print0 | xargs -0 cmake-format -i -cd $curr_dir \ No newline at end of file +cd $curr_dir diff --git a/scripts/formatting/check-formatting.sh b/scripts/formatting/check-formatting.sh index ed8a1c37..7f677e44 100755 --- a/scripts/formatting/check-formatting.sh +++ b/scripts/formatting/check-formatting.sh @@ -2,41 +2,51 @@ clang_format_exe="clang-format" if [[ $# -ge 1 ]]; then - clang_format_exe="$1" + clang_format_exe="$1" fi SUPPORTED_CLANG_FORMAT_VERSION="19.1.7" -if [ command -v $clang_format_exe >/dev/null 2>&1 ]; then - echo "You must have 'clang-format' in PATH to use 'check-formatting.sh'" - exit 1 +if [ command -v $clang_format_exe ] >/dev/null 2>&1; then + echo "You must have 'clang-format' in PATH to use 'check-formatting.sh'" + exit 1 fi clang_format_version_str=$($clang_format_exe --version) clang_format_version=$(echo "$clang_format_version_str" | grep -oP 'clang-format version \K\d+(\.\d+)+') if [ "$clang_format_version" != "$SUPPORTED_CLANG_FORMAT_VERSION" ]; then - echo "WARNING: the .clang-format file in this repo is designed for version $SUPPORTED_CLANG_FORMAT_VERSION." - echo " You are running with clang-format v$clang_format_version." - echo " The resulting check is highly likely to be incorrect." + echo "WARNING: the .clang-format file in this repo is designed for version $SUPPORTED_CLANG_FORMAT_VERSION." + echo " You are running with clang-format v$clang_format_version." + echo " The resulting check is highly likely to be incorrect." fi -if [ command -v find >/dev/null 2>&1 ]; then - echo "You must have 'find' in PATH to use 'check-formatting.sh'" - exit 1 +if [ command -v find ] >/dev/null 2>&1; then + echo "You must have 'find' in PATH to use 'check-formatting.sh'" + exit 1 fi -if [ command -v dirname >/dev/null 2>&1 ]; then - echo "You must have 'dirname' in PATH to use 'check-formatting.sh'" - exit 1 +if [ command -v dirname ] >/dev/null 2>&1; then + echo "You must have 'dirname' in PATH to use 'check-formatting.sh'" + exit 1 fi -if [ command -v xargs >/dev/null 2>&1 ]; then - echo "You must have 'dirname' in PATH to use 'check-formatting.sh'" - exit 1 +if [ command -v xargs ] >/dev/null 2>&1; then + echo "You must have 'dirname' in PATH to use 'check-formatting.sh'" + exit 1 fi -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +if ! command -v shfmt >/dev/null 2>&1; then + echo "You must have 'shfmt' in PATH to use 'check-formatting.sh'" + exit 1 +fi + +if ! command -v cmake-format >/dev/null 2>&1; then + echo "You must have 'cmake-format' in PATH to use 'check-formatting.sh'" + exit 1 +fi + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) curr_dir=$(pwd) @@ -44,28 +54,24 @@ cd $SCRIPT_DIR cd .. cd .. -echo "Check formatting of C/C++ code in 'src'" -find src \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe --dry-run -Werror +echo "Check formatting of C/C++ code in '.'" +find . \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) \( -path "./src/*" -o -path "./tools/*" -o -path "./tests/*" -o -path "./etc/datacrumbs/plugins/*" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe --dry-run --Werror src_check_rc=$? -echo "Check formatting of C/C++ code in 'etc/datacrumbs/plugins'" -find etc/datacrumbs/plugins \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe --dry-run -Werror -plugins_check_rc=$? - -echo "Check formatting of C/C++ code in 'tests'" -find tests \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe --dry-run -Werror -tests_check_rc=$? +echo "Check formatting of shell scripts in '.'" +find . \( -name "*.sh" -o -name "*.in" \) \( -path "./etc/datacrumbs/data/*" -o -path "./infrastructure/docker/*" -o -path "./scripts/datacrumbs/*" -o -path "./tests/*" -o -path "./tools/*" \) -not -path "*.txt.in" -print0 | xargs -0 shfmt -d +shell_check_rc=$? -echo "Check formatting of C/C++ code in 'tools'" -find tools \( -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" \) -print0 | xargs -0 -P "$(nproc)" $clang_format_exe --dry-run -Werror -tools_check_rc=$? +echo "Check formatting of CMake files in '.'" +find . \( -name "CMakeLists.txt*" -o -name "*.cmake" \) \( -path "./src/*" -o -path "./tools/*" -o -path "./tests/*" -o -path "./cmake/*" \) -print0 | xargs -0 cmake-format --check +cmake_check_rc=$? cd $curr_dir -if [ $src_check_rc -ne 0 ] || [ $plugins_check_rc -ne 0 ] || [ $tests_check_rc -ne 0 ] || [ $tools_check_rc -ne 0 ]; then - echo "Some formatting checks failed. Please run 'autoformat.sh' to fix the issues." - exit 2 +if [ $src_check_rc -ne 0 ] || [ $shell_check_rc -ne 0 ] || [ $cmake_check_rc -ne 0 ]; then + echo "Some formatting checks failed. Please run 'autoformat.sh' to fix the issues." + exit 2 else - echo "All checks passed successfully." - exit 0 -fi \ No newline at end of file + echo "All checks passed successfully." + exit 0 +fi diff --git a/src/datacrumbs/composable/CMakeLists.txt.in b/src/datacrumbs/composable/CMakeLists.txt.in index 8c3291b3..b4c0f217 100644 --- a/src/datacrumbs/composable/CMakeLists.txt.in +++ b/src/datacrumbs/composable/CMakeLists.txt.in @@ -20,22 +20,35 @@ load_build_variables() # Set Options # ------------------------------------------------------------------------------ -set(DATACRUMBS_NAME "$ENV{USER}" CACHE STRING "Name of the Datacrumbs package") -set(DATACRUMBS_PROBES "" CACHE STRING "List of probes to include in the Datacrumbs package") -set(DATACRUMBS_CLIENT_OBJECTS_DIR "$ENV{DATACRUMBS_INSTALL_PROBE_OBJECTS_DIR}" CACHE STRING "Path to the Datacrumbs client objects directory") - +set(DATACRUMBS_NAME + "$ENV{USER}" + CACHE STRING "Name of the Datacrumbs package" +) +set(DATACRUMBS_PROBES + "" + CACHE STRING "List of probes to include in the Datacrumbs package" +) +set(DATACRUMBS_CLIENT_OBJECTS_DIR + "$ENV{DATACRUMBS_INSTALL_PROBE_OBJECTS_DIR}" + CACHE STRING "Path to the Datacrumbs client objects directory" +) # ------------------------------------------------------------------------------ # Validate Probes # ------------------------------------------------------------------------------ # Convert comma-separated DATACRUMBS_PROBES into a list -string(REPLACE "," ";" DATACRUMBS_PROBES_LIST "${DATACRUMBS_PROBES}") +string( + REPLACE "," + ";" + DATACRUMBS_PROBES_LIST + "${DATACRUMBS_PROBES}" +) # Append .o to each probe name in DATACRUMBS_PROBES_LIST set(DATACRUMBS_PROBES_OBJECTS) foreach(probe ${DATACRUMBS_PROBES_LIST}) - list(APPEND DATACRUMBS_PROBES_OBJECTS "${probe}.o") + list(APPEND DATACRUMBS_PROBES_OBJECTS "${probe}.o") endforeach() message(STATUS "User gave ${DATACRUMBS_PROBES_OBJECTS}") @@ -48,30 +61,42 @@ message(STATUS "We have ${ALL_OBJECT_FILES}") set(EXCLUDED_OBJECTS "init.o" "datacrumbs.bpf.o" "common.o") set(FILTERED_OBJECT_FILES) foreach(obj_file ${ALL_OBJECT_FILES}) - get_filename_component(obj_name "${obj_file}" NAME) - list(FIND EXCLUDED_OBJECTS "${obj_name}" EXCLUDED_IDX) - if(EXCLUDED_IDX EQUAL -1) - list(APPEND FILTERED_OBJECT_FILES "${obj_name}") - endif() + get_filename_component(obj_name "${obj_file}" NAME) + list( + FIND + EXCLUDED_OBJECTS + "${obj_name}" + EXCLUDED_IDX + ) + if(EXCLUDED_IDX EQUAL -1) + list(APPEND FILTERED_OBJECT_FILES "${obj_name}") + endif() endforeach() # Check that all DATACRUMBS_PROBES_OBJECTS are present in FILTERED_OBJECT_FILES set(MISSING_OBJECTS) foreach(probe_obj ${DATACRUMBS_PROBES_OBJECTS}) - list(FIND FILTERED_OBJECT_FILES "${probe_obj}" FOUND_IDX) - if(FOUND_IDX EQUAL -1) - list(APPEND MISSING_OBJECTS "${probe_obj}") - endif() + list( + FIND + FILTERED_OBJECT_FILES + "${probe_obj}" + FOUND_IDX + ) + if(FOUND_IDX EQUAL -1) + list(APPEND MISSING_OBJECTS "${probe_obj}") + endif() endforeach() if(MISSING_OBJECTS) - message(FATAL_ERROR "Missing probe object files in ${DATACRUMBS_CLIENT_OBJECTS_DIR}: ${MISSING_OBJECTS}") + message( + FATAL_ERROR "Missing probe object files in ${DATACRUMBS_CLIENT_OBJECTS_DIR}: ${MISSING_OBJECTS}" + ) endif() # Prepend DATACRUMBS_CLIENT_OBJECTS_DIR/ to each element of DATACRUMBS_PROBES_OBJECTS set(DATACRUMBS_PROBES_OBJECTS_FULL) foreach(probe_obj ${DATACRUMBS_PROBES_OBJECTS}) - list(APPEND DATACRUMBS_PROBES_OBJECTS_FULL "${DATACRUMBS_CLIENT_OBJECTS_DIR}/${probe_obj}") + list(APPEND DATACRUMBS_PROBES_OBJECTS_FULL "${DATACRUMBS_CLIENT_OBJECTS_DIR}/${probe_obj}") endforeach() # ------------------------------------------------------------------------------ @@ -110,12 +135,30 @@ set(CMAKE_INSTALL_RPATH "${DEPENDENCY_LIBRARY_DIRS}") set(CMAKE_BUILD_RPATH "${DEPENDENCY_LIBRARY_DIRS}") # print found packages -message(STATUS " - Found libbpf:${LIBBPF_VERSION} at include:${LIBBPF_INCLUDEDIR} lib:${LIBBPF_LIBRARY_DIRS}") -message(STATUS " - Found yaml-cpp:${yaml-cpp_VERSION} at include:${YAML_CPP_INCLUDE_DIR} lib:${YAML_CPP_LIBRARY_DIR}") -message(STATUS " - Found llvm:${LLVM_VERSION} at include:${LLVM_INCLUDE_DIRS} lib:${LLVM_LIBRARY_DIRS} clang:${CLANG_EXECUTABLE}") -message(STATUS " - Found json-c:${json-c_CONSIDERED_VERSIONS} at include:${json-c_INCLUDE_DIR} lib:${json-c_LIBRARY_DIR}") -message(STATUS " - Found zlib:${ZLIB_VERSION} at include:${ZLIB_INCLUDE_DIRS} lib:${ZLIB_LIBRARY_DIRS}") -message(STATUS " - Found mpi:${MPI_CXX_VERSION} at include:${MPI_CXX_INCLUDE_DIRS} lib:${MPI_CXX_LIBRARY_DIR}") +message( + STATUS + " - Found libbpf:${LIBBPF_VERSION} at include:${LIBBPF_INCLUDEDIR} lib:${LIBBPF_LIBRARY_DIRS}" +) +message( + STATUS + " - Found yaml-cpp:${yaml-cpp_VERSION} at include:${YAML_CPP_INCLUDE_DIR} lib:${YAML_CPP_LIBRARY_DIR}" +) +message( + STATUS + " - Found llvm:${LLVM_VERSION} at include:${LLVM_INCLUDE_DIRS} lib:${LLVM_LIBRARY_DIRS} clang:${CLANG_EXECUTABLE}" +) +message( + STATUS + " - Found json-c:${json-c_CONSIDERED_VERSIONS} at include:${json-c_INCLUDE_DIR} lib:${json-c_LIBRARY_DIR}" +) +message( + STATUS + " - Found zlib:${ZLIB_VERSION} at include:${ZLIB_INCLUDE_DIRS} lib:${ZLIB_LIBRARY_DIRS}" +) +message( + STATUS + " - Found mpi:${MPI_CXX_VERSION} at include:${MPI_CXX_INCLUDE_DIRS} lib:${MPI_CXX_LIBRARY_DIR}" +) message(STATUS " - DEPENDENCY_LIBRARY_DIRS for RPATH:${DEPENDENCY_LIBRARY_DIRS}") message(STATUS " - DEPENDENCY_LIB for linking :${DEPENDENCY_LIB}") @@ -126,7 +169,8 @@ message(STATUS " - DEPENDENCY_LIB for linking :${DEPENDENCY_LIB}") file(MAKE_DIRECTORY ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/objects/) set(BPF_OUTPUT ${CMAKE_LIBEXEC_OUTPUT_DIRECTORY}/objects/datacrumbs.bpf.o) -# Prepend DATACRUMBS_CLIENT_OBJECTS_DIR to common.o and init.o and add to DATACRUMBS_PROBES_OBJECTS_FULL +# Prepend DATACRUMBS_CLIENT_OBJECTS_DIR to common.o and init.o and add to +# DATACRUMBS_PROBES_OBJECTS_FULL list(PREPEND DATACRUMBS_PROBES_OBJECTS_FULL "${DATACRUMBS_CLIENT_OBJECTS_DIR}/common.o") list(APPEND DATACRUMBS_PROBES_OBJECTS_FULL "${DATACRUMBS_CLIENT_OBJECTS_DIR}/init.o") @@ -134,11 +178,13 @@ message(STATUS "Compiling ${DATACRUMBS_PROBES_OBJECTS_FULL}") # Link all object files into a single object file add_custom_command( - OUTPUT ${BPF_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "Linking all BPF objects into ${BPF_OUTPUT} (timed)" - COMMAND /usr/bin/time -f "Elapsed time for linking: %E" @BPFTOOL_EXECUTABLE@ gen object ${BPF_OUTPUT} ${DATACRUMBS_PROBES_OBJECTS_FULL} - COMMENT "Linking all BPF objects into ${BPF_OUTPUT} (timed)" - VERBATIM + OUTPUT ${BPF_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan + "Linking all BPF objects into ${BPF_OUTPUT} (timed)" + COMMAND /usr/bin/time -f "Elapsed time for linking: %E" @BPFTOOL_EXECUTABLE@ gen object + ${BPF_OUTPUT} ${DATACRUMBS_PROBES_OBJECTS_FULL} + COMMENT "Linking all BPF objects into ${BPF_OUTPUT} (timed)" + VERBATIM ) add_custom_target(datacrumbs_bpf ALL DEPENDS ${BPF_OUTPUT}) @@ -147,12 +193,12 @@ add_custom_target(datacrumbs_bpf ALL DEPENDS ${BPF_OUTPUT}) set(BPF_SKEL_OUTPUT ${CMAKE_BINARY_DIR}/include/datacrumbs/composable/bpf/datacrumbs.skel.h) add_custom_command( - OUTPUT ${BPF_SKEL_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/include/datacrumbs/composable/bpf/ - COMMAND @BPFTOOL_EXECUTABLE@ gen skeleton ${BPF_OUTPUT} > ${BPF_SKEL_OUTPUT} - DEPENDS ${BPF_OUTPUT} - COMMENT "Generating BPF skeleton: ${BPF_SKEL_OUTPUT}" - VERBATIM + OUTPUT ${BPF_SKEL_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/include/datacrumbs/composable/bpf/ + COMMAND @BPFTOOL_EXECUTABLE@ gen skeleton ${BPF_OUTPUT} > ${BPF_SKEL_OUTPUT} + DEPENDS ${BPF_OUTPUT} + COMMENT "Generating BPF skeleton: ${BPF_SKEL_OUTPUT}" + VERBATIM ) add_custom_target(datacrumbs_bpf_skel ALL DEPENDS ${BPF_SKEL_OUTPUT}) add_dependencies(datacrumbs_bpf_skel datacrumbs_bpf) @@ -163,11 +209,16 @@ add_dependencies(datacrumbs_bpf_skel datacrumbs_bpf) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) -set(DATACRUMBS_COMPOSABLE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/datacrumbs/composable/process/server.cpp) -add_executable(@PROJECT_NAME@_${DATACRUMBS_NAME} ${DATACRUMBS_COMPOSABLE_SRC} ${BPF_SKEL_OUTPUT}) -target_link_libraries(@PROJECT_NAME@_${DATACRUMBS_NAME} ${DEPENDENCY_LIB} @DATACRUMBS_INSTALL_LIB_DIR@/libdatacrumbs_obj.so) +set(DATACRUMBS_COMPOSABLE_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/src/datacrumbs/composable/process/server.cpp +) +add_executable(@PROJECT_NAME@_${DATACRUMBS_NAME} ${DATACRUMBS_COMPOSABLE_SRC} ${BPF_SKEL_OUTPUT}) +target_link_libraries( + @PROJECT_NAME@_${DATACRUMBS_NAME} ${DEPENDENCY_LIB} + @DATACRUMBS_INSTALL_LIB_DIR@/libdatacrumbs_obj.so +) add_dependencies(@PROJECT_NAME@_${DATACRUMBS_NAME} datacrumbs_bpf_skel) # Install the main processing executable into DATACRUMBS_INSTALL_BINARYDIR install(TARGETS @PROJECT_NAME@_${DATACRUMBS_NAME} - RUNTIME DESTINATION "${DATACRUMBS_INSTALL_SBINARYDIR}" -) \ No newline at end of file + RUNTIME DESTINATION "${DATACRUMBS_INSTALL_SBINARYDIR}" +) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9e2b7392..313733c8 100755 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,2 +1,2 @@ add_subdirectory(unittests) -add_subdirectory(benchmarks/ior) \ No newline at end of file +add_subdirectory(benchmarks/ior) diff --git a/tests/benchmarks/ior/CMakeLists.txt b/tests/benchmarks/ior/CMakeLists.txt index 93e7a3ea..efbf7c55 100644 --- a/tests/benchmarks/ior/CMakeLists.txt +++ b/tests/benchmarks/ior/CMakeLists.txt @@ -1,62 +1,45 @@ -find_program(IOR_EXECUTABLE NAMES ior PATHS ENV PATH) +find_program( + IOR_EXECUTABLE + NAMES ior + PATHS ENV PATH +) if(IOR_EXECUTABLE) - message(STATUS "Found IOR: ${IOR_EXECUTABLE}") - set(ENABLE_IOR_TESTS ON) + message(STATUS "Found IOR: ${IOR_EXECUTABLE}") + set(ENABLE_IOR_TESTS ON) else() - message(STATUS "IOR binary not found. IOR tests will be disabled.") - set(ENABLE_IOR_TESTS OFF) + message(STATUS "IOR binary not found. IOR tests will be disabled.") + set(ENABLE_IOR_TESTS OFF) endif() -set(DATACRUMBS_TEST_DIR "/tmp" CACHE STRING "Directory for Datacrumbs test files") +set(DATACRUMBS_TEST_DIR + "/tmp" + CACHE STRING "Directory for Datacrumbs test files" +) if(ENABLE_IOR_TESTS AND ENABLE_MPIRUN_TEST) - add_test( - NAME ior_posix_file_per_process - COMMAND ${MPIRUN_EXECUTABLE} -np 16 - -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} - ${IOR_EXECUTABLE} - -a POSIX - -F - -t 1m - -b 32m - -o ${DATACRUMBS_TEST_DIR}/ior_testfile - ) - add_test( - NAME ior_mpiio_collective_shared - COMMAND ${MPIRUN_EXECUTABLE} -np 16 - -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} - ${IOR_EXECUTABLE} - -a MPIIO - -c - -t 1m - -b 32m - -w -r - -o ${DATACRUMBS_TEST_DIR}/ior_mpiio_testfile - ) - add_test( - NAME ior_hdf5_collective_shared - COMMAND ${MPIRUN_EXECUTABLE} -np 16 - -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} - ${IOR_EXECUTABLE} - -a HDF5 - -C - -t 1m - -b 32m - -w -r - -o ${DATACRUMBS_TEST_DIR}/ior_hdf5_collective_testfile - ) + add_test( + NAME ior_posix_file_per_process + COMMAND ${MPIRUN_EXECUTABLE} -np 16 -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} + ${IOR_EXECUTABLE} -a POSIX -F -t 1m -b 32m -o ${DATACRUMBS_TEST_DIR}/ior_testfile + ) + add_test( + NAME ior_mpiio_collective_shared + COMMAND + ${MPIRUN_EXECUTABLE} -np 16 -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} ${IOR_EXECUTABLE} -a + MPIIO -c -t 1m -b 32m -w -r -o ${DATACRUMBS_TEST_DIR}/ior_mpiio_testfile + ) + add_test( + NAME ior_hdf5_collective_shared + COMMAND + ${MPIRUN_EXECUTABLE} -np 16 -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} ${IOR_EXECUTABLE} -a + HDF5 -C -t 1m -b 32m -w -r -o ${DATACRUMBS_TEST_DIR}/ior_hdf5_collective_testfile + ) - add_test( - NAME ior_hdf5_file_per_process - COMMAND ${MPIRUN_EXECUTABLE} -np 16 - -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} - ${IOR_EXECUTABLE} - -a HDF5 - -F - -t 1m - -b 32m - -w -r - -o ${DATACRUMBS_TEST_DIR}/ior_hdf5_fpp_testfile - ) + add_test( + NAME ior_hdf5_file_per_process + COMMAND + ${MPIRUN_EXECUTABLE} -np 16 -x LD_PRELOAD=${DATACRUMBS_BUILD_CLIENT_SO} ${IOR_EXECUTABLE} -a + HDF5 -F -t 1m -b 32m -w -r -o ${DATACRUMBS_TEST_DIR}/ior_hdf5_fpp_testfile + ) endif() diff --git a/tests/unittests/CMakeLists.txt b/tests/unittests/CMakeLists.txt index 005aae41..bbe09f72 100644 --- a/tests/unittests/CMakeLists.txt +++ b/tests/unittests/CMakeLists.txt @@ -1 +1 @@ -add_subdirectory(io_tests) \ No newline at end of file +add_subdirectory(io_tests) diff --git a/tests/unittests/io_tests/CMakeLists.txt b/tests/unittests/io_tests/CMakeLists.txt index 0e5e72cf..46d0aa5e 100644 --- a/tests/unittests/io_tests/CMakeLists.txt +++ b/tests/unittests/io_tests/CMakeLists.txt @@ -1,18 +1,18 @@ find_package(MPI) if(MPI_FOUND) - find_program(MPIRUN_EXECUTABLE mpirun) + find_program(MPIRUN_EXECUTABLE mpirun) - if(MPIRUN_EXECUTABLE) - message(STATUS "Found mpirun: ${MPIRUN_EXECUTABLE}") - set(ENABLE_MPIRUN_TEST ON) - else() - message(STATUS "mpirun binary not found. mpirun tests will be disabled.") - set(ENABLE_MPIRUN_TEST OFF) - endif() + if(MPIRUN_EXECUTABLE) + message(STATUS "Found mpirun: ${MPIRUN_EXECUTABLE}") + set(ENABLE_MPIRUN_TEST ON) + else() + message(STATUS "mpirun binary not found. mpirun tests will be disabled.") + set(ENABLE_MPIRUN_TEST OFF) + endif() - add_executable(df_tracer_test test.cpp) - target_link_libraries(df_tracer_test MPI::MPI_CXX) - add_executable(df_tracer_test_stdio test_stdio.cpp) - target_link_libraries(df_tracer_test_stdio MPI::MPI_CXX) -endif() \ No newline at end of file + add_executable(df_tracer_test test.cpp) + target_link_libraries(df_tracer_test MPI::MPI_CXX) + add_executable(df_tracer_test_stdio test_stdio.cpp) + target_link_libraries(df_tracer_test_stdio MPI::MPI_CXX) +endif() diff --git a/tests/unittests/io_tests/scripts/ior.sh b/tests/unittests/io_tests/scripts/ior.sh index dd2fcd9e..3a88748e 100755 --- a/tests/unittests/io_tests/scripts/ior.sh +++ b/tests/unittests/io_tests/scripts/ior.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -68,8 +68,7 @@ for i in {1..10}; do elapsed_time=$((end_time - start_time)) echo "Time taken for write iteration:$i: ${elapsed_time} seconds" sleep 10 - if [ "$DROP_CACHES" -eq "1" ]; - then + if [ "$DROP_CACHES" -eq "1" ]; then echo "Clean Cache" sudo sh -c "/usr/bin/echo 3 > /proc/sys/vm/drop_caches" fi @@ -78,4 +77,4 @@ for i in {1..10}; do mpirun -n 24 $LD_PRELOAD_ARG ${IOR_DIR}/bin/ior ${configuration} -r elapsed_time=$((end_time - start_time)) echo "Time taken for read iteration:$i: ${elapsed_time} seconds" -done \ No newline at end of file +done diff --git a/tests/unittests/io_tests/scripts/ior_hdf5_fpp.sh b/tests/unittests/io_tests/scripts/ior_hdf5_fpp.sh index d7ee739c..f63aeac2 100755 --- a/tests/unittests/io_tests/scripts/ior_hdf5_fpp.sh +++ b/tests/unittests/io_tests/scripts/ior_hdf5_fpp.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -15,6 +15,6 @@ rm -rf $DATA_DIR/* BLOCK=32m PROC=40 ts=1m -cmd=(mpirun -np ${PROC} -x LD_PRELOAD=$DATACRUMBS_SO ${IOR_INSTALL_DIR}/bin/ior -o=${DATA_DIR}/test-${ts} -b=${BLOCK} -i=1 -t=${ts} -a=HDF5 -F) +cmd=(mpirun -np ${PROC} -x LD_PRELOAD=$DATACRUMBS_SO ${IOR_INSTALL_DIR}/bin/ior -o=${DATA_DIR}/test-${ts} -b=${BLOCK} -i=1 -t=${ts} -a=HDF5 -F) echo "${cmd[@]}" -"${cmd[@]}" \ No newline at end of file +"${cmd[@]}" diff --git a/tests/unittests/io_tests/scripts/ior_mpiio.sh b/tests/unittests/io_tests/scripts/ior_mpiio.sh index 9c282b49..2ab862c6 100755 --- a/tests/unittests/io_tests/scripts/ior_mpiio.sh +++ b/tests/unittests/io_tests/scripts/ior_mpiio.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -15,6 +15,6 @@ rm -rf $DATA_DIR/* BLOCK=32m PROC=10 ts=1m -cmd=(mpirun -np ${PROC} -x LD_PRELOAD=$DATACRUMBS_SO ${IOR_INSTALL_DIR}/bin/ior -o=${DATA_DIR}/test-${ts} -b=${BLOCK} -i=1 -t=${ts} -a=MPIIO -c) +cmd=(mpirun -np ${PROC} -x LD_PRELOAD=$DATACRUMBS_SO ${IOR_INSTALL_DIR}/bin/ior -o=${DATA_DIR}/test-${ts} -b=${BLOCK} -i=1 -t=${ts} -a=MPIIO -c) echo "${cmd[@]}" -"${cmd[@]}" \ No newline at end of file +"${cmd[@]}" diff --git a/tests/unittests/io_tests/scripts/test_posix.sh b/tests/unittests/io_tests/scripts/test_posix.sh index ad4bb715..37d48dbc 100755 --- a/tests/unittests/io_tests/scripts/test_posix.sh +++ b/tests/unittests/io_tests/scripts/test_posix.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -26,8 +26,7 @@ if [ "$TEST_CASE" -eq "0" ] || [ "$TEST_CASE" -eq "2" ]; then rm -rf $DATA_DIR/* fi -for TSKB in $((1*1024)); #1 4 16 64 256 1024 4096 16384 65536 262144 -do +for TSKB in $((1 * 1024)); do #1 4 16 64 256 1024 4096 16384 65536 262144 TS=$((TSKB * 1024)) if [ "$TEST_CASE" -eq "0" ] || [ "$TEST_CASE" -eq "2" ]; then cmd=(${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} 0 ${DIRECTIO}) @@ -40,10 +39,8 @@ do fi if [ "$TEST_CASE" -eq "1" ] || [ "$TEST_CASE" -eq "2" ]; then sleep 5 - cmd=( ${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} 1 ${DIRECTIO}) + cmd=(${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} 1 ${DIRECTIO}) echo "${cmd[@]}" LD_PRELOAD=${DATACRUMBS_SO} "${cmd[@]}" fi done - - diff --git a/tests/unittests/io_tests/scripts/test_posix_overhead.sh b/tests/unittests/io_tests/scripts/test_posix_overhead.sh index 2b608321..96bd3c8a 100755 --- a/tests/unittests/io_tests/scripts/test_posix_overhead.sh +++ b/tests/unittests/io_tests/scripts/test_posix_overhead.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -20,20 +20,16 @@ if [ "$TEST_CASE" -eq "0" ] || [ "$TEST_CASE" -eq "2" ]; then fi echo "Base" -TS=$((1*1024 * 1024)) -for i in {1..5}; -do -cmd="mpirun -np ${PROC} --use-hwthread-cpus ${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} ${TEST_CASE} ${DIRECTIO}" -# echo $cmd -$cmd +TS=$((1 * 1024 * 1024)) +for i in {1..5}; do + cmd="mpirun -np ${PROC} --use-hwthread-cpus ${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} ${TEST_CASE} ${DIRECTIO}" + # echo $cmd + $cmd done sleep 5 echo "DataCrums" -for i in {1..5}; -do -cmd="mpirun -np ${PROC} --use-hwthread-cpus -x LD_PRELOAD=${DATACRUMBS_SO} ${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} ${TEST_CASE} ${DIRECTIO}" -# echo $cmd -$cmd +for i in {1..5}; do + cmd="mpirun -np ${PROC} --use-hwthread-cpus -x LD_PRELOAD=${DATACRUMBS_SO} ${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} ${TEST_CASE} ${DIRECTIO}" + # echo $cmd + $cmd done - - diff --git a/tests/unittests/io_tests/scripts/test_posix_read.sh b/tests/unittests/io_tests/scripts/test_posix_read.sh index 3c91c394..fcd45454 100755 --- a/tests/unittests/io_tests/scripts/test_posix_read.sh +++ b/tests/unittests/io_tests/scripts/test_posix_read.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -26,8 +26,7 @@ if [ "$TEST_CASE" -eq "0" ] || [ "$TEST_CASE" -eq "2" ]; then rm -rf $DATA_DIR/* fi -for TSKB in $((1*1024)); #1 4 16 64 256 1024 4096 16384 65536 262144 -do +for TSKB in $((1 * 1024)); do #1 4 16 64 256 1024 4096 16384 65536 262144 TS=$((TSKB * 1024)) cmd="mpirun -np ${PROC} --use-hwthread-cpus -x ${PROJECT_DIR}/build/tests/df_tracer_test ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} 0 ${DIRECTIO}" echo $cmd @@ -49,5 +48,3 @@ do echo $cmd $cmd done - - diff --git a/tests/unittests/io_tests/scripts/test_stdio.sh b/tests/unittests/io_tests/scripts/test_stdio.sh index 3a247898..096020b0 100755 --- a/tests/unittests/io_tests/scripts/test_stdio.sh +++ b/tests/unittests/io_tests/scripts/test_stdio.sh @@ -1,5 +1,5 @@ #!/bin/bash -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-$0}")" &>/dev/null && pwd 2>/dev/null)" echo $SCRIPT_DIR TEST_DIR=$(dirname $SCRIPT_DIR) PROJECT_DIR=$(dirname $TEST_DIR) @@ -19,13 +19,10 @@ if [ "$TEST_CASE" -eq "0" ] || [ "$TEST_CASE" -eq "2" ]; then rm -rf $DATA_DIR/* fi -for TSKB in $((1*1024)); #1 4 16 64 256 1024 4096 16384 65536 262144 -do +for TSKB in $((1 * 1024)); do #1 4 16 64 256 1024 4096 16384 65536 262144 TS=$((TSKB * 1024)) cmd="mpirun -np ${PROC} --use-hwthread-cpus -x LD_PRELOAD=${DATACRUMBS_SO} ${PROJECT_DIR}/build/tests/df_tracer_test_stdio ${NUM_FILES} ${NUM_OPS} ${TS} ${DATA_DIR} ${TEST_CASE} ${DIRECTIO}" echo $cmd $cmd sleep 5 done - - diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 15142a33..f3d33bf2 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -8,4 +8,4 @@ add_executable(aggregate_trace aggregate_trace.cpp) target_link_libraries(aggregate_trace PRIVATE json-c::json-c ZLIB::ZLIB) add_executable(callgraph_creator callgraph_vis.cpp) -target_link_libraries(callgraph_creator PRIVATE json-c::json-c ZLIB::ZLIB) \ No newline at end of file +target_link_libraries(callgraph_creator PRIVATE json-c::json-c ZLIB::ZLIB) diff --git a/tools/analyze_trace.sh b/tools/analyze_trace.sh index bb989917..8f913580 100755 --- a/tools/analyze_trace.sh +++ b/tools/analyze_trace.sh @@ -2,28 +2,28 @@ # Function to echo with timestamp log() { - echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } # Check if file is provided as argument if [ $# -eq 0 ]; then - log "Usage: $0 " - exit 1 + log "Usage: $0 " + exit 1 fi INPUT_FILE="$1" # Check if file exists if [ ! -f "$INPUT_FILE" ]; then - log "Error: File '$INPUT_FILE' not found" - exit 1 + log "Error: File '$INPUT_FILE' not found" + exit 1 fi # Create temporary file without brackets TEMP_FILE=$(mktemp) log "Removing brackets from input file..." -sed '1d;$d' "$INPUT_FILE" | sed 's/,$//' > "$TEMP_FILE" +sed '1d;$d' "$INPUT_FILE" | sed 's/,$//' >"$TEMP_FILE" # Declare associative arrays for calculations declare -A total_dur @@ -34,18 +34,18 @@ log "Processing JSON records..." # Read each line and process with jq # Count total lines for progress bar -total_lines=$(wc -l < "$TEMP_FILE") +total_lines=$(wc -l <"$TEMP_FILE") current_line=0 # Use GNU parallel and jq to process lines in parallel and aggregate results process_line() { - line="$1" - name=$(echo "$line" | jq -r '.name // empty') - cat=$(echo "$line" | jq -r '.cat // empty') - dur=$(echo "$line" | jq -r '.dur // 0') - if [[ -n "$name" && "$name" != "null" ]]; then - echo "$name|$cat|$dur" - fi + line="$1" + name=$(echo "$line" | jq -r '.name // empty') + cat=$(echo "$line" | jq -r '.cat // empty') + dur=$(echo "$line" | jq -r '.dur // 0') + if [[ -n "$name" && "$name" != "null" ]]; then + echo "$name|$cat|$dur" + fi } export -f process_line @@ -54,27 +54,27 @@ log "Processing JSON records in parallel with progress bar..." # Function to update progress bar update_progress() { - local progress=$1 - local total=$2 - local start_time=$3 - local width=40 - local percent=$((progress * 100 / total)) - local filled=$((progress * width / total)) - local empty=$((width - filled)) - local now elapsed eta - - now=$(date +%s) - elapsed=$((now - start_time)) - if ((progress > 0)); then - eta=$(( (elapsed * (total - progress)) / progress )) - else - eta=0 - fi - - printf "\r[" - printf "%0.s#" $(seq 1 $filled) - printf "%0.s-" $(seq 1 $empty) - printf "] %3d%% (%d/%d) Elapsed: %ds ETA: %ds" "$percent" "$progress" "$total" "$elapsed" "$eta" + local progress=$1 + local total=$2 + local start_time=$3 + local width=40 + local percent=$((progress * 100 / total)) + local filled=$((progress * width / total)) + local empty=$((width - filled)) + local now elapsed eta + + now=$(date +%s) + elapsed=$((now - start_time)) + if ((progress > 0)); then + eta=$(((elapsed * (total - progress)) / progress)) + else + eta=0 + fi + + printf "\r[" + printf "%0.s#" $(seq 1 $filled) + printf "%0.s-" $(seq 1 $empty) + printf "] %3d%% (%d/%d) Elapsed: %ds ETA: %ds" "$percent" "$progress" "$total" "$elapsed" "$eta" } # Process lines in parallel and show progress bar @@ -89,8 +89,8 @@ mkfifo "$PIPE" # Start a background job to process lines and write to results ( - cat "$TEMP_FILE" | parallel --pipe --block 1M --jobs "$(nproc)" --line-buffer \ - 'while read -r line; do process_line "$line"; done' > "$PIPE" + cat "$TEMP_FILE" | parallel --pipe --block 1M --jobs "$(nproc)" --line-buffer \ + 'while read -r line; do process_line "$line"; done' >"$PIPE" ) & # In the awk aggregation, add sumsq @@ -130,16 +130,16 @@ END { for (name in total_dur) { printf "%s|%s|%d|%d|%d\n", name, category[name], count[name], total_dur[name], sumsq[name] } -}' "$PIPE" > "$TEMP_FILE.results" +}' "$PIPE" >"$TEMP_FILE.results" # Read results into associative arrays (add sumsq) declare -A sumsq while IFS='|' read -r name cat cnt tdur ssq; do - total_dur["$name"]=$tdur - count["$name"]=$cnt - category["$name"]="$cat" - sumsq["$name"]=$ssq -done < "$TEMP_FILE.results" + total_dur["$name"]=$tdur + count["$name"]=$cnt + category["$name"]="$cat" + sumsq["$name"]=$ssq +done <"$TEMP_FILE.results" # Prepare output directory and file SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -150,37 +150,37 @@ OUTPUT_FILE="$OUTPUT_DIR/${INPUT_BASENAME}.log" # Output results to both stdout and file { - echo - log "Results:" - echo "==============================================================================================" - printf "%-30s %-15s %-10s %-15s %-15s %-15s\n" "Function Name" "Category" "Count" "Total Duration" "Avg Duration" "Std Duration" - echo "==============================================================================================" - - for name in $(for n in "${!total_dur[@]}"; do - printf "%s|%d\n" "$n" "${total_dur[$n]}" - done | sort -t'|' -k2,2n | cut -d'|' -f1); do - avg_dur=0 - std_dur=0 - if [[ ${count[$name]} -gt 0 ]]; then - avg_dur=$((total_dur[$name] / count[$name])) - # stddev = sqrt((sumsq / count) - (avg^2)) - sumsq_val=${sumsq[$name]} - cnt=${count[$name]} - avg_float=$(awk "BEGIN {print ${total_dur[$name]}/$cnt}") - mean_sq=$(awk "BEGIN {print $avg_float * $avg_float}") - var=$(awk "BEGIN {print ($sumsq_val/$cnt) - $mean_sq}") - std_dur=$(awk "BEGIN {if ($var<0) print 0; else print sqrt($var)}") - fi - - printf "%-30s %-15s %-10d %-15d %-15.2f %-15.2f\n" \ - "$name" \ - "${category[$name]}" \ - "${count[$name]}" \ - "${total_dur[$name]}" \ - "$avg_dur" \ - "$std_dur" - done - - echo "==============================================================================================" - log "Total unique functions: ${#total_dur[@]}" + echo + log "Results:" + echo "==============================================================================================" + printf "%-30s %-15s %-10s %-15s %-15s %-15s\n" "Function Name" "Category" "Count" "Total Duration" "Avg Duration" "Std Duration" + echo "==============================================================================================" + + for name in $(for n in "${!total_dur[@]}"; do + printf "%s|%d\n" "$n" "${total_dur[$n]}" + done | sort -t'|' -k2,2n | cut -d'|' -f1); do + avg_dur=0 + std_dur=0 + if [[ ${count[$name]} -gt 0 ]]; then + avg_dur=$((total_dur[$name] / count[$name])) + # stddev = sqrt((sumsq / count) - (avg^2)) + sumsq_val=${sumsq[$name]} + cnt=${count[$name]} + avg_float=$(awk "BEGIN {print ${total_dur[$name]}/$cnt}") + mean_sq=$(awk "BEGIN {print $avg_float * $avg_float}") + var=$(awk "BEGIN {print ($sumsq_val/$cnt) - $mean_sq}") + std_dur=$(awk "BEGIN {if ($var<0) print 0; else print sqrt($var)}") + fi + + printf "%-30s %-15s %-10d %-15d %-15.2f %-15.2f\n" \ + "$name" \ + "${category[$name]}" \ + "${count[$name]}" \ + "${total_dur[$name]}" \ + "$avg_dur" \ + "$std_dur" + done + + echo "==============================================================================================" + log "Total unique functions: ${#total_dur[@]}" } | tee "$OUTPUT_FILE" diff --git a/tools/separator.sh b/tools/separator.sh index 0dba93bd..18ae0ec3 100755 --- a/tools/separator.sh +++ b/tools/separator.sh @@ -6,16 +6,16 @@ # 1. Validate input if [ -z "$1" ]; then - echo "Error: No input file specified." - echo "Usage: $0 " - exit 1 + echo "Error: No input file specified." + echo "Usage: $0 " + exit 1 fi input_file="$1" if [ ! -f "$input_file" ]; then - echo "Error: File '$input_file' not found." - exit 1 + echo "Error: File '$input_file' not found." + exit 1 fi echo "Processing file: $input_file" @@ -25,20 +25,20 @@ unique_pids=$(grep -oP '"pid":\K[0-9]+' "$input_file" | sort -u) # Check if any PIDs were found if [ -z "$unique_pids" ]; then - echo "No PIDs found in the file. Exiting." - exit 0 + echo "No PIDs found in the file. Exiting." + exit 0 fi echo "Found unique PIDs: $unique_pids" # 3. Loop through each unique PID and create a corresponding output file. for pid in $unique_pids; do - # Define the output filename based on the pid - output_file="output_${pid}.pfw" - echo "-> Creating file for PID $pid: $output_file" + # Define the output filename based on the pid + output_file="output_${pid}.pfw" + echo "-> Creating file for PID $pid: $output_file" - # 4. Use grep to find all lines containing the exact PID and save them to the new file. - grep "\"pid\":${pid}[,]" "$input_file" > "$output_file" + # 4. Use grep to find all lines containing the exact PID and save them to the new file. + grep "\"pid\":${pid}[,]" "$input_file" >"$output_file" done echo "Splitting complete." From af202ed3bed3edbcfdbe4a1fe22e5ed50d4eb2ae Mon Sep 17 00:00:00 2001 From: Hariharan Devarajan Date: Thu, 12 Mar 2026 17:50:53 +0000 Subject: [PATCH 6/6] Fixed PR Changes - Formatting on probe_validator.cpp - Change DATACRUMBS_SCHEDULER_TYPE -> DATACRUMBS_LAUNCHER_TYPE - Make DATACRUMBS_IS_ROOT and DATACRUMBS_USER readonly --- CMakeLists.txt | 6 ++-- cmake/modules/datacrumbs-utils.cmake | 28 +++++++++---------- docs/build.rst | 6 ++-- etc/datacrumbs/configs/project.env.local.in | 2 +- scripts/datacrumbs/datacrumbs_logging.in | 16 +++++------ .../datacrumbs_service_common.sh.in | 8 +++--- scripts/datacrumbs/datacrumbs_setup.in | 3 ++ scripts/datacrumbs/datacrumbs_utility.in | 4 +-- src/datacrumbs/validator/probe_validator.cpp | 2 +- 9 files changed, 39 insertions(+), 36 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 655f1283..9e1e5983 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,8 +86,8 @@ set(DATACRUMBS_SKIP_SMALL_EVENTS_THRESHOLD_NS "1000" CACHE STRING "Threshold in set(DATACRUMBS_TIME_INTERVAL_NS "1000000" CACHE STRING "Profiling time interval in nanosecond") # Scheduling Options -set(DATACRUMBS_SCHEDULER_TYPE "FLUX" CACHE STRING "Scheduler type for datacrumbs (FLUX, SLURM, OPENMPI, or NONE)") -set_property(CACHE DATACRUMBS_SCHEDULER_TYPE PROPERTY STRINGS FLUX SLURM OPENMPI NONE) +set(DATACRUMBS_LAUNCHER_TYPE "FLUX" CACHE STRING "Scheduler type for datacrumbs (FLUX, SLURM, OPENMPI, or NONE)") +set_property(CACHE DATACRUMBS_LAUNCHER_TYPE PROPERTY STRINGS FLUX SLURM OPENMPI NONE) set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "NONE" CACHE STRING "Scheduler job ID environment variable name") set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "NONE" CACHE STRING "Scheduler option for setting nodes") set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "NONE" CACHE STRING "Scheduler option for setting processes per node") @@ -149,7 +149,7 @@ message(STATUS " - Found kernel headers at: ${DATACRUMBS_KERNEL_HEAD message(STATUS " - DATACRUMBS_KERNEL_UNAME_R: ${DATACRUMBS_KERNEL_UNAME_R}") message(STATUS " - DATACRUMBS_CONFIGURED_TRACE_DIR: ${DATACRUMBS_CONFIGURED_TRACE_DIR}") message(STATUS " - DATACRUMBS_CONFIGURED_LOG_DIR: ${DATACRUMBS_CONFIGURED_LOG_DIR}") -message(STATUS " - DATACRUMBS_SCHEDULER_TYPE: ${DATACRUMBS_SCHEDULER_TYPE}") +message(STATUS " - DATACRUMBS_LAUNCHER_TYPE: ${DATACRUMBS_LAUNCHER_TYPE}") message(STATUS " - DATACRUMBS_SCHEDULER_JOBID_ENV_VAR: ${DATACRUMBS_SCHEDULER_JOBID_ENV_VAR}") message(STATUS " - DATACRUMBS_SCHEDULER_NODES_CMD_OPT: ${DATACRUMBS_SCHEDULER_NODES_CMD_OPT}") message(STATUS " - DATACRUMBS_SCHEDULER_PPN_CMD_OPT: ${DATACRUMBS_SCHEDULER_PPN_CMD_OPT}") diff --git a/cmake/modules/datacrumbs-utils.cmake b/cmake/modules/datacrumbs-utils.cmake index 2091fdc4..3f0eb4ee 100644 --- a/cmake/modules/datacrumbs-utils.cmake +++ b/cmake/modules/datacrumbs-utils.cmake @@ -349,50 +349,50 @@ macro(derive_configurations) OR DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE" OR DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE" ) - AND DATACRUMBS_SCHEDULER_TYPE STREQUAL "NONE" + AND DATACRUMBS_LAUNCHER_TYPE STREQUAL "NONE" ) message( FATAL_ERROR - "[${UPPER_PROJECT_NAME}] Incomplete scheduler configuration. Either use a predefined scheduler option by setting DATACRUMBS_SCHEDULER_TYPE, or set all of the following variables: DATACRUMBS_SCHEDULER_ALLOC_CMD, DATACRUMBS_SCHEDULER_JOBID_ENV_VAR, DATACRUMBS_SCHEDULER_NODES_CMD_OPT, DATACRUMBS_SCHEDULER_PPN_CMD_OPT, DATACRUMBS_SCHEDULER_RUN_CMD" + "[${UPPER_PROJECT_NAME}] Incomplete scheduler configuration. Either use a predefined scheduler option by setting DATACRUMBS_LAUNCHER_TYPE, or set all of the following variables: DATACRUMBS_SCHEDULER_ALLOC_CMD, DATACRUMBS_SCHEDULER_JOBID_ENV_VAR, DATACRUMBS_SCHEDULER_NODES_CMD_OPT, DATACRUMBS_SCHEDULER_PPN_CMD_OPT, DATACRUMBS_SCHEDULER_RUN_CMD" ) endif() if(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + if(DATACRUMBS_LAUNCHER_TYPE STREQUAL "SLURM") set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "SLURM_JOB_ID") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "OPENMPI") set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "OMPI_COMM_WORLD_RANK") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "FLUX") set(DATACRUMBS_SCHEDULER_JOBID_ENV_VAR "FLUX_JOB_ID") endif() endif() if(DATACRUMBS_SCHEDULER_NODES_CMD_OPT STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + if(DATACRUMBS_LAUNCHER_TYPE STREQUAL "SLURM") set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "OPENMPI") set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "FLUX") set(DATACRUMBS_SCHEDULER_NODES_CMD_OPT "-N") endif() endif() if(DATACRUMBS_SCHEDULER_PPN_CMD_OPT STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + if(DATACRUMBS_LAUNCHER_TYPE STREQUAL "SLURM") set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--ntasks-per-node") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "OPENMPI") set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--map-by ppr:") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "FLUX") set(DATACRUMBS_SCHEDULER_PPN_CMD_OPT "--tasks-per-node") endif() endif() if(DATACRUMBS_SCHEDULER_RUN_CMD STREQUAL "NONE") - if(DATACRUMBS_SCHEDULER_TYPE STREQUAL "SLURM") + if(DATACRUMBS_LAUNCHER_TYPE STREQUAL "SLURM") set(DATACRUMBS_SCHEDULER_RUN_CMD "srun") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "OPENMPI") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "OPENMPI") set(DATACRUMBS_SCHEDULER_RUN_CMD "mpirun") - elseif(DATACRUMBS_SCHEDULER_TYPE STREQUAL "FLUX") + elseif(DATACRUMBS_LAUNCHER_TYPE STREQUAL "FLUX") set(DATACRUMBS_SCHEDULER_RUN_CMD "flux run") endif() endif() diff --git a/docs/build.rst b/docs/build.rst index db951567..13bab59a 100755 --- a/docs/build.rst +++ b/docs/build.rst @@ -433,7 +433,7 @@ The following table lists all available CMake configuration options: * - **Scheduler Integration** - - - * - ``DATACRUMBS_SCHEDULER_TYPE`` + * - ``DATACRUMBS_LAUNCHER_TYPE`` - ``FLUX`` - Job scheduler type for multi-node support. Values: ``FLUX``, ``SLURM``, ``OPENMPI``, ``NONE`` * - ``DATACRUMBS_SCHEDULER_JOBID_ENV_VAR`` @@ -503,7 +503,7 @@ Configuration Examples cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \ -DDATACRUMBS_HOST=tuolumne \ -DDATACRUMBS_USER=$USER \ - -DDATACRUMBS_SCHEDULER_TYPE=FLUX \ + -DDATACRUMBS_LAUNCHER_TYPE=FLUX \ -DDATACRUMBS_CONFIGURED_TRACE_DIR=/lustre/traces \ -DDATACRUMBS_CONFIGURED_LOG_DIR=/lustre/logs \ -DBPFTOOL_EXECUTABLE=$PREFIX/sbin/bpftool \ @@ -725,7 +725,7 @@ Configure CMake arguments: -DBPFTOOL_EXECUTABLE=$PREFIX/sbin/bpftool -DDATACRUMBS_HOST=tuolumne -DDATACRUMBS_USER=$USER - -DDATACRUMBS_SCHEDULER_TYPE=FLUX + -DDATACRUMBS_LAUNCHER_TYPE=FLUX -DDATACRUMBS_CONFIGURED_TRACE_DIR=/p/lustre1/$USER/traces -DDATACRUMBS_CONFIGURED_LOG_DIR=/p/lustre1/$USER/logs ) diff --git a/etc/datacrumbs/configs/project.env.local.in b/etc/datacrumbs/configs/project.env.local.in index b68d6a0f..e727eaab 100644 --- a/etc/datacrumbs/configs/project.env.local.in +++ b/etc/datacrumbs/configs/project.env.local.in @@ -49,7 +49,7 @@ export DATACRUMBS_TRACE_DIR_PATTERN=@DATACRUMBS_CONFIGURED_TRACE_DIR@/%YY%/%MM%/ readonly DATACRUMBS_TRACE_DIR_PATTERN # Job -export DATACRUMBS_JOB_SCHEDULER=@DATACRUMBS_SCHEDULER_TYPE@ +export DATACRUMBS_JOB_SCHEDULER=@DATACRUMBS_LAUNCHER_TYPE@ readonly DATACRUMBS_JOB_SCHEDULER export DATACRUMBS_JOB_RUN=@DATACRUMBS_SCHEDULER_RUN_CMD@ readonly DATACRUMBS_JOB_RUN diff --git a/scripts/datacrumbs/datacrumbs_logging.in b/scripts/datacrumbs/datacrumbs_logging.in index caddcedc..a93db94b 100755 --- a/scripts/datacrumbs/datacrumbs_logging.in +++ b/scripts/datacrumbs/datacrumbs_logging.in @@ -29,9 +29,9 @@ warn() { } log_system() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + elif [[ "@DATACRUMBS_LAUNCHER_TYPE@" == "SLURM" ]]; then logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" else logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" @@ -39,9 +39,9 @@ log_system() { } log_user() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then flux job raise --severity=7 ${FLUX_JOB_ID} "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + elif [[ "@DATACRUMBS_LAUNCHER_TYPE@" == "SLURM" ]]; then logger "[INFO $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" else logger "[INFO $(date '+%Y-%m-%d %H:%M:%S')] $@" @@ -49,9 +49,9 @@ log_user() { } warn_user() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then flux job raise --severity=1 ${FLUX_JOB_ID} "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + elif [[ "@DATACRUMBS_LAUNCHER_TYPE@" == "SLURM" ]]; then logger "[WARN $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" else logger "[WARN $(date '+%Y-%m-%d %H:%M:%S')] $@" @@ -59,9 +59,9 @@ warn_user() { } error_user() { - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then flux job raise --severity=1 ${FLUX_JOB_ID} "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${FLUX_JOB_ID}] $@" - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + elif [[ "@DATACRUMBS_LAUNCHER_TYPE@" == "SLURM" ]]; then logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S') ${SLURM_JOB_ID}] $@" else logger "[ERROR $(date '+%Y-%m-%d %H:%M:%S')] $@" diff --git a/scripts/datacrumbs/datacrumbs_service_common.sh.in b/scripts/datacrumbs/datacrumbs_service_common.sh.in index 883a78ad..98c9e595 100755 --- a/scripts/datacrumbs/datacrumbs_service_common.sh.in +++ b/scripts/datacrumbs/datacrumbs_service_common.sh.in @@ -51,9 +51,9 @@ function get_slurm_datacrumbs_enabled() { function get_datacrumbs_enabled() { local enabled="no" - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then enabled=$(get_flux_datacrumbs_enabled) - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + elif [[ "@DATACRUMBS_LAUNCHER_TYPE@" == "SLURM" ]]; then local slurm_job_comment=$(get_slurm_comment) log_system "Slurm comment: $slurm_job_comment" enabled=$(get_slurm_datacrumbs_enabled) @@ -106,9 +106,9 @@ function get_general_datacrumbs_composite_name() { function get_datacrumbs_composite_name() { local name=$(get_default_datacrumbs_composite_name) - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then name=$(get_flux_datacrumbs_composite_name) - elif [[ "@DATACRUMBS_SCHEDULER_TYPE@" == "SLURM" ]]; then + elif [[ "@DATACRUMBS_LAUNCHER_TYPE@" == "SLURM" ]]; then name=$(get_slurm_datacrumbs_composite_name) else name=$(get_general_datacrumbs_composite_name) diff --git a/scripts/datacrumbs/datacrumbs_setup.in b/scripts/datacrumbs/datacrumbs_setup.in index a9381dd4..b8987134 100755 --- a/scripts/datacrumbs/datacrumbs_setup.in +++ b/scripts/datacrumbs/datacrumbs_setup.in @@ -27,6 +27,9 @@ else fi fi +readonly DATACRUMBS_IS_ROOT +readonly DATACRUMBS_USER + if [[ "${DATACRUMBS_ENV_LOADED:-0}" == "0" ]]; then if command -v direnv &>/dev/null; then eval "$(direnv exec ${CONFIG_FILE%/*} bash -c 'source ${CONFIG_FILE}; env')" diff --git a/scripts/datacrumbs/datacrumbs_utility.in b/scripts/datacrumbs/datacrumbs_utility.in index d31ee639..80a6d122 100755 --- a/scripts/datacrumbs/datacrumbs_utility.in +++ b/scripts/datacrumbs/datacrumbs_utility.in @@ -234,11 +234,11 @@ function server_launch() { function get_actual_user() { local user=$(whoami) - if [[ "FLUX" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + if [[ "FLUX" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then if [[ -n "$FLUX_JOB_USERID" ]]; then user=$(id -nu $FLUX_JOB_USERID) fi - elif [[ "SLURM" == "@DATACRUMBS_SCHEDULER_TYPE@" ]]; then + elif [[ "SLURM" == "@DATACRUMBS_LAUNCHER_TYPE@" ]]; then if [[ -n "$SLURM_JOB_UID" ]]; then user=$(id -nu $SLURM_JOB_UID) fi diff --git a/src/datacrumbs/validator/probe_validator.cpp b/src/datacrumbs/validator/probe_validator.cpp index 4e2148d2..4f5c2121 100644 --- a/src/datacrumbs/validator/probe_validator.cpp +++ b/src/datacrumbs/validator/probe_validator.cpp @@ -50,7 +50,7 @@ void prettyPrintInvalidProbes( } std::cout << "\n"; - std::cout << "╔════════════════════════════════════════════════════════════════════════════╗\n"; + std::cout << "╔═══════════════════════════════════════════════════════════════════════════╗\n"; std::cout << "║ INVALID PROBES BY CATEGORY ║\n"; std::cout << "╚════════════════════════════════════════════════════════════════════════════╝\n";

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