From b3a3e37429bfce08a42ad92832da95d157fb36d1 Mon Sep 17 00:00:00 2001 From: langhuihui <178529795@qq.com> Date: Mon, 16 Dec 2024 20:06:39 +0800 Subject: [PATCH] feat: add pprof --- .github/FUNDING.yml | 13 + .github/workflows/go.yml | 96 + api.go | 113 +- go.mod | 1 + go.sum | 2 + goreleaser.yml | 24 + plugin/debug/index.go | 187 +- plugin/debug/pb/debug.pb.go | 709 ++++++ plugin/debug/pb/debug.pb.gw.go | 225 ++ plugin/debug/pb/debug.proto | 66 + plugin/debug/pb/debug_grpc.pb.go | 142 ++ plugin/debug/pkg/index.go | 17 + .../debug/pkg/internal/binutils/addr2liner.go | 238 ++ .../pkg/internal/binutils/addr2liner_llvm.go | 184 ++ .../pkg/internal/binutils/addr2liner_nm.go | 144 ++ .../debug/pkg/internal/binutils/binutils.go | 736 +++++++ .../pkg/internal/binutils/binutils_test.go | 978 +++++++++ plugin/debug/pkg/internal/binutils/disasm.go | 180 ++ .../pkg/internal/binutils/disasm_test.go | 160 ++ .../binutils/testdata/build_binaries.go | 94 + .../internal/binutils/testdata/exe_linux_64 | Bin 0 -> 9503 bytes .../pkg/internal/binutils/testdata/exe_mac_64 | Bin 0 -> 8648 bytes .../exe_mac_64.dSYM/Contents/Info.plist | 20 + .../Contents/Resources/DWARF/exe_mac_64 | Bin 0 -> 8840 bytes .../binutils/testdata/exe_windows_64.exe | Bin 0 -> 292456 bytes .../binutils/testdata/fake-llvm-symbolizer | 39 + .../pkg/internal/binutils/testdata/hello.c | 6 + .../pkg/internal/binutils/testdata/lib.c | 7 + .../pkg/internal/binutils/testdata/lib_mac_64 | Bin 0 -> 4496 bytes .../lib_mac_64.dSYM/Contents/Info.plist | 20 + .../Contents/Resources/DWARF/lib_mac_64 | Bin 0 -> 8934 bytes .../internal/binutils/testdata/malformed_elf | 1 + .../binutils/testdata/malformed_macho | 1 + plugin/debug/pkg/internal/driver/cli.go | 360 +++ plugin/debug/pkg/internal/driver/commands.go | 461 ++++ plugin/debug/pkg/internal/driver/config.go | 373 ++++ plugin/debug/pkg/internal/driver/driver.go | 408 ++++ .../debug/pkg/internal/driver/driver_focus.go | 219 ++ .../debug/pkg/internal/driver/driver_test.go | 1755 +++++++++++++++ plugin/debug/pkg/internal/driver/fetch.go | 622 ++++++ .../debug/pkg/internal/driver/fetch_test.go | 836 +++++++ plugin/debug/pkg/internal/driver/flags.go | 71 + .../debug/pkg/internal/driver/html/common.css | 279 +++ .../debug/pkg/internal/driver/html/common.js | 714 ++++++ .../debug/pkg/internal/driver/html/graph.css | 7 + .../debug/pkg/internal/driver/html/graph.html | 17 + .../pkg/internal/driver/html/header.html | 119 + .../pkg/internal/driver/html/plaintext.html | 18 + .../pkg/internal/driver/html/source.html | 72 + .../debug/pkg/internal/driver/html/stacks.css | 89 + .../pkg/internal/driver/html/stacks.html | 36 + .../debug/pkg/internal/driver/html/stacks.js | 638 ++++++ .../debug/pkg/internal/driver/html/top.html | 114 + .../debug/pkg/internal/driver/interactive.go | 422 ++++ .../pkg/internal/driver/interactive_test.go | 270 +++ plugin/debug/pkg/internal/driver/options.go | 100 + plugin/debug/pkg/internal/driver/settings.go | 158 ++ .../pkg/internal/driver/settings_test.go | 247 +++ plugin/debug/pkg/internal/driver/stacks.go | 60 + plugin/debug/pkg/internal/driver/svg.go | 80 + plugin/debug/pkg/internal/driver/tagroot.go | 133 ++ .../debug/pkg/internal/driver/tagroot_test.go | 385 ++++ plugin/debug/pkg/internal/driver/tempfile.go | 60 + .../pkg/internal/driver/tempfile_test.go | 55 + .../driver/testdata/cppbench.contention | 24 + .../pkg/internal/driver/testdata/cppbench.cpu | Bin 0 -> 24405 bytes .../testdata/cppbench.cpu_no_samples_type | Bin 0 -> 1705 bytes .../driver/testdata/cppbench.small.contention | 19 + .../pkg/internal/driver/testdata/file1000.src | 17 + .../pkg/internal/driver/testdata/file2000.src | 17 + .../pkg/internal/driver/testdata/file3000.src | 17 + .../pkg/internal/driver/testdata/go.crc32.cpu | Bin 0 -> 5032 bytes .../driver/testdata/go.nomappings.crash | Bin 0 -> 232 bytes .../testdata/pprof.contention.cum.files.dot | 10 + ...contention.flat.addresses.dot.focus.ignore | 9 + .../testdata/pprof.cpu.addresses.traces | 32 + .../testdata/pprof.cpu.call_tree.callgrind | 99 + .../driver/testdata/pprof.cpu.callgrind | 88 + .../driver/testdata/pprof.cpu.comments | 1 + .../pprof.cpu.cum.lines.text.focus.hide | 8 + .../testdata/pprof.cpu.cum.lines.text.hide | 7 + .../testdata/pprof.cpu.cum.lines.text.show | 7 + .../pprof.cpu.cum.lines.topproto.hide | 5 + .../pprof.cpu.cum.lines.tree.show_from | 16 + .../testdata/pprof.cpu.flat.addresses.disasm | 14 + .../pprof.cpu.flat.addresses.noinlines.text | 7 + .../testdata/pprof.cpu.flat.addresses.weblist | 101 + ...prof.cpu.flat.filefunctions.noinlines.text | 5 + .../pprof.cpu.flat.functions.call_tree.dot | 21 + .../testdata/pprof.cpu.flat.functions.dot | 20 + .../pprof.cpu.flat.functions.noinlines.text | 5 + .../testdata/pprof.cpu.flat.functions.text | 8 + .../driver/testdata/pprof.cpu.lines.topproto | 3 + .../internal/driver/testdata/pprof.cpu.peek | 13 + .../internal/driver/testdata/pprof.cpu.tags | 13 + .../testdata/pprof.cpu.tags.focus.ignore | 6 + .../internal/driver/testdata/pprof.cpu.traces | 32 + .../pprof.cpusmall.flat.addresses.tree | 17 + .../driver/testdata/pprof.heap.callgrind | 88 + .../driver/testdata/pprof.heap.comments | 2 + .../testdata/pprof.heap.cum.lines.tree.focus | 21 + ...f.heap.cum.relative_percentages.tree.focus | 21 + .../pprof.heap.flat.files.seconds.text | 2 + .../testdata/pprof.heap.flat.files.text | 5 + .../testdata/pprof.heap.flat.files.text.focus | 8 + .../pprof.heap.flat.inuse_objects.text | 8 + .../pprof.heap.flat.inuse_space.dot.focus | 13 + ...rof.heap.flat.inuse_space.dot.focus.ignore | 16 + .../testdata/pprof.heap.flat.lines.dot.focus | 21 + .../internal/driver/testdata/pprof.heap.tags | 6 + .../driver/testdata/pprof.heap.tags.unit | 6 + .../pprof.heap_alloc.flat.alloc_objects.text | 8 + .../pprof.heap_alloc.flat.alloc_space.dot | 14 + ...prof.heap_alloc.flat.alloc_space.dot.focus | 18 + ...pprof.heap_alloc.flat.alloc_space.dot.hide | 11 + .../testdata/pprof.heap_request.tags.focus | 8 + .../driver/testdata/pprof.heap_sizetags.dot | 30 + .../driver/testdata/pprof.heap_tags.traces | 32 + .../driver/testdata/pprof.long_name_funcs.dot | 9 + .../testdata/pprof.long_name_funcs.text | 5 + ...prof.unknown.flat.functions.call_tree.text | 8 + plugin/debug/pkg/internal/driver/webhtml.go | 85 + plugin/debug/pkg/internal/driver/webui.go | 483 ++++ .../debug/pkg/internal/driver/webui_test.go | 332 +++ plugin/debug/pkg/internal/elfexec/elfexec.go | 378 ++++ .../pkg/internal/elfexec/elfexec_test.go | 485 ++++ plugin/debug/pkg/internal/graph/dotgraph.go | 494 +++++ .../debug/pkg/internal/graph/dotgraph_test.go | 400 ++++ plugin/debug/pkg/internal/graph/graph.go | 1177 ++++++++++ plugin/debug/pkg/internal/graph/graph_test.go | 547 +++++ .../pkg/internal/graph/testdata/compose1.dot | 7 + .../pkg/internal/graph/testdata/compose2.dot | 7 + .../pkg/internal/graph/testdata/compose3.dot | 11 + .../pkg/internal/graph/testdata/compose4.dot | 4 + .../pkg/internal/graph/testdata/compose5.dot | 11 + .../pkg/internal/graph/testdata/compose6.dot | 7 + .../pkg/internal/graph/testdata/compose7.dot | 7 + .../pkg/internal/graph/testdata/compose9.dot | 7 + .../pkg/internal/measurement/measurement.go | 294 +++ .../internal/measurement/measurement_test.go | 76 + plugin/debug/pkg/internal/plugin/plugin.go | 218 ++ plugin/debug/pkg/internal/proftest/BUILD | 15 + .../debug/pkg/internal/proftest/proftest.go | 166 ++ .../pkg/internal/proftest/testdata/large.cpu | Bin 0 -> 1201687 bytes plugin/debug/pkg/internal/report/package.go | 17 + .../debug/pkg/internal/report/package_test.go | 52 + plugin/debug/pkg/internal/report/report.go | 1359 ++++++++++++ .../debug/pkg/internal/report/report_test.go | 617 ++++++ .../debug/pkg/internal/report/shortnames.go | 59 + .../pkg/internal/report/shortnames_test.go | 60 + plugin/debug/pkg/internal/report/source.go | 1117 ++++++++++ .../debug/pkg/internal/report/source_html.go | 71 + .../debug/pkg/internal/report/source_test.go | 288 +++ plugin/debug/pkg/internal/report/stacks.go | 220 ++ .../debug/pkg/internal/report/stacks_test.go | 240 ++ plugin/debug/pkg/internal/report/synth.go | 39 + .../debug/pkg/internal/report/synth_test.go | 36 + .../pkg/internal/report/testdata/README.md | 10 + .../pkg/internal/report/testdata/sample.bin | Bin 0 -> 2342380 bytes .../pkg/internal/report/testdata/sample.cpu | Bin 0 -> 1836 bytes .../internal/report/testdata/sample/sample.go | 55 + .../pkg/internal/report/testdata/source.dot | 17 + .../pkg/internal/report/testdata/source.rpt | 49 + .../pkg/internal/report/testdata/source1 | 19 + .../pkg/internal/report/testdata/source2 | 19 + .../pkg/internal/symbolizer/symbolizer.go | 350 +++ .../internal/symbolizer/symbolizer_test.go | 489 +++++ plugin/debug/pkg/internal/symbolz/symbolz.go | 196 ++ .../pkg/internal/symbolz/symbolz_test.go | 170 ++ .../debug/pkg/internal/transport/transport.go | 131 ++ plugin/debug/pkg/profile/encode.go | 596 +++++ plugin/debug/pkg/profile/filter.go | 274 +++ plugin/debug/pkg/profile/filter_test.go | 600 +++++ plugin/debug/pkg/profile/index.go | 64 + plugin/debug/pkg/profile/index_test.go | 114 + .../debug/pkg/profile/legacy_java_profile.go | 315 +++ plugin/debug/pkg/profile/legacy_profile.go | 1228 +++++++++++ .../debug/pkg/profile/legacy_profile_test.go | 321 +++ plugin/debug/pkg/profile/merge.go | 674 ++++++ plugin/debug/pkg/profile/merge_test.go | 506 +++++ plugin/debug/pkg/profile/profile.go | 869 ++++++++ plugin/debug/pkg/profile/profile_test.go | 1942 +++++++++++++++++ plugin/debug/pkg/profile/proto.go | 367 ++++ plugin/debug/pkg/profile/proto_test.go | 181 ++ plugin/debug/pkg/profile/prune.go | 194 ++ plugin/debug/pkg/profile/prune_test.go | 230 ++ .../pkg/profile/testdata/cppbench.contention | 24 + .../testdata/cppbench.contention.string | 65 + .../debug/pkg/profile/testdata/cppbench.cpu | Bin 0 -> 23631 bytes .../pkg/profile/testdata/cppbench.cpu.string | 179 ++ .../pkg/profile/testdata/cppbench.growth | 99 + .../profile/testdata/cppbench.growth.string | 248 +++ .../debug/pkg/profile/testdata/cppbench.heap | 47 + .../pkg/profile/testdata/cppbench.heap.string | 237 ++ .../pkg/profile/testdata/cppbench.thread | 29 + .../pkg/profile/testdata/cppbench.thread.all | 33 + .../testdata/cppbench.thread.all.string | 28 + .../pkg/profile/testdata/cppbench.thread.none | 27 + .../testdata/cppbench.thread.none.string | 50 + .../profile/testdata/cppbench.thread.string | 33 + .../debug/pkg/profile/testdata/go.crc32.cpu | Bin 0 -> 5032 bytes .../pkg/profile/testdata/go.crc32.cpu.string | 87 + .../pkg/profile/testdata/go.godoc.thread | 8 + .../profile/testdata/go.godoc.thread.string | 37 + plugin/debug/pkg/profile/testdata/gobench.cpu | Bin 0 -> 8248 bytes .../pkg/profile/testdata/gobench.cpu.string | 415 ++++ .../debug/pkg/profile/testdata/gobench.heap | 16 + .../pkg/profile/testdata/gobench.heap.string | 137 ++ .../pkg/profile/testdata/java.contention | 43 + .../profile/testdata/java.contention.string | 43 + plugin/debug/pkg/profile/testdata/java.cpu | Bin 0 -> 3537 bytes .../pkg/profile/testdata/java.cpu.string | 78 + plugin/debug/pkg/profile/testdata/java.heap | 133 ++ .../pkg/profile/testdata/java.heap.string | 139 ++ plugin/debug/pkg/third_party/svgpan/LICENSE | 27 + plugin/debug/pkg/third_party/svgpan/svgpan.go | 11 + plugin/debug/pkg/third_party/svgpan/svgpan.js | 261 +++ plugin/gb28181/api.go | 57 +- plugin/gb28181/pkg/transceiver.go | 7 + server.go | 4 +- 220 files changed, 36494 insertions(+), 56 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/go.yml create mode 100644 goreleaser.yml create mode 100644 plugin/debug/pb/debug.pb.go create mode 100644 plugin/debug/pb/debug.pb.gw.go create mode 100644 plugin/debug/pb/debug.proto create mode 100644 plugin/debug/pb/debug_grpc.pb.go create mode 100644 plugin/debug/pkg/index.go create mode 100644 plugin/debug/pkg/internal/binutils/addr2liner.go create mode 100644 plugin/debug/pkg/internal/binutils/addr2liner_llvm.go create mode 100644 plugin/debug/pkg/internal/binutils/addr2liner_nm.go create mode 100644 plugin/debug/pkg/internal/binutils/binutils.go create mode 100644 plugin/debug/pkg/internal/binutils/binutils_test.go create mode 100644 plugin/debug/pkg/internal/binutils/disasm.go create mode 100644 plugin/debug/pkg/internal/binutils/disasm_test.go create mode 100644 plugin/debug/pkg/internal/binutils/testdata/build_binaries.go create mode 100755 plugin/debug/pkg/internal/binutils/testdata/exe_linux_64 create mode 100755 plugin/debug/pkg/internal/binutils/testdata/exe_mac_64 create mode 100644 plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist create mode 100644 plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 create mode 100644 plugin/debug/pkg/internal/binutils/testdata/exe_windows_64.exe create mode 100755 plugin/debug/pkg/internal/binutils/testdata/fake-llvm-symbolizer create mode 100644 plugin/debug/pkg/internal/binutils/testdata/hello.c create mode 100644 plugin/debug/pkg/internal/binutils/testdata/lib.c create mode 100755 plugin/debug/pkg/internal/binutils/testdata/lib_mac_64 create mode 100644 plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist create mode 100644 plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 create mode 100644 plugin/debug/pkg/internal/binutils/testdata/malformed_elf create mode 100644 plugin/debug/pkg/internal/binutils/testdata/malformed_macho create mode 100644 plugin/debug/pkg/internal/driver/cli.go create mode 100644 plugin/debug/pkg/internal/driver/commands.go create mode 100644 plugin/debug/pkg/internal/driver/config.go create mode 100644 plugin/debug/pkg/internal/driver/driver.go create mode 100644 plugin/debug/pkg/internal/driver/driver_focus.go create mode 100644 plugin/debug/pkg/internal/driver/driver_test.go create mode 100644 plugin/debug/pkg/internal/driver/fetch.go create mode 100644 plugin/debug/pkg/internal/driver/fetch_test.go create mode 100644 plugin/debug/pkg/internal/driver/flags.go create mode 100644 plugin/debug/pkg/internal/driver/html/common.css create mode 100644 plugin/debug/pkg/internal/driver/html/common.js create mode 100644 plugin/debug/pkg/internal/driver/html/graph.css create mode 100644 plugin/debug/pkg/internal/driver/html/graph.html create mode 100644 plugin/debug/pkg/internal/driver/html/header.html create mode 100644 plugin/debug/pkg/internal/driver/html/plaintext.html create mode 100644 plugin/debug/pkg/internal/driver/html/source.html create mode 100644 plugin/debug/pkg/internal/driver/html/stacks.css create mode 100644 plugin/debug/pkg/internal/driver/html/stacks.html create mode 100644 plugin/debug/pkg/internal/driver/html/stacks.js create mode 100644 plugin/debug/pkg/internal/driver/html/top.html create mode 100644 plugin/debug/pkg/internal/driver/interactive.go create mode 100644 plugin/debug/pkg/internal/driver/interactive_test.go create mode 100644 plugin/debug/pkg/internal/driver/options.go create mode 100644 plugin/debug/pkg/internal/driver/settings.go create mode 100644 plugin/debug/pkg/internal/driver/settings_test.go create mode 100644 plugin/debug/pkg/internal/driver/stacks.go create mode 100644 plugin/debug/pkg/internal/driver/svg.go create mode 100644 plugin/debug/pkg/internal/driver/tagroot.go create mode 100644 plugin/debug/pkg/internal/driver/tagroot_test.go create mode 100644 plugin/debug/pkg/internal/driver/tempfile.go create mode 100644 plugin/debug/pkg/internal/driver/tempfile_test.go create mode 100644 plugin/debug/pkg/internal/driver/testdata/cppbench.contention create mode 100644 plugin/debug/pkg/internal/driver/testdata/cppbench.cpu create mode 100644 plugin/debug/pkg/internal/driver/testdata/cppbench.cpu_no_samples_type create mode 100644 plugin/debug/pkg/internal/driver/testdata/cppbench.small.contention create mode 100644 plugin/debug/pkg/internal/driver/testdata/file1000.src create mode 100644 plugin/debug/pkg/internal/driver/testdata/file2000.src create mode 100644 plugin/debug/pkg/internal/driver/testdata/file3000.src create mode 100644 plugin/debug/pkg/internal/driver/testdata/go.crc32.cpu create mode 100644 plugin/debug/pkg/internal/driver/testdata/go.nomappings.crash create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.contention.cum.files.dot create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.addresses.traces create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.call_tree.callgrind create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.callgrind create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.comments create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.hide create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.show create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.disasm create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.weblist create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.dot create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.lines.topproto create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.peek create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags.focus.ignore create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpu.traces create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.callgrind create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.comments create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.lines.tree.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.seconds.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_objects.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.lines.dot.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags.unit create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_request.tags.focus create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_sizetags.dot create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.heap_tags.traces create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.dot create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.text create mode 100644 plugin/debug/pkg/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text create mode 100644 plugin/debug/pkg/internal/driver/webhtml.go create mode 100644 plugin/debug/pkg/internal/driver/webui.go create mode 100644 plugin/debug/pkg/internal/driver/webui_test.go create mode 100644 plugin/debug/pkg/internal/elfexec/elfexec.go create mode 100644 plugin/debug/pkg/internal/elfexec/elfexec_test.go create mode 100644 plugin/debug/pkg/internal/graph/dotgraph.go create mode 100644 plugin/debug/pkg/internal/graph/dotgraph_test.go create mode 100644 plugin/debug/pkg/internal/graph/graph.go create mode 100644 plugin/debug/pkg/internal/graph/graph_test.go create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose1.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose2.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose3.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose4.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose5.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose6.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose7.dot create mode 100644 plugin/debug/pkg/internal/graph/testdata/compose9.dot create mode 100644 plugin/debug/pkg/internal/measurement/measurement.go create mode 100644 plugin/debug/pkg/internal/measurement/measurement_test.go create mode 100644 plugin/debug/pkg/internal/plugin/plugin.go create mode 100644 plugin/debug/pkg/internal/proftest/BUILD create mode 100644 plugin/debug/pkg/internal/proftest/proftest.go create mode 100644 plugin/debug/pkg/internal/proftest/testdata/large.cpu create mode 100644 plugin/debug/pkg/internal/report/package.go create mode 100644 plugin/debug/pkg/internal/report/package_test.go create mode 100644 plugin/debug/pkg/internal/report/report.go create mode 100644 plugin/debug/pkg/internal/report/report_test.go create mode 100644 plugin/debug/pkg/internal/report/shortnames.go create mode 100644 plugin/debug/pkg/internal/report/shortnames_test.go create mode 100644 plugin/debug/pkg/internal/report/source.go create mode 100644 plugin/debug/pkg/internal/report/source_html.go create mode 100644 plugin/debug/pkg/internal/report/source_test.go create mode 100644 plugin/debug/pkg/internal/report/stacks.go create mode 100644 plugin/debug/pkg/internal/report/stacks_test.go create mode 100644 plugin/debug/pkg/internal/report/synth.go create mode 100644 plugin/debug/pkg/internal/report/synth_test.go create mode 100644 plugin/debug/pkg/internal/report/testdata/README.md create mode 100755 plugin/debug/pkg/internal/report/testdata/sample.bin create mode 100644 plugin/debug/pkg/internal/report/testdata/sample.cpu create mode 100644 plugin/debug/pkg/internal/report/testdata/sample/sample.go create mode 100644 plugin/debug/pkg/internal/report/testdata/source.dot create mode 100644 plugin/debug/pkg/internal/report/testdata/source.rpt create mode 100644 plugin/debug/pkg/internal/report/testdata/source1 create mode 100644 plugin/debug/pkg/internal/report/testdata/source2 create mode 100644 plugin/debug/pkg/internal/symbolizer/symbolizer.go create mode 100644 plugin/debug/pkg/internal/symbolizer/symbolizer_test.go create mode 100644 plugin/debug/pkg/internal/symbolz/symbolz.go create mode 100644 plugin/debug/pkg/internal/symbolz/symbolz_test.go create mode 100644 plugin/debug/pkg/internal/transport/transport.go create mode 100644 plugin/debug/pkg/profile/encode.go create mode 100644 plugin/debug/pkg/profile/filter.go create mode 100644 plugin/debug/pkg/profile/filter_test.go create mode 100644 plugin/debug/pkg/profile/index.go create mode 100644 plugin/debug/pkg/profile/index_test.go create mode 100644 plugin/debug/pkg/profile/legacy_java_profile.go create mode 100644 plugin/debug/pkg/profile/legacy_profile.go create mode 100644 plugin/debug/pkg/profile/legacy_profile_test.go create mode 100644 plugin/debug/pkg/profile/merge.go create mode 100644 plugin/debug/pkg/profile/merge_test.go create mode 100644 plugin/debug/pkg/profile/profile.go create mode 100644 plugin/debug/pkg/profile/profile_test.go create mode 100644 plugin/debug/pkg/profile/proto.go create mode 100644 plugin/debug/pkg/profile/proto_test.go create mode 100644 plugin/debug/pkg/profile/prune.go create mode 100644 plugin/debug/pkg/profile/prune_test.go create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.contention create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.contention.string create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.cpu create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.cpu.string create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.growth create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.growth.string create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.heap create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.heap.string create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.thread create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.thread.all create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.thread.all.string create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.thread.none create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.thread.none.string create mode 100644 plugin/debug/pkg/profile/testdata/cppbench.thread.string create mode 100644 plugin/debug/pkg/profile/testdata/go.crc32.cpu create mode 100644 plugin/debug/pkg/profile/testdata/go.crc32.cpu.string create mode 100644 plugin/debug/pkg/profile/testdata/go.godoc.thread create mode 100644 plugin/debug/pkg/profile/testdata/go.godoc.thread.string create mode 100644 plugin/debug/pkg/profile/testdata/gobench.cpu create mode 100644 plugin/debug/pkg/profile/testdata/gobench.cpu.string create mode 100644 plugin/debug/pkg/profile/testdata/gobench.heap create mode 100644 plugin/debug/pkg/profile/testdata/gobench.heap.string create mode 100644 plugin/debug/pkg/profile/testdata/java.contention create mode 100644 plugin/debug/pkg/profile/testdata/java.contention.string create mode 100644 plugin/debug/pkg/profile/testdata/java.cpu create mode 100644 plugin/debug/pkg/profile/testdata/java.cpu.string create mode 100644 plugin/debug/pkg/profile/testdata/java.heap create mode 100644 plugin/debug/pkg/profile/testdata/java.heap.string create mode 100644 plugin/debug/pkg/third_party/svgpan/LICENSE create mode 100644 plugin/debug/pkg/third_party/svgpan/svgpan.go create mode 100644 plugin/debug/pkg/third_party/svgpan/svgpan.js diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..fcd1496b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: monibuca +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 00000000..714748a9 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,96 @@ +name: Go + +on: + push: + branches: + - v5 +env: + dest: bin +jobs: + + build: + runs-on: ubuntu-latest + steps: + + - uses: actions/checkout@v2 + with: + fetch-depth: 1 + + - name: Set up Env + run: echo "version=${GITHUB_REF:11}" >> $GITHUB_ENV + - name: Set beta + if: contains(env.version, 'beta') + run: echo "dest=beta" >> $GITHUB_ENV + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.23.4 + + - name: Cache Go modules + uses: actions/cache@v1 + with: + path: ~/go/pkg/mod + key: runner.os−go−{ { hashFiles('**/go.sum') } } + restore-keys: ${{ runner.os }}-go- + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + if: success() && startsWith(github.ref, 'refs/tags/') + with: + version: v1.8.3 + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # - name: Checkout m7s-import + # uses: actions/checkout@v3 + # with: + # repository: langhuihui/m7s-import + # path: m7s-import + # persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal access token. + # fetch-depth: 0 + + # - name: Add bin to m7s-import + # if: success() && startsWith(github.ref, 'refs/tags/') + # run: | + # cd m7s-import + # mkdir -p apps/m7s-website/src/public/bin + # cp ../dist/m7s_${{ env.version }}_windows_amd64.tar.gz apps/m7s-website/src/public/bin/m7s_windows_amd64.tar.gz + # cp ../dist/m7s_${{ env.version }}_darwin_amd64.tar.gz apps/m7s-website/src/public/bin/m7s_darwin_amd64.tar.gz + # cp ../dist/m7s_${{ env.version }}_darwin_arm64.tar.gz apps/m7s-website/src/public/bin/m7s_darwin_arm64.tar.gz + # cp ../dist/m7s_${{ env.version }}_linux_amd64.tar.gz apps/m7s-website/src/public/bin/m7s_linux_amd64.tar.gz + # cp ../dist/m7s_${{ env.version }}_linux_arm64.tar.gz apps/m7s-website/src/public/bin/m7s_linux_arm64.tar.gz + # ls apps/m7s-website/src/public/bin + - name: copy + if: success() && startsWith(github.ref, 'refs/tags/') + run: | + mkdir -p bin + cp dist/m7s_${{ env.version }}_windows_amd64.tar.gz bin/m7s_windows_amd64.tar.gz + cp dist/m7s_${{ env.version }}_darwin_amd64.tar.gz bin/m7s_darwin_amd64.tar.gz + cp dist/m7s_${{ env.version }}_darwin_arm64.tar.gz bin/m7s_darwin_arm64.tar.gz + cp dist/m7s_${{ env.version }}_linux_amd64.tar.gz bin/m7s_linux_amd64.tar.gz + cp dist/m7s_${{ env.version }}_linux_arm64.tar.gz bin/m7s_linux_arm64.tar.gz + ls bin + - uses: jakejarvis/s3-sync-action@master + # with: + # args: --acl public-read --follow-symlinks --delete + env: + AWS_S3_ENDPOINT: https://${{ secrets.R2_DOMAIN }} + AWS_ACCESS_KEY_ID: ${{ secrets.R2_KEY }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET }} + AWS_S3_BUCKET: monibuca + SOURCE_DIR: 'bin' + DEST_DIR: ${{ env.dest }} + - name: docker build + if: success() && startsWith(github.ref, 'refs/tags/') + run: | + tar -zxvf bin/m7s_linux_amd64.tar.gz + mv m7s monibuca_linux + docker login -u langhuihui -p ${{ secrets.DOCKER_PASSWORD }} + docker build -t langhuihui/monibuca:v5 . + docker push langhuihui/monibuca:v5 + - name: docker push + if: success() && !contains(env.version, 'beta') + run: | + docker tag langhuihui/monibuca:latest langhuihui/monibuca:${{ env.version }} + docker push langhuihui/monibuca:${{ env.version }} \ No newline at end of file diff --git a/api.go b/api.go index 6e082008..062e72a5 100644 --- a/api.go +++ b/api.go @@ -740,6 +740,28 @@ func (s *Server) AddPullProxy(ctx context.Context, req *pb.PullProxyInfo) (res * Description: req.Description, StreamPath: req.StreamPath, } + if device.Type == "" { + var u *url.URL + u, err = url.Parse(req.PullURL) + if err != nil { + s.Error("parse pull url failed", "error", err) + return + } + switch u.Scheme { + case "srt", "rtsp", "rtmp": + device.Type = u.Scheme + default: + ext := filepath.Ext(u.Path) + switch ext { + case ".m3u8": + device.Type = "hls" + case ".flv": + device.Type = "flv" + case ".mp4": + device.Type = "mp4" + } + } + } defaults.SetDefaults(&device.Pull) defaults.SetDefaults(&device.Record) device.URL = req.PullURL @@ -763,11 +785,36 @@ func (s *Server) UpdatePullProxy(ctx context.Context, req *pb.PullProxyInfo) (re return } target := &PullProxy{} - s.DB.First(target, req.ID) + err = s.DB.First(target, req.ID).Error + if err != nil { + return + } target.Name = req.Name target.URL = req.PullURL target.ParentID = uint(req.ParentID) target.Type = req.Type + if target.Type == "" { + var u *url.URL + u, err = url.Parse(req.PullURL) + if err != nil { + s.Error("parse pull url failed", "error", err) + return + } + switch u.Scheme { + case "srt", "rtsp", "rtmp": + target.Type = u.Scheme + default: + ext := filepath.Ext(u.Path) + switch ext { + case ".m3u8": + target.Type = "hls" + case ".flv": + target.Type = "flv" + case ".mp4": + target.Type = "mp4" + } + } + } target.PullOnStart = req.PullOnStart target.StopOnIdle = req.StopOnIdle target.Audio = req.Audio @@ -777,6 +824,24 @@ func (s *Server) UpdatePullProxy(ctx context.Context, req *pb.PullProxyInfo) (re target.RTT = time.Duration(int(req.Rtt)) * time.Millisecond target.StreamPath = req.StreamPath s.DB.Save(target) + s.PullProxies.Call(func() error { + if device, ok := s.PullProxies.Get(uint(req.ID)); ok { + if target.URL != device.URL || device.Audio != target.Audio || device.StreamPath != target.StreamPath || device.Record.FilePath != target.Record.FilePath || device.Record.Fragment != target.Record.Fragment { + device.Stop(task.ErrStopByUser) + device.WaitStopped() + s.PullProxies.Add(target) + return nil + } + if device.PullOnStart != target.PullOnStart && target.PullOnStart && device.Handler != nil && device.Status == PullProxyStatusOnline { + device.Handler.Pull() + } + device.Name = target.Name + device.PullOnStart = target.PullOnStart + device.StopOnIdle = target.StopOnIdle + device.Description = target.Description + } + return nil + }) res = &pb.SuccessResponse{} return } @@ -951,6 +1016,30 @@ func (s *Server) AddPushProxy(ctx context.Context, req *pb.PushProxyInfo) (res * Description: req.Description, StreamPath: req.StreamPath, } + + if device.Type == "" { + var u *url.URL + u, err = url.Parse(req.PushURL) + if err != nil { + s.Error("parse pull url failed", "error", err) + return + } + switch u.Scheme { + case "srt", "rtsp", "rtmp": + device.Type = u.Scheme + default: + ext := filepath.Ext(u.Path) + switch ext { + case ".m3u8": + device.Type = "hls" + case ".flv": + device.Type = "flv" + case ".mp4": + device.Type = "mp4" + } + } + } + defaults.SetDefaults(&device.Push) device.URL = req.PushURL device.Audio = req.Audio @@ -975,6 +1064,28 @@ func (s *Server) UpdatePushProxy(ctx context.Context, req *pb.PushProxyInfo) (re target.URL = req.PushURL target.ParentID = uint(req.ParentID) target.Type = req.Type + if target.Type == "" { + var u *url.URL + u, err = url.Parse(req.PushURL) + if err != nil { + s.Error("parse pull url failed", "error", err) + return + } + switch u.Scheme { + case "srt", "rtsp", "rtmp": + target.Type = u.Scheme + default: + ext := filepath.Ext(u.Path) + switch ext { + case ".m3u8": + target.Type = "hls" + case ".flv": + target.Type = "flv" + case ".mp4": + target.Type = "mp4" + } + } + } target.PushOnStart = req.PushOnStart target.Audio = req.Audio target.Description = req.Description diff --git a/go.mod b/go.mod index f44941f5..15b0ab1d 100644 --- a/go.mod +++ b/go.mod @@ -129,6 +129,7 @@ require ( github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect github.com/gorilla/websocket v1.5.1 + github.com/ianlancetaylor/demangle v0.0.0-20240912202439-0a2b6291aafd github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/phsym/console-slog v0.3.1 github.com/prometheus/client_golang v1.20.4 diff --git a/go.sum b/go.sum index c000afe4..aa39dd70 100644 --- a/go.sum +++ b/go.sum @@ -128,6 +128,8 @@ github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/husanpao/ip v0.0.0-20220711082147-73160bb611a8 h1:4Jk58quTZmzJcTrLlbB5L1Q6qXu49EIjCReWxcBFWKo= github.com/husanpao/ip v0.0.0-20220711082147-73160bb611a8/go.mod h1:medl9/CfYoQlqAXtAARmMW5dAX2UOdwwkhaszYPk0AM= +github.com/ianlancetaylor/demangle v0.0.0-20240912202439-0a2b6291aafd h1:EVX1s+XNss9jkRW9K6XGJn2jL2lB1h5H804oKPsxOec= +github.com/ianlancetaylor/demangle v0.0.0-20240912202439-0a2b6291aafd/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/icholy/digest v0.1.22 h1:dRIwCjtAcXch57ei+F0HSb5hmprL873+q7PoVojdMzM= github.com/icholy/digest v0.1.22/go.mod h1:uLAeDdWKIWNFMH0wqbwchbTQOmJWhzSnL7zmqSPqEEc= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= diff --git a/goreleaser.yml b/goreleaser.yml new file mode 100644 index 00000000..2cf62be0 --- /dev/null +++ b/goreleaser.yml @@ -0,0 +1,24 @@ +project_name: m7s +archives: + - + files: + - favicon.ico +builds: + - id: "all" + main: ./example/default/main.go + env: + - CGO_ENABLED=0 + tags: + - sqlite + ldflags: + - -s -w -X main.version={{.Tag}} + goos: + - linux + - windows + - darwin + goarch: + - arm64 + - amd64 + hooks: + pre: + - go mod tidy \ No newline at end of file diff --git a/plugin/debug/index.go b/plugin/debug/index.go index a4a7287f..976ffe84 100644 --- a/plugin/debug/index.go +++ b/plugin/debug/index.go @@ -1,23 +1,33 @@ package plugin_debug import ( - myproc "github.com/cloudwego/goref/pkg/proc" - "github.com/go-delve/delve/pkg/config" - "github.com/go-delve/delve/service/debugger" + "context" + "fmt" "io" - "m7s.live/v5" "net/http" "net/http/pprof" "os" + "runtime" runtimePPROF "runtime/pprof" + "sort" "strings" "time" + + myproc "github.com/cloudwego/goref/pkg/proc" + "github.com/go-delve/delve/pkg/config" + "github.com/go-delve/delve/service/debugger" + "google.golang.org/protobuf/types/known/emptypb" + "m7s.live/v5" + "m7s.live/v5/plugin/debug/pb" + debug "m7s.live/v5/plugin/debug/pkg" + "m7s.live/v5/plugin/debug/pkg/profile" ) -var _ = m7s.InstallPlugin[DebugPlugin]() +var _ = m7s.InstallPlugin[DebugPlugin](&pb.Api_ServiceDesc, pb.RegisterApiHandler) var conf, _ = config.LoadConfig() type DebugPlugin struct { + pb.UnimplementedApiServer m7s.Plugin ProfileDuration time.Duration `default:"10s" desc:"profile持续时间"` Profile string `desc:"采集profile存储文件"` @@ -114,3 +124,170 @@ func (p *DebugPlugin) Grf(w http.ResponseWriter, r *http.Request) { } w.Write([]byte("ok")) } + +func (p *DebugPlugin) GetHeap(ctx context.Context, empty *emptypb.Empty) (*pb.HeapResponse, error) { + // 创建临时文件用于存储堆信息 + f, err := os.CreateTemp("", "heap") + if err != nil { + return nil, err + } + defer os.Remove(f.Name()) + defer f.Close() + + // 获取堆信息 + runtime.GC() + if err := runtimePPROF.WriteHeapProfile(f); err != nil { + return nil, err + } + + // 读取堆信息 + f.Seek(0, 0) + prof, err := profile.Parse(f) + if err != nil { + return nil, err + } + + // 准备响应数据 + resp := &pb.HeapResponse{ + Data: &pb.HeapData{ + Stats: &pb.HeapStats{}, + Objects: make([]*pb.HeapObject, 0), + Edges: make([]*pb.HeapEdge, 0), + }, + } + + // 创建类型映射用于聚合统计 + typeMap := make(map[string]*pb.HeapObject) + var totalSize int64 + + // 处理每个样本 + for _, sample := range prof.Sample { + size := sample.Value[1] // 内存大小 + if size == 0 { + continue + } + + // 获取分配类型信息 + var typeName string + if len(sample.Location) > 0 && len(sample.Location[0].Line) > 0 { + if fn := sample.Location[0].Line[0].Function; fn != nil { + typeName = fn.Name + } + } + + // 创建或更新堆对象 + obj, exists := typeMap[typeName] + if !exists { + obj = &pb.HeapObject{ + Type: typeName, + Address: fmt.Sprintf("%p", sample), + Refs: make([]string, 0), + } + typeMap[typeName] = obj + resp.Data.Objects = append(resp.Data.Objects, obj) + } + + obj.Count++ + obj.Size += size + totalSize += size + + // 构建引用关系 + for i := 1; i < len(sample.Location); i++ { + loc := sample.Location[i] + if len(loc.Line) == 0 || loc.Line[0].Function == nil { + continue + } + + callerName := loc.Line[0].Function.Name + // 跳过系统函数 + if callerName == "" || strings.HasPrefix(callerName, "runtime.") { + continue + } + + // 添加边 + edge := &pb.HeapEdge{ + From: callerName, + To: typeName, + FieldName: callerName, + } + resp.Data.Edges = append(resp.Data.Edges, edge) + + // 将调用者添加到引用列表 + if !contains(obj.Refs, callerName) { + obj.Refs = append(obj.Refs, callerName) + } + } + } + + // 计算百分比 + for _, obj := range resp.Data.Objects { + if totalSize > 0 { + obj.SizePerc = float64(obj.Size) / float64(totalSize) * 100 + } + } + + // 按大小排序 + sort.Slice(resp.Data.Objects, func(i, j int) bool { + return resp.Data.Objects[i].Size > resp.Data.Objects[j].Size + }) + + // 获取运行时内存统计 + var ms runtime.MemStats + runtime.ReadMemStats(&ms) + + // 填充内存统计信息 + resp.Data.Stats.Alloc = ms.Alloc + resp.Data.Stats.TotalAlloc = ms.TotalAlloc + resp.Data.Stats.Sys = ms.Sys + resp.Data.Stats.NumGC = ms.NumGC + resp.Data.Stats.HeapAlloc = ms.HeapAlloc + resp.Data.Stats.HeapSys = ms.HeapSys + resp.Data.Stats.HeapIdle = ms.HeapIdle + resp.Data.Stats.HeapInuse = ms.HeapInuse + resp.Data.Stats.HeapReleased = ms.HeapReleased + resp.Data.Stats.HeapObjects = ms.HeapObjects + resp.Data.Stats.GcCPUFraction = ms.GCCPUFraction + + return resp, nil +} + +// 辅助函数:检查字符串切片是否包含特定字符串 +func contains(slice []string, str string) bool { + for _, s := range slice { + if s == str { + return true + } + } + return false +} + +func (p *DebugPlugin) GetHeapGraph(ctx context.Context, empty *emptypb.Empty) (*pb.HeapGraphResponse, error) { + // 创建临时文件用于存储堆信息 + f, err := os.CreateTemp("", "heap") + if err != nil { + return nil, err + } + defer os.Remove(f.Name()) + defer f.Close() + + // 获取堆信息 + runtime.GC() + if err := runtimePPROF.WriteHeapProfile(f); err != nil { + return nil, err + } + + // 读取堆信息 + f.Seek(0, 0) + profile, err := profile.Parse(f) + if err != nil { + return nil, err + } + // Generate dot graph. + dot, err := debug.GetDotGraph(profile) + if err != nil { + return nil, err + } + return &pb.HeapGraphResponse{ + Data: dot, + }, nil +} diff --git a/plugin/debug/pb/debug.pb.go b/plugin/debug/pb/debug.pb.go new file mode 100644 index 00000000..bfe8e907 --- /dev/null +++ b/plugin/debug/pb/debug.pb.go @@ -0,0 +1,709 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.19.1 +// source: debug.proto + +package pb + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + _ "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type HeapObject struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Count int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` + Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` + SizePerc float64 `protobuf:"fixed64,4,opt,name=sizePerc,proto3" json:"sizePerc,omitempty"` + Address string `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"` + Refs []string `protobuf:"bytes,6,rep,name=refs,proto3" json:"refs,omitempty"` +} + +func (x *HeapObject) Reset() { + *x = HeapObject{} + if protoimpl.UnsafeEnabled { + mi := &file_debug_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeapObject) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeapObject) ProtoMessage() {} + +func (x *HeapObject) ProtoReflect() protoreflect.Message { + mi := &file_debug_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeapObject.ProtoReflect.Descriptor instead. +func (*HeapObject) Descriptor() ([]byte, []int) { + return file_debug_proto_rawDescGZIP(), []int{0} +} + +func (x *HeapObject) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *HeapObject) GetCount() int64 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *HeapObject) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *HeapObject) GetSizePerc() float64 { + if x != nil { + return x.SizePerc + } + return 0 +} + +func (x *HeapObject) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *HeapObject) GetRefs() []string { + if x != nil { + return x.Refs + } + return nil +} + +type HeapStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Alloc uint64 `protobuf:"varint,1,opt,name=alloc,proto3" json:"alloc,omitempty"` + TotalAlloc uint64 `protobuf:"varint,2,opt,name=totalAlloc,proto3" json:"totalAlloc,omitempty"` + Sys uint64 `protobuf:"varint,3,opt,name=sys,proto3" json:"sys,omitempty"` + NumGC uint32 `protobuf:"varint,4,opt,name=numGC,proto3" json:"numGC,omitempty"` + HeapAlloc uint64 `protobuf:"varint,5,opt,name=heapAlloc,proto3" json:"heapAlloc,omitempty"` + HeapSys uint64 `protobuf:"varint,6,opt,name=heapSys,proto3" json:"heapSys,omitempty"` + HeapIdle uint64 `protobuf:"varint,7,opt,name=heapIdle,proto3" json:"heapIdle,omitempty"` + HeapInuse uint64 `protobuf:"varint,8,opt,name=heapInuse,proto3" json:"heapInuse,omitempty"` + HeapReleased uint64 `protobuf:"varint,9,opt,name=heapReleased,proto3" json:"heapReleased,omitempty"` + HeapObjects uint64 `protobuf:"varint,10,opt,name=heapObjects,proto3" json:"heapObjects,omitempty"` + GcCPUFraction float64 `protobuf:"fixed64,11,opt,name=gcCPUFraction,proto3" json:"gcCPUFraction,omitempty"` +} + +func (x *HeapStats) Reset() { + *x = HeapStats{} + if protoimpl.UnsafeEnabled { + mi := &file_debug_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeapStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeapStats) ProtoMessage() {} + +func (x *HeapStats) ProtoReflect() protoreflect.Message { + mi := &file_debug_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeapStats.ProtoReflect.Descriptor instead. +func (*HeapStats) Descriptor() ([]byte, []int) { + return file_debug_proto_rawDescGZIP(), []int{1} +} + +func (x *HeapStats) GetAlloc() uint64 { + if x != nil { + return x.Alloc + } + return 0 +} + +func (x *HeapStats) GetTotalAlloc() uint64 { + if x != nil { + return x.TotalAlloc + } + return 0 +} + +func (x *HeapStats) GetSys() uint64 { + if x != nil { + return x.Sys + } + return 0 +} + +func (x *HeapStats) GetNumGC() uint32 { + if x != nil { + return x.NumGC + } + return 0 +} + +func (x *HeapStats) GetHeapAlloc() uint64 { + if x != nil { + return x.HeapAlloc + } + return 0 +} + +func (x *HeapStats) GetHeapSys() uint64 { + if x != nil { + return x.HeapSys + } + return 0 +} + +func (x *HeapStats) GetHeapIdle() uint64 { + if x != nil { + return x.HeapIdle + } + return 0 +} + +func (x *HeapStats) GetHeapInuse() uint64 { + if x != nil { + return x.HeapInuse + } + return 0 +} + +func (x *HeapStats) GetHeapReleased() uint64 { + if x != nil { + return x.HeapReleased + } + return 0 +} + +func (x *HeapStats) GetHeapObjects() uint64 { + if x != nil { + return x.HeapObjects + } + return 0 +} + +func (x *HeapStats) GetGcCPUFraction() float64 { + if x != nil { + return x.GcCPUFraction + } + return 0 +} + +type HeapData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Stats *HeapStats `protobuf:"bytes,1,opt,name=stats,proto3" json:"stats,omitempty"` + Objects []*HeapObject `protobuf:"bytes,2,rep,name=objects,proto3" json:"objects,omitempty"` + Edges []*HeapEdge `protobuf:"bytes,3,rep,name=edges,proto3" json:"edges,omitempty"` +} + +func (x *HeapData) Reset() { + *x = HeapData{} + if protoimpl.UnsafeEnabled { + mi := &file_debug_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeapData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeapData) ProtoMessage() {} + +func (x *HeapData) ProtoReflect() protoreflect.Message { + mi := &file_debug_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeapData.ProtoReflect.Descriptor instead. +func (*HeapData) Descriptor() ([]byte, []int) { + return file_debug_proto_rawDescGZIP(), []int{2} +} + +func (x *HeapData) GetStats() *HeapStats { + if x != nil { + return x.Stats + } + return nil +} + +func (x *HeapData) GetObjects() []*HeapObject { + if x != nil { + return x.Objects + } + return nil +} + +func (x *HeapData) GetEdges() []*HeapEdge { + if x != nil { + return x.Edges + } + return nil +} + +type HeapEdge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + From string `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"` + To string `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"` + FieldName string `protobuf:"bytes,3,opt,name=fieldName,proto3" json:"fieldName,omitempty"` +} + +func (x *HeapEdge) Reset() { + *x = HeapEdge{} + if protoimpl.UnsafeEnabled { + mi := &file_debug_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeapEdge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeapEdge) ProtoMessage() {} + +func (x *HeapEdge) ProtoReflect() protoreflect.Message { + mi := &file_debug_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeapEdge.ProtoReflect.Descriptor instead. +func (*HeapEdge) Descriptor() ([]byte, []int) { + return file_debug_proto_rawDescGZIP(), []int{3} +} + +func (x *HeapEdge) GetFrom() string { + if x != nil { + return x.From + } + return "" +} + +func (x *HeapEdge) GetTo() string { + if x != nil { + return x.To + } + return "" +} + +func (x *HeapEdge) GetFieldName() string { + if x != nil { + return x.FieldName + } + return "" +} + +type HeapResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Data *HeapData `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *HeapResponse) Reset() { + *x = HeapResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_debug_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeapResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeapResponse) ProtoMessage() {} + +func (x *HeapResponse) ProtoReflect() protoreflect.Message { + mi := &file_debug_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeapResponse.ProtoReflect.Descriptor instead. +func (*HeapResponse) Descriptor() ([]byte, []int) { + return file_debug_proto_rawDescGZIP(), []int{4} +} + +func (x *HeapResponse) GetCode() uint32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *HeapResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *HeapResponse) GetData() *HeapData { + if x != nil { + return x.Data + } + return nil +} + +type HeapGraphResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *HeapGraphResponse) Reset() { + *x = HeapGraphResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_debug_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeapGraphResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeapGraphResponse) ProtoMessage() {} + +func (x *HeapGraphResponse) ProtoReflect() protoreflect.Message { + mi := &file_debug_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeapGraphResponse.ProtoReflect.Descriptor instead. +func (*HeapGraphResponse) Descriptor() ([]byte, []int) { + return file_debug_proto_rawDescGZIP(), []int{5} +} + +func (x *HeapGraphResponse) GetCode() uint32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *HeapGraphResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *HeapGraphResponse) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +var File_debug_proto protoreflect.FileDescriptor + +var file_debug_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x64, + 0x65, 0x62, 0x75, 0x67, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x94, 0x01, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x72, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x08, 0x73, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x72, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x22, 0xc7, 0x02, 0x0a, 0x09, 0x48, 0x65, 0x61, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x1e, 0x0a, 0x0a, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x79, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x6e, 0x75, 0x6d, 0x47, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x75, + 0x6d, 0x47, 0x43, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x6f, 0x63, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x68, 0x65, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x70, 0x53, 0x79, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x68, 0x65, 0x61, 0x70, 0x53, 0x79, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, + 0x65, 0x61, 0x70, 0x49, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x68, + 0x65, 0x61, 0x70, 0x49, 0x64, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x70, 0x49, + 0x6e, 0x75, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x68, 0x65, 0x61, 0x70, + 0x49, 0x6e, 0x75, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x70, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x68, 0x65, 0x61, + 0x70, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x65, 0x61, + 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x68, 0x65, 0x61, 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x67, + 0x63, 0x43, 0x50, 0x55, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0d, 0x67, 0x63, 0x43, 0x50, 0x55, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x86, 0x01, 0x0a, 0x08, 0x48, 0x65, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x48, 0x65, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, + 0x48, 0x65, 0x61, 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x48, 0x65, 0x61, 0x70, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x4c, 0x0a, 0x08, 0x48, 0x65, + 0x61, 0x70, 0x45, 0x64, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x61, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x48, 0x65, 0x61, + 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x55, 0x0a, 0x11, 0x48, + 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x32, 0xb7, 0x01, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, 0x4f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x48, 0x65, 0x61, 0x70, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x48, 0x65, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x68, 0x65, 0x61, 0x70, 0x12, 0x5f, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x48, 0x65, 0x61, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x48, 0x65, 0x61, 0x70, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x68, 0x65, 0x61, 0x70, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x42, 0x1d, 0x5a, 0x1b, + 0x6d, 0x37, 0x73, 0x2e, 0x6c, 0x69, 0x76, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_debug_proto_rawDescOnce sync.Once + file_debug_proto_rawDescData = file_debug_proto_rawDesc +) + +func file_debug_proto_rawDescGZIP() []byte { + file_debug_proto_rawDescOnce.Do(func() { + file_debug_proto_rawDescData = protoimpl.X.CompressGZIP(file_debug_proto_rawDescData) + }) + return file_debug_proto_rawDescData +} + +var file_debug_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_debug_proto_goTypes = []interface{}{ + (*HeapObject)(nil), // 0: debug.HeapObject + (*HeapStats)(nil), // 1: debug.HeapStats + (*HeapData)(nil), // 2: debug.HeapData + (*HeapEdge)(nil), // 3: debug.HeapEdge + (*HeapResponse)(nil), // 4: debug.HeapResponse + (*HeapGraphResponse)(nil), // 5: debug.HeapGraphResponse + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty +} +var file_debug_proto_depIdxs = []int32{ + 1, // 0: debug.HeapData.stats:type_name -> debug.HeapStats + 0, // 1: debug.HeapData.objects:type_name -> debug.HeapObject + 3, // 2: debug.HeapData.edges:type_name -> debug.HeapEdge + 2, // 3: debug.HeapResponse.data:type_name -> debug.HeapData + 6, // 4: debug.api.GetHeap:input_type -> google.protobuf.Empty + 6, // 5: debug.api.GetHeapGraph:input_type -> google.protobuf.Empty + 4, // 6: debug.api.GetHeap:output_type -> debug.HeapResponse + 5, // 7: debug.api.GetHeapGraph:output_type -> debug.HeapGraphResponse + 6, // [6:8] is the sub-list for method output_type + 4, // [4:6] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_debug_proto_init() } +func file_debug_proto_init() { + if File_debug_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_debug_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeapObject); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_debug_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeapStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_debug_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeapData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_debug_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeapEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_debug_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeapResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_debug_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeapGraphResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_debug_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_debug_proto_goTypes, + DependencyIndexes: file_debug_proto_depIdxs, + MessageInfos: file_debug_proto_msgTypes, + }.Build() + File_debug_proto = out.File + file_debug_proto_rawDesc = nil + file_debug_proto_goTypes = nil + file_debug_proto_depIdxs = nil +} diff --git a/plugin/debug/pb/debug.pb.gw.go b/plugin/debug/pb/debug.pb.gw.go new file mode 100644 index 00000000..65bbb15a --- /dev/null +++ b/plugin/debug/pb/debug.pb.gw.go @@ -0,0 +1,225 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: debug.proto + +/* +Package pb is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package pb + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/emptypb" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_Api_GetHeap_0(ctx context.Context, marshaler runtime.Marshaler, client ApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetHeap(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Api_GetHeap_0(ctx context.Context, marshaler runtime.Marshaler, server ApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetHeap(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Api_GetHeapGraph_0(ctx context.Context, marshaler runtime.Marshaler, client ApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetHeapGraph(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Api_GetHeapGraph_0(ctx context.Context, marshaler runtime.Marshaler, server ApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq emptypb.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetHeapGraph(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterApiHandlerServer registers the http handlers for service Api to "mux". +// UnaryRPC :call ApiServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterApiHandlerFromEndpoint instead. +func RegisterApiHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ApiServer) error { + + mux.Handle("GET", pattern_Api_GetHeap_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/debug.Api/GetHeap", runtime.WithHTTPPathPattern("/debug/api/heap")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Api_GetHeap_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_GetHeap_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Api_GetHeapGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/debug.Api/GetHeapGraph", runtime.WithHTTPPathPattern("/debug/api/heap/graph")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Api_GetHeapGraph_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_GetHeapGraph_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterApiHandlerFromEndpoint is same as RegisterApiHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterApiHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterApiHandler(ctx, mux, conn) +} + +// RegisterApiHandler registers the http handlers for service Api to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterApiHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterApiHandlerClient(ctx, mux, NewApiClient(conn)) +} + +// RegisterApiHandlerClient registers the http handlers for service Api +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ApiClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ApiClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ApiClient" to call the correct interceptors. +func RegisterApiHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ApiClient) error { + + mux.Handle("GET", pattern_Api_GetHeap_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/debug.Api/GetHeap", runtime.WithHTTPPathPattern("/debug/api/heap")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Api_GetHeap_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_GetHeap_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Api_GetHeapGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/debug.Api/GetHeapGraph", runtime.WithHTTPPathPattern("/debug/api/heap/graph")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Api_GetHeapGraph_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_GetHeapGraph_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Api_GetHeap_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"debug", "api", "heap"}, "")) + + pattern_Api_GetHeapGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"debug", "api", "heap", "graph"}, "")) +) + +var ( + forward_Api_GetHeap_0 = runtime.ForwardResponseMessage + + forward_Api_GetHeapGraph_0 = runtime.ForwardResponseMessage +) diff --git a/plugin/debug/pb/debug.proto b/plugin/debug/pb/debug.proto new file mode 100644 index 00000000..1d1b7657 --- /dev/null +++ b/plugin/debug/pb/debug.proto @@ -0,0 +1,66 @@ +syntax = "proto3"; +import "google/api/annotations.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; +package debug; +option go_package="m7s.live/v5/plugin/debug/pb"; + +service api { + rpc GetHeap (google.protobuf.Empty) returns (HeapResponse) { + option (google.api.http) = { + get: "/debug/api/heap" + }; + } + rpc GetHeapGraph (google.protobuf.Empty) returns (HeapGraphResponse) { + option (google.api.http) = { + get: "/debug/api/heap/graph" + }; + } +} + +message HeapObject { + string type = 1; + int64 count = 2; + int64 size = 3; + double sizePerc = 4; + string address = 5; + repeated string refs = 6; +} + +message HeapStats { + uint64 alloc = 1; + uint64 totalAlloc = 2; + uint64 sys = 3; + uint32 numGC = 4; + uint64 heapAlloc = 5; + uint64 heapSys = 6; + uint64 heapIdle = 7; + uint64 heapInuse = 8; + uint64 heapReleased = 9; + uint64 heapObjects = 10; + double gcCPUFraction = 11; +} + +message HeapData { + HeapStats stats = 1; + repeated HeapObject objects = 2; + repeated HeapEdge edges = 3; +} + +message HeapEdge { + string from = 1; + string to = 2; + string fieldName = 3; +} + +message HeapResponse { + uint32 code = 1; + string message = 2; + HeapData data = 3; +} + +message HeapGraphResponse { + uint32 code = 1; + string message = 2; + string data = 3; +} diff --git a/plugin/debug/pb/debug_grpc.pb.go b/plugin/debug/pb/debug_grpc.pb.go new file mode 100644 index 00000000..2cccf1fd --- /dev/null +++ b/plugin/debug/pb/debug_grpc.pb.go @@ -0,0 +1,142 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.19.1 +// source: debug.proto + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ApiClient is the client API for Api service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ApiClient interface { + GetHeap(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HeapResponse, error) + GetHeapGraph(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HeapGraphResponse, error) +} + +type apiClient struct { + cc grpc.ClientConnInterface +} + +func NewApiClient(cc grpc.ClientConnInterface) ApiClient { + return &apiClient{cc} +} + +func (c *apiClient) GetHeap(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HeapResponse, error) { + out := new(HeapResponse) + err := c.cc.Invoke(ctx, "/debug.api/GetHeap", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apiClient) GetHeapGraph(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HeapGraphResponse, error) { + out := new(HeapGraphResponse) + err := c.cc.Invoke(ctx, "/debug.api/GetHeapGraph", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ApiServer is the server API for Api service. +// All implementations must embed UnimplementedApiServer +// for forward compatibility +type ApiServer interface { + GetHeap(context.Context, *emptypb.Empty) (*HeapResponse, error) + GetHeapGraph(context.Context, *emptypb.Empty) (*HeapGraphResponse, error) + mustEmbedUnimplementedApiServer() +} + +// UnimplementedApiServer must be embedded to have forward compatible implementations. +type UnimplementedApiServer struct { +} + +func (UnimplementedApiServer) GetHeap(context.Context, *emptypb.Empty) (*HeapResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHeap not implemented") +} +func (UnimplementedApiServer) GetHeapGraph(context.Context, *emptypb.Empty) (*HeapGraphResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHeapGraph not implemented") +} +func (UnimplementedApiServer) mustEmbedUnimplementedApiServer() {} + +// UnsafeApiServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ApiServer will +// result in compilation errors. +type UnsafeApiServer interface { + mustEmbedUnimplementedApiServer() +} + +func RegisterApiServer(s grpc.ServiceRegistrar, srv ApiServer) { + s.RegisterService(&Api_ServiceDesc, srv) +} + +func _Api_GetHeap_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApiServer).GetHeap(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/debug.api/GetHeap", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApiServer).GetHeap(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Api_GetHeapGraph_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApiServer).GetHeapGraph(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/debug.api/GetHeapGraph", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApiServer).GetHeapGraph(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// Api_ServiceDesc is the grpc.ServiceDesc for Api service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Api_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "debug.api", + HandlerType: (*ApiServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetHeap", + Handler: _Api_GetHeap_Handler, + }, + { + MethodName: "GetHeapGraph", + Handler: _Api_GetHeapGraph_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "debug.proto", +} diff --git a/plugin/debug/pkg/index.go b/plugin/debug/pkg/index.go new file mode 100644 index 00000000..79a1ff2e --- /dev/null +++ b/plugin/debug/pkg/index.go @@ -0,0 +1,17 @@ +package debug + +import ( + "bytes" + + "m7s.live/v5/plugin/debug/pkg/internal/graph" + "m7s.live/v5/plugin/debug/pkg/internal/report" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func GetDotGraph(profile *profile.Profile) (string, error) { + rpt := report.NewDefault(profile, report.Options{}) + g, config := report.GetDOT(rpt) + dot := &bytes.Buffer{} + graph.ComposeDot(dot, g, &graph.DotAttributes{}, config) + return dot.String(), nil +} diff --git a/plugin/debug/pkg/internal/binutils/addr2liner.go b/plugin/debug/pkg/internal/binutils/addr2liner.go new file mode 100644 index 00000000..e0a9c135 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/addr2liner.go @@ -0,0 +1,238 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package binutils + +import ( + "bufio" + "fmt" + "io" + "os/exec" + "strconv" + "strings" + "sync" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +const ( + defaultAddr2line = "addr2line" + + // addr2line may produce multiple lines of output. We + // use this sentinel to identify the end of the output. + sentinel = ^uint64(0) +) + +// addr2Liner is a connection to an addr2line command for obtaining +// address and line number information from a binary. +type addr2Liner struct { + mu sync.Mutex + rw lineReaderWriter + base uint64 + + // nm holds an addr2Liner using nm tool. Certain versions of addr2line + // produce incomplete names due to + // https://sourceware.org/bugzilla/show_bug.cgi?id=17541. As a workaround, + // the names from nm are used when they look more complete. See addrInfo() + // code below for the exact heuristic. + nm *addr2LinerNM +} + +// lineReaderWriter is an interface to abstract the I/O to an addr2line +// process. It writes a line of input to the job, and reads its output +// one line at a time. +type lineReaderWriter interface { + write(string) error + readLine() (string, error) + close() +} + +type addr2LinerJob struct { + cmd *exec.Cmd + in io.WriteCloser + out *bufio.Reader +} + +func (a *addr2LinerJob) write(s string) error { + _, err := fmt.Fprint(a.in, s+"\n") + return err +} + +func (a *addr2LinerJob) readLine() (string, error) { + s, err := a.out.ReadString('\n') + if err != nil { + return "", err + } + return strings.TrimSpace(s), nil +} + +// close releases any resources used by the addr2liner object. +func (a *addr2LinerJob) close() { + a.in.Close() + a.cmd.Wait() +} + +// newAddr2Liner starts the given addr2liner command reporting +// information about the given executable file. If file is a shared +// library, base should be the address at which it was mapped in the +// program under consideration. +func newAddr2Liner(cmd, file string, base uint64) (*addr2Liner, error) { + if cmd == "" { + cmd = defaultAddr2line + } + + j := &addr2LinerJob{ + cmd: exec.Command(cmd, "-aif", "-e", file), + } + + var err error + if j.in, err = j.cmd.StdinPipe(); err != nil { + return nil, err + } + + outPipe, err := j.cmd.StdoutPipe() + if err != nil { + return nil, err + } + + j.out = bufio.NewReader(outPipe) + if err := j.cmd.Start(); err != nil { + return nil, err + } + + a := &addr2Liner{ + rw: j, + base: base, + } + + return a, nil +} + +// readFrame parses the addr2line output for a single address. It +// returns a populated plugin.Frame and whether it has reached the end of the +// data. +func (d *addr2Liner) readFrame() (plugin.Frame, bool) { + funcname, err := d.rw.readLine() + if err != nil { + return plugin.Frame{}, true + } + if strings.HasPrefix(funcname, "0x") { + // If addr2line returns a hex address we can assume it is the + // sentinel. Read and ignore next two lines of output from + // addr2line + d.rw.readLine() + d.rw.readLine() + return plugin.Frame{}, true + } + + fileline, err := d.rw.readLine() + if err != nil { + return plugin.Frame{}, true + } + + linenumber := 0 + + if funcname == "??" { + funcname = "" + } + + if fileline == "??:0" { + fileline = "" + } else { + if i := strings.LastIndex(fileline, ":"); i >= 0 { + // Remove discriminator, if present + if disc := strings.Index(fileline, " (discriminator"); disc > 0 { + fileline = fileline[:disc] + } + // If we cannot parse a number after the last ":", keep it as + // part of the filename. + if line, err := strconv.Atoi(fileline[i+1:]); err == nil { + linenumber = line + fileline = fileline[:i] + } + } + } + + return plugin.Frame{ + Func: funcname, + File: fileline, + Line: linenumber}, false +} + +func (d *addr2Liner) rawAddrInfo(addr uint64) ([]plugin.Frame, error) { + d.mu.Lock() + defer d.mu.Unlock() + + if err := d.rw.write(fmt.Sprintf("%x", addr-d.base)); err != nil { + return nil, err + } + + if err := d.rw.write(fmt.Sprintf("%x", sentinel)); err != nil { + return nil, err + } + + resp, err := d.rw.readLine() + if err != nil { + return nil, err + } + + if !strings.HasPrefix(resp, "0x") { + return nil, fmt.Errorf("unexpected addr2line output: %s", resp) + } + + var stack []plugin.Frame + for { + frame, end := d.readFrame() + if end { + break + } + + if frame != (plugin.Frame{}) { + stack = append(stack, frame) + } + } + return stack, err +} + +// addrInfo returns the stack frame information for a specific program +// address. It returns nil if the address could not be identified. +func (d *addr2Liner) addrInfo(addr uint64) ([]plugin.Frame, error) { + stack, err := d.rawAddrInfo(addr) + if err != nil { + return nil, err + } + + // Certain versions of addr2line produce incomplete names due to + // https://sourceware.org/bugzilla/show_bug.cgi?id=17541. Attempt to replace + // the name with a better one from nm. + if len(stack) > 0 && d.nm != nil { + nm, err := d.nm.addrInfo(addr) + if err == nil && len(nm) > 0 { + // Last entry in frame list should match since it is non-inlined. As a + // simple heuristic, we only switch to the nm-based name if it is longer + // by 2 or more characters. We consider nm names that are longer by 1 + // character insignificant to avoid replacing foo with _foo on MacOS (for + // unknown reasons read2line produces the former and nm produces the + // latter on MacOS even though both tools are asked to produce mangled + // names). + nmName := nm[len(nm)-1].Func + a2lName := stack[len(stack)-1].Func + if len(nmName) > len(a2lName)+1 { + stack[len(stack)-1].Func = nmName + } + } + } + + return stack, nil +} diff --git a/plugin/debug/pkg/internal/binutils/addr2liner_llvm.go b/plugin/debug/pkg/internal/binutils/addr2liner_llvm.go new file mode 100644 index 00000000..2a54c645 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/addr2liner_llvm.go @@ -0,0 +1,184 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package binutils + +import ( + "bufio" + "encoding/json" + "fmt" + "io" + "os/exec" + "strconv" + "strings" + "sync" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +const ( + defaultLLVMSymbolizer = "llvm-symbolizer" +) + +// llvmSymbolizer is a connection to an llvm-symbolizer command for +// obtaining address and line number information from a binary. +type llvmSymbolizer struct { + sync.Mutex + filename string + rw lineReaderWriter + base uint64 + isData bool +} + +type llvmSymbolizerJob struct { + cmd *exec.Cmd + in io.WriteCloser + out *bufio.Reader + // llvm-symbolizer requires the symbol type, CODE or DATA, for symbolization. + symType string +} + +func (a *llvmSymbolizerJob) write(s string) error { + _, err := fmt.Fprintln(a.in, a.symType, s) + return err +} + +func (a *llvmSymbolizerJob) readLine() (string, error) { + s, err := a.out.ReadString('\n') + if err != nil { + return "", err + } + return strings.TrimSpace(s), nil +} + +// close releases any resources used by the llvmSymbolizer object. +func (a *llvmSymbolizerJob) close() { + a.in.Close() + a.cmd.Wait() +} + +// newLLVMSymbolizer starts the given llvmSymbolizer command reporting +// information about the given executable file. If file is a shared +// library, base should be the address at which it was mapped in the +// program under consideration. +func newLLVMSymbolizer(cmd, file string, base uint64, isData bool) (*llvmSymbolizer, error) { + if cmd == "" { + cmd = defaultLLVMSymbolizer + } + + j := &llvmSymbolizerJob{ + cmd: exec.Command(cmd, "--inlining", "-demangle=false", "--output-style=JSON"), + symType: "CODE", + } + if isData { + j.symType = "DATA" + } + + var err error + if j.in, err = j.cmd.StdinPipe(); err != nil { + return nil, err + } + + outPipe, err := j.cmd.StdoutPipe() + if err != nil { + return nil, err + } + + j.out = bufio.NewReader(outPipe) + if err := j.cmd.Start(); err != nil { + return nil, err + } + + a := &llvmSymbolizer{ + filename: file, + rw: j, + base: base, + isData: isData, + } + + return a, nil +} + +// readDataFrames parses the llvm-symbolizer DATA output for a single address. It +// returns a populated plugin.Frame array with a single entry. +func (d *llvmSymbolizer) readDataFrames() ([]plugin.Frame, error) { + line, err := d.rw.readLine() + if err != nil { + return nil, err + } + var frame struct { + Address string `json:"Address"` + ModuleName string `json:"ModuleName"` + Data struct { + Start string `json:"Start"` + Size string `json:"Size"` + Name string `json:"Name"` + } `json:"Data"` + } + if err := json.Unmarshal([]byte(line), &frame); err != nil { + return nil, err + } + // Match non-JSON output behaviour of stuffing the start/size into the filename of a single frame, + // with the size being a decimal value. + size, err := strconv.ParseInt(frame.Data.Size, 0, 0) + if err != nil { + return nil, err + } + var stack []plugin.Frame + stack = append(stack, plugin.Frame{Func: frame.Data.Name, File: fmt.Sprintf("%s %d", frame.Data.Start, size)}) + return stack, nil +} + +// readCodeFrames parses the llvm-symbolizer CODE output for a single address. It +// returns a populated plugin.Frame array. +func (d *llvmSymbolizer) readCodeFrames() ([]plugin.Frame, error) { + line, err := d.rw.readLine() + if err != nil { + return nil, err + } + var frame struct { + Address string `json:"Address"` + ModuleName string `json:"ModuleName"` + Symbol []struct { + Line int `json:"Line"` + Column int `json:"Column"` + FunctionName string `json:"FunctionName"` + FileName string `json:"FileName"` + StartLine int `json:"StartLine"` + } `json:"Symbol"` + } + if err := json.Unmarshal([]byte(line), &frame); err != nil { + return nil, err + } + var stack []plugin.Frame + for _, s := range frame.Symbol { + stack = append(stack, plugin.Frame{Func: s.FunctionName, File: s.FileName, Line: s.Line, Column: s.Column, StartLine: s.StartLine}) + } + return stack, nil +} + +// addrInfo returns the stack frame information for a specific program +// address. It returns nil if the address could not be identified. +func (d *llvmSymbolizer) addrInfo(addr uint64) ([]plugin.Frame, error) { + d.Lock() + defer d.Unlock() + + if err := d.rw.write(fmt.Sprintf("%s 0x%x", d.filename, addr-d.base)); err != nil { + return nil, err + } + if d.isData { + return d.readDataFrames() + } + return d.readCodeFrames() +} diff --git a/plugin/debug/pkg/internal/binutils/addr2liner_nm.go b/plugin/debug/pkg/internal/binutils/addr2liner_nm.go new file mode 100644 index 00000000..b916ed69 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/addr2liner_nm.go @@ -0,0 +1,144 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package binutils + +import ( + "bufio" + "bytes" + "io" + "os/exec" + "strconv" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +const ( + defaultNM = "nm" +) + +// addr2LinerNM is a connection to an nm command for obtaining symbol +// information from a binary. +type addr2LinerNM struct { + m []symbolInfo // Sorted list of symbol addresses from binary. +} + +type symbolInfo struct { + address uint64 + size uint64 + name string + symType string +} + +// isData returns if the symbol has a known data object symbol type. +func (s *symbolInfo) isData() bool { + // The following symbol types are taken from https://linux.die.net/man/1/nm: + // Lowercase letter means local symbol, uppercase denotes a global symbol. + // - b or B: the symbol is in the uninitialized data section, e.g. .bss; + // - d or D: the symbol is in the initialized data section; + // - r or R: the symbol is in a read only data section; + // - v or V: the symbol is a weak object; + // - W: the symbol is a weak symbol that has not been specifically tagged as a + // weak object symbol. Experiments with some binaries, showed these to be + // mostly data objects. + return strings.ContainsAny(s.symType, "bBdDrRvVW") +} + +// newAddr2LinerNM starts the given nm command reporting information about the +// given executable file. If file is a shared library, base should be the +// address at which it was mapped in the program under consideration. +func newAddr2LinerNM(cmd, file string, base uint64) (*addr2LinerNM, error) { + if cmd == "" { + cmd = defaultNM + } + var b bytes.Buffer + c := exec.Command(cmd, "--numeric-sort", "--print-size", "--format=posix", file) + c.Stdout = &b + if err := c.Run(); err != nil { + return nil, err + } + return parseAddr2LinerNM(base, &b) +} + +func parseAddr2LinerNM(base uint64, nm io.Reader) (*addr2LinerNM, error) { + a := &addr2LinerNM{ + m: []symbolInfo{}, + } + + // Parse nm output and populate symbol map. + // Skip lines we fail to parse. + buf := bufio.NewReader(nm) + for { + line, err := buf.ReadString('\n') + if line == "" && err != nil { + if err == io.EOF { + break + } + return nil, err + } + line = strings.TrimSpace(line) + fields := strings.Split(line, " ") + if len(fields) != 4 { + continue + } + address, err := strconv.ParseUint(fields[2], 16, 64) + if err != nil { + continue + } + size, err := strconv.ParseUint(fields[3], 16, 64) + if err != nil { + continue + } + a.m = append(a.m, symbolInfo{ + address: address + base, + size: size, + name: fields[0], + symType: fields[1], + }) + } + + return a, nil +} + +// addrInfo returns the stack frame information for a specific program +// address. It returns nil if the address could not be identified. +func (a *addr2LinerNM) addrInfo(addr uint64) ([]plugin.Frame, error) { + if len(a.m) == 0 || addr < a.m[0].address || addr >= (a.m[len(a.m)-1].address+a.m[len(a.m)-1].size) { + return nil, nil + } + + // Binary search. Search until low, high are separated by 1. + low, high := 0, len(a.m) + for low+1 < high { + mid := (low + high) / 2 + v := a.m[mid].address + if addr == v { + low = mid + break + } else if addr > v { + low = mid + } else { + high = mid + } + } + + // Address is between a.m[low] and a.m[high]. Pick low, as it represents + // [low, high). For data symbols, we use a strict check that the address is in + // the [start, start + size) range of a.m[low]. + if a.m[low].isData() && addr >= (a.m[low].address+a.m[low].size) { + return nil, nil + } + return []plugin.Frame{{Func: a.m[low].name}}, nil +} diff --git a/plugin/debug/pkg/internal/binutils/binutils.go b/plugin/debug/pkg/internal/binutils/binutils.go new file mode 100644 index 00000000..2fc31acb --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/binutils.go @@ -0,0 +1,736 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package binutils provides access to the GNU binutils. +package binutils + +import ( + "debug/elf" + "debug/macho" + "debug/pe" + "encoding/binary" + "errors" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "strconv" + "strings" + "sync" + + "m7s.live/v5/plugin/debug/pkg/internal/elfexec" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +// A Binutils implements plugin.ObjTool by invoking the GNU binutils. +type Binutils struct { + mu sync.Mutex + rep *binrep +} + +var ( + objdumpLLVMVerRE = regexp.MustCompile(`LLVM version (?:(\d*)\.(\d*)\.(\d*)|.*(trunk).*)`) + + // Defined for testing + elfOpen = elf.Open +) + +// binrep is an immutable representation for Binutils. It is atomically +// replaced on every mutation to provide thread-safe access. +type binrep struct { + // Commands to invoke. + llvmSymbolizer string + llvmSymbolizerFound bool + addr2line string + addr2lineFound bool + nm string + nmFound bool + objdump string + objdumpFound bool + isLLVMObjdump bool + + // if fast, perform symbolization using nm (symbol names only), + // instead of file-line detail from the slower addr2line. + fast bool +} + +// get returns the current representation for bu, initializing it if necessary. +func (bu *Binutils) get() *binrep { + bu.mu.Lock() + r := bu.rep + if r == nil { + r = &binrep{} + initTools(r, "") + bu.rep = r + } + bu.mu.Unlock() + return r +} + +// update modifies the rep for bu via the supplied function. +func (bu *Binutils) update(fn func(r *binrep)) { + r := &binrep{} + bu.mu.Lock() + defer bu.mu.Unlock() + if bu.rep == nil { + initTools(r, "") + } else { + *r = *bu.rep + } + fn(r) + bu.rep = r +} + +// String returns string representation of the binutils state for debug logging. +func (bu *Binutils) String() string { + r := bu.get() + var llvmSymbolizer, addr2line, nm, objdump string + if r.llvmSymbolizerFound { + llvmSymbolizer = r.llvmSymbolizer + } + if r.addr2lineFound { + addr2line = r.addr2line + } + if r.nmFound { + nm = r.nm + } + if r.objdumpFound { + objdump = r.objdump + } + return fmt.Sprintf("llvm-symbolizer=%q addr2line=%q nm=%q objdump=%q fast=%t", + llvmSymbolizer, addr2line, nm, objdump, r.fast) +} + +// SetFastSymbolization sets a toggle that makes binutils use fast +// symbolization (using nm), which is much faster than addr2line but +// provides only symbol name information (no file/line). +func (bu *Binutils) SetFastSymbolization(fast bool) { + bu.update(func(r *binrep) { r.fast = fast }) +} + +// SetTools processes the contents of the tools option. It +// expects a set of entries separated by commas; each entry is a pair +// of the form t:path, where cmd will be used to look only for the +// tool named t. If t is not specified, the path is searched for all +// tools. +func (bu *Binutils) SetTools(config string) { + bu.update(func(r *binrep) { initTools(r, config) }) +} + +func initTools(b *binrep, config string) { + // paths collect paths per tool; Key "" contains the default. + paths := make(map[string][]string) + for _, t := range strings.Split(config, ",") { + name, path := "", t + if ct := strings.SplitN(t, ":", 2); len(ct) == 2 { + name, path = ct[0], ct[1] + } + paths[name] = append(paths[name], path) + } + + defaultPath := paths[""] + b.llvmSymbolizer, b.llvmSymbolizerFound = chooseExe([]string{"llvm-symbolizer"}, []string{}, append(paths["llvm-symbolizer"], defaultPath...)) + b.addr2line, b.addr2lineFound = chooseExe([]string{"addr2line"}, []string{"gaddr2line"}, append(paths["addr2line"], defaultPath...)) + // The "-n" option is supported by LLVM since 2011. The output of llvm-nm + // and GNU nm with "-n" option is interchangeable for our purposes, so we do + // not need to differrentiate them. + b.nm, b.nmFound = chooseExe([]string{"llvm-nm", "nm"}, []string{"gnm"}, append(paths["nm"], defaultPath...)) + b.objdump, b.objdumpFound, b.isLLVMObjdump = findObjdump(append(paths["objdump"], defaultPath...)) +} + +// findObjdump finds and returns path to preferred objdump binary. +// Order of preference is: llvm-objdump, objdump. +// On MacOS only, also looks for gobjdump with least preference. +// Accepts a list of paths and returns: +// a string with path to the preferred objdump binary if found, +// or an empty string if not found; +// a boolean if any acceptable objdump was found; +// a boolean indicating if it is an LLVM objdump. +func findObjdump(paths []string) (string, bool, bool) { + objdumpNames := []string{"llvm-objdump", "objdump"} + if runtime.GOOS == "darwin" { + objdumpNames = append(objdumpNames, "gobjdump") + } + + for _, objdumpName := range objdumpNames { + if objdump, objdumpFound := findExe(objdumpName, paths); objdumpFound { + cmdOut, err := exec.Command(objdump, "--version").Output() + if err != nil { + continue + } + if isLLVMObjdump(string(cmdOut)) { + return objdump, true, true + } + if isBuObjdump(string(cmdOut)) { + return objdump, true, false + } + } + } + return "", false, false +} + +// chooseExe finds and returns path to preferred binary. names is a list of +// names to search on both Linux and OSX. osxNames is a list of names specific +// to OSX. names always has a higher priority than osxNames. The order of +// the name within each list decides its priority (e.g. the first name has a +// higher priority than the second name in the list). +// +// It returns a string with path to the binary and a boolean indicating if any +// acceptable binary was found. +func chooseExe(names, osxNames []string, paths []string) (string, bool) { + if runtime.GOOS == "darwin" { + names = append(names, osxNames...) + } + for _, name := range names { + if binary, found := findExe(name, paths); found { + return binary, true + } + } + return "", false +} + +// isLLVMObjdump accepts a string with path to an objdump binary, +// and returns a boolean indicating if the given binary is an LLVM +// objdump binary of an acceptable version. +func isLLVMObjdump(output string) bool { + fields := objdumpLLVMVerRE.FindStringSubmatch(output) + if len(fields) != 5 { + return false + } + if fields[4] == "trunk" { + return true + } + verMajor, err := strconv.Atoi(fields[1]) + if err != nil { + return false + } + verPatch, err := strconv.Atoi(fields[3]) + if err != nil { + return false + } + if runtime.GOOS == "linux" && verMajor >= 8 { + // Ensure LLVM objdump is at least version 8.0 on Linux. + // Some flags, like --demangle, and double dashes for options are + // not supported by previous versions. + return true + } + if runtime.GOOS == "darwin" { + // Ensure LLVM objdump is at least version 10.0.1 on MacOS. + return verMajor > 10 || (verMajor == 10 && verPatch >= 1) + } + return false +} + +// isBuObjdump accepts a string with path to an objdump binary, +// and returns a boolean indicating if the given binary is a GNU +// binutils objdump binary. No version check is performed. +func isBuObjdump(output string) bool { + return strings.Contains(output, "GNU objdump") +} + +// findExe looks for an executable command on a set of paths. +// If it cannot find it, returns cmd. +func findExe(cmd string, paths []string) (string, bool) { + for _, p := range paths { + cp := filepath.Join(p, cmd) + if c, err := exec.LookPath(cp); err == nil { + return c, true + } + } + return cmd, false +} + +// Disasm returns the assembly instructions for the specified address range +// of a binary. +func (bu *Binutils) Disasm(file string, start, end uint64, intelSyntax bool) ([]plugin.Inst, error) { + b := bu.get() + if !b.objdumpFound { + return nil, errors.New("cannot disasm: no objdump tool available") + } + args := []string{"--disassemble", "--demangle", "--no-show-raw-insn", + "--line-numbers", fmt.Sprintf("--start-address=%#x", start), + fmt.Sprintf("--stop-address=%#x", end)} + + if intelSyntax { + if b.isLLVMObjdump { + args = append(args, "--x86-asm-syntax=intel") + } else { + args = append(args, "-M", "intel") + } + } + + args = append(args, file) + cmd := exec.Command(b.objdump, args...) + out, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("%v: %v", cmd.Args, err) + } + + return disassemble(out) +} + +// Open satisfies the plugin.ObjTool interface. +func (bu *Binutils) Open(name string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { + b := bu.get() + + // Make sure file is a supported executable. + // This uses magic numbers, mainly to provide better error messages but + // it should also help speed. + + if _, err := os.Stat(name); err != nil { + // For testing, do not require file name to exist. + if strings.Contains(b.addr2line, "testdata/") { + return &fileAddr2Line{file: file{b: b, name: name}}, nil + } + return nil, err + } + + // Read the first 4 bytes of the file. + + f, err := os.Open(name) + if err != nil { + return nil, fmt.Errorf("error opening %s: %v", name, err) + } + defer f.Close() + + var header [4]byte + if _, err = io.ReadFull(f, header[:]); err != nil { + return nil, fmt.Errorf("error reading magic number from %s: %v", name, err) + } + + elfMagic := string(header[:]) + + // Match against supported file types. + if elfMagic == elf.ELFMAG { + f, err := b.openELF(name, start, limit, offset, relocationSymbol) + if err != nil { + return nil, fmt.Errorf("error reading ELF file %s: %v", name, err) + } + return f, nil + } + + // Mach-O magic numbers can be big or little endian. + machoMagicLittle := binary.LittleEndian.Uint32(header[:]) + machoMagicBig := binary.BigEndian.Uint32(header[:]) + + if machoMagicLittle == macho.Magic32 || machoMagicLittle == macho.Magic64 || + machoMagicBig == macho.Magic32 || machoMagicBig == macho.Magic64 { + f, err := b.openMachO(name, start, limit, offset) + if err != nil { + return nil, fmt.Errorf("error reading Mach-O file %s: %v", name, err) + } + return f, nil + } + if machoMagicLittle == macho.MagicFat || machoMagicBig == macho.MagicFat { + f, err := b.openFatMachO(name, start, limit, offset) + if err != nil { + return nil, fmt.Errorf("error reading fat Mach-O file %s: %v", name, err) + } + return f, nil + } + + peMagic := string(header[:2]) + if peMagic == "MZ" { + f, err := b.openPE(name, start, limit, offset) + if err != nil { + return nil, fmt.Errorf("error reading PE file %s: %v", name, err) + } + return f, nil + } + + return nil, fmt.Errorf("unrecognized binary format: %s", name) +} + +func (b *binrep) openMachOCommon(name string, of *macho.File, start, limit, offset uint64) (plugin.ObjFile, error) { + + // Subtract the load address of the __TEXT section. Usually 0 for shared + // libraries or 0x100000000 for executables. You can check this value by + // running `objdump -private-headers `. + + textSegment := of.Segment("__TEXT") + if textSegment == nil { + return nil, fmt.Errorf("could not identify base for %s: no __TEXT segment", name) + } + if textSegment.Addr > start { + return nil, fmt.Errorf("could not identify base for %s: __TEXT segment address (0x%x) > mapping start address (0x%x)", + name, textSegment.Addr, start) + } + + base := start - textSegment.Addr + + if b.fast || (!b.addr2lineFound && !b.llvmSymbolizerFound) { + return &fileNM{file: file{b: b, name: name, base: base}}, nil + } + return &fileAddr2Line{file: file{b: b, name: name, base: base}}, nil +} + +func (b *binrep) openFatMachO(name string, start, limit, offset uint64) (plugin.ObjFile, error) { + of, err := macho.OpenFat(name) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", name, err) + } + defer of.Close() + + if len(of.Arches) == 0 { + return nil, fmt.Errorf("empty fat Mach-O file: %s", name) + } + + var arch macho.Cpu + // Use the host architecture. + // TODO: This is not ideal because the host architecture may not be the one + // that was profiled. E.g. an amd64 host can profile a 386 program. + switch runtime.GOARCH { + case "386": + arch = macho.Cpu386 + case "amd64", "amd64p32": + arch = macho.CpuAmd64 + case "arm", "armbe", "arm64", "arm64be": + arch = macho.CpuArm + case "ppc": + arch = macho.CpuPpc + case "ppc64", "ppc64le": + arch = macho.CpuPpc64 + default: + return nil, fmt.Errorf("unsupported host architecture for %s: %s", name, runtime.GOARCH) + } + for i := range of.Arches { + if of.Arches[i].Cpu == arch { + return b.openMachOCommon(name, of.Arches[i].File, start, limit, offset) + } + } + return nil, fmt.Errorf("architecture not found in %s: %s", name, runtime.GOARCH) +} + +func (b *binrep) openMachO(name string, start, limit, offset uint64) (plugin.ObjFile, error) { + of, err := macho.Open(name) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", name, err) + } + defer of.Close() + + return b.openMachOCommon(name, of, start, limit, offset) +} + +func (b *binrep) openELF(name string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { + ef, err := elfOpen(name) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", name, err) + } + defer ef.Close() + + buildID := "" + if id, err := elfexec.GetBuildID(ef); err == nil { + buildID = fmt.Sprintf("%x", id) + } + + var ( + kernelOffset *uint64 + pageAligned = func(addr uint64) bool { return addr%4096 == 0 } + ) + if strings.Contains(name, "vmlinux") || !pageAligned(start) || !pageAligned(limit) || !pageAligned(offset) { + // Reading all Symbols is expensive, and we only rarely need it so + // we don't want to do it every time. But if _stext happens to be + // page-aligned but isn't the same as Vaddr, we would symbolize + // wrong. So if the name the addresses aren't page aligned, or if + // the name is "vmlinux" we read _stext. We can be wrong if: (1) + // someone passes a kernel path that doesn't contain "vmlinux" AND + // (2) _stext is page-aligned AND (3) _stext is not at Vaddr + symbols, err := ef.Symbols() + if err != nil && err != elf.ErrNoSymbols { + return nil, err + } + + // The kernel relocation symbol (the mapping start address) can be either + // _text or _stext. When profiles are generated by `perf`, which one was used is + // distinguished by the mapping name for the kernel image: + // '[kernel.kallsyms]_text' or '[kernel.kallsyms]_stext', respectively. If we haven't + // been able to parse it from the mapping, we default to _stext. + if relocationSymbol == "" { + relocationSymbol = "_stext" + } + for _, s := range symbols { + if s.Name == relocationSymbol { + kernelOffset = &s.Value + break + } + } + } + + // Check that we can compute a base for the binary. This may not be the + // correct base value, so we don't save it. We delay computing the actual base + // value until we have a sample address for this mapping, so that we can + // correctly identify the associated program segment that is needed to compute + // the base. + if _, err := elfexec.GetBase(&ef.FileHeader, elfexec.FindTextProgHeader(ef), kernelOffset, start, limit, offset); err != nil { + return nil, fmt.Errorf("could not identify base for %s: %v", name, err) + } + + if b.fast || (!b.addr2lineFound && !b.llvmSymbolizerFound) { + return &fileNM{file: file{ + b: b, + name: name, + buildID: buildID, + m: &elfMapping{start: start, limit: limit, offset: offset, kernelOffset: kernelOffset}, + }}, nil + } + return &fileAddr2Line{file: file{ + b: b, + name: name, + buildID: buildID, + m: &elfMapping{start: start, limit: limit, offset: offset, kernelOffset: kernelOffset}, + }}, nil +} + +func (b *binrep) openPE(name string, start, limit, offset uint64) (plugin.ObjFile, error) { + pf, err := pe.Open(name) + if err != nil { + return nil, fmt.Errorf("error parsing %s: %v", name, err) + } + defer pf.Close() + + var imageBase uint64 + switch h := pf.OptionalHeader.(type) { + case *pe.OptionalHeader32: + imageBase = uint64(h.ImageBase) + case *pe.OptionalHeader64: + imageBase = uint64(h.ImageBase) + default: + return nil, fmt.Errorf("unknown OptionalHeader %T", pf.OptionalHeader) + } + + var base uint64 + if start > 0 { + base = start - imageBase + } + if b.fast || (!b.addr2lineFound && !b.llvmSymbolizerFound) { + return &fileNM{file: file{b: b, name: name, base: base}}, nil + } + return &fileAddr2Line{file: file{b: b, name: name, base: base}}, nil +} + +// elfMapping stores the parameters of a runtime mapping that are needed to +// identify the ELF segment associated with a mapping. +type elfMapping struct { + // Runtime mapping parameters. + start, limit, offset uint64 + // Offset of kernel relocation symbol. Only defined for kernel images, nil otherwise. + kernelOffset *uint64 +} + +// findProgramHeader returns the program segment that matches the current +// mapping and the given address, or an error if it cannot find a unique program +// header. +func (m *elfMapping) findProgramHeader(ef *elf.File, addr uint64) (*elf.ProgHeader, error) { + // For user space executables, we try to find the actual program segment that + // is associated with the given mapping. Skip this search if limit <= start. + // We cannot use just a check on the start address of the mapping to tell if + // it's a kernel / .ko module mapping, because with quipper address remapping + // enabled, the address would be in the lower half of the address space. + + if m.kernelOffset != nil || m.start >= m.limit || m.limit >= (uint64(1)<<63) { + // For the kernel, find the program segment that includes the .text section. + return elfexec.FindTextProgHeader(ef), nil + } + + // Fetch all the loadable segments. + var phdrs []elf.ProgHeader + for i := range ef.Progs { + if ef.Progs[i].Type == elf.PT_LOAD { + phdrs = append(phdrs, ef.Progs[i].ProgHeader) + } + } + // Some ELF files don't contain any loadable program segments, e.g. .ko + // kernel modules. It's not an error to have no header in such cases. + if len(phdrs) == 0 { + return nil, nil + } + // Get all program headers associated with the mapping. + headers := elfexec.ProgramHeadersForMapping(phdrs, m.offset, m.limit-m.start) + if len(headers) == 0 { + return nil, errors.New("no program header matches mapping info") + } + if len(headers) == 1 { + return headers[0], nil + } + + // Use the file offset corresponding to the address to symbolize, to narrow + // down the header. + return elfexec.HeaderForFileOffset(headers, addr-m.start+m.offset) +} + +// file implements the binutils.ObjFile interface. +type file struct { + b *binrep + name string + buildID string + + baseOnce sync.Once // Ensures the base, baseErr and isData are computed once. + base uint64 + baseErr error // Any eventual error while computing the base. + isData bool + // Mapping information. Relevant only for ELF files, nil otherwise. + m *elfMapping +} + +// computeBase computes the relocation base for the given binary file only if +// the elfMapping field is set. It populates the base and isData fields and +// returns an error. +func (f *file) computeBase(addr uint64) error { + if f == nil || f.m == nil { + return nil + } + if addr < f.m.start || addr >= f.m.limit { + return fmt.Errorf("specified address %x is outside the mapping range [%x, %x] for file %q", addr, f.m.start, f.m.limit, f.name) + } + ef, err := elfOpen(f.name) + if err != nil { + return fmt.Errorf("error parsing %s: %v", f.name, err) + } + defer ef.Close() + + ph, err := f.m.findProgramHeader(ef, addr) + if err != nil { + return fmt.Errorf("failed to find program header for file %q, ELF mapping %#v, address %x: %v", f.name, *f.m, addr, err) + } + + base, err := elfexec.GetBase(&ef.FileHeader, ph, f.m.kernelOffset, f.m.start, f.m.limit, f.m.offset) + if err != nil { + return err + } + f.base = base + f.isData = ph != nil && ph.Flags&elf.PF_X == 0 + return nil +} + +func (f *file) Name() string { + return f.name +} + +func (f *file) ObjAddr(addr uint64) (uint64, error) { + f.baseOnce.Do(func() { f.baseErr = f.computeBase(addr) }) + if f.baseErr != nil { + return 0, f.baseErr + } + return addr - f.base, nil +} + +func (f *file) BuildID() string { + return f.buildID +} + +func (f *file) SourceLine(addr uint64) ([]plugin.Frame, error) { + f.baseOnce.Do(func() { f.baseErr = f.computeBase(addr) }) + if f.baseErr != nil { + return nil, f.baseErr + } + return nil, nil +} + +func (f *file) Close() error { + return nil +} + +func (f *file) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { + // Get from nm a list of symbols sorted by address. + cmd := exec.Command(f.b.nm, "-n", f.name) + out, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("%v: %v", cmd.Args, err) + } + + return findSymbols(out, f.name, r, addr) +} + +// fileNM implements the binutils.ObjFile interface, using 'nm' to map +// addresses to symbols (without file/line number information). It is +// faster than fileAddr2Line. +type fileNM struct { + file + addr2linernm *addr2LinerNM +} + +func (f *fileNM) SourceLine(addr uint64) ([]plugin.Frame, error) { + f.baseOnce.Do(func() { f.baseErr = f.computeBase(addr) }) + if f.baseErr != nil { + return nil, f.baseErr + } + if f.addr2linernm == nil { + addr2liner, err := newAddr2LinerNM(f.b.nm, f.name, f.base) + if err != nil { + return nil, err + } + f.addr2linernm = addr2liner + } + return f.addr2linernm.addrInfo(addr) +} + +// fileAddr2Line implements the binutils.ObjFile interface, using +// llvm-symbolizer, if that's available, or addr2line to map addresses to +// symbols (with file/line number information). It can be slow for large +// binaries with debug information. +type fileAddr2Line struct { + once sync.Once + file + addr2liner *addr2Liner + llvmSymbolizer *llvmSymbolizer + isData bool +} + +func (f *fileAddr2Line) SourceLine(addr uint64) ([]plugin.Frame, error) { + f.baseOnce.Do(func() { f.baseErr = f.computeBase(addr) }) + if f.baseErr != nil { + return nil, f.baseErr + } + f.once.Do(f.init) + if f.llvmSymbolizer != nil { + return f.llvmSymbolizer.addrInfo(addr) + } + if f.addr2liner != nil { + return f.addr2liner.addrInfo(addr) + } + return nil, fmt.Errorf("could not find local addr2liner") +} + +func (f *fileAddr2Line) init() { + if llvmSymbolizer, err := newLLVMSymbolizer(f.b.llvmSymbolizer, f.name, f.base, f.isData); err == nil { + f.llvmSymbolizer = llvmSymbolizer + return + } + + if addr2liner, err := newAddr2Liner(f.b.addr2line, f.name, f.base); err == nil { + f.addr2liner = addr2liner + + // When addr2line encounters some gcc compiled binaries, it + // drops interesting parts of names in anonymous namespaces. + // Fallback to NM for better function names. + if nm, err := newAddr2LinerNM(f.b.nm, f.name, f.base); err == nil { + f.addr2liner.nm = nm + } + } +} + +func (f *fileAddr2Line) Close() error { + if f.llvmSymbolizer != nil { + f.llvmSymbolizer.rw.close() + f.llvmSymbolizer = nil + } + if f.addr2liner != nil { + f.addr2liner.rw.close() + f.addr2liner = nil + } + return nil +} diff --git a/plugin/debug/pkg/internal/binutils/binutils_test.go b/plugin/debug/pkg/internal/binutils/binutils_test.go new file mode 100644 index 00000000..a41baac9 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/binutils_test.go @@ -0,0 +1,978 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package binutils + +import ( + "bytes" + "debug/elf" + "encoding/binary" + "errors" + "fmt" + "math" + "path/filepath" + "reflect" + "regexp" + "runtime" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +var testAddrMap = map[int]string{ + 1000: "_Z3fooid.clone2", + 2000: "_ZNSaIiEC1Ev.clone18", + 3000: "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", +} + +func functionName(level int) (name string) { + if name = testAddrMap[level]; name != "" { + return name + } + return fmt.Sprintf("fun%d", level) +} + +func TestAddr2Liner(t *testing.T) { + const offset = 0x500 + + a := addr2Liner{rw: &mockAddr2liner{}, base: offset} + for i := 1; i < 8; i++ { + addr := i*0x1000 + offset + s, err := a.addrInfo(uint64(addr)) + if err != nil { + t.Fatalf("addrInfo(%#x): %v", addr, err) + } + if len(s) != i { + t.Fatalf("addrInfo(%#x): got len==%d, want %d", addr, len(s), i) + } + for l, f := range s { + level := (len(s) - l) * 1000 + want := plugin.Frame{Func: functionName(level), File: fmt.Sprintf("file%d", level), Line: level} + + if f != want { + t.Errorf("AddrInfo(%#x)[%d]: = %+v, want %+v", addr, l, f, want) + } + } + } + s, err := a.addrInfo(0xFFFF) + if err != nil { + t.Fatalf("addrInfo(0xFFFF): %v", err) + } + if len(s) != 0 { + t.Fatalf("AddrInfo(0xFFFF): got len==%d, want 0", len(s)) + } + a.rw.close() +} + +type mockAddr2liner struct { + output []string +} + +func (a *mockAddr2liner) write(s string) error { + var lines []string + switch s { + case "1000": + lines = []string{"_Z3fooid.clone2", "file1000:1000"} + case "2000": + lines = []string{"_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "3000": + lines = []string{"_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "4000": + lines = []string{"fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "5000": + lines = []string{"fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "6000": + lines = []string{"fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "7000": + lines = []string{"fun7000", "file7000:7000", "fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "8000": + lines = []string{"fun8000", "file8000:8000", "fun7000", "file7000:7000", "fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + case "9000": + lines = []string{"fun9000", "file9000:9000", "fun8000", "file8000:8000", "fun7000", "file7000:7000", "fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} + default: + lines = []string{"??", "??:0"} + } + a.output = append(a.output, "0x"+s) + a.output = append(a.output, lines...) + return nil +} + +func (a *mockAddr2liner) readLine() (string, error) { + if len(a.output) == 0 { + return "", fmt.Errorf("end of file") + } + next := a.output[0] + a.output = a.output[1:] + return next, nil +} + +func (a *mockAddr2liner) close() { +} + +func TestAddr2LinerLookup(t *testing.T) { + for _, tc := range []struct { + desc string + nmOutput string + wantSymbolized map[uint64]string + wantUnsymbolized []uint64 + }{ + { + desc: "odd symbol count", + nmOutput: ` +0x1000 T 1000 100 +0x2000 T 2000 120 +0x3000 T 3000 130 +`, + wantSymbolized: map[uint64]string{ + 0x1000: "0x1000", + 0x1001: "0x1000", + 0x1FFF: "0x1000", + 0x2000: "0x2000", + 0x2001: "0x2000", + 0x3000: "0x3000", + 0x312f: "0x3000", + }, + wantUnsymbolized: []uint64{0x0fff, 0x3130}, + }, + { + desc: "even symbol count", + nmOutput: ` +0x1000 T 1000 100 +0x2000 T 2000 120 +0x3000 T 3000 130 +0x4000 T 4000 140 +`, + wantSymbolized: map[uint64]string{ + 0x1000: "0x1000", + 0x1001: "0x1000", + 0x1FFF: "0x1000", + 0x2000: "0x2000", + 0x2fff: "0x2000", + 0x3000: "0x3000", + 0x3fff: "0x3000", + 0x4000: "0x4000", + 0x413f: "0x4000", + }, + wantUnsymbolized: []uint64{0x0fff, 0x4140}, + }, + { + desc: "different symbol types", + nmOutput: ` +absolute_0x100 a 100 +absolute_0x200 A 200 +text_0x1000 t 1000 100 +bss_0x2000 b 2000 120 +data_0x3000 d 3000 130 +rodata_0x4000 r 4000 140 +weak_0x5000 v 5000 150 +text_0x6000 T 6000 160 +bss_0x7000 B 7000 170 +data_0x8000 D 8000 180 +rodata_0x9000 R 9000 190 +weak_0xa000 V a000 1a0 +weak_0xb000 W b000 1b0 +`, + wantSymbolized: map[uint64]string{ + 0x1000: "text_0x1000", + 0x1FFF: "text_0x1000", + 0x2000: "bss_0x2000", + 0x211f: "bss_0x2000", + 0x3000: "data_0x3000", + 0x312f: "data_0x3000", + 0x4000: "rodata_0x4000", + 0x413f: "rodata_0x4000", + 0x5000: "weak_0x5000", + 0x514f: "weak_0x5000", + 0x6000: "text_0x6000", + 0x6fff: "text_0x6000", + 0x7000: "bss_0x7000", + 0x716f: "bss_0x7000", + 0x8000: "data_0x8000", + 0x817f: "data_0x8000", + 0x9000: "rodata_0x9000", + 0x918f: "rodata_0x9000", + 0xa000: "weak_0xa000", + 0xa19f: "weak_0xa000", + 0xb000: "weak_0xb000", + 0xb1af: "weak_0xb000", + }, + wantUnsymbolized: []uint64{0x100, 0x200, 0x0fff, 0x2120, 0x3130, 0x4140, 0x5150, 0x7170, 0x8180, 0x9190, 0xa1a0, 0xb1b0}, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + a, err := parseAddr2LinerNM(0, bytes.NewBufferString(tc.nmOutput)) + if err != nil { + t.Fatalf("nm parse error: %v", err) + } + for address, want := range tc.wantSymbolized { + if got, _ := a.addrInfo(address); !checkAddress(got, address, want) { + t.Errorf("%x: got %v, want %s", address, got, want) + } + } + for _, unknown := range tc.wantUnsymbolized { + if got, _ := a.addrInfo(unknown); got != nil { + t.Errorf("%x: got %v, want nil", unknown, got) + } + } + }) + } +} + +func checkAddress(got []plugin.Frame, address uint64, want string) bool { + if len(got) != 1 { + return false + } + return got[0].Func == want +} + +func TestSetTools(t *testing.T) { + // Test that multiple calls work. + bu := &Binutils{} + bu.SetTools("") + bu.SetTools("") +} + +func TestSetFastSymbolization(t *testing.T) { + // Test that multiple calls work. + bu := &Binutils{} + bu.SetFastSymbolization(true) + bu.SetFastSymbolization(false) +} + +func skipUnlessLinuxAmd64(t *testing.T) { + if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { + t.Skip("This test only works on x86-64 Linux") + } +} + +func skipUnlessDarwinAmd64(t *testing.T) { + if runtime.GOOS != "darwin" || runtime.GOARCH != "amd64" { + t.Skip("This test only works on x86-64 macOS") + } +} + +func skipUnlessWindowsAmd64(t *testing.T) { + if runtime.GOOS != "windows" || runtime.GOARCH != "amd64" { + t.Skip("This test only works on x86-64 Windows") + } +} + +func testDisasm(t *testing.T, intelSyntax bool) { + _, llvmObjdump, buObjdump := findObjdump([]string{""}) + if !(llvmObjdump || buObjdump) { + t.Skip("cannot disasm: no objdump tool available") + } + + bu := &Binutils{} + var testexe string + switch runtime.GOOS { + case "linux": + testexe = "exe_linux_64" + case "darwin": + testexe = "exe_mac_64" + case "windows": + testexe = "exe_windows_64.exe" + default: + t.Skipf("unsupported OS %q", runtime.GOOS) + } + + insts, err := bu.Disasm(filepath.Join("testdata", testexe), 0, math.MaxUint64, intelSyntax) + if err != nil { + t.Fatalf("Disasm: unexpected error %v", err) + } + mainCount := 0 + for _, x := range insts { + // macOS symbols have a leading underscore. + if x.Function == "main" || x.Function == "_main" { + mainCount++ + } + } + if mainCount == 0 { + t.Error("Disasm: found no main instructions") + } +} + +func TestDisasm(t *testing.T) { + if (runtime.GOOS != "linux" && runtime.GOOS != "darwin" && runtime.GOOS != "windows") || runtime.GOARCH != "amd64" { + t.Skip("This test only works on x86-64 Linux, macOS or Windows") + } + testDisasm(t, false) +} + +func TestDisasmIntelSyntax(t *testing.T) { + if (runtime.GOOS != "linux" && runtime.GOOS != "darwin" && runtime.GOOS != "windows") || runtime.GOARCH != "amd64" { + t.Skip("This test only works on x86_64 Linux, macOS or Windows as it tests Intel asm syntax") + } + testDisasm(t, true) +} + +func findSymbol(syms []*plugin.Sym, name string) *plugin.Sym { + for _, s := range syms { + for _, n := range s.Name { + if n == name { + return s + } + } + } + return nil +} + +func TestObjFile(t *testing.T) { + // If this test fails, check the address for main function in testdata/exe_linux_64 + // using the command 'nm -n '. Update the hardcoded addresses below to match + // the addresses from the output. + skipUnlessLinuxAmd64(t) + for _, tc := range []struct { + desc string + start, limit, offset uint64 + addr uint64 + }{ + {"fixed load address", 0x400000, 0x4006fc, 0, 0x40052d}, + // True user-mode ASLR binaries are ET_DYN rather than ET_EXEC so this case + // is a bit artificial except that it approximates the + // vmlinux-with-kernel-ASLR case where the binary *is* ET_EXEC. + {"simulated ASLR address", 0x500000, 0x5006fc, 0, 0x50052d}, + } { + t.Run(tc.desc, func(t *testing.T) { + bu := &Binutils{} + f, err := bu.Open(filepath.Join("testdata", "exe_linux_64"), tc.start, tc.limit, tc.offset, "") + if err != nil { + t.Fatalf("Open: unexpected error %v", err) + } + defer f.Close() + syms, err := f.Symbols(regexp.MustCompile("main"), 0) + if err != nil { + t.Fatalf("Symbols: unexpected error %v", err) + } + + m := findSymbol(syms, "main") + if m == nil { + t.Fatalf("Symbols: did not find main") + } + addr, err := f.ObjAddr(tc.addr) + if err != nil { + t.Fatalf("ObjAddr(%x) failed: %v", tc.addr, err) + } + if addr != m.Start { + t.Errorf("ObjAddr(%x) got %x, want %x", tc.addr, addr, m.Start) + } + gotFrames, err := f.SourceLine(tc.addr) + if err != nil { + t.Fatalf("SourceLine: unexpected error %v", err) + } + wantFrames := []plugin.Frame{ + {Func: "main", File: "/tmp/hello.c", Line: 3, StartLine: 3}, + } + if !reflect.DeepEqual(gotFrames, wantFrames) { + t.Fatalf("SourceLine for main: got %v; want %v\n", gotFrames, wantFrames) + } + }) + } +} + +func TestMachoFiles(t *testing.T) { + // If this test fails, check the address for main function in testdata/exe_mac_64 + // and testdata/lib_mac_64 using addr2line or gaddr2line. Update the + // hardcoded addresses below to match the addresses from the output. + skipUnlessDarwinAmd64(t) + + // Load `file`, pretending it was mapped at `start`. Then get the symbol + // table. Check that it contains the symbol `sym` and that the address + // `addr` gives the `expected` stack trace. + for _, tc := range []struct { + desc string + file string + start, limit, offset uint64 + addr uint64 + sym string + expected []plugin.Frame + }{ + {"normal mapping", "exe_mac_64", 0x100000000, math.MaxUint64, 0, + 0x100000f50, "_main", + []plugin.Frame{ + {Func: "main", File: "/tmp/hello.c", Line: 3, StartLine: 3}, + }}, + {"other mapping", "exe_mac_64", 0x200000000, math.MaxUint64, 0, + 0x200000f50, "_main", + []plugin.Frame{ + {Func: "main", File: "/tmp/hello.c", Line: 3, StartLine: 3}, + }}, + {"lib normal mapping", "lib_mac_64", 0, math.MaxUint64, 0, + 0xfa0, "_bar", + []plugin.Frame{ + {Func: "bar", File: "/tmp/lib.c", Line: 5, StartLine: 5}, + }}, + } { + t.Run(tc.desc, func(t *testing.T) { + bu := &Binutils{} + f, err := bu.Open(filepath.Join("testdata", tc.file), tc.start, tc.limit, tc.offset, "") + if err != nil { + t.Fatalf("Open: unexpected error %v", err) + } + t.Logf("binutils: %v", bu) + if runtime.GOOS == "darwin" && !bu.rep.addr2lineFound && !bu.rep.llvmSymbolizerFound { + // On macOS, user needs to install gaddr2line or llvm-symbolizer with + // Homebrew, skip the test when the environment doesn't have it + // installed. + t.Skip("couldn't find addr2line or gaddr2line") + } + defer f.Close() + syms, err := f.Symbols(nil, 0) + if err != nil { + t.Fatalf("Symbols: unexpected error %v", err) + } + + m := findSymbol(syms, tc.sym) + if m == nil { + t.Fatalf("Symbols: could not find symbol %v", tc.sym) + } + gotFrames, err := f.SourceLine(tc.addr) + if err != nil { + t.Fatalf("SourceLine: unexpected error %v", err) + } + if !reflect.DeepEqual(gotFrames, tc.expected) { + t.Fatalf("SourceLine for main: got %v; want %v\n", gotFrames, tc.expected) + } + }) + } +} + +func TestLLVMSymbolizer(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skip("testtdata/llvm-symbolizer has only been tested on linux") + } + + cmd := filepath.Join("testdata", "fake-llvm-symbolizer") + for _, c := range []struct { + addr uint64 + isData bool + frames []plugin.Frame + }{ + {0x10, false, []plugin.Frame{ + {Func: "Inlined_0x10", File: "foo.h", Line: 0, Column: 0, StartLine: 0}, + {Func: "Func_0x10", File: "foo.c", Line: 2, Column: 1, StartLine: 2}, + }}, + {0x20, true, []plugin.Frame{ + {Func: "foo_0x20", File: "0x20 8"}, + }}, + } { + desc := fmt.Sprintf("Code %x", c.addr) + if c.isData { + desc = fmt.Sprintf("Data %x", c.addr) + } + t.Run(desc, func(t *testing.T) { + symbolizer, err := newLLVMSymbolizer(cmd, "foo", 0, c.isData) + if err != nil { + t.Fatalf("newLLVMSymbolizer: unexpected error %v", err) + } + defer symbolizer.rw.close() + + frames, err := symbolizer.addrInfo(c.addr) + if err != nil { + t.Fatalf("LLVM: unexpected error %v", err) + } + if !reflect.DeepEqual(frames, c.frames) { + t.Errorf("LLVM: expect %v; got %v\n", c.frames, frames) + } + }) + } +} + +func TestPEFile(t *testing.T) { + // If this test fails, check the address for main function in testdata/exe_windows_64.exe + // using the command 'nm -n '. Update the hardcoded addresses below to match + // the addresses from the output. + skipUnlessWindowsAmd64(t) + for _, tc := range []struct { + desc string + start, limit, offset uint64 + addr uint64 + }{ + {"fake mapping", 0, math.MaxUint64, 0, 0x140001594}, + {"fixed load address", 0x140000000, 0x140002000, 0, 0x140001594}, + {"simulated ASLR address", 0x150000000, 0x150002000, 0, 0x150001594}, + } { + t.Run(tc.desc, func(t *testing.T) { + bu := &Binutils{} + f, err := bu.Open(filepath.Join("testdata", "exe_windows_64.exe"), tc.start, tc.limit, tc.offset, "") + if err != nil { + t.Fatalf("Open: unexpected error %v", err) + } + defer f.Close() + syms, err := f.Symbols(regexp.MustCompile("main"), 0) + if err != nil { + t.Fatalf("Symbols: unexpected error %v", err) + } + + m := findSymbol(syms, "main") + if m == nil { + t.Fatalf("Symbols: did not find main") + } + addr, err := f.ObjAddr(tc.addr) + if err != nil { + t.Fatalf("ObjAddr(%x) failed: %v", tc.addr, err) + } + if addr != m.Start { + t.Errorf("ObjAddr(%x) got %x, want %x", tc.addr, addr, m.Start) + } + gotFrames, err := f.SourceLine(tc.addr) + if err != nil { + t.Fatalf("SourceLine: unexpected error %v", err) + } + wantFrames := []plugin.Frame{ + {Func: "main", File: "hello.c", Line: 3, Column: 12, StartLine: 3}, + } + if !reflect.DeepEqual(gotFrames, wantFrames) { + t.Fatalf("SourceLine for main: got %v; want %v\n", gotFrames, wantFrames) + } + }) + } +} + +func TestOpenMalformedELF(t *testing.T) { + // Test that opening a malformed ELF file will report an error containing + // the word "ELF". + bu := &Binutils{} + _, err := bu.Open(filepath.Join("testdata", "malformed_elf"), 0, 0, 0, "") + if err == nil { + t.Fatalf("Open: unexpected success") + } + + if !strings.Contains(err.Error(), "ELF") { + t.Errorf("Open: got %v, want error containing 'ELF'", err) + } +} + +func TestOpenMalformedMachO(t *testing.T) { + // Test that opening a malformed Mach-O file will report an error containing + // the word "Mach-O". + bu := &Binutils{} + _, err := bu.Open(filepath.Join("testdata", "malformed_macho"), 0, 0, 0, "") + if err == nil { + t.Fatalf("Open: unexpected success") + } + + if !strings.Contains(err.Error(), "Mach-O") { + t.Errorf("Open: got %v, want error containing 'Mach-O'", err) + } +} + +func TestObjdumpVersionChecks(t *testing.T) { + // Test that the objdump version strings are parsed properly. + type testcase struct { + desc string + os string + ver string + want bool + } + + for _, tc := range []testcase{ + { + desc: "Valid Apple LLVM version string with usable version", + os: "darwin", + ver: "Apple LLVM version 11.0.3 (clang-1103.0.32.62)\nOptimized build.", + want: true, + }, + { + desc: "Valid Apple LLVM version string with unusable version", + os: "darwin", + ver: "Apple LLVM version 10.0.0 (clang-1000.11.45.5)\nOptimized build.", + want: false, + }, + { + desc: "Invalid Apple LLVM version string with usable version", + os: "darwin", + ver: "Apple LLVM versions 11.0.3 (clang-1103.0.32.62)\nOptimized build.", + want: false, + }, + { + desc: "Valid LLVM version string with usable version", + os: "linux", + ver: "LLVM (http://llvm.org/):\nLLVM version 9.0.1\n\nOptimized build.", + want: true, + }, + { + desc: "Valid LLVM version string with unusable version", + os: "linux", + ver: "LLVM (http://llvm.org/):\nLLVM version 6.0.1\n\nOptimized build.", + want: false, + }, + { + desc: "Invalid LLVM version string with usable version", + os: "linux", + ver: "LLVM (http://llvm.org/):\nLLVM versions 9.0.1\n\nOptimized build.", + want: false, + }, + { + desc: "Valid LLVM objdump version string with trunk", + os: runtime.GOOS, + ver: "LLVM (http://llvm.org/):\nLLVM version custom-trunk 124ffeb592a00bfe\nOptimized build.", + want: true, + }, + { + desc: "Invalid LLVM objdump version string with trunk", + os: runtime.GOOS, + ver: "LLVM (http://llvm.org/):\nLLVM version custom-trank 124ffeb592a00bfe\nOptimized build.", + want: false, + }, + { + desc: "Invalid LLVM objdump version string with trunk", + os: runtime.GOOS, + ver: "LLVM (http://llvm.org/):\nllvm version custom-trunk 124ffeb592a00bfe\nOptimized build.", + want: false, + }, + } { + if runtime.GOOS == tc.os { + if got := isLLVMObjdump(tc.ver); got != tc.want { + t.Errorf("%v: got %v, want %v", tc.desc, got, tc.want) + } + } + } + for _, tc := range []testcase{ + { + desc: "Valid GNU objdump version string", + ver: "GNU objdump (GNU Binutils) 2.34\nCopyright (C) 2020 Free Software Foundation, Inc.", + want: true, + }, + { + desc: "Invalid GNU objdump version string", + ver: "GNU nm (GNU Binutils) 2.34\nCopyright (C) 2020 Free Software Foundation, Inc.", + want: false, + }, + } { + if got := isBuObjdump(tc.ver); got != tc.want { + t.Errorf("%v: got %v, want %v", tc.desc, got, tc.want) + } + } +} + +func TestComputeBase(t *testing.T) { + realELFOpen := elfOpen + defer func() { + elfOpen = realELFOpen + }() + + tinyExecFile := &elf.File{ + FileHeader: elf.FileHeader{Type: elf.ET_EXEC}, + Progs: []*elf.Prog{ + {ProgHeader: elf.ProgHeader{Type: elf.PT_PHDR, Flags: elf.PF_R | elf.PF_X, Off: 0x40, Vaddr: 0x400040, Paddr: 0x400040, Filesz: 0x1f8, Memsz: 0x1f8, Align: 8}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_INTERP, Flags: elf.PF_R, Off: 0x238, Vaddr: 0x400238, Paddr: 0x400238, Filesz: 0x1c, Memsz: 0x1c, Align: 1}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}}, + }, + } + tinyBadBSSExecFile := &elf.File{ + FileHeader: elf.FileHeader{Type: elf.ET_EXEC}, + Progs: []*elf.Prog{ + {ProgHeader: elf.ProgHeader{Type: elf.PT_PHDR, Flags: elf.PF_R | elf.PF_X, Off: 0x40, Vaddr: 0x400040, Paddr: 0x400040, Filesz: 0x1f8, Memsz: 0x1f8, Align: 8}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_INTERP, Flags: elf.PF_R, Off: 0x238, Vaddr: 0x400238, Paddr: 0x400238, Filesz: 0x1c, Memsz: 0x1c, Align: 1}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x100, Memsz: 0x1f0, Align: 0x200000}}, + {ProgHeader: elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xd80, Vaddr: 0x400d80, Paddr: 0x400d80, Filesz: 0x90, Memsz: 0x90, Align: 0x200000}}, + }, + } + + for _, tc := range []struct { + desc string + file *elf.File + openErr error + mapping *elfMapping + addr uint64 + wantError bool + wantBase uint64 + wantIsData bool + }{ + { + desc: "no elf mapping, no error", + mapping: nil, + addr: 0x1000, + wantBase: 0, + wantIsData: false, + }, + { + desc: "address outside mapping bounds means error", + file: &elf.File{}, + mapping: &elfMapping{start: 0x2000, limit: 0x5000, offset: 0x1000}, + addr: 0x1000, + wantError: true, + }, + { + desc: "elf.Open failing means error", + file: &elf.File{FileHeader: elf.FileHeader{Type: elf.ET_EXEC}}, + openErr: errors.New("elf.Open failed"), + mapping: &elfMapping{start: 0x2000, limit: 0x5000, offset: 0x1000}, + addr: 0x4000, + wantError: true, + }, + { + desc: "no loadable segments, no error", + file: &elf.File{FileHeader: elf.FileHeader{Type: elf.ET_EXEC}}, + mapping: &elfMapping{start: 0x2000, limit: 0x5000, offset: 0x1000}, + addr: 0x4000, + wantBase: 0, + wantIsData: false, + }, + { + desc: "unsupported executable type, Get Base returns error", + file: &elf.File{FileHeader: elf.FileHeader{Type: elf.ET_NONE}}, + mapping: &elfMapping{start: 0x2000, limit: 0x5000, offset: 0x1000}, + addr: 0x4000, + wantError: true, + }, + { + desc: "tiny file select executable segment by offset", + file: tinyExecFile, + mapping: &elfMapping{start: 0x5000000, limit: 0x5001000, offset: 0x0}, + addr: 0x5000c00, + wantBase: 0x5000000, + wantIsData: false, + }, + { + desc: "tiny file select data segment by offset", + file: tinyExecFile, + mapping: &elfMapping{start: 0x5200000, limit: 0x5201000, offset: 0x0}, + addr: 0x5200c80, + wantBase: 0x5000000, + wantIsData: true, + }, + { + desc: "tiny file offset outside any segment means error", + file: tinyExecFile, + mapping: &elfMapping{start: 0x5200000, limit: 0x5201000, offset: 0x0}, + addr: 0x5200e70, + wantError: true, + }, + { + desc: "tiny file with bad BSS segment selects data segment by offset in initialized section", + file: tinyBadBSSExecFile, + mapping: &elfMapping{start: 0x5200000, limit: 0x5201000, offset: 0x0}, + addr: 0x5200d79, + wantBase: 0x5000000, + wantIsData: true, + }, + { + desc: "tiny file with bad BSS segment with offset in uninitialized section means error", + file: tinyBadBSSExecFile, + mapping: &elfMapping{start: 0x5200000, limit: 0x5201000, offset: 0x0}, + addr: 0x5200d80, + wantError: true, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + elfOpen = func(_ string) (*elf.File, error) { + return tc.file, tc.openErr + } + f := file{m: tc.mapping} + err := f.computeBase(tc.addr) + if (err != nil) != tc.wantError { + t.Errorf("got error %v, want any error=%v", err, tc.wantError) + } + if err != nil { + return + } + if f.base != tc.wantBase { + t.Errorf("got base %x, want %x", f.base, tc.wantBase) + } + if f.isData != tc.wantIsData { + t.Errorf("got isData %v, want %v", f.isData, tc.wantIsData) + } + }) + } +} + +func TestELFObjAddr(t *testing.T) { + // The exe_linux_64 has two loadable program headers: + // LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000 + // 0x00000000000006fc 0x00000000000006fc R E 0x200000 + // LOAD 0x0000000000000e10 0x0000000000600e10 0x0000000000600e10 + // 0x0000000000000230 0x0000000000000238 RW 0x200000 + name := filepath.Join("testdata", "exe_linux_64") + + for _, tc := range []struct { + desc string + start, limit, offset uint64 + wantOpenError bool + addr uint64 + wantObjAddr uint64 + wantAddrError bool + }{ + {"exec mapping, good address", 0x5400000, 0x5401000, 0, false, 0x5400400, 0x400400, false}, + {"exec mapping, address outside segment", 0x5400000, 0x5401000, 0, false, 0x5400800, 0, true}, + {"short data mapping, good address", 0x5600e00, 0x5602000, 0xe00, false, 0x5600e10, 0x600e10, false}, + {"short data mapping, address outside segment", 0x5600e00, 0x5602000, 0xe00, false, 0x5600e00, 0x600e00, false}, + {"page aligned data mapping, good address", 0x5600000, 0x5602000, 0, false, 0x5601000, 0x601000, false}, + {"page aligned data mapping, address outside segment", 0x5600000, 0x5602000, 0, false, 0x5601048, 0, true}, + {"bad file offset, no matching segment", 0x5600000, 0x5602000, 0x2000, false, 0x5600e10, 0, true}, + {"large mapping size, match by sample offset", 0x5600000, 0x5603000, 0, false, 0x5600e10, 0x600e10, false}, + } { + t.Run(tc.desc, func(t *testing.T) { + b := binrep{} + o, err := b.openELF(name, tc.start, tc.limit, tc.offset, "") + if (err != nil) != tc.wantOpenError { + t.Errorf("openELF got error %v, want any error=%v", err, tc.wantOpenError) + } + if err != nil { + return + } + got, err := o.ObjAddr(tc.addr) + if (err != nil) != tc.wantAddrError { + t.Errorf("ObjAddr got error %v, want any error=%v", err, tc.wantAddrError) + } + if err != nil { + return + } + if got != tc.wantObjAddr { + t.Errorf("got ObjAddr %x; want %x\n", got, tc.wantObjAddr) + } + }) + } +} + +type buf struct { + data []byte +} + +// write appends a null-terminated string and returns its starting index. +func (b *buf) write(s string) uint32 { + res := uint32(len(b.data)) + b.data = append(b.data, s...) + b.data = append(b.data, '\x00') + return res +} + +// fakeELFFile generates a minimal valid ELF file, with fake .head.text and +// .text sections, and their corresponding _text and _stext start symbols, +// mimicking a kernel vmlinux image. +func fakeELFFile(t *testing.T) *elf.File { + var ( + sizeHeader64 = binary.Size(elf.Header64{}) + sizeProg64 = binary.Size(elf.Prog64{}) + sizeSection64 = binary.Size(elf.Section64{}) + ) + + const ( + textAddr = 0xffff000010080000 + stextAddr = 0xffff000010081000 + ) + + // Generate magic to identify as an ELF file. + var ident [16]uint8 + ident[0] = '\x7f' + ident[1] = 'E' + ident[2] = 'L' + ident[3] = 'F' + ident[elf.EI_CLASS] = uint8(elf.ELFCLASS64) + ident[elf.EI_DATA] = uint8(elf.ELFDATA2LSB) + ident[elf.EI_VERSION] = uint8(elf.EV_CURRENT) + ident[elf.EI_OSABI] = uint8(elf.ELFOSABI_NONE) + + // A single program header, containing code and starting at the _text address. + progs := []elf.Prog64{{ + Type: uint32(elf.PT_LOAD), Flags: uint32(elf.PF_R | elf.PF_X), Off: 0x10000, Vaddr: textAddr, Paddr: textAddr, Filesz: 0x1234567, Memsz: 0x1234567, Align: 0x10000}} + + symNames := buf{} + syms := []elf.Sym64{ + {}, // first symbol empty by convention + {Name: symNames.write("_text"), Info: 0, Other: 0, Shndx: 0, Value: textAddr, Size: 0}, + {Name: symNames.write("_stext"), Info: 0, Other: 0, Shndx: 0, Value: stextAddr, Size: 0}, + } + + const numSections = 5 + // We'll write `textSize` zero bytes as contents of the .head.text and .text sections. + const textSize = 16 + // Offset of section contents in the byte stream -- after header, program headers, and section headers. + sectionsStart := uint64(sizeHeader64 + len(progs)*sizeProg64 + numSections*sizeSection64) + + secNames := buf{} + sections := [numSections]elf.Section64{ + {Name: secNames.write(".head.text"), Type: uint32(elf.SHT_PROGBITS), Flags: uint64(elf.SHF_ALLOC | elf.SHF_EXECINSTR), Addr: textAddr, Off: sectionsStart, Size: textSize, Link: 0, Info: 0, Addralign: 2048, Entsize: 0}, + {Name: secNames.write(".text"), Type: uint32(elf.SHT_PROGBITS), Flags: uint64(elf.SHF_ALLOC | elf.SHF_EXECINSTR), Addr: stextAddr, Off: sectionsStart + textSize, Size: textSize, Link: 0, Info: 0, Addralign: 2048, Entsize: 0}, + {Name: secNames.write(".symtab"), Type: uint32(elf.SHT_SYMTAB), Flags: 0, Addr: 0, Off: sectionsStart + 2*textSize, Size: uint64(len(syms) * elf.Sym64Size), Link: 3 /*index of .strtab*/, Info: 0, Addralign: 8, Entsize: elf.Sym64Size}, + {Name: secNames.write(".strtab"), Type: uint32(elf.SHT_STRTAB), Flags: 0, Addr: 0, Off: sectionsStart + 2*textSize + uint64(len(syms)*elf.Sym64Size), Size: uint64(len(symNames.data)), Link: 0, Info: 0, Addralign: 1, Entsize: 0}, + {Name: secNames.write(".shstrtab"), Type: uint32(elf.SHT_STRTAB), Flags: 0, Addr: 0, Off: sectionsStart + 2*textSize + uint64(len(syms)*elf.Sym64Size+len(symNames.data)), Size: uint64(len(secNames.data)), Link: 0, Info: 0, Addralign: 1, Entsize: 0}, + } + + hdr := elf.Header64{ + Ident: ident, + Type: uint16(elf.ET_DYN), + Machine: uint16(elf.EM_AARCH64), + Version: uint32(elf.EV_CURRENT), + Entry: textAddr, + Phoff: uint64(sizeHeader64), + Shoff: uint64(sizeHeader64 + len(progs)*sizeProg64), + Flags: 0, + Ehsize: uint16(sizeHeader64), + Phentsize: uint16(sizeProg64), + Phnum: uint16(len(progs)), + Shentsize: uint16(sizeSection64), + Shnum: uint16(len(sections)), + Shstrndx: 4, // index of .shstrtab + } + + // Serialize all headers and sections into a single binary stream. + var data bytes.Buffer + for i, b := range []interface{}{hdr, progs, sections, [textSize]byte{}, [textSize]byte{}, syms, symNames.data, secNames.data} { + err := binary.Write(&data, binary.LittleEndian, b) + if err != nil { + t.Fatalf("Write(%v) got err %v, want nil", i, err) + } + } + + // ... and parse it as and ELF file. + ef, err := elf.NewFile(bytes.NewReader(data.Bytes())) + if err != nil { + t.Fatalf("elf.NewFile got err %v, want nil", err) + } + return ef +} + +func TestELFKernelOffset(t *testing.T) { + realELFOpen := elfOpen + defer func() { + elfOpen = realELFOpen + }() + + wantAddr := uint64(0xffff000010082000) + elfOpen = func(_ string) (*elf.File, error) { + return fakeELFFile(t), nil + } + + for _, tc := range []struct { + name string + relocationSymbol string + start uint64 + }{ + {"text", "_text", 0xffff000020080000}, + {"stext", "_stext", 0xffff000020081000}, + } { + + b := binrep{} + o, err := b.openELF("vmlinux", tc.start, 0xffffffffffffffff, tc.start, tc.relocationSymbol) + if err != nil { + t.Errorf("%v: openELF got error %v, want nil", tc.name, err) + continue + } + + addr, err := o.ObjAddr(0xffff000020082000) + if err != nil { + t.Errorf("%v: ObjAddr got err %v, want nil", tc.name, err) + continue + } + if addr != wantAddr { + t.Errorf("%v: ObjAddr got %x, want %x", tc.name, addr, wantAddr) + } + + } +} diff --git a/plugin/debug/pkg/internal/binutils/disasm.go b/plugin/debug/pkg/internal/binutils/disasm.go new file mode 100644 index 00000000..701f669c --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/disasm.go @@ -0,0 +1,180 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package binutils + +import ( + "bytes" + "io" + "regexp" + "strconv" + "strings" + + "github.com/ianlancetaylor/demangle" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +var ( + nmOutputRE = regexp.MustCompile(`^\s*([[:xdigit:]]+)\s+(.)\s+(.*)`) + objdumpAsmOutputRE = regexp.MustCompile(`^\s*([[:xdigit:]]+):\s+(.*)`) + objdumpOutputFileLine = regexp.MustCompile(`^;?\s?(.*):([0-9]+)`) + objdumpOutputFunction = regexp.MustCompile(`^;?\s?(\S.*)\(\):`) + objdumpOutputFunctionLLVM = regexp.MustCompile(`^([[:xdigit:]]+)?\s?(.*):`) +) + +func findSymbols(syms []byte, file string, r *regexp.Regexp, address uint64) ([]*plugin.Sym, error) { + // Collect all symbols from the nm output, grouping names mapped to + // the same address into a single symbol. + + // The symbols to return. + var symbols []*plugin.Sym + + // The current group of symbol names, and the address they are all at. + names, start := []string{}, uint64(0) + + buf := bytes.NewBuffer(syms) + + for { + symAddr, name, err := nextSymbol(buf) + if err == io.EOF { + // Done. If there was an unfinished group, append it. + if len(names) != 0 { + if match := matchSymbol(names, start, symAddr-1, r, address); match != nil { + symbols = append(symbols, &plugin.Sym{Name: match, File: file, Start: start, End: symAddr - 1}) + } + } + + // And return the symbols. + return symbols, nil + } + + if err != nil { + // There was some kind of serious error reading nm's output. + return nil, err + } + + // If this symbol is at the same address as the current group, add it to the group. + if symAddr == start { + names = append(names, name) + continue + } + + // Otherwise append the current group to the list of symbols. + if match := matchSymbol(names, start, symAddr-1, r, address); match != nil { + symbols = append(symbols, &plugin.Sym{Name: match, File: file, Start: start, End: symAddr - 1}) + } + + // And start a new group. + names, start = []string{name}, symAddr + } +} + +// matchSymbol checks if a symbol is to be selected by checking its +// name to the regexp and optionally its address. It returns the name(s) +// to be used for the matched symbol, or nil if no match +func matchSymbol(names []string, start, end uint64, r *regexp.Regexp, address uint64) []string { + if address != 0 && address >= start && address <= end { + return names + } + for _, name := range names { + if r == nil || r.MatchString(name) { + return []string{name} + } + + // Match all possible demangled versions of the name. + for _, o := range [][]demangle.Option{ + {demangle.NoClones}, + {demangle.NoParams, demangle.NoEnclosingParams}, + {demangle.NoParams, demangle.NoEnclosingParams, demangle.NoTemplateParams}, + } { + if demangled, err := demangle.ToString(name, o...); err == nil && r.MatchString(demangled) { + return []string{demangled} + } + } + } + return nil +} + +// disassemble parses the output of the objdump command and returns +// the assembly instructions in a slice. +func disassemble(asm []byte) ([]plugin.Inst, error) { + buf := bytes.NewBuffer(asm) + function, file, line := "", "", 0 + var assembly []plugin.Inst + for { + input, err := buf.ReadString('\n') + if err != nil { + if err != io.EOF { + return nil, err + } + if input == "" { + break + } + } + input = strings.TrimSpace(input) + + if fields := objdumpAsmOutputRE.FindStringSubmatch(input); len(fields) == 3 { + if address, err := strconv.ParseUint(fields[1], 16, 64); err == nil { + assembly = append(assembly, + plugin.Inst{ + Addr: address, + Text: fields[2], + Function: function, + File: file, + Line: line, + }) + continue + } + } + if fields := objdumpOutputFileLine.FindStringSubmatch(input); len(fields) == 3 { + if l, err := strconv.ParseUint(fields[2], 10, 32); err == nil { + file, line = fields[1], int(l) + } + continue + } + if fields := objdumpOutputFunction.FindStringSubmatch(input); len(fields) == 2 { + function = fields[1] + continue + } else { + if fields := objdumpOutputFunctionLLVM.FindStringSubmatch(input); len(fields) == 3 { + function = fields[2] + continue + } + } + // Reset on unrecognized lines. + function, file, line = "", "", 0 + } + + return assembly, nil +} + +// nextSymbol parses the nm output to find the next symbol listed. +// Skips over any output it cannot recognize. +func nextSymbol(buf *bytes.Buffer) (uint64, string, error) { + for { + line, err := buf.ReadString('\n') + if err != nil { + if err != io.EOF || line == "" { + return 0, "", err + } + } + line = strings.TrimSpace(line) + + if fields := nmOutputRE.FindStringSubmatch(line); len(fields) == 4 { + if address, err := strconv.ParseUint(fields[1], 16, 64); err == nil { + return address, fields[3], nil + } + } + } +} diff --git a/plugin/debug/pkg/internal/binutils/disasm_test.go b/plugin/debug/pkg/internal/binutils/disasm_test.go new file mode 100644 index 00000000..b837f825 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/disasm_test.go @@ -0,0 +1,160 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package binutils + +import ( + "fmt" + "regexp" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +// TestFindSymbols tests the FindSymbols routine using a hardcoded nm output. +func TestFindSymbols(t *testing.T) { + type testcase struct { + query, syms string + want []plugin.Sym + } + + testsyms := `0000000000001000 t lineA001 +0000000000001000 t lineA002 +0000000000001000 t line1000 +0000000000002000 t line200A +0000000000002000 t line2000 +0000000000002000 t line200B +0000000000003000 t line3000 +0000000000003000 t _ZNK4DumbclEPKc +0000000000003000 t lineB00C +0000000000003000 t line300D +0000000000004000 t _the_end + ` + testcases := []testcase{ + { + "line.*[AC]", + testsyms, + []plugin.Sym{ + {Name: []string{"lineA001"}, File: "object.o", Start: 0x1000, End: 0x1FFF}, + {Name: []string{"line200A"}, File: "object.o", Start: 0x2000, End: 0x2FFF}, + {Name: []string{"lineB00C"}, File: "object.o", Start: 0x3000, End: 0x3FFF}, + }, + }, + { + "Dumb::operator", + testsyms, + []plugin.Sym{ + {Name: []string{"Dumb::operator()(char const*) const"}, File: "object.o", Start: 0x3000, End: 0x3FFF}, + }, + }, + } + + for _, tc := range testcases { + syms, err := findSymbols([]byte(tc.syms), "object.o", regexp.MustCompile(tc.query), 0) + if err != nil { + t.Fatalf("%q: findSymbols: %v", tc.query, err) + } + if err := checkSymbol(syms, tc.want); err != nil { + t.Errorf("%q: %v", tc.query, err) + } + } +} + +func checkSymbol(got []*plugin.Sym, want []plugin.Sym) error { + if len(got) != len(want) { + return fmt.Errorf("unexpected number of symbols %d (want %d)", len(got), len(want)) + } + + for i, g := range got { + w := want[i] + if len(g.Name) != len(w.Name) { + return fmt.Errorf("names, got %d, want %d", len(g.Name), len(w.Name)) + } + for n := range g.Name { + if g.Name[n] != w.Name[n] { + return fmt.Errorf("name %d, got %q, want %q", n, g.Name[n], w.Name[n]) + } + } + if g.File != w.File { + return fmt.Errorf("filename, got %q, want %q", g.File, w.File) + } + if g.Start != w.Start { + return fmt.Errorf("start address, got %#x, want %#x", g.Start, w.Start) + } + if g.End != w.End { + return fmt.Errorf("end address, got %#x, want %#x", g.End, w.End) + } + } + return nil +} + +// TestFunctionAssembly tests the FunctionAssembly routine by using a +// fake objdump script. +func TestFunctionAssembly(t *testing.T) { + type testcase struct { + s plugin.Sym + asm string + want []plugin.Inst + } + testcases := []testcase{ + { + plugin.Sym{Name: []string{"symbol1"}, Start: 0x1000, End: 0x1FFF}, + " 1000: instruction one\n 1001: instruction two\n 1002: instruction three\n 1003: instruction four", + []plugin.Inst{ + {Addr: 0x1000, Text: "instruction one"}, + {Addr: 0x1001, Text: "instruction two"}, + {Addr: 0x1002, Text: "instruction three"}, + {Addr: 0x1003, Text: "instruction four"}, + }, + }, + { + plugin.Sym{Name: []string{"symbol2"}, Start: 0x2000, End: 0x2FFF}, + " 2000: instruction one\n 2001: instruction two", + []plugin.Inst{ + {Addr: 0x2000, Text: "instruction one"}, + {Addr: 0x2001, Text: "instruction two"}, + }, + }, + { + plugin.Sym{Name: []string{"_main"}, Start: 0x30000, End: 0x3FFF}, + "_main:\n; /tmp/hello.c:3\n30001: push %rbp", + []plugin.Inst{ + {Addr: 0x30001, Text: "push %rbp", Function: "_main", File: "/tmp/hello.c", Line: 3}, + }, + }, + { + plugin.Sym{Name: []string{"main"}, Start: 0x4000, End: 0x4FFF}, + "000000000040052d
:\nmain():\n/tmp/hello.c:3\n40001: push %rbp", + []plugin.Inst{ + {Addr: 0x40001, Text: "push %rbp", Function: "main", File: "/tmp/hello.c", Line: 3}, + }, + }, + } + + for _, tc := range testcases { + insts, err := disassemble([]byte(tc.asm)) + if err != nil { + t.Fatalf("FunctionAssembly: %v", err) + } + + if len(insts) != len(tc.want) { + t.Errorf("Unexpected number of assembly instructions %d (want %d)\n", len(insts), len(tc.want)) + } + for i := range insts { + if insts[i] != tc.want[i] { + t.Errorf("Expected symbol %v, got %v\n", tc.want[i], insts[i]) + } + } + } +} diff --git a/plugin/debug/pkg/internal/binutils/testdata/build_binaries.go b/plugin/debug/pkg/internal/binutils/testdata/build_binaries.go new file mode 100644 index 00000000..695250be --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/build_binaries.go @@ -0,0 +1,94 @@ +// Copyright 2019 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This is a script that generates the test executables for MacOS and Linux +// in this directory. It should be needed very rarely to run this script. +// It is mostly provided as a future reference on how the original binary +// set was created. + +// When a new executable is generated, hardcoded addresses in the +// functions TestObjFile, TestMachoFiles, TestPEFile in binutils_test.go must be updated. +package main + +import ( + "log" + "os" + "os/exec" + "path/filepath" + "runtime" +) + +func main() { + wd, err := os.Getwd() + if err != nil { + log.Fatal(err) + } + + switch runtime.GOOS { + case "linux": + if err := removeGlob("exe_linux_64*"); err != nil { + log.Fatal(err) + } + + out, err := exec.Command("cc", "-g", "-ffile-prefix-map="+wd+"="+"/tmp", "-o", "exe_linux_64", "hello.c").CombinedOutput() + log.Println(string(out)) + if err != nil { + log.Fatal(err) + } + + case "darwin": + if err := removeGlob("exe_mac_64*", "lib_mac_64"); err != nil { + log.Fatal(err) + } + + out, err := exec.Command("clang", "-g", "-ffile-prefix-map="+wd+"="+"/tmp", "-o", "exe_mac_64", "hello.c").CombinedOutput() + log.Println(string(out)) + if err != nil { + log.Fatal(err) + } + + out, err = exec.Command("clang", "-g", "-ffile-prefix-map="+wd+"="+"/tmp", "-o", "lib_mac_64", "-dynamiclib", "lib.c").CombinedOutput() + log.Println(string(out)) + if err != nil { + log.Fatal(err) + } + + case "windows": + // Many gcc environments may create binaries that trigger false-positives + // in antiviruses. MSYS2 with gcc 10.2.0 is a working environment for + // compiling. To setup the environment follow the guide at + // https://www.msys2.org/ and install gcc with `pacman -S gcc`. + out, err := exec.Command("gcc", "-g", "-ffile-prefix-map="+wd+"=", "-o", "exe_windows_64.exe", "hello.c").CombinedOutput() + log.Println(string(out)) + if err != nil { + log.Fatal(err) + } + log.Println("Please verify that exe_windows_64.exe does not trigger any antivirus on `virustotal.com`.") + default: + log.Fatalf("Unsupported OS %q", runtime.GOOS) + } +} + +func removeGlob(globs ...string) error { + for _, glob := range globs { + matches, err := filepath.Glob(glob) + if err != nil { + return err + } + for _, p := range matches { + os.Remove(p) + } + } + return nil +} diff --git a/plugin/debug/pkg/internal/binutils/testdata/exe_linux_64 b/plugin/debug/pkg/internal/binutils/testdata/exe_linux_64 new file mode 100755 index 0000000000000000000000000000000000000000..d86dc7cdfca8275e13d6ff5c3f2f6568eb935a21 GIT binary patch literal 9503 zcmeHNZERcB89w*gXlWgY0?FJ+E_p z?QBTX{^eLc?|Gl|KJWRs=bkV7k-?#Tx~2&Zy0~4CW&{lhxv>x@Hb_-rePXRJ#C0Mj z)&Ob4*N{0R-4x43<(g$k*##hj`1a{8(5D+R!SYKkELd_4Nm6;s!B9z8{);Mvz*3-& z6o^MzkuYf_M;l~!y&e)q6q5;piMLJhwkaOVGvpY7CAW{-M&GpZo7N3zq#Go}UKuY- zvZZkMStm#7Gpdni+6;oByRuhmLa=1sSHV+FR~G+SL{#=cRo+Vd@_}j}OQnkKh5Xpg z-tC24ypS)|j>eDn?Tqj2O;pQ?9kSizpKSLZI3!ErevCq+I&Z|6#sK9%({b>^J8z_4 zeBxIxJ^$VL;fq~+em6{9{v!E>LkBF^x3H%Aw8F0i9&2GQ(7r4+XQ!B|IaOg<1Xxuk zQ*o?fCSL+FQ7o4fVu}4jsr~_LM`B0fW^$+FLqU@tj5nzXQM)R?mU4TPzSub`Q}pbp zKR84qqcYi!nEHW3%!8|;C9}49aIYV8=C2|1iMDl@#)SFUywi4W7tGC>S3;*c^Jk>~A?Z}~`FZF)7gMuu-fzynYtH=TgS*qI z*XDnUk!rqn%8=rzr&dqy;nA?wv9x~$wggLVqHfPU1sE?eUqXMadACJ6D zSxXC@o2LnzBaQ7(Ee2q3&i>jwbzzUGoiX2BtbzOsGBh9iJ;>(lt1kat#h>1NAL=V= zU5CIt_b@6l@@m^YK-x#AslDdR?&w+=IM>vxu<_8#u`p^kdv@u}$oX%9(z#ijuR@ZK zmtUb4z4bX9!GTELo19%r9!|}El01}}eJhzBI=*!-6hoDd$4TBZbp6?$KbogL3(%7| zR|L;|?4ol`=jKPL)?#S(!qDs|d*NegQ5L zT=YIt&>lJ{w4)Ji)1~d9r?vJ7;WP(F;o}A}P@%QG5L=K>_Ah+4v}BNNII=Gsy`!_^ z!O*nWbJeaJZrVbxoV3Ak5I=!m`EDe`k;nCcb!+ZK!N4gmhwn+`+mNC^9Qn3B7>+&_ z7!1db2M5F3o@_J2-H)#^!+kUD!(pQk?n{Qdli_Xs;aGn-3j6+WNX|1q2K{yT@xCwQ zay6{>z-kYy_P}ZntoFca52zl%?uNob(3Mg_#CuSdm#U0~fNQr-=`Sh%l}hJx)+VLX z+D_prSBNNfS`_%4$N7K%e5p+M3Ed!3Kl4RZd3@HH(+$cNm&jO%-Ad9qfI`$2;xZ*! z)c45PUQ*z_fhjfjd_u`~rC*`s2~|Gh(@N)hb9vb0%fLFeAF@58${t%UscXva1En8U z`3nBO3qHsC3%XoA|1T@K(>EU2e*eJ0ZLw{K#%d*}7VAy)C3@pKYEtWYxTiPK-J7`S zdKVWrg5!3x+gWrppuk5Xsd%E}NC%}J(zZfsB}C8R+lr`%vpyrCly-W2ZA z*0)D6CiE?$qvLi!@T-z&TreT_Tp0-8*0HN2wSi2H=(GLwM%;q0F0P?Mw10-zA(mG! z7zCQTi%(>chp<-X@;Bc3yspErP%cfxYNcv^qGab{)Pm|{x#BcJI8Da}-0qIWi%zX% z@1C$rb|s&MnyF+bcf05GSbSnfEIy9YZ1#cpRHf|LS*Ki49?7>nQlK*R0<)8uijZ}X zMdu%~onuqBkSF2oPH{?zMDO!F1~l9!C}31-?%f`>o%vCPABLngg897e zMAgE<>x?pQ>c9JuL32Fwd0s!P_*@>>pY2#a06wi5td9l^S=6ZF$E4O=e+7$&kf1(g z{)r{)H&sEzr@erm{}eFlS6-(VRQU^v&+9)-Wbi-#S)g9N z;Ppot8ZNCK^CH6Xdp^FQ_=e(F$hjvlkD(tR;Vqx{H7}_SmtKlN(Mvg-43-aHAEj5+-ywBl#e7>(&-BGU(KbQBw z^_I`~w2Raz1b=;5XZb#CynLbdnY`QSmR^=4=CP#bMfBTKS>CV&g)o0Tng129v9cwI{e+OPHNd4OOO3m3_~1 zkC*>7wQxSI2L83k+<`BT2cG|Ferr|!IU*q3;&bjV-?eHT2T;2{-Dt`TV6{rO!~?=< zi3jWFL$9*{PK$Fb?biri#~bb21+UMIcu0%}3@;?p0sQ(o-4ee<@H*)w1+WuYXlaj? zGuX=iy87?0jef#{*P%wdQ}FuIh)3$b8#dxyg4csae0_bMZ^Sp$&*_c$#`?V6h+l@^ zOGmwsOb5i}g6C0hWa|82=y-!u;0b+&oDx%->u`nRK^T8r^^HSqQ52m1Ar0#9#o;4z6bMk$FmkI%I9 z(`ZZDIPeI@vwz$crG4{zU0uP?ca$Ihd+|K*SaY%BMc`d}RP_1YmtPW&9U9LYynp-+ zaOwv`^@FW^z70Hrab^1a{F&{2dA z1AKj}`8Hc|s!k2Rq-OEU{T%}bt)bLCY0DBhyJAn|tGJ-BoT8P*6$ei3Eg;Lvm92?F zc`Q?~a=0w1TAA8Wfm8of!FKFiV&|>5+yu`pj4Zl;aBmYV+z?cb3HSaXS1T5ef#T6D zy0&OA<%<~0+IKKHJZKFb*o#WLE#PzmDJQJG_Z>(Mrv_l<$&vqD5Z3;oyZVzu)?NGd z-7}cB(#igzL2@Vm+>ou-WL<@oN)KDh9g`j&pl(TL#tOEeD-ZWi5Au%@hT;9=gJsJb z5#`1ImkFP(<#FZvGX?swTDB%Lr5sAMQg@-iT)t%0sy3RpTv=+KK%W9s&9iV9qtfo5 hH10TJ9aPVEppdCn@o+5*4dRZZmh#hXXs7Hu@ozc_fUN)k literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64 b/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64 new file mode 100755 index 0000000000000000000000000000000000000000..dba1ae15817595eb443322f6ae4ce9e67e400b90 GIT binary patch literal 8648 zcmeHNO=}ZD7@k-^>Sxo7_|3LhsiN7m)mjm;RfAEBR;?ff8Ji|G!A(+kx7zBZQalt9 zdiLnqga5#Tf(n9y7k_|?g5E`n@p)!vo844B3c|eb?(8%3&NDO5%tChGy!r9%=PDr* zO+w5p6GF7WpDY*Rp0IEy#AbLFF6Gd`$;?RR!a3H)EfI&mMdW#pKq-eamxtpas(&(G zCp5;~#0u?Id|NaDF?C8F zt2%PRcmK#2((rt+e`wTSji)Q5bVmQimqdTYH|u!fC?C&V6xW}F!Bc0?WKNt4&#=|7 zPGH(gJsI*u=hcqqEX@Eb7`qweCSq-tCDhSRqhuVlXL}KN9m>8oA?8u8g%81LTmzl4 zYjla?x7LaNvFAZYZ9r+kIfgyyxwccv+4*TF4@}z%=RAhqy>9R6Kl=3kqlZqd>-6fK zs7u1ddW;O`bEh!tV4Ya6>ep~C)mqTbw%~kyz_b$eu`&L|Y0oc|Q^!)6M=3`(A$GyZ zf7J@syjx@HW6UUE6fg=H1&jhl0i%FXz$oyq6}Xh0`r+(0>B#6^7hRIAmp1;?rGwQf~iC*Q`O z_3Axh8*gCIlE0t%p1U6<{f_>v&3nGXtV7SF>J1Qo9Z?n0%RKrfq7~-eC}0#Y3K#{9 z0!9I&fKk9GU=%P47zK<1MuGocf!6lqc`l;0pUFOz43|0NhmpKK?;_LaCR_XE1QO8x zxXL?j{CZLd-r$uq^cqqOif9MU;o6~sQ>@~ literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist b/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist new file mode 100644 index 00000000..41ce537f --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.exe_mac_64 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 b/plugin/debug/pkg/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 new file mode 100644 index 0000000000000000000000000000000000000000..2cb0e3bf31e384571a684c72d0b942ba195c969c GIT binary patch literal 8840 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 literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/binutils/testdata/fake-llvm-symbolizer b/plugin/debug/pkg/internal/binutils/testdata/fake-llvm-symbolizer new file mode 100755 index 00000000..491a2cd3 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/fake-llvm-symbolizer @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Copyright 2014 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Fake llvm-symbolizer to use in tests + +set -f +IFS=" " + +while read line; do + # line has form: + # filename 0xaddr + # Emit dummy output that matches llvm-symbolizer JSON output format. + set -- ${line} + kind=$1 + fname=$2 + addr=$3 + case ${kind} in + CODE) + echo "{\"Address\":\"${addr}\",\"ModuleName\":\"${fname}\",\"Symbol\":[{\"Column\":0,\"FileName\":\"${fname}.h\",\"FunctionName\":\"Inlined_${addr}\",\"Line\":0,\"StartLine\":0},{\"Column\":1,\"FileName\":\"${fname}.c\",\"FunctionName\":\"Func_${addr}\",\"Line\":2,\"StartLine\":2}]}" + ;; + DATA) + echo "{\"Address\":\"${addr}\",\"ModuleName\":\"${fname}\",\"Data\":{\"Name\":\"${fname}_${addr}\",\"Size\":\"0x8\",\"Start\":\"${addr}\"}}" + ;; + *) exit 1;; + esac +done diff --git a/plugin/debug/pkg/internal/binutils/testdata/hello.c b/plugin/debug/pkg/internal/binutils/testdata/hello.c new file mode 100644 index 00000000..aed773bc --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/hello.c @@ -0,0 +1,6 @@ +#include + +int main() { + printf("Hello, world!\n"); + return 0; +} diff --git a/plugin/debug/pkg/internal/binutils/testdata/lib.c b/plugin/debug/pkg/internal/binutils/testdata/lib.c new file mode 100644 index 00000000..f6207b84 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/lib.c @@ -0,0 +1,7 @@ +int foo() { + return 1; +} + +int bar() { + return 2; +} diff --git a/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64 b/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64 new file mode 100755 index 0000000000000000000000000000000000000000..933a3f6931053056755c5b63d57dbfc56dfa9e41 GIT binary patch literal 4496 zcmeHL&ubGw6n<&y541JyMJiSjv`8&9yQVdbCqY_lQHo#$5z3Hl5)I9dlHJtgRuB)~ zLjQvP0p8Vfj~@IJyj1Zb-bKXk+ns6FJ&0$S2XAJ+H}Acf`S$ef#~c@=B(#61fEb3RkMU_N2^6!lJZMP-FCzQ*g8jO{t*P4>Z7(>^ICrdzWa|}q+EvwP*E`rq_IsoIt?MFUbC-A@v*tUQtJH&y&HHPs8|JO%eTjLPiYoa| zy$l1B80X*_xeA)yX!-XM=jM>XyR+v!FrPLvEz-w)9{vzc)G@p;kEcHx_(83ezniZPfRG5g4rkvShO?M&Xv}w7vkX`UECZGS%YbFTGGH073|Iy% z1OGDvkJn#+en;W9b(G1jiiDVgYU?PJoU{7z@tNDy%aoRMqkXxiuAhJon;NOXKV@M` zL8p(^I~|$!DqXplmSGlEhglTDhS^AnUBS8U~Jr%T< i`X#^BzxCX8i(PlcDN_h9t`tfocRAmQ`iCd!d;SJVA9g|j literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist b/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist new file mode 100644 index 00000000..409e4cf0 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.lib_mac_64 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 b/plugin/debug/pkg/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 new file mode 100644 index 0000000000000000000000000000000000000000..e466c1342e3f5be57c4aa21e2745bcdd21b1e817 GIT binary patch literal 8934 zcmeI2&rj4q6vwCgLxJJ~k|2sP)nI}~wi|y%&sdm{^t(#Tqi;(qM^%X{7t&tZPTGNOZRhOF1RlvdnT+bvPsUGiWencpkU zo2cD>dMnLG2hfmGYqyka_sen{KDj*e*3P=T{0#X5~fK)&# zAQjk+3fzLEQv?tD6y;}bAJhsw{o@g}qDRX`KPdvtnEKa1KLY2)BrAs-U>&~Wg zod^1IUCRDFa7~_IXS6q+8&)r>Q{5wQvY+lJ>D*;iWx0;wd8;-(J%2-6v4YU{Tx}>{ z$QQJMq625xgF^*y@@Izfr%w=+UXPX6=R%0q4a2e447a40Jv|JHdfATdS72wnWf<|w zj-~s4;4SGOqZPP@qnox{iEJm-BP)zbMr5!(K>bna$vb0{xX-9G7W{MrE#7-r5AVNQ z+)$r{8!BptpF1!upvApJW1>NedyFQy$U#eTe}mP=U>ts4f`+@MkUj8OLl*v2=*4*y a*5mu5_!y5n0msNM2ZkBF76&s8Z}|rxW9=pY literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/binutils/testdata/malformed_elf b/plugin/debug/pkg/internal/binutils/testdata/malformed_elf new file mode 100644 index 00000000..f0b503b0 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/malformed_elf @@ -0,0 +1 @@ +ELF \ No newline at end of file diff --git a/plugin/debug/pkg/internal/binutils/testdata/malformed_macho b/plugin/debug/pkg/internal/binutils/testdata/malformed_macho new file mode 100644 index 00000000..b01ddf69 --- /dev/null +++ b/plugin/debug/pkg/internal/binutils/testdata/malformed_macho @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugin/debug/pkg/internal/driver/cli.go b/plugin/debug/pkg/internal/driver/cli.go new file mode 100644 index 00000000..8b1fa248 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/cli.go @@ -0,0 +1,360 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "errors" + "fmt" + "os" + + "m7s.live/v5/plugin/debug/pkg/internal/binutils" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +type source struct { + Sources []string + ExecName string + BuildID string + Base []string + DiffBase bool + Normalize bool + + Seconds int + Timeout int + Symbolize string + HTTPHostport string + HTTPDisableBrowser bool + Comment string +} + +// parseFlags parses the command lines through the specified flags package +// and returns the source of the profile and optionally the command +// for the kind of report to generate (nil for interactive use). +func parseFlags(o *plugin.Options) (*source, []string, error) { + flag := o.Flagset + // Comparisons. + flagDiffBase := flag.StringList("diff_base", "", "Source of base profile for comparison") + flagBase := flag.StringList("base", "", "Source of base profile for profile subtraction") + // Source options. + flagSymbolize := flag.String("symbolize", "", "Options for profile symbolization") + flagBuildID := flag.String("buildid", "", "Override build id for first mapping") + flagTimeout := flag.Int("timeout", -1, "Timeout in seconds for fetching a profile") + flagAddComment := flag.String("add_comment", "", "Annotation string to record in the profile") + // CPU profile options + flagSeconds := flag.Int("seconds", -1, "Length of time for dynamic profiles") + // Heap profile options + flagInUseSpace := flag.Bool("inuse_space", false, "Display in-use memory size") + flagInUseObjects := flag.Bool("inuse_objects", false, "Display in-use object counts") + flagAllocSpace := flag.Bool("alloc_space", false, "Display allocated memory size") + flagAllocObjects := flag.Bool("alloc_objects", false, "Display allocated object counts") + // Contention profile options + flagTotalDelay := flag.Bool("total_delay", false, "Display total delay at each region") + flagContentions := flag.Bool("contentions", false, "Display number of delays at each region") + flagMeanDelay := flag.Bool("mean_delay", false, "Display mean delay at each region") + flagTools := flag.String("tools", os.Getenv("PPROF_TOOLS"), "Path for object tool pathnames") + + flagHTTP := flag.String("http", "", "Present interactive web UI at the specified http host:port") + flagNoBrowser := flag.Bool("no_browser", false, "Skip opening a browser for the interactive web UI") + + // Flags that set configuration properties. + cfg := currentConfig() + configFlagSetter := installConfigFlags(flag, &cfg) + + flagCommands := make(map[string]*bool) + flagParamCommands := make(map[string]*string) + for name, cmd := range pprofCommands { + if cmd.hasParam { + flagParamCommands[name] = flag.String(name, "", "Generate a report in "+name+" format, matching regexp") + } else { + flagCommands[name] = flag.Bool(name, false, "Generate a report in "+name+" format") + } + } + + args := flag.Parse(func() { + o.UI.Print(usageMsgHdr + + usage(true) + + usageMsgSrc + + flag.ExtraUsage() + + usageMsgVars) + }) + if len(args) == 0 { + return nil, nil, errors.New("no profile source specified") + } + + var execName string + // Recognize first argument as an executable or buildid override. + if len(args) > 1 { + arg0 := args[0] + if file, err := o.Obj.Open(arg0, 0, ^uint64(0), 0, ""); err == nil { + file.Close() + execName = arg0 + args = args[1:] + } + } + + // Apply any specified flags to cfg. + if err := configFlagSetter(); err != nil { + return nil, nil, err + } + + cmd, err := outputFormat(flagCommands, flagParamCommands) + if err != nil { + return nil, nil, err + } + if cmd != nil && *flagHTTP != "" { + return nil, nil, errors.New("-http is not compatible with an output format on the command line") + } + + if *flagNoBrowser && *flagHTTP == "" { + return nil, nil, errors.New("-no_browser only makes sense with -http") + } + + si := cfg.SampleIndex + si = sampleIndex(flagTotalDelay, si, "delay", "-total_delay", o.UI) + si = sampleIndex(flagMeanDelay, si, "delay", "-mean_delay", o.UI) + si = sampleIndex(flagContentions, si, "contentions", "-contentions", o.UI) + si = sampleIndex(flagInUseSpace, si, "inuse_space", "-inuse_space", o.UI) + si = sampleIndex(flagInUseObjects, si, "inuse_objects", "-inuse_objects", o.UI) + si = sampleIndex(flagAllocSpace, si, "alloc_space", "-alloc_space", o.UI) + si = sampleIndex(flagAllocObjects, si, "alloc_objects", "-alloc_objects", o.UI) + cfg.SampleIndex = si + + if *flagMeanDelay { + cfg.Mean = true + } + + source := &source{ + Sources: args, + ExecName: execName, + BuildID: *flagBuildID, + Seconds: *flagSeconds, + Timeout: *flagTimeout, + Symbolize: *flagSymbolize, + HTTPHostport: *flagHTTP, + HTTPDisableBrowser: *flagNoBrowser, + Comment: *flagAddComment, + } + + if err := source.addBaseProfiles(*flagBase, *flagDiffBase); err != nil { + return nil, nil, err + } + + normalize := cfg.Normalize + if normalize && len(source.Base) == 0 { + return nil, nil, errors.New("must have base profile to normalize by") + } + source.Normalize = normalize + + if bu, ok := o.Obj.(*binutils.Binutils); ok { + bu.SetTools(*flagTools) + } + + setCurrentConfig(cfg) + return source, cmd, nil +} + +// addBaseProfiles adds the list of base profiles or diff base profiles to +// the source. This function will return an error if both base and diff base +// profiles are specified. +func (source *source) addBaseProfiles(flagBase, flagDiffBase []*string) error { + base, diffBase := dropEmpty(flagBase), dropEmpty(flagDiffBase) + if len(base) > 0 && len(diffBase) > 0 { + return errors.New("-base and -diff_base flags cannot both be specified") + } + + source.Base = base + if len(diffBase) > 0 { + source.Base, source.DiffBase = diffBase, true + } + return nil +} + +// dropEmpty list takes a slice of string pointers, and outputs a slice of +// non-empty strings associated with the flag. +func dropEmpty(list []*string) []string { + var l []string + for _, s := range list { + if *s != "" { + l = append(l, *s) + } + } + return l +} + +// installConfigFlags creates command line flags for configuration +// fields and returns a function which can be called after flags have +// been parsed to copy any flags specified on the command line to +// *cfg. +func installConfigFlags(flag plugin.FlagSet, cfg *config) func() error { + // List of functions for setting the different parts of a config. + var setters []func() + var err error // Holds any errors encountered while running setters. + + for _, field := range configFields { + n := field.name + help := configHelp[n] + var setter func() + switch ptr := cfg.fieldPtr(field).(type) { + case *bool: + f := flag.Bool(n, *ptr, help) + setter = func() { *ptr = *f } + case *int: + f := flag.Int(n, *ptr, help) + setter = func() { *ptr = *f } + case *float64: + f := flag.Float64(n, *ptr, help) + setter = func() { *ptr = *f } + case *string: + if len(field.choices) == 0 { + f := flag.String(n, *ptr, help) + setter = func() { *ptr = *f } + } else { + // Make a separate flag per possible choice. + // Set all flags to initially false so we can + // identify conflicts. + bools := make(map[string]*bool) + for _, choice := range field.choices { + bools[choice] = flag.Bool(choice, false, configHelp[choice]) + } + setter = func() { + var set []string + for k, v := range bools { + if *v { + set = append(set, k) + } + } + switch len(set) { + case 0: + // Leave as default value. + case 1: + *ptr = set[0] + default: + err = fmt.Errorf("conflicting options set: %v", set) + } + } + } + } + setters = append(setters, setter) + } + + return func() error { + // Apply the setter for every flag. + for _, setter := range setters { + setter() + if err != nil { + return err + } + } + return nil + } +} + +func sampleIndex(flag *bool, si string, sampleType, option string, ui plugin.UI) string { + if *flag { + if si == "" { + return sampleType + } + ui.PrintErr("Multiple value selections, ignoring ", option) + } + return si +} + +func outputFormat(bcmd map[string]*bool, acmd map[string]*string) (cmd []string, err error) { + for n, b := range bcmd { + if *b { + if cmd != nil { + return nil, errors.New("must set at most one output format") + } + cmd = []string{n} + } + } + for n, s := range acmd { + if *s != "" { + if cmd != nil { + return nil, errors.New("must set at most one output format") + } + cmd = []string{n, *s} + } + } + return cmd, nil +} + +var usageMsgHdr = `usage: + +Produce output in the specified format. + + pprof [options] [binary] ... + +Omit the format to get an interactive shell whose commands can be used +to generate various views of a profile + + pprof [options] [binary] ... + +Omit the format and provide the "-http" flag to get an interactive web +interface at the specified host:port that can be used to navigate through +various views of a profile. + + pprof -http [host]:[port] [options] [binary] ... + +Details: +` + +var usageMsgSrc = "\n\n" + + " Source options:\n" + + " -seconds Duration for time-based profile collection\n" + + " -timeout Timeout in seconds for profile collection\n" + + " -buildid Override build id for main binary\n" + + " -add_comment Free-form annotation to add to the profile\n" + + " Displayed on some reports or with pprof -comments\n" + + " -diff_base source Source of base profile for comparison\n" + + " -base source Source of base profile for profile subtraction\n" + + " profile.pb.gz Profile in compressed protobuf format\n" + + " legacy_profile Profile in legacy pprof format\n" + + " http://host/profile URL for profile handler to retrieve\n" + + " -symbolize= Controls source of symbol information\n" + + " none Do not attempt symbolization\n" + + " local Examine only local binaries\n" + + " fastlocal Only get function names from local binaries\n" + + " remote Do not examine local binaries\n" + + " force Force re-symbolization\n" + + " Binary Local path or build id of binary for symbolization\n" + +var usageMsgVars = "\n\n" + + " Misc options:\n" + + " -http Provide web interface at host:port.\n" + + " Host is optional and 'localhost' by default.\n" + + " Port is optional and a randomly available port by default.\n" + + " -no_browser Skip opening a browser for the interactive web UI.\n" + + " -tools Search path for object tools\n" + + "\n" + + " Legacy convenience options:\n" + + " -inuse_space Same as -sample_index=inuse_space\n" + + " -inuse_objects Same as -sample_index=inuse_objects\n" + + " -alloc_space Same as -sample_index=alloc_space\n" + + " -alloc_objects Same as -sample_index=alloc_objects\n" + + " -total_delay Same as -sample_index=delay\n" + + " -contentions Same as -sample_index=contentions\n" + + " -mean_delay Same as -mean -sample_index=delay\n" + + "\n" + + " Environment Variables:\n" + + " PPROF_TMPDIR Location for saved profiles (default $HOME/pprof)\n" + + " PPROF_TOOLS Search path for object-level tools\n" + + " PPROF_BINARY_PATH Search path for local binary files\n" + + " default: $HOME/pprof/binaries\n" + + " searches $buildid/$name, $buildid/*, $path/$buildid,\n" + + " ${buildid:0:2}/${buildid:2}.debug, $name, $path,\n" + + " ${name}.debug, $dir/.debug/${name}.debug,\n" + + " usr/lib/debug/$dir/${name}.debug\n" + + " * On Windows, %USERPROFILE% is used instead of $HOME" diff --git a/plugin/debug/pkg/internal/driver/commands.go b/plugin/debug/pkg/internal/driver/commands.go new file mode 100644 index 00000000..dc45ab14 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/commands.go @@ -0,0 +1,461 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "bytes" + "fmt" + "io" + "os" + "os/exec" + "runtime" + "sort" + "strings" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/report" +) + +// commands describes the commands accepted by pprof. +type commands map[string]*command + +// command describes the actions for a pprof command. Includes a +// function for command-line completion, the report format to use +// during report generation, any postprocessing functions, and whether +// the command expects a regexp parameter (typically a function name). +type command struct { + format int // report format to generate + postProcess PostProcessor // postprocessing to run on report + visualizer PostProcessor // display output using some callback + hasParam bool // collect a parameter from the CLI + description string // single-line description text saying what the command does + usage string // multi-line help text saying how the command is used +} + +// help returns a help string for a command. +func (c *command) help(name string) string { + message := c.description + "\n" + if c.usage != "" { + message += " Usage:\n" + lines := strings.Split(c.usage, "\n") + for _, line := range lines { + message += fmt.Sprintf(" %s\n", line) + } + } + return message + "\n" +} + +// AddCommand adds an additional command to the set of commands +// accepted by pprof. This enables extensions to add new commands for +// specialized visualization formats. If the command specified already +// exists, it is overwritten. +func AddCommand(cmd string, format int, post PostProcessor, desc, usage string) { + pprofCommands[cmd] = &command{format, post, nil, false, desc, usage} +} + +// SetVariableDefault sets the default value for a pprof +// variable. This enables extensions to set their own defaults. +func SetVariableDefault(variable, value string) { + configure(variable, value) +} + +// PostProcessor is a function that applies post-processing to the report output +type PostProcessor func(input io.Reader, output io.Writer, ui plugin.UI) error + +// interactiveMode is true if pprof is running on interactive mode, reading +// commands from its shell. +var interactiveMode = false + +// pprofCommands are the report generation commands recognized by pprof. +var pprofCommands = commands{ + // Commands that require no post-processing. + "comments": {report.Comments, nil, nil, false, "Output all profile comments", ""}, + "disasm": {report.Dis, nil, nil, true, "Output assembly listings annotated with samples", listHelp("disasm", true)}, + "dot": {report.Dot, nil, nil, false, "Outputs a graph in DOT format", reportHelp("dot", false, true)}, + "list": {report.List, nil, nil, true, "Output annotated source for functions matching regexp", listHelp("list", false)}, + "peek": {report.Tree, nil, nil, true, "Output callers/callees of functions matching regexp", "peek func_regex\nDisplay callers and callees of functions matching func_regex."}, + "raw": {report.Raw, nil, nil, false, "Outputs a text representation of the raw profile", ""}, + "tags": {report.Tags, nil, nil, false, "Outputs all tags in the profile", "tags [tag_regex]* [-ignore_regex]* [>file]\nList tags with key:value matching tag_regex and exclude ignore_regex."}, + "text": {report.Text, nil, nil, false, "Outputs top entries in text form", reportHelp("text", true, true)}, + "top": {report.Text, nil, nil, false, "Outputs top entries in text form", reportHelp("top", true, true)}, + "traces": {report.Traces, nil, nil, false, "Outputs all profile samples in text form", ""}, + "tree": {report.Tree, nil, nil, false, "Outputs a text rendering of call graph", reportHelp("tree", true, true)}, + + // Save binary formats to a file + "callgrind": {report.Callgrind, nil, awayFromTTY("callgraph.out"), false, "Outputs a graph in callgrind format", reportHelp("callgrind", false, true)}, + "proto": {report.Proto, nil, awayFromTTY("pb.gz"), false, "Outputs the profile in compressed protobuf format", ""}, + "topproto": {report.TopProto, nil, awayFromTTY("pb.gz"), false, "Outputs top entries in compressed protobuf format", ""}, + + // Generate report in DOT format and postprocess with dot + "gif": {report.Dot, invokeDot("gif"), awayFromTTY("gif"), false, "Outputs a graph image in GIF format", reportHelp("gif", false, true)}, + "pdf": {report.Dot, invokeDot("pdf"), awayFromTTY("pdf"), false, "Outputs a graph in PDF format", reportHelp("pdf", false, true)}, + "png": {report.Dot, invokeDot("png"), awayFromTTY("png"), false, "Outputs a graph image in PNG format", reportHelp("png", false, true)}, + "ps": {report.Dot, invokeDot("ps"), awayFromTTY("ps"), false, "Outputs a graph in PS format", reportHelp("ps", false, true)}, + + // Save SVG output into a file + "svg": {report.Dot, massageDotSVG(), awayFromTTY("svg"), false, "Outputs a graph in SVG format", reportHelp("svg", false, true)}, + + // Visualize postprocessed dot output + "eog": {report.Dot, invokeDot("svg"), invokeVisualizer("svg", []string{"eog"}), false, "Visualize graph through eog", reportHelp("eog", false, false)}, + "evince": {report.Dot, invokeDot("pdf"), invokeVisualizer("pdf", []string{"evince"}), false, "Visualize graph through evince", reportHelp("evince", false, false)}, + "gv": {report.Dot, invokeDot("ps"), invokeVisualizer("ps", []string{"gv --noantialias"}), false, "Visualize graph through gv", reportHelp("gv", false, false)}, + "web": {report.Dot, massageDotSVG(), invokeVisualizer("svg", browsers()), false, "Visualize graph through web browser", reportHelp("web", false, false)}, + + // Visualize callgrind output + "kcachegrind": {report.Callgrind, nil, invokeVisualizer("grind", kcachegrind), false, "Visualize report in KCachegrind", reportHelp("kcachegrind", false, false)}, + + // Visualize HTML directly generated by report. + "weblist": {report.WebList, nil, invokeVisualizer("html", browsers()), true, "Display annotated source in a web browser", listHelp("weblist", false)}, +} + +// configHelp contains help text per configuration parameter. +var configHelp = map[string]string{ + // Filename for file-based output formats, stdout by default. + "output": helpText("Output filename for file-based outputs"), + + // Comparisons. + "drop_negative": helpText( + "Ignore negative differences", + "Do not show any locations with values <0."), + + // Graph handling options. + "call_tree": helpText( + "Create a context-sensitive call tree", + "Treat locations reached through different paths as separate."), + + // Display options. + "relative_percentages": helpText( + "Show percentages relative to focused subgraph", + "If unset, percentages are relative to full graph before focusing", + "to facilitate comparison with original graph."), + "unit": helpText( + "Measurement units to display", + "Scale the sample values to this unit.", + "For time-based profiles, use seconds, milliseconds, nanoseconds, etc.", + "For memory profiles, use megabytes, kilobytes, bytes, etc.", + "Using auto will scale each value independently to the most natural unit."), + "compact_labels": "Show minimal headers", + "source_path": "Search path for source files", + "trim_path": "Path to trim from source paths before search", + "intel_syntax": helpText( + "Show assembly in Intel syntax", + "Only applicable to commands `disasm` and `weblist`"), + + // Filtering options + "nodecount": helpText( + "Max number of nodes to show", + "Uses heuristics to limit the number of locations to be displayed.", + "On graphs, dotted edges represent paths through nodes that have been removed."), + "nodefraction": "Hide nodes below *total", + "edgefraction": "Hide edges below *total", + "trim": helpText( + "Honor nodefraction/edgefraction/nodecount defaults", + "Set to false to get the full profile, without any trimming."), + "focus": helpText( + "Restricts to samples going through a node matching regexp", + "Discard samples that do not include a node matching this regexp.", + "Matching includes the function name, filename or object name."), + "ignore": helpText( + "Skips paths going through any nodes matching regexp", + "If set, discard samples that include a node matching this regexp.", + "Matching includes the function name, filename or object name."), + "prune_from": helpText( + "Drops any functions below the matched frame.", + "If set, any frames matching the specified regexp and any frames", + "below it will be dropped from each sample."), + "hide": helpText( + "Skips nodes matching regexp", + "Discard nodes that match this location.", + "Other nodes from samples that include this location will be shown.", + "Matching includes the function name, filename or object name."), + "show": helpText( + "Only show nodes matching regexp", + "If set, only show nodes that match this location.", + "Matching includes the function name, filename or object name."), + "show_from": helpText( + "Drops functions above the highest matched frame.", + "If set, all frames above the highest match are dropped from every sample.", + "Matching includes the function name, filename or object name."), + "tagroot": helpText( + "Adds pseudo stack frames for labels key/value pairs at the callstack root.", + "A comma-separated list of label keys.", + "The first key creates frames at the new root."), + "tagleaf": helpText( + "Adds pseudo stack frames for labels key/value pairs at the callstack leaf.", + "A comma-separated list of label keys.", + "The last key creates frames at the new leaf."), + "tagfocus": helpText( + "Restricts to samples with tags in range or matched by regexp", + "Use name=value syntax to limit the matching to a specific tag.", + "Numeric tag filter examples: 1kb, 1kb:10kb, memory=32mb:", + "String tag filter examples: foo, foo.*bar, mytag=foo.*bar"), + "tagignore": helpText( + "Discard samples with tags in range or matched by regexp", + "Use name=value syntax to limit the matching to a specific tag.", + "Numeric tag filter examples: 1kb, 1kb:10kb, memory=32mb:", + "String tag filter examples: foo, foo.*bar, mytag=foo.*bar"), + "tagshow": helpText( + "Only consider tags matching this regexp", + "Discard tags that do not match this regexp"), + "taghide": helpText( + "Skip tags matching this regexp", + "Discard tags that match this regexp"), + // Heap profile options + "divide_by": helpText( + "Ratio to divide all samples before visualization", + "Divide all samples values by a constant, eg the number of processors or jobs."), + "mean": helpText( + "Average sample value over first value (count)", + "For memory profiles, report average memory per allocation.", + "For time-based profiles, report average time per event."), + "sample_index": helpText( + "Sample value to report (0-based index or name)", + "Profiles contain multiple values per sample.", + "Use sample_index=i to select the ith value (starting at 0)."), + "normalize": helpText( + "Scales profile based on the base profile."), + + // Data sorting criteria + "flat": helpText("Sort entries based on own weight"), + "cum": helpText("Sort entries based on cumulative weight"), + + // Output granularity + "functions": helpText( + "Aggregate at the function level.", + "Ignores the filename where the function was defined."), + "filefunctions": helpText( + "Aggregate at the function level.", + "Takes into account the filename where the function was defined."), + "files": "Aggregate at the file level.", + "lines": "Aggregate at the source code line level.", + "addresses": helpText( + "Aggregate at the address level.", + "Includes functions' addresses in the output."), + "noinlines": helpText( + "Ignore inlines.", + "Attributes inlined functions to their first out-of-line caller."), + "showcolumns": helpText( + "Show column numbers at the source code line level."), +} + +func helpText(s ...string) string { + return strings.Join(s, "\n") + "\n" +} + +// usage returns a string describing the pprof commands and configuration +// options. if commandLine is set, the output reflect cli usage. +func usage(commandLine bool) string { + var prefix string + if commandLine { + prefix = "-" + } + fmtHelp := func(c, d string) string { + return fmt.Sprintf(" %-16s %s", c, strings.SplitN(d, "\n", 2)[0]) + } + + var commands []string + for name, cmd := range pprofCommands { + commands = append(commands, fmtHelp(prefix+name, cmd.description)) + } + sort.Strings(commands) + + var help string + if commandLine { + help = " Output formats (select at most one):\n" + } else { + help = " Commands:\n" + commands = append(commands, fmtHelp("o/options", "List options and their current values")) + commands = append(commands, fmtHelp("q/quit/exit/^D", "Exit pprof")) + } + + help = help + strings.Join(commands, "\n") + "\n\n" + + " Options:\n" + + // Print help for configuration options after sorting them. + // Collect choices for multi-choice options print them together. + var variables []string + var radioStrings []string + for _, f := range configFields { + if len(f.choices) == 0 { + variables = append(variables, fmtHelp(prefix+f.name, configHelp[f.name])) + continue + } + // Format help for for this group. + s := []string{fmtHelp(f.name, "")} + for _, choice := range f.choices { + s = append(s, " "+fmtHelp(prefix+choice, configHelp[choice])) + } + radioStrings = append(radioStrings, strings.Join(s, "\n")) + } + sort.Strings(variables) + sort.Strings(radioStrings) + return help + strings.Join(variables, "\n") + "\n\n" + + " Option groups (only set one per group):\n" + + strings.Join(radioStrings, "\n") +} + +func reportHelp(c string, cum, redirect bool) string { + h := []string{ + c + " [n] [focus_regex]* [-ignore_regex]*", + "Include up to n samples", + "Include samples matching focus_regex, and exclude ignore_regex.", + } + if cum { + h[0] += " [-cum]" + h = append(h, "-cum sorts the output by cumulative weight") + } + if redirect { + h[0] += " >f" + h = append(h, "Optionally save the report on the file f") + } + return strings.Join(h, "\n") +} + +func listHelp(c string, redirect bool) string { + h := []string{ + c + " [-focus_regex]* [-ignore_regex]*", + "Include functions matching func_regex, or including the address specified.", + "Include samples matching focus_regex, and exclude ignore_regex.", + } + if redirect { + h[0] += " >f" + h = append(h, "Optionally save the report on the file f") + } + return strings.Join(h, "\n") +} + +// browsers returns a list of commands to attempt for web visualization. +func browsers() []string { + var cmds []string + if userBrowser := os.Getenv("BROWSER"); userBrowser != "" { + cmds = append(cmds, userBrowser) + } + switch runtime.GOOS { + case "darwin": + cmds = append(cmds, "/usr/bin/open") + case "windows": + cmds = append(cmds, "cmd /c start") + default: + // Commands opening browsers are prioritized over xdg-open, so browser() + // command can be used on linux to open the .svg file generated by the -web + // command (the .svg file includes embedded javascript so is best viewed in + // a browser). + cmds = append(cmds, []string{"chrome", "google-chrome", "chromium", "firefox", "sensible-browser"}...) + if os.Getenv("DISPLAY") != "" { + // xdg-open is only for use in a desktop environment. + cmds = append(cmds, "xdg-open") + } + } + return cmds +} + +var kcachegrind = []string{"kcachegrind"} + +// awayFromTTY saves the output in a file if it would otherwise go to +// the terminal screen. This is used to avoid dumping binary data on +// the screen. +func awayFromTTY(format string) PostProcessor { + return func(input io.Reader, output io.Writer, ui plugin.UI) error { + if output == os.Stdout && (ui.IsTerminal() || interactiveMode) { + tempFile, err := newTempFile("", "profile", "."+format) + if err != nil { + return err + } + ui.PrintErr("Generating report in ", tempFile.Name()) + output = tempFile + } + _, err := io.Copy(output, input) + return err + } +} + +func invokeDot(format string) PostProcessor { + return func(input io.Reader, output io.Writer, ui plugin.UI) error { + cmd := exec.Command("dot", "-T"+format) + cmd.Stdin, cmd.Stdout, cmd.Stderr = input, output, os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to execute dot. Is Graphviz installed? Error: %v", err) + } + return nil + } +} + +// massageDotSVG invokes the dot tool to generate an SVG image and alters +// the image to have panning capabilities when viewed in a browser. +func massageDotSVG() PostProcessor { + generateSVG := invokeDot("svg") + return func(input io.Reader, output io.Writer, ui plugin.UI) error { + baseSVG := new(bytes.Buffer) + if err := generateSVG(input, baseSVG, ui); err != nil { + return err + } + _, err := output.Write([]byte(massageSVG(baseSVG.String()))) + return err + } +} + +func invokeVisualizer(suffix string, visualizers []string) PostProcessor { + return func(input io.Reader, output io.Writer, ui plugin.UI) error { + tempFile, err := newTempFile(os.TempDir(), "pprof", "."+suffix) + if err != nil { + return err + } + deferDeleteTempFile(tempFile.Name()) + if _, err := io.Copy(tempFile, input); err != nil { + return err + } + tempFile.Close() + // Try visualizers until one is successful + for _, v := range visualizers { + // Separate command and arguments for exec.Command. + args := strings.Split(v, " ") + if len(args) == 0 { + continue + } + viewer := exec.Command(args[0], append(args[1:], tempFile.Name())...) + viewer.Stderr = os.Stderr + if err = viewer.Start(); err == nil { + // Wait for a second so that the visualizer has a chance to + // open the input file. This needs to be done even if we're + // waiting for the visualizer as it can be just a wrapper that + // spawns a browser tab and returns right away. + defer func(t <-chan time.Time) { + <-t + }(time.After(time.Second)) + // On interactive mode, let the visualizer run in the background + // so other commands can be issued. + if !interactiveMode { + return viewer.Wait() + } + return nil + } + } + return err + } +} + +// stringToBool is a custom parser for bools. We avoid using strconv.ParseBool +// to remain compatible with old pprof behavior (e.g., treating "" as true). +func stringToBool(s string) (bool, error) { + switch strings.ToLower(s) { + case "true", "t", "yes", "y", "1", "": + return true, nil + case "false", "f", "no", "n", "0": + return false, nil + default: + return false, fmt.Errorf(`illegal value "%s" for bool variable`, s) + } +} diff --git a/plugin/debug/pkg/internal/driver/config.go b/plugin/debug/pkg/internal/driver/config.go new file mode 100644 index 00000000..090230e2 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/config.go @@ -0,0 +1,373 @@ +package driver + +import ( + "fmt" + "net/url" + "reflect" + "strconv" + "strings" + "sync" +) + +// config holds settings for a single named config. +// The JSON tag name for a field is used both for JSON encoding and as +// a named variable. +type config struct { + // Filename for file-based output formats, stdout by default. + Output string `json:"-"` + + // Display options. + CallTree bool `json:"call_tree,omitempty"` + RelativePercentages bool `json:"relative_percentages,omitempty"` + Unit string `json:"unit,omitempty"` + CompactLabels bool `json:"compact_labels,omitempty"` + SourcePath string `json:"-"` + TrimPath string `json:"-"` + IntelSyntax bool `json:"intel_syntax,omitempty"` + Mean bool `json:"mean,omitempty"` + SampleIndex string `json:"-"` + DivideBy float64 `json:"-"` + Normalize bool `json:"normalize,omitempty"` + Sort string `json:"sort,omitempty"` + + // Label pseudo stack frame generation options + TagRoot string `json:"tagroot,omitempty"` + TagLeaf string `json:"tagleaf,omitempty"` + + // Filtering options + DropNegative bool `json:"drop_negative,omitempty"` + NodeCount int `json:"nodecount,omitempty"` + NodeFraction float64 `json:"nodefraction,omitempty"` + EdgeFraction float64 `json:"edgefraction,omitempty"` + Trim bool `json:"trim,omitempty"` + Focus string `json:"focus,omitempty"` + Ignore string `json:"ignore,omitempty"` + PruneFrom string `json:"prune_from,omitempty"` + Hide string `json:"hide,omitempty"` + Show string `json:"show,omitempty"` + ShowFrom string `json:"show_from,omitempty"` + TagFocus string `json:"tagfocus,omitempty"` + TagIgnore string `json:"tagignore,omitempty"` + TagShow string `json:"tagshow,omitempty"` + TagHide string `json:"taghide,omitempty"` + NoInlines bool `json:"noinlines,omitempty"` + ShowColumns bool `json:"showcolumns,omitempty"` + + // Output granularity + Granularity string `json:"granularity,omitempty"` +} + +// defaultConfig returns the default configuration values; it is unaffected by +// flags and interactive assignments. +func defaultConfig() config { + return config{ + Unit: "minimum", + NodeCount: -1, + NodeFraction: 0.005, + EdgeFraction: 0.001, + Trim: true, + DivideBy: 1.0, + Sort: "flat", + Granularity: "", // Default depends on the display format + } +} + +// currentConfig holds the current configuration values; it is affected by +// flags and interactive assignments. +var currentCfg = defaultConfig() +var currentMu sync.Mutex + +func currentConfig() config { + currentMu.Lock() + defer currentMu.Unlock() + return currentCfg +} + +func setCurrentConfig(cfg config) { + currentMu.Lock() + defer currentMu.Unlock() + currentCfg = cfg +} + +// configField contains metadata for a single configuration field. +type configField struct { + name string // JSON field name/key in variables + urlparam string // URL parameter name + saved bool // Is field saved in settings? + field reflect.StructField // Field in config + choices []string // Name Of variables in group + defaultValue string // Default value for this field. +} + +var ( + configFields []configField // Precomputed metadata per config field + + // configFieldMap holds an entry for every config field as well as an + // entry for every valid choice for a multi-choice field. + configFieldMap map[string]configField +) + +func init() { + // Config names for fields that are not saved in settings and therefore + // do not have a JSON name. + notSaved := map[string]string{ + // Not saved in settings, but present in URLs. + "SampleIndex": "sample_index", + + // Following fields are also not placed in URLs. + "Output": "output", + "SourcePath": "source_path", + "TrimPath": "trim_path", + "DivideBy": "divide_by", + } + + // choices holds the list of allowed values for config fields that can + // take on one of a bounded set of values. + choices := map[string][]string{ + "sort": {"cum", "flat"}, + "granularity": {"functions", "filefunctions", "files", "lines", "addresses"}, + } + + // urlparam holds the mapping from a config field name to the URL + // parameter used to hold that config field. If no entry is present for + // a name, the corresponding field is not saved in URLs. + urlparam := map[string]string{ + "drop_negative": "dropneg", + "call_tree": "calltree", + "relative_percentages": "rel", + "unit": "unit", + "compact_labels": "compact", + "intel_syntax": "intel", + "nodecount": "n", + "nodefraction": "nf", + "edgefraction": "ef", + "trim": "trim", + "focus": "f", + "ignore": "i", + "prune_from": "prunefrom", + "hide": "h", + "show": "s", + "show_from": "sf", + "tagfocus": "tf", + "tagignore": "ti", + "tagshow": "ts", + "taghide": "th", + "mean": "mean", + "sample_index": "si", + "normalize": "norm", + "sort": "sort", + "granularity": "g", + "noinlines": "noinlines", + "showcolumns": "showcolumns", + } + + def := defaultConfig() + configFieldMap = map[string]configField{} + t := reflect.TypeOf(config{}) + for i, n := 0, t.NumField(); i < n; i++ { + field := t.Field(i) + js := strings.Split(field.Tag.Get("json"), ",") + if len(js) == 0 { + continue + } + // Get the configuration name for this field. + name := js[0] + if name == "-" { + name = notSaved[field.Name] + if name == "" { + // Not a configurable field. + continue + } + } + f := configField{ + name: name, + urlparam: urlparam[name], + saved: (name == js[0]), + field: field, + choices: choices[name], + } + f.defaultValue = def.get(f) + configFields = append(configFields, f) + configFieldMap[f.name] = f + for _, choice := range f.choices { + configFieldMap[choice] = f + } + } +} + +// fieldPtr returns a pointer to the field identified by f in *cfg. +func (cfg *config) fieldPtr(f configField) interface{} { + // reflect.ValueOf: converts to reflect.Value + // Elem: dereferences cfg to make *cfg + // FieldByIndex: fetches the field + // Addr: takes address of field + // Interface: converts back from reflect.Value to a regular value + return reflect.ValueOf(cfg).Elem().FieldByIndex(f.field.Index).Addr().Interface() +} + +// get returns the value of field f in cfg. +func (cfg *config) get(f configField) string { + switch ptr := cfg.fieldPtr(f).(type) { + case *string: + return *ptr + case *int: + return fmt.Sprint(*ptr) + case *float64: + return fmt.Sprint(*ptr) + case *bool: + return fmt.Sprint(*ptr) + } + panic(fmt.Sprintf("unsupported config field type %v", f.field.Type)) +} + +// set sets the value of field f in cfg to value. +func (cfg *config) set(f configField, value string) error { + switch ptr := cfg.fieldPtr(f).(type) { + case *string: + if len(f.choices) > 0 { + // Verify that value is one of the allowed choices. + for _, choice := range f.choices { + if choice == value { + *ptr = value + return nil + } + } + return fmt.Errorf("invalid %q value %q", f.name, value) + } + *ptr = value + case *int: + v, err := strconv.Atoi(value) + if err != nil { + return err + } + *ptr = v + case *float64: + v, err := strconv.ParseFloat(value, 64) + if err != nil { + return err + } + *ptr = v + case *bool: + v, err := stringToBool(value) + if err != nil { + return err + } + *ptr = v + default: + panic(fmt.Sprintf("unsupported config field type %v", f.field.Type)) + } + return nil +} + +// isConfigurable returns true if name is either the name of a config field, or +// a valid value for a multi-choice config field. +func isConfigurable(name string) bool { + _, ok := configFieldMap[name] + return ok +} + +// isBoolConfig returns true if name is either name of a boolean config field, +// or a valid value for a multi-choice config field. +func isBoolConfig(name string) bool { + f, ok := configFieldMap[name] + if !ok { + return false + } + if name != f.name { + return true // name must be one possible value for the field + } + var cfg config + _, ok = cfg.fieldPtr(f).(*bool) + return ok +} + +// completeConfig returns the list of configurable names starting with prefix. +func completeConfig(prefix string) []string { + var result []string + for v := range configFieldMap { + if strings.HasPrefix(v, prefix) { + result = append(result, v) + } + } + return result +} + +// configure stores the name=value mapping into the current config, correctly +// handling the case when name identifies a particular choice in a field. +func configure(name, value string) error { + currentMu.Lock() + defer currentMu.Unlock() + f, ok := configFieldMap[name] + if !ok { + return fmt.Errorf("unknown config field %q", name) + } + if f.name == name { + return currentCfg.set(f, value) + } + // name must be one of the choices. If value is true, set field-value + // to name. + if v, err := strconv.ParseBool(value); v && err == nil { + return currentCfg.set(f, name) + } + return fmt.Errorf("unknown config field %q", name) +} + +// resetTransient sets all transient fields in *cfg to their currently +// configured values. +func (cfg *config) resetTransient() { + current := currentConfig() + cfg.Output = current.Output + cfg.SourcePath = current.SourcePath + cfg.TrimPath = current.TrimPath + cfg.DivideBy = current.DivideBy + cfg.SampleIndex = current.SampleIndex +} + +// applyURL updates *cfg based on params. +func (cfg *config) applyURL(params url.Values) error { + for _, f := range configFields { + var value string + if f.urlparam != "" { + value = params.Get(f.urlparam) + } + if value == "" { + continue + } + if err := cfg.set(f, value); err != nil { + return fmt.Errorf("error setting config field %s: %v", f.name, err) + } + } + return nil +} + +// makeURL returns a URL based on initialURL that contains the config contents +// as parameters. The second result is true iff a parameter value was changed. +func (cfg *config) makeURL(initialURL url.URL) (url.URL, bool) { + q := initialURL.Query() + changed := false + for _, f := range configFields { + if f.urlparam == "" || !f.saved { + continue + } + v := cfg.get(f) + if v == f.defaultValue { + v = "" // URL for of default value is the empty string. + } else if f.field.Type.Kind() == reflect.Bool { + // Shorten bool values to "f" or "t" + v = v[:1] + } + if q.Get(f.urlparam) == v { + continue + } + changed = true + if v == "" { + q.Del(f.urlparam) + } else { + q.Set(f.urlparam, v) + } + } + if changed { + initialURL.RawQuery = q.Encode() + } + return initialURL, changed +} diff --git a/plugin/debug/pkg/internal/driver/driver.go b/plugin/debug/pkg/internal/driver/driver.go new file mode 100644 index 00000000..af51e62c --- /dev/null +++ b/plugin/debug/pkg/internal/driver/driver.go @@ -0,0 +1,408 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package driver implements the core pprof functionality. It can be +// parameterized with a flag implementation, fetch and symbolize +// mechanisms. +package driver + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/report" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// PProf acquires a profile, and symbolizes it using a profile +// manager. Then it generates a report formatted according to the +// options selected through the flags package. +func PProf(eo *plugin.Options) error { + // Remove any temporary files created during pprof processing. + defer cleanupTempFiles() + + o := setDefaults(eo) + + src, cmd, err := parseFlags(o) + if err != nil { + return err + } + + p, err := fetchProfiles(src, o) + if err != nil { + return err + } + + if cmd != nil { + return generateReport(p, cmd, currentConfig(), o) + } + + if src.HTTPHostport != "" { + return serveWebInterface(src.HTTPHostport, p, o, src.HTTPDisableBrowser) + } + return interactive(p, o) +} + +// generateRawReport is allowed to modify p. +func generateRawReport(p *profile.Profile, cmd []string, cfg config, o *plugin.Options) (*command, *report.Report, error) { + // Identify units of numeric tags in profile. + numLabelUnits := identifyNumLabelUnits(p, o.UI) + + // Get report output format + c := pprofCommands[cmd[0]] + if c == nil { + panic("unexpected nil command") + } + + cfg = applyCommandOverrides(cmd[0], c.format, cfg) + + // Create label pseudo nodes before filtering, in case the filters use + // the generated nodes. + generateTagRootsLeaves(p, cfg, o.UI) + + // Delay focus after configuring report to get percentages on all samples. + relative := cfg.RelativePercentages + if relative { + if err := applyFocus(p, numLabelUnits, cfg, o.UI); err != nil { + return nil, nil, err + } + } + ropt, err := reportOptions(p, numLabelUnits, cfg) + if err != nil { + return nil, nil, err + } + ropt.OutputFormat = c.format + if len(cmd) == 2 { + s, err := regexp.Compile(cmd[1]) + if err != nil { + return nil, nil, fmt.Errorf("parsing argument regexp %s: %v", cmd[1], err) + } + ropt.Symbol = s + } + + rpt := report.New(p, ropt) + if !relative { + if err := applyFocus(p, numLabelUnits, cfg, o.UI); err != nil { + return nil, nil, err + } + } + if err := aggregate(p, cfg); err != nil { + return nil, nil, err + } + + return c, rpt, nil +} + +// generateReport is allowed to modify p. +func generateReport(p *profile.Profile, cmd []string, cfg config, o *plugin.Options) error { + c, rpt, err := generateRawReport(p, cmd, cfg, o) + if err != nil { + return err + } + + // Generate the report. + dst := new(bytes.Buffer) + switch rpt.OutputFormat() { + case report.WebList: + // We need template expansion, so generate here instead of in report. + err = printWebList(dst, rpt, o.Obj) + default: + err = report.Generate(dst, rpt, o.Obj) + } + if err != nil { + return err + } + src := dst + + // If necessary, perform any data post-processing. + if c.postProcess != nil { + dst = new(bytes.Buffer) + if err := c.postProcess(src, dst, o.UI); err != nil { + return err + } + src = dst + } + + // If no output is specified, use default visualizer. + output := cfg.Output + if output == "" { + if c.visualizer != nil { + return c.visualizer(src, os.Stdout, o.UI) + } + _, err := src.WriteTo(os.Stdout) + return err + } + + // Output to specified file. + o.UI.PrintErr("Generating report in ", output) + out, err := o.Writer.Open(output) + if err != nil { + return err + } + if _, err := src.WriteTo(out); err != nil { + out.Close() + return err + } + return out.Close() +} + +func printWebList(dst io.Writer, rpt *report.Report, obj plugin.ObjTool) error { + listing, err := report.MakeWebList(rpt, obj, -1) + if err != nil { + return err + } + legend := report.ProfileLabels(rpt) + return renderHTML(dst, "sourcelisting", rpt, nil, legend, webArgs{ + Standalone: true, + Listing: listing, + }) +} + +func applyCommandOverrides(cmd string, outputFormat int, cfg config) config { + // Some report types override the trim flag to false below. This is to make + // sure the default heuristics of excluding insignificant nodes and edges + // from the call graph do not apply. One example where it is important is + // annotated source or disassembly listing. Those reports run on a specific + // function (or functions), but the trimming is applied before the function + // data is selected. So, with trimming enabled, the report could end up + // showing no data if the specified function is "uninteresting" as far as the + // trimming is concerned. + trim := cfg.Trim + + switch cmd { + case "disasm": + trim = false + cfg.Granularity = "addresses" + // Force the 'noinlines' mode so that source locations for a given address + // collapse and there is only one for the given address. Without this + // cumulative metrics would be double-counted when annotating the assembly. + // This is because the merge is done by address and in case of an inlined + // stack each of the inlined entries is a separate callgraph node. + cfg.NoInlines = true + case "weblist": + trim = false + cfg.Granularity = "addresses" + cfg.NoInlines = false // Need inline info to support call expansion + case "peek": + trim = false + case "list": + trim = false + cfg.Granularity = "lines" + // Do not force 'noinlines' to be false so that specifying + // "-list foo -noinlines" is supported and works as expected. + case "text", "top", "topproto": + if cfg.NodeCount == -1 { + cfg.NodeCount = 0 + } + default: + if cfg.NodeCount == -1 { + cfg.NodeCount = 80 + } + } + + switch outputFormat { + case report.Proto, report.Raw, report.Callgrind: + trim = false + cfg.Granularity = "addresses" + } + + if !trim { + cfg.NodeCount = 0 + cfg.NodeFraction = 0 + cfg.EdgeFraction = 0 + } + return cfg +} + +// generateTagRootsLeaves generates extra nodes from the tagroot and tagleaf options. +func generateTagRootsLeaves(prof *profile.Profile, cfg config, ui plugin.UI) { + tagRootLabelKeys := dropEmptyStrings(strings.Split(cfg.TagRoot, ",")) + tagLeafLabelKeys := dropEmptyStrings(strings.Split(cfg.TagLeaf, ",")) + rootm, leafm := addLabelNodes(prof, tagRootLabelKeys, tagLeafLabelKeys, cfg.Unit) + warnNoMatches(cfg.TagRoot == "" || rootm, "TagRoot", ui) + warnNoMatches(cfg.TagLeaf == "" || leafm, "TagLeaf", ui) +} + +// dropEmptyStrings filters a slice to only non-empty strings +func dropEmptyStrings(in []string) (out []string) { + for _, s := range in { + if s != "" { + out = append(out, s) + } + } + return +} + +func aggregate(prof *profile.Profile, cfg config) error { + var function, filename, linenumber, address bool + inlines := !cfg.NoInlines + switch cfg.Granularity { + case "": + function = true // Default granularity is "functions" + case "addresses": + if inlines { + return nil + } + function = true + filename = true + linenumber = true + address = true + case "lines": + function = true + filename = true + linenumber = true + case "files": + filename = true + case "functions": + function = true + case "filefunctions": + function = true + filename = true + default: + return fmt.Errorf("unexpected granularity") + } + return prof.Aggregate(inlines, function, filename, linenumber, cfg.ShowColumns, address) +} + +func reportOptions(p *profile.Profile, numLabelUnits map[string]string, cfg config) (*report.Options, error) { + si, mean := cfg.SampleIndex, cfg.Mean + value, meanDiv, sample, err := sampleFormat(p, si, mean) + if err != nil { + return nil, err + } + + stype := sample.Type + if mean { + stype = "mean_" + stype + } + + if cfg.DivideBy == 0 { + return nil, fmt.Errorf("zero divisor specified") + } + + var filters []string + addFilter := func(k string, v string) { + if v != "" { + filters = append(filters, k+"="+v) + } + } + addFilter("focus", cfg.Focus) + addFilter("ignore", cfg.Ignore) + addFilter("hide", cfg.Hide) + addFilter("show", cfg.Show) + addFilter("show_from", cfg.ShowFrom) + addFilter("tagfocus", cfg.TagFocus) + addFilter("tagignore", cfg.TagIgnore) + addFilter("tagshow", cfg.TagShow) + addFilter("taghide", cfg.TagHide) + + ropt := &report.Options{ + CumSort: cfg.Sort == "cum", + CallTree: cfg.CallTree, + DropNegative: cfg.DropNegative, + + CompactLabels: cfg.CompactLabels, + Ratio: 1 / cfg.DivideBy, + + NodeCount: cfg.NodeCount, + NodeFraction: cfg.NodeFraction, + EdgeFraction: cfg.EdgeFraction, + + ActiveFilters: filters, + NumLabelUnits: numLabelUnits, + + SampleValue: value, + SampleMeanDivisor: meanDiv, + SampleType: stype, + SampleUnit: sample.Unit, + + OutputUnit: cfg.Unit, + + SourcePath: cfg.SourcePath, + TrimPath: cfg.TrimPath, + + IntelSyntax: cfg.IntelSyntax, + } + + if len(p.Mapping) > 0 && p.Mapping[0].File != "" { + ropt.Title = filepath.Base(p.Mapping[0].File) + } + + return ropt, nil +} + +// identifyNumLabelUnits returns a map of numeric label keys to the units +// associated with those keys. +func identifyNumLabelUnits(p *profile.Profile, ui plugin.UI) map[string]string { + numLabelUnits, ignoredUnits := p.NumLabelUnits() + + // Print errors for tags with multiple units associated with + // a single key. + for k, units := range ignoredUnits { + ui.PrintErr(fmt.Sprintf("For tag %s used unit %s, also encountered unit(s) %s", k, numLabelUnits[k], strings.Join(units, ", "))) + } + return numLabelUnits +} + +type sampleValueFunc func([]int64) int64 + +// sampleFormat returns a function to extract values out of a profile.Sample, +// and the type/units of those values. +func sampleFormat(p *profile.Profile, sampleIndex string, mean bool) (value, meanDiv sampleValueFunc, v *profile.ValueType, err error) { + if len(p.SampleType) == 0 { + return nil, nil, nil, fmt.Errorf("profile has no samples") + } + index, err := p.SampleIndexByName(sampleIndex) + if err != nil { + return nil, nil, nil, err + } + value = valueExtractor(index) + if mean { + meanDiv = valueExtractor(0) + } + v = p.SampleType[index] + return +} + +func valueExtractor(ix int) sampleValueFunc { + return func(v []int64) int64 { + return v[ix] + } +} + +// profileCopier can be used to obtain a fresh copy of a profile. +// It is useful since reporting code may mutate the profile handed to it. +type profileCopier []byte + +func makeProfileCopier(src *profile.Profile) profileCopier { + // Pre-serialize the profile. We will deserialize every time a fresh copy is needed. + var buf bytes.Buffer + src.WriteUncompressed(&buf) + return profileCopier(buf.Bytes()) +} + +// newCopy returns a new copy of the profile. +func (c profileCopier) newCopy() *profile.Profile { + p, err := profile.ParseUncompressed([]byte(c)) + if err != nil { + panic(err) + } + return p +} diff --git a/plugin/debug/pkg/internal/driver/driver_focus.go b/plugin/debug/pkg/internal/driver/driver_focus.go new file mode 100644 index 00000000..510334f9 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/driver_focus.go @@ -0,0 +1,219 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "fmt" + "regexp" + "strconv" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +var tagFilterRangeRx = regexp.MustCompile("([+-]?[[:digit:]]+)([[:alpha:]]+)?") + +// applyFocus filters samples based on the focus/ignore options +func applyFocus(prof *profile.Profile, numLabelUnits map[string]string, cfg config, ui plugin.UI) error { + focus, err := compileRegexOption("focus", cfg.Focus, nil) + ignore, err := compileRegexOption("ignore", cfg.Ignore, err) + hide, err := compileRegexOption("hide", cfg.Hide, err) + show, err := compileRegexOption("show", cfg.Show, err) + showfrom, err := compileRegexOption("show_from", cfg.ShowFrom, err) + tagfocus, err := compileTagFilter("tagfocus", cfg.TagFocus, numLabelUnits, ui, err) + tagignore, err := compileTagFilter("tagignore", cfg.TagIgnore, numLabelUnits, ui, err) + prunefrom, err := compileRegexOption("prune_from", cfg.PruneFrom, err) + if err != nil { + return err + } + + fm, im, hm, hnm := prof.FilterSamplesByName(focus, ignore, hide, show) + warnNoMatches(focus == nil || fm, "Focus", ui) + warnNoMatches(ignore == nil || im, "Ignore", ui) + warnNoMatches(hide == nil || hm, "Hide", ui) + warnNoMatches(show == nil || hnm, "Show", ui) + + sfm := prof.ShowFrom(showfrom) + warnNoMatches(showfrom == nil || sfm, "ShowFrom", ui) + + tfm, tim := prof.FilterSamplesByTag(tagfocus, tagignore) + warnNoMatches(tagfocus == nil || tfm, "TagFocus", ui) + warnNoMatches(tagignore == nil || tim, "TagIgnore", ui) + + tagshow, err := compileRegexOption("tagshow", cfg.TagShow, err) + taghide, err := compileRegexOption("taghide", cfg.TagHide, err) + tns, tnh := prof.FilterTagsByName(tagshow, taghide) + warnNoMatches(tagshow == nil || tns, "TagShow", ui) + warnNoMatches(taghide == nil || tnh, "TagHide", ui) + + if prunefrom != nil { + prof.PruneFrom(prunefrom) + } + return err +} + +func compileRegexOption(name, value string, err error) (*regexp.Regexp, error) { + if value == "" || err != nil { + return nil, err + } + rx, err := regexp.Compile(value) + if err != nil { + return nil, fmt.Errorf("parsing %s regexp: %v", name, err) + } + return rx, nil +} + +func compileTagFilter(name, value string, numLabelUnits map[string]string, ui plugin.UI, err error) (func(*profile.Sample) bool, error) { + if value == "" || err != nil { + return nil, err + } + + tagValuePair := strings.SplitN(value, "=", 2) + var wantKey string + if len(tagValuePair) == 2 { + wantKey = tagValuePair[0] + value = tagValuePair[1] + } + + if numFilter := parseTagFilterRange(value); numFilter != nil { + ui.PrintErr(name, ":Interpreted '", value, "' as range, not regexp") + labelFilter := func(vals []int64, unit string) bool { + for _, val := range vals { + if numFilter(val, unit) { + return true + } + } + return false + } + numLabelUnit := func(key string) string { + return numLabelUnits[key] + } + if wantKey == "" { + return func(s *profile.Sample) bool { + for key, vals := range s.NumLabel { + if labelFilter(vals, numLabelUnit(key)) { + return true + } + } + return false + }, nil + } + return func(s *profile.Sample) bool { + if vals, ok := s.NumLabel[wantKey]; ok { + return labelFilter(vals, numLabelUnit(wantKey)) + } + return false + }, nil + } + + var rfx []*regexp.Regexp + for _, tagf := range strings.Split(value, ",") { + fx, err := regexp.Compile(tagf) + if err != nil { + return nil, fmt.Errorf("parsing %s regexp: %v", name, err) + } + rfx = append(rfx, fx) + } + if wantKey == "" { + return func(s *profile.Sample) bool { + matchedrx: + for _, rx := range rfx { + for key, vals := range s.Label { + for _, val := range vals { + // TODO: Match against val, not key:val in future + if rx.MatchString(key + ":" + val) { + continue matchedrx + } + } + } + return false + } + return true + }, nil + } + return func(s *profile.Sample) bool { + if vals, ok := s.Label[wantKey]; ok { + for _, rx := range rfx { + for _, val := range vals { + if rx.MatchString(val) { + return true + } + } + } + } + return false + }, nil +} + +// parseTagFilterRange returns a function to checks if a value is +// contained on the range described by a string. It can recognize +// strings of the form: +// "32kb" -- matches values == 32kb +// ":64kb" -- matches values <= 64kb +// "4mb:" -- matches values >= 4mb +// "12kb:64mb" -- matches values between 12kb and 64mb (both included). +func parseTagFilterRange(filter string) func(int64, string) bool { + ranges := tagFilterRangeRx.FindAllStringSubmatch(filter, 2) + if len(ranges) == 0 { + return nil // No ranges were identified + } + v, err := strconv.ParseInt(ranges[0][1], 10, 64) + if err != nil { + panic(fmt.Errorf("failed to parse int %s: %v", ranges[0][1], err)) + } + scaledValue, unit := measurement.Scale(v, ranges[0][2], ranges[0][2]) + if len(ranges) == 1 { + switch match := ranges[0][0]; filter { + case match: + return func(v int64, u string) bool { + sv, su := measurement.Scale(v, u, unit) + return su == unit && sv == scaledValue + } + case match + ":": + return func(v int64, u string) bool { + sv, su := measurement.Scale(v, u, unit) + return su == unit && sv >= scaledValue + } + case ":" + match: + return func(v int64, u string) bool { + sv, su := measurement.Scale(v, u, unit) + return su == unit && sv <= scaledValue + } + } + return nil + } + if filter != ranges[0][0]+":"+ranges[1][0] { + return nil + } + if v, err = strconv.ParseInt(ranges[1][1], 10, 64); err != nil { + panic(fmt.Errorf("failed to parse int %s: %v", ranges[1][1], err)) + } + scaledValue2, unit2 := measurement.Scale(v, ranges[1][2], unit) + if unit != unit2 { + return nil + } + return func(v int64, u string) bool { + sv, su := measurement.Scale(v, u, unit) + return su == unit && sv >= scaledValue && sv <= scaledValue2 + } +} + +func warnNoMatches(match bool, option string, ui plugin.UI) { + if !match { + ui.PrintErr(option + " expression matched no samples") + } +} diff --git a/plugin/debug/pkg/internal/driver/driver_test.go b/plugin/debug/pkg/internal/driver/driver_test.go new file mode 100644 index 00000000..5f0b26ca --- /dev/null +++ b/plugin/debug/pkg/internal/driver/driver_test.go @@ -0,0 +1,1755 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "bytes" + "flag" + "fmt" + "net" + _ "net/http/pprof" + "os" + "reflect" + "regexp" + "runtime" + "strconv" + "strings" + "testing" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/internal/symbolz" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +var updateFlag = flag.Bool("update", false, "Update the golden files") + +func TestParse(t *testing.T) { + // Override weblist command to collect output in buffer + pprofCommands["weblist"].postProcess = nil + + // Our mockObjTool.Open will always return success, causing + // driver.locateBinaries to "find" the binaries below in a non-existent + // directory. As a workaround, point the search path to the fake + // directory containing out fake binaries. + savePath := os.Getenv("PPROF_BINARY_PATH") + os.Setenv("PPROF_BINARY_PATH", "/path/to") + defer os.Setenv("PPROF_BINARY_PATH", savePath) + testcase := []struct { + flags, source string + }{ + {"text,functions,flat", "cpu"}, + {"text,functions,noinlines,flat", "cpu"}, + {"text,filefunctions,noinlines,flat", "cpu"}, + {"text,addresses,noinlines,flat", "cpu"}, + {"tree,addresses,flat,nodecount=4", "cpusmall"}, + {"text,functions,flat,nodecount=5,call_tree", "unknown"}, + {"text,alloc_objects,flat", "heap_alloc"}, + {"text,files,flat", "heap"}, + {"text,files,flat,focus=[12]00,taghide=[X3]00", "heap"}, + {"text,inuse_objects,flat", "heap"}, + {"text,lines,cum,hide=line[X3]0", "cpu"}, + {"text,lines,cum,show=[12]00", "cpu"}, + {"text,lines,cum,hide=line[X3]0,focus=[12]00", "cpu"}, + {"topproto,lines,cum,hide=mangled[X3]0", "cpu"}, + {"topproto,lines", "cpu"}, + {"tree,lines,cum,focus=[24]00", "heap"}, + {"tree,relative_percentages,cum,focus=[24]00", "heap"}, + {"tree,lines,cum,show_from=line2", "cpu"}, + {"callgrind", "cpu"}, + {"callgrind,call_tree", "cpu"}, + {"callgrind", "heap"}, + {"dot,functions,flat", "cpu"}, + {"dot,functions,flat,call_tree", "cpu"}, + {"dot,lines,flat,focus=[12]00", "heap"}, + {"dot,unit=minimum", "heap_sizetags"}, + {"dot,addresses,flat,ignore=[X3]002,focus=[X1]000", "contention"}, + {"dot,files,cum", "contention"}, + {"comments,add_comment=some-comment", "cpu"}, + {"comments", "heap"}, + {"tags", "cpu"}, + {"tags,tagignore=tag[13],tagfocus=key[12]", "cpu"}, + {"tags", "heap"}, + {"tags,unit=bytes", "heap"}, + {"traces", "cpu"}, + {"traces,addresses", "cpu"}, + {"traces", "heap_tags"}, + {"dot,alloc_space,flat,focus=[234]00", "heap_alloc"}, + {"dot,alloc_space,flat,tagshow=[2]00", "heap_alloc"}, + {"dot,alloc_space,flat,hide=line.*1?23?", "heap_alloc"}, + {"dot,inuse_space,flat,tagfocus=1mb:2gb", "heap"}, + {"dot,inuse_space,flat,tagfocus=30kb:,tagignore=1mb:2mb", "heap"}, + {"disasm=line[13],addresses,flat", "cpu"}, + {"peek=line.*01", "cpu"}, + {"weblist=line(1000|3000)$,addresses,flat", "cpu"}, + {"tags,tagfocus=400kb:", "heap_request"}, + {"tags,tagfocus=+400kb:", "heap_request"}, + {"dot", "long_name_funcs"}, + {"text", "long_name_funcs"}, + } + + baseConfig := currentConfig() + defer setCurrentConfig(baseConfig) + for _, tc := range testcase { + t.Run(tc.flags+":"+tc.source, func(t *testing.T) { + // Reset config before processing + setCurrentConfig(baseConfig) + + testUI := &proftest.TestUI{T: t, AllowRx: "Generating report in|Ignoring local file|expression matched no samples|Interpreted .* as range, not regexp"} + + f := baseFlags() + f.args = []string{tc.source} + + flags := strings.Split(tc.flags, ",") + + // Encode profile into a protobuf and decode it again. + protoTempFile, err := os.CreateTemp("", "profile_proto") + if err != nil { + t.Errorf("cannot create tempfile: %v", err) + } + defer os.Remove(protoTempFile.Name()) + defer protoTempFile.Close() + f.strings["output"] = protoTempFile.Name() + + if flags[0] == "topproto" { + f.bools["proto"] = false + f.bools["topproto"] = true + f.bools["addresses"] = true + } + + // First pprof invocation to save the profile into a profile.proto. + // Pass in flag set hen setting defaults, because otherwise default + // transport will try to add flags to the default flag set. + o1 := setDefaults(&plugin.Options{Flagset: f}) + o1.Fetch = testFetcher{} + o1.Sym = testSymbolizer{} + o1.UI = testUI + if err := PProf(o1); err != nil { + t.Fatalf("%s %q: %v", tc.source, tc.flags, err) + } + // Reset config after the proto invocation + setCurrentConfig(baseConfig) + + // Read the profile from the encoded protobuf + outputTempFile, err := os.CreateTemp("", "profile_output") + if err != nil { + t.Errorf("cannot create tempfile: %v", err) + } + defer os.Remove(outputTempFile.Name()) + defer outputTempFile.Close() + + f = baseFlags() + f.strings["output"] = outputTempFile.Name() + f.args = []string{protoTempFile.Name()} + + delete(f.bools, "proto") + addFlags(&f, flags) + solution := solutionFilename(tc.source, &f) + // Apply the flags for the second pprof run, and identify name of + // the file containing expected results + if flags[0] == "topproto" { + addFlags(&f, flags) + solution = solutionFilename(tc.source, &f) + delete(f.bools, "topproto") + f.bools["text"] = true + } + + // Second pprof invocation to read the profile from profile.proto + // and generate a report. + // Pass in flag set hen setting defaults, because otherwise default + // transport will try to add flags to the default flag set. + o2 := setDefaults(&plugin.Options{Flagset: f}) + o2.Sym = testSymbolizeDemangler{} + o2.Obj = new(mockObjTool) + o2.UI = testUI + + if err := PProf(o2); err != nil { + t.Errorf("%s: %v", tc.source, err) + } + b, err := os.ReadFile(outputTempFile.Name()) + if err != nil { + t.Errorf("Failed to read profile %s: %v", outputTempFile.Name(), err) + } + + // Read data file with expected solution + solution = "testdata/" + solution + sbuf, err := os.ReadFile(solution) + if err != nil { + t.Fatalf("reading solution file %s: %v", solution, err) + } + if runtime.GOOS == "windows" { + if flags[0] == "dot" { + // The .dot test has the paths inside strings, so \ must be escaped. + sbuf = bytes.Replace(sbuf, []byte("testdata/"), []byte(`testdata\\`), -1) + sbuf = bytes.Replace(sbuf, []byte("/path/to/"), []byte(`\\path\\to\\`), -1) + } else { + sbuf = bytes.Replace(sbuf, []byte("testdata/"), []byte(`testdata\`), -1) + sbuf = bytes.Replace(sbuf, []byte("/path/to/"), []byte(`\path\to\`), -1) + } + } + + if flags[0] == "svg" { + b = removeScripts(b) + sbuf = removeScripts(sbuf) + } + + if string(b) != string(sbuf) { + t.Errorf("diff %s %s", solution, tc.source) + d, err := proftest.Diff(sbuf, b) + if err != nil { + t.Fatalf("diff %s %v", solution, err) + } + t.Errorf("%s\n%s\n", solution, d) + if *updateFlag { + err := os.WriteFile(solution, b, 0644) + if err != nil { + t.Errorf("failed to update the solution file %q: %v", solution, err) + } + } + } + }) + } +} + +// removeScripts removes pairs from its input +func removeScripts(in []byte) []byte { + beginMarker := []byte("") + + if begin := bytes.Index(in, beginMarker); begin > 0 { + if end := bytes.Index(in[begin:], endMarker); end > 0 { + in = append(in[:begin], removeScripts(in[begin+end+len(endMarker):])...) + } + } + return in +} + +// addFlags parses flag descriptions and adds them to the testFlags +func addFlags(f *testFlags, flags []string) { + for _, flag := range flags { + fields := strings.SplitN(flag, "=", 2) + switch len(fields) { + case 1: + f.bools[fields[0]] = true + case 2: + if i, err := strconv.Atoi(fields[1]); err == nil { + f.ints[fields[0]] = i + } else { + f.strings[fields[0]] = fields[1] + } + } + } +} + +func testSourceURL(port int) string { + return fmt.Sprintf("http://%s/", net.JoinHostPort(testSourceAddress, strconv.Itoa(port))) +} + +// solutionFilename returns the name of the solution file for the test +func solutionFilename(source string, f *testFlags) string { + name := []string{"pprof", strings.TrimPrefix(source, testSourceURL(8000))} + name = addString(name, f, []string{"flat", "cum"}) + name = addString(name, f, []string{"functions", "filefunctions", "files", "lines", "addresses"}) + name = addString(name, f, []string{"noinlines"}) + name = addString(name, f, []string{"inuse_space", "inuse_objects", "alloc_space", "alloc_objects"}) + name = addString(name, f, []string{"relative_percentages"}) + name = addString(name, f, []string{"seconds"}) + name = addString(name, f, []string{"call_tree"}) + name = addString(name, f, []string{"text", "tree", "callgrind", "dot", "svg", "tags", "dot", "traces", "disasm", "peek", "weblist", "topproto", "comments"}) + if f.strings["focus"] != "" || f.strings["tagfocus"] != "" { + name = append(name, "focus") + } + if f.strings["ignore"] != "" || f.strings["tagignore"] != "" { + name = append(name, "ignore") + } + if f.strings["show_from"] != "" { + name = append(name, "show_from") + } + name = addString(name, f, []string{"hide", "show"}) + if f.strings["unit"] != "minimum" { + name = addString(name, f, []string{"unit"}) + } + return strings.Join(name, ".") +} + +func addString(name []string, f *testFlags, components []string) []string { + for _, c := range components { + if f.bools[c] || f.strings[c] != "" || f.ints[c] != 0 { + return append(name, c) + } + } + return name +} + +// testFlags implements the plugin.FlagSet interface. +type testFlags struct { + bools map[string]bool + ints map[string]int + floats map[string]float64 + strings map[string]string + args []string + stringLists map[string][]string +} + +func (testFlags) ExtraUsage() string { return "" } + +func (testFlags) AddExtraUsage(eu string) {} + +func (f testFlags) Bool(s string, d bool, c string) *bool { + if b, ok := f.bools[s]; ok { + return &b + } + return &d +} + +func (f testFlags) Int(s string, d int, c string) *int { + if i, ok := f.ints[s]; ok { + return &i + } + return &d +} + +func (f testFlags) Float64(s string, d float64, c string) *float64 { + if g, ok := f.floats[s]; ok { + return &g + } + return &d +} + +func (f testFlags) String(s, d, c string) *string { + if t, ok := f.strings[s]; ok { + return &t + } + return &d +} + +func (f testFlags) StringList(s, d, c string) *[]*string { + if t, ok := f.stringLists[s]; ok { + // convert slice of strings to slice of string pointers before returning. + tp := make([]*string, len(t)) + for i, v := range t { + tp[i] = &v + } + return &tp + } + return &[]*string{} +} + +func (f testFlags) Parse(func()) []string { + return f.args +} + +func baseFlags() testFlags { + return testFlags{ + bools: map[string]bool{ + "proto": true, + "trim": true, + "compact_labels": true, + }, + ints: map[string]int{ + "nodecount": 20, + }, + floats: map[string]float64{ + "nodefraction": 0.05, + "edgefraction": 0.01, + "divide_by": 1.0, + }, + strings: map[string]string{ + "unit": "minimum", + }, + } +} + +const testStart = 0x1000 +const testOffset = 0x5000 + +type testFetcher struct{} + +func (testFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) { + var p *profile.Profile + switch s { + case "cpu", "unknown": + p = cpuProfile() + case "cpusmall": + p = cpuProfileSmall() + case "heap": + p = heapProfile() + case "heap_alloc": + p = heapProfile() + p.SampleType = []*profile.ValueType{ + {Type: "alloc_objects", Unit: "count"}, + {Type: "alloc_space", Unit: "bytes"}, + } + case "heap_request": + p = heapProfile() + for _, s := range p.Sample { + s.NumLabel["request"] = s.NumLabel["bytes"] + } + case "heap_sizetags": + p = heapProfile() + tags := []int64{2, 4, 8, 16, 32, 64, 128, 256} + for _, s := range p.Sample { + numValues := append(s.NumLabel["bytes"], tags...) + s.NumLabel["bytes"] = numValues + } + case "heap_tags": + p = heapProfile() + for i := 0; i < len(p.Sample); i += 2 { + s := p.Sample[i] + if s.Label == nil { + s.Label = make(map[string][]string) + } + s.NumLabel["request"] = s.NumLabel["bytes"] + s.Label["key1"] = []string{"tag"} + } + case "contention": + p = contentionProfile() + case "symbolz": + p = symzProfile() + case "long_name_funcs": + p = longNameFuncsProfile() + default: + return nil, "", fmt.Errorf("unexpected source: %s", s) + } + return p, testSourceURL(8000) + s, nil +} + +type testSymbolizer struct{} + +func (testSymbolizer) Symbolize(_ string, _ plugin.MappingSources, _ *profile.Profile) error { + return nil +} + +type testSymbolizeDemangler struct{} + +func (testSymbolizeDemangler) Symbolize(_ string, _ plugin.MappingSources, p *profile.Profile) error { + for _, fn := range p.Function { + if fn.Name == "" || fn.SystemName == fn.Name { + fn.Name = fakeDemangler(fn.SystemName) + } + } + return nil +} + +func testFetchSymbols(source, post string) ([]byte, error) { + var buf bytes.Buffer + + switch source { + case testSourceURL(8000) + "symbolz": + for _, address := range strings.Split(post, "+") { + a, _ := strconv.ParseInt(address, 0, 64) + fmt.Fprintf(&buf, "%v\t", address) + if a-testStart > testOffset { + fmt.Fprintf(&buf, "wrong_source_%v_", address) + continue + } + fmt.Fprintf(&buf, "%#x\n", a-testStart) + } + return buf.Bytes(), nil + case testSourceURL(8001) + "symbolz": + for _, address := range strings.Split(post, "+") { + a, _ := strconv.ParseInt(address, 0, 64) + fmt.Fprintf(&buf, "%v\t", address) + if a-testStart < testOffset { + fmt.Fprintf(&buf, "wrong_source_%v_", address) + continue + } + fmt.Fprintf(&buf, "%#x\n", a-testStart-testOffset) + } + return buf.Bytes(), nil + default: + return nil, fmt.Errorf("unexpected source: %s", source) + } +} + +type testSymbolzSymbolizer struct{} + +func (testSymbolzSymbolizer) Symbolize(variables string, sources plugin.MappingSources, p *profile.Profile) error { + return symbolz.Symbolize(p, false, sources, testFetchSymbols, nil) +} + +func fakeDemangler(name string) string { + switch name { + case "mangled1000": + return "line1000" + case "mangled2000": + return "line2000" + case "mangled2001": + return "line2001" + case "mangled3000": + return "line3000" + case "mangled3001": + return "line3001" + case "mangled3002": + return "line3002" + case "mangledNEW": + return "operator new" + case "mangledMALLOC": + return "malloc" + default: + return name + } +} + +// longNameFuncsProfile returns a profile with function names which should be +// shortened in graph and flame views. +func longNameFuncsProfile() *profile.Profile { + var longNameFuncsM = []*profile.Mapping{ + { + ID: 1, + Start: 0x1000, + Limit: 0x4000, + File: "/path/to/testbinary", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + } + + var longNameFuncsF = []*profile.Function{ + {ID: 1, Name: "path/to/package1.object.function1", SystemName: "path/to/package1.object.function1", Filename: "path/to/package1.go"}, + {ID: 2, Name: "(anonymous namespace)::Bar::Foo", SystemName: "(anonymous namespace)::Bar::Foo", Filename: "a/long/path/to/package2.cc"}, + {ID: 3, Name: "java.bar.foo.FooBar.run(java.lang.Runnable)", SystemName: "java.bar.foo.FooBar.run(java.lang.Runnable)", Filename: "FooBar.java"}, + } + + var longNameFuncsL = []*profile.Location{ + { + ID: 1000, + Mapping: longNameFuncsM[0], + Address: 0x1000, + Line: []profile.Line{ + {Function: longNameFuncsF[0], Line: 1}, + }, + }, + { + ID: 2000, + Mapping: longNameFuncsM[0], + Address: 0x2000, + Line: []profile.Line{ + {Function: longNameFuncsF[1], Line: 4}, + }, + }, + { + ID: 3000, + Mapping: longNameFuncsM[0], + Address: 0x3000, + Line: []profile.Line{ + {Function: longNameFuncsF[2], Line: 9}, + }, + }, + } + + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{longNameFuncsL[0], longNameFuncsL[1], longNameFuncsL[2]}, + Value: []int64{1000, 1000}, + }, + { + Location: []*profile.Location{longNameFuncsL[0], longNameFuncsL[1]}, + Value: []int64{100, 100}, + }, + { + Location: []*profile.Location{longNameFuncsL[2]}, + Value: []int64{10, 10}, + }, + }, + Location: longNameFuncsL, + Function: longNameFuncsF, + Mapping: longNameFuncsM, + } +} + +func cpuProfile() *profile.Profile { + var cpuM = []*profile.Mapping{ + { + ID: 1, + Start: 0x1000, + Limit: 0x4000, + File: "/path/to/testbinary", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + } + + var cpuF = []*profile.Function{ + {ID: 1, Name: "mangled1000", SystemName: "mangled1000", Filename: "testdata/file1000.src"}, + {ID: 2, Name: "mangled2000", SystemName: "mangled2000", Filename: "testdata/file2000.src"}, + {ID: 3, Name: "mangled2001", SystemName: "mangled2001", Filename: "testdata/file2000.src"}, + {ID: 4, Name: "mangled3000", SystemName: "mangled3000", Filename: "testdata/file3000.src"}, + {ID: 5, Name: "mangled3001", SystemName: "mangled3001", Filename: "testdata/file3000.src"}, + {ID: 6, Name: "mangled3002", SystemName: "mangled3002", Filename: "testdata/file3000.src"}, + } + + var cpuL = []*profile.Location{ + { + ID: 1000, + Mapping: cpuM[0], + Address: 0x1000, + Line: []profile.Line{ + {Function: cpuF[0], Line: 1}, + }, + }, + { + ID: 2000, + Mapping: cpuM[0], + Address: 0x2000, + Line: []profile.Line{ + {Function: cpuF[2], Line: 9}, + {Function: cpuF[1], Line: 4}, + }, + }, + { + ID: 3000, + Mapping: cpuM[0], + Address: 0x3000, + Line: []profile.Line{ + {Function: cpuF[5], Line: 2}, + {Function: cpuF[4], Line: 5}, + {Function: cpuF[3], Line: 6}, + }, + }, + { + ID: 3001, + Mapping: cpuM[0], + Address: 0x3001, + Line: []profile.Line{ + {Function: cpuF[4], Line: 8}, + {Function: cpuF[3], Line: 9}, + }, + }, + { + ID: 3002, + Mapping: cpuM[0], + Address: 0x3002, + Line: []profile.Line{ + {Function: cpuF[5], Line: 5}, + {Function: cpuF[3], Line: 9}, + }, + }, + } + + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{cpuL[0], cpuL[1], cpuL[2]}, + Value: []int64{1000, 1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*profile.Location{cpuL[0], cpuL[3]}, + Value: []int64{100, 100}, + Label: map[string][]string{ + "key1": {"tag2"}, + "key3": {"tag2"}, + }, + }, + { + Location: []*profile.Location{cpuL[1], cpuL[4]}, + Value: []int64{10, 10}, + Label: map[string][]string{ + "key1": {"tag3"}, + "key2": {"tag2"}, + }, + }, + { + Location: []*profile.Location{cpuL[2]}, + Value: []int64{10, 10}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, + } +} + +func cpuProfileSmall() *profile.Profile { + var cpuM = []*profile.Mapping{ + { + ID: 1, + Start: 0x1000, + Limit: 0x4000, + File: "/path/to/testbinary", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + } + + var cpuL = []*profile.Location{ + { + ID: 1000, + Mapping: cpuM[0], + Address: 0x1000, + }, + { + ID: 2000, + Mapping: cpuM[0], + Address: 0x2000, + }, + { + ID: 3000, + Mapping: cpuM[0], + Address: 0x3000, + }, + { + ID: 4000, + Mapping: cpuM[0], + Address: 0x4000, + }, + { + ID: 5000, + Mapping: cpuM[0], + Address: 0x5000, + }, + } + + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{cpuL[0], cpuL[1], cpuL[2]}, + Value: []int64{1000, 1000}, + }, + { + Location: []*profile.Location{cpuL[3], cpuL[1], cpuL[4]}, + Value: []int64{1000, 1000}, + }, + { + Location: []*profile.Location{cpuL[2]}, + Value: []int64{1000, 1000}, + }, + { + Location: []*profile.Location{cpuL[4]}, + Value: []int64{1000, 1000}, + }, + }, + Location: cpuL, + Function: nil, + Mapping: cpuM, + } +} + +func heapProfile() *profile.Profile { + var heapM = []*profile.Mapping{ + { + ID: 1, + BuildID: "buildid", + Start: 0x1000, + Limit: 0x4000, + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + } + + var heapF = []*profile.Function{ + {ID: 1, Name: "pruneme", SystemName: "pruneme", Filename: "prune.h"}, + {ID: 2, Name: "mangled1000", SystemName: "mangled1000", Filename: "testdata/file1000.src"}, + {ID: 3, Name: "mangled2000", SystemName: "mangled2000", Filename: "testdata/file2000.src"}, + {ID: 4, Name: "mangled2001", SystemName: "mangled2001", Filename: "testdata/file2000.src"}, + {ID: 5, Name: "mangled3000", SystemName: "mangled3000", Filename: "testdata/file3000.src"}, + {ID: 6, Name: "mangled3001", SystemName: "mangled3001", Filename: "testdata/file3000.src"}, + {ID: 7, Name: "mangled3002", SystemName: "mangled3002", Filename: "testdata/file3000.src"}, + {ID: 8, Name: "mangledMALLOC", SystemName: "mangledMALLOC", Filename: "malloc.h"}, + {ID: 9, Name: "mangledNEW", SystemName: "mangledNEW", Filename: "new.h"}, + } + + var heapL = []*profile.Location{ + { + ID: 1000, + Mapping: heapM[0], + Address: 0x1000, + Line: []profile.Line{ + {Function: heapF[0], Line: 100}, + {Function: heapF[7], Line: 100}, + {Function: heapF[1], Line: 1}, + }, + }, + { + ID: 2000, + Mapping: heapM[0], + Address: 0x2000, + Line: []profile.Line{ + {Function: heapF[8], Line: 100}, + {Function: heapF[3], Line: 2}, + {Function: heapF[2], Line: 3}, + }, + }, + { + ID: 3000, + Mapping: heapM[0], + Address: 0x3000, + Line: []profile.Line{ + {Function: heapF[8], Line: 100}, + {Function: heapF[6], Line: 3}, + {Function: heapF[5], Line: 2}, + {Function: heapF[4], Line: 4}, + }, + }, + { + ID: 3001, + Mapping: heapM[0], + Address: 0x3001, + Line: []profile.Line{ + {Function: heapF[0], Line: 100}, + {Function: heapF[8], Line: 100}, + {Function: heapF[5], Line: 2}, + {Function: heapF[4], Line: 4}, + }, + }, + { + ID: 3002, + Mapping: heapM[0], + Address: 0x3002, + Line: []profile.Line{ + {Function: heapF[6], Line: 3}, + {Function: heapF[4], Line: 4}, + }, + }, + } + + return &profile.Profile{ + Comments: []string{"comment", "#hidden comment"}, + PeriodType: &profile.ValueType{Type: "allocations", Unit: "bytes"}, + Period: 524288, + SampleType: []*profile.ValueType{ + {Type: "inuse_objects", Unit: "count"}, + {Type: "inuse_space", Unit: "bytes"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{heapL[0], heapL[1], heapL[2]}, + Value: []int64{10, 1024000}, + NumLabel: map[string][]int64{"bytes": {102400}}, + }, + { + Location: []*profile.Location{heapL[0], heapL[3]}, + Value: []int64{20, 4096000}, + NumLabel: map[string][]int64{"bytes": {204800}}, + }, + { + Location: []*profile.Location{heapL[1], heapL[4]}, + Value: []int64{40, 65536000}, + NumLabel: map[string][]int64{"bytes": {1638400}}, + }, + { + Location: []*profile.Location{heapL[2]}, + Value: []int64{80, 32768000}, + NumLabel: map[string][]int64{"bytes": {409600}}, + }, + }, + DropFrames: ".*operator new.*|malloc", + Location: heapL, + Function: heapF, + Mapping: heapM, + } +} + +func contentionProfile() *profile.Profile { + var contentionM = []*profile.Mapping{ + { + ID: 1, + BuildID: "buildid-contention", + Start: 0x1000, + Limit: 0x4000, + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + } + + var contentionF = []*profile.Function{ + {ID: 1, Name: "mangled1000", SystemName: "mangled1000", Filename: "testdata/file1000.src"}, + {ID: 2, Name: "mangled2000", SystemName: "mangled2000", Filename: "testdata/file2000.src"}, + {ID: 3, Name: "mangled2001", SystemName: "mangled2001", Filename: "testdata/file2000.src"}, + {ID: 4, Name: "mangled3000", SystemName: "mangled3000", Filename: "testdata/file3000.src"}, + {ID: 5, Name: "mangled3001", SystemName: "mangled3001", Filename: "testdata/file3000.src"}, + {ID: 6, Name: "mangled3002", SystemName: "mangled3002", Filename: "testdata/file3000.src"}, + } + + var contentionL = []*profile.Location{ + { + ID: 1000, + Mapping: contentionM[0], + Address: 0x1000, + Line: []profile.Line{ + {Function: contentionF[0], Line: 1}, + }, + }, + { + ID: 2000, + Mapping: contentionM[0], + Address: 0x2000, + Line: []profile.Line{ + {Function: contentionF[2], Line: 2}, + {Function: contentionF[1], Line: 3}, + }, + }, + { + ID: 3000, + Mapping: contentionM[0], + Address: 0x3000, + Line: []profile.Line{ + {Function: contentionF[5], Line: 2}, + {Function: contentionF[4], Line: 3}, + {Function: contentionF[3], Line: 5}, + }, + }, + { + ID: 3001, + Mapping: contentionM[0], + Address: 0x3001, + Line: []profile.Line{ + {Function: contentionF[4], Line: 3}, + {Function: contentionF[3], Line: 5}, + }, + }, + { + ID: 3002, + Mapping: contentionM[0], + Address: 0x3002, + Line: []profile.Line{ + {Function: contentionF[5], Line: 4}, + {Function: contentionF[3], Line: 3}, + }, + }, + } + + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "contentions", Unit: "count"}, + Period: 524288, + SampleType: []*profile.ValueType{ + {Type: "contentions", Unit: "count"}, + {Type: "delay", Unit: "nanoseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{contentionL[0], contentionL[1], contentionL[2]}, + Value: []int64{10, 10240000}, + }, + { + Location: []*profile.Location{contentionL[0], contentionL[3]}, + Value: []int64{20, 40960000}, + }, + { + Location: []*profile.Location{contentionL[1], contentionL[4]}, + Value: []int64{40, 65536000}, + }, + { + Location: []*profile.Location{contentionL[2]}, + Value: []int64{80, 32768000}, + }, + }, + Location: contentionL, + Function: contentionF, + Mapping: contentionM, + Comments: []string{"Comment #1", "Comment #2"}, + } +} + +func symzProfile() *profile.Profile { + var symzM = []*profile.Mapping{ + { + ID: 1, + Start: testStart, + Limit: 0x4000, + File: "/path/to/testbinary", + }, + } + + var symzL = []*profile.Location{ + {ID: 1, Mapping: symzM[0], Address: testStart}, + {ID: 2, Mapping: symzM[0], Address: testStart + 0x1000}, + {ID: 3, Mapping: symzM[0], Address: testStart + 0x2000}, + } + + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{symzL[0], symzL[1], symzL[2]}, + Value: []int64{1, 1}, + }, + }, + Location: symzL, + Mapping: symzM, + } +} + +func largeProfile(tb testing.TB) *profile.Profile { + tb.Helper() + input := proftest.LargeProfile(tb) + prof, err := profile.Parse(bytes.NewBuffer(input)) + if err != nil { + tb.Fatal(err) + } + return prof +} + +var autoCompleteTests = []struct { + in string + out string +}{ + {"", ""}, + {"xyz", "xyz"}, // no match + {"dis", "disasm"}, // single match + {"t", "t"}, // many matches + {"top abc", "top abc"}, // no function name match + {"top mangledM", "top mangledMALLOC"}, // single function name match + {"top cmd cmd mangledM", "top cmd cmd mangledMALLOC"}, + {"top mangled", "top mangled"}, // many function name matches + {"cmd mangledM", "cmd mangledM"}, // invalid command + {"top mangledM cmd", "top mangledM cmd"}, // cursor misplaced + {"top edMA", "top mangledMALLOC"}, // single infix function name match + {"top -mangledM", "top -mangledMALLOC"}, // ignore sign handled + {"lin", "lines"}, // single variable match + {"EdGeF", "edgefraction"}, // single capitalized match + {"help dis", "help disasm"}, // help command match + {"help relative_perc", "help relative_percentages"}, // help variable match + {"help coMpa", "help compact_labels"}, // help variable capitalized match +} + +func TestAutoComplete(t *testing.T) { + complete := newCompleter(functionNames(heapProfile())) + + for _, test := range autoCompleteTests { + if out := complete(test.in); out != test.out { + t.Errorf("autoComplete(%s) = %s; want %s", test.in, out, test.out) + } + } +} + +func TestTagFilter(t *testing.T) { + var tagFilterTests = []struct { + desc, value string + tags map[string][]string + want bool + }{ + { + "1 key with 1 matching value", + "tag2", + map[string][]string{"value1": {"tag1", "tag2"}}, + true, + }, + { + "1 key with no matching values", + "tag3", + map[string][]string{"value1": {"tag1", "tag2"}}, + false, + }, + { + "two keys, each with value matching different one value in list", + "tag1,tag3", + map[string][]string{"value1": {"tag1", "tag2"}, "value2": {"tag3"}}, + true, + }, + {"two keys, all value matching different regex value in list", + "t..[12],t..3", + map[string][]string{"value1": {"tag1", "tag2"}, "value2": {"tag3"}}, + true, + }, + { + "one key, not all values in list matched", + "tag2,tag3", + map[string][]string{"value1": {"tag1", "tag2"}}, + false, + }, + { + "key specified, list of tags where all tags in list matched", + "key1=tag1,tag2", + map[string][]string{"key1": {"tag1", "tag2"}}, + true, + }, + {"key specified, list of tag values where not all are matched", + "key1=tag1,tag2", + map[string][]string{"key1": {"tag1"}}, + true, + }, + { + "key included for regex matching, list of values where all values in list matched", + "key1:tag1,tag2", + map[string][]string{"key1": {"tag1", "tag2"}}, + true, + }, + { + "key included for regex matching, list of values where not only second value matched", + "key1:tag1,tag2", + map[string][]string{"key1": {"tag2"}}, + false, + }, + { + "key included for regex matching, list of values where not only first value matched", + "key1:tag1,tag2", + map[string][]string{"key1": {"tag1"}}, + false, + }, + } + for _, test := range tagFilterTests { + t.Run(test.desc, func(t *testing.T) { + filter, err := compileTagFilter(test.desc, test.value, nil, &proftest.TestUI{T: t}, nil) + if err != nil { + t.Fatalf("tagFilter %s:%v", test.desc, err) + } + s := profile.Sample{ + Label: test.tags, + } + if got := filter(&s); got != test.want { + t.Errorf("tagFilter %s: got %v, want %v", test.desc, got, test.want) + } + }) + } +} + +func TestIdentifyNumLabelUnits(t *testing.T) { + var tagFilterTests = []struct { + desc string + tagVals []map[string][]int64 + tagUnits []map[string][]string + wantUnits map[string]string + allowedRx string + wantIgnoreErrCount int + }{ + { + "Multiple keys, no units for all keys", + []map[string][]int64{{"keyA": {131072}, "keyB": {128}}}, + []map[string][]string{{"keyA": {}, "keyB": {""}}}, + map[string]string{"keyA": "keyA", "keyB": "keyB"}, + "", + 0, + }, + { + "Multiple keys, different units for each key", + []map[string][]int64{{"keyA": {131072}, "keyB": {128}}}, + []map[string][]string{{"keyA": {"bytes"}, "keyB": {"kilobytes"}}}, + map[string]string{"keyA": "bytes", "keyB": "kilobytes"}, + "", + 0, + }, + { + "Multiple keys with multiple values, different units for each key", + []map[string][]int64{{"keyC": {131072, 1}, "keyD": {128, 252}}}, + []map[string][]string{{"keyC": {"bytes", "bytes"}, "keyD": {"kilobytes", "kilobytes"}}}, + map[string]string{"keyC": "bytes", "keyD": "kilobytes"}, + "", + 0, + }, + { + "Multiple keys with multiple values, some units missing", + []map[string][]int64{{"key1": {131072, 1}, "A": {128, 252}, "key3": {128}, "key4": {1}}, {"key3": {128}, "key4": {1}}}, + []map[string][]string{{"key1": {"", "bytes"}, "A": {"kilobytes", ""}, "key3": {""}, "key4": {"hour"}}, {"key3": {"seconds"}, "key4": {""}}}, + map[string]string{"key1": "bytes", "A": "kilobytes", "key3": "seconds", "key4": "hour"}, + "", + 0, + }, + { + "One key with three units in same sample", + []map[string][]int64{{"key": {8, 8, 16}}}, + []map[string][]string{{"key": {"bytes", "megabytes", "kilobytes"}}}, + map[string]string{"key": "bytes"}, + `(For tag key used unit bytes, also encountered unit\(s\) kilobytes, megabytes)`, + 1, + }, + { + "One key with four units in same sample", + []map[string][]int64{{"key": {8, 8, 16, 32}}}, + []map[string][]string{{"key": {"bytes", "kilobytes", "a", "megabytes"}}}, + map[string]string{"key": "bytes"}, + `(For tag key used unit bytes, also encountered unit\(s\) a, kilobytes, megabytes)`, + 1, + }, + { + "One key with two units in same sample", + []map[string][]int64{{"key": {8, 8}}}, + []map[string][]string{{"key": {"bytes", "seconds"}}}, + map[string]string{"key": "bytes"}, + `(For tag key used unit bytes, also encountered unit\(s\) seconds)`, + 1, + }, + { + "One key with different units in different samples", + []map[string][]int64{{"key1": {8}}, {"key1": {8}}, {"key1": {8}}}, + []map[string][]string{{"key1": {"bytes"}}, {"key1": {"kilobytes"}}, {"key1": {"megabytes"}}}, + map[string]string{"key1": "bytes"}, + `(For tag key1 used unit bytes, also encountered unit\(s\) kilobytes, megabytes)`, + 1, + }, + { + "Key alignment, unit not specified", + []map[string][]int64{{"alignment": {8}}}, + []map[string][]string{nil}, + map[string]string{"alignment": "bytes"}, + "", + 0, + }, + { + "Key request, unit not specified", + []map[string][]int64{{"request": {8}}, {"request": {8, 8}}}, + []map[string][]string{nil, nil}, + map[string]string{"request": "bytes"}, + "", + 0, + }, + { + "Check units not over-written for keys with default units", + []map[string][]int64{{ + "alignment": {8}, + "request": {8}, + "bytes": {8}, + }}, + []map[string][]string{{ + "alignment": {"seconds"}, + "request": {"minutes"}, + "bytes": {"hours"}, + }}, + map[string]string{ + "alignment": "seconds", + "request": "minutes", + "bytes": "hours", + }, + "", + 0, + }, + } + for _, test := range tagFilterTests { + t.Run(test.desc, func(t *testing.T) { + p := profile.Profile{Sample: make([]*profile.Sample, len(test.tagVals))} + for i, numLabel := range test.tagVals { + s := profile.Sample{ + NumLabel: numLabel, + NumUnit: test.tagUnits[i], + } + p.Sample[i] = &s + } + testUI := &proftest.TestUI{T: t, AllowRx: test.allowedRx} + units := identifyNumLabelUnits(&p, testUI) + if !reflect.DeepEqual(test.wantUnits, units) { + t.Errorf("got %v units, want %v", units, test.wantUnits) + } + if got, want := testUI.NumAllowRxMatches, test.wantIgnoreErrCount; want != got { + t.Errorf("got %d errors logged, want %d errors logged", got, want) + } + }) + } +} + +func TestNumericTagFilter(t *testing.T) { + var tagFilterTests = []struct { + desc, value string + tags map[string][]int64 + identifiedUnits map[string]string + want bool + }{ + { + "Match when unit conversion required", + "128kb", + map[string][]int64{"key1": {131072}, "key2": {128}}, + map[string]string{"key1": "bytes", "key2": "kilobytes"}, + true, + }, + { + "Match only when values equal after unit conversion", + "512kb", + map[string][]int64{"key1": {512}, "key2": {128}}, + map[string]string{"key1": "bytes", "key2": "kilobytes"}, + false, + }, + { + "Match when values and units initially equal", + "10bytes", + map[string][]int64{"key1": {10}, "key2": {128}}, + map[string]string{"key1": "bytes", "key2": "kilobytes"}, + true, + }, + { + "Match range without lower bound, no unit conversion required", + ":10bytes", + map[string][]int64{"key1": {8}}, + map[string]string{"key1": "bytes"}, + true, + }, + { + "Match range without lower bound, unit conversion required", + ":10kb", + map[string][]int64{"key1": {8}}, + map[string]string{"key1": "bytes"}, + true, + }, + { + "Match range without upper bound, unit conversion required", + "10b:", + map[string][]int64{"key1": {8}}, + map[string]string{"key1": "kilobytes"}, + true, + }, + { + "Match range without upper bound, no unit conversion required", + "10b:", + map[string][]int64{"key1": {12}}, + map[string]string{"key1": "bytes"}, + true, + }, + { + "Don't match range without upper bound, no unit conversion required", + "10b:", + map[string][]int64{"key1": {8}}, + map[string]string{"key1": "bytes"}, + false, + }, + { + "Multiple keys with different units, don't match range without upper bound", + "10kb:", + map[string][]int64{"key1": {8}}, + map[string]string{"key1": "bytes", "key2": "kilobytes"}, + false, + }, + { + "Match range without upper bound, unit conversion required", + "10b:", + map[string][]int64{"key1": {8}}, + map[string]string{"key1": "kilobytes"}, + true, + }, + { + "Don't match range without lower bound, no unit conversion required", + ":10b", + map[string][]int64{"key1": {12}}, + map[string]string{"key1": "bytes"}, + false, + }, + { + "Match specific key, key present, one of two values match", + "bytes=5b", + map[string][]int64{"bytes": {10, 5}}, + map[string]string{"bytes": "bytes"}, + true, + }, + { + "Match specific key, key present and value matches", + "bytes=1024b", + map[string][]int64{"bytes": {1024}}, + map[string]string{"bytes": "kilobytes"}, + false, + }, + { + "Match specific key, matching key present and value matches, also non-matching key", + "bytes=1024b", + map[string][]int64{"bytes": {1024}, "key2": {5}}, + map[string]string{"bytes": "bytes", "key2": "bytes"}, + true, + }, + { + "Match specific key and range of values, value matches", + "bytes=512b:1024b", + map[string][]int64{"bytes": {780}}, + map[string]string{"bytes": "bytes"}, + true, + }, + { + "Match specific key and range of values, value too large", + "key1=1kb:2kb", + map[string][]int64{"key1": {4096}}, + map[string]string{"key1": "bytes"}, + false, + }, + { + "Match specific key and range of values, value too small", + "key1=1kb:2kb", + map[string][]int64{"key1": {256}}, + map[string]string{"key1": "bytes"}, + false, + }, + { + "Match specific key and value, unit conversion required", + "bytes=1024b", + map[string][]int64{"bytes": {1}}, + map[string]string{"bytes": "kilobytes"}, + true, + }, + { + "Match specific key and value, key does not appear", + "key2=256bytes", + map[string][]int64{"key1": {256}}, + map[string]string{"key1": "bytes"}, + false, + }, + { + "Match negative key and range of values, value matches", + "bytes=-512b:-128b", + map[string][]int64{"bytes": {-256}}, + map[string]string{"bytes": "bytes"}, + true, + }, + { + "Match negative key and range of values, value outside range", + "bytes=-512b:-128b", + map[string][]int64{"bytes": {-2048}}, + map[string]string{"bytes": "bytes"}, + false, + }, + { + "Match exact value, unitless tag", + "pid=123", + map[string][]int64{"pid": {123}}, + nil, + true, + }, + { + "Match range, unitless tag", + "pid=123:123", + map[string][]int64{"pid": {123}}, + nil, + true, + }, + { + "Don't match range, unitless tag", + "pid=124:124", + map[string][]int64{"pid": {123}}, + nil, + false, + }, + { + "Match range without upper bound, unitless tag", + "pid=100:", + map[string][]int64{"pid": {123}}, + nil, + true, + }, + { + "Don't match range without upper bound, unitless tag", + "pid=200:", + map[string][]int64{"pid": {123}}, + nil, + false, + }, + { + "Match range without lower bound, unitless tag", + "pid=:200", + map[string][]int64{"pid": {123}}, + nil, + true, + }, + { + "Don't match range without lower bound, unitless tag", + "pid=:100", + map[string][]int64{"pid": {123}}, + nil, + false, + }, + } + for _, test := range tagFilterTests { + t.Run(test.desc, func(t *testing.T) { + wantErrMsg := strings.Join([]string{"(", test.desc, ":Interpreted '", test.value[strings.Index(test.value, "=")+1:], "' as range, not regexp", ")"}, "") + filter, err := compileTagFilter(test.desc, test.value, test.identifiedUnits, &proftest.TestUI{T: t, + AllowRx: wantErrMsg}, nil) + if err != nil { + t.Fatalf("%v", err) + } + s := profile.Sample{ + NumLabel: test.tags, + } + if got := filter(&s); got != test.want { + t.Fatalf("got %v, want %v", got, test.want) + } + }) + } +} + +// TestOptionsHaveHelp tests that a help message is supplied for every +// selectable option. +func TestOptionsHaveHelp(t *testing.T) { + for _, f := range configFields { + // Check all choices if this is a group, else check f.name. + names := f.choices + if len(names) == 0 { + names = []string{f.name} + } + for _, name := range names { + if _, ok := configHelp[name]; !ok { + t.Errorf("missing help message for %q", name) + } + } + } +} + +type testSymbolzMergeFetcher struct{} + +func (testSymbolzMergeFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) { + var p *profile.Profile + switch s { + case testSourceURL(8000) + "symbolz": + p = symzProfile() + case testSourceURL(8001) + "symbolz": + p = symzProfile() + p.Mapping[0].Start += testOffset + p.Mapping[0].Limit += testOffset + for i := range p.Location { + p.Location[i].Address += testOffset + } + default: + return nil, "", fmt.Errorf("unexpected source: %s", s) + } + return p, s, nil +} + +func TestSymbolzAfterMerge(t *testing.T) { + baseConfig := currentConfig() + defer setCurrentConfig(baseConfig) + + f := baseFlags() + f.args = []string{ + testSourceURL(8000) + "symbolz", + testSourceURL(8001) + "symbolz", + } + + o := setDefaults(nil) + o.Flagset = f + o.Obj = new(mockObjTool) + src, cmd, err := parseFlags(o) + if err != nil { + t.Fatalf("parseFlags: %v", err) + } + + if len(cmd) != 1 || cmd[0] != "proto" { + t.Fatalf("parseFlags returned command %v, want [proto]", cmd) + } + + o.Fetch = testSymbolzMergeFetcher{} + o.Sym = testSymbolzSymbolizer{} + p, err := fetchProfiles(src, o) + if err != nil { + t.Fatalf("fetchProfiles: %v", err) + } + if len(p.Location) != 3 { + t.Errorf("Got %d locations after merge, want %d", len(p.Location), 3) + } + for i, l := range p.Location { + if len(l.Line) != 1 { + t.Errorf("Number of lines for symbolz %#x in iteration %d, got %d, want %d", l.Address, i, len(l.Line), 1) + continue + } + address := l.Address - l.Mapping.Start + if got, want := l.Line[0].Function.Name, fmt.Sprintf("%#x", address); got != want { + t.Errorf("symbolz %#x, got %s, want %s", address, got, want) + } + } +} + +func TestProfileCopier(t *testing.T) { + type testCase struct { + name string + prof *profile.Profile + } + for _, c := range []testCase{ + {"cpu", cpuProfile()}, + {"heap", heapProfile()}, + {"contention", contentionProfile()}, + {"symbolz", symzProfile()}, + {"long_name_funcs", longNameFuncsProfile()}, + {"large", largeProfile(t)}, + } { + t.Run(c.name, func(t *testing.T) { + copier := makeProfileCopier(c.prof) + + // Muck with one copy to check that fresh copies are unaffected + tmp := copier.newCopy() + tmp.Sample = tmp.Sample[:0] + + // Get new copy and check it is same as the original. + want := c.prof.String() + got := copier.newCopy().String() + if got != want { + t.Errorf("New copy is not same as original profile") + diff, err := proftest.Diff([]byte(want), []byte(got)) + if err != nil { + t.Fatalf("Diff: %v", err) + } + t.Logf("Diff:\n%s\n", string(diff)) + } + }) + } +} + +type mockObjTool struct{} + +func (*mockObjTool) Open(file string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { + return &mockFile{file, "abcdef", 0}, nil +} + +func (m *mockObjTool) Disasm(file string, start, end uint64, intelSyntax bool) ([]plugin.Inst, error) { + const fn1 = "line1000" + const fn3 = "line3000" + const file1 = "testdata/file1000.src" + const file3 = "testdata/file3000.src" + data := []plugin.Inst{ + {Addr: 0x1000, Text: "instruction one", Function: fn1, File: file1, Line: 1}, + {Addr: 0x1001, Text: "instruction two", Function: fn1, File: file1, Line: 1}, + {Addr: 0x1002, Text: "instruction three", Function: fn1, File: file1, Line: 2}, + {Addr: 0x1003, Text: "instruction four", Function: fn1, File: file1, Line: 1}, + {Addr: 0x3000, Text: "instruction one", Function: fn3, File: file3}, + {Addr: 0x3001, Text: "instruction two", Function: fn3, File: file3}, + {Addr: 0x3002, Text: "instruction three", Function: fn3, File: file3}, + {Addr: 0x3003, Text: "instruction four", Function: fn3, File: file3}, + {Addr: 0x3004, Text: "instruction five", Function: fn3, File: file3}, + } + var result []plugin.Inst + for _, inst := range data { + if inst.Addr >= start && inst.Addr <= end { + result = append(result, inst) + } + } + return result, nil +} + +type mockFile struct { + name, buildID string + base uint64 +} + +// Name returns the underlyinf file name, if available +func (m *mockFile) Name() string { + return m.name +} + +// ObjAddr returns the objdump address corresponding to a runtime address. +func (m *mockFile) ObjAddr(addr uint64) (uint64, error) { + return addr - m.base, nil +} + +// BuildID returns the GNU build ID of the file, or an empty string. +func (m *mockFile) BuildID() string { + return m.buildID +} + +// SourceLine reports the source line information for a given +// address in the file. Due to inlining, the source line information +// is in general a list of positions representing a call stack, +// with the leaf function first. +func (*mockFile) SourceLine(addr uint64) ([]plugin.Frame, error) { + // Return enough data to support the SourceLine() calls needed for + // weblist on cpuProfile() contents. + frame := func(fn, file string, num int) plugin.Frame { + // Reuse the same num for line number and column number. + return plugin.Frame{Func: fn, File: file, Line: num, Column: num} + } + switch addr { + case 0x1000: + return []plugin.Frame{ + frame("mangled1000", "testdata/file1000.src", 1), + }, nil + case 0x1001: + return []plugin.Frame{ + frame("mangled1000", "testdata/file1000.src", 1), + }, nil + case 0x1002: + return []plugin.Frame{ + frame("mangled1000", "testdata/file1000.src", 2), + }, nil + case 0x1003: + return []plugin.Frame{ + frame("mangled1000", "testdata/file1000.src", 1), + }, nil + case 0x2000: + return []plugin.Frame{ + frame("mangled2001", "testdata/file2000.src", 9), + frame("mangled2000", "testdata/file2000.src", 4), + }, nil + case 0x3000: + return []plugin.Frame{ + frame("mangled3002", "testdata/file3000.src", 2), + frame("mangled3001", "testdata/file3000.src", 5), + frame("mangled3000", "testdata/file3000.src", 6), + }, nil + case 0x3001: + return []plugin.Frame{ + frame("mangled3001", "testdata/file3000.src", 8), + frame("mangled3000", "testdata/file3000.src", 9), + }, nil + case 0x3002: + return []plugin.Frame{ + frame("mangled3002", "testdata/file3000.src", 5), + frame("mangled3000", "testdata/file3000.src", 9), + }, nil + } + + return nil, nil +} + +// Symbols returns a list of symbols in the object file. +// If r is not nil, Symbols restricts the list to symbols +// with names matching the regular expression. +// If addr is not zero, Symbols restricts the list to symbols +// containing that address. +func (m *mockFile) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { + switch r.String() { + case "line[13]": + return []*plugin.Sym{ + { + Name: []string{"line1000"}, File: m.name, + Start: 0x1000, End: 0x1003, + }, + { + Name: []string{"line3000"}, File: m.name, + Start: 0x3000, End: 0x3004, + }, + }, nil + } + return nil, fmt.Errorf("unimplemented") +} + +// Close closes the file, releasing associated resources. +func (*mockFile) Close() error { + return nil +} diff --git a/plugin/debug/pkg/internal/driver/fetch.go b/plugin/debug/pkg/internal/driver/fetch.go new file mode 100644 index 00000000..c29365e5 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/fetch.go @@ -0,0 +1,622 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "bytes" + "fmt" + "io" + "net/http" + "net/url" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// fetchProfiles fetches and symbolizes the profiles specified by s. +// It will merge all the profiles it is able to retrieve, even if +// there are some failures. It will return an error if it is unable to +// fetch any profiles. +func fetchProfiles(s *source, o *plugin.Options) (*profile.Profile, error) { + sources := make([]profileSource, 0, len(s.Sources)) + for _, src := range s.Sources { + sources = append(sources, profileSource{ + addr: src, + source: s, + }) + } + + bases := make([]profileSource, 0, len(s.Base)) + for _, src := range s.Base { + bases = append(bases, profileSource{ + addr: src, + source: s, + }) + } + + p, pbase, m, mbase, save, err := grabSourcesAndBases(sources, bases, o.Fetch, o.Obj, o.UI, o.HTTPTransport) + if err != nil { + return nil, err + } + + if pbase != nil { + if s.DiffBase { + pbase.SetLabel("pprof::base", []string{"true"}) + } + if s.Normalize { + err := p.Normalize(pbase) + if err != nil { + return nil, err + } + } + pbase.Scale(-1) + p, m, err = combineProfiles([]*profile.Profile{p, pbase}, []plugin.MappingSources{m, mbase}) + if err != nil { + return nil, err + } + } + + // Symbolize the merged profile. + if err := o.Sym.Symbolize(s.Symbolize, m, p); err != nil { + return nil, err + } + p.RemoveUninteresting() + unsourceMappings(p) + + if s.Comment != "" { + p.Comments = append(p.Comments, s.Comment) + } + + // Save a copy of the merged profile if there is at least one remote source. + if save { + dir, err := setTmpDir(o.UI) + if err != nil { + return nil, err + } + + prefix := "pprof." + if len(p.Mapping) > 0 && p.Mapping[0].File != "" { + prefix += filepath.Base(p.Mapping[0].File) + "." + } + for _, s := range p.SampleType { + prefix += s.Type + "." + } + + tempFile, err := newTempFile(dir, prefix, ".pb.gz") + if err == nil { + if err = p.Write(tempFile); err == nil { + o.UI.PrintErr("Saved profile in ", tempFile.Name()) + } + } + if err != nil { + o.UI.PrintErr("Could not save profile: ", err) + } + } + + if err := p.CheckValid(); err != nil { + return nil, err + } + + return p, nil +} + +func grabSourcesAndBases(sources, bases []profileSource, fetch plugin.Fetcher, obj plugin.ObjTool, ui plugin.UI, tr http.RoundTripper) (*profile.Profile, *profile.Profile, plugin.MappingSources, plugin.MappingSources, bool, error) { + wg := sync.WaitGroup{} + wg.Add(2) + var psrc, pbase *profile.Profile + var msrc, mbase plugin.MappingSources + var savesrc, savebase bool + var errsrc, errbase error + var countsrc, countbase int + go func() { + defer wg.Done() + psrc, msrc, savesrc, countsrc, errsrc = chunkedGrab(sources, fetch, obj, ui, tr) + }() + go func() { + defer wg.Done() + pbase, mbase, savebase, countbase, errbase = chunkedGrab(bases, fetch, obj, ui, tr) + }() + wg.Wait() + save := savesrc || savebase + + if errsrc != nil { + return nil, nil, nil, nil, false, fmt.Errorf("problem fetching source profiles: %v", errsrc) + } + if errbase != nil { + return nil, nil, nil, nil, false, fmt.Errorf("problem fetching base profiles: %v,", errbase) + } + if countsrc == 0 { + return nil, nil, nil, nil, false, fmt.Errorf("failed to fetch any source profiles") + } + if countbase == 0 && len(bases) > 0 { + return nil, nil, nil, nil, false, fmt.Errorf("failed to fetch any base profiles") + } + if want, got := len(sources), countsrc; want != got { + ui.PrintErr(fmt.Sprintf("Fetched %d source profiles out of %d", got, want)) + } + if want, got := len(bases), countbase; want != got { + ui.PrintErr(fmt.Sprintf("Fetched %d base profiles out of %d", got, want)) + } + + return psrc, pbase, msrc, mbase, save, nil +} + +// chunkedGrab fetches the profiles described in source and merges them into +// a single profile. It fetches a chunk of profiles concurrently, with a maximum +// chunk size to limit its memory usage. +func chunkedGrab(sources []profileSource, fetch plugin.Fetcher, obj plugin.ObjTool, ui plugin.UI, tr http.RoundTripper) (*profile.Profile, plugin.MappingSources, bool, int, error) { + const chunkSize = 128 + + var p *profile.Profile + var msrc plugin.MappingSources + var save bool + var count int + + for start := 0; start < len(sources); start += chunkSize { + end := start + chunkSize + if end > len(sources) { + end = len(sources) + } + chunkP, chunkMsrc, chunkSave, chunkCount, chunkErr := concurrentGrab(sources[start:end], fetch, obj, ui, tr) + switch { + case chunkErr != nil: + return nil, nil, false, 0, chunkErr + case chunkP == nil: + continue + case p == nil: + p, msrc, save, count = chunkP, chunkMsrc, chunkSave, chunkCount + default: + p, msrc, chunkErr = combineProfiles([]*profile.Profile{p, chunkP}, []plugin.MappingSources{msrc, chunkMsrc}) + if chunkErr != nil { + return nil, nil, false, 0, chunkErr + } + if chunkSave { + save = true + } + count += chunkCount + } + } + + return p, msrc, save, count, nil +} + +// concurrentGrab fetches multiple profiles concurrently +func concurrentGrab(sources []profileSource, fetch plugin.Fetcher, obj plugin.ObjTool, ui plugin.UI, tr http.RoundTripper) (*profile.Profile, plugin.MappingSources, bool, int, error) { + wg := sync.WaitGroup{} + wg.Add(len(sources)) + for i := range sources { + go func(s *profileSource) { + defer wg.Done() + s.p, s.msrc, s.remote, s.err = grabProfile(s.source, s.addr, fetch, obj, ui, tr) + }(&sources[i]) + } + wg.Wait() + + var save bool + profiles := make([]*profile.Profile, 0, len(sources)) + msrcs := make([]plugin.MappingSources, 0, len(sources)) + for i := range sources { + s := &sources[i] + if err := s.err; err != nil { + ui.PrintErr(s.addr + ": " + err.Error()) + continue + } + save = save || s.remote + profiles = append(profiles, s.p) + msrcs = append(msrcs, s.msrc) + *s = profileSource{} + } + + if len(profiles) == 0 { + return nil, nil, false, 0, nil + } + + p, msrc, err := combineProfiles(profiles, msrcs) + if err != nil { + return nil, nil, false, 0, err + } + return p, msrc, save, len(profiles), nil +} + +func combineProfiles(profiles []*profile.Profile, msrcs []plugin.MappingSources) (*profile.Profile, plugin.MappingSources, error) { + // Merge profiles. + // + // The merge call below only treats exactly matching sample type lists as + // compatible and will fail otherwise. Make the profiles' sample types + // compatible for the merge, see CompatibilizeSampleTypes() doc for details. + if err := profile.CompatibilizeSampleTypes(profiles); err != nil { + return nil, nil, err + } + if err := measurement.ScaleProfiles(profiles); err != nil { + return nil, nil, err + } + + // Avoid expensive work for the common case of a single profile/src. + if len(profiles) == 1 && len(msrcs) == 1 { + return profiles[0], msrcs[0], nil + } + + p, err := profile.Merge(profiles) + if err != nil { + return nil, nil, err + } + + // Combine mapping sources. + msrc := make(plugin.MappingSources) + for _, ms := range msrcs { + for m, s := range ms { + msrc[m] = append(msrc[m], s...) + } + } + return p, msrc, nil +} + +type profileSource struct { + addr string + source *source + + p *profile.Profile + msrc plugin.MappingSources + remote bool + err error +} + +func homeEnv() string { + switch runtime.GOOS { + case "windows": + return "USERPROFILE" + case "plan9": + return "home" + default: + return "HOME" + } +} + +// setTmpDir prepares the directory to use to save profiles retrieved +// remotely. It is selected from PPROF_TMPDIR, defaults to $HOME/pprof, and, if +// $HOME is not set, falls back to os.TempDir(). +func setTmpDir(ui plugin.UI) (string, error) { + var dirs []string + if profileDir := os.Getenv("PPROF_TMPDIR"); profileDir != "" { + dirs = append(dirs, profileDir) + } + if homeDir := os.Getenv(homeEnv()); homeDir != "" { + dirs = append(dirs, filepath.Join(homeDir, "pprof")) + } + dirs = append(dirs, os.TempDir()) + for _, tmpDir := range dirs { + if err := os.MkdirAll(tmpDir, 0755); err != nil { + ui.PrintErr("Could not use temp dir ", tmpDir, ": ", err.Error()) + continue + } + return tmpDir, nil + } + return "", fmt.Errorf("failed to identify temp dir") +} + +const testSourceAddress = "pproftest.local" + +// grabProfile fetches a profile. Returns the profile, sources for the +// profile mappings, a bool indicating if the profile was fetched +// remotely, and an error. +func grabProfile(s *source, source string, fetcher plugin.Fetcher, obj plugin.ObjTool, ui plugin.UI, tr http.RoundTripper) (p *profile.Profile, msrc plugin.MappingSources, remote bool, err error) { + var src string + duration, timeout := time.Duration(s.Seconds)*time.Second, time.Duration(s.Timeout)*time.Second + if fetcher != nil { + p, src, err = fetcher.Fetch(source, duration, timeout) + if err != nil { + return + } + } + if err != nil || p == nil { + // Fetch the profile over HTTP or from a file. + p, src, err = fetch(source, duration, timeout, ui, tr) + if err != nil { + return + } + } + + if err = p.CheckValid(); err != nil { + return + } + + // Update the binary locations from command line and paths. + locateBinaries(p, s, obj, ui) + + // Collect the source URL for all mappings. + if src != "" { + msrc = collectMappingSources(p, src) + remote = true + if strings.HasPrefix(src, "http://"+testSourceAddress) { + // Treat test inputs as local to avoid saving + // testcase profiles during driver testing. + remote = false + } + } + return +} + +// collectMappingSources saves the mapping sources of a profile. +func collectMappingSources(p *profile.Profile, source string) plugin.MappingSources { + ms := plugin.MappingSources{} + for _, m := range p.Mapping { + src := struct { + Source string + Start uint64 + }{ + source, m.Start, + } + key := m.BuildID + if key == "" { + key = m.File + } + if key == "" { + // If there is no build id or source file, use the source as the + // mapping file. This will enable remote symbolization for this + // mapping, in particular for Go profiles on the legacy format. + // The source is reset back to empty string by unsourceMapping + // which is called after symbolization is finished. + m.File = source + key = source + } + ms[key] = append(ms[key], src) + } + return ms +} + +// unsourceMappings iterates over the mappings in a profile and replaces file +// set to the remote source URL by collectMappingSources back to empty string. +func unsourceMappings(p *profile.Profile) { + for _, m := range p.Mapping { + if m.BuildID == "" && filepath.VolumeName(m.File) == "" { + if u, err := url.Parse(m.File); err == nil && u.IsAbs() { + m.File = "" + } + } + } +} + +// locateBinaries searches for binary files listed in the profile and, if found, +// updates the profile accordingly. +func locateBinaries(p *profile.Profile, s *source, obj plugin.ObjTool, ui plugin.UI) { + // Construct search path to examine + searchPath := os.Getenv("PPROF_BINARY_PATH") + if searchPath == "" { + // Use $HOME/pprof/binaries as default directory for local symbolization binaries + searchPath = filepath.Join(os.Getenv(homeEnv()), "pprof", "binaries") + } +mapping: + for _, m := range p.Mapping { + var noVolumeFile string + var baseName string + var dirName string + if m.File != "" { + noVolumeFile = strings.TrimPrefix(m.File, filepath.VolumeName(m.File)) + baseName = filepath.Base(m.File) + dirName = filepath.Dir(noVolumeFile) + } + + for _, path := range filepath.SplitList(searchPath) { + var fileNames []string + if m.BuildID != "" { + fileNames = []string{filepath.Join(path, m.BuildID, baseName)} + if matches, err := filepath.Glob(filepath.Join(path, m.BuildID, "*")); err == nil { + fileNames = append(fileNames, matches...) + } + fileNames = append(fileNames, filepath.Join(path, noVolumeFile, m.BuildID)) // perf path format + // Llvm buildid protocol: the first two characters of the build id + // are used as directory, and the remaining part is in the filename. + // e.g. `/ab/cdef0123456.debug` + fileNames = append(fileNames, filepath.Join(path, m.BuildID[:2], m.BuildID[2:]+".debug")) + } + if m.File != "" { + // Try both the basename and the full path, to support the same directory + // structure as the perf symfs option. + fileNames = append(fileNames, filepath.Join(path, baseName)) + fileNames = append(fileNames, filepath.Join(path, noVolumeFile)) + // Other locations: use the same search paths as GDB, according to + // https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html + fileNames = append(fileNames, filepath.Join(path, noVolumeFile+".debug")) + fileNames = append(fileNames, filepath.Join(path, dirName, ".debug", baseName+".debug")) + fileNames = append(fileNames, filepath.Join(path, "usr", "lib", "debug", dirName, baseName+".debug")) + } + for _, name := range fileNames { + if f, err := obj.Open(name, m.Start, m.Limit, m.Offset, m.KernelRelocationSymbol); err == nil { + defer f.Close() + fileBuildID := f.BuildID() + if m.BuildID != "" && m.BuildID != fileBuildID { + ui.PrintErr("Ignoring local file " + name + ": build-id mismatch (" + m.BuildID + " != " + fileBuildID + ")") + } else { + // Explicitly do not update KernelRelocationSymbol -- + // the new local file name is most likely missing it. + m.File = name + continue mapping + } + } + } + } + } + if len(p.Mapping) == 0 { + // If there are no mappings, add a fake mapping to attempt symbolization. + // This is useful for some profiles generated by the golang runtime, which + // do not include any mappings. Symbolization with a fake mapping will only + // be successful against a non-PIE binary. + m := &profile.Mapping{ID: 1} + p.Mapping = []*profile.Mapping{m} + for _, l := range p.Location { + l.Mapping = m + } + } + // If configured, apply executable filename override and (maybe, see below) + // build ID override from source. Assume the executable is the first mapping. + if execName, buildID := s.ExecName, s.BuildID; execName != "" || buildID != "" { + m := p.Mapping[0] + if execName != "" { + // Explicitly do not update KernelRelocationSymbol -- + // the source override is most likely missing it. + m.File = execName + } + // Only apply the build ID override if the build ID in the main mapping is + // missing. Overwriting the build ID in case it's present is very likely a + // wrong thing to do so we refuse to do that. + if buildID != "" && m.BuildID == "" { + m.BuildID = buildID + } + } +} + +// fetch fetches a profile from source, within the timeout specified, +// producing messages through the ui. It returns the profile and the +// url of the actual source of the profile for remote profiles. +func fetch(source string, duration, timeout time.Duration, ui plugin.UI, tr http.RoundTripper) (p *profile.Profile, src string, err error) { + var f io.ReadCloser + + // First determine whether the source is a file, if not, it will be treated as a URL. + if _, err = os.Stat(source); err == nil { + if isPerfFile(source) { + f, err = convertPerfData(source, ui) + } else { + f, err = os.Open(source) + } + } else { + sourceURL, timeout := adjustURL(source, duration, timeout) + if sourceURL != "" { + ui.Print("Fetching profile over HTTP from " + sourceURL) + if duration > 0 { + ui.Print(fmt.Sprintf("Please wait... (%v)", duration)) + } + f, err = fetchURL(sourceURL, timeout, tr) + src = sourceURL + } + } + if err == nil { + defer f.Close() + p, err = profile.Parse(f) + } + return +} + +// fetchURL fetches a profile from a URL using HTTP. +func fetchURL(source string, timeout time.Duration, tr http.RoundTripper) (io.ReadCloser, error) { + client := &http.Client{ + Transport: tr, + Timeout: timeout + 5*time.Second, + } + resp, err := client.Get(source) + if err != nil { + return nil, fmt.Errorf("http fetch: %v", err) + } + if resp.StatusCode != http.StatusOK { + defer resp.Body.Close() + return nil, statusCodeError(resp) + } + + return resp.Body, nil +} + +func statusCodeError(resp *http.Response) error { + if resp.Header.Get("X-Go-Pprof") != "" && strings.Contains(resp.Header.Get("Content-Type"), "text/plain") { + // error is from pprof endpoint + if body, err := io.ReadAll(resp.Body); err == nil { + return fmt.Errorf("server response: %s - %s", resp.Status, body) + } + } + return fmt.Errorf("server response: %s", resp.Status) +} + +// isPerfFile checks if a file is in perf.data format. It also returns false +// if it encounters an error during the check. +func isPerfFile(path string) bool { + sourceFile, openErr := os.Open(path) + if openErr != nil { + return false + } + defer sourceFile.Close() + + // If the file is the output of a perf record command, it should begin + // with the string PERFILE2. + perfHeader := []byte("PERFILE2") + actualHeader := make([]byte, len(perfHeader)) + if _, readErr := sourceFile.Read(actualHeader); readErr != nil { + return false + } + return bytes.Equal(actualHeader, perfHeader) +} + +// convertPerfData converts the file at path which should be in perf.data format +// using the perf_to_profile tool and returns the file containing the +// profile.proto formatted data. +func convertPerfData(perfPath string, ui plugin.UI) (*os.File, error) { + ui.Print(fmt.Sprintf( + "Converting %s to a profile.proto... (May take a few minutes)", + perfPath)) + profile, err := newTempFile(os.TempDir(), "pprof_", ".pb.gz") + if err != nil { + return nil, err + } + deferDeleteTempFile(profile.Name()) + cmd := exec.Command("perf_to_profile", "-i", perfPath, "-o", profile.Name(), "-f") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + profile.Close() + return nil, fmt.Errorf("failed to convert perf.data file. Try github.com/google/perf_data_converter: %v", err) + } + return profile, nil +} + +// adjustURL validates if a profile source is a URL and returns an +// cleaned up URL and the timeout to use for retrieval over HTTP. +// If the source cannot be recognized as a URL it returns an empty string. +func adjustURL(source string, duration, timeout time.Duration) (string, time.Duration) { + u, err := url.Parse(source) + if err != nil || (u.Host == "" && u.Scheme != "" && u.Scheme != "file") { + // Try adding http:// to catch sources of the form hostname:port/path. + // url.Parse treats "hostname" as the scheme. + u, err = url.Parse("http://" + source) + } + if err != nil || u.Host == "" { + return "", 0 + } + + // Apply duration/timeout overrides to URL. + values := u.Query() + if duration > 0 { + values.Set("seconds", fmt.Sprint(int(duration.Seconds()))) + } else { + if urlSeconds := values.Get("seconds"); urlSeconds != "" { + if us, err := strconv.ParseInt(urlSeconds, 10, 32); err == nil { + duration = time.Duration(us) * time.Second + } + } + } + if timeout <= 0 { + if duration > 0 { + timeout = duration + duration/2 + } else { + timeout = 60 * time.Second + } + } + u.RawQuery = values.Encode() + return u.String(), timeout +} diff --git a/plugin/debug/pkg/internal/driver/fetch_test.go b/plugin/debug/pkg/internal/driver/fetch_test.go new file mode 100644 index 00000000..7727895e --- /dev/null +++ b/plugin/debug/pkg/internal/driver/fetch_test.go @@ -0,0 +1,836 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/tls" + "crypto/x509" + "encoding/pem" + "fmt" + "math/big" + "net" + "net/http" + "os" + "path/filepath" + "reflect" + "regexp" + "runtime" + "strings" + "testing" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/binutils" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/internal/symbolizer" + "m7s.live/v5/plugin/debug/pkg/internal/transport" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func TestSymbolizationPath(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("test assumes Unix paths") + } + + // Save environment variables to restore after test + saveHome := os.Getenv(homeEnv()) + savePath := os.Getenv("PPROF_BINARY_PATH") + + tempdir, err := os.MkdirTemp("", "home") + if err != nil { + t.Fatal("creating temp dir: ", err) + } + defer os.RemoveAll(tempdir) + os.MkdirAll(filepath.Join(tempdir, "pprof", "binaries", "abcde10001"), 0700) + os.Create(filepath.Join(tempdir, "pprof", "binaries", "abcde10001", "binary")) + + os.MkdirAll(filepath.Join(tempdir, "pprof", "binaries", "fg"), 0700) + os.Create(filepath.Join(tempdir, "pprof", "binaries", "fg", "hij10001.debug")) + + obj := testObj{tempdir} + os.Setenv(homeEnv(), tempdir) + for _, tc := range []struct { + env, file, buildID, want string + msgCount int + }{ + {"", "/usr/bin/binary", "", "/usr/bin/binary", 0}, + {"", "/usr/bin/binary", "fedcb10000", "/usr/bin/binary", 0}, + {"/usr", "/bin/binary", "", "/usr/bin/binary", 0}, + {"", "/prod/path/binary", "abcde10001", filepath.Join(tempdir, "pprof/binaries/abcde10001/binary"), 0}, + {"/alternate/architecture", "/usr/bin/binary", "", "/alternate/architecture/binary", 0}, + {"/alternate/architecture", "/usr/bin/binary", "abcde10001", "/alternate/architecture/binary", 0}, + {"", "", "fghij10001", filepath.Join(tempdir, "pprof/binaries/fg/hij10001.debug"), 0}, + {"/nowhere:/alternate/architecture", "/usr/bin/binary", "fedcb10000", "/usr/bin/binary", 1}, + {"/nowhere:/alternate/architecture", "/usr/bin/binary", "abcde10002", "/usr/bin/binary", 1}, + } { + os.Setenv("PPROF_BINARY_PATH", tc.env) + p := &profile.Profile{ + Mapping: []*profile.Mapping{ + { + File: tc.file, + BuildID: tc.buildID, + }, + }, + } + s := &source{} + locateBinaries(p, s, obj, &proftest.TestUI{T: t, Ignore: tc.msgCount}) + if file := p.Mapping[0].File; file != tc.want { + t.Errorf("%s:%s:%s, want %s, got %s", tc.env, tc.file, tc.buildID, tc.want, file) + } + } + os.Setenv(homeEnv(), saveHome) + os.Setenv("PPROF_BINARY_PATH", savePath) +} + +func TestCollectMappingSources(t *testing.T) { + const startAddress uint64 = 0x40000 + const url = "http://example.com" + for _, tc := range []struct { + file, buildID string + want plugin.MappingSources + }{ + {"/usr/bin/binary", "buildId", mappingSources("buildId", url, startAddress)}, + {"/usr/bin/binary", "", mappingSources("/usr/bin/binary", url, startAddress)}, + {"", "", mappingSources(url, url, startAddress)}, + } { + p := &profile.Profile{ + Mapping: []*profile.Mapping{ + { + File: tc.file, + BuildID: tc.buildID, + Start: startAddress, + }, + }, + } + got := collectMappingSources(p, url) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:%s, want %v, got %v", tc.file, tc.buildID, tc.want, got) + } + } +} + +func TestUnsourceMappings(t *testing.T) { + for _, tc := range []struct { + os, file, buildID, want string + }{ + {"any", "/usr/bin/binary", "buildId", "/usr/bin/binary"}, + {"any", "http://example.com", "", ""}, + {"windows", `C:\example.exe`, "", `C:\example.exe`}, + {"windows", `c:/example.exe`, "", `c:/example.exe`}, + } { + t.Run(tc.file+"-"+tc.os, func(t *testing.T) { + if tc.os != "any" && tc.os != runtime.GOOS { + t.Skipf("%s only test", tc.os) + } + + p := &profile.Profile{ + Mapping: []*profile.Mapping{ + { + File: tc.file, + BuildID: tc.buildID, + }, + }, + } + unsourceMappings(p) + if got := p.Mapping[0].File; got != tc.want { + t.Errorf("%s:%s, want %s, got %s", tc.file, tc.buildID, tc.want, got) + } + }) + } +} + +type testObj struct { + home string +} + +func (o testObj) Open(file string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { + switch file { + case "/alternate/architecture/binary": + return testFile{file, "abcde10001"}, nil + case "/usr/bin/binary": + return testFile{file, "fedcb10000"}, nil + case filepath.Join(o.home, "pprof/binaries/abcde10001/binary"): + return testFile{file, "abcde10001"}, nil + case filepath.Join(o.home, "pprof/binaries/fg/hij10001.debug"): + return testFile{file, "fghij10001"}, nil + } + return nil, fmt.Errorf("not found: %s", file) +} +func (testObj) Demangler(_ string) func(names []string) (map[string]string, error) { + return func(names []string) (map[string]string, error) { return nil, nil } +} +func (testObj) Disasm(file string, start, end uint64, intelSyntax bool) ([]plugin.Inst, error) { + return nil, nil +} + +type testFile struct{ name, buildID string } + +func (f testFile) Name() string { return f.name } +func (testFile) ObjAddr(addr uint64) (uint64, error) { return addr, nil } +func (f testFile) BuildID() string { return f.buildID } +func (testFile) SourceLine(addr uint64) ([]plugin.Frame, error) { return nil, nil } +func (testFile) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { return nil, nil } +func (testFile) Close() error { return nil } + +func TestFetch(t *testing.T) { + const path = "testdata/" + type testcase struct { + source, execName string + wantErr bool + } + ts := []testcase{ + {path + "go.crc32.cpu", "", false}, + {path + "go.nomappings.crash", "/bin/gotest.exe", false}, + {"http://localhost/profile?file=cppbench.cpu", "", false}, + {"./missing", "", true}, + } + // Test that paths with a colon character are recognized as file paths + // if the file exists, rather than as a URL. We have to skip this test + // on Windows since the colon char is not allowed in Windows paths. + if runtime.GOOS != "windows" { + src := filepath.Join(path, "go.crc32.cpu") + dst := filepath.Join(t.TempDir(), "go.crc32.cpu_2023-11-11_01:02:03") + data, err := os.ReadFile(src) + if err != nil { + t.Fatalf("read src file %s failed: %#v", src, err) + } + err = os.WriteFile(dst, data, 0644) + if err != nil { + t.Fatalf("create dst file %s failed: %#v", dst, err) + } + ts = append(ts, testcase{dst, "", false}) + } + for _, tc := range ts { + t.Run(tc.source, func(t *testing.T) { + p, _, _, err := grabProfile(&source{ExecName: tc.execName}, tc.source, nil, testObj{}, &proftest.TestUI{T: t}, &httpTransport{}) + if tc.wantErr { + if err == nil { + t.Fatal("got no error, want an error") + } + return + } + if err != nil { + t.Fatalf("got error %v, want no error", err) + } + if len(p.Sample) == 0 { + t.Error("got zero samples, want non-zero") + } + if e := tc.execName; e != "" { + switch { + case len(p.Mapping) == 0 || p.Mapping[0] == nil: + t.Errorf("got no mappings, want mapping[0].execName == %s", e) + case p.Mapping[0].File != e: + t.Errorf("got mapping[0].execName == %s, want %s", p.Mapping[0].File, e) + } + } + }) + } +} + +func TestFetchWithBase(t *testing.T) { + baseConfig := currentConfig() + defer setCurrentConfig(baseConfig) + + type WantSample struct { + values []int64 + labels map[string][]string + } + + const path = "testdata/" + type testcase struct { + desc string + sources []string + bases []string + diffBases []string + normalize bool + wantSamples []WantSample + wantParseErrorMsg string + wantFetchErrorMsg string + } + + testcases := []testcase{ + { + "not normalized base is same as source", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention"}, + nil, + false, + nil, + "", + "", + }, + { + "not normalized base is same as source", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention"}, + nil, + false, + nil, + "", + "", + }, + { + "not normalized single source, multiple base (all profiles same)", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention", path + "cppbench.contention"}, + nil, + false, + []WantSample{ + { + values: []int64{-2700, -608881724}, + labels: map[string][]string{}, + }, + { + values: []int64{-100, -23992}, + labels: map[string][]string{}, + }, + { + values: []int64{-200, -179943}, + labels: map[string][]string{}, + }, + { + values: []int64{-100, -17778444}, + labels: map[string][]string{}, + }, + { + values: []int64{-100, -75976}, + labels: map[string][]string{}, + }, + { + values: []int64{-300, -63568134}, + labels: map[string][]string{}, + }, + }, + "", + "", + }, + { + "not normalized, different base and source", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.small.contention"}, + nil, + false, + []WantSample{ + { + values: []int64{1700, 608878600}, + labels: map[string][]string{}, + }, + { + values: []int64{100, 23992}, + labels: map[string][]string{}, + }, + { + values: []int64{200, 179943}, + labels: map[string][]string{}, + }, + { + values: []int64{100, 17778444}, + labels: map[string][]string{}, + }, + { + values: []int64{100, 75976}, + labels: map[string][]string{}, + }, + { + values: []int64{300, 63568134}, + labels: map[string][]string{}, + }, + }, + "", + "", + }, + { + "normalized base is same as source", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention"}, + nil, + true, + nil, + "", + "", + }, + { + "normalized single source, multiple base (all profiles same)", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention", path + "cppbench.contention"}, + nil, + true, + nil, + "", + "", + }, + { + "normalized different base and source", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.small.contention"}, + nil, + true, + []WantSample{ + { + values: []int64{-229, -369}, + labels: map[string][]string{}, + }, + { + values: []int64{29, 0}, + labels: map[string][]string{}, + }, + { + values: []int64{57, 1}, + labels: map[string][]string{}, + }, + { + values: []int64{29, 80}, + labels: map[string][]string{}, + }, + { + values: []int64{29, 0}, + labels: map[string][]string{}, + }, + { + values: []int64{86, 288}, + labels: map[string][]string{}, + }, + }, + "", + "", + }, + { + "not normalized diff base is same as source", + []string{path + "cppbench.contention"}, + nil, + []string{path + "cppbench.contention"}, + false, + []WantSample{ + { + values: []int64{2700, 608881724}, + labels: map[string][]string{}, + }, + { + values: []int64{100, 23992}, + labels: map[string][]string{}, + }, + { + values: []int64{200, 179943}, + labels: map[string][]string{}, + }, + { + values: []int64{100, 17778444}, + labels: map[string][]string{}, + }, + { + values: []int64{100, 75976}, + labels: map[string][]string{}, + }, + { + values: []int64{300, 63568134}, + labels: map[string][]string{}, + }, + { + values: []int64{-2700, -608881724}, + labels: map[string][]string{"pprof::base": {"true"}}, + }, + { + values: []int64{-100, -23992}, + labels: map[string][]string{"pprof::base": {"true"}}, + }, + { + values: []int64{-200, -179943}, + labels: map[string][]string{"pprof::base": {"true"}}, + }, + { + values: []int64{-100, -17778444}, + labels: map[string][]string{"pprof::base": {"true"}}, + }, + { + values: []int64{-100, -75976}, + labels: map[string][]string{"pprof::base": {"true"}}, + }, + { + values: []int64{-300, -63568134}, + labels: map[string][]string{"pprof::base": {"true"}}, + }, + }, + "", + "", + }, + { + "diff_base and base both specified", + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention"}, + []string{path + "cppbench.contention"}, + false, + nil, + "-base and -diff_base flags cannot both be specified", + "", + }, + { + "input profiles with different sample types (non empty intersection)", + []string{path + "cppbench.cpu", path + "cppbench.cpu_no_samples_type"}, + []string{path + "cppbench.cpu", path + "cppbench.cpu_no_samples_type"}, + nil, + false, + nil, + "", + "", + }, + { + "input profiles with different sample types (empty intersection)", + []string{path + "cppbench.cpu", path + "cppbench.contention"}, + []string{path + "cppbench.cpu", path + "cppbench.contention"}, + nil, + false, + nil, + "", + "problem fetching source profiles: profiles have empty common sample type list", + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + setCurrentConfig(baseConfig) + f := testFlags{ + stringLists: map[string][]string{ + "base": tc.bases, + "diff_base": tc.diffBases, + }, + bools: map[string]bool{ + "normalize": tc.normalize, + }, + } + f.args = tc.sources + + o := setDefaults(&plugin.Options{ + UI: &proftest.TestUI{T: t, AllowRx: "Local symbolization failed|Some binary filenames not available"}, + Flagset: f, + HTTPTransport: transport.New(nil), + }) + src, _, err := parseFlags(o) + + if tc.wantParseErrorMsg != "" { + if err == nil { + t.Fatalf("got nil, want error %q", tc.wantParseErrorMsg) + } + + if gotErrMsg := err.Error(); gotErrMsg != tc.wantParseErrorMsg { + t.Fatalf("got error %q, want error %q", gotErrMsg, tc.wantParseErrorMsg) + } + return + } + + if err != nil { + t.Fatalf("got error %q, want no error", err) + } + + p, err := fetchProfiles(src, o) + + if tc.wantFetchErrorMsg != "" { + if err == nil { + t.Fatalf("got nil, want error %q", tc.wantFetchErrorMsg) + } + + if gotErrMsg := err.Error(); gotErrMsg != tc.wantFetchErrorMsg { + t.Fatalf("got error %q, want error %q", gotErrMsg, tc.wantFetchErrorMsg) + } + return + } + + if err != nil { + t.Fatalf("got error %q, want no error", err) + } + + if got, want := len(p.Sample), len(tc.wantSamples); got != want { + t.Fatalf("got %d samples want %d", got, want) + } + + for i, sample := range p.Sample { + if !reflect.DeepEqual(tc.wantSamples[i].values, sample.Value) { + t.Errorf("for sample %d got values %v, want %v", i, sample.Value, tc.wantSamples[i]) + } + if !reflect.DeepEqual(tc.wantSamples[i].labels, sample.Label) { + t.Errorf("for sample %d got labels %v, want %v", i, sample.Label, tc.wantSamples[i].labels) + } + } + }) + } +} + +// mappingSources creates MappingSources map with a single item. +func mappingSources(key, source string, start uint64) plugin.MappingSources { + return plugin.MappingSources{ + key: []struct { + Source string + Start uint64 + }{ + {Source: source, Start: start}, + }, + } +} + +type httpTransport struct{} + +func (tr *httpTransport) RoundTrip(req *http.Request) (*http.Response, error) { + values := req.URL.Query() + file := values.Get("file") + + if file == "" { + return nil, fmt.Errorf("want .../file?profile, got %s", req.URL.String()) + } + + t := &http.Transport{} + t.RegisterProtocol("file", http.NewFileTransport(http.Dir("testdata/"))) + + c := &http.Client{Transport: t} + return c.Get("file:///" + file) +} + +func closedError() string { + if runtime.GOOS == "plan9" { + return "listen hungup" + } + return "use of closed" +} + +func TestHTTPSInsecure(t *testing.T) { + if runtime.GOOS == "nacl" || runtime.GOOS == "js" { + t.Skip("test assumes tcp available") + } + saveHome := os.Getenv(homeEnv()) + tempdir, err := os.MkdirTemp("", "home") + if err != nil { + t.Fatal("creating temp dir: ", err) + } + defer os.RemoveAll(tempdir) + + // pprof writes to $HOME/pprof by default which is not necessarily + // writeable (e.g. on a Debian buildd) so set $HOME to something we + // know we can write to for the duration of the test. + os.Setenv(homeEnv(), tempdir) + defer os.Setenv(homeEnv(), saveHome) + + baseConfig := currentConfig() + defer setCurrentConfig(baseConfig) + + tlsCert, _, _ := selfSignedCert(t, "") + tlsConfig := &tls.Config{Certificates: []tls.Certificate{tlsCert}} + + l, err := tls.Listen("tcp", "localhost:0", tlsConfig) + if err != nil { + t.Fatalf("net.Listen: got error %v, want no error", err) + } + + donec := make(chan error, 1) + go func(donec chan<- error) { + donec <- http.Serve(l, nil) + }(donec) + defer func() { + if got, want := <-donec, closedError(); !strings.Contains(got.Error(), want) { + t.Fatalf("Serve got error %v, want %q", got, want) + } + }() + defer l.Close() + + outputTempFile, err := os.CreateTemp("", "profile_output") + if err != nil { + t.Fatalf("Failed to create tempfile: %v", err) + } + defer os.Remove(outputTempFile.Name()) + defer outputTempFile.Close() + + address := "https+insecure://" + l.Addr().String() + "/debug/pprof/goroutine" + s := &source{ + Sources: []string{address}, + Timeout: 10, + Symbolize: "remote", + } + o := &plugin.Options{ + Obj: &binutils.Binutils{}, + UI: &proftest.TestUI{T: t, AllowRx: "Saved profile in"}, + HTTPTransport: transport.New(nil), + } + o.Sym = &symbolizer.Symbolizer{Obj: o.Obj, UI: o.UI} + p, err := fetchProfiles(s, o) + if err != nil { + t.Fatal(err) + } + if len(p.SampleType) == 0 { + t.Fatalf("fetchProfiles(%s) got empty profile: len(p.SampleType)==0", address) + } + if len(p.Function) == 0 { + t.Fatalf("fetchProfiles(%s) got non-symbolized profile: len(p.Function)==0", address) + } + if err := checkProfileHasFunction(p, "TestHTTPSInsecure"); err != nil { + t.Fatalf("fetchProfiles(%s) %v", address, err) + } +} + +func TestHTTPSWithServerCertFetch(t *testing.T) { + if runtime.GOOS == "nacl" || runtime.GOOS == "js" { + t.Skip("test assumes tcp available") + } + saveHome := os.Getenv(homeEnv()) + tempdir, err := os.MkdirTemp("", "home") + if err != nil { + t.Fatal("creating temp dir: ", err) + } + defer os.RemoveAll(tempdir) + + // pprof writes to $HOME/pprof by default which is not necessarily + // writeable (e.g. on a Debian buildd) so set $HOME to something we + // know we can write to for the duration of the test. + os.Setenv(homeEnv(), tempdir) + defer os.Setenv(homeEnv(), saveHome) + + baseConfig := currentConfig() + defer setCurrentConfig(baseConfig) + + cert, certBytes, keyBytes := selfSignedCert(t, "localhost") + cas := x509.NewCertPool() + cas.AppendCertsFromPEM(certBytes) + + tlsConfig := &tls.Config{ + RootCAs: cas, + Certificates: []tls.Certificate{cert}, + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: cas, + } + + l, err := tls.Listen("tcp", "localhost:0", tlsConfig) + if err != nil { + t.Fatalf("net.Listen: got error %v, want no error", err) + } + + donec := make(chan error, 1) + go func(donec chan<- error) { + donec <- http.Serve(l, nil) + }(donec) + defer func() { + if got, want := <-donec, closedError(); !strings.Contains(got.Error(), want) { + t.Fatalf("Serve got error %v, want %q", got, want) + } + }() + defer l.Close() + + outputTempFile, err := os.CreateTemp("", "profile_output") + if err != nil { + t.Fatalf("Failed to create tempfile: %v", err) + } + defer os.Remove(outputTempFile.Name()) + defer outputTempFile.Close() + + // Get port from the address, so request to the server can be made using + // the host name specified in certificates. + _, portStr, err := net.SplitHostPort(l.Addr().String()) + if err != nil { + t.Fatalf("cannot get port from URL: %v", err) + } + address := "https://" + "localhost:" + portStr + "/debug/pprof/goroutine" + s := &source{ + Sources: []string{address}, + Timeout: 10, + Symbolize: "remote", + } + + certTempFile, err := os.CreateTemp("", "cert_output") + if err != nil { + t.Errorf("cannot create cert tempfile: %v", err) + } + defer os.Remove(certTempFile.Name()) + defer certTempFile.Close() + certTempFile.Write(certBytes) + + keyTempFile, err := os.CreateTemp("", "key_output") + if err != nil { + t.Errorf("cannot create key tempfile: %v", err) + } + defer os.Remove(keyTempFile.Name()) + defer keyTempFile.Close() + keyTempFile.Write(keyBytes) + + f := &testFlags{ + strings: map[string]string{ + "tls_cert": certTempFile.Name(), + "tls_key": keyTempFile.Name(), + "tls_ca": certTempFile.Name(), + }, + } + o := &plugin.Options{ + Obj: &binutils.Binutils{}, + UI: &proftest.TestUI{T: t, AllowRx: "Saved profile in"}, + Flagset: f, + HTTPTransport: transport.New(f), + } + + o.Sym = &symbolizer.Symbolizer{Obj: o.Obj, UI: o.UI, Transport: o.HTTPTransport} + p, err := fetchProfiles(s, o) + if err != nil { + t.Fatal(err) + } + if len(p.SampleType) == 0 { + t.Fatalf("fetchProfiles(%s) got empty profile: len(p.SampleType)==0", address) + } + if len(p.Function) == 0 { + t.Fatalf("fetchProfiles(%s) got non-symbolized profile: len(p.Function)==0", address) + } + if err := checkProfileHasFunction(p, "TestHTTPSWithServerCertFetch"); err != nil { + t.Fatalf("fetchProfiles(%s) %v", address, err) + } +} + +func checkProfileHasFunction(p *profile.Profile, fname string) error { + for _, f := range p.Function { + if strings.Contains(f.Name, fname) { + return nil + } + } + return fmt.Errorf("got %s, want function %q", p.String(), fname) +} + +// selfSignedCert generates a self-signed certificate, and returns the +// generated certificate, and byte arrays containing the certificate and +// key associated with the certificate. +func selfSignedCert(t *testing.T, host string) (tls.Certificate, []byte, []byte) { + privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + t.Fatalf("failed to generate private key: %v", err) + } + b, err := x509.MarshalECPrivateKey(privKey) + if err != nil { + t.Fatalf("failed to marshal private key: %v", err) + } + bk := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: b}) + + tmpl := x509.Certificate{ + SerialNumber: big.NewInt(1), + NotBefore: time.Now(), + NotAfter: time.Now().Add(10 * time.Minute), + IsCA: true, + DNSNames: []string{host}, + } + + b, err = x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, privKey.Public(), privKey) + if err != nil { + t.Fatalf("failed to create cert: %v", err) + } + bc := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: b}) + + cert, err := tls.X509KeyPair(bc, bk) + if err != nil { + t.Fatalf("failed to create TLS key pair: %v", err) + } + return cert, bc, bk +} diff --git a/plugin/debug/pkg/internal/driver/flags.go b/plugin/debug/pkg/internal/driver/flags.go new file mode 100644 index 00000000..53903191 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/flags.go @@ -0,0 +1,71 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "flag" + "strings" +) + +// GoFlags implements the plugin.FlagSet interface. +type GoFlags struct { + UsageMsgs []string +} + +// Bool implements the plugin.FlagSet interface. +func (*GoFlags) Bool(o string, d bool, c string) *bool { + return flag.Bool(o, d, c) +} + +// Int implements the plugin.FlagSet interface. +func (*GoFlags) Int(o string, d int, c string) *int { + return flag.Int(o, d, c) +} + +// Float64 implements the plugin.FlagSet interface. +func (*GoFlags) Float64(o string, d float64, c string) *float64 { + return flag.Float64(o, d, c) +} + +// String implements the plugin.FlagSet interface. +func (*GoFlags) String(o, d, c string) *string { + return flag.String(o, d, c) +} + +// StringList implements the plugin.FlagSet interface. +func (*GoFlags) StringList(o, d, c string) *[]*string { + return &[]*string{flag.String(o, d, c)} +} + +// ExtraUsage implements the plugin.FlagSet interface. +func (f *GoFlags) ExtraUsage() string { + return strings.Join(f.UsageMsgs, "\n") +} + +// AddExtraUsage implements the plugin.FlagSet interface. +func (f *GoFlags) AddExtraUsage(eu string) { + f.UsageMsgs = append(f.UsageMsgs, eu) +} + +// Parse implements the plugin.FlagSet interface. +func (*GoFlags) Parse(usage func()) []string { + flag.Usage = usage + flag.Parse() + args := flag.Args() + if len(args) == 0 { + usage() + } + return args +} diff --git a/plugin/debug/pkg/internal/driver/html/common.css b/plugin/debug/pkg/internal/driver/html/common.css new file mode 100644 index 00000000..0a897ce2 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/common.css @@ -0,0 +1,279 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +html, body { + height: 100%; +} +body { + font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + font-size: 13px; + line-height: 1.4; + display: flex; + flex-direction: column; +} +a { + color: #2a66d9; +} +.header { + display: flex; + align-items: center; + height: 44px; + min-height: 44px; + background-color: #eee; + color: #212121; + padding: 0 1rem; +} +.header > div { + margin: 0 0.125em; +} +.header .title h1 { + font-size: 1.75em; + margin-right: 1rem; + margin-bottom: 4px; +} +.header .title a { + color: #212121; + text-decoration: none; +} +.header .title a:hover { + text-decoration: underline; +} +.header .description { + width: 100%; + text-align: right; + white-space: nowrap; +} +@media screen and (max-width: 799px) { + .header input { + display: none; + } +} +#detailsbox { + display: none; + position: fixed; + top: 40px; + right: 20px; + background-color: #ffffff; + box-shadow: 0 1px 5px rgba(0,0,0,.3); + line-height: 24px; + padding: 1em; + text-align: left; +} +.header input { + background: white url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' style='pointer-events:none;display:block;width:100%25;height:100%25;fill:%23757575'%3E%3Cpath d='M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61.0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E") no-repeat 4px center/20px 20px; + border: 1px solid #d1d2d3; + border-radius: 2px 0 0 2px; + padding: 0.25em; + padding-left: 28px; + margin-left: 1em; + font-family: 'Roboto', 'Noto', sans-serif; + font-size: 1em; + line-height: 24px; + color: #212121; +} +.downArrow { + border-top: .36em solid #ccc; + border-left: .36em solid transparent; + border-right: .36em solid transparent; + margin-bottom: .05em; + margin-left: .5em; + transition: border-top-color 200ms; +} +.menu-item { + height: 100%; + text-transform: uppercase; + font-family: 'Roboto Medium', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + position: relative; +} +.menu-item .menu-name:hover { + opacity: 0.75; +} +.menu-item .menu-name:hover .downArrow { + border-top-color: #666; +} +.menu-name { + height: 100%; + padding: 0 0.5em; + display: flex; + align-items: center; + justify-content: center; +} +.menu-name a { + text-decoration: none; + color: #212121; +} +.submenu { + display: none; + margin-top: -4px; + min-width: 10em; + position: absolute; + left: 0px; + background-color: white; + box-shadow: 0 1px 5px rgba(0,0,0,.3); + font-size: 100%; + text-transform: none; + white-space: nowrap; +} +.menu-item, .submenu { + user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; +} +.submenu hr { + border: 0; + border-top: 2px solid #eee; +} +.submenu a { + display: block; + padding: .5em 1em; + text-decoration: none; +} +.submenu a:hover, .submenu a.active { + color: white; + background-color: #6b82d6; +} +.submenu a.disabled { + color: gray; + pointer-events: none; +} +.menu-check-mark { + position: absolute; + left: 2px; +} +.menu-delete-btn { + position: absolute; + right: 2px; +} + +.help { + padding-left: 1em; +} + +{{/* Used to disable events when a modal dialog is displayed */}} +#dialog-overlay { + display: none; + position: fixed; + left: 0px; + top: 0px; + width: 100%; + height: 100%; + background-color: rgba(1,1,1,0.1); +} + +.dialog { + {{/* Displayed centered horizontally near the top */}} + display: none; + position: fixed; + margin: 0px; + top: 60px; + left: 50%; + transform: translateX(-50%); + font-size: 125%; + background-color: #ffffff; + box-shadow: 0 1px 5px rgba(0,0,0,.3); +} +.dialog-header { + font-size: 120%; + border-bottom: 1px solid #CCCCCC; + width: 100%; + text-align: center; + background: #EEEEEE; + user-select: none; +} +.dialog-footer { + border-top: 1px solid #CCCCCC; + width: 100%; + text-align: right; + padding: 10px; +} +.dialog-error { + margin: 10px; + color: red; +} +.dialog input { + margin: 10px; + font-size: inherit; +} +.dialog button { + margin-left: 10px; + font-size: inherit; +} +#save-dialog, #delete-dialog { + width: 50%; + max-width: 20em; +} +#delete-prompt { + padding: 10px; +} + +#content { + overflow-y: scroll; + padding: 1em; +} +#top { + overflow-y: scroll; +} +#graph { + overflow: hidden; +} +#graph svg { + width: 100%; + height: auto; + padding: 10px; +} +#content.source .filename { + margin-top: 0; + margin-bottom: 1em; + font-size: 120%; +} +#content.source pre { + margin-bottom: 3em; +} +table { + border-spacing: 0px; + width: 100%; + padding-bottom: 1em; + white-space: nowrap; +} +table thead { + font-family: 'Roboto Medium', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; +} +table tr th { + position: sticky; + top: 0; + background-color: #ddd; + text-align: right; + padding: .3em .5em; +} +table tr td { + padding: .3em .5em; + text-align: right; +} +#top table tr th:nth-child(6), +#top table tr th:nth-child(7), +#top table tr td:nth-child(6), +#top table tr td:nth-child(7) { + text-align: left; +} +#top table tr td:nth-child(6) { + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +#flathdr1, #flathdr2, #cumhdr1, #cumhdr2, #namehdr { + cursor: ns-resize; +} +.hilite { + background-color: #ebf5fb; + font-weight: bold; +} +/* stacking order */ +.boxtext { z-index: 2; } /* flame graph box text */ +#current-details { z-index: 2; } /* flame graph current box info */ +#detailsbox { z-index: 3; } /* profile details */ +.submenu { z-index: 4; } +.dialog { z-index: 5; } diff --git a/plugin/debug/pkg/internal/driver/html/common.js b/plugin/debug/pkg/internal/driver/html/common.js new file mode 100644 index 00000000..4a2067eb --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/common.js @@ -0,0 +1,714 @@ +// Make svg pannable and zoomable. +// Call clickHandler(t) if a click event is caught by the pan event handlers. +function initPanAndZoom(svg, clickHandler) { + 'use strict'; + + // Current mouse/touch handling mode + const IDLE = 0; + const MOUSEPAN = 1; + const TOUCHPAN = 2; + const TOUCHZOOM = 3; + let mode = IDLE; + + // State needed to implement zooming. + let currentScale = 1.0; + const initWidth = svg.viewBox.baseVal.width; + const initHeight = svg.viewBox.baseVal.height; + + // State needed to implement panning. + let panLastX = 0; // Last event X coordinate + let panLastY = 0; // Last event Y coordinate + let moved = false; // Have we seen significant movement + let touchid = null; // Current touch identifier + + // State needed for pinch zooming + let touchid2 = null; // Second id for pinch zooming + let initGap = 1.0; // Starting gap between two touches + let initScale = 1.0; // currentScale when pinch zoom started + let centerPoint = null; // Center point for scaling + + // Convert event coordinates to svg coordinates. + function toSvg(x, y) { + const p = svg.createSVGPoint(); + p.x = x; + p.y = y; + let m = svg.getCTM(); + if (m == null) m = svg.getScreenCTM(); // Firefox workaround. + return p.matrixTransform(m.inverse()); + } + + // Change the scaling for the svg to s, keeping the point denoted + // by u (in svg coordinates]) fixed at the same screen location. + function rescale(s, u) { + // Limit to a good range. + if (s < 0.2) s = 0.2; + if (s > 10.0) s = 10.0; + + currentScale = s; + + // svg.viewBox defines the visible portion of the user coordinate + // system. So to magnify by s, divide the visible portion by s, + // which will then be stretched to fit the viewport. + const vb = svg.viewBox; + const w1 = vb.baseVal.width; + const w2 = initWidth / s; + const h1 = vb.baseVal.height; + const h2 = initHeight / s; + vb.baseVal.width = w2; + vb.baseVal.height = h2; + + // We also want to adjust vb.baseVal.x so that u.x remains at same + // screen X coordinate. In other words, want to change it from x1 to x2 + // so that: + // (u.x - x1) / w1 = (u.x - x2) / w2 + // Simplifying that, we get + // (u.x - x1) * (w2 / w1) = u.x - x2 + // x2 = u.x - (u.x - x1) * (w2 / w1) + vb.baseVal.x = u.x - (u.x - vb.baseVal.x) * (w2 / w1); + vb.baseVal.y = u.y - (u.y - vb.baseVal.y) * (h2 / h1); + } + + function handleWheel(e) { + if (e.deltaY == 0) return; + // Change scale factor by 1.1 or 1/1.1 + rescale(currentScale * (e.deltaY < 0 ? 1.1 : (1/1.1)), + toSvg(e.offsetX, e.offsetY)); + } + + function setMode(m) { + mode = m; + touchid = null; + touchid2 = null; + } + + function panStart(x, y) { + moved = false; + panLastX = x; + panLastY = y; + } + + function panMove(x, y) { + let dx = x - panLastX; + let dy = y - panLastY; + if (Math.abs(dx) <= 2 && Math.abs(dy) <= 2) return; // Ignore tiny moves + + moved = true; + panLastX = x; + panLastY = y; + + // Firefox workaround: get dimensions from parentNode. + const swidth = svg.clientWidth || svg.parentNode.clientWidth; + const sheight = svg.clientHeight || svg.parentNode.clientHeight; + + // Convert deltas from screen space to svg space. + dx *= (svg.viewBox.baseVal.width / swidth); + dy *= (svg.viewBox.baseVal.height / sheight); + + svg.viewBox.baseVal.x -= dx; + svg.viewBox.baseVal.y -= dy; + } + + function handleScanStart(e) { + if (e.button != 0) return; // Do not catch right-clicks etc. + setMode(MOUSEPAN); + panStart(e.clientX, e.clientY); + e.preventDefault(); + svg.addEventListener('mousemove', handleScanMove); + } + + function handleScanMove(e) { + if (e.buttons == 0) { + // Missed an end event, perhaps because mouse moved outside window. + setMode(IDLE); + svg.removeEventListener('mousemove', handleScanMove); + return; + } + if (mode == MOUSEPAN) panMove(e.clientX, e.clientY); + } + + function handleScanEnd(e) { + if (mode == MOUSEPAN) panMove(e.clientX, e.clientY); + setMode(IDLE); + svg.removeEventListener('mousemove', handleScanMove); + if (!moved) clickHandler(e.target); + } + + // Find touch object with specified identifier. + function findTouch(tlist, id) { + for (const t of tlist) { + if (t.identifier == id) return t; + } + return null; + } + + // Return distance between two touch points + function touchGap(t1, t2) { + const dx = t1.clientX - t2.clientX; + const dy = t1.clientY - t2.clientY; + return Math.hypot(dx, dy); + } + + function handleTouchStart(e) { + if (mode == IDLE && e.changedTouches.length == 1) { + // Start touch based panning + const t = e.changedTouches[0]; + setMode(TOUCHPAN); + touchid = t.identifier; + panStart(t.clientX, t.clientY); + e.preventDefault(); + } else if (mode == TOUCHPAN && e.touches.length == 2) { + // Start pinch zooming + setMode(TOUCHZOOM); + const t1 = e.touches[0]; + const t2 = e.touches[1]; + touchid = t1.identifier; + touchid2 = t2.identifier; + initScale = currentScale; + initGap = touchGap(t1, t2); + centerPoint = toSvg((t1.clientX + t2.clientX) / 2, + (t1.clientY + t2.clientY) / 2); + e.preventDefault(); + } + } + + function handleTouchMove(e) { + if (mode == TOUCHPAN) { + const t = findTouch(e.changedTouches, touchid); + if (t == null) return; + if (e.touches.length != 1) { + setMode(IDLE); + return; + } + panMove(t.clientX, t.clientY); + e.preventDefault(); + } else if (mode == TOUCHZOOM) { + // Get two touches; new gap; rescale to ratio. + const t1 = findTouch(e.touches, touchid); + const t2 = findTouch(e.touches, touchid2); + if (t1 == null || t2 == null) return; + const gap = touchGap(t1, t2); + rescale(initScale * gap / initGap, centerPoint); + e.preventDefault(); + } + } + + function handleTouchEnd(e) { + if (mode == TOUCHPAN) { + const t = findTouch(e.changedTouches, touchid); + if (t == null) return; + panMove(t.clientX, t.clientY); + setMode(IDLE); + e.preventDefault(); + if (!moved) clickHandler(t.target); + } else if (mode == TOUCHZOOM) { + setMode(IDLE); + e.preventDefault(); + } + } + + svg.addEventListener('mousedown', handleScanStart); + svg.addEventListener('mouseup', handleScanEnd); + svg.addEventListener('touchstart', handleTouchStart); + svg.addEventListener('touchmove', handleTouchMove); + svg.addEventListener('touchend', handleTouchEnd); + svg.addEventListener('wheel', handleWheel, true); +} + +function initMenus() { + 'use strict'; + + let activeMenu = null; + let activeMenuHdr = null; + + function cancelActiveMenu() { + if (activeMenu == null) return; + activeMenu.style.display = 'none'; + activeMenu = null; + activeMenuHdr = null; + } + + // Set click handlers on every menu header. + for (const menu of document.getElementsByClassName('submenu')) { + const hdr = menu.parentElement; + if (hdr == null) return; + if (hdr.classList.contains('disabled')) return; + function showMenu(e) { + // menu is a child of hdr, so this event can fire for clicks + // inside menu. Ignore such clicks. + if (e.target.parentElement != hdr) return; + activeMenu = menu; + activeMenuHdr = hdr; + menu.style.display = 'block'; + } + hdr.addEventListener('mousedown', showMenu); + hdr.addEventListener('touchstart', showMenu); + } + + // If there is an active menu and a down event outside, retract the menu. + for (const t of ['mousedown', 'touchstart']) { + document.addEventListener(t, (e) => { + // Note: to avoid unnecessary flicker, if the down event is inside + // the active menu header, do not retract the menu. + if (activeMenuHdr != e.target.closest('.menu-item')) { + cancelActiveMenu(); + } + }, { passive: true, capture: true }); + } + + // If there is an active menu and an up event inside, retract the menu. + document.addEventListener('mouseup', (e) => { + if (activeMenu == e.target.closest('.submenu')) { + cancelActiveMenu(); + } + }, { passive: true, capture: true }); +} + +function sendURL(method, url, done) { + fetch(url.toString(), {method: method}) + .then((response) => { done(response.ok); }) + .catch((error) => { done(false); }); +} + +// Initialize handlers for saving/loading configurations. +function initConfigManager() { + 'use strict'; + + // Initialize various elements. + function elem(id) { + const result = document.getElementById(id); + if (!result) console.warn('element ' + id + ' not found'); + return result; + } + const overlay = elem('dialog-overlay'); + const saveDialog = elem('save-dialog'); + const saveInput = elem('save-name'); + const saveError = elem('save-error'); + const delDialog = elem('delete-dialog'); + const delPrompt = elem('delete-prompt'); + const delError = elem('delete-error'); + + let currentDialog = null; + let currentDeleteTarget = null; + + function showDialog(dialog) { + if (currentDialog != null) { + overlay.style.display = 'none'; + currentDialog.style.display = 'none'; + } + currentDialog = dialog; + if (dialog != null) { + overlay.style.display = 'block'; + dialog.style.display = 'block'; + } + } + + function cancelDialog(e) { + showDialog(null); + } + + // Show dialog for saving the current config. + function showSaveDialog(e) { + saveError.innerText = ''; + showDialog(saveDialog); + saveInput.focus(); + } + + // Commit save config. + function commitSave(e) { + const name = saveInput.value; + const url = new URL(document.URL); + // Set path relative to existing path. + url.pathname = new URL('./saveconfig', document.URL).pathname; + url.searchParams.set('config', name); + saveError.innerText = ''; + sendURL('POST', url, (ok) => { + if (!ok) { + saveError.innerText = 'Save failed'; + } else { + showDialog(null); + location.reload(); // Reload to show updated config menu + } + }); + } + + function handleSaveInputKey(e) { + if (e.key === 'Enter') commitSave(e); + } + + function deleteConfig(e, elem) { + e.preventDefault(); + const config = elem.dataset.config; + delPrompt.innerText = 'Delete ' + config + '?'; + currentDeleteTarget = elem; + showDialog(delDialog); + } + + function commitDelete(e, elem) { + if (!currentDeleteTarget) return; + const config = currentDeleteTarget.dataset.config; + const url = new URL('./deleteconfig', document.URL); + url.searchParams.set('config', config); + delError.innerText = ''; + sendURL('DELETE', url, (ok) => { + if (!ok) { + delError.innerText = 'Delete failed'; + return; + } + showDialog(null); + // Remove menu entry for this config. + if (currentDeleteTarget && currentDeleteTarget.parentElement) { + currentDeleteTarget.parentElement.remove(); + } + }); + } + + // Bind event on elem to fn. + function bind(event, elem, fn) { + if (elem == null) return; + elem.addEventListener(event, fn); + if (event == 'click') { + // Also enable via touch. + elem.addEventListener('touchstart', fn); + } + } + + bind('click', elem('save-config'), showSaveDialog); + bind('click', elem('save-cancel'), cancelDialog); + bind('click', elem('save-confirm'), commitSave); + bind('keydown', saveInput, handleSaveInputKey); + + bind('click', elem('delete-cancel'), cancelDialog); + bind('click', elem('delete-confirm'), commitDelete); + + // Activate deletion button for all config entries in menu. + for (const del of Array.from(document.getElementsByClassName('menu-delete-btn'))) { + bind('click', del, (e) => { + deleteConfig(e, del); + }); + } +} + +// options if present can contain: +// hiliter: function(Number, Boolean): Boolean +// Overridable mechanism for highlighting/unhighlighting specified node. +// current: function() Map[Number,Boolean] +// Overridable mechanism for fetching set of currently selected nodes. +function viewer(baseUrl, nodes, options) { + 'use strict'; + + // Elements + const search = document.getElementById('search'); + const graph0 = document.getElementById('graph0'); + const svg = (graph0 == null ? null : graph0.parentElement); + const toptable = document.getElementById('toptable'); + + let regexpActive = false; + let selected = new Map(); + let origFill = new Map(); + let searchAlarm = null; + let buttonsEnabled = true; + + // Return current selection. + function getSelection() { + if (selected.size > 0) { + return selected; + } else if (options && options.current) { + return options.current(); + } + return new Map(); + } + + function handleDetails(e) { + e.preventDefault(); + const detailsText = document.getElementById('detailsbox'); + if (detailsText != null) { + if (detailsText.style.display === 'block') { + detailsText.style.display = 'none'; + } else { + detailsText.style.display = 'block'; + } + } + } + + function handleKey(e) { + if (e.keyCode != 13) return; + setHrefParams(window.location, function (params) { + params.set('f', search.value); + }); + e.preventDefault(); + } + + function handleSearch() { + // Delay expensive processing so a flurry of key strokes is handled once. + if (searchAlarm != null) { + clearTimeout(searchAlarm); + } + searchAlarm = setTimeout(selectMatching, 300); + + regexpActive = true; + updateButtons(); + } + + function selectMatching() { + searchAlarm = null; + let re = null; + if (search.value != '') { + try { + re = new RegExp(search.value); + } catch (e) { + // TODO: Display error state in search box + return; + } + } + + function match(text) { + return re != null && re.test(text); + } + + // drop currently selected items that do not match re. + selected.forEach(function(v, n) { + if (!match(nodes[n])) { + unselect(n); + } + }) + + // add matching items that are not currently selected. + if (nodes) { + for (let n = 0; n < nodes.length; n++) { + if (!selected.has(n) && match(nodes[n])) { + select(n); + } + } + } + + updateButtons(); + } + + function toggleSvgSelect(elem) { + // Walk up to immediate child of graph0 + while (elem != null && elem.parentElement != graph0) { + elem = elem.parentElement; + } + if (!elem) return; + + // Disable regexp mode. + regexpActive = false; + + const n = nodeId(elem); + if (n < 0) return; + if (selected.has(n)) { + unselect(n); + } else { + select(n); + } + updateButtons(); + } + + function unselect(n) { + if (setNodeHighlight(n, false)) selected.delete(n); + } + + function select(n, elem) { + if (setNodeHighlight(n, true)) selected.set(n, true); + } + + function nodeId(elem) { + const id = elem.id; + if (!id) return -1; + if (!id.startsWith('node')) return -1; + const n = parseInt(id.slice(4), 10); + if (isNaN(n)) return -1; + if (n < 0 || n >= nodes.length) return -1; + return n; + } + + // Change highlighting of node (returns true if node was found). + function setNodeHighlight(n, set) { + if (options && options.hiliter) return options.hiliter(n, set); + + const elem = document.getElementById('node' + n); + if (!elem) return false; + + // Handle table row highlighting. + if (elem.nodeName == 'TR') { + elem.classList.toggle('hilite', set); + return true; + } + + // Handle svg element highlighting. + const p = findPolygon(elem); + if (p != null) { + if (set) { + origFill.set(p, p.style.fill); + p.style.fill = '#ccccff'; + } else if (origFill.has(p)) { + p.style.fill = origFill.get(p); + } + } + + return true; + } + + function findPolygon(elem) { + if (elem.localName == 'polygon') return elem; + for (const c of elem.children) { + const p = findPolygon(c); + if (p != null) return p; + } + return null; + } + + function setSampleIndexLink(si) { + const elem = document.getElementById('sampletype-' + si); + if (elem != null) { + setHrefParams(elem, function (params) { + params.set("si", si); + }); + } + } + + // Update id's href to reflect current selection whenever it is + // liable to be followed. + function makeSearchLinkDynamic(id) { + const elem = document.getElementById(id); + if (elem == null) return; + + // Most links copy current selection into the 'f' parameter, + // but Refine menu links are different. + let param = 'f'; + if (id == 'ignore') param = 'i'; + if (id == 'hide') param = 'h'; + if (id == 'show') param = 's'; + if (id == 'show-from') param = 'sf'; + + // We update on mouseenter so middle-click/right-click work properly. + elem.addEventListener('mouseenter', updater); + elem.addEventListener('touchstart', updater); + + function updater() { + // The selection can be in one of two modes: regexp-based or + // list-based. Construct regular expression depending on mode. + let re = regexpActive + ? search.value + : Array.from(getSelection().keys()).map(key => pprofQuoteMeta(nodes[key])).join('|'); + + setHrefParams(elem, function (params) { + if (re != '') { + // For focus/show/show-from, forget old parameter. For others, add to re. + if (param != 'f' && param != 's' && param != 'sf' && params.has(param)) { + const old = params.get(param); + if (old != '') { + re += '|' + old; + } + } + params.set(param, re); + } else { + params.delete(param); + } + }); + } + } + + function setHrefParams(elem, paramSetter) { + let url = new URL(elem.href); + url.hash = ''; + + // Copy params from this page's URL. + const params = url.searchParams; + for (const p of new URLSearchParams(window.location.search)) { + params.set(p[0], p[1]); + } + + // Give the params to the setter to modify. + paramSetter(params); + + elem.href = url.toString(); + } + + function handleTopClick(e) { + // Walk back until we find TR and then get the Name column (index 5) + let elem = e.target; + while (elem != null && elem.nodeName != 'TR') { + elem = elem.parentElement; + } + if (elem == null || elem.children.length < 6) return; + + e.preventDefault(); + const tr = elem; + const td = elem.children[5]; + if (td.nodeName != 'TD') return; + const name = td.innerText; + const index = nodes.indexOf(name); + if (index < 0) return; + + // Disable regexp mode. + regexpActive = false; + + if (selected.has(index)) { + unselect(index, elem); + } else { + select(index, elem); + } + updateButtons(); + } + + function updateButtons() { + const enable = (search.value != '' || getSelection().size != 0); + if (buttonsEnabled == enable) return; + buttonsEnabled = enable; + for (const id of ['focus', 'ignore', 'hide', 'show', 'show-from']) { + const link = document.getElementById(id); + if (link != null) { + link.classList.toggle('disabled', !enable); + } + } + } + + // Initialize button states + updateButtons(); + + // Setup event handlers + initMenus(); + if (svg != null) { + initPanAndZoom(svg, toggleSvgSelect); + } + if (toptable != null) { + toptable.addEventListener('mousedown', handleTopClick); + toptable.addEventListener('touchstart', handleTopClick); + } + + const ids = ['topbtn', 'graphbtn', + 'flamegraph', + 'peek', 'list', + 'disasm', 'focus', 'ignore', 'hide', 'show', 'show-from']; + ids.forEach(makeSearchLinkDynamic); + + const sampleIDs = [{{range .SampleTypes}}'{{.}}', {{end}}]; + sampleIDs.forEach(setSampleIndexLink); + + // Bind action to button with specified id. + function addAction(id, action) { + const btn = document.getElementById(id); + if (btn != null) { + btn.addEventListener('click', action); + btn.addEventListener('touchstart', action); + } + } + + addAction('details', handleDetails); + initConfigManager(); + + search.addEventListener('input', handleSearch); + search.addEventListener('keydown', handleKey); + + // Give initial focus to main container so it can be scrolled using keys. + const main = document.getElementById('bodycontainer'); + if (main) { + main.focus(); + } +} + +// convert a string to a regexp that matches exactly that string. +function pprofQuoteMeta(str) { + return '^' + str.replace(/([\\\.?+*\[\](){}|^$])/g, '\\$1') + '$'; +} diff --git a/plugin/debug/pkg/internal/driver/html/graph.css b/plugin/debug/pkg/internal/driver/html/graph.css new file mode 100644 index 00000000..c756ddfd --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/graph.css @@ -0,0 +1,7 @@ +#graph { + cursor: grab; +} + +#graph:active { + cursor: grabbing; +} diff --git a/plugin/debug/pkg/internal/driver/html/graph.html b/plugin/debug/pkg/internal/driver/html/graph.html new file mode 100644 index 00000000..d17a0ea7 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/graph.html @@ -0,0 +1,17 @@ + + + + + {{.Title}} + {{template "css" .}} + {{template "graph_css" .}} + + + {{template "header" .}} +
+ {{.HTMLBody}} +
+ {{template "script" .}} + + + diff --git a/plugin/debug/pkg/internal/driver/html/header.html b/plugin/debug/pkg/internal/driver/html/header.html new file mode 100644 index 00000000..5405a0be --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/header.html @@ -0,0 +1,119 @@ +
+
+

pprof

+
+ + + + {{$sampleLen := len .SampleTypes}} + {{if gt $sampleLen 1}} + + {{end}} + + + + + + + +
+ +
+ +
+ {{.Title}} +
+ {{range .Legend}}
{{.}}
{{end}} +
+
+ + {{if .DocURL}} + + {{end}} +
+ +
+ +
+
Save options as
+ + {{range .Configs}}{{if .UserConfig}} + + +
+ +
+
Delete config
+
+ +
+ +
{{range .Errors}}
{{.}}
{{end}}
diff --git a/plugin/debug/pkg/internal/driver/html/plaintext.html b/plugin/debug/pkg/internal/driver/html/plaintext.html new file mode 100644 index 00000000..9791cc77 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/plaintext.html @@ -0,0 +1,18 @@ + + + + + {{.Title}} + {{template "css" .}} + + + {{template "header" .}} +
+
+      {{.TextBody}}
+    
+
+ {{template "script" .}} + + + diff --git a/plugin/debug/pkg/internal/driver/html/source.html b/plugin/debug/pkg/internal/driver/html/source.html new file mode 100644 index 00000000..b676ce20 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/source.html @@ -0,0 +1,72 @@ + + + + + {{.Title}} + {{if not .Standalone}}{{template "css" .}}{{end}} + {{template "weblistcss" .}} + {{template "weblistjs" .}} + +{{"\n" -}} + {{/* emit different header in standalone mode */ -}} + {{if .Standalone}}{{"\n" -}} +
{{"" -}} + {{range $i, $e := .Legend -}} + {{if $i}}
{{"\n"}}{{end}}{{. -}} + {{end}}
Total: {{.Listing.Total -}} +
{{"" -}} + {{else -}} + {{template "header" .}} +
{{"" -}} + {{end -}} + + {{range .Listing.Files -}} + {{range .Funcs -}} +

{{.Name}}

{{"" -}} +

{{.File}}

{{"\n" -}} +
{{"\n" -}}
+        {{printf "  Total:  %10s %10s (flat, cum) %s" .Flat .Cumulative .Percent -}}
+        {{range .Lines -}}{{"\n" -}}
+          {{/* source line */ -}}
+          {{printf " %6d" .Line}}{{" " -}}
+          
+            {{- printf "  %10s %10s %8s  %s " .Flat .Cumulative "" .SrcLine -}}
+          {{"" -}}
+
+          {{if .Instructions -}}
+            {{/* instructions for this source line */ -}}
+            {{"" -}}
+            {{range .Instructions -}}
+              {{/* separate when we hit a new basic block */ -}}
+              {{if .NewBlock -}}{{printf " %8s %28s\n" "" "⋮"}}{{end -}}
+
+              {{/* inlined calls leading to this instruction */ -}}
+              {{range .InlinedCalls -}}
+                {{printf " %8s %10s %10s %8s  " "" "" "" "" -}}
+                {{.SrcLine}}{{" " -}}
+                {{.FileBase}}:{{.Line}}{{"\n" -}}
+              {{end -}}
+
+              {{if not .Synthetic -}}
+                {{/* disassembled instruction */ -}}
+                {{printf " %8s %10s %10s %8x: %s " "" .Flat .Cumulative .Address .Disasm -}}
+                {{.FileLine}}{{"\n" -}}
+              {{end -}}
+            {{end -}}
+            {{"" -}}
+          {{end -}}
+          {{/* end of line */ -}}
+        {{end}}{{"\n" -}}
+      
{{"\n" -}} + {{/* end of function */ -}} + {{end -}} + {{/* end of file */ -}} + {{end -}} + + {{if not .Standalone}}{{"\n " -}} +
{{"\n" -}} + {{template "script" .}}{{"\n" -}} + {{"" -}} + {{end}} + + diff --git a/plugin/debug/pkg/internal/driver/html/stacks.css b/plugin/debug/pkg/internal/driver/html/stacks.css new file mode 100644 index 00000000..1df4f719 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/stacks.css @@ -0,0 +1,89 @@ +body { + overflow: hidden; /* Want scrollbar not here, but in #stack-holder */ +} +/* Scrollable container for flame graph */ +#stack-holder { + width: 100%; + flex-grow: 1; + overflow-y: auto; + background: #eee; /* Light grey gives better contrast with boxes */ + position: relative; /* Allows absolute positioning of child boxes */ +} +/* Flame graph */ +#stack-chart { + width: 100%; + position: relative; /* Allows absolute positioning of child boxes */ +} +/* Holder for current frame details. */ +#current-details { + position: relative; + background: #eee; /* Light grey gives better contrast with boxes */ + font-size: 12pt; + padding: 0 4px; + width: 100%; +} +/* Shows details of frame that is under the mouse */ +#current-details-left { + float: left; + max-width: 60%; + white-space: nowrap; + overflow-x: hidden; +} +#current-details-right { + float: right; + max-width: 40%; + white-space: nowrap; + overflow-x: hidden; +} +/* Background of a single flame-graph frame */ +.boxbg { + border-width: 0px; + position: absolute; + overflow: hidden; + box-sizing: border-box; + background: #d8d8d8; +} +.positive { position: absolute; background: #caa; } +.negative { position: absolute; background: #aca; } +/* Not-inlined frames are visually separated from their caller. */ +.not-inlined { + border-top: 1px solid black; +} +/* Function name */ +.boxtext { + position: absolute; + width: 100%; + padding-left: 2px; + line-height: 18px; + cursor: default; + font-family: "Google Sans", Arial, sans-serif; + font-size: 12pt; + z-index: 2; +} +/* Box highlighting via shadows to avoid size changes */ +.hilite { box-shadow: 0px 0px 0px 2px #000; z-index: 1; } +.hilite2 { box-shadow: 0px 0px 0px 2px #000; z-index: 1; } +/* Gap left between callers and callees */ +.separator { + position: absolute; + text-align: center; + font-size: 12pt; + font-weight: bold; +} +/* Right-click menu */ +#action-menu { + max-width: 15em; +} +/* Right-click menu title */ +#action-title { + display: block; + padding: 0.5em 1em; + background: #888; + text-overflow: ellipsis; + overflow: hidden; +} +/* Internal canvas used to measure text size when picking fonts */ +#textsizer { + position: absolute; + bottom: -100px; +} diff --git a/plugin/debug/pkg/internal/driver/html/stacks.html b/plugin/debug/pkg/internal/driver/html/stacks.html new file mode 100644 index 00000000..a4e4077e --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/stacks.html @@ -0,0 +1,36 @@ + + + + + {{.Title}} + {{template "css" .}} + {{template "stacks_css"}} + + + {{template "header" .}} +
+
+
 
+
+
+
+
+ + {{template "script" .}} + {{template "stacks_js"}} + + + diff --git a/plugin/debug/pkg/internal/driver/html/stacks.js b/plugin/debug/pkg/internal/driver/html/stacks.js new file mode 100644 index 00000000..7db06996 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/stacks.js @@ -0,0 +1,638 @@ +// stackViewer displays a flame-graph like view (extended to show callers). +// stacks - report.StackSet +// nodes - List of names for each source in report.StackSet +function stackViewer(stacks, nodes) { + 'use strict'; + + // Constants used in rendering. + const ROW = 20; + const PADDING = 2; + const MIN_WIDTH = 4; + const MIN_TEXT_WIDTH = 16; + const TEXT_MARGIN = 2; + const FONT_SIZE = 12; + const MIN_FONT_SIZE = 8; + + // Fields + let pivots = []; // Indices of currently selected data.Sources entries. + let matches = new Set(); // Indices of sources that match search + let elems = new Map(); // Mapping from source index to display elements + let displayList = []; // List of boxes to display. + let actionMenuOn = false; // Is action menu visible? + let actionTarget = null; // Box on which action menu is operating. + let diff = false; // Are we displaying a diff? + let shown = 0; // How many profile values are being displayed? + + for (const stack of stacks.Stacks) { + if (stack.Value < 0) { + diff = true; + break; + } + } + + // Setup to allow measuring text width. + const textSizer = document.createElement('canvas'); + textSizer.id = 'textsizer'; + const textContext = textSizer.getContext('2d'); + + // Get DOM elements. + const chart = find('stack-chart'); + const search = find('search'); + const actions = find('action-menu'); + const actionTitle = find('action-title'); + const leftDetailBox = find('current-details-left'); + const rightDetailBox = find('current-details-right'); + + window.addEventListener('resize', render); + window.addEventListener('popstate', render); + search.addEventListener('keydown', handleSearchKey); + + // Withdraw action menu when clicking outside, or when item selected. + document.addEventListener('mousedown', (e) => { + if (!actions.contains(e.target)) { + hideActionMenu(); + } + }); + actions.addEventListener('click', hideActionMenu); + + // Initialize menus and other general UI elements. + viewer(new URL(window.location.href), nodes, { + hiliter: (n, on) => { return hilite(n, on); }, + current: () => { + let r = new Map(); + if (pivots.length == 1 && pivots[0] == 0) { + // Not pivoting + } else { + for (let p of pivots) { + r.set(p, true); + } + } + return r; + }}); + + render(); + clearDetails(); + + // Helper functions follow: + + // hilite changes the highlighting of elements corresponding to specified src. + function hilite(src, on) { + if (on) { + matches.add(src); + } else { + matches.delete(src); + } + toggleClass(src, 'hilite', on); + return true; + } + + // Display action menu (triggered by right-click on a frame) + function showActionMenu(e, box) { + if (box.src == 0) return; // No action menu for root + e.preventDefault(); // Disable browser context menu + const src = stacks.Sources[box.src]; + actionTitle.innerText = src.Display[src.Display.length-1]; + const menu = actions; + menu.style.display = 'block'; + // Compute position so menu stays visible and near the mouse. + const x = Math.min(e.clientX - 10, document.body.clientWidth - menu.clientWidth); + const y = Math.min(e.clientY - 10, document.body.clientHeight - menu.clientHeight); + menu.style.left = x + 'px'; + menu.style.top = y + 'px'; + // Set menu links to operate on clicked box. + setHrefParam('action-source', 'f', box.src); + setHrefParam('action-source-tab', 'f', box.src); + setHrefParam('action-focus', 'f', box.src); + setHrefParam('action-ignore', 'i', box.src); + setHrefParam('action-hide', 'h', box.src); + setHrefParam('action-showfrom', 'sf', box.src); + toggleClass(box.src, 'hilite2', true); + actionTarget = box; + actionMenuOn = true; + } + + function hideActionMenu() { + actions.style.display = 'none'; + actionMenuOn = false; + if (actionTarget != null) { + toggleClass(actionTarget.src, 'hilite2', false); + } + } + + // setHrefParam updates the specified parameter in the href of an + // element to make it operate on the specified src. + function setHrefParam(id, param, src) { + const elem = document.getElementById(id); + if (!elem) return; + + let url = new URL(elem.href); + url.hash = ''; + + // Copy params from this page's URL. + const params = url.searchParams; + for (const p of new URLSearchParams(window.location.search)) { + params.set(p[0], p[1]); + } + + // Update params to include src. + // When `pprof` is invoked with `-lines`, FullName will be suffixed with `:`, + // which we need to remove. + let v = pprofQuoteMeta(stacks.Sources[src].FullName.replace(/:[0-9]+$/, '')); + if (param != 'f' && param != 'sf') { // old f,sf values are overwritten + // Add new source to current parameter value. + const old = params.get(param); + if (old && old != '') { + v += '|' + old; + } + } + params.set(param, v); + + elem.href = url.toString(); + } + + // Capture Enter key in the search box to make it pivot instead of focus. + function handleSearchKey(e) { + if (e.key != 'Enter') return; + e.stopImmediatePropagation(); // Disable normal enter key handling + const val = search.value; + try { + new RegExp(search.value); + } catch (error) { + return; // TODO: Display error state in search box + } + switchPivots(val); + } + + function switchPivots(regexp) { + // Switch URL without hitting the server. + const url = new URL(document.URL); + if (regexp === '' || regexp === '^$') { + url.searchParams.delete('p'); // Not pivoting + } else { + url.searchParams.set('p', regexp); + } + history.pushState('', '', url.toString()); // Makes back-button work + matches = new Set(); + search.value = ''; + render(); + } + + function handleEnter(box, div) { + if (actionMenuOn) return; + const src = stacks.Sources[box.src]; + div.title = details(box) + ' │ ' + src.FullName + (src.Inlined ? "\n(inlined)" : ""); + leftDetailBox.innerText = src.FullName + (src.Inlined ? " (inlined)" : ""); + let timing = summary(box.sumpos, box.sumneg); + if (box.self != 0) { + timing = "self " + unitText(box.self) + " │ " + timing; + } + rightDetailBox.innerText = timing; + // Highlight all boxes that have the same source as box. + toggleClass(box.src, 'hilite2', true); + } + + function handleLeave(box) { + if (actionMenuOn) return; + clearDetails(); + toggleClass(box.src, 'hilite2', false); + } + + function clearDetails() { + leftDetailBox.innerText = ''; + rightDetailBox.innerText = percentText(shown); + } + + // Return list of sources that match the regexp given by the 'p' URL parameter. + function urlPivots() { + const pivots = []; + const params = (new URL(document.URL)).searchParams; + const val = params.get('p'); + if (val !== null && val != '') { + try { + const re = new RegExp(val); + for (let i = 0; i < stacks.Sources.length; i++) { + const src = stacks.Sources[i]; + if (re.test(src.UniqueName) || re.test(src.FileName)) { + pivots.push(i); + } + } + } catch (error) {} + } + if (pivots.length == 0) { + pivots.push(0); + } + return pivots; + } + + // render re-generates the stack display. + function render() { + pivots = urlPivots(); + + // Get places where pivots occur. + let places = []; + for (let pivot of pivots) { + const src = stacks.Sources[pivot]; + for (let p of src.Places) { + places.push(p); + } + } + + const width = chart.clientWidth; + elems.clear(); + actionTarget = null; + const [pos, neg] = totalValue(places); + const total = pos + neg; + const xscale = (width-2*PADDING) / total; // Converts from profile value to X pixels + const x = PADDING; + const y = 0; + + // Show summary for pivots if we are actually pivoting. + const showPivotSummary = !(pivots.length == 1 && pivots[0] == 0); + + shown = pos + neg; + displayList.length = 0; + renderStacks(0, xscale, x, y, places, +1); // Callees + renderStacks(0, xscale, x, y-ROW, places, -1); // Callers (ROW left for separator) + display(xscale, pos, neg, displayList, showPivotSummary); + } + + // renderStacks creates boxes with top-left at x,y with children drawn as + // nested stacks (below or above based on the sign of direction). + // Returns the largest y coordinate filled. + function renderStacks(depth, xscale, x, y, places, direction) { + // Example: suppose we are drawing the following stacks: + // a->b->c + // a->b->d + // a->e->f + // After rendering a, we will call renderStacks, with places pointing to + // the preceding stacks. + // + // We first group all places with the same leading entry. In this example + // we get [b->c, b->d] and [e->f]. We render the two groups side-by-side. + const groups = partitionPlaces(places); + for (const g of groups) { + renderGroup(depth, xscale, x, y, g, direction); + x += groupWidth(xscale, g); + } + } + + // Some of the types used below: + // + // // Group represents a displayed (sub)tree. + // interface Group { + // name: string; // Full name of source + // src: number; // Index in stacks.Sources + // self: number; // Contribution as leaf (may be < 0 for diffs) + // sumpos: number; // Sum of |self| of positive nodes in tree (>= 0) + // sumneg: number; // Sum of |self| of negative nodes in tree (>= 0) + // places: Place[]; // Stack slots that contributed to this group + // } + // + // // Box is a rendered item. + // interface Box { + // x: number; // X coordinate of top-left + // y: number; // Y coordinate of top-left + // width: number; // Width of box to display + // src: number; // Index in stacks.Sources + // sumpos: number; // From corresponding Group + // sumneg: number; // From corresponding Group + // self: number; // From corresponding Group + // }; + + function groupWidth(xscale, g) { + return xscale * (g.sumpos + g.sumneg); + } + + function renderGroup(depth, xscale, x, y, g, direction) { + // Skip if not wide enough. + const width = groupWidth(xscale, g); + if (width < MIN_WIDTH) return; + + // Draw the box for g.src (except for selected element in upwards direction + // since that duplicates the box we added in downwards direction). + if (depth != 0 || direction > 0) { + const box = { + x: x, + y: y, + width: width, + src: g.src, + sumpos: g.sumpos, + sumneg: g.sumneg, + self: g.self, + }; + displayList.push(box); + if (direction > 0) { + // Leave gap on left hand side to indicate self contribution. + x += xscale*Math.abs(g.self); + } + } + y += direction * ROW; + + // Find child or parent stacks. + const next = []; + for (const place of g.places) { + const stack = stacks.Stacks[place.Stack]; + const nextSlot = place.Pos + direction; + if (nextSlot >= 0 && nextSlot < stack.Sources.length) { + next.push({Stack: place.Stack, Pos: nextSlot}); + } + } + renderStacks(depth+1, xscale, x, y, next, direction); + } + + // partitionPlaces partitions a set of places into groups where each group + // contains places with the same source. If a stack occurs multiple times + // in places, only the outer-most occurrence is kept. + function partitionPlaces(places) { + // Find outer-most slot per stack (used later to elide duplicate stacks). + const stackMap = new Map(); // Map from stack index to outer-most slot# + for (const place of places) { + const prevSlot = stackMap.get(place.Stack); + if (prevSlot && prevSlot <= place.Pos) { + // We already have a higher slot in this stack. + } else { + stackMap.set(place.Stack, place.Pos); + } + } + + // Now partition the stacks. + const groups = []; // Array of Group {name, src, sum, self, places} + const groupMap = new Map(); // Map from Source to Group + for (const place of places) { + if (stackMap.get(place.Stack) != place.Pos) { + continue; + } + + const stack = stacks.Stacks[place.Stack]; + const src = stack.Sources[place.Pos]; + let group = groupMap.get(src); + if (!group) { + const name = stacks.Sources[src].FullName; + group = {name: name, src: src, sumpos: 0, sumneg: 0, self: 0, places: []}; + groupMap.set(src, group); + groups.push(group); + } + if (stack.Value < 0) { + group.sumneg += -stack.Value; + } else { + group.sumpos += stack.Value; + } + group.self += (place.Pos == stack.Sources.length-1) ? stack.Value : 0; + group.places.push(place); + } + + // Order by decreasing cost (makes it easier to spot heavy functions). + // Though alphabetical ordering is a potential alternative that will make + // profile comparisons easier. + groups.sort(function(a, b) { + return (b.sumpos + b.sumneg) - (a.sumpos + a.sumneg); + }); + + return groups; + } + + function display(xscale, posTotal, negTotal, list, showPivotSummary) { + // Sort boxes so that text selection follows a predictable order. + list.sort(function(a, b) { + if (a.y != b.y) return a.y - b.y; + return a.x - b.x; + }); + + // Adjust Y coordinates so that zero is at top. + let adjust = (list.length > 0) ? list[0].y : 0; + + const divs = []; + for (const box of list) { + box.y -= adjust; + divs.push(drawBox(xscale, box)); + } + if (showPivotSummary) { + divs.push(drawSep(-adjust, posTotal, negTotal)); + } + + const h = (list.length > 0 ? list[list.length-1].y : 0) + 4*ROW; + chart.style.height = h+'px'; + chart.replaceChildren(...divs); + } + + function drawBox(xscale, box) { + const srcIndex = box.src; + const src = stacks.Sources[srcIndex]; + + function makeRect(cl, x, y, w, h) { + const r = document.createElement('div'); + r.style.left = x+'px'; + r.style.top = y+'px'; + r.style.width = w+'px'; + r.style.height = h+'px'; + r.classList.add(cl); + return r; + } + + // Background + const w = box.width - 1; // Leave 1px gap + const r = makeRect('boxbg', box.x, box.y, w, ROW); + if (!diff) r.style.background = makeColor(src.Color); + addElem(srcIndex, r); + if (!src.Inlined) { + r.classList.add('not-inlined'); + } + + // Positive/negative indicator for diff mode. + if (diff) { + const delta = box.sumpos - box.sumneg; + const partWidth = xscale * Math.abs(delta); + if (partWidth >= MIN_WIDTH) { + r.appendChild(makeRect((delta < 0 ? 'negative' : 'positive'), + 0, 0, partWidth, ROW-1)); + } + } + + // Label + if (box.width >= MIN_TEXT_WIDTH) { + const t = document.createElement('div'); + t.classList.add('boxtext'); + fitText(t, box.width-2*TEXT_MARGIN, src.Display); + r.appendChild(t); + } + + onClick(r, () => { switchPivots(pprofQuoteMeta(src.UniqueName)); }); + r.addEventListener('mouseenter', () => { handleEnter(box, r); }); + r.addEventListener('mouseleave', () => { handleLeave(box); }); + r.addEventListener('contextmenu', (e) => { showActionMenu(e, box); }); + return r; + } + + // Handle clicks, but only if the mouse did not move during the click. + function onClick(target, handler) { + // Disable click if mouse moves more than threshold pixels since mousedown. + const threshold = 3; + let [x, y] = [-1, -1]; + target.addEventListener('mousedown', (e) => { + [x, y] = [e.clientX, e.clientY]; + }); + target.addEventListener('click', (e) => { + if (Math.abs(e.clientX - x) <= threshold && + Math.abs(e.clientY - y) <= threshold) { + handler(); + } + }); + } + + function drawSep(y, posTotal, negTotal) { + const m = document.createElement('div'); + m.innerText = summary(posTotal, negTotal); + m.style.top = (y-ROW) + 'px'; + m.style.left = PADDING + 'px'; + m.style.width = (chart.clientWidth - PADDING*2) + 'px'; + m.classList.add('separator'); + return m; + } + + // addElem registers an element that belongs to the specified src. + function addElem(src, elem) { + let list = elems.get(src); + if (!list) { + list = []; + elems.set(src, list); + } + list.push(elem); + elem.classList.toggle('hilite', matches.has(src)); + } + + // Adds or removes cl from classList of all elements for the specified source. + function toggleClass(src, cl, value) { + const list = elems.get(src); + if (list) { + for (const elem of list) { + elem.classList.toggle(cl, value); + } + } + } + + // fitText sets text and font-size clipped to the specified width w. + function fitText(t, avail, textList) { + // Find first entry in textList that fits. + let width = avail; + textContext.font = FONT_SIZE + 'pt Arial'; + for (let i = 0; i < textList.length; i++) { + let text = textList[i]; + width = textContext.measureText(text).width; + if (width <= avail) { + t.innerText = text; + return; + } + } + + // Try to fit by dropping font size. + let text = textList[textList.length-1]; + const fs = Math.max(MIN_FONT_SIZE, FONT_SIZE * (avail / width)); + t.style.fontSize = fs + 'pt'; + t.innerText = text; + } + + // totalValue returns the positive and negative sums of the Values of stacks + // listed in places. + function totalValue(places) { + const seen = new Set(); + let pos = 0; + let neg = 0; + for (const place of places) { + if (seen.has(place.Stack)) continue; // Do not double-count stacks + seen.add(place.Stack); + const stack = stacks.Stacks[place.Stack]; + if (stack.Value < 0) { + neg += -stack.Value; + } else { + pos += stack.Value; + } + } + return [pos, neg]; + } + + function summary(pos, neg) { + // Examples: + // 6s (10%) + // 12s (20%) 🠆 18s (30%) + return diff ? diffText(neg, pos) : percentText(pos); + } + + function details(box) { + // Examples: + // 6s (10%) + // 6s (10%) │ self 3s (5%) + // 6s (10%) │ 12s (20%) 🠆 18s (30%) + let result = percentText(box.sumpos - box.sumneg); + if (box.self != 0) { + result += " │ self " + unitText(box.self); + } + if (diff && box.sumpos > 0 && box.sumneg > 0) { + result += " │ " + diffText(box.sumneg, box.sumpos); + } + return result; + } + + // diffText returns text that displays from and to alongside their percentages. + // E.g., 9s (45%) 🠆 10s (50%) + function diffText(from, to) { + return percentText(from) + " 🠆 " + percentText(to); + } + + // percentText returns text that displays v in appropriate units alongside its + // percentange. + function percentText(v) { + function percent(v, total) { + return Number(((100.0 * v) / total).toFixed(1)) + '%'; + } + return unitText(v) + " (" + percent(v, stacks.Total) + ")"; + } + + // unitText returns a formatted string to display for value. + function unitText(value) { + return pprofUnitText(value*stacks.Scale, stacks.Unit); + } + + function find(name) { + const elem = document.getElementById(name); + if (!elem) { + throw 'element not found: ' + name + } + return elem; + } + + function makeColor(index) { + // Rotate hue around a circle. Multiple by phi to spread things + // out better. Use 50% saturation to make subdued colors, and + // 80% lightness to have good contrast with black foreground text. + const PHI = 1.618033988; + const hue = (index+1) * PHI * 2 * Math.PI; // +1 to avoid 0 + const hsl = `hsl(${hue}rad 50% 80%)`; + return hsl; + } +} + +// pprofUnitText returns a formatted string to display for value in the specified unit. +function pprofUnitText(value, unit) { + const sign = (value < 0) ? "-" : ""; + let v = Math.abs(value); + // Rescale to appropriate display unit. + let list = null; + for (const def of pprofUnitDefs) { + if (def.DefaultUnit.CanonicalName == unit) { + list = def.Units; + v *= def.DefaultUnit.Factor; + break; + } + } + if (list) { + // Stop just before entry that is too large. + for (let i = 0; i < list.length; i++) { + if (i == list.length-1 || list[i+1].Factor > v) { + v /= list[i].Factor; + unit = list[i].CanonicalName; + break; + } + } + } + return sign + Number(v.toFixed(2)) + unit; +} diff --git a/plugin/debug/pkg/internal/driver/html/top.html b/plugin/debug/pkg/internal/driver/html/top.html new file mode 100644 index 00000000..86d9fcbd --- /dev/null +++ b/plugin/debug/pkg/internal/driver/html/top.html @@ -0,0 +1,114 @@ + + + + + {{.Title}} + {{template "css" .}} + + + + {{template "header" .}} +
+ + + + + + + + + + + + + +
FlatFlat%Sum%CumCum%NameInlined?
+
+ {{template "script" .}} + + + diff --git a/plugin/debug/pkg/internal/driver/interactive.go b/plugin/debug/pkg/internal/driver/interactive.go new file mode 100644 index 00000000..e8f3b7b7 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/interactive.go @@ -0,0 +1,422 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "fmt" + "io" + "regexp" + "sort" + "strconv" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/report" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +var commentStart = "//:" // Sentinel for comments on options +var tailDigitsRE = regexp.MustCompile("[0-9]+$") + +// interactive starts a shell to read pprof commands. +func interactive(p *profile.Profile, o *plugin.Options) error { + // Enter command processing loop. + o.UI.SetAutoComplete(newCompleter(functionNames(p))) + configure("compact_labels", "true") + configHelp["sample_index"] += fmt.Sprintf("Or use sample_index=name, with name in %v.\n", sampleTypes(p)) + + // Do not wait for the visualizer to complete, to allow multiple + // graphs to be visualized simultaneously. + interactiveMode = true + shortcuts := profileShortcuts(p) + + copier := makeProfileCopier(p) + greetings(p, o.UI) + for { + input, err := o.UI.ReadLine("(pprof) ") + if err != nil { + if err != io.EOF { + return err + } + if input == "" { + return nil + } + } + + for _, input := range shortcuts.expand(input) { + // Process assignments of the form variable=value + if s := strings.SplitN(input, "=", 2); len(s) > 0 { + name := strings.TrimSpace(s[0]) + var value string + if len(s) == 2 { + value = s[1] + if comment := strings.LastIndex(value, commentStart); comment != -1 { + value = value[:comment] + } + value = strings.TrimSpace(value) + } + if isConfigurable(name) { + // All non-bool options require inputs + if len(s) == 1 && !isBoolConfig(name) { + o.UI.PrintErr(fmt.Errorf("please specify a value, e.g. %s=", name)) + continue + } + if name == "sample_index" { + // Error check sample_index=xxx to ensure xxx is a valid sample type. + index, err := p.SampleIndexByName(value) + if err != nil { + o.UI.PrintErr(err) + continue + } + if index < 0 || index >= len(p.SampleType) { + o.UI.PrintErr(fmt.Errorf("invalid sample_index %q", value)) + continue + } + value = p.SampleType[index].Type + } + if err := configure(name, value); err != nil { + o.UI.PrintErr(err) + } + continue + } + } + + tokens := strings.Fields(input) + if len(tokens) == 0 { + continue + } + + switch tokens[0] { + case "o", "options": + printCurrentOptions(p, o.UI) + continue + case "exit", "quit", "q": + return nil + case "help": + commandHelp(strings.Join(tokens[1:], " "), o.UI) + continue + } + + args, cfg, err := parseCommandLine(tokens) + if err == nil { + err = generateReportWrapper(copier.newCopy(), args, cfg, o) + } + + if err != nil { + o.UI.PrintErr(err) + } + } + } +} + +var generateReportWrapper = generateReport // For testing purposes. + +// greetings prints a brief welcome and some overall profile +// information before accepting interactive commands. +func greetings(p *profile.Profile, ui plugin.UI) { + numLabelUnits := identifyNumLabelUnits(p, ui) + ropt, err := reportOptions(p, numLabelUnits, currentConfig()) + if err == nil { + rpt := report.New(p, ropt) + ui.Print(strings.Join(report.ProfileLabels(rpt), "\n")) + if rpt.Total() == 0 && len(p.SampleType) > 1 { + ui.Print(`No samples were found with the default sample value type.`) + ui.Print(`Try "sample_index" command to analyze different sample values.`, "\n") + } + } + ui.Print(`Entering interactive mode (type "help" for commands, "o" for options)`) +} + +// shortcuts represents composite commands that expand into a sequence +// of other commands. +type shortcuts map[string][]string + +func (a shortcuts) expand(input string) []string { + input = strings.TrimSpace(input) + if a != nil { + if r, ok := a[input]; ok { + return r + } + } + return []string{input} +} + +var pprofShortcuts = shortcuts{ + ":": []string{"focus=", "ignore=", "hide=", "tagfocus=", "tagignore="}, +} + +// profileShortcuts creates macros for convenience and backward compatibility. +func profileShortcuts(p *profile.Profile) shortcuts { + s := pprofShortcuts + // Add shortcuts for sample types + for _, st := range p.SampleType { + command := fmt.Sprintf("sample_index=%s", st.Type) + s[st.Type] = []string{command} + s["total_"+st.Type] = []string{"mean=0", command} + s["mean_"+st.Type] = []string{"mean=1", command} + } + return s +} + +func sampleTypes(p *profile.Profile) []string { + types := make([]string, len(p.SampleType)) + for i, t := range p.SampleType { + types[i] = t.Type + } + return types +} + +func printCurrentOptions(p *profile.Profile, ui plugin.UI) { + var args []string + current := currentConfig() + for _, f := range configFields { + n := f.name + v := current.get(f) + comment := "" + switch { + case len(f.choices) > 0: + values := append([]string{}, f.choices...) + sort.Strings(values) + comment = "[" + strings.Join(values, " | ") + "]" + case n == "sample_index": + st := sampleTypes(p) + if v == "" { + // Apply default (last sample index). + v = st[len(st)-1] + } + // Add comments for all sample types in profile. + comment = "[" + strings.Join(st, " | ") + "]" + case n == "source_path": + continue + case n == "nodecount" && v == "-1": + comment = "default" + case v == "": + // Add quotes for empty values. + v = `""` + } + if n == "granularity" && v == "" { + v = "(default)" + } + if comment != "" { + comment = commentStart + " " + comment + } + args = append(args, fmt.Sprintf(" %-25s = %-20s %s", n, v, comment)) + } + sort.Strings(args) + ui.Print(strings.Join(args, "\n")) +} + +// parseCommandLine parses a command and returns the pprof command to +// execute and the configuration to use for the report. +func parseCommandLine(input []string) ([]string, config, error) { + cmd, args := input[:1], input[1:] + name := cmd[0] + + c := pprofCommands[name] + if c == nil { + // Attempt splitting digits on abbreviated commands (eg top10) + if d := tailDigitsRE.FindString(name); d != "" && d != name { + name = name[:len(name)-len(d)] + cmd[0], args = name, append([]string{d}, args...) + c = pprofCommands[name] + } + } + if c == nil { + if _, ok := configHelp[name]; ok { + value := "" + if len(args) > 0 { + value = args[0] + } + return nil, config{}, fmt.Errorf("did you mean: %s=%s", name, value) + } + return nil, config{}, fmt.Errorf("unrecognized command: %q", name) + } + + if c.hasParam { + if len(args) == 0 { + return nil, config{}, fmt.Errorf("command %s requires an argument", name) + } + cmd = append(cmd, args[0]) + args = args[1:] + } + + // Copy config since options set in the command line should not persist. + vcopy := currentConfig() + + var focus, ignore string + for i := 0; i < len(args); i++ { + t := args[i] + if n, err := strconv.ParseInt(t, 10, 32); err == nil { + vcopy.NodeCount = int(n) + continue + } + switch t[0] { + case '>': + outputFile := t[1:] + if outputFile == "" { + i++ + if i >= len(args) { + return nil, config{}, fmt.Errorf("unexpected end of line after >") + } + outputFile = args[i] + } + vcopy.Output = outputFile + case '-': + if t == "--cum" || t == "-cum" { + vcopy.Sort = "cum" + continue + } + ignore = catRegex(ignore, t[1:]) + default: + focus = catRegex(focus, t) + } + } + + if name == "tags" { + if focus != "" { + vcopy.TagFocus = focus + } + if ignore != "" { + vcopy.TagIgnore = ignore + } + } else { + if focus != "" { + vcopy.Focus = focus + } + if ignore != "" { + vcopy.Ignore = ignore + } + } + if vcopy.NodeCount == -1 && (name == "text" || name == "top") { + vcopy.NodeCount = 10 + } + + return cmd, vcopy, nil +} + +func catRegex(a, b string) string { + if a != "" && b != "" { + return a + "|" + b + } + return a + b +} + +// commandHelp displays help and usage information for all Commands +// and Variables or a specific Command or Variable. +func commandHelp(args string, ui plugin.UI) { + if args == "" { + help := usage(false) + help = help + ` + : Clear focus/ignore/hide/tagfocus/tagignore + + type "help " for more information +` + + ui.Print(help) + return + } + + if c := pprofCommands[args]; c != nil { + ui.Print(c.help(args)) + return + } + + if help, ok := configHelp[args]; ok { + ui.Print(help + "\n") + return + } + + ui.PrintErr("Unknown command: " + args) +} + +// newCompleter creates an autocompletion function for a set of commands. +func newCompleter(fns []string) func(string) string { + return func(line string) string { + switch tokens := strings.Fields(line); len(tokens) { + case 0: + // Nothing to complete + case 1: + // Single token -- complete command name + if match := matchVariableOrCommand(tokens[0]); match != "" { + return match + } + case 2: + if tokens[0] == "help" { + if match := matchVariableOrCommand(tokens[1]); match != "" { + return tokens[0] + " " + match + } + return line + } + fallthrough + default: + // Multiple tokens -- complete using functions, except for tags + if cmd := pprofCommands[tokens[0]]; cmd != nil && tokens[0] != "tags" { + lastTokenIdx := len(tokens) - 1 + lastToken := tokens[lastTokenIdx] + if strings.HasPrefix(lastToken, "-") { + lastToken = "-" + functionCompleter(lastToken[1:], fns) + } else { + lastToken = functionCompleter(lastToken, fns) + } + return strings.Join(append(tokens[:lastTokenIdx], lastToken), " ") + } + } + return line + } +} + +// matchVariableOrCommand attempts to match a string token to the prefix of a Command. +func matchVariableOrCommand(token string) string { + token = strings.ToLower(token) + var matches []string + for cmd := range pprofCommands { + if strings.HasPrefix(cmd, token) { + matches = append(matches, cmd) + } + } + matches = append(matches, completeConfig(token)...) + if len(matches) == 1 { + return matches[0] + } + return "" +} + +// functionCompleter replaces provided substring with a function +// name retrieved from a profile if a single match exists. Otherwise, +// it returns unchanged substring. It defaults to no-op if the profile +// is not specified. +func functionCompleter(substring string, fns []string) string { + found := "" + for _, fName := range fns { + if strings.Contains(fName, substring) { + if found != "" { + return substring + } + found = fName + } + } + if found != "" { + return found + } + return substring +} + +func functionNames(p *profile.Profile) []string { + var fns []string + for _, fn := range p.Function { + fns = append(fns, fn.Name) + } + return fns +} diff --git a/plugin/debug/pkg/internal/driver/interactive_test.go b/plugin/debug/pkg/internal/driver/interactive_test.go new file mode 100644 index 00000000..97ae709c --- /dev/null +++ b/plugin/debug/pkg/internal/driver/interactive_test.go @@ -0,0 +1,270 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "fmt" + "math/rand" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/internal/report" + "m7s.live/v5/plugin/debug/pkg/internal/transport" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func TestShell(t *testing.T) { + p := &profile.Profile{} + generateReportWrapper = checkValue + defer func() { generateReportWrapper = generateReport }() + + // Use test commands and variables to exercise interactive processing + var savedCommands commands + savedCommands, pprofCommands = pprofCommands, testCommands + defer func() { pprofCommands = savedCommands }() + + savedConfig := currentConfig() + defer setCurrentConfig(savedConfig) + + shortcuts1, scScript1 := makeShortcuts(interleave(script, 2), 1) + shortcuts2, scScript2 := makeShortcuts(interleave(script, 1), 2) + + var testcases = []struct { + name string + input []string + shortcuts shortcuts + allowRx string + numAllowRxMatches int + propagateError bool + }{ + {"Random interleave of independent scripts 1", interleave(script, 0), pprofShortcuts, "", 0, false}, + {"Random interleave of independent scripts 2", interleave(script, 1), pprofShortcuts, "", 0, false}, + {"Random interleave of independent scripts with shortcuts 1", scScript1, shortcuts1, "", 0, false}, + {"Random interleave of independent scripts with shortcuts 2", scScript2, shortcuts2, "", 0, false}, + {"Group with invalid value", []string{"sort=this"}, pprofShortcuts, `invalid "sort" value`, 1, false}, + {"No special value provided for the option", []string{"sample_index"}, pprofShortcuts, `please specify a value, e.g. sample_index=`, 1, false}, + {"No string value provided for the option", []string{"focus"}, pprofShortcuts, `please specify a value, e.g. focus=`, 1, false}, + {"No float value provided for the option", []string{"divide_by"}, pprofShortcuts, `please specify a value, e.g. divide_by=`, 1, false}, + {"Helpful input format reminder", []string{"sample_index 0"}, pprofShortcuts, `did you mean: sample_index=0`, 1, false}, + {"Verify propagation of IO errors", []string{"**error**"}, pprofShortcuts, "", 0, true}, + } + + o := setDefaults(&plugin.Options{HTTPTransport: transport.New(nil)}) + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + setCurrentConfig(savedConfig) + pprofShortcuts = tc.shortcuts + ui := &proftest.TestUI{ + T: t, + Input: tc.input, + AllowRx: tc.allowRx, + } + o.UI = ui + + err := interactive(p, o) + if (tc.propagateError && err == nil) || (!tc.propagateError && err != nil) { + t.Errorf("%s: %v", tc.name, err) + } + + // Confirm error message written out once. + if tc.numAllowRxMatches != ui.NumAllowRxMatches { + t.Errorf("want error message to be printed %d time(s), got %d", + tc.numAllowRxMatches, ui.NumAllowRxMatches) + } + }) + } +} + +var testCommands = commands{ + "check": &command{report.Raw, nil, nil, true, "", ""}, +} + +// script contains sequences of commands to be executed for testing. Commands +// are split by semicolon and interleaved randomly, so they must be +// independent from each other. +var script = []string{ + "call_tree=true;call_tree=false;check call_tree=false;call_tree=yes;check call_tree=true", + "mean=1;check mean=true;mean=n;check mean=false", + "nodecount=-1;nodecount=-2;check nodecount=-2;nodecount=999999;check nodecount=999999", + "nodefraction=-1;nodefraction=-2.5;check nodefraction=-2.5;nodefraction=0.0001;check nodefraction=0.0001", + "focus=one;focus=two;check focus=two", + "flat=true;check sort=flat;cum=1;check sort=cum", +} + +func makeShortcuts(input []string, seed int64) (shortcuts, []string) { + rand := rand.New(rand.NewSource(seed)) + + s := shortcuts{} + var output, chunk []string + for _, l := range input { + chunk = append(chunk, l) + switch rand.Intn(3) { + case 0: + // Create a macro for commands in 'chunk'. + macro := fmt.Sprintf("alias%d", len(s)) + s[macro] = chunk + output = append(output, macro) + chunk = nil + case 1: + // Append commands in 'chunk' by themselves. + output = append(output, chunk...) + chunk = nil + case 2: + // Accumulate commands into 'chunk' + } + } + output = append(output, chunk...) + return s, output +} + +func checkValue(p *profile.Profile, cmd []string, cfg config, o *plugin.Options) error { + if len(cmd) != 2 { + return fmt.Errorf("expected len(cmd)==2, got %v", cmd) + } + + input := cmd[1] + args := strings.SplitN(input, "=", 2) + if len(args) == 0 { + return fmt.Errorf("unexpected empty input") + } + name, value := args[0], "" + if len(args) == 2 { + value = args[1] + } + + f, ok := configFieldMap[name] + if !ok { + return fmt.Errorf("Could not find variable named %s", name) + } + + if got := cfg.get(f); got != value { + return fmt.Errorf("Variable %s, want %s, got %s", name, value, got) + } + return nil +} + +func interleave(input []string, seed int64) []string { + var inputs [][]string + for _, s := range input { + inputs = append(inputs, strings.Split(s, ";")) + } + rand := rand.New(rand.NewSource(seed)) + var output []string + for len(inputs) > 0 { + next := rand.Intn(len(inputs)) + output = append(output, inputs[next][0]) + if tail := inputs[next][1:]; len(tail) > 0 { + inputs[next] = tail + } else { + inputs = append(inputs[:next], inputs[next+1:]...) + } + } + return output +} + +func TestInteractiveCommands(t *testing.T) { + type interactiveTestcase struct { + input string + want map[string]string + } + + testcases := []interactiveTestcase{ + { + "top 10 --cum focus1 -ignore focus2", + map[string]string{ + "nodecount": "10", + "sort": "cum", + "focus": "focus1|focus2", + "ignore": "ignore", + }, + }, + { + "top10 --cum focus1 -ignore focus2", + map[string]string{ + "nodecount": "10", + "sort": "cum", + "focus": "focus1|focus2", + "ignore": "ignore", + }, + }, + { + "dot", + map[string]string{ + "nodecount": "80", + "sort": "flat", + }, + }, + { + "tags -ignore1 -ignore2 focus1 >out", + map[string]string{ + "nodecount": "80", + "sort": "flat", + "output": "out", + "tagfocus": "focus1", + "tagignore": "ignore1|ignore2", + }, + }, + { + "weblist find -test", + map[string]string{ + "granularity": "addresses", + "noinlines": "false", + "nodecount": "0", + "sort": "flat", + "ignore": "test", + }, + }, + { + "callgrind fun -ignore >out", + map[string]string{ + "granularity": "addresses", + "nodecount": "0", + "sort": "flat", + "output": "out", + }, + }, + { + "999", + nil, // Error + }, + } + + for _, tc := range testcases { + cmd, cfg, err := parseCommandLine(strings.Fields(tc.input)) + if tc.want == nil && err != nil { + // Error expected + continue + } + if err != nil { + t.Errorf("failed on %q: %v", tc.input, err) + continue + } + + // Get report output format + c := pprofCommands[cmd[0]] + if c == nil { + t.Fatalf("unexpected nil command") + } + cfg = applyCommandOverrides(cmd[0], c.format, cfg) + + for n, want := range tc.want { + if got := cfg.get(configFieldMap[n]); got != want { + t.Errorf("failed on %q, cmd=%q, %s got %s, want %s", tc.input, cmd, n, got, want) + } + } + } +} diff --git a/plugin/debug/pkg/internal/driver/options.go b/plugin/debug/pkg/internal/driver/options.go new file mode 100644 index 00000000..f84d0fe7 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/options.go @@ -0,0 +1,100 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "bufio" + "fmt" + "io" + "os" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/binutils" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/symbolizer" + "m7s.live/v5/plugin/debug/pkg/internal/transport" +) + +// setDefaults returns a new plugin.Options with zero fields sets to +// sensible defaults. +func setDefaults(o *plugin.Options) *plugin.Options { + d := &plugin.Options{} + if o != nil { + *d = *o + } + if d.Writer == nil { + d.Writer = oswriter{} + } + if d.Flagset == nil { + d.Flagset = &GoFlags{} + } + if d.Obj == nil { + d.Obj = &binutils.Binutils{} + } + if d.UI == nil { + d.UI = &stdUI{r: bufio.NewReader(os.Stdin)} + } + if d.HTTPTransport == nil { + d.HTTPTransport = transport.New(d.Flagset) + } + if d.Sym == nil { + d.Sym = &symbolizer.Symbolizer{Obj: d.Obj, UI: d.UI, Transport: d.HTTPTransport} + } + return d +} + +type stdUI struct { + r *bufio.Reader +} + +func (ui *stdUI) ReadLine(prompt string) (string, error) { + os.Stdout.WriteString(prompt) + return ui.r.ReadString('\n') +} + +func (ui *stdUI) Print(args ...interface{}) { + ui.fprint(os.Stderr, args) +} + +func (ui *stdUI) PrintErr(args ...interface{}) { + ui.fprint(os.Stderr, args) +} + +func (ui *stdUI) IsTerminal() bool { + return false +} + +func (ui *stdUI) WantBrowser() bool { + return true +} + +func (ui *stdUI) SetAutoComplete(func(string) string) { +} + +func (ui *stdUI) fprint(f *os.File, args []interface{}) { + text := fmt.Sprint(args...) + if !strings.HasSuffix(text, "\n") { + text += "\n" + } + f.WriteString(text) +} + +// oswriter implements the Writer interface using a regular file. +type oswriter struct{} + +func (oswriter) Open(name string) (io.WriteCloser, error) { + f, err := os.Create(name) + return f, err +} diff --git a/plugin/debug/pkg/internal/driver/settings.go b/plugin/debug/pkg/internal/driver/settings.go new file mode 100644 index 00000000..5011a066 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/settings.go @@ -0,0 +1,158 @@ +package driver + +import ( + "encoding/json" + "fmt" + "net/url" + "os" + "path/filepath" +) + +// settings holds pprof settings. +type settings struct { + // Configs holds a list of named UI configurations. + Configs []namedConfig `json:"configs"` +} + +// namedConfig associates a name with a config. +type namedConfig struct { + Name string `json:"name"` + config +} + +// settingsFileName returns the name of the file where settings should be saved. +func settingsFileName() (string, error) { + // Return "pprof/settings.json" under os.UserConfigDir(). + dir, err := os.UserConfigDir() + if err != nil { + return "", err + } + return filepath.Join(dir, "pprof", "settings.json"), nil +} + +// readSettings reads settings from fname. +func readSettings(fname string) (*settings, error) { + data, err := os.ReadFile(fname) + if err != nil { + if os.IsNotExist(err) { + return &settings{}, nil + } + return nil, fmt.Errorf("could not read settings: %w", err) + } + settings := &settings{} + if err := json.Unmarshal(data, settings); err != nil { + return nil, fmt.Errorf("could not parse settings: %w", err) + } + for i := range settings.Configs { + settings.Configs[i].resetTransient() + } + return settings, nil +} + +// writeSettings saves settings to fname. +func writeSettings(fname string, settings *settings) error { + data, err := json.MarshalIndent(settings, "", " ") + if err != nil { + return fmt.Errorf("could not encode settings: %w", err) + } + + // create the settings directory if it does not exist + // XDG specifies permissions 0700 when creating settings dirs: + // https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + if err := os.MkdirAll(filepath.Dir(fname), 0700); err != nil { + return fmt.Errorf("failed to create settings directory: %w", err) + } + + if err := os.WriteFile(fname, data, 0644); err != nil { + return fmt.Errorf("failed to write settings: %w", err) + } + return nil +} + +// configMenuEntry holds information for a single config menu entry. +type configMenuEntry struct { + Name string + URL string + Current bool // Is this the currently selected config? + UserConfig bool // Is this a user-provided config? +} + +// configMenu returns a list of items to add to a menu in the web UI. +func configMenu(fname string, u url.URL) []configMenuEntry { + // Start with system configs. + configs := []namedConfig{{Name: "Default", config: defaultConfig()}} + if settings, err := readSettings(fname); err == nil { + // Add user configs. + configs = append(configs, settings.Configs...) + } + + // Convert to menu entries. + result := make([]configMenuEntry, len(configs)) + lastMatch := -1 + for i, cfg := range configs { + dst, changed := cfg.config.makeURL(u) + if !changed { + lastMatch = i + } + // Use a relative URL to work in presence of stripping/redirects in webui.go. + rel := &url.URL{RawQuery: dst.RawQuery, ForceQuery: true} + result[i] = configMenuEntry{ + Name: cfg.Name, + URL: rel.String(), + UserConfig: (i != 0), + } + } + // Mark the last matching config as current + if lastMatch >= 0 { + result[lastMatch].Current = true + } + return result +} + +// editSettings edits settings by applying fn to them. +func editSettings(fname string, fn func(s *settings) error) error { + settings, err := readSettings(fname) + if err != nil { + return err + } + if err := fn(settings); err != nil { + return err + } + return writeSettings(fname, settings) +} + +// setConfig saves the config specified in request to fname. +func setConfig(fname string, request url.URL) error { + q := request.Query() + name := q.Get("config") + if name == "" { + return fmt.Errorf("invalid config name") + } + cfg := currentConfig() + if err := cfg.applyURL(q); err != nil { + return err + } + return editSettings(fname, func(s *settings) error { + for i, c := range s.Configs { + if c.Name == name { + s.Configs[i].config = cfg + return nil + } + } + s.Configs = append(s.Configs, namedConfig{Name: name, config: cfg}) + return nil + }) +} + +// removeConfig removes config from fname. +func removeConfig(fname, config string) error { + return editSettings(fname, func(s *settings) error { + for i, c := range s.Configs { + if c.Name == config { + s.Configs = append(s.Configs[:i], s.Configs[i+1:]...) + return nil + } + } + return fmt.Errorf("config %s not found", config) + }) +} diff --git a/plugin/debug/pkg/internal/driver/settings_test.go b/plugin/debug/pkg/internal/driver/settings_test.go new file mode 100644 index 00000000..07bf6acb --- /dev/null +++ b/plugin/debug/pkg/internal/driver/settings_test.go @@ -0,0 +1,247 @@ +package driver + +import ( + "net/url" + "os" + "path/filepath" + "reflect" + "testing" +) + +// settingsDirAndFile returns a directory in which settings should be stored +// and the name of the settings file. The caller must delete the directory when +// done. +func settingsDirAndFile(t *testing.T) (string, string) { + tmpDir, err := os.MkdirTemp("", "pprof_settings_test") + if err != nil { + t.Fatalf("error creating temporary directory: %v", err) + } + return tmpDir, filepath.Join(tmpDir, "settings.json") +} + +func TestSettings(t *testing.T) { + tmpDir, fname := settingsDirAndFile(t) + defer os.RemoveAll(tmpDir) + s, err := readSettings(fname) + if err != nil { + t.Fatalf("error reading empty settings: %v", err) + } + if len(s.Configs) != 0 { + t.Fatalf("expected empty settings; got %v", s) + } + s.Configs = append(s.Configs, namedConfig{ + Name: "Foo", + config: config{ + Focus: "focus", + // Ensure that transient fields are not saved/restored. + Output: "output", + SourcePath: "source", + TrimPath: "trim", + DivideBy: -2, + }, + }) + if err := writeSettings(fname, s); err != nil { + t.Fatal(err) + } + s2, err := readSettings(fname) + if err != nil { + t.Fatal(err) + } + + // Change the transient fields to their expected values. + s.Configs[0].resetTransient() + if !reflect.DeepEqual(s, s2) { + t.Fatalf("ReadSettings = %v; expected %v", s2, s) + } +} + +func TestParseConfig(t *testing.T) { + // Use all the fields to check they are saved/restored from URL. + cfg := config{ + Output: "", + DropNegative: true, + CallTree: true, + RelativePercentages: true, + Unit: "auto", + CompactLabels: true, + SourcePath: "", + TrimPath: "", + NodeCount: 10, + NodeFraction: 0.1, + EdgeFraction: 0.2, + Trim: true, + Focus: "focus", + Ignore: "ignore", + PruneFrom: "prune_from", + Hide: "hide", + Show: "show", + ShowFrom: "show_from", + TagFocus: "tagfocus", + TagIgnore: "tagignore", + TagShow: "tagshow", + TagHide: "taghide", + DivideBy: 1, + Mean: true, + Normalize: true, + Sort: "cum", + Granularity: "functions", + NoInlines: true, + ShowColumns: true, + } + url, changed := cfg.makeURL(url.URL{}) + if !changed { + t.Error("applyConfig returned changed=false after applying non-empty config") + } + cfg2 := defaultConfig() + if err := cfg2.applyURL(url.Query()); err != nil { + t.Fatalf("fromURL failed: %v", err) + } + if !reflect.DeepEqual(cfg, cfg2) { + t.Fatalf("parsed config = %+v; expected match with %+v", cfg2, cfg) + } + if url2, changed := cfg.makeURL(url); changed { + t.Errorf("ApplyConfig returned changed=true after applying same config (%q instead of expected %q", url2.String(), url.String()) + } +} + +// TestDefaultConfig verifies that default config values are omitted from URL. +func TestDefaultConfig(t *testing.T) { + cfg := defaultConfig() + url, changed := cfg.makeURL(url.URL{}) + if changed { + t.Error("applyConfig returned changed=true after applying default config") + } + if url.String() != "" { + t.Errorf("applyConfig returned %q; expecting %q", url.String(), "") + } +} + +func TestConfigMenu(t *testing.T) { + // Save some test settings. + tmpDir, fname := settingsDirAndFile(t) + defer os.RemoveAll(tmpDir) + a, b := defaultConfig(), defaultConfig() + a.Focus, b.Focus = "foo", "bar" + s := &settings{ + Configs: []namedConfig{ + {Name: "A", config: a}, + {Name: "B", config: b}, + }, + } + if err := writeSettings(fname, s); err != nil { + t.Fatal("error writing settings", err) + } + + pageURL, _ := url.Parse("/top?f=foo") + menu := configMenu(fname, *pageURL) + want := []configMenuEntry{ + {Name: "Default", URL: "?", Current: false, UserConfig: false}, + {Name: "A", URL: "?f=foo", Current: true, UserConfig: true}, + {Name: "B", URL: "?f=bar", Current: false, UserConfig: true}, + } + if !reflect.DeepEqual(menu, want) { + t.Errorf("ConfigMenu returned %v; want %v", menu, want) + } +} + +func TestEditConfig(t *testing.T) { + tmpDir, fname := settingsDirAndFile(t) + defer os.RemoveAll(tmpDir) + + type testConfig struct { + name string + focus string + hide string + } + type testCase struct { + remove bool + request string + expect []testConfig + } + for _, c := range []testCase{ + // Create setting c1 + {false, "/?config=c1&f=foo", []testConfig{ + {"c1", "foo", ""}, + }}, + // Create setting c2 + {false, "/?config=c2&h=bar", []testConfig{ + {"c1", "foo", ""}, + {"c2", "", "bar"}, + }}, + // Overwrite c1 + {false, "/?config=c1&f=baz", []testConfig{ + {"c1", "baz", ""}, + {"c2", "", "bar"}, + }}, + // Delete c2 + {true, "c2", []testConfig{ + {"c1", "baz", ""}, + }}, + } { + if c.remove { + if err := removeConfig(fname, c.request); err != nil { + t.Errorf("error removing config %s: %v", c.request, err) + continue + } + } else { + req, err := url.Parse(c.request) + if err != nil { + t.Errorf("error parsing request %q: %v", c.request, err) + continue + } + if err := setConfig(fname, *req); err != nil { + t.Errorf("error saving request %q: %v", c.request, err) + continue + } + } + + // Check resulting settings. + s, err := readSettings(fname) + if err != nil { + t.Errorf("error reading settings after applying %q: %v", c.request, err) + continue + } + // Convert to a list that can be compared to c.expect + got := make([]testConfig, len(s.Configs)) + for i, c := range s.Configs { + got[i] = testConfig{c.Name, c.Focus, c.Hide} + } + if !reflect.DeepEqual(got, c.expect) { + t.Errorf("Settings after applying %q = %v; want %v", c.request, got, c.expect) + } + } +} + +func TestAssign(t *testing.T) { + baseConfig := currentConfig() + defer setCurrentConfig(baseConfig) + + // Test assigning to a simple field. + if err := configure("nodecount", "20"); err != nil { + t.Errorf("error setting nodecount: %v", err) + } + if n := currentConfig().NodeCount; n != 20 { + t.Errorf("incorrect nodecount; expecting 20, got %d", n) + } + + // Test assignment to a group field. + if err := configure("granularity", "files"); err != nil { + t.Errorf("error setting granularity: %v", err) + } + if g := currentConfig().Granularity; g != "files" { + t.Errorf("incorrect granularity; expecting %v, got %v", "files", g) + } + + // Test assignment to one choice of a group field. + if err := configure("lines", "t"); err != nil { + t.Errorf("error setting lines: %v", err) + } + if g := currentConfig().Granularity; g != "lines" { + t.Errorf("incorrect granularity; expecting %v, got %v", "lines", g) + } + + // Test assignment to invalid choice, + if err := configure("granularity", "cheese"); err == nil { + t.Errorf("allowed assignment of invalid granularity") + } +} diff --git a/plugin/debug/pkg/internal/driver/stacks.go b/plugin/debug/pkg/internal/driver/stacks.go new file mode 100644 index 00000000..5a7e5904 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/stacks.go @@ -0,0 +1,60 @@ +// Copyright 2022 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "encoding/json" + "html/template" + "net/http" + + "m7s.live/v5/plugin/debug/pkg/internal/measurement" +) + +// stackView generates the flamegraph view. +func (ui *webInterface) stackView(w http.ResponseWriter, req *http.Request) { + // Get all data in a report. + rpt, errList := ui.makeReport(w, req, []string{"svg"}, func(cfg *config) { + cfg.CallTree = true + cfg.Trim = false + if cfg.Granularity == "" { + cfg.Granularity = "filefunctions" + } + }) + if rpt == nil { + return // error already reported + } + + // Make stack data and generate corresponding JSON. + stacks := rpt.Stacks() + b, err := json.Marshal(stacks) + if err != nil { + http.Error(w, "error serializing stacks for flame graph", + http.StatusInternalServerError) + ui.options.UI.PrintErr(err) + return + } + + nodes := make([]string, len(stacks.Sources)) + for i, src := range stacks.Sources { + nodes[i] = src.FullName + } + nodes[0] = "" // root is not a real node + + ui.render(w, req, "stacks", rpt, errList, stacks.Legend(), webArgs{ + Stacks: template.JS(b), + Nodes: nodes, + UnitDefs: measurement.UnitTypes, + }) +} diff --git a/plugin/debug/pkg/internal/driver/svg.go b/plugin/debug/pkg/internal/driver/svg.go new file mode 100644 index 00000000..cca554ce --- /dev/null +++ b/plugin/debug/pkg/internal/driver/svg.go @@ -0,0 +1,80 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "regexp" + "strings" + + "m7s.live/v5/plugin/debug/pkg/third_party/svgpan" +) + +var ( + viewBox = regexp.MustCompile(``) +) + +// massageSVG enhances the SVG output from DOT to provide better +// panning inside a web browser. It uses the svgpan library, which is +// embedded into the svgpan.JSSource variable. +func massageSVG(svg string) string { + // Work around for dot bug which misses quoting some ampersands, + // resulting on unparsable SVG. + svg = strings.Replace(svg, "&;", "&;", -1) + + // Dot's SVG output is + // + // + // + // ... + // + // + // + // Change it to + // + // + + // ` + // + // + // ... + // + // + // + + if loc := viewBox.FindStringIndex(svg); loc != nil { + svg = svg[:loc[0]] + + `` + svgpan.JSSource + `` + + `` + + svg[loc[0]:] + } + + if loc := svgClose.FindStringIndex(svg); loc != nil { + svg = svg[:loc[0]] + + `` + + svg[loc[0]:] + } + + return svg +} diff --git a/plugin/debug/pkg/internal/driver/tagroot.go b/plugin/debug/pkg/internal/driver/tagroot.go new file mode 100644 index 00000000..ad142300 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/tagroot.go @@ -0,0 +1,133 @@ +package driver + +import ( + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// addLabelNodes adds pseudo stack frames "label:value" to each Sample with +// labels matching the supplied keys. +// +// rootKeys adds frames at the root of the callgraph (first key becomes new root). +// leafKeys adds frames at the leaf of the callgraph (last key becomes new leaf). +// +// Returns whether there were matches found for the label keys. +func addLabelNodes(p *profile.Profile, rootKeys, leafKeys []string, outputUnit string) (rootm, leafm bool) { + // Find where to insert the new locations and functions at the end of + // their ID spaces. + var maxLocID uint64 + var maxFunctionID uint64 + for _, loc := range p.Location { + if loc.ID > maxLocID { + maxLocID = loc.ID + } + } + for _, f := range p.Function { + if f.ID > maxFunctionID { + maxFunctionID = f.ID + } + } + nextLocID := maxLocID + 1 + nextFuncID := maxFunctionID + 1 + + // Intern the new locations and functions we are generating. + type locKey struct { + functionName, fileName string + } + locs := map[locKey]*profile.Location{} + + internLoc := func(locKey locKey) *profile.Location { + loc, found := locs[locKey] + if found { + return loc + } + + function := &profile.Function{ + ID: nextFuncID, + Name: locKey.functionName, + Filename: locKey.fileName, + } + nextFuncID++ + p.Function = append(p.Function, function) + + loc = &profile.Location{ + ID: nextLocID, + Line: []profile.Line{ + { + Function: function, + }, + }, + } + nextLocID++ + p.Location = append(p.Location, loc) + locs[locKey] = loc + return loc + } + + makeLabelLocs := func(s *profile.Sample, keys []string) ([]*profile.Location, bool) { + var locs []*profile.Location + var match bool + for i := range keys { + // Loop backwards, ensuring the first tag is closest to the root, + // and the last tag is closest to the leaves. + k := keys[len(keys)-1-i] + values := formatLabelValues(s, k, outputUnit) + if len(values) > 0 { + match = true + } + locKey := locKey{ + functionName: strings.Join(values, ","), + fileName: k, + } + loc := internLoc(locKey) + locs = append(locs, loc) + } + return locs, match + } + + for _, s := range p.Sample { + rootsToAdd, sampleMatchedRoot := makeLabelLocs(s, rootKeys) + if sampleMatchedRoot { + rootm = true + } + leavesToAdd, sampleMatchedLeaf := makeLabelLocs(s, leafKeys) + if sampleMatchedLeaf { + leafm = true + } + + if len(leavesToAdd)+len(rootsToAdd) == 0 { + continue + } + + var newLocs []*profile.Location + newLocs = append(newLocs, leavesToAdd...) + newLocs = append(newLocs, s.Location...) + newLocs = append(newLocs, rootsToAdd...) + s.Location = newLocs + } + return +} + +// formatLabelValues returns all the string and numeric labels in Sample, with +// the numeric labels formatted according to outputUnit. +func formatLabelValues(s *profile.Sample, k string, outputUnit string) []string { + var values []string + values = append(values, s.Label[k]...) + numLabels := s.NumLabel[k] + numUnits := s.NumUnit[k] + if len(numLabels) != len(numUnits) && len(numUnits) != 0 { + return values + } + for i, numLabel := range numLabels { + var value string + if len(numUnits) != 0 { + value = measurement.ScaledLabel(numLabel, numUnits[i], outputUnit) + } else { + value = measurement.ScaledLabel(numLabel, "", "") + } + values = append(values, value) + } + return values +} diff --git a/plugin/debug/pkg/internal/driver/tagroot_test.go b/plugin/debug/pkg/internal/driver/tagroot_test.go new file mode 100644 index 00000000..f01e1957 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/tagroot_test.go @@ -0,0 +1,385 @@ +package driver + +import ( + "fmt" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +const mainBinary = "/bin/main" + +var cpuF = []*profile.Function{ + {ID: 1, Name: "main", SystemName: "main", Filename: "main.c"}, + {ID: 2, Name: "foo", SystemName: "foo", Filename: "foo.c"}, + {ID: 3, Name: "foo_caller", SystemName: "foo_caller", Filename: "foo.c"}, + {ID: 4, Name: "bar", SystemName: "bar", Filename: "bar.c"}, +} + +var cpuM = []*profile.Mapping{ + { + ID: 1, + Start: 0x10000, + Limit: 0x40000, + File: mainBinary, + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + { + ID: 2, + Start: 0x1000, + Limit: 0x4000, + File: "/lib/lib.so", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, +} + +var cpuL = []*profile.Location{ + { + ID: 1000, + Mapping: cpuM[1], + Address: 0x1000, + Line: []profile.Line{ + {Function: cpuF[0], Line: 1}, + }, + }, + { + ID: 2000, + Mapping: cpuM[0], + Address: 0x2000, + Line: []profile.Line{ + {Function: cpuF[1], Line: 2}, + {Function: cpuF[2], Line: 1}, + }, + }, + { + ID: 3000, + Mapping: cpuM[0], + Address: 0x3000, + Line: []profile.Line{ + {Function: cpuF[1], Line: 2}, + {Function: cpuF[2], Line: 1}, + }, + }, + { + ID: 3001, + Mapping: cpuM[0], + Address: 0x3001, + Line: []profile.Line{ + {Function: cpuF[2], Line: 2}, + }, + }, + { + ID: 3002, + Mapping: cpuM[0], + Address: 0x3002, + Line: []profile.Line{ + {Function: cpuF[2], Line: 3}, + }, + }, + { + ID: 3003, + Mapping: cpuM[0], + Address: 0x3003, + Line: []profile.Line{ + {Function: cpuF[3], Line: 1}, + }, + }, +} + +var testProfile1 = &profile.Profile{ + TimeNanos: 10000, + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{cpuL[0]}, + Value: []int64{1000, 1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*profile.Location{cpuL[1], cpuL[0]}, + Value: []int64{100, 100}, + Label: map[string][]string{ + "key1": {"tag2"}, + "key3": {"tag2"}, + }, + }, + { + Location: []*profile.Location{cpuL[2], cpuL[0]}, + Value: []int64{10, 10}, + Label: map[string][]string{ + "key1": {"tag3"}, + "key2": {"tag2"}, + }, + NumLabel: map[string][]int64{ + "allocations": {1024}, + }, + NumUnit: map[string][]string{ + "allocations": {""}, + }, + }, + { + Location: []*profile.Location{cpuL[3], cpuL[0]}, + Value: []int64{10000, 10000}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + NumLabel: map[string][]int64{ + "allocations": {1024, 2048}, + }, + NumUnit: map[string][]string{ + "allocations": {"bytes", "b"}, + }, + }, + { + Location: []*profile.Location{cpuL[4], cpuL[0]}, + Value: []int64{1, 1}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1", "tag5"}, + }, + NumLabel: map[string][]int64{ + "allocations": {1024, 1}, + }, + NumUnit: map[string][]string{ + "allocations": {"byte", "kilobyte"}, + }, + }, + { + Location: []*profile.Location{cpuL[5], cpuL[0]}, + Value: []int64{200, 200}, + NumLabel: map[string][]int64{ + "allocations": {1024}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +func TestAddLabelNodesMatchBooleans(t *testing.T) { + type addLabelNodesTestcase struct { + name string + tagroot, tagleaf []string + outputUnit string + rootm, leafm bool + // wantSampleFuncs contains expected stack functions and sample value after + // adding nodes, in the same order as in the profile. The format is as + // returned by stackCollapse function, which is "callee caller: ". + wantSampleFuncs []string + } + for _, tc := range []addLabelNodesTestcase{ + { + name: "Without tagroot or tagleaf, add no extra nodes, and should not match", + wantSampleFuncs: []string{ + "main(main.c) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c) 10", + "main(main.c);foo_caller(foo.c) 10000", + "main(main.c);foo_caller(foo.c) 1", + "main(main.c);bar(bar.c) 200", + }, + }, + { + name: "Keys that aren't found add empty nodes, and should not match", + tagroot: []string{"key404"}, + tagleaf: []string{"key404"}, + wantSampleFuncs: []string{ + "(key404);main(main.c);(key404) 1000", + "(key404);main(main.c);foo(foo.c);foo_caller(foo.c);(key404) 100", + "(key404);main(main.c);foo(foo.c);foo_caller(foo.c);(key404) 10", + "(key404);main(main.c);foo_caller(foo.c);(key404) 10000", + "(key404);main(main.c);foo_caller(foo.c);(key404) 1", + "(key404);main(main.c);bar(bar.c);(key404) 200", + }, + }, + { + name: "tagroot adds nodes for key1 and reports a match", + tagroot: []string{"key1"}, + rootm: true, + wantSampleFuncs: []string{ + "tag1(key1);main(main.c) 1000", + "tag2(key1);main(main.c);foo(foo.c);foo_caller(foo.c) 100", + "tag3(key1);main(main.c);foo(foo.c);foo_caller(foo.c) 10", + "tag4(key1);main(main.c);foo_caller(foo.c) 10000", + "tag4(key1);main(main.c);foo_caller(foo.c) 1", + "(key1);main(main.c);bar(bar.c) 200", + }, + }, + { + name: "tagroot adds nodes for key2 and reports a match", + tagroot: []string{"key2"}, + rootm: true, + wantSampleFuncs: []string{ + "tag1(key2);main(main.c) 1000", + "(key2);main(main.c);foo(foo.c);foo_caller(foo.c) 100", + "tag2(key2);main(main.c);foo(foo.c);foo_caller(foo.c) 10", + "tag1(key2);main(main.c);foo_caller(foo.c) 10000", + "tag1,tag5(key2);main(main.c);foo_caller(foo.c) 1", + "(key2);main(main.c);bar(bar.c) 200", + }, + }, + { + name: "tagleaf adds nodes for key1 and reports a match", + tagleaf: []string{"key1"}, + leafm: true, + wantSampleFuncs: []string{ + "main(main.c);tag1(key1) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c);tag2(key1) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c);tag3(key1) 10", + "main(main.c);foo_caller(foo.c);tag4(key1) 10000", + "main(main.c);foo_caller(foo.c);tag4(key1) 1", + "main(main.c);bar(bar.c);(key1) 200", + }, + }, + { + name: "tagleaf adds nodes for key3 and reports a match", + tagleaf: []string{"key3"}, + leafm: true, + wantSampleFuncs: []string{ + "main(main.c);(key3) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c);tag2(key3) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c);(key3) 10", + "main(main.c);foo_caller(foo.c);(key3) 10000", + "main(main.c);foo_caller(foo.c);(key3) 1", + "main(main.c);bar(bar.c);(key3) 200", + }, + }, + { + name: "tagroot adds nodes for key1,key2 in order and reports a match", + tagroot: []string{"key1", "key2"}, + rootm: true, + wantSampleFuncs: []string{ + "tag1(key1);tag1(key2);main(main.c) 1000", + "tag2(key1);(key2);main(main.c);foo(foo.c);foo_caller(foo.c) 100", + "tag3(key1);tag2(key2);main(main.c);foo(foo.c);foo_caller(foo.c) 10", + "tag4(key1);tag1(key2);main(main.c);foo_caller(foo.c) 10000", + "tag4(key1);tag1,tag5(key2);main(main.c);foo_caller(foo.c) 1", + "(key1);(key2);main(main.c);bar(bar.c) 200", + }, + }, + { + name: "tagleaf adds nodes for key1,key2 in order and reports a match", + tagleaf: []string{"key1", "key2"}, + leafm: true, + wantSampleFuncs: []string{ + "main(main.c);tag1(key1);tag1(key2) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c);tag2(key1);(key2) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c);tag3(key1);tag2(key2) 10", + "main(main.c);foo_caller(foo.c);tag4(key1);tag1(key2) 10000", + "main(main.c);foo_caller(foo.c);tag4(key1);tag1,tag5(key2) 1", + "main(main.c);bar(bar.c);(key1);(key2) 200", + }, + }, + { + name: "Numeric units are added with units with tagleaf", + tagleaf: []string{"allocations"}, + leafm: true, + wantSampleFuncs: []string{ + "main(main.c);(allocations) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c);(allocations) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c);1024(allocations) 10", + "main(main.c);foo_caller(foo.c);1024B,2048B(allocations) 10000", + "main(main.c);foo_caller(foo.c);1024B,1024B(allocations) 1", + "main(main.c);bar(bar.c);1024(allocations) 200", + }, + }, + { + name: "Numeric units are added with units with tagroot", + tagroot: []string{"allocations"}, + rootm: true, + wantSampleFuncs: []string{ + "(allocations);main(main.c) 1000", + "(allocations);main(main.c);foo(foo.c);foo_caller(foo.c) 100", + "1024(allocations);main(main.c);foo(foo.c);foo_caller(foo.c) 10", + "1024B,2048B(allocations);main(main.c);foo_caller(foo.c) 10000", + "1024B,1024B(allocations);main(main.c);foo_caller(foo.c) 1", + "1024(allocations);main(main.c);bar(bar.c) 200", + }, + }, + { + name: "Numeric labels are formatted according to outputUnit", + outputUnit: "kB", + tagleaf: []string{"allocations"}, + leafm: true, + wantSampleFuncs: []string{ + "main(main.c);(allocations) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c);(allocations) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c);1024(allocations) 10", + "main(main.c);foo_caller(foo.c);1kB,2kB(allocations) 10000", + "main(main.c);foo_caller(foo.c);1kB,1kB(allocations) 1", + "main(main.c);bar(bar.c);1024(allocations) 200", + }, + }, + { + name: "Numeric units with no units are handled properly by tagleaf", + tagleaf: []string{"allocations"}, + leafm: true, + wantSampleFuncs: []string{ + "main(main.c);(allocations) 1000", + "main(main.c);foo(foo.c);foo_caller(foo.c);(allocations) 100", + "main(main.c);foo(foo.c);foo_caller(foo.c);1024(allocations) 10", + "main(main.c);foo_caller(foo.c);1024B,2048B(allocations) 10000", + "main(main.c);foo_caller(foo.c);1024B,1024B(allocations) 1", + "main(main.c);bar(bar.c);1024(allocations) 200", + }, + }, + } { + tc := tc + t.Run(tc.name, func(t *testing.T) { + p := testProfile1.Copy() + rootm, leafm := addLabelNodes(p, tc.tagroot, tc.tagleaf, tc.outputUnit) + if rootm != tc.rootm { + t.Errorf("Got rootm=%v, want=%v", rootm, tc.rootm) + } + if leafm != tc.leafm { + t.Errorf("Got leafm=%v, want=%v", leafm, tc.leafm) + } + if got, want := strings.Join(stackCollapse(p), "\n")+"\n", strings.Join(tc.wantSampleFuncs, "\n")+"\n"; got != want { + diff, err := proftest.Diff([]byte(want), []byte(got)) + if err != nil { + t.Fatalf("Failed to get diff: %v", err) + } + t.Errorf("Profile samples got diff(want->got):\n%s", diff) + } + }) + } +} + +// stackCollapse returns a slice of strings where each string represents one +// profile sample in Brendan Gregg's "Folded Stacks" format: +// "(filename);(filename);(filename) ". This +// allows the expected values for test cases to be specified in human-readable +// strings. +func stackCollapse(p *profile.Profile) []string { + var ret []string + for _, s := range p.Sample { + var funcs []string + for i := range s.Location { + loc := s.Location[len(s.Location)-1-i] + for _, line := range loc.Line { + funcs = append(funcs, fmt.Sprintf("%s(%s)", line.Function.Name, line.Function.Filename)) + } + } + ret = append(ret, fmt.Sprintf("%s %d", strings.Join(funcs, ";"), s.Value[0])) + } + return ret +} diff --git a/plugin/debug/pkg/internal/driver/tempfile.go b/plugin/debug/pkg/internal/driver/tempfile.go new file mode 100644 index 00000000..b6c8776f --- /dev/null +++ b/plugin/debug/pkg/internal/driver/tempfile.go @@ -0,0 +1,60 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "fmt" + "os" + "path/filepath" + "sync" +) + +// newTempFile returns a new output file in dir with the provided prefix and suffix. +func newTempFile(dir, prefix, suffix string) (*os.File, error) { + for index := 1; index < 10000; index++ { + switch f, err := os.OpenFile(filepath.Join(dir, fmt.Sprintf("%s%03d%s", prefix, index, suffix)), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666); { + case err == nil: + return f, nil + case !os.IsExist(err): + return nil, err + } + } + // Give up + return nil, fmt.Errorf("could not create file of the form %s%03d%s", prefix, 1, suffix) +} + +var tempFiles []string +var tempFilesMu = sync.Mutex{} + +// deferDeleteTempFile marks a file to be deleted by next call to Cleanup() +func deferDeleteTempFile(path string) { + tempFilesMu.Lock() + tempFiles = append(tempFiles, path) + tempFilesMu.Unlock() +} + +// cleanupTempFiles removes any temporary files selected for deferred cleaning. +func cleanupTempFiles() error { + tempFilesMu.Lock() + defer tempFilesMu.Unlock() + var lastErr error + for _, f := range tempFiles { + if err := os.Remove(f); err != nil { + lastErr = err + } + } + tempFiles = nil + return lastErr +} diff --git a/plugin/debug/pkg/internal/driver/tempfile_test.go b/plugin/debug/pkg/internal/driver/tempfile_test.go new file mode 100644 index 00000000..70043534 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/tempfile_test.go @@ -0,0 +1,55 @@ +package driver + +import ( + "os" + "sync" + "testing" +) + +func TestNewTempFile(t *testing.T) { + const n = 100 + // Line up ready to execute goroutines with a read-write lock. + var mu sync.RWMutex + mu.Lock() + var wg sync.WaitGroup + errc := make(chan error, n) + for i := 0; i < n; i++ { + wg.Add(1) + go func() { + mu.RLock() + defer mu.RUnlock() + defer wg.Done() + f, err := newTempFile(os.TempDir(), "profile", ".tmp") + errc <- err + deferDeleteTempFile(f.Name()) + f.Close() + }() + } + // Start the file creation race. + mu.Unlock() + // Wait for the goroutines to finish. + wg.Wait() + + for i := 0; i < n; i++ { + if err := <-errc; err != nil { + t.Fatalf("newTempFile(): got %v, want no error", err) + } + } + if len(tempFiles) != n { + t.Errorf("len(tempFiles): got %d, want %d", len(tempFiles), n) + } + names := map[string]bool{} + for _, name := range tempFiles { + if names[name] { + t.Errorf("got temp file %s created multiple times", name) + break + } + names[name] = true + } + if err := cleanupTempFiles(); err != nil { + t.Errorf("cleanupTempFiles(): got error %v, want no error", err) + } + if len(tempFiles) != 0 { + t.Errorf("len(tempFiles) after the cleanup: got %d, want 0", len(tempFiles)) + } +} diff --git a/plugin/debug/pkg/internal/driver/testdata/cppbench.contention b/plugin/debug/pkg/internal/driver/testdata/cppbench.contention new file mode 100644 index 00000000..66a64c95 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/cppbench.contention @@ -0,0 +1,24 @@ +--- contentionz 1 --- +cycles/second = 3201000000 +sampling period = 100 +ms since reset = 16502830 +discarded samples = 0 + 19490304 27 @ 0xbccc97 0xc61202 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e + 768 1 @ 0xbccc97 0xa42dc7 0xa456e4 0x7fcdc2ff214e + 5760 2 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x4e969d 0x4faa17 0x4fc5f6 0x4fd028 0x4fd230 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e + 569088 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87f08 0xb8814c 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e + 2432 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x7aa74c 0x7ab844 0x7ab914 0x79e9e9 0x79e326 0x4d299e 0x4d4b7b 0x4b7be8 0x4b7ff1 0x4d2dae 0x79e80a + 2034816 3 @ 0xbccc97 0xb82f0f 0xb83003 0xb87d50 0xc635f0 0x42ecc3 0x42e14c 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e +--- Memory map: --- + 00400000-00fcb000: cppbench_server_main + 7fcdc231e000-7fcdc2321000: /libnss_cache-2.15.so + 7fcdc2522000-7fcdc252e000: /libnss_files-2.15.so + 7fcdc272f000-7fcdc28dd000: /libc-2.15.so + 7fcdc2ae7000-7fcdc2be2000: /libm-2.15.so + 7fcdc2de3000-7fcdc2dea000: /librt-2.15.so + 7fcdc2feb000-7fcdc3003000: /libpthread-2.15.so + 7fcdc3208000-7fcdc320a000: /libdl-2.15.so + 7fcdc340c000-7fcdc3415000: /libcrypt-2.15.so + 7fcdc3645000-7fcdc3669000: /ld-2.15.so + 7fff86bff000-7fff86c00000: [vdso] + ffffffffff600000-ffffffffff601000: [vsyscall] diff --git a/plugin/debug/pkg/internal/driver/testdata/cppbench.cpu b/plugin/debug/pkg/internal/driver/testdata/cppbench.cpu new file mode 100644 index 0000000000000000000000000000000000000000..95c22e1e8d8beb46c3823c3a21ee20d0eadedb4b GIT binary patch literal 24405 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 Hb8_Loe%8@N literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/driver/testdata/cppbench.cpu_no_samples_type b/plugin/debug/pkg/internal/driver/testdata/cppbench.cpu_no_samples_type new file mode 100644 index 0000000000000000000000000000000000000000..266fd70b7121e6377dd2bcfda179fdb0965aedb3 GIT binary patch literal 1705 zcmV;a23GkWiwFP!00000|Ad!ma9haf(SzpfE54out!}VFIOLX&NS^DI`vu03s|6 zO(|`r)6ykL=iKMmmZePm!T0z6@Bhv@_nvcSY++LX>pU$&KwZ79p|MG^3p8ImWMj!u zElqW`iDswE-Ha`sN`0DeOq;B|{mP)~@d$@H)#wq9*2&tokpOFL)d8K;>CCz+(OZ%F zk>}hjo>ikB=h+qF=$m#HXH+>o!ZCB!>~nl`&Ye5&q}D3j^Zn;lq~}bn!hQY}nZvdU z_XShru^<<=SGzqzbWDuqoJpH#UUJa zjWd_te#a!+op;sPxLY*cy=?hCvHwmysA=bHAUMM2XXdCKz2)i1oNVn@^5x6#Tr%B$buRr$6I zfBv+ke#NWb=~Wd6n&r{a6DL?bz^mWo^(s!@>wi!150E*068&zUT>%7o_`@}IKD$zf zK<{jmSdTz2z43cS8v=d!fy4#`df}lRjExBNy+8b^-e*^u5a_2n4l^nU^p`(Mv?I_b zFRpFyITe9TbnLggd7D1F;y|Fst%ObldVSZ&4L-Z#LZBTZWkxq=IVRO+u4v#8BXSv| z^0OBH?0`fM0`0d-o`yhgSOyh=hMyd4^x2hG_F8Hi0v-SMF%C8zfxh~WOhJrCr1wk& z+O}VMy$JNf4N^S|fkvK^cs2rkcca7^2=rI0vY7}pwBab@EChQ0pv2h-^p7JF&q1I^ zz8v7VJ_LI6nVpPt*f1jTT+X&vCZ3BxpKg^n4}l)~`J)_RJ_7yufIJ;P0u7WUo`*oY ztX-UsK!3Lk7a-7k7G8)zPw$i1jzGIVlGuSj>#PO@5NM5som>N>QwgGt*1h)mkkzjc z0zI)=W(gzE_N@}TxV?L1yl#%SNvb^vba1^qm0kog&1ZQOBHYE}KVpm`&}UoT|A+S5e0Jpu1bTFx z#6=u;&10NmF?aFH-HcZvQ2FJpj8`GhfiEOp%~Sm2*BGxsppVwR%XlpUjedQQ@j3)L zJn%f@^$7GWt6w)D(5Clg4L5R|kITw#LZE;CPvXrybrvo`pkG_wTex&<#&1QSJ(hYK z&(~gwOA+YAzvcMcjzG^GlXwRLJvJam;!e)?s*G?K0{zQ6hr1DI^Imx^mvOzDB4O_PJHZ|`2^KUc85$JDUNJ9dF z-uhIcjzIgYt85_9(fzWVBo8Z3ol{BiQ2pwqv7zeYO>aJ2?{g|?w9(_^FYe=_Hhj%R z-H$*Y{6u1gC;jjXjH`H%U)f$4IwMq{$gd7LvRXD*G!nV2UJPx7fbq?Iu22f}=~_4t z&lOS`qoivkEug0h#XusTj~m%UUq?Khjr9lH6S@{mbm~2^Xfz&4_8OfrLyJT^jbu31 z+tU?H2IJwFp47uyqC3*j73}T~hr*Gr&WIjPc4{4|TrQO{+P{(3jrM#YmrQ5U*;Gfc zw>KCKMWQ{u!SQ^tqEYBK3b9pMIvbi7SY0dxQiYNc=nn@n>3B~U|IQYRF)p}0)Di6N zDCR=*Pwh*lGe&XTIIFfXaXQ1Qal`D|hC*rFF}JoOU+OCuntr-KdS=`)=M=>j9>`B* zn^DU&k)?5Yzh2C(2#MwW#RrNBEt6RhN-U8bFcxbiZNY+ty8d8=!2OB!X<0pE6dqiZ zUp@A+Fy&1wHnyW!F`b$a3r4Y&D;SaHW%A#SmHanE{*3#2a`V4+exXX={Bu)vs~Y$einIuyfo?k>Y8hP*rffid>=S>6NloX zI4_fr>bjXY6d%Q*e0Kd&K9oO{E;rA8*VT2u#xn0+^U;2}e01Ka98z;Z<=OQ|ef||) zZS|e$Mr|&g3?9tq4Lu=pD8|6zg(YnzNo%ax?G>*{1N8@iVx+F ztBdNF;!ys$y4w1WQFB50GKph0-l3BAFNz_lz`N$={+Wk64tAIus;k>u+SzMr zo9 N3 [label=" 75.78ms" weight=51 penwidth=3 color="#b22000" tooltip="testdata/file3000.src -> testdata/file2000.src (75.78ms)" labeltooltip="testdata/file3000.src -> testdata/file2000.src (75.78ms)"] +N1 -> N2 [label=" 40.96ms" weight=28 penwidth=2 color="#b23900" tooltip="testdata/file3000.src -> testdata/file1000.src (40.96ms)" labeltooltip="testdata/file3000.src -> testdata/file1000.src (40.96ms)"] +N3 -> N2 [label=" 10.24ms" weight=7 color="#b29775" tooltip="testdata/file2000.src -> testdata/file1000.src (10.24ms)" labeltooltip="testdata/file2000.src -> testdata/file1000.src (10.24ms)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore b/plugin/debug/pkg/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore new file mode 100644 index 00000000..dcd0920a --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore @@ -0,0 +1,9 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid-contention" [shape=box fontsize=16 label="Build ID: buildid-contention\lComment #1\lComment #2\lType: delay\lActive filters:\l focus=[X1]000\l ignore=[X3]002\lShowing nodes accounting for 40.96ms, 27.40% of 149.50ms total\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="0000000000001000\nline1000\nfile1000.src:1\n40.96ms (27.40%)" id="node1" fontsize=24 shape=box tooltip="0000000000001000 line1000 testdata/file1000.src:1 (40.96ms)" color="#b23900" fillcolor="#edddd5"] +N2 [label="0000000000003001\nline3000\nfile3000.src:5\n0 of 40.96ms (27.40%)" id="node2" fontsize=8 shape=box tooltip="0000000000003001 line3000 testdata/file3000.src:5 (40.96ms)" color="#b23900" fillcolor="#edddd5"] +N3 [label="0000000000003001\nline3001\nfile3000.src:3\n0 of 40.96ms (27.40%)" id="node3" fontsize=8 shape=box tooltip="0000000000003001 line3001 testdata/file3000.src:3 (40.96ms)" color="#b23900" fillcolor="#edddd5"] +N2 -> N3 [label=" 40.96ms\n (inline)" weight=28 penwidth=2 color="#b23900" tooltip="0000000000003001 line3000 testdata/file3000.src:5 -> 0000000000003001 line3001 testdata/file3000.src:3 (40.96ms)" labeltooltip="0000000000003001 line3000 testdata/file3000.src:5 -> 0000000000003001 line3001 testdata/file3000.src:3 (40.96ms)"] +N3 -> N1 [label=" 40.96ms" weight=28 penwidth=2 color="#b23900" tooltip="0000000000003001 line3001 testdata/file3000.src:3 -> 0000000000001000 line1000 testdata/file1000.src:1 (40.96ms)" labeltooltip="0000000000003001 line3001 testdata/file3000.src:3 -> 0000000000001000 line1000 testdata/file1000.src:1 (40.96ms)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.addresses.traces b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.addresses.traces new file mode 100644 index 00000000..742b123e --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.addresses.traces @@ -0,0 +1,32 @@ +File: testbinary +Type: cpu +Duration: 10s, Total samples = 1.12s (11.20%) +-----------+------------------------------------------------------- + key1: tag1 + key2: tag1 + 1s 0000000000001000 line1000 testdata/file1000.src:1 + 0000000000002000 line2001 testdata/file2000.src:9 (inline) + 0000000000002000 line2000 testdata/file2000.src:4 + 0000000000003000 line3002 testdata/file3000.src:2 (inline) + 0000000000003000 line3001 testdata/file3000.src:5 (inline) + 0000000000003000 line3000 testdata/file3000.src:6 +-----------+------------------------------------------------------- + key1: tag2 + key3: tag2 + 100ms 0000000000001000 line1000 testdata/file1000.src:1 + 0000000000003001 line3001 testdata/file3000.src:8 (inline) + 0000000000003001 line3000 testdata/file3000.src:9 +-----------+------------------------------------------------------- + key1: tag3 + key2: tag2 + 10ms 0000000000002000 line2001 testdata/file2000.src:9 (inline) + 0000000000002000 line2000 testdata/file2000.src:4 + 0000000000003002 line3002 testdata/file3000.src:5 (inline) + 0000000000003002 line3000 testdata/file3000.src:9 +-----------+------------------------------------------------------- + key1: tag4 + key2: tag1 + 10ms 0000000000003000 line3002 testdata/file3000.src:2 (inline) + 0000000000003000 line3001 testdata/file3000.src:5 (inline) + 0000000000003000 line3000 testdata/file3000.src:6 +-----------+------------------------------------------------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.call_tree.callgrind b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.call_tree.callgrind new file mode 100644 index 00000000..e2286f63 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.call_tree.callgrind @@ -0,0 +1,99 @@ +positions: instr line +events: cpu(ms) + +ob=(1) /path/to/testbinary +fl=(1) testdata/file1000.src +fn=(1) line1000 +0x1000 1 1000 +* 1 100 + +ob=(1) +fl=(2) testdata/file2000.src +fn=(2) line2001 ++4096 9 10 + +ob=(1) +fl=(3) testdata/file3000.src +fn=(3) line3002 ++4096 2 10 +cfl=(2) +cfn=(4) line2000 [1/2] +calls=0 * 4 +* * 1000 + +ob=(1) +fl=(2) +fn=(5) line2000 +-4096 4 0 +cfl=(2) +cfn=(6) line2001 [2/2] +calls=0 -4096 9 +* * 1000 +* 4 0 +cfl=(2) +cfn=(7) line2001 [1/2] +calls=0 * 9 +* * 10 + +ob=(1) +fl=(2) +fn=(2) +* 9 0 +cfl=(1) +cfn=(8) line1000 [1/2] +calls=0 -4096 1 +* * 1000 + +ob=(1) +fl=(3) +fn=(9) line3000 ++4096 6 0 +cfl=(3) +cfn=(10) line3001 [1/2] +calls=0 +4096 5 +* * 1010 + +ob=(1) +fl=(3) +fn=(11) line3001 +* 5 0 +cfl=(3) +cfn=(12) line3002 [1/2] +calls=0 * 2 +* * 1010 + +ob=(1) +fl=(3) +fn=(9) ++1 9 0 +cfl=(3) +cfn=(13) line3001 [2/2] +calls=0 +1 8 +* * 100 + +ob=(1) +fl=(3) +fn=(11) +* 8 0 +cfl=(1) +cfn=(14) line1000 [2/2] +calls=0 -8193 1 +* * 100 + +ob=(1) +fl=(3) +fn=(9) ++1 9 0 +cfl=(3) +cfn=(15) line3002 [2/2] +calls=0 +1 5 +* * 10 + +ob=(1) +fl=(3) +fn=(3) +* 5 0 +cfl=(2) +cfn=(16) line2000 [2/2] +calls=0 -4098 4 +* * 10 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.callgrind b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.callgrind new file mode 100644 index 00000000..0b049963 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.callgrind @@ -0,0 +1,88 @@ +positions: instr line +events: cpu(ms) + +ob=(1) /path/to/testbinary +fl=(1) testdata/file1000.src +fn=(1) line1000 +0x1000 1 1100 + +ob=(1) +fl=(2) testdata/file2000.src +fn=(2) line2001 ++4096 9 10 +cfl=(1) +cfn=(1) +calls=0 * 1 +* * 1000 + +ob=(1) +fl=(3) testdata/file3000.src +fn=(3) line3002 ++4096 2 10 +cfl=(2) +cfn=(4) line2000 +calls=0 * 4 +* * 1000 + +ob=(1) +fl=(2) +fn=(4) +-4096 4 0 +cfl=(2) +cfn=(2) +calls=0 -4096 9 +* * 1010 + +ob=(1) +fl=(3) +fn=(5) line3000 ++4096 6 0 +cfl=(3) +cfn=(6) line3001 +calls=0 +4096 5 +* * 1010 + +ob=(1) +fl=(3) +fn=(6) +* 5 0 +cfl=(3) +cfn=(3) +calls=0 * 2 +* * 1010 + +ob=(1) +fl=(3) +fn=(5) ++1 9 0 +cfl=(3) +cfn=(6) +calls=0 +1 8 +* * 100 + +ob=(1) +fl=(3) +fn=(6) +* 8 0 +cfl=(1) +cfn=(1) +calls=0 -8193 1 +* * 100 + +ob=(1) +fl=(3) +fn=(5) ++1 9 0 +cfl=(3) +cfn=(3) +calls=0 +1 5 +* * 10 + +ob=(1) +fl=(3) +fn=(3) +* 5 0 +cfl=(2) +cfn=(4) +calls=0 -4098 4 +* * 10 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.comments b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.comments new file mode 100644 index 00000000..e6d9824e --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.comments @@ -0,0 +1 @@ +some-comment diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide new file mode 100644 index 00000000..f0d928d7 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide @@ -0,0 +1,8 @@ +Active filters: + focus=[12]00 + hide=line[X3]0 +Showing nodes accounting for 1.11s, 99.11% of 1.12s total + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src:1 + 0 0% 98.21% 1.01s 90.18% line2000 testdata/file2000.src:4 + 0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src:9 (inline) diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.hide b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.hide new file mode 100644 index 00000000..bf503a57 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.hide @@ -0,0 +1,7 @@ +Active filters: + hide=line[X3]0 +Showing nodes accounting for 1.11s, 99.11% of 1.12s total + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src:1 + 0 0% 98.21% 1.01s 90.18% line2000 testdata/file2000.src:4 + 0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src:9 (inline) diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.show b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.show new file mode 100644 index 00000000..7604cb8d --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.text.show @@ -0,0 +1,7 @@ +Active filters: + show=[12]00 +Showing nodes accounting for 1.11s, 99.11% of 1.12s total + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src:1 + 0 0% 98.21% 1.01s 90.18% line2000 testdata/file2000.src:4 + 0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src:9 (inline) diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide new file mode 100644 index 00000000..94b9be83 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide @@ -0,0 +1,5 @@ +Active filters: + hide=mangled[X3]0 +Showing nodes accounting for 1s, 100% of 1s total + flat flat% sum% cum cum% + 1s 100% 100% 1s 100% mangled1000 testdata/file1000.src:1 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from new file mode 100644 index 00000000..112b49b3 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from @@ -0,0 +1,16 @@ +Active filters: + show_from=line2 +Showing nodes accounting for 1.01s, 90.18% of 1.12s total +----------------------------------------------------------+------------- + flat flat% sum% cum cum% calls calls% + context +----------------------------------------------------------+------------- + 0 0% 0% 1.01s 90.18% | line2000 testdata/file2000.src:4 + 1.01s 100% | line2001 testdata/file2000.src:9 (inline) +----------------------------------------------------------+------------- + 1.01s 100% | line2000 testdata/file2000.src:4 (inline) + 0.01s 0.89% 0.89% 1.01s 90.18% | line2001 testdata/file2000.src:9 + 1s 99.01% | line1000 testdata/file1000.src:1 +----------------------------------------------------------+------------- + 1s 100% | line2001 testdata/file2000.src:9 + 1s 89.29% 90.18% 1s 89.29% | line1000 testdata/file1000.src:1 +----------------------------------------------------------+------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.disasm b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.disasm new file mode 100644 index 00000000..57987e8e --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.disasm @@ -0,0 +1,14 @@ +Total: 1.12s +ROUTINE ======================== line1000 + 1.10s 1.10s (flat, cum) 98.21% of Total + 1.10s 1.10s 1000: instruction one ;line1000 file1000.src:1 + . . 1001: instruction two + . . 1002: instruction three ;line1000 file1000.src:2 + . . 1003: instruction four ;line1000 file1000.src:1 +ROUTINE ======================== line3000 + 10ms 1.12s (flat, cum) 100% of Total + 10ms 1.01s 3000: instruction one ;line3000 file3000.src:6 + . 100ms 3001: instruction two ;line3000 file3000.src:9 + . 10ms 3002: instruction three + . . 3003: instruction four ;line3000 file3000.src + . . 3004: instruction five diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text new file mode 100644 index 00000000..d53c44da --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text @@ -0,0 +1,7 @@ +Showing nodes accounting for 1.12s, 100% of 1.12s total +Dropped 1 node (cum <= 0.06s) + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% 0000000000001000 line1000 testdata/file1000.src:1 + 0.01s 0.89% 99.11% 1.01s 90.18% 0000000000002000 line2000 testdata/file2000.src:4 + 0.01s 0.89% 100% 1.01s 90.18% 0000000000003000 line3000 testdata/file3000.src:6 + 0 0% 100% 0.10s 8.93% 0000000000003001 line3000 testdata/file3000.src:9 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.weblist b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.weblist new file mode 100644 index 00000000..b480dd9d --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.addresses.weblist @@ -0,0 +1,101 @@ + + + + + testbinary cpu + + + + + + +

File: testbinary
+Type: cpu
+Duration: 10s, Total samples = 1.12s (11.20%)
Total: 1.12s

line1000

testdata/file1000.src

+
+  Total:       1.10s      1.10s (flat, cum) 98.21%
+      1        1.10s      1.10s           line1                1.10s      1.10s     1000:     instruction one                                                              file1000.src:1
+                   .          .     1001:     instruction two                                                              file1000.src:1
+                                     ⋮
+                   .          .     1003:     instruction four                                                             file1000.src:1
+
+      2            .          .           line2                    .          .     1002:     instruction three                                                            file1000.src:2
+
+      3            .          .           line3 
+      4            .          .           line4 
+      5            .          .           line5 
+      6            .          .           line6 
+      7            .          .           line7 
+
+

line3000

testdata/file3000.src

+
+  Total:        10ms      1.12s (flat, cum)   100%
+      1            .          .           line1 
+      2            .          .           line2 
+      3            .          .           line3 
+      4            .          .           line4 
+      5            .          .           line5 
+      6         10ms      1.01s           line6                                               line5                                                                        file3000.src:5
+                                                  line2                                                                    file3000.src:2
+                10ms      1.01s     3000:             instruction one                                                      file3000.src:2
+
+      7            .          .           line7 
+      8            .          .           line8 
+      9            .      110ms           line9                                               line8                                                                        file3000.src:8
+                   .      100ms     3001:         instruction two                                                          file3000.src:8
+                                              line5                                                                        file3000.src:5
+                   .       10ms     3002:         instruction three                                                        file3000.src:5
+                   .          .     3003:         instruction four                                                         
+                   .          .     3004:         instruction five                                                         
+
+     10            .          .           line0 
+     11            .          .           line1 
+     12            .          .           line2 
+     13            .          .           line3 
+     14            .          .           line4 
+
+ + + diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text new file mode 100644 index 00000000..88fb7607 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text @@ -0,0 +1,5 @@ +Showing nodes accounting for 1.12s, 100% of 1.12s total + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src + 0.01s 0.89% 99.11% 1.01s 90.18% line2000 testdata/file2000.src + 0.01s 0.89% 100% 1.12s 100% line3000 testdata/file3000.src diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot new file mode 100644 index 00000000..ae57f664 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot @@ -0,0 +1,21 @@ +digraph "testbinary" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.11s, 99.11% of 1.12s total\lDropped 3 nodes (cum <= 0.06s)\l\lSee https://git.io/JfYMW for how to read the graph\l" tooltip="testbinary"] } +N1 [label="line1000\n1s (89.29%)" id="node1" fontsize=24 shape=box tooltip="line1000 (1s)" color="#b20500" fillcolor="#edd6d5"] +N1_0 [label = "key1:tag1\nkey2:tag1" id="N1_0" fontsize=8 shape=box3d tooltip="1s"] +N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"] +N2 [label="line3000\n0 of 1.12s (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (1.12s)" color="#b20000" fillcolor="#edd5d5"] +N3 [label="line3001\n0 of 1.11s (99.11%)" id="node3" fontsize=8 shape=box tooltip="line3001 (1.11s)" color="#b20000" fillcolor="#edd5d5"] +N4 [label="line1000\n0.10s (8.93%)" id="node4" fontsize=14 shape=box tooltip="line1000 (0.10s)" color="#b28b62" fillcolor="#ede8e2"] +N4_0 [label = "key1:tag2\nkey3:tag2" id="N4_0" fontsize=8 shape=box3d tooltip="0.10s"] +N4 -> N4_0 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"] +N5 [label="line3002\n0.01s (0.89%)\nof 1.01s (90.18%)" id="node5" fontsize=10 shape=box tooltip="line3002 (1.01s)" color="#b20500" fillcolor="#edd6d5"] +N6 [label="line2000\n0 of 1s (89.29%)" id="node6" fontsize=8 shape=box tooltip="line2000 (1s)" color="#b20500" fillcolor="#edd6d5"] +N7 [label="line2001\n0 of 1s (89.29%)" id="node7" fontsize=8 shape=box tooltip="line2001 (1s)" color="#b20500" fillcolor="#edd6d5"] +N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 -> line3001 (1.11s)" labeltooltip="line3000 -> line3001 (1.11s)"] +N3 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 -> line3002 (1.01s)" labeltooltip="line3001 -> line3002 (1.01s)"] +N6 -> N7 [label=" 1s\n (inline)" weight=90 penwidth=5 color="#b20500" tooltip="line2000 -> line2001 (1s)" labeltooltip="line2000 -> line2001 (1s)"] +N7 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 -> line1000 (1s)" labeltooltip="line2001 -> line1000 (1s)"] +N5 -> N6 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line3002 -> line2000 (1s)" labeltooltip="line3002 -> line2000 (1s)"] +N3 -> N4 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 -> line1000 (0.10s)" labeltooltip="line3001 -> line1000 (0.10s)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.dot b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.dot new file mode 100644 index 00000000..4a812e45 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.dot @@ -0,0 +1,20 @@ +digraph "testbinary" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.12s, 100% of 1.12s total\l\lSee https://git.io/JfYMW for how to read the graph\l" tooltip="testbinary"] } +N1 [label="line1000\n1.10s (98.21%)" id="node1" fontsize=24 shape=box tooltip="line1000 (1.10s)" color="#b20000" fillcolor="#edd5d5"] +N1_0 [label = "key1:tag1\nkey2:tag1" id="N1_0" fontsize=8 shape=box3d tooltip="1s"] +N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"] +N1_1 [label = "key1:tag2\nkey3:tag2" id="N1_1" fontsize=8 shape=box3d tooltip="0.10s"] +N1 -> N1_1 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"] +N2 [label="line3000\n0 of 1.12s (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (1.12s)" color="#b20000" fillcolor="#edd5d5"] +N3 [label="line3001\n0 of 1.11s (99.11%)" id="node3" fontsize=8 shape=box tooltip="line3001 (1.11s)" color="#b20000" fillcolor="#edd5d5"] +N4 [label="line3002\n0.01s (0.89%)\nof 1.02s (91.07%)" id="node4" fontsize=10 shape=box tooltip="line3002 (1.02s)" color="#b20400" fillcolor="#edd6d5"] +N5 [label="line2001\n0.01s (0.89%)\nof 1.01s (90.18%)" id="node5" fontsize=10 shape=box tooltip="line2001 (1.01s)" color="#b20500" fillcolor="#edd6d5"] +N6 [label="line2000\n0 of 1.01s (90.18%)" id="node6" fontsize=8 shape=box tooltip="line2000 (1.01s)" color="#b20500" fillcolor="#edd6d5"] +N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 -> line3001 (1.11s)" labeltooltip="line3000 -> line3001 (1.11s)"] +N6 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line2000 -> line2001 (1.01s)" labeltooltip="line2000 -> line2001 (1.01s)"] +N3 -> N4 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 -> line3002 (1.01s)" labeltooltip="line3001 -> line3002 (1.01s)"] +N4 -> N6 [label=" 1.01s" weight=91 penwidth=5 color="#b20500" tooltip="line3002 -> line2000 (1.01s)" labeltooltip="line3002 -> line2000 (1.01s)"] +N5 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 -> line1000 (1s)" labeltooltip="line2001 -> line1000 (1s)"] +N3 -> N1 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 -> line1000 (0.10s)" labeltooltip="line3001 -> line1000 (0.10s)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text new file mode 100644 index 00000000..493b4912 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text @@ -0,0 +1,5 @@ +Showing nodes accounting for 1.12s, 100% of 1.12s total + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 + 0.01s 0.89% 99.11% 1.01s 90.18% line2000 + 0.01s 0.89% 100% 1.12s 100% line3000 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.text b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.text new file mode 100644 index 00000000..66e4189e --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.flat.functions.text @@ -0,0 +1,8 @@ +Showing nodes accounting for 1.12s, 100% of 1.12s total + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 + 0.01s 0.89% 99.11% 1.01s 90.18% line2001 (inline) + 0.01s 0.89% 100% 1.02s 91.07% line3002 (inline) + 0 0% 100% 1.01s 90.18% line2000 + 0 0% 100% 1.12s 100% line3000 + 0 0% 100% 1.11s 99.11% line3001 (inline) diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.lines.topproto b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.lines.topproto new file mode 100644 index 00000000..33bf6814 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.lines.topproto @@ -0,0 +1,3 @@ +Showing nodes accounting for 1s, 100% of 1s total + flat flat% sum% cum cum% + 1s 100% 100% 1s 100% mangled1000 testdata/file1000.src:1 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.peek b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.peek new file mode 100644 index 00000000..3b8a3537 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.peek @@ -0,0 +1,13 @@ +Showing nodes accounting for 1.12s, 100% of 1.12s total +----------------------------------------------------------+------------- + flat flat% sum% cum cum% calls calls% + context +----------------------------------------------------------+------------- + 1.01s 100% | line2000 (inline) + 0.01s 0.89% 0.89% 1.01s 90.18% | line2001 + 1s 99.01% | line1000 +----------------------------------------------------------+------------- + 1.11s 100% | line3000 (inline) + 0 0% 0.89% 1.11s 99.11% | line3001 + 1.01s 90.99% | line3002 (inline) + 0.10s 9.01% | line1000 +----------------------------------------------------------+------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags new file mode 100644 index 00000000..5998b5ba --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags @@ -0,0 +1,13 @@ + key1: Total 1.1s + 1.0s (89.29%): tag1 + 100.0ms ( 8.93%): tag2 + 10.0ms ( 0.89%): tag3 + 10.0ms ( 0.89%): tag4 + + key2: Total 1.0s + 1.0s (99.02%): tag1 + 10.0ms ( 0.98%): tag2 + + key3: Total 100.0ms + 100.0ms ( 100%): tag2 + diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags.focus.ignore b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags.focus.ignore new file mode 100644 index 00000000..9b99d436 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.tags.focus.ignore @@ -0,0 +1,6 @@ + key1: Total 100.0ms + 100.0ms ( 100%): tag2 + + key3: Total 100.0ms + 100.0ms ( 100%): tag2 + diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.traces b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.traces new file mode 100644 index 00000000..dd31e2e6 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpu.traces @@ -0,0 +1,32 @@ +File: testbinary +Type: cpu +Duration: 10s, Total samples = 1.12s (11.20%) +-----------+------------------------------------------------------- + key1: tag1 + key2: tag1 + 1s line1000 + line2001 (inline) + line2000 + line3002 (inline) + line3001 (inline) + line3000 +-----------+------------------------------------------------------- + key1: tag2 + key3: tag2 + 100ms line1000 + line3001 (inline) + line3000 +-----------+------------------------------------------------------- + key1: tag3 + key2: tag2 + 10ms line2001 (inline) + line2000 + line3002 (inline) + line3000 +-----------+------------------------------------------------------- + key1: tag4 + key2: tag1 + 10ms line3002 (inline) + line3001 (inline) + line3000 +-----------+------------------------------------------------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree b/plugin/debug/pkg/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree new file mode 100644 index 00000000..606db2b8 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree @@ -0,0 +1,17 @@ +Showing nodes accounting for 4s, 100% of 4s total +Showing top 4 nodes out of 5 +----------------------------------------------------------+------------- + flat flat% sum% cum cum% calls calls% + context +----------------------------------------------------------+------------- + 1s 100% | 0000000000003000 [testbinary] + 1s 25.00% 25.00% 1s 25.00% | 0000000000001000 [testbinary] +----------------------------------------------------------+------------- + 1s 25.00% 50.00% 2s 50.00% | 0000000000003000 [testbinary] + 1s 50.00% | 0000000000001000 [testbinary] +----------------------------------------------------------+------------- + 1s 100% | 0000000000005000 [testbinary] + 1s 25.00% 75.00% 1s 25.00% | 0000000000004000 [testbinary] +----------------------------------------------------------+------------- + 1s 25.00% 100% 2s 50.00% | 0000000000005000 [testbinary] + 1s 50.00% | 0000000000004000 [testbinary] +----------------------------------------------------------+------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.callgrind b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.callgrind new file mode 100644 index 00000000..bfd96cb7 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.callgrind @@ -0,0 +1,88 @@ +positions: instr line +events: inuse_space(MB) + +ob= +fl=(1) testdata/file2000.src +fn=(1) line2001 +0x2000 2 62 +cfl=(2) testdata/file1000.src +cfn=(2) line1000 +calls=0 0x1000 1 +* * 0 + +ob= +fl=(3) testdata/file3000.src +fn=(3) line3002 ++4096 3 31 +cfl=(1) +cfn=(4) line2000 +calls=0 * 3 +* * 0 + +ob= +fl=(2) +fn=(2) +-8192 1 4 + +ob= +fl=(1) +fn=(4) ++4096 3 0 +cfl=(1) +cfn=(1) +calls=0 +4096 2 +* * 63 + +ob= +fl=(3) +fn=(5) line3000 ++4096 4 0 +cfl=(3) +cfn=(6) line3001 +calls=0 +4096 2 +* * 32 + +ob= +fl=(3) +fn=(6) +* 2 0 +cfl=(3) +cfn=(3) +calls=0 * 3 +* * 32 + +ob= +fl=(3) +fn=(5) ++1 4 0 +cfl=(3) +cfn=(6) +calls=0 +1 2 +* * 3 + +ob= +fl=(3) +fn=(6) +* 2 0 +cfl=(2) +cfn=(2) +calls=0 -8193 1 +* * 3 + +ob= +fl=(3) +fn=(5) ++1 4 0 +cfl=(3) +cfn=(3) +calls=0 +1 3 +* * 62 + +ob= +fl=(3) +fn=(3) +* 3 0 +cfl=(1) +cfn=(4) +calls=0 -4098 3 +* * 62 diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.comments b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.comments new file mode 100644 index 00000000..6eca2fb7 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.comments @@ -0,0 +1,2 @@ +comment +#hidden comment diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.lines.tree.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.lines.tree.focus new file mode 100644 index 00000000..9d4ba72b --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.lines.tree.focus @@ -0,0 +1,21 @@ +Active filters: + focus=[24]00 +Showing nodes accounting for 62.50MB, 63.37% of 98.63MB total +Dropped 2 nodes (cum <= 4.93MB) +----------------------------------------------------------+------------- + flat flat% sum% cum cum% calls calls% + context +----------------------------------------------------------+------------- + 63.48MB 100% | line3002 testdata/file3000.src:3 + 0 0% 0% 63.48MB 64.36% | line2000 testdata/file2000.src:3 + 63.48MB 100% | line2001 testdata/file2000.src:2 (inline) +----------------------------------------------------------+------------- + 63.48MB 100% | line2000 testdata/file2000.src:3 (inline) + 62.50MB 63.37% 63.37% 63.48MB 64.36% | line2001 testdata/file2000.src:2 +----------------------------------------------------------+------------- + 0 0% 63.37% 63.48MB 64.36% | line3000 testdata/file3000.src:4 + 63.48MB 100% | line3002 testdata/file3000.src:3 (inline) +----------------------------------------------------------+------------- + 63.48MB 100% | line3000 testdata/file3000.src:4 (inline) + 0 0% 63.37% 63.48MB 64.36% | line3002 testdata/file3000.src:3 + 63.48MB 100% | line2000 testdata/file2000.src:3 +----------------------------------------------------------+------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus new file mode 100644 index 00000000..c2d11838 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus @@ -0,0 +1,21 @@ +Active filters: + focus=[24]00 +Showing nodes accounting for 62.50MB, 98.46% of 63.48MB total +Dropped 2 nodes (cum <= 3.17MB) +----------------------------------------------------------+------------- + flat flat% sum% cum cum% calls calls% + context +----------------------------------------------------------+------------- + 63.48MB 100% | line3002 + 0 0% 0% 63.48MB 100% | line2000 + 63.48MB 100% | line2001 (inline) +----------------------------------------------------------+------------- + 63.48MB 100% | line2000 (inline) + 62.50MB 98.46% 98.46% 63.48MB 100% | line2001 +----------------------------------------------------------+------------- + 0 0% 98.46% 63.48MB 100% | line3000 + 63.48MB 100% | line3002 (inline) +----------------------------------------------------------+------------- + 63.48MB 100% | line3000 (inline) + 0 0% 98.46% 63.48MB 100% | line3002 + 63.48MB 100% | line2000 +----------------------------------------------------------+------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.seconds.text b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.seconds.text new file mode 100644 index 00000000..b9571ef4 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.seconds.text @@ -0,0 +1,2 @@ +Showing nodes accounting for 0, 0% of 0 total + flat flat% sum% cum cum% diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text new file mode 100644 index 00000000..fd536df5 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text @@ -0,0 +1,5 @@ +Showing nodes accounting for 93.75MB, 95.05% of 98.63MB total +Dropped 1 node (cum <= 4.93MB) + flat flat% sum% cum cum% + 62.50MB 63.37% 63.37% 63.48MB 64.36% testdata/file2000.src + 31.25MB 31.68% 95.05% 98.63MB 100% testdata/file3000.src diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text.focus new file mode 100644 index 00000000..20a503f9 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.files.text.focus @@ -0,0 +1,8 @@ +Active filters: + focus=[12]00 + taghide=[X3]00 +Showing nodes accounting for 67.38MB, 68.32% of 98.63MB total + flat flat% sum% cum cum% + 62.50MB 63.37% 63.37% 63.48MB 64.36% testdata/file2000.src + 4.88MB 4.95% 68.32% 4.88MB 4.95% testdata/file1000.src + 0 0% 68.32% 67.38MB 68.32% testdata/file3000.src diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_objects.text b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_objects.text new file mode 100644 index 00000000..929461a3 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_objects.text @@ -0,0 +1,8 @@ +Showing nodes accounting for 150, 100% of 150 total + flat flat% sum% cum cum% + 80 53.33% 53.33% 130 86.67% line3002 (inline) + 40 26.67% 80.00% 50 33.33% line2001 (inline) + 30 20.00% 100% 30 20.00% line1000 + 0 0% 100% 50 33.33% line2000 + 0 0% 100% 150 100% line3000 + 0 0% 100% 110 73.33% line3001 (inline) diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus new file mode 100644 index 00000000..c1d3a8e5 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus @@ -0,0 +1,13 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lActive filters:\l tagfocus=1mb:2gb\lShowing nodes accounting for 62.50MB, 63.37% of 98.63MB total\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line2001\n62.50MB (63.37%)" id="node1" fontsize=24 shape=box tooltip="line2001 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] +NN1_0 [label = "1.56MB" id="NN1_0" fontsize=8 shape=box3d tooltip="62.50MB"] +N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] +N2 [label="line3000\n0 of 62.50MB (63.37%)" id="node2" fontsize=8 shape=box tooltip="line3000 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] +N3 [label="line2000\n0 of 62.50MB (63.37%)" id="node3" fontsize=8 shape=box tooltip="line2000 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] +N4 [label="line3002\n0 of 62.50MB (63.37%)" id="node4" fontsize=8 shape=box tooltip="line3002 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] +N3 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (62.50MB)" labeltooltip="line2000 -> line2001 (62.50MB)"] +N2 -> N4 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] +N4 -> N3 [label=" 62.50MB" weight=64 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (62.50MB)" labeltooltip="line3002 -> line2000 (62.50MB)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore new file mode 100644 index 00000000..ead36d62 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore @@ -0,0 +1,16 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lActive filters:\l tagfocus=30kb:\l tagignore=1mb:2mb\lShowing nodes accounting for 36.13MB, 36.63% of 98.63MB total\lDropped 2 nodes (cum <= 4.93MB)\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line3002\n31.25MB (31.68%)\nof 32.23MB (32.67%)" id="node1" fontsize=24 shape=box tooltip="line3002 (32.23MB)" color="#b23200" fillcolor="#eddcd5"] +NN1_0 [label = "400kB" id="NN1_0" fontsize=8 shape=box3d tooltip="31.25MB"] +N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] +N2 [label="line3000\n0 of 36.13MB (36.63%)" id="node2" fontsize=8 shape=box tooltip="line3000 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] +N3 [label="line3001\n0 of 36.13MB (36.63%)" id="node3" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] +N4 [label="line1000\n4.88MB (4.95%)" id="node4" fontsize=15 shape=box tooltip="line1000 (4.88MB)" color="#b2a086" fillcolor="#edeae7"] +NN4_0 [label = "200kB" id="NN4_0" fontsize=8 shape=box3d tooltip="3.91MB"] +N4 -> NN4_0 [label=" 3.91MB" weight=100 tooltip="3.91MB" labeltooltip="3.91MB"] +N2 -> N3 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] +N3 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] +N3 -> N4 [label=" 3.91MB" weight=4 color="#b2a58f" tooltip="line3001 -> line1000 (3.91MB)" labeltooltip="line3001 -> line1000 (3.91MB)"] +N1 -> N4 [label=" 0.98MB" color="#b2b0a9" tooltip="line3002 ... line1000 (0.98MB)" labeltooltip="line3002 ... line1000 (0.98MB)" style="dotted" minlen=2] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.lines.dot.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.lines.dot.focus new file mode 100644 index 00000000..02ea91ec --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.flat.lines.dot.focus @@ -0,0 +1,21 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lActive filters:\l focus=[12]00\lShowing nodes accounting for 67.38MB, 68.32% of 98.63MB total\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line3000\nfile3000.src:4\n0 of 67.38MB (68.32%)" id="node1" fontsize=8 shape=box tooltip="line3000 testdata/file3000.src:4 (67.38MB)" color="#b21300" fillcolor="#edd7d5"] +N2 [label="line2001\nfile2000.src:2\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node2" fontsize=24 shape=box tooltip="line2001 testdata/file2000.src:2 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +NN2_0 [label = "1.56MB" id="NN2_0" fontsize=8 shape=box3d tooltip="62.50MB"] +N2 -> NN2_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] +N3 [label="line1000\nfile1000.src:1\n4.88MB (4.95%)" id="node3" fontsize=13 shape=box tooltip="line1000 testdata/file1000.src:1 (4.88MB)" color="#b2a086" fillcolor="#edeae7"] +NN3_0 [label = "200kB" id="NN3_0" fontsize=8 shape=box3d tooltip="3.91MB"] +N3 -> NN3_0 [label=" 3.91MB" weight=100 tooltip="3.91MB" labeltooltip="3.91MB"] +N4 [label="line3002\nfile3000.src:3\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line3002 testdata/file3000.src:3 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +N5 [label="line3001\nfile3000.src:2\n0 of 4.88MB (4.95%)" id="node5" fontsize=8 shape=box tooltip="line3001 testdata/file3000.src:2 (4.88MB)" color="#b2a086" fillcolor="#edeae7"] +N6 [label="line2000\nfile2000.src:3\n0 of 63.48MB (64.36%)" id="node6" fontsize=8 shape=box tooltip="line2000 testdata/file2000.src:3 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +N6 -> N2 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 testdata/file2000.src:3 -> line2001 testdata/file2000.src:2 (63.48MB)" labeltooltip="line2000 testdata/file2000.src:3 -> line2001 testdata/file2000.src:2 (63.48MB)"] +N4 -> N6 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 testdata/file3000.src:3 -> line2000 testdata/file2000.src:3 (63.48MB)" labeltooltip="line3002 testdata/file3000.src:3 -> line2000 testdata/file2000.src:3 (63.48MB)"] +N1 -> N4 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 testdata/file3000.src:4 -> line3002 testdata/file3000.src:3 (62.50MB)" labeltooltip="line3000 testdata/file3000.src:4 -> line3002 testdata/file3000.src:3 (62.50MB)"] +N1 -> N5 [label=" 4.88MB\n (inline)" weight=5 color="#b2a086" tooltip="line3000 testdata/file3000.src:4 -> line3001 testdata/file3000.src:2 (4.88MB)" labeltooltip="line3000 testdata/file3000.src:4 -> line3001 testdata/file3000.src:2 (4.88MB)"] +N5 -> N3 [label=" 3.91MB" weight=4 color="#b2a58f" tooltip="line3001 testdata/file3000.src:2 -> line1000 testdata/file1000.src:1 (3.91MB)" labeltooltip="line3001 testdata/file3000.src:2 -> line1000 testdata/file1000.src:1 (3.91MB)"] +N2 -> N3 [label=" 0.98MB" color="#b2b0a9" tooltip="line2001 testdata/file2000.src:2 -> line1000 testdata/file1000.src:1 (0.98MB)" labeltooltip="line2001 testdata/file2000.src:2 -> line1000 testdata/file1000.src:1 (0.98MB)" minlen=2] +N5 -> N4 [label=" 0.98MB\n (inline)" color="#b2b0a9" tooltip="line3001 testdata/file3000.src:2 -> line3002 testdata/file3000.src:3 (0.98MB)" labeltooltip="line3001 testdata/file3000.src:2 -> line3002 testdata/file3000.src:3 (0.98MB)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags new file mode 100644 index 00000000..630e452a --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags @@ -0,0 +1,6 @@ + bytes: Total 98.6MB + 62.5MB (63.37%): 1.56MB + 31.2MB (31.68%): 400kB + 3.9MB ( 3.96%): 200kB + 1000.0kB ( 0.99%): 100kB + diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags.unit b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags.unit new file mode 100644 index 00000000..5e565fc0 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap.tags.unit @@ -0,0 +1,6 @@ + bytes: Total 103424000.0B + 65536000.0B (63.37%): 1638400B + 32768000.0B (31.68%): 409600B + 4096000.0B ( 3.96%): 204800B + 1024000.0B ( 0.99%): 102400B + diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text new file mode 100644 index 00000000..929461a3 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text @@ -0,0 +1,8 @@ +Showing nodes accounting for 150, 100% of 150 total + flat flat% sum% cum cum% + 80 53.33% 53.33% 130 86.67% line3002 (inline) + 40 26.67% 80.00% 50 33.33% line2001 (inline) + 30 20.00% 100% 30 20.00% line1000 + 0 0% 100% 50 33.33% line2000 + 0 0% 100% 150 100% line3000 + 0 0% 100% 110 73.33% line3001 (inline) diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot new file mode 100644 index 00000000..152f5509 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot @@ -0,0 +1,14 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lActive filters:\l tagshow=[2]00\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" id="node1" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"] +N2 [label="line3000\n0 of 98.63MB (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] +N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node3" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +N4 [label="line2000\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +N5 [label="line3001\n0 of 36.13MB (36.63%)" id="node5" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] +N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"] +N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)"] +N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] +N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] +N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus new file mode 100644 index 00000000..e59deef2 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus @@ -0,0 +1,18 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lActive filters:\l focus=[234]00\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" id="node1" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"] +NN1_0 [label = "400kB" id="NN1_0" fontsize=8 shape=box3d tooltip="31.25MB"] +N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] +N2 [label="line3000\n0 of 98.63MB (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] +N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node3" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +NN3_0 [label = "1.56MB" id="NN3_0" fontsize=8 shape=box3d tooltip="62.50MB"] +N3 -> NN3_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] +N4 [label="line2000\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +N5 [label="line3001\n0 of 36.13MB (36.63%)" id="node5" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] +N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"] +N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)" minlen=2] +N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] +N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] +N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide new file mode 100644 index 00000000..25250f02 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide @@ -0,0 +1,11 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lActive filters:\l hide=line.*1?23?\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line3000\n62.50MB (63.37%)\nof 98.63MB (100%)" id="node1" fontsize=24 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] +NN1_0 [label = "1.56MB" id="NN1_0" fontsize=8 shape=box3d tooltip="62.50MB"] +N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] +N2 [label="line3001\n31.25MB (31.68%)\nof 36.13MB (36.63%)" id="node2" fontsize=20 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] +NN2_0 [label = "400kB" id="NN2_0" fontsize=8 shape=box3d tooltip="31.25MB"] +N2 -> NN2_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] +N1 -> N2 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)" minlen=2] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_request.tags.focus b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_request.tags.focus new file mode 100644 index 00000000..b1a5f444 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_request.tags.focus @@ -0,0 +1,8 @@ + bytes: Total 93.8MB + 62.5MB (66.67%): 1.56MB + 31.2MB (33.33%): 400kB + + request: Total 93.8MB + 62.5MB (66.67%): 1.56MB + 31.2MB (33.33%): 400kB + diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_sizetags.dot b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_sizetags.dot new file mode 100644 index 00000000..fb31559c --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_sizetags.dot @@ -0,0 +1,30 @@ +digraph "unnamed" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l\lSee https://git.io/JfYMW for how to read the graph\l"] } +N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" id="node1" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"] +NN1_0 [label = "16B..64B" id="NN1_0" fontsize=8 shape=box3d tooltip="93.75MB"] +N1 -> NN1_0 [label=" 93.75MB" weight=100 tooltip="93.75MB" labeltooltip="93.75MB"] +NN1_1 [label = "2B..8B" id="NN1_1" fontsize=8 shape=box3d tooltip="93.75MB"] +N1 -> NN1_1 [label=" 93.75MB" weight=100 tooltip="93.75MB" labeltooltip="93.75MB"] +NN1_2 [label = "256B..1.56MB" id="NN1_2" fontsize=8 shape=box3d tooltip="62.50MB"] +N1 -> NN1_2 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] +NN1_3 [label = "128B" id="NN1_3" fontsize=8 shape=box3d tooltip="31.25MB"] +N1 -> NN1_3 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] +N2 [label="line3000\n0 of 98.63MB (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] +N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node3" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +NN3_0 [label = "16B..64B" id="NN3_0" fontsize=8 shape=box3d tooltip="190.43MB"] +N3 -> NN3_0 [label=" 190.43MB" weight=100 tooltip="190.43MB" labeltooltip="190.43MB" style="dotted"] +NN3_1 [label = "2B..8B" id="NN3_1" fontsize=8 shape=box3d tooltip="190.43MB"] +N3 -> NN3_1 [label=" 190.43MB" weight=100 tooltip="190.43MB" labeltooltip="190.43MB" style="dotted"] +NN3_2 [label = "256B..1.56MB" id="NN3_2" fontsize=8 shape=box3d tooltip="125.98MB"] +N3 -> NN3_2 [label=" 125.98MB" weight=100 tooltip="125.98MB" labeltooltip="125.98MB" style="dotted"] +NN3_3 [label = "128B" id="NN3_3" fontsize=8 shape=box3d tooltip="63.48MB"] +N3 -> NN3_3 [label=" 63.48MB" weight=100 tooltip="63.48MB" labeltooltip="63.48MB" style="dotted"] +N4 [label="line2000\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] +N5 [label="line3001\n0 of 36.13MB (36.63%)" id="node5" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] +N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"] +N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)" minlen=2] +N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] +N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] +N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.heap_tags.traces b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_tags.traces new file mode 100644 index 00000000..694b4b2c --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.heap_tags.traces @@ -0,0 +1,32 @@ +Build ID: buildid +comment +Type: inuse_space +-----------+------------------------------------------------------- + key1: tag + bytes: 100kB + request: 100kB + 1000kB line1000 + line2001 (inline) + line2000 + line3002 (inline) + line3001 (inline) + line3000 +-----------+------------------------------------------------------- + bytes: 200kB + 3.91MB line1000 + line3001 (inline) + line3000 +-----------+------------------------------------------------------- + key1: tag + bytes: 1.56MB + request: 1.56MB + 62.50MB line2001 (inline) + line2000 + line3002 (inline) + line3000 +-----------+------------------------------------------------------- + bytes: 400kB + 31.25MB line3002 (inline) + line3001 (inline) + line3000 +-----------+------------------------------------------------------- diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.dot b/plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.dot new file mode 100644 index 00000000..dfc2142f --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.dot @@ -0,0 +1,9 @@ +digraph "testbinary" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.11s (11.10%)\lShowing nodes accounting for 1.11s, 100% of 1.11s total\l\lSee https://git.io/JfYMW for how to read the graph\l" tooltip="testbinary"] } +N1 [label="package1\nobject\nfunction1\n1.10s (99.10%)" id="node1" fontsize=24 shape=box tooltip="path/to/package1.object.function1 (1.10s)" color="#b20000" fillcolor="#edd5d5"] +N2 [label="FooBar\nrun\n0.01s (0.9%)\nof 1.01s (90.99%)" id="node2" fontsize=10 shape=box tooltip="java.bar.foo.FooBar.run(java.lang.Runnable) (1.01s)" color="#b20400" fillcolor="#edd6d5"] +N3 [label="Bar\nFoo\n0 of 1.10s (99.10%)" id="node3" fontsize=8 shape=box tooltip="(anonymous namespace)::Bar::Foo (1.10s)" color="#b20000" fillcolor="#edd5d5"] +N3 -> N1 [label=" 1.10s" weight=100 penwidth=5 color="#b20000" tooltip="(anonymous namespace)::Bar::Foo -> path/to/package1.object.function1 (1.10s)" labeltooltip="(anonymous namespace)::Bar::Foo -> path/to/package1.object.function1 (1.10s)"] +N2 -> N3 [label=" 1s" weight=91 penwidth=5 color="#b20500" tooltip="java.bar.foo.FooBar.run(java.lang.Runnable) -> (anonymous namespace)::Bar::Foo (1s)" labeltooltip="java.bar.foo.FooBar.run(java.lang.Runnable) -> (anonymous namespace)::Bar::Foo (1s)"] +} diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.text b/plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.text new file mode 100644 index 00000000..39cb24ed --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.long_name_funcs.text @@ -0,0 +1,5 @@ +Showing nodes accounting for 1.11s, 100% of 1.11s total + flat flat% sum% cum cum% + 1.10s 99.10% 99.10% 1.10s 99.10% path/to/package1.object.function1 + 0.01s 0.9% 100% 1.01s 90.99% java.bar.foo.FooBar.run(java.lang.Runnable) + 0 0% 100% 1.10s 99.10% (anonymous namespace)::Bar::Foo diff --git a/plugin/debug/pkg/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text b/plugin/debug/pkg/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text new file mode 100644 index 00000000..78a2298f --- /dev/null +++ b/plugin/debug/pkg/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text @@ -0,0 +1,8 @@ +Showing nodes accounting for 1.12s, 100% of 1.12s total +Showing top 5 nodes out of 6 + flat flat% sum% cum cum% + 1.10s 98.21% 98.21% 1.10s 98.21% line1000 + 0.01s 0.89% 99.11% 1.01s 90.18% line2001 (inline) + 0.01s 0.89% 100% 1.02s 91.07% line3002 (inline) + 0 0% 100% 1.01s 90.18% line2000 + 0 0% 100% 1.12s 100% line3000 diff --git a/plugin/debug/pkg/internal/driver/webhtml.go b/plugin/debug/pkg/internal/driver/webhtml.go new file mode 100644 index 00000000..62cf628b --- /dev/null +++ b/plugin/debug/pkg/internal/driver/webhtml.go @@ -0,0 +1,85 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "embed" + "fmt" + "html/template" + "os" + "sync" + + "m7s.live/v5/plugin/debug/pkg/internal/report" +) + +var ( + htmlTemplates *template.Template // Lazily loaded templates + htmlTemplateInit sync.Once +) + +// getHTMLTemplates returns the set of HTML templates used by pprof, +// initializing them if necessary. +func getHTMLTemplates() *template.Template { + htmlTemplateInit.Do(func() { + htmlTemplates = template.New("templategroup") + addTemplates(htmlTemplates) + report.AddSourceTemplates(htmlTemplates) + }) + return htmlTemplates +} + +//go:embed html +var embeddedFiles embed.FS + +// addTemplates adds a set of template definitions to templates. +func addTemplates(templates *template.Template) { + // Load specified file. + loadFile := func(fname string) string { + data, err := embeddedFiles.ReadFile(fname) + if err != nil { + fmt.Fprintf(os.Stderr, "internal/driver: embedded file %q not found\n", + fname) + os.Exit(1) + } + return string(data) + } + loadCSS := func(fname string) string { + return `` + "\n" + } + loadJS := func(fname string) string { + return `` + "\n" + } + + // Define a named template with specified contents. + def := func(name, contents string) { + sub := template.New(name) + template.Must(sub.Parse(contents)) + template.Must(templates.AddParseTree(name, sub.Tree)) + } + + // Embedded files. + def("css", loadCSS("html/common.css")) + def("header", loadFile("html/header.html")) + def("graph", loadFile("html/graph.html")) + def("graph_css", loadCSS("html/graph.css")) + def("script", loadJS("html/common.js")) + def("top", loadFile("html/top.html")) + def("sourcelisting", loadFile("html/source.html")) + def("plaintext", loadFile("html/plaintext.html")) + // TODO: Rename "stacks" to "flamegraph" to seal moving off d3 flamegraph. + def("stacks", loadFile("html/stacks.html")) + def("stacks_css", loadCSS("html/stacks.css")) + def("stacks_js", loadJS("html/stacks.js")) +} diff --git a/plugin/debug/pkg/internal/driver/webui.go b/plugin/debug/pkg/internal/driver/webui.go new file mode 100644 index 00000000..8f5697c1 --- /dev/null +++ b/plugin/debug/pkg/internal/driver/webui.go @@ -0,0 +1,483 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "bytes" + "fmt" + "html/template" + "io" + "net" + "net/http" + gourl "net/url" + "os" + "os/exec" + "strconv" + "strings" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/graph" + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/report" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// webInterface holds the state needed for serving a browser based interface. +type webInterface struct { + prof *profile.Profile + copier profileCopier + options *plugin.Options + help map[string]string + settingsFile string +} + +func makeWebInterface(p *profile.Profile, copier profileCopier, opt *plugin.Options) (*webInterface, error) { + settingsFile, err := settingsFileName() + if err != nil { + return nil, err + } + return &webInterface{ + prof: p, + copier: copier, + options: opt, + help: make(map[string]string), + settingsFile: settingsFile, + }, nil +} + +// maxEntries is the maximum number of entries to print for text interfaces. +const maxEntries = 50 + +// errorCatcher is a UI that captures errors for reporting to the browser. +type errorCatcher struct { + plugin.UI + errors []string +} + +func (ec *errorCatcher) PrintErr(args ...interface{}) { + ec.errors = append(ec.errors, strings.TrimSuffix(fmt.Sprintln(args...), "\n")) + ec.UI.PrintErr(args...) +} + +// webArgs contains arguments passed to templates in webhtml.go. +type webArgs struct { + Title string + Errors []string + Total int64 + SampleTypes []string + Legend []string + DocURL string + Standalone bool // True for command-line generation of HTML + Help map[string]string + Nodes []string + HTMLBody template.HTML + TextBody string + Top []report.TextItem + Listing report.WebListData + FlameGraph template.JS + Stacks template.JS + Configs []configMenuEntry + UnitDefs []measurement.UnitType +} + +func serveWebInterface(hostport string, p *profile.Profile, o *plugin.Options, disableBrowser bool) error { + host, port, err := getHostAndPort(hostport) + if err != nil { + return err + } + interactiveMode = true + copier := makeProfileCopier(p) + ui, err := makeWebInterface(p, copier, o) + if err != nil { + return err + } + for n, c := range pprofCommands { + ui.help[n] = c.description + } + for n, help := range configHelp { + ui.help[n] = help + } + ui.help["details"] = "Show information about the profile and this view" + ui.help["graph"] = "Display profile as a directed graph" + ui.help["flamegraph"] = "Display profile as a flame graph" + ui.help["reset"] = "Show the entire profile" + ui.help["save_config"] = "Save current settings" + + server := o.HTTPServer + if server == nil { + server = defaultWebServer + } + args := &plugin.HTTPServerArgs{ + Hostport: net.JoinHostPort(host, strconv.Itoa(port)), + Host: host, + Port: port, + Handlers: map[string]http.Handler{ + "/": http.HandlerFunc(ui.dot), + "/top": http.HandlerFunc(ui.top), + "/disasm": http.HandlerFunc(ui.disasm), + "/source": http.HandlerFunc(ui.source), + "/peek": http.HandlerFunc(ui.peek), + "/flamegraph": http.HandlerFunc(ui.stackView), + "/flamegraph2": redirectWithQuery("flamegraph", http.StatusMovedPermanently), // Keep legacy URL working. + "/flamegraphold": redirectWithQuery("flamegraph", http.StatusMovedPermanently), // Keep legacy URL working. + "/saveconfig": http.HandlerFunc(ui.saveConfig), + "/deleteconfig": http.HandlerFunc(ui.deleteConfig), + "/download": http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/vnd.google.protobuf+gzip") + w.Header().Set("Content-Disposition", "attachment;filename=profile.pb.gz") + p.Write(w) + }), + }, + } + + url := "http://" + args.Hostport + + o.UI.Print("Serving web UI on ", url) + + if o.UI.WantBrowser() && !disableBrowser { + go openBrowser(url, o) + } + return server(args) +} + +func getHostAndPort(hostport string) (string, int, error) { + host, portStr, err := net.SplitHostPort(hostport) + if err != nil { + return "", 0, fmt.Errorf("could not split http address: %v", err) + } + if host == "" { + host = "localhost" + } + var port int + if portStr == "" { + ln, err := net.Listen("tcp", net.JoinHostPort(host, "0")) + if err != nil { + return "", 0, fmt.Errorf("could not generate random port: %v", err) + } + port = ln.Addr().(*net.TCPAddr).Port + err = ln.Close() + if err != nil { + return "", 0, fmt.Errorf("could not generate random port: %v", err) + } + } else { + port, err = strconv.Atoi(portStr) + if err != nil { + return "", 0, fmt.Errorf("invalid port number: %v", err) + } + } + return host, port, nil +} +func defaultWebServer(args *plugin.HTTPServerArgs) error { + ln, err := net.Listen("tcp", args.Hostport) + if err != nil { + return err + } + isLocal := isLocalhost(args.Host) + handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if isLocal { + // Only allow local clients + host, _, err := net.SplitHostPort(req.RemoteAddr) + if err != nil || !isLocalhost(host) { + http.Error(w, "permission denied", http.StatusForbidden) + return + } + } + h := args.Handlers[req.URL.Path] + if h == nil { + // Fall back to default behavior + h = http.DefaultServeMux + } + h.ServeHTTP(w, req) + }) + + // We serve the ui at /ui/ and redirect there from the root. This is done + // to surface any problems with serving the ui at a non-root early. See: + // + // https://m7s.live/v5/plugin/debug/pkg/pull/348 + mux := http.NewServeMux() + mux.Handle("/ui/", http.StripPrefix("/ui", handler)) + mux.Handle("/", redirectWithQuery("/ui", http.StatusTemporaryRedirect)) + s := &http.Server{Handler: mux} + return s.Serve(ln) +} + +// redirectWithQuery responds with a given redirect code, preserving query +// parameters in the redirect URL. It does not convert relative paths to +// absolute paths like http.Redirect does, so that HTTPServerArgs.Handlers can +// generate relative redirects that work with the external prefixing. +func redirectWithQuery(path string, code int) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + pathWithQuery := &gourl.URL{Path: path, RawQuery: r.URL.RawQuery} + w.Header().Set("Location", pathWithQuery.String()) + w.WriteHeader(code) + } +} + +func isLocalhost(host string) bool { + for _, v := range []string{"localhost", "127.0.0.1", "[::1]", "::1"} { + if host == v { + return true + } + } + return false +} + +func openBrowser(url string, o *plugin.Options) { + // Construct URL. + baseURL, _ := gourl.Parse(url) + current := currentConfig() + u, _ := current.makeURL(*baseURL) + + // Give server a little time to get ready. + time.Sleep(time.Millisecond * 500) + + for _, b := range browsers() { + args := strings.Split(b, " ") + if len(args) == 0 { + continue + } + viewer := exec.Command(args[0], append(args[1:], u.String())...) + viewer.Stderr = os.Stderr + if err := viewer.Start(); err == nil { + return + } + } + // No visualizer succeeded, so just print URL. + o.UI.PrintErr(u.String()) +} + +// makeReport generates a report for the specified command. +// If configEditor is not null, it is used to edit the config used for the report. +func (ui *webInterface) makeReport(w http.ResponseWriter, req *http.Request, + cmd []string, configEditor func(*config)) (*report.Report, []string) { + cfg := currentConfig() + if err := cfg.applyURL(req.URL.Query()); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return nil, nil + } + if configEditor != nil { + configEditor(&cfg) + } + catcher := &errorCatcher{UI: ui.options.UI} + options := *ui.options + options.UI = catcher + _, rpt, err := generateRawReport(ui.copier.newCopy(), cmd, cfg, &options) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return nil, nil + } + return rpt, catcher.errors +} + +// renderHTML generates html using the named template based on the contents of data. +func renderHTML(dst io.Writer, tmpl string, rpt *report.Report, errList, legend []string, data webArgs) error { + file := getFromLegend(legend, "File: ", "unknown") + profile := getFromLegend(legend, "Type: ", "unknown") + data.Title = file + " " + profile + data.Errors = errList + data.Total = rpt.Total() + data.DocURL = rpt.DocURL() + data.Legend = legend + return getHTMLTemplates().ExecuteTemplate(dst, tmpl, data) +} + +// render responds with html generated by passing data to the named template. +func (ui *webInterface) render(w http.ResponseWriter, req *http.Request, tmpl string, + rpt *report.Report, errList, legend []string, data webArgs) { + data.SampleTypes = sampleTypes(ui.prof) + data.Help = ui.help + data.Configs = configMenu(ui.settingsFile, *req.URL) + html := &bytes.Buffer{} + if err := renderHTML(html, tmpl, rpt, errList, legend, data); err != nil { + http.Error(w, "internal template error", http.StatusInternalServerError) + ui.options.UI.PrintErr(err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Write(html.Bytes()) +} + +// dot generates a web page containing an svg diagram. +func (ui *webInterface) dot(w http.ResponseWriter, req *http.Request) { + rpt, errList := ui.makeReport(w, req, []string{"svg"}, nil) + if rpt == nil { + return // error already reported + } + + // Generate dot graph. + g, config := report.GetDOT(rpt) + legend := config.Labels + config.Labels = nil + dot := &bytes.Buffer{} + graph.ComposeDot(dot, g, &graph.DotAttributes{}, config) + + // Convert to svg. + svg, err := dotToSvg(dot.Bytes()) + if err != nil { + http.Error(w, "Could not execute dot; may need to install graphviz.", + http.StatusNotImplemented) + ui.options.UI.PrintErr("Failed to execute dot. Is Graphviz installed?\n", err) + return + } + + // Get all node names into an array. + nodes := []string{""} // dot starts with node numbered 1 + for _, n := range g.Nodes { + nodes = append(nodes, n.Info.Name) + } + + ui.render(w, req, "graph", rpt, errList, legend, webArgs{ + HTMLBody: template.HTML(string(svg)), + Nodes: nodes, + }) +} + +func dotToSvg(dot []byte) ([]byte, error) { + cmd := exec.Command("dot", "-Tsvg") + out := &bytes.Buffer{} + cmd.Stdin, cmd.Stdout, cmd.Stderr = bytes.NewBuffer(dot), out, os.Stderr + if err := cmd.Run(); err != nil { + return nil, err + } + + // Fix dot bug related to unquoted ampersands. + svg := bytes.Replace(out.Bytes(), []byte("&;"), []byte("&;"), -1) + + // Cleanup for embedding by dropping stuff before the start. + if pos := bytes.Index(svg, []byte("= 0 { + svg = svg[pos:] + } + return svg, nil +} + +func (ui *webInterface) top(w http.ResponseWriter, req *http.Request) { + rpt, errList := ui.makeReport(w, req, []string{"top"}, func(cfg *config) { + cfg.NodeCount = 500 + }) + if rpt == nil { + return // error already reported + } + top, legend := report.TextItems(rpt) + var nodes []string + for _, item := range top { + nodes = append(nodes, item.Name) + } + + ui.render(w, req, "top", rpt, errList, legend, webArgs{ + Top: top, + Nodes: nodes, + }) +} + +// disasm generates a web page containing disassembly. +func (ui *webInterface) disasm(w http.ResponseWriter, req *http.Request) { + args := []string{"disasm", req.URL.Query().Get("f")} + rpt, errList := ui.makeReport(w, req, args, nil) + if rpt == nil { + return // error already reported + } + + out := &bytes.Buffer{} + if err := report.PrintAssembly(out, rpt, ui.options.Obj, maxEntries); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return + } + + legend := report.ProfileLabels(rpt) + ui.render(w, req, "plaintext", rpt, errList, legend, webArgs{ + TextBody: out.String(), + }) + +} + +// source generates a web page containing source code annotated with profile +// data. +func (ui *webInterface) source(w http.ResponseWriter, req *http.Request) { + args := []string{"weblist", req.URL.Query().Get("f")} + rpt, errList := ui.makeReport(w, req, args, nil) + if rpt == nil { + return // error already reported + } + + // Generate source listing. + listing, err := report.MakeWebList(rpt, ui.options.Obj, maxEntries) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return + } + + legend := report.ProfileLabels(rpt) + ui.render(w, req, "sourcelisting", rpt, errList, legend, webArgs{ + Listing: listing, + }) +} + +// peek generates a web page listing callers/callers. +func (ui *webInterface) peek(w http.ResponseWriter, req *http.Request) { + args := []string{"peek", req.URL.Query().Get("f")} + rpt, errList := ui.makeReport(w, req, args, func(cfg *config) { + cfg.Granularity = "lines" + }) + if rpt == nil { + return // error already reported + } + + out := &bytes.Buffer{} + if err := report.Generate(out, rpt, ui.options.Obj); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return + } + + legend := report.ProfileLabels(rpt) + ui.render(w, req, "plaintext", rpt, errList, legend, webArgs{ + TextBody: out.String(), + }) +} + +// saveConfig saves URL configuration. +func (ui *webInterface) saveConfig(w http.ResponseWriter, req *http.Request) { + if err := setConfig(ui.settingsFile, *req.URL); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return + } +} + +// deleteConfig deletes a configuration. +func (ui *webInterface) deleteConfig(w http.ResponseWriter, req *http.Request) { + name := req.URL.Query().Get("config") + if err := removeConfig(ui.settingsFile, name); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + ui.options.UI.PrintErr(err) + return + } +} + +// getFromLegend returns the suffix of an entry in legend that starts +// with param. It returns def if no such entry is found. +func getFromLegend(legend []string, param, def string) string { + for _, s := range legend { + if strings.HasPrefix(s, param) { + return s[len(param):] + } + } + return def +} diff --git a/plugin/debug/pkg/internal/driver/webui_test.go b/plugin/debug/pkg/internal/driver/webui_test.go new file mode 100644 index 00000000..8c42303d --- /dev/null +++ b/plugin/debug/pkg/internal/driver/webui_test.go @@ -0,0 +1,332 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "fmt" + "io" + "net" + "net/http" + "net/http/httptest" + "net/url" + "os/exec" + "regexp" + "runtime" + "sync" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func makeTestServer(t testing.TB, prof *profile.Profile) *httptest.Server { + if runtime.GOOS == "nacl" || runtime.GOOS == "js" { + t.Skip("test assumes tcp available") + } + + // Custom http server creator + var server *httptest.Server + serverCreated := make(chan bool) + creator := func(a *plugin.HTTPServerArgs) error { + server = httptest.NewServer(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + if h := a.Handlers[r.URL.Path]; h != nil { + h.ServeHTTP(w, r) + } + })) + serverCreated <- true + return nil + } + + // Start server and wait for it to be initialized + go serveWebInterface("unused:1234", prof, &plugin.Options{ + Obj: fakeObjTool{}, + UI: &proftest.TestUI{T: t}, + HTTPServer: creator, + }, false) + <-serverCreated + + // Close the server when the test is done. + t.Cleanup(server.Close) + + return server +} + +func TestWebInterface(t *testing.T) { + prof := makeFakeProfile() + server := makeTestServer(t, prof) + haveDot := false + if _, err := exec.LookPath("dot"); err == nil { + haveDot = true + } + + type testCase struct { + path string + want []string + needDot bool + } + testcases := []testCase{ + {"/", []string{"F1", "F2", "F3", "testbin", "cpu"}, true}, + {"/top", []string{`"Name":"F2","InlineLabel":"","Flat":200,"Cum":300,"FlatFormat":"200ms","CumFormat":"300ms"}`}, false}, + {"/source?f=" + url.QueryEscape("F[12]"), []string{ + "F1", + "F2", + `\. +300ms .*f1:asm`, // Cumulative count for F1 + "200ms +300ms .*f2:asm", // Flat + cumulative count for F2 + }, false}, + {"/peek?f=" + url.QueryEscape("F[12]"), + []string{"300ms.*F1", "200ms.*300ms.*F2"}, false}, + {"/disasm?f=" + url.QueryEscape("F[12]"), + []string{"f1:asm", "f2:asm"}, false}, + {"/flamegraph", []string{ + "File: testbin", + // Check that interesting frames are included. + `\bF1\b`, + `\bF2\b`, + // Check new view JS is included. + `function stackViewer`, + // Check new view CSS is included. + "#stack-chart {", + }, false}, + } + for _, c := range testcases { + if c.needDot && !haveDot { + t.Log("skipping", c.path, "since dot (graphviz) does not seem to be installed") + continue + } + res, err := http.Get(server.URL + c.path) + if err != nil { + t.Error("could not fetch", c.path, err) + continue + } + data, err := io.ReadAll(res.Body) + if err != nil { + t.Error("could not read response", c.path, err) + continue + } + result := string(data) + for _, w := range c.want { + if match, _ := regexp.MatchString(w, result); !match { + t.Errorf("response for %s does not match "+ + "expected pattern '%s'; "+ + "actual result:\n%s", c.path, w, result) + } + } + } + + // Also fetch all the test case URLs in parallel to test thread + // safety when run under the race detector. + var wg sync.WaitGroup + for _, c := range testcases { + if c.needDot && !haveDot { + continue + } + path := server.URL + c.path + for count := 0; count < 2; count++ { + wg.Add(1) + go func() { + defer wg.Done() + res, err := http.Get(path) + if err != nil { + t.Error("could not fetch", path, err) + return + } + if _, err = io.ReadAll(res.Body); err != nil { + t.Error("could not read response", path, err) + } + }() + } + } + wg.Wait() +} + +// Implement fake object file support. + +const addrBase = 0x1000 +const fakeSource = "testdata/file1000.src" + +type fakeObj struct{} + +func (f fakeObj) Close() error { return nil } +func (f fakeObj) Name() string { return "testbin" } +func (f fakeObj) ObjAddr(addr uint64) (uint64, error) { return addr, nil } +func (f fakeObj) BuildID() string { return "" } +func (f fakeObj) SourceLine(addr uint64) ([]plugin.Frame, error) { + return nil, fmt.Errorf("SourceLine unimplemented") +} +func (f fakeObj) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { + return []*plugin.Sym{ + { + Name: []string{"F1"}, File: fakeSource, + Start: addrBase, End: addrBase + 10, + }, + { + Name: []string{"F2"}, File: fakeSource, + Start: addrBase + 10, End: addrBase + 20, + }, + { + Name: []string{"F3"}, File: fakeSource, + Start: addrBase + 20, End: addrBase + 30, + }, + }, nil +} + +type fakeObjTool struct{} + +func (obj fakeObjTool) Open(file string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { + return fakeObj{}, nil +} + +func (obj fakeObjTool) Disasm(file string, start, end uint64, intelSyntax bool) ([]plugin.Inst, error) { + return []plugin.Inst{ + {Addr: addrBase + 10, Text: "f1:asm", Function: "F1", Line: 3}, + {Addr: addrBase + 20, Text: "f2:asm", Function: "F2", Line: 11}, + {Addr: addrBase + 30, Text: "d3:asm", Function: "F3", Line: 22}, + }, nil +} + +func makeFakeProfile() *profile.Profile { + // Three functions: F1, F2, F3 with three lines, 11, 22, 33. + funcs := []*profile.Function{ + {ID: 1, Name: "F1", Filename: fakeSource, StartLine: 3}, + {ID: 2, Name: "F2", Filename: fakeSource, StartLine: 5}, + {ID: 3, Name: "F3", Filename: fakeSource, StartLine: 7}, + } + lines := []profile.Line{ + {Function: funcs[0], Line: 11}, + {Function: funcs[1], Line: 22}, + {Function: funcs[2], Line: 33}, + } + mapping := []*profile.Mapping{ + { + ID: 1, + Start: addrBase, + Limit: addrBase + 100, + Offset: 0, + File: "testbin", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + }, + } + + // Three interesting addresses: base+{10,20,30} + locs := []*profile.Location{ + {ID: 1, Address: addrBase + 10, Line: lines[0:1], Mapping: mapping[0]}, + {ID: 2, Address: addrBase + 20, Line: lines[1:2], Mapping: mapping[0]}, + {ID: 3, Address: addrBase + 30, Line: lines[2:3], Mapping: mapping[0]}, + } + + // Two stack traces. + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{locs[2], locs[1], locs[0]}, + Value: []int64{100}, + }, + { + Location: []*profile.Location{locs[1], locs[0]}, + Value: []int64{200}, + }, + }, + Location: locs, + Function: funcs, + Mapping: mapping, + } +} + +func TestGetHostAndPort(t *testing.T) { + if runtime.GOOS == "nacl" || runtime.GOOS == "js" { + t.Skip("test assumes tcp available") + } + + type testCase struct { + hostport string + wantHost string + wantPort int + wantRandomPort bool + } + + testCases := []testCase{ + {":", "localhost", 0, true}, + {":4681", "localhost", 4681, false}, + {"localhost:4681", "localhost", 4681, false}, + } + for _, tc := range testCases { + host, port, err := getHostAndPort(tc.hostport) + if err != nil { + t.Errorf("could not get host and port for %q: %v", tc.hostport, err) + } + if got, want := host, tc.wantHost; got != want { + t.Errorf("for %s, got host %s, want %s", tc.hostport, got, want) + continue + } + if !tc.wantRandomPort { + if got, want := port, tc.wantPort; got != want { + t.Errorf("for %s, got port %d, want %d", tc.hostport, got, want) + continue + } + } + } +} + +func TestIsLocalHost(t *testing.T) { + for _, s := range []string{"localhost:10000", "[::1]:10000", "127.0.0.1:10000"} { + host, _, err := net.SplitHostPort(s) + if err != nil { + t.Error("unexpected error when splitting", s) + continue + } + if !isLocalhost(host) { + t.Errorf("host %s from %s not considered local", host, s) + } + } +} + +func BenchmarkTop(b *testing.B) { benchmarkURL(b, "/top", false) } +func BenchmarkFlame(b *testing.B) { benchmarkURL(b, "/flamegraph", false) } +func BenchmarkDot(b *testing.B) { benchmarkURL(b, "/", true) } + +func benchmarkURL(b *testing.B, path string, needDot bool) { + if needDot { + if _, err := exec.LookPath("dot"); err != nil { + b.Skip("dot not available") + } + } + prof := largeProfile(b) + server := makeTestServer(b, prof) + url := server.URL + path + b.ResetTimer() + for i := 0; i < b.N; i++ { + res, err := http.Get(url) + if err != nil { + b.Fatal(err) + } + data, err := io.ReadAll(res.Body) + if err != nil { + b.Fatal(err) + } + if i == 0 && testing.Verbose() { + b.Logf("%-12s : %10d bytes", path, len(data)) + } + } +} diff --git a/plugin/debug/pkg/internal/elfexec/elfexec.go b/plugin/debug/pkg/internal/elfexec/elfexec.go new file mode 100644 index 00000000..3f5b09b5 --- /dev/null +++ b/plugin/debug/pkg/internal/elfexec/elfexec.go @@ -0,0 +1,378 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package elfexec provides utility routines to examine ELF binaries. +package elfexec + +import ( + "bufio" + "debug/elf" + "encoding/binary" + "fmt" + "io" +) + +const ( + maxNoteSize = 1 << 20 // in bytes + noteTypeGNUBuildID = 3 +) + +// elfNote is the payload of a Note Section in an ELF file. +type elfNote struct { + Name string // Contents of the "name" field, omitting the trailing zero byte. + Desc []byte // Contents of the "desc" field. + Type uint32 // Contents of the "type" field. +} + +// parseNotes returns the notes from a SHT_NOTE section or PT_NOTE segment. +func parseNotes(reader io.Reader, alignment int, order binary.ByteOrder) ([]elfNote, error) { + r := bufio.NewReader(reader) + + // padding returns the number of bytes required to pad the given size to an + // alignment boundary. + padding := func(size int) int { + return ((size + (alignment - 1)) &^ (alignment - 1)) - size + } + + var notes []elfNote + for { + noteHeader := make([]byte, 12) // 3 4-byte words + if _, err := io.ReadFull(r, noteHeader); err == io.EOF { + break + } else if err != nil { + return nil, err + } + namesz := order.Uint32(noteHeader[0:4]) + descsz := order.Uint32(noteHeader[4:8]) + typ := order.Uint32(noteHeader[8:12]) + + if uint64(namesz) > uint64(maxNoteSize) { + return nil, fmt.Errorf("note name too long (%d bytes)", namesz) + } + var name string + if namesz > 0 { + // Documentation differs as to whether namesz is meant to include the + // trailing zero, but everyone agrees that name is null-terminated. + // So we'll just determine the actual length after the fact. + var err error + name, err = r.ReadString('\x00') + if err == io.EOF { + return nil, fmt.Errorf("missing note name (want %d bytes)", namesz) + } else if err != nil { + return nil, err + } + namesz = uint32(len(name)) + name = name[:len(name)-1] + } + + // Drop padding bytes until the desc field. + for n := padding(len(noteHeader) + int(namesz)); n > 0; n-- { + if _, err := r.ReadByte(); err == io.EOF { + return nil, fmt.Errorf( + "missing %d bytes of padding after note name", n) + } else if err != nil { + return nil, err + } + } + + if uint64(descsz) > uint64(maxNoteSize) { + return nil, fmt.Errorf("note desc too long (%d bytes)", descsz) + } + desc := make([]byte, int(descsz)) + if _, err := io.ReadFull(r, desc); err == io.EOF { + return nil, fmt.Errorf("missing desc (want %d bytes)", len(desc)) + } else if err != nil { + return nil, err + } + + notes = append(notes, elfNote{Name: name, Desc: desc, Type: typ}) + + // Drop padding bytes until the next note or the end of the section, + // whichever comes first. + for n := padding(len(desc)); n > 0; n-- { + if _, err := r.ReadByte(); err == io.EOF { + // We hit the end of the section before an alignment boundary. + // This can happen if this section is at the end of the file or the next + // section has a smaller alignment requirement. + break + } else if err != nil { + return nil, err + } + } + } + return notes, nil +} + +// GetBuildID returns the GNU build-ID for an ELF binary. +// +// If no build-ID was found but the binary was read without error, it returns +// (nil, nil). +func GetBuildID(f *elf.File) ([]byte, error) { + findBuildID := func(notes []elfNote) ([]byte, error) { + var buildID []byte + for _, note := range notes { + if note.Name == "GNU" && note.Type == noteTypeGNUBuildID { + if buildID == nil { + buildID = note.Desc + } else { + return nil, fmt.Errorf("multiple build ids found, don't know which to use") + } + } + } + return buildID, nil + } + + for _, p := range f.Progs { + if p.Type != elf.PT_NOTE { + continue + } + notes, err := parseNotes(p.Open(), int(p.Align), f.ByteOrder) + if err != nil { + return nil, err + } + if b, err := findBuildID(notes); b != nil || err != nil { + return b, err + } + } + for _, s := range f.Sections { + if s.Type != elf.SHT_NOTE { + continue + } + notes, err := parseNotes(s.Open(), int(s.Addralign), f.ByteOrder) + if err != nil { + return nil, err + } + if b, err := findBuildID(notes); b != nil || err != nil { + return b, err + } + } + return nil, nil +} + +// kernelBase calculates the base for kernel mappings, which usually require +// special handling. For kernel mappings, tools (like perf) use the address of +// the kernel relocation symbol (_text or _stext) as the mmap start. Additionally, +// for obfuscation, ChromeOS profiles have the kernel image remapped to the 0-th page. +func kernelBase(loadSegment *elf.ProgHeader, stextOffset *uint64, start, limit, offset uint64) (uint64, bool) { + const ( + // PAGE_OFFSET for PowerPC64, see arch/powerpc/Kconfig in the kernel sources. + pageOffsetPpc64 = 0xc000000000000000 + pageSize = 4096 + ) + + if loadSegment.Vaddr == start-offset { + return offset, true + } + if start == 0 && limit != 0 && stextOffset != nil { + // ChromeOS remaps its kernel to 0. Nothing else should come + // down this path. Empirical values: + // VADDR=0xffffffff80200000 + // stextOffset=0xffffffff80200198 + return start - *stextOffset, true + } + if start >= 0x8000000000000000 && limit > start && (offset == 0 || offset == pageOffsetPpc64 || offset == start) { + // Some kernels look like: + // VADDR=0xffffffff80200000 + // stextOffset=0xffffffff80200198 + // Start=0xffffffff83200000 + // Limit=0xffffffff84200000 + // Offset=0 (0xc000000000000000 for PowerPC64) (== Start for ASLR kernel) + // So the base should be: + if stextOffset != nil && (start%pageSize) == (*stextOffset%pageSize) { + // perf uses the address of _stext as start. Some tools may + // adjust for this before calling GetBase, in which case the page + // alignment should be different from that of stextOffset. + return start - *stextOffset, true + } + + return start - loadSegment.Vaddr, true + } + if start%pageSize != 0 && stextOffset != nil && *stextOffset%pageSize == start%pageSize { + // ChromeOS remaps its kernel to 0 + start%pageSize. Nothing + // else should come down this path. Empirical values: + // start=0x198 limit=0x2f9fffff offset=0 + // VADDR=0xffffffff81000000 + // stextOffset=0xffffffff81000198 + return start - *stextOffset, true + } + return 0, false +} + +// GetBase determines the base address to subtract from virtual +// address to get symbol table address. For an executable, the base +// is 0. Otherwise, it's a shared library, and the base is the +// address where the mapping starts. The kernel needs special handling. +func GetBase(fh *elf.FileHeader, loadSegment *elf.ProgHeader, stextOffset *uint64, start, limit, offset uint64) (uint64, error) { + + if start == 0 && offset == 0 && (limit == ^uint64(0) || limit == 0) { + // Some tools may introduce a fake mapping that spans the entire + // address space. Assume that the address has already been + // adjusted, so no additional base adjustment is necessary. + return 0, nil + } + + switch fh.Type { + case elf.ET_EXEC: + if loadSegment == nil { + // Assume fixed-address executable and so no adjustment. + return 0, nil + } + if stextOffset == nil && start > 0 && start < 0x8000000000000000 { + // A regular user-mode executable. Compute the base offset using same + // arithmetics as in ET_DYN case below, see the explanation there. + // Ideally, the condition would just be "stextOffset == nil" as that + // represents the address of _stext symbol in the vmlinux image. Alas, + // the caller may skip reading it from the binary (it's expensive to scan + // all the symbols) and so it may be nil even for the kernel executable. + // So additionally check that the start is within the user-mode half of + // the 64-bit address space. + return start - offset + loadSegment.Off - loadSegment.Vaddr, nil + } + // Various kernel heuristics and cases are handled separately. + if base, match := kernelBase(loadSegment, stextOffset, start, limit, offset); match { + return base, nil + } + // ChromeOS can remap its kernel to 0, and the caller might have not found + // the _stext symbol. Split this case from kernelBase() above, since we don't + // want to apply it to an ET_DYN user-mode executable. + if start == 0 && limit != 0 && stextOffset == nil { + return start - loadSegment.Vaddr, nil + } + + return 0, fmt.Errorf("don't know how to handle EXEC segment: %v start=0x%x limit=0x%x offset=0x%x", *loadSegment, start, limit, offset) + case elf.ET_REL: + if offset != 0 { + return 0, fmt.Errorf("don't know how to handle mapping.Offset") + } + return start, nil + case elf.ET_DYN: + // The process mapping information, start = start of virtual address range, + // and offset = offset in the executable file of the start address, tells us + // that a runtime virtual address x maps to a file offset + // fx = x - start + offset. + if loadSegment == nil { + return start - offset, nil + } + // Kernels compiled as PIE can be ET_DYN as well. Use heuristic, similar to + // the ET_EXEC case above. + if base, match := kernelBase(loadSegment, stextOffset, start, limit, offset); match { + return base, nil + } + // The program header, if not nil, indicates the offset in the file where + // the executable segment is located (loadSegment.Off), and the base virtual + // address where the first byte of the segment is loaded + // (loadSegment.Vaddr). A file offset fx maps to a virtual (symbol) address + // sx = fx - loadSegment.Off + loadSegment.Vaddr. + // + // Thus, a runtime virtual address x maps to a symbol address + // sx = x - start + offset - loadSegment.Off + loadSegment.Vaddr. + return start - offset + loadSegment.Off - loadSegment.Vaddr, nil + } + return 0, fmt.Errorf("don't know how to handle FileHeader.Type %v", fh.Type) +} + +// FindTextProgHeader finds the program segment header containing the .text +// section or nil if the segment cannot be found. +func FindTextProgHeader(f *elf.File) *elf.ProgHeader { + for _, s := range f.Sections { + if s.Name == ".text" { + // Find the LOAD segment containing the .text section. + for _, p := range f.Progs { + if p.Type == elf.PT_LOAD && p.Flags&elf.PF_X != 0 && s.Addr >= p.Vaddr && s.Addr < p.Vaddr+p.Memsz { + return &p.ProgHeader + } + } + } + } + return nil +} + +// ProgramHeadersForMapping returns the program segment headers that overlap +// the runtime mapping with file offset mapOff and memory size mapSz. We skip +// over segments zero file size because their file offset values are unreliable. +// Even if overlapping, a segment is not selected if its aligned file offset is +// greater than the mapping file offset, or if the mapping includes the last +// page of the segment, but not the full segment and the mapping includes +// additional pages after the segment end. +// The function returns a slice of pointers to the headers in the input +// slice, which are valid only while phdrs is not modified or discarded. +func ProgramHeadersForMapping(phdrs []elf.ProgHeader, mapOff, mapSz uint64) []*elf.ProgHeader { + const ( + // pageSize defines the virtual memory page size used by the loader. This + // value is dependent on the memory management unit of the CPU. The page + // size is 4KB virtually on all the architectures that we care about, so we + // define this metric as a constant. If we encounter architectures where + // page sie is not 4KB, we must try to guess the page size on the system + // where the profile was collected, possibly using the architecture + // specified in the ELF file header. + pageSize = 4096 + pageOffsetMask = pageSize - 1 + ) + mapLimit := mapOff + mapSz + var headers []*elf.ProgHeader + for i := range phdrs { + p := &phdrs[i] + // Skip over segments with zero file size. Their file offsets can have + // arbitrary values, see b/195427553. + if p.Filesz == 0 { + continue + } + segLimit := p.Off + p.Memsz + // The segment must overlap the mapping. + if p.Type == elf.PT_LOAD && mapOff < segLimit && p.Off < mapLimit { + // If the mapping offset is strictly less than the page aligned segment + // offset, then this mapping comes from a different segment, fixes + // b/179920361. + alignedSegOffset := uint64(0) + if p.Off > (p.Vaddr & pageOffsetMask) { + alignedSegOffset = p.Off - (p.Vaddr & pageOffsetMask) + } + if mapOff < alignedSegOffset { + continue + } + // If the mapping starts in the middle of the segment, it covers less than + // one page of the segment, and it extends at least one page past the + // segment, then this mapping comes from a different segment. + if mapOff > p.Off && (segLimit < mapOff+pageSize) && (mapLimit >= segLimit+pageSize) { + continue + } + headers = append(headers, p) + } + } + return headers +} + +// HeaderForFileOffset attempts to identify a unique program header that +// includes the given file offset. It returns an error if it cannot identify a +// unique header. +func HeaderForFileOffset(headers []*elf.ProgHeader, fileOffset uint64) (*elf.ProgHeader, error) { + var ph *elf.ProgHeader + for _, h := range headers { + if fileOffset >= h.Off && fileOffset < h.Off+h.Memsz { + if ph != nil { + // Assuming no other bugs, this can only happen if we have two or + // more small program segments that fit on the same page, and a + // segment other than the last one includes uninitialized data, or + // if the debug binary used for symbolization is stripped of some + // sections, so segment file sizes are smaller than memory sizes. + return nil, fmt.Errorf("found second program header (%#v) that matches file offset %x, first program header is %#v. Is this a stripped binary, or does the first program segment contain uninitialized data?", *h, fileOffset, *ph) + } + ph = h + } + } + if ph == nil { + return nil, fmt.Errorf("no program header matches file offset %x", fileOffset) + } + return ph, nil +} diff --git a/plugin/debug/pkg/internal/elfexec/elfexec_test.go b/plugin/debug/pkg/internal/elfexec/elfexec_test.go new file mode 100644 index 00000000..a03b0e44 --- /dev/null +++ b/plugin/debug/pkg/internal/elfexec/elfexec_test.go @@ -0,0 +1,485 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package elfexec + +import ( + "debug/elf" + "fmt" + "reflect" + "strings" + "testing" +) + +func TestGetBase(t *testing.T) { + + fhExec := &elf.FileHeader{ + Type: elf.ET_EXEC, + } + fhRel := &elf.FileHeader{ + Type: elf.ET_REL, + } + fhDyn := &elf.FileHeader{ + Type: elf.ET_DYN, + } + lsOffset := &elf.ProgHeader{ + Vaddr: 0x400000, + Off: 0x200000, + } + kernelHeader := &elf.ProgHeader{ + Vaddr: 0xffffffff81000000, + } + kernelAslrHeader := &elf.ProgHeader{ + Vaddr: 0xffffffff80200000, + Off: 0x1000, + } + // Kernel PIE header with vaddr aligned to a 4k boundary + kernelPieAlignedHeader := &elf.ProgHeader{ + Vaddr: 0xffff800010010000, + Off: 0x10000, + } + // Kernel PIE header with vaddr that doesn't fall on a 4k boundary + kernelPieUnalignedHeader := &elf.ProgHeader{ + Vaddr: 0xffffffc010080800, + Off: 0x10800, + } + ppc64KernelHeader := &elf.ProgHeader{ + Vaddr: 0xc000000000000000, + } + + testcases := []struct { + label string + fh *elf.FileHeader + loadSegment *elf.ProgHeader + stextOffset *uint64 + start, limit, offset uint64 + want uint64 + wanterr bool + }{ + {"exec", fhExec, nil, nil, 0x400000, 0, 0, 0, false}, + {"exec offset", fhExec, lsOffset, nil, 0x400000, 0x800000, 0, 0x200000, false}, + {"exec offset 2", fhExec, lsOffset, nil, 0x200000, 0x600000, 0, 0, false}, + {"exec nomap", fhExec, nil, nil, 0, 0, 0, 0, false}, + {"exec kernel", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0xffffffff82000198, 0xffffffff83000198, 0, 0x1000000, false}, + {"exec kernel", fhExec, kernelHeader, uint64p(0xffffffff810002b8), 0xffffffff81000000, 0xffffffffa0000000, 0x0, 0x0, false}, + {"exec kernel ASLR", fhExec, kernelHeader, uint64p(0xffffffff810002b8), 0xffffffff81000000, 0xffffffffa0000000, 0xffffffff81000000, 0x0, false}, + // TODO(aalexand): Figure out where this test case exactly comes from and + // whether it's still relevant. + {"exec kernel ASLR 2", fhExec, kernelAslrHeader, nil, 0xffffffff83e00000, 0xfffffffffc3fffff, 0x3c00000, 0x3c00000, false}, + {"exec PPC64 kernel", fhExec, ppc64KernelHeader, uint64p(0xc000000000000000), 0xc000000000000000, 0xd00000001a730000, 0x0, 0x0, false}, + {"exec chromeos kernel", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0, 0x10197, 0, 0x7efffe68, false}, + {"exec chromeos kernel 2", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0, 0x10198, 0, 0x7efffe68, false}, + {"exec chromeos kernel 3", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0x198, 0x100000, 0, 0x7f000000, false}, + {"exec chromeos kernel 4", fhExec, kernelHeader, uint64p(0xffffffff81200198), 0x198, 0x100000, 0, 0x7ee00000, false}, + {"exec chromeos kernel unremapped", fhExec, kernelHeader, uint64p(0xffffffff810001c8), 0xffffffff834001c8, 0xffffffffc0000000, 0xffffffff834001c8, 0x2400000, false}, + {"dyn", fhDyn, nil, nil, 0x200000, 0x300000, 0, 0x200000, false}, + {"dyn map", fhDyn, lsOffset, nil, 0x0, 0x300000, 0, 0xFFFFFFFFFFE00000, false}, + {"dyn nomap", fhDyn, nil, nil, 0x0, 0x0, 0, 0, false}, + {"dyn map+offset", fhDyn, lsOffset, nil, 0x900000, 0xa00000, 0x200000, 0x500000, false}, + {"dyn kernel", fhDyn, kernelPieAlignedHeader, uint64p(0xffff800010000000), 0xffff800010000000, 0xffff800012815c00, 0xffff800010000000, 0, false}, + {"dyn chromeos aslr kernel", fhDyn, kernelPieUnalignedHeader, uint64p(0xffffffc010080800), 0x800, 0xb7f800, 0, 0x3feff80000, false}, + {"dyn chromeos aslr kernel unremapped", fhDyn, kernelPieUnalignedHeader, uint64p(0xffffffc010080800), 0xffffffdb5d680800, 0xffffffdb5e200000, 0xffffffdb5d680800, 0x1b4d600000, false}, + {"rel", fhRel, nil, nil, 0x2000000, 0x3000000, 0, 0x2000000, false}, + {"rel nomap", fhRel, nil, nil, 0x0, ^uint64(0), 0, 0, false}, + {"rel offset", fhRel, nil, nil, 0x100000, 0x200000, 0x1, 0, true}, + } + + for _, tc := range testcases { + base, err := GetBase(tc.fh, tc.loadSegment, tc.stextOffset, tc.start, tc.limit, tc.offset) + if err != nil { + if !tc.wanterr { + t.Errorf("%s: want no error, got %v", tc.label, err) + } + continue + } + if tc.wanterr { + t.Errorf("%s: want error, got nil", tc.label) + continue + } + if base != tc.want { + t.Errorf("%s: want 0x%x, got 0x%x", tc.label, tc.want, base) + } + } +} + +func uint64p(n uint64) *uint64 { + return &n +} + +func TestFindProgHeaderForMapping(t *testing.T) { + buildList := func(headers []*elf.ProgHeader) (result string) { + builder := strings.Builder{} + if err := builder.WriteByte('['); err != nil { + t.Error("Failed to append '[' to the builder") + } + defer func() { + if err := builder.WriteByte(']'); err != nil { + t.Error("Failed to append ']' to the builder") + } + result = builder.String() + }() + if len(headers) == 0 { + if _, err := builder.WriteString("nil"); err != nil { + t.Error("Failed to append 'nil' to the builder") + } + return + } + if _, err := builder.WriteString(fmt.Sprintf("%#v", *headers[0])); err != nil { + t.Error("Failed to append first header to the builder") + } + for i, h := range headers[1:] { + if _, err := builder.WriteString(fmt.Sprintf(", %#v", *h)); err != nil { + t.Errorf("Failed to append header %d to the builder", i+1) + } + } + return + } + + // Variuos ELF program headers for unit tests. + tinyHeaders := []elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + } + tinyBadBSSHeaders := []elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x100, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xd80, Vaddr: 0x400d80, Paddr: 0x400d80, Filesz: 0x90, Memsz: 0x90, Align: 0x200000}, + } + smallHeaders := []elf.ProgHeader{ + {Type: elf.PT_PHDR, Flags: elf.PF_R | elf.PF_X, Off: 0x40, Vaddr: 0x400040, Paddr: 0x400040, Filesz: 0x1f8, Memsz: 0x1f8, Align: 8}, + {Type: elf.PT_INTERP, Flags: elf.PF_R, Off: 0x238, Vaddr: 0x400238, Paddr: 0x400238, Filesz: 0x1c, Memsz: 0x1c, Align: 1}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x400000, Paddr: 0x400000, Filesz: 0x6fc, Memsz: 0x6fc, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}, + {Type: elf.PT_DYNAMIC, Flags: elf.PF_R | elf.PF_W, Off: 0xe28, Vaddr: 0x600e28, Paddr: 0x600e28, Filesz: 0x1d0, Memsz: 0x1d0, Align: 8}, + } + smallBadBSSHeaders := []elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x200000, Paddr: 0x200000, Filesz: 0x6fc, Memsz: 0x6fc, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x700, Vaddr: 0x400700, Paddr: 0x400700, Filesz: 0x500, Memsz: 0x710, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}, + } + mediumHeaders := []elf.ProgHeader{ + {Type: elf.PT_PHDR, Flags: elf.PF_R, Off: 0x40, Vaddr: 0x40, Paddr: 0x40, Filesz: 0x268, Memsz: 0x268, Align: 8}, + {Type: elf.PT_INTERP, Flags: elf.PF_R, Off: 0x2a8, Vaddr: 0x2a8, Paddr: 0x2a8, Filesz: 0x28, Memsz: 0x28, Align: 1}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0x51800, Memsz: 0x51800, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x51800, Vaddr: 0x251800, Paddr: 0x251800, Filesz: 0x24a8, Memsz: 0x24e8, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x53d00, Vaddr: 0x453d00, Paddr: 0x453d00, Filesz: 0x13a58, Memsz: 0x91a198, Align: 0x200000}, + {Type: elf.PT_TLS, Flags: elf.PF_R, Off: 0x51800, Vaddr: 0x51800, Paddr: 0x51800, Filesz: 0x0, Memsz: 0x38, Align: 0x8}, + {Type: elf.PT_DYNAMIC, Flags: elf.PF_R | elf.PF_W, Off: 0x51d00, Vaddr: 0x251d00, Paddr: 0x251d00, Filesz: 0x1ef0, Memsz: 0x1ef0, Align: 8}, + } + largeHeaders := []elf.ProgHeader{ + {Type: elf.PT_PHDR, Flags: elf.PF_R, Off: 0x40, Vaddr: 0x40, Paddr: 0x40, Filesz: 0x268, Memsz: 0x268, Align: 8}, + {Type: elf.PT_INTERP, Flags: elf.PF_R, Off: 0x2a8, Vaddr: 0x2a8, Paddr: 0x2a8, Filesz: 0x28, Memsz: 0x28, Align: 1}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0x2ec5d2c0, Memsz: 0x2ec5d2c0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x2ec5d2c0, Vaddr: 0x2ee5d2c0, Paddr: 0x2ee5d2c0, Filesz: 0x1361118, Memsz: 0x1361150, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x2ffbe440, Vaddr: 0x303be440, Paddr: 0x303be440, Filesz: 0x4637c0, Memsz: 0xc91610, Align: 0x200000}, + {Type: elf.PT_TLS, Flags: elf.PF_R, Off: 0x2ec5d2c0, Vaddr: 0x2ee5d2c0, Paddr: 0x2ee5d2c0, Filesz: 0x120, Memsz: 0x103f8, Align: 0x40}, + {Type: elf.PT_DYNAMIC, Flags: elf.PF_R | elf.PF_W, Off: 0x2ffbc9e0, Vaddr: 0x301bc9e0, Paddr: 0x301bc9e0, Filesz: 0x1f0, Memsz: 0x1f0, Align: 8}, + } + ffmpegHeaders := []elf.ProgHeader{ + {Type: elf.PT_PHDR, Flags: elf.PF_R, Off: 0x40, Vaddr: 0x200040, Paddr: 0x200040, Filesz: 0x1f8, Memsz: 0x1f8, Align: 8}, + {Type: elf.PT_INTERP, Flags: elf.PF_R, Off: 0x238, Vaddr: 0x200238, Paddr: 0x200238, Filesz: 0x28, Memsz: 0x28, Align: 1}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x200000, Paddr: 0x200000, Filesz: 0x48d8410, Memsz: 0x48d8410, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x48d8440, Vaddr: 0x4cd8440, Paddr: 0x4cd8440, Filesz: 0x18cbe0, Memsz: 0xd2fb70, Align: 0x200000}, + {Type: elf.PT_TLS, Flags: elf.PF_R, Off: 0x48d8440, Vaddr: 0x4cd8440, Paddr: 0x4cd8440, Filesz: 0xa8, Memsz: 0x468, Align: 0x40}, + {Type: elf.PT_DYNAMIC, Flags: elf.PF_R | elf.PF_W, Off: 0x4a63ad0, Vaddr: 0x4e63ad0, Paddr: 0x4e63ad0, Filesz: 0x200, Memsz: 0x200, Align: 8}, + } + sentryHeaders := []elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_X + elf.PF_R, Off: 0x0, Vaddr: 0x7f0000000000, Paddr: 0x7f0000000000, Filesz: 0xbc64d5, Memsz: 0xbc64d5, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R, Off: 0xbc7000, Vaddr: 0x7f0000bc7000, Paddr: 0x7f0000bc7000, Filesz: 0xcd6b30, Memsz: 0xcd6b30, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_W + elf.PF_R, Off: 0x189e000, Vaddr: 0x7f000189e000, Paddr: 0x7f000189e000, Filesz: 0x58180, Memsz: 0x92d10, Align: 0x1000}, + } + + for _, tc := range []struct { + desc string + phdrs []elf.ProgHeader + pgoff uint64 + memsz uint64 + wantHeaders []*elf.ProgHeader + }{ + { + desc: "no prog headers", + phdrs: nil, + pgoff: 0, + memsz: 0x1000, + wantHeaders: nil, + }, + { + desc: "tiny file, 4KB at offset 0 matches both headers, b/178747588", + phdrs: tinyHeaders, + pgoff: 0, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + }, + }, + { + desc: "tiny file, file offset 4KB matches no headers", + phdrs: tinyHeaders, + pgoff: 0x1000, + memsz: 0x1000, + wantHeaders: nil, + }, + { + desc: "tiny file with unaligned memsz matches executable segment", + phdrs: tinyHeaders, + pgoff: 0, + memsz: 0xc80, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}}, + }, + { + desc: "tiny file with unaligned offset matches data segment", + phdrs: tinyHeaders, + pgoff: 0xc80, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}}, + }, + { + desc: "tiny bad BSS file, 4KB at offset 0 matches all three headers", + phdrs: tinyBadBSSHeaders, + pgoff: 0, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x100, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xd80, Vaddr: 0x400d80, Paddr: 0x400d80, Filesz: 0x90, Memsz: 0x90, Align: 0x200000}, + }, + }, + { + desc: "small file, offset 0, memsz 4KB matches both segments", + phdrs: smallHeaders, + pgoff: 0, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x400000, Paddr: 0x400000, Filesz: 0x6fc, Memsz: 0x6fc, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}, + }, + }, + { + desc: "small file, offset 0, memsz 8KB matches both segments", + phdrs: smallHeaders, + pgoff: 0, + memsz: 0x2000, + wantHeaders: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x400000, Paddr: 0x400000, Filesz: 0x6fc, Memsz: 0x6fc, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}, + }, + }, + { + desc: "small file, offset 4KB matches data segment", + phdrs: smallHeaders, + pgoff: 0x1000, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}}, + }, + { + desc: "small file, offset 8KB matches no segment", + phdrs: smallHeaders, + pgoff: 0x2000, + memsz: 0x1000, + wantHeaders: nil, + }, + { + desc: "small bad BSS file, offset 0, memsz 4KB matches all three segments", + phdrs: smallBadBSSHeaders, + pgoff: 0, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x200000, Paddr: 0x200000, Filesz: 0x6fc, Memsz: 0x6fc, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x700, Vaddr: 0x400700, Paddr: 0x400700, Filesz: 0x500, Memsz: 0x710, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}, + }, + }, + { + desc: "small bad BSS file, offset 0, memsz 8KB matches all three segments", + phdrs: smallBadBSSHeaders, + pgoff: 0, + memsz: 0x2000, + wantHeaders: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x200000, Paddr: 0x200000, Filesz: 0x6fc, Memsz: 0x6fc, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x700, Vaddr: 0x400700, Paddr: 0x400700, Filesz: 0x500, Memsz: 0x710, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}, + }, + }, + { + desc: "small bad BSS file, offset 4KB matches second data segment", + phdrs: smallBadBSSHeaders, + pgoff: 0x1000, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe10, Vaddr: 0x600e10, Paddr: 0x600e10, Filesz: 0x230, Memsz: 0x238, Align: 0x200000}}, + }, + { + desc: "medium file large mapping that includes all address space matches executable segment, b/179920361", + phdrs: mediumHeaders, + pgoff: 0, + memsz: 0xd6e000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0x51800, Memsz: 0x51800, Align: 0x200000}}, + }, + { + desc: "large file executable mapping matches executable segment", + phdrs: largeHeaders, + pgoff: 0, + memsz: 0x2ec5e000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0x2ec5d2c0, Memsz: 0x2ec5d2c0, Align: 0x200000}}, + }, + { + desc: "large file first data mapping matches first data segment", + phdrs: largeHeaders, + pgoff: 0x2ec5d000, + memsz: 0x1362000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x2ec5d2c0, Vaddr: 0x2ee5d2c0, Paddr: 0x2ee5d2c0, Filesz: 0x1361118, Memsz: 0x1361150, Align: 0x200000}}, + }, + { + desc: "large file, split second data mapping matches second data segment", + phdrs: largeHeaders, + pgoff: 0x2ffbe000, + memsz: 0xb11000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0x2ffbe440, Vaddr: 0x303be440, Paddr: 0x303be440, Filesz: 0x4637c0, Memsz: 0xc91610, Align: 0x200000}}, + }, + { + desc: "sentry headers, mapping for last page of executable segment matches executable segment", + phdrs: sentryHeaders, + pgoff: 0xbc6000, + memsz: 0x1000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_X + elf.PF_R, Off: 0x0, Vaddr: 0x7f0000000000, Paddr: 0x7f0000000000, Filesz: 0xbc64d5, Memsz: 0xbc64d5, Align: 0x1000}}, + }, + { + desc: "ffmpeg headers, split mapping for executable segment matches executable segment, b/193176694", + phdrs: ffmpegHeaders, + pgoff: 0, + memsz: 0x48d8000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0x200000, Paddr: 0x200000, Filesz: 0x48d8410, Memsz: 0x48d8410, Align: 0x200000}}, + }, + { + desc: "segments with no file bits (b/195427553), mapping for executable segment matches executable segment", + phdrs: []elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R, Off: 0x0, Vaddr: 0x0, Paddr: 0x0, Filesz: 0x115000, Memsz: 0x115000, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_X + elf.PF_R, Off: 0x115000, Vaddr: 0x115000, Paddr: 0x115000, Filesz: 0x361e15, Memsz: 0x361e15, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_W + elf.PF_R, Off: 0x0, Vaddr: 0x477000, Paddr: 0x477000, Filesz: 0x0, Memsz: 0x33c, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R, Off: 0x0, Vaddr: 0x478000, Paddr: 0x478000, Filesz: 0x0, Memsz: 0x47dc28, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R, Off: 0x477000, Vaddr: 0x8f6000, Paddr: 0x8f6000, Filesz: 0x140, Memsz: 0x140, Align: 0x1000}, + {Type: elf.PT_LOAD, Flags: elf.PF_W + elf.PF_R, Off: 0x478000, Vaddr: 0x8f7000, Paddr: 0x8f7000, Filesz: 0x38, Memsz: 0x38, Align: 0x1000}, + }, + pgoff: 0x115000, + memsz: 0x362000, + wantHeaders: []*elf.ProgHeader{{Type: elf.PT_LOAD, Flags: elf.PF_X + elf.PF_R, Off: 0x115000, Vaddr: 0x115000, Paddr: 0x115000, Filesz: 0x361e15, Memsz: 0x361e15, Align: 0x1000}}, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + gotHeaders := ProgramHeadersForMapping(tc.phdrs, tc.pgoff, tc.memsz) + if !reflect.DeepEqual(gotHeaders, tc.wantHeaders) { + t.Errorf("got program headers %q; want %q", buildList(gotHeaders), buildList(tc.wantHeaders)) + } + }) + } +} + +func TestHeaderForFileOffset(t *testing.T) { + for _, tc := range []struct { + desc string + headers []*elf.ProgHeader + fileOffset uint64 + wantError bool + want *elf.ProgHeader + }{ + { + desc: "no headers, want error", + headers: nil, + wantError: true, + }, + { + desc: "three headers, BSS in last segment, file offset selects first header", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xc79, + want: &elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + }, + { + desc: "three headers, BSS in last segment, file offset selects second header", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xc80, + want: &elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + }, + { + desc: "three headers, BSS in last segment, file offset selects third header", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xef0, + want: &elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + { + desc: "three headers, BSS in last segment, file offset in uninitialized section selects third header", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xf40, + want: &elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + { + desc: "three headers, BSS in last segment, file offset past any segment gives error", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x1f0, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xe70, Vaddr: 0x400e70, Paddr: 0x400e70, Filesz: 0x90, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xf70, + wantError: true, + }, + { + desc: "three headers, BSS in second segment, file offset in mapped section selects second header", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x100, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xd80, Vaddr: 0x400d80, Paddr: 0x400d80, Filesz: 0x100, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xd79, + want: &elf.ProgHeader{Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x100, Memsz: 0x1f0, Align: 0x200000}, + }, + { + desc: "three headers, BSS in second segment, file offset in unmapped section gives error", + headers: []*elf.ProgHeader{ + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_X, Off: 0, Vaddr: 0, Paddr: 0, Filesz: 0xc80, Memsz: 0xc80, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xc80, Vaddr: 0x200c80, Paddr: 0x200c80, Filesz: 0x100, Memsz: 0x1f0, Align: 0x200000}, + {Type: elf.PT_LOAD, Flags: elf.PF_R | elf.PF_W, Off: 0xd80, Vaddr: 0x400d80, Paddr: 0x400d80, Filesz: 0x100, Memsz: 0x100, Align: 0x200000}, + }, + fileOffset: 0xd80, + wantError: true, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + got, err := HeaderForFileOffset(tc.headers, tc.fileOffset) + if (err != nil) != tc.wantError { + t.Errorf("got error %v, want any error=%v", err, tc.wantError) + } + if err != nil { + return + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("got program header %#v, want %#v", got, tc.want) + } + }) + } +} diff --git a/plugin/debug/pkg/internal/graph/dotgraph.go b/plugin/debug/pkg/internal/graph/dotgraph.go new file mode 100644 index 00000000..bc843e3e --- /dev/null +++ b/plugin/debug/pkg/internal/graph/dotgraph.go @@ -0,0 +1,494 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package graph + +import ( + "fmt" + "io" + "math" + "path/filepath" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/measurement" +) + +// DotAttributes contains details about the graph itself, giving +// insight into how its elements should be rendered. +type DotAttributes struct { + Nodes map[*Node]*DotNodeAttributes // A map allowing each Node to have its own visualization option +} + +// DotNodeAttributes contains Node specific visualization options. +type DotNodeAttributes struct { + Shape string // The optional shape of the node when rendered visually + Bold bool // If the node should be bold or not + Peripheries int // An optional number of borders to place around a node + URL string // An optional url link to add to a node + Formatter func(*NodeInfo) string // An optional formatter for the node's label +} + +// DotConfig contains attributes about how a graph should be +// constructed and how it should look. +type DotConfig struct { + Title string // The title of the DOT graph + LegendURL string // The URL to link to from the legend. + Labels []string // The labels for the DOT's legend + + FormatValue func(int64) string // A formatting function for values + Total int64 // The total weight of the graph, used to compute percentages +} + +const maxNodelets = 4 // Number of nodelets for labels (both numeric and non) + +// ComposeDot creates and writes a in the DOT format to the writer, using +// the configurations given. +func ComposeDot(w io.Writer, g *Graph, a *DotAttributes, c *DotConfig) { + builder := &builder{w, a, c} + + // Begin constructing DOT by adding a title and legend. + builder.start() + defer builder.finish() + builder.addLegend() + + if len(g.Nodes) == 0 { + return + } + + // Preprocess graph to get id map and find max flat. + nodeIDMap := make(map[*Node]int) + hasNodelets := make(map[*Node]bool) + + maxFlat := float64(abs64(g.Nodes[0].FlatValue())) + for i, n := range g.Nodes { + nodeIDMap[n] = i + 1 + if float64(abs64(n.FlatValue())) > maxFlat { + maxFlat = float64(abs64(n.FlatValue())) + } + } + + edges := EdgeMap{} + + // Add nodes and nodelets to DOT builder. + for _, n := range g.Nodes { + builder.addNode(n, nodeIDMap[n], maxFlat) + hasNodelets[n] = builder.addNodelets(n, nodeIDMap[n]) + + // Collect all edges. Use a fake node to support multiple incoming edges. + for _, e := range n.Out { + edges[&Node{}] = e + } + } + + // Add edges to DOT builder. Sort edges by frequency as a hint to the graph layout engine. + for _, e := range edges.Sort() { + builder.addEdge(e, nodeIDMap[e.Src], nodeIDMap[e.Dest], hasNodelets[e.Src]) + } +} + +// builder wraps an io.Writer and understands how to compose DOT formatted elements. +type builder struct { + io.Writer + attributes *DotAttributes + config *DotConfig +} + +// start generates a title and initial node in DOT format. +func (b *builder) start() { + graphname := "unnamed" + if b.config.Title != "" { + graphname = b.config.Title + } + fmt.Fprintln(b, `digraph "`+graphname+`" {`) + fmt.Fprintln(b, `node [style=filled fillcolor="#f8f8f8"]`) +} + +// finish closes the opening curly bracket in the constructed DOT buffer. +func (b *builder) finish() { + fmt.Fprintln(b, "}") +} + +// addLegend generates a legend in DOT format. +func (b *builder) addLegend() { + labels := b.config.Labels + if len(labels) == 0 { + return + } + title := labels[0] + fmt.Fprintf(b, `subgraph cluster_L { "%s" [shape=box fontsize=16`, escapeForDot(title)) + fmt.Fprintf(b, ` label="%s\l"`, strings.Join(escapeAllForDot(labels), `\l`)) + if b.config.LegendURL != "" { + fmt.Fprintf(b, ` URL="%s" target="_blank"`, b.config.LegendURL) + } + if b.config.Title != "" { + fmt.Fprintf(b, ` tooltip="%s"`, b.config.Title) + } + fmt.Fprintf(b, "] }\n") +} + +// addNode generates a graph node in DOT format. +func (b *builder) addNode(node *Node, nodeID int, maxFlat float64) { + flat, cum := node.FlatValue(), node.CumValue() + attrs := b.attributes.Nodes[node] + + // Populate label for node. + var label string + if attrs != nil && attrs.Formatter != nil { + label = attrs.Formatter(&node.Info) + } else { + label = multilinePrintableName(&node.Info) + } + + flatValue := b.config.FormatValue(flat) + if flat != 0 { + label = label + fmt.Sprintf(`%s (%s)`, + flatValue, + strings.TrimSpace(measurement.Percentage(flat, b.config.Total))) + } else { + label = label + "0" + } + cumValue := flatValue + if cum != flat { + if flat != 0 { + label = label + `\n` + } else { + label = label + " " + } + cumValue = b.config.FormatValue(cum) + label = label + fmt.Sprintf(`of %s (%s)`, + cumValue, + strings.TrimSpace(measurement.Percentage(cum, b.config.Total))) + } + + // Scale font sizes from 8 to 24 based on percentage of flat frequency. + // Use non linear growth to emphasize the size difference. + baseFontSize, maxFontGrowth := 8, 16.0 + fontSize := baseFontSize + if maxFlat != 0 && flat != 0 && float64(abs64(flat)) <= maxFlat { + fontSize += int(math.Ceil(maxFontGrowth * math.Sqrt(float64(abs64(flat))/maxFlat))) + } + + // Determine node shape. + shape := "box" + if attrs != nil && attrs.Shape != "" { + shape = attrs.Shape + } + + // Create DOT attribute for node. + attr := fmt.Sprintf(`label="%s" id="node%d" fontsize=%d shape=%s tooltip="%s (%s)" color="%s" fillcolor="%s"`, + label, nodeID, fontSize, shape, escapeForDot(node.Info.PrintableName()), cumValue, + dotColor(float64(node.CumValue())/float64(abs64(b.config.Total)), false), + dotColor(float64(node.CumValue())/float64(abs64(b.config.Total)), true)) + + // Add on extra attributes if provided. + if attrs != nil { + // Make bold if specified. + if attrs.Bold { + attr += ` style="bold,filled"` + } + + // Add peripheries if specified. + if attrs.Peripheries != 0 { + attr += fmt.Sprintf(` peripheries=%d`, attrs.Peripheries) + } + + // Add URL if specified. target="_blank" forces the link to open in a new tab. + if attrs.URL != "" { + attr += fmt.Sprintf(` URL="%s" target="_blank"`, attrs.URL) + } + } + + fmt.Fprintf(b, "N%d [%s]\n", nodeID, attr) +} + +// addNodelets generates the DOT boxes for the node tags if they exist. +func (b *builder) addNodelets(node *Node, nodeID int) bool { + var nodelets string + + // Populate two Tag slices, one for LabelTags and one for NumericTags. + var ts []*Tag + lnts := make(map[string][]*Tag) + for _, t := range node.LabelTags { + ts = append(ts, t) + } + for l, tm := range node.NumericTags { + for _, t := range tm { + lnts[l] = append(lnts[l], t) + } + } + + // For leaf nodes, print cumulative tags (includes weight from + // children that have been deleted). + // For internal nodes, print only flat tags. + flatTags := len(node.Out) > 0 + + // Select the top maxNodelets alphanumeric labels by weight. + SortTags(ts, flatTags) + if len(ts) > maxNodelets { + ts = ts[:maxNodelets] + } + for i, t := range ts { + w := t.CumValue() + if flatTags { + w = t.FlatValue() + } + if w == 0 { + continue + } + weight := b.config.FormatValue(w) + nodelets += fmt.Sprintf(`N%d_%d [label = "%s" id="N%d_%d" fontsize=8 shape=box3d tooltip="%s"]`+"\n", nodeID, i, t.Name, nodeID, i, weight) + nodelets += fmt.Sprintf(`N%d -> N%d_%d [label=" %s" weight=100 tooltip="%s" labeltooltip="%s"]`+"\n", nodeID, nodeID, i, weight, weight, weight) + if nts := lnts[t.Name]; nts != nil { + nodelets += b.numericNodelets(nts, maxNodelets, flatTags, fmt.Sprintf(`N%d_%d`, nodeID, i)) + } + } + + if nts := lnts[""]; nts != nil { + nodelets += b.numericNodelets(nts, maxNodelets, flatTags, fmt.Sprintf(`N%d`, nodeID)) + } + + fmt.Fprint(b, nodelets) + return nodelets != "" +} + +func (b *builder) numericNodelets(nts []*Tag, maxNumNodelets int, flatTags bool, source string) string { + nodelets := "" + + // Collapse numeric labels into maxNumNodelets buckets, of the form: + // 1MB..2MB, 3MB..5MB, ... + for j, t := range b.collapsedTags(nts, maxNumNodelets, flatTags) { + w, attr := t.CumValue(), ` style="dotted"` + if flatTags || t.FlatValue() == t.CumValue() { + w, attr = t.FlatValue(), "" + } + if w != 0 { + weight := b.config.FormatValue(w) + nodelets += fmt.Sprintf(`N%s_%d [label = "%s" id="N%s_%d" fontsize=8 shape=box3d tooltip="%s"]`+"\n", source, j, t.Name, source, j, weight) + nodelets += fmt.Sprintf(`%s -> N%s_%d [label=" %s" weight=100 tooltip="%s" labeltooltip="%s"%s]`+"\n", source, source, j, weight, weight, weight, attr) + } + } + return nodelets +} + +// addEdge generates a graph edge in DOT format. +func (b *builder) addEdge(edge *Edge, from, to int, hasNodelets bool) { + var inline string + if edge.Inline { + inline = `\n (inline)` + } + w := b.config.FormatValue(edge.WeightValue()) + attr := fmt.Sprintf(`label=" %s%s"`, w, inline) + if b.config.Total != 0 { + // Note: edge.weight > b.config.Total is possible for profile diffs. + if weight := 1 + int(min64(abs64(edge.WeightValue()*100/b.config.Total), 100)); weight > 1 { + attr = fmt.Sprintf(`%s weight=%d`, attr, weight) + } + if width := 1 + int(min64(abs64(edge.WeightValue()*5/b.config.Total), 5)); width > 1 { + attr = fmt.Sprintf(`%s penwidth=%d`, attr, width) + } + attr = fmt.Sprintf(`%s color="%s"`, attr, + dotColor(float64(edge.WeightValue())/float64(abs64(b.config.Total)), false)) + } + arrow := "->" + if edge.Residual { + arrow = "..." + } + tooltip := fmt.Sprintf(`"%s %s %s (%s)"`, + escapeForDot(edge.Src.Info.PrintableName()), arrow, + escapeForDot(edge.Dest.Info.PrintableName()), w) + attr = fmt.Sprintf(`%s tooltip=%s labeltooltip=%s`, attr, tooltip, tooltip) + + if edge.Residual { + attr = attr + ` style="dotted"` + } + + if hasNodelets { + // Separate children further if source has tags. + attr = attr + " minlen=2" + } + + fmt.Fprintf(b, "N%d -> N%d [%s]\n", from, to, attr) +} + +// dotColor returns a color for the given score (between -1.0 and +// 1.0), with -1.0 colored green, 0.0 colored grey, and 1.0 colored +// red. If isBackground is true, then a light (low-saturation) +// color is returned (suitable for use as a background color); +// otherwise, a darker color is returned (suitable for use as a +// foreground color). +func dotColor(score float64, isBackground bool) string { + // A float between 0.0 and 1.0, indicating the extent to which + // colors should be shifted away from grey (to make positive and + // negative values easier to distinguish, and to make more use of + // the color range.) + const shift = 0.7 + + // Saturation and value (in hsv colorspace) for background colors. + const bgSaturation = 0.1 + const bgValue = 0.93 + + // Saturation and value (in hsv colorspace) for foreground colors. + const fgSaturation = 1.0 + const fgValue = 0.7 + + // Choose saturation and value based on isBackground. + var saturation float64 + var value float64 + if isBackground { + saturation = bgSaturation + value = bgValue + } else { + saturation = fgSaturation + value = fgValue + } + + // Limit the score values to the range [-1.0, 1.0]. + score = math.Max(-1.0, math.Min(1.0, score)) + + // Reduce saturation near score=0 (so it is colored grey, rather than yellow). + if math.Abs(score) < 0.2 { + saturation *= math.Abs(score) / 0.2 + } + + // Apply 'shift' to move scores away from 0.0 (grey). + if score > 0.0 { + score = math.Pow(score, (1.0 - shift)) + } + if score < 0.0 { + score = -math.Pow(-score, (1.0 - shift)) + } + + var r, g, b float64 // red, green, blue + if score < 0.0 { + g = value + r = value * (1 + saturation*score) + } else { + r = value + g = value * (1 - saturation*score) + } + b = value * (1 - saturation) + return fmt.Sprintf("#%02x%02x%02x", uint8(r*255.0), uint8(g*255.0), uint8(b*255.0)) +} + +func multilinePrintableName(info *NodeInfo) string { + infoCopy := *info + infoCopy.Name = escapeForDot(ShortenFunctionName(infoCopy.Name)) + infoCopy.Name = strings.Replace(infoCopy.Name, "::", `\n`, -1) + // Go type parameters are reported as "[...]" by Go pprof profiles. + // Keep this ellipsis rather than replacing with newlines below. + infoCopy.Name = strings.Replace(infoCopy.Name, "[...]", "[…]", -1) + infoCopy.Name = strings.Replace(infoCopy.Name, ".", `\n`, -1) + if infoCopy.File != "" { + infoCopy.File = filepath.Base(infoCopy.File) + } + return strings.Join(infoCopy.NameComponents(), `\n`) + `\n` +} + +// collapsedTags trims and sorts a slice of tags. +func (b *builder) collapsedTags(ts []*Tag, count int, flatTags bool) []*Tag { + ts = SortTags(ts, flatTags) + if len(ts) <= count { + return ts + } + + tagGroups := make([][]*Tag, count) + for i, t := range (ts)[:count] { + tagGroups[i] = []*Tag{t} + } + for _, t := range (ts)[count:] { + g, d := 0, tagDistance(t, tagGroups[0][0]) + for i := 1; i < count; i++ { + if nd := tagDistance(t, tagGroups[i][0]); nd < d { + g, d = i, nd + } + } + tagGroups[g] = append(tagGroups[g], t) + } + + var nts []*Tag + for _, g := range tagGroups { + l, w, c := b.tagGroupLabel(g) + nts = append(nts, &Tag{ + Name: l, + Flat: w, + Cum: c, + }) + } + return SortTags(nts, flatTags) +} + +func tagDistance(t, u *Tag) float64 { + v, _ := measurement.Scale(u.Value, u.Unit, t.Unit) + if v < float64(t.Value) { + return float64(t.Value) - v + } + return v - float64(t.Value) +} + +func (b *builder) tagGroupLabel(g []*Tag) (label string, flat, cum int64) { + if len(g) == 1 { + t := g[0] + return measurement.Label(t.Value, t.Unit), t.FlatValue(), t.CumValue() + } + min := g[0] + max := g[0] + df, f := min.FlatDiv, min.Flat + dc, c := min.CumDiv, min.Cum + for _, t := range g[1:] { + if v, _ := measurement.Scale(t.Value, t.Unit, min.Unit); int64(v) < min.Value { + min = t + } + if v, _ := measurement.Scale(t.Value, t.Unit, max.Unit); int64(v) > max.Value { + max = t + } + f += t.Flat + df += t.FlatDiv + c += t.Cum + dc += t.CumDiv + } + if df != 0 { + f = f / df + } + if dc != 0 { + c = c / dc + } + + // Tags are not scaled with the selected output unit because tags are often + // much smaller than other values which appear, so the range of tag sizes + // sometimes would appear to be "0..0" when scaled to the selected output unit. + return measurement.Label(min.Value, min.Unit) + ".." + measurement.Label(max.Value, max.Unit), f, c +} + +func min64(a, b int64) int64 { + if a < b { + return a + } + return b +} + +// escapeAllForDot applies escapeForDot to all strings in the given slice. +func escapeAllForDot(in []string) []string { + var out = make([]string, len(in)) + for i := range in { + out[i] = escapeForDot(in[i]) + } + return out +} + +// escapeForDot escapes double quotes and backslashes, and replaces Graphviz's +// "center" character (\n) with a left-justified character. +// See https://graphviz.org/docs/attr-types/escString/ for more info. +func escapeForDot(str string) string { + return strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(str, `\`, `\\`), `"`, `\"`), "\n", `\l`) +} diff --git a/plugin/debug/pkg/internal/graph/dotgraph_test.go b/plugin/debug/pkg/internal/graph/dotgraph_test.go new file mode 100644 index 00000000..77a11463 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/dotgraph_test.go @@ -0,0 +1,400 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package graph + +import ( + "bytes" + "flag" + "fmt" + "os" + "path/filepath" + "reflect" + "strconv" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/proftest" +) + +var updateFlag = flag.Bool("update", false, "Update the golden files") + +func TestComposeWithStandardGraph(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose1.dot") +} + +func TestComposeWithNodeAttributesAndZeroFlat(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + + // Set NodeAttributes for Node 1. + a.Nodes[g.Nodes[0]] = &DotNodeAttributes{ + Shape: "folder", + Bold: true, + Peripheries: 2, + URL: "www.google.com", + Formatter: func(ni *NodeInfo) string { + return strings.ToUpper(ni.Name) + }, + } + + // Set Flat value to zero on Node 2. + g.Nodes[1].Flat = 0 + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose2.dot") +} + +func TestComposeWithTagsAndResidualEdge(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + + // Add tags to Node 1. + g.Nodes[0].LabelTags["a"] = &Tag{ + Name: "tag1", + Cum: 10, + Flat: 10, + } + g.Nodes[0].NumericTags[""] = TagMap{ + "b": &Tag{ + Name: "tag2", + Cum: 20, + Flat: 20, + Unit: "ms", + }, + } + + // Set edge to be Residual. + g.Nodes[0].Out[g.Nodes[1]].Residual = true + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose3.dot") +} + +func TestComposeWithNestedTags(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + + // Add tags to Node 1. + g.Nodes[0].LabelTags["tag1"] = &Tag{ + Name: "tag1", + Cum: 10, + Flat: 10, + } + g.Nodes[0].NumericTags["tag1"] = TagMap{ + "tag2": &Tag{ + Name: "tag2", + Cum: 20, + Flat: 20, + Unit: "ms", + }, + } + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose5.dot") +} + +func TestComposeWithEmptyGraph(t *testing.T) { + g := &Graph{} + a, c := baseAttrsAndConfig() + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose4.dot") +} + +func TestComposeWithStandardGraphAndURL(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + c.LegendURL = "http://example.com" + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose6.dot") +} + +func TestComposeWithNamesThatNeedEscaping(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + g.Nodes[0].Info = NodeInfo{Name: `var"src"`} + g.Nodes[1].Info = NodeInfo{Name: `var"#dest#"`} + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose7.dot") +} + +func TestComposeWithCommentsWithNewlines(t *testing.T) { + g := baseGraph() + a, c := baseAttrsAndConfig() + // comments that could be added with the -add_comment command line tool + // the first label is used as the dot "node name"; the others are escaped as labels + c.Labels = []string{"comment line 1\ncomment line 2 \"unterminated double quote", `second comment "double quote"`} + + var buf bytes.Buffer + ComposeDot(&buf, g, a, c) + + compareGraphs(t, buf.Bytes(), "compose9.dot") +} + +func baseGraph() *Graph { + src := &Node{ + Info: NodeInfo{Name: "src"}, + Flat: 10, + Cum: 25, + In: make(EdgeMap), + Out: make(EdgeMap), + LabelTags: make(TagMap), + NumericTags: make(map[string]TagMap), + } + dest := &Node{ + Info: NodeInfo{Name: "dest"}, + Flat: 15, + Cum: 25, + In: make(EdgeMap), + Out: make(EdgeMap), + LabelTags: make(TagMap), + NumericTags: make(map[string]TagMap), + } + edge := &Edge{ + Src: src, + Dest: dest, + Weight: 10, + } + src.Out[dest] = edge + src.In[src] = edge + return &Graph{ + Nodes: Nodes{ + src, + dest, + }, + } +} + +func baseAttrsAndConfig() (*DotAttributes, *DotConfig) { + a := &DotAttributes{ + Nodes: make(map[*Node]*DotNodeAttributes), + } + c := &DotConfig{ + Title: "testtitle", + Labels: []string{"label1", "label2", `label3: "foo"`}, + Total: 100, + FormatValue: func(v int64) string { + return strconv.FormatInt(v, 10) + }, + } + return a, c +} + +func compareGraphs(t *testing.T, got []byte, wantFile string) { + wantFile = filepath.Join("testdata", wantFile) + want, err := os.ReadFile(wantFile) + if err != nil { + t.Fatalf("error reading test file %s: %v", wantFile, err) + } + + if string(got) != string(want) { + d, err := proftest.Diff(got, want) + if err != nil { + t.Fatalf("error finding diff: %v", err) + } + t.Errorf("Compose incorrectly wrote %s", string(d)) + if *updateFlag { + err := os.WriteFile(wantFile, got, 0644) + if err != nil { + t.Errorf("failed to update the golden file %q: %v", wantFile, err) + } + } + } +} + +func TestNodeletCountCapping(t *testing.T) { + labelTags := make(TagMap) + for i := 0; i < 10; i++ { + name := fmt.Sprintf("tag-%d", i) + labelTags[name] = &Tag{ + Name: name, + Flat: 10, + Cum: 10, + } + } + numTags := make(TagMap) + for i := 0; i < 10; i++ { + name := fmt.Sprintf("num-tag-%d", i) + numTags[name] = &Tag{ + Name: name, + Unit: "mb", + Value: 16, + Flat: 10, + Cum: 10, + } + } + node1 := &Node{ + Info: NodeInfo{Name: "node1-with-tags"}, + Flat: 10, + Cum: 10, + NumericTags: map[string]TagMap{"": numTags}, + LabelTags: labelTags, + } + node2 := &Node{ + Info: NodeInfo{Name: "node2"}, + Flat: 15, + Cum: 15, + } + node3 := &Node{ + Info: NodeInfo{Name: "node3"}, + Flat: 15, + Cum: 15, + } + g := &Graph{ + Nodes: Nodes{ + node1, + node2, + node3, + }, + } + for n := 1; n <= 3; n++ { + input := maxNodelets + n + if got, want := len(g.SelectTopNodes(input, true)), n; got != want { + t.Errorf("SelectTopNodes(%d): got %d nodes, want %d", input, got, want) + } + } +} + +func TestMultilinePrintableName(t *testing.T) { + ni := &NodeInfo{ + Name: "test1.test2::test3", + File: "src/file.cc", + Address: 123, + Lineno: 999, + } + + want := fmt.Sprintf(`%016x\ntest1\ntest2\ntest3\nfile.cc:999\n`, 123) + if got := multilinePrintableName(ni); got != want { + t.Errorf("multilinePrintableName(%#v) == %q, want %q", ni, got, want) + } +} + +func TestTagCollapse(t *testing.T) { + + makeTag := func(name, unit string, value, flat, cum int64) *Tag { + return &Tag{name, unit, value, flat, 0, cum, 0} + } + + tagSource := []*Tag{ + makeTag("12mb", "mb", 12, 100, 100), + makeTag("1kb", "kb", 1, 1, 1), + makeTag("1mb", "mb", 1, 1000, 1000), + makeTag("2048mb", "mb", 2048, 1000, 1000), + makeTag("1b", "b", 1, 100, 100), + makeTag("2b", "b", 2, 100, 100), + makeTag("7b", "b", 7, 100, 100), + } + + tagWant := [][]*Tag{ + { + makeTag("1B..2GB", "", 0, 2401, 2401), + }, + { + makeTag("2GB", "", 0, 1000, 1000), + makeTag("1B..12MB", "", 0, 1401, 1401), + }, + { + makeTag("2GB", "", 0, 1000, 1000), + makeTag("12MB", "", 0, 100, 100), + makeTag("1B..1MB", "", 0, 1301, 1301), + }, + { + makeTag("2GB", "", 0, 1000, 1000), + makeTag("1MB", "", 0, 1000, 1000), + makeTag("2B..1kB", "", 0, 201, 201), + makeTag("1B", "", 0, 100, 100), + makeTag("12MB", "", 0, 100, 100), + }, + } + + for _, tc := range tagWant { + var got, want []*Tag + b := builder{nil, &DotAttributes{}, &DotConfig{}} + got = b.collapsedTags(tagSource, len(tc), true) + want = SortTags(tc, true) + + if !reflect.DeepEqual(got, want) { + t.Errorf("collapse to %d, got:\n%v\nwant:\n%v", len(tc), tagString(got), tagString(want)) + } + } +} + +func TestEscapeForDot(t *testing.T) { + for _, tc := range []struct { + desc string + input []string + want []string + }{ + { + desc: "with multiple doubles quotes", + input: []string{`label: "foo" and "bar"`}, + want: []string{`label: \"foo\" and \"bar\"`}, + }, + { + desc: "with graphviz center line character", + input: []string{"label: foo \n bar"}, + want: []string{`label: foo \l bar`}, + }, + { + desc: "with two backslashes", + input: []string{`label: \\`}, + want: []string{`label: \\\\`}, + }, + { + desc: "with two double quotes together", + input: []string{`label: ""`}, + want: []string{`label: \"\"`}, + }, + { + desc: "with multiple labels", + input: []string{`label1: "foo"`, `label2: "bar"`}, + want: []string{`label1: \"foo\"`, `label2: \"bar\"`}, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + if got := escapeAllForDot(tc.input); !reflect.DeepEqual(got, tc.want) { + t.Errorf("escapeAllForDot(%s) = %s, want %s", tc.input, got, tc.want) + } + }) + } +} + +func tagString(t []*Tag) string { + var ret []string + for _, s := range t { + ret = append(ret, fmt.Sprintln(s)) + } + return strings.Join(ret, ":") +} diff --git a/plugin/debug/pkg/internal/graph/graph.go b/plugin/debug/pkg/internal/graph/graph.go new file mode 100644 index 00000000..263ea956 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/graph.go @@ -0,0 +1,1177 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package graph collects a set of samples into a directed graph. +package graph + +import ( + "fmt" + "math" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + + "m7s.live/v5/plugin/debug/pkg/profile" +) + +var ( + // Removes package name and method arguments for Java method names. + // See tests for examples. + javaRegExp = regexp.MustCompile(`^(?:[a-z]\w*\.)*([A-Z][\w\$]*\.(?:|[a-z][\w\$]*(?:\$\d+)?))(?:(?:\()|$)`) + // Removes package name and method arguments for Go function names. + // See tests for examples. + goRegExp = regexp.MustCompile(`^(?:[\w\-\.]+\/)+([^.]+\..+)`) + // Removes potential module versions in a package path. + goVerRegExp = regexp.MustCompile(`^(.*?)/v(?:[2-9]|[1-9][0-9]+)([./].*)$`) + // Strips C++ namespace prefix from a C++ function / method name. + // NOTE: Make sure to keep the template parameters in the name. Normally, + // template parameters are stripped from the C++ names but when + // -symbolize=demangle=templates flag is used, they will not be. + // See tests for examples. + cppRegExp = regexp.MustCompile(`^(?:[_a-zA-Z]\w*::)+(_*[A-Z]\w*::~?[_a-zA-Z]\w*(?:<.*>)?)`) + cppAnonymousPrefixRegExp = regexp.MustCompile(`^\(anonymous namespace\)::`) +) + +// Graph summarizes a performance profile into a format that is +// suitable for visualization. +type Graph struct { + Nodes Nodes +} + +// Options encodes the options for constructing a graph +type Options struct { + SampleValue func(s []int64) int64 // Function to compute the value of a sample + SampleMeanDivisor func(s []int64) int64 // Function to compute the divisor for mean graphs, or nil + FormatTag func(int64, string) string // Function to format a sample tag value into a string + ObjNames bool // Always preserve obj filename + OrigFnNames bool // Preserve original (eg mangled) function names + + CallTree bool // Build a tree instead of a graph + DropNegative bool // Drop nodes with overall negative values + + KeptNodes NodeSet // If non-nil, only use nodes in this set +} + +// Nodes is an ordered collection of graph nodes. +type Nodes []*Node + +// Node is an entry on a profiling report. It represents a unique +// program location. +type Node struct { + // Info describes the source location associated to this node. + Info NodeInfo + + // Function represents the function that this node belongs to. On + // graphs with sub-function resolution (eg line number or + // addresses), two nodes in a NodeMap that are part of the same + // function have the same value of Node.Function. If the Node + // represents the whole function, it points back to itself. + Function *Node + + // Values associated to this node. Flat is exclusive to this node, + // Cum includes all descendents. + Flat, FlatDiv, Cum, CumDiv int64 + + // In and out Contains the nodes immediately reaching or reached by + // this node. + In, Out EdgeMap + + // LabelTags provide additional information about subsets of a sample. + LabelTags TagMap + + // NumericTags provide additional values for subsets of a sample. + // Numeric tags are optionally associated to a label tag. The key + // for NumericTags is the name of the LabelTag they are associated + // to, or "" for numeric tags not associated to a label tag. + NumericTags map[string]TagMap +} + +// FlatValue returns the exclusive value for this node, computing the +// mean if a divisor is available. +func (n *Node) FlatValue() int64 { + if n.FlatDiv == 0 { + return n.Flat + } + return n.Flat / n.FlatDiv +} + +// CumValue returns the inclusive value for this node, computing the +// mean if a divisor is available. +func (n *Node) CumValue() int64 { + if n.CumDiv == 0 { + return n.Cum + } + return n.Cum / n.CumDiv +} + +// AddToEdge increases the weight of an edge between two nodes. If +// there isn't such an edge one is created. +func (n *Node) AddToEdge(to *Node, v int64, residual, inline bool) { + n.AddToEdgeDiv(to, 0, v, residual, inline) +} + +// AddToEdgeDiv increases the weight of an edge between two nodes. If +// there isn't such an edge one is created. +func (n *Node) AddToEdgeDiv(to *Node, dv, v int64, residual, inline bool) { + if n.Out[to] != to.In[n] { + panic(fmt.Errorf("asymmetric edges %v %v", *n, *to)) + } + + if e := n.Out[to]; e != nil { + e.WeightDiv += dv + e.Weight += v + if residual { + e.Residual = true + } + if !inline { + e.Inline = false + } + return + } + + info := &Edge{Src: n, Dest: to, WeightDiv: dv, Weight: v, Residual: residual, Inline: inline} + n.Out[to] = info + to.In[n] = info +} + +// NodeInfo contains the attributes for a node. +type NodeInfo struct { + Name string + OrigName string + Address uint64 + File string + StartLine, Lineno int + Columnno int + Objfile string +} + +// PrintableName calls the Node's Formatter function with a single space separator. +func (i *NodeInfo) PrintableName() string { + return strings.Join(i.NameComponents(), " ") +} + +// NameComponents returns the components of the printable name to be used for a node. +func (i *NodeInfo) NameComponents() []string { + var name []string + if i.Address != 0 { + name = append(name, fmt.Sprintf("%016x", i.Address)) + } + if fun := i.Name; fun != "" { + name = append(name, fun) + } + + switch { + case i.Lineno != 0: + s := fmt.Sprintf("%s:%d", i.File, i.Lineno) + if i.Columnno != 0 { + s += fmt.Sprintf(":%d", i.Columnno) + } + // User requested line numbers, provide what we have. + name = append(name, s) + case i.File != "": + // User requested file name, provide it. + name = append(name, i.File) + case i.Name != "": + // User requested function name. It was already included. + case i.Objfile != "": + // Only binary name is available + name = append(name, "["+filepath.Base(i.Objfile)+"]") + default: + // Do not leave it empty if there is no information at all. + name = append(name, "") + } + return name +} + +// NodeMap maps from a node info struct to a node. It is used to merge +// report entries with the same info. +type NodeMap map[NodeInfo]*Node + +// NodeSet is a collection of node info structs. +type NodeSet map[NodeInfo]bool + +// NodePtrSet is a collection of nodes. Trimming a graph or tree requires a set +// of objects which uniquely identify the nodes to keep. In a graph, NodeInfo +// works as a unique identifier; however, in a tree multiple nodes may share +// identical NodeInfos. A *Node does uniquely identify a node so we can use that +// instead. Though a *Node also uniquely identifies a node in a graph, +// currently, during trimming, graphs are rebuilt from scratch using only the +// NodeSet, so there would not be the required context of the initial graph to +// allow for the use of *Node. +type NodePtrSet map[*Node]bool + +// FindOrInsertNode takes the info for a node and either returns a matching node +// from the node map if one exists, or adds one to the map if one does not. +// If kept is non-nil, nodes are only added if they can be located on it. +func (nm NodeMap) FindOrInsertNode(info NodeInfo, kept NodeSet) *Node { + if kept != nil { + if _, ok := kept[info]; !ok { + return nil + } + } + + if n, ok := nm[info]; ok { + return n + } + + n := &Node{ + Info: info, + In: make(EdgeMap), + Out: make(EdgeMap), + LabelTags: make(TagMap), + NumericTags: make(map[string]TagMap), + } + nm[info] = n + if info.Address == 0 && info.Lineno == 0 { + // This node represents the whole function, so point Function + // back to itself. + n.Function = n + return n + } + // Find a node that represents the whole function. + info.Address = 0 + info.Lineno = 0 + info.Columnno = 0 + n.Function = nm.FindOrInsertNode(info, nil) + return n +} + +// EdgeMap is used to represent the incoming/outgoing edges from a node. +type EdgeMap map[*Node]*Edge + +// Edge contains any attributes to be represented about edges in a graph. +type Edge struct { + Src, Dest *Node + // The summary weight of the edge + Weight, WeightDiv int64 + + // residual edges connect nodes that were connected through a + // separate node, which has been removed from the report. + Residual bool + // An inline edge represents a call that was inlined into the caller. + Inline bool +} + +// WeightValue returns the weight value for this edge, normalizing if a +// divisor is available. +func (e *Edge) WeightValue() int64 { + if e.WeightDiv == 0 { + return e.Weight + } + return e.Weight / e.WeightDiv +} + +// Tag represent sample annotations +type Tag struct { + Name string + Unit string // Describe the value, "" for non-numeric tags + Value int64 + Flat, FlatDiv int64 + Cum, CumDiv int64 +} + +// FlatValue returns the exclusive value for this tag, computing the +// mean if a divisor is available. +func (t *Tag) FlatValue() int64 { + if t.FlatDiv == 0 { + return t.Flat + } + return t.Flat / t.FlatDiv +} + +// CumValue returns the inclusive value for this tag, computing the +// mean if a divisor is available. +func (t *Tag) CumValue() int64 { + if t.CumDiv == 0 { + return t.Cum + } + return t.Cum / t.CumDiv +} + +// TagMap is a collection of tags, classified by their name. +type TagMap map[string]*Tag + +// SortTags sorts a slice of tags based on their weight. +func SortTags(t []*Tag, flat bool) []*Tag { + ts := tags{t, flat} + sort.Sort(ts) + return ts.t +} + +// New summarizes performance data from a profile into a graph. +func New(prof *profile.Profile, o *Options) *Graph { + if o.CallTree { + return newTree(prof, o) + } + g, _ := newGraph(prof, o) + return g +} + +// newGraph computes a graph from a profile. It returns the graph, and +// a map from the profile location indices to the corresponding graph +// nodes. +func newGraph(prof *profile.Profile, o *Options) (*Graph, map[uint64]Nodes) { + nodes, locationMap := CreateNodes(prof, o) + seenNode := make(map[*Node]bool) + seenEdge := make(map[nodePair]bool) + for _, sample := range prof.Sample { + var w, dw int64 + w = o.SampleValue(sample.Value) + if o.SampleMeanDivisor != nil { + dw = o.SampleMeanDivisor(sample.Value) + } + if dw == 0 && w == 0 { + continue + } + for k := range seenNode { + delete(seenNode, k) + } + for k := range seenEdge { + delete(seenEdge, k) + } + var parent *Node + // A residual edge goes over one or more nodes that were not kept. + residual := false + + labels := joinLabels(sample) + // Group the sample frames, based on a global map. + for i := len(sample.Location) - 1; i >= 0; i-- { + l := sample.Location[i] + locNodes := locationMap[l.ID] + for ni := len(locNodes) - 1; ni >= 0; ni-- { + n := locNodes[ni] + if n == nil { + residual = true + continue + } + // Add cum weight to all nodes in stack, avoiding double counting. + if _, ok := seenNode[n]; !ok { + seenNode[n] = true + n.addSample(dw, w, labels, sample.NumLabel, sample.NumUnit, o.FormatTag, false) + } + // Update edge weights for all edges in stack, avoiding double counting. + if _, ok := seenEdge[nodePair{n, parent}]; !ok && parent != nil && n != parent { + seenEdge[nodePair{n, parent}] = true + parent.AddToEdgeDiv(n, dw, w, residual, ni != len(locNodes)-1) + } + parent = n + residual = false + } + } + if parent != nil && !residual { + // Add flat weight to leaf node. + parent.addSample(dw, w, labels, sample.NumLabel, sample.NumUnit, o.FormatTag, true) + } + } + + return selectNodesForGraph(nodes, o.DropNegative), locationMap +} + +func selectNodesForGraph(nodes Nodes, dropNegative bool) *Graph { + // Collect nodes into a graph. + gNodes := make(Nodes, 0, len(nodes)) + for _, n := range nodes { + if n == nil { + continue + } + if n.Cum == 0 && n.Flat == 0 { + continue + } + if dropNegative && isNegative(n) { + continue + } + gNodes = append(gNodes, n) + } + return &Graph{gNodes} +} + +type nodePair struct { + src, dest *Node +} + +func newTree(prof *profile.Profile, o *Options) (g *Graph) { + parentNodeMap := make(map[*Node]NodeMap, len(prof.Sample)) + for _, sample := range prof.Sample { + var w, dw int64 + w = o.SampleValue(sample.Value) + if o.SampleMeanDivisor != nil { + dw = o.SampleMeanDivisor(sample.Value) + } + if dw == 0 && w == 0 { + continue + } + var parent *Node + labels := joinLabels(sample) + // Group the sample frames, based on a per-node map. + for i := len(sample.Location) - 1; i >= 0; i-- { + l := sample.Location[i] + lines := l.Line + if len(lines) == 0 { + lines = []profile.Line{{}} // Create empty line to include location info. + } + for lidx := len(lines) - 1; lidx >= 0; lidx-- { + nodeMap := parentNodeMap[parent] + if nodeMap == nil { + nodeMap = make(NodeMap) + parentNodeMap[parent] = nodeMap + } + n := nodeMap.findOrInsertLine(l, lines[lidx], o) + if n == nil { + continue + } + n.addSample(dw, w, labels, sample.NumLabel, sample.NumUnit, o.FormatTag, false) + if parent != nil { + parent.AddToEdgeDiv(n, dw, w, false, lidx != len(lines)-1) + } + parent = n + } + } + if parent != nil { + parent.addSample(dw, w, labels, sample.NumLabel, sample.NumUnit, o.FormatTag, true) + } + } + + nodes := make(Nodes, 0, len(prof.Location)) + for _, nm := range parentNodeMap { + nodes = append(nodes, nm.nodes()...) + } + return selectNodesForGraph(nodes, o.DropNegative) +} + +// ShortenFunctionName returns a shortened version of a function's name. +func ShortenFunctionName(f string) string { + f = cppAnonymousPrefixRegExp.ReplaceAllString(f, "") + f = goVerRegExp.ReplaceAllString(f, `${1}${2}`) + for _, re := range []*regexp.Regexp{goRegExp, javaRegExp, cppRegExp} { + if matches := re.FindStringSubmatch(f); len(matches) >= 2 { + return strings.Join(matches[1:], "") + } + } + return f +} + +// TrimTree trims a Graph in forest form, keeping only the nodes in kept. This +// will not work correctly if even a single node has multiple parents. +func (g *Graph) TrimTree(kept NodePtrSet) { + // Creates a new list of nodes + oldNodes := g.Nodes + g.Nodes = make(Nodes, 0, len(kept)) + + for _, cur := range oldNodes { + // A node may not have multiple parents + if len(cur.In) > 1 { + panic("TrimTree only works on trees") + } + + // If a node should be kept, add it to the new list of nodes + if _, ok := kept[cur]; ok { + g.Nodes = append(g.Nodes, cur) + continue + } + + // If a node has no parents, then delete all of the in edges of its + // children to make them each roots of their own trees. + if len(cur.In) == 0 { + for _, outEdge := range cur.Out { + delete(outEdge.Dest.In, cur) + } + continue + } + + // Get the parent. This works since at this point cur.In must contain only + // one element. + if len(cur.In) != 1 { + panic("Get parent assertion failed. cur.In expected to be of length 1.") + } + var parent *Node + for _, edge := range cur.In { + parent = edge.Src + } + + parentEdgeInline := parent.Out[cur].Inline + + // Remove the edge from the parent to this node + delete(parent.Out, cur) + + // Reconfigure every edge from the current node to now begin at the parent. + for _, outEdge := range cur.Out { + child := outEdge.Dest + + delete(child.In, cur) + child.In[parent] = outEdge + parent.Out[child] = outEdge + + outEdge.Src = parent + outEdge.Residual = true + // If the edge from the parent to the current node and the edge from the + // current node to the child are both inline, then this resulting residual + // edge should also be inline + outEdge.Inline = parentEdgeInline && outEdge.Inline + } + } + g.RemoveRedundantEdges() +} + +func joinLabels(s *profile.Sample) string { + if len(s.Label) == 0 { + return "" + } + + var labels []string + for key, vals := range s.Label { + for _, v := range vals { + labels = append(labels, key+":"+v) + } + } + sort.Strings(labels) + return strings.Join(labels, `\n`) +} + +// isNegative returns true if the node is considered as "negative" for the +// purposes of drop_negative. +func isNegative(n *Node) bool { + switch { + case n.Flat < 0: + return true + case n.Flat == 0 && n.Cum < 0: + return true + default: + return false + } +} + +// CreateNodes creates graph nodes for all locations in a profile. It +// returns set of all nodes, plus a mapping of each location to the +// set of corresponding nodes (one per location.Line). +func CreateNodes(prof *profile.Profile, o *Options) (Nodes, map[uint64]Nodes) { + locations := make(map[uint64]Nodes, len(prof.Location)) + nm := make(NodeMap, len(prof.Location)) + for _, l := range prof.Location { + lines := l.Line + if len(lines) == 0 { + lines = []profile.Line{{}} // Create empty line to include location info. + } + nodes := make(Nodes, len(lines)) + for ln := range lines { + nodes[ln] = nm.findOrInsertLine(l, lines[ln], o) + } + locations[l.ID] = nodes + } + return nm.nodes(), locations +} + +func (nm NodeMap) nodes() Nodes { + nodes := make(Nodes, 0, len(nm)) + for _, n := range nm { + nodes = append(nodes, n) + } + return nodes +} + +func (nm NodeMap) findOrInsertLine(l *profile.Location, li profile.Line, o *Options) *Node { + var objfile string + if m := l.Mapping; m != nil && m.File != "" { + objfile = m.File + } + + if ni := nodeInfo(l, li, objfile, o); ni != nil { + return nm.FindOrInsertNode(*ni, o.KeptNodes) + } + return nil +} + +func nodeInfo(l *profile.Location, line profile.Line, objfile string, o *Options) *NodeInfo { + if line.Function == nil { + return &NodeInfo{Address: l.Address, Objfile: objfile} + } + ni := &NodeInfo{ + Address: l.Address, + Lineno: int(line.Line), + Columnno: int(line.Column), + Name: line.Function.Name, + } + if fname := line.Function.Filename; fname != "" { + ni.File = filepath.Clean(fname) + } + if o.OrigFnNames { + ni.OrigName = line.Function.SystemName + } + if o.ObjNames || (ni.Name == "" && ni.OrigName == "") { + ni.Objfile = objfile + ni.StartLine = int(line.Function.StartLine) + } + return ni +} + +type tags struct { + t []*Tag + flat bool +} + +func (t tags) Len() int { return len(t.t) } +func (t tags) Swap(i, j int) { t.t[i], t.t[j] = t.t[j], t.t[i] } +func (t tags) Less(i, j int) bool { + if !t.flat { + if t.t[i].Cum != t.t[j].Cum { + return abs64(t.t[i].Cum) > abs64(t.t[j].Cum) + } + } + if t.t[i].Flat != t.t[j].Flat { + return abs64(t.t[i].Flat) > abs64(t.t[j].Flat) + } + return t.t[i].Name < t.t[j].Name +} + +// Sum adds the flat and cum values of a set of nodes. +func (ns Nodes) Sum() (flat int64, cum int64) { + for _, n := range ns { + flat += n.Flat + cum += n.Cum + } + return +} + +func (n *Node) addSample(dw, w int64, labels string, numLabel map[string][]int64, numUnit map[string][]string, format func(int64, string) string, flat bool) { + // Update sample value + if flat { + n.FlatDiv += dw + n.Flat += w + } else { + n.CumDiv += dw + n.Cum += w + } + + // Add string tags + if labels != "" { + t := n.LabelTags.findOrAddTag(labels, "", 0) + if flat { + t.FlatDiv += dw + t.Flat += w + } else { + t.CumDiv += dw + t.Cum += w + } + } + + numericTags := n.NumericTags[labels] + if numericTags == nil { + numericTags = TagMap{} + n.NumericTags[labels] = numericTags + } + // Add numeric tags + if format == nil { + format = defaultLabelFormat + } + for k, nvals := range numLabel { + units := numUnit[k] + for i, v := range nvals { + var t *Tag + if len(units) > 0 { + t = numericTags.findOrAddTag(format(v, units[i]), units[i], v) + } else { + t = numericTags.findOrAddTag(format(v, k), k, v) + } + if flat { + t.FlatDiv += dw + t.Flat += w + } else { + t.CumDiv += dw + t.Cum += w + } + } + } +} + +func defaultLabelFormat(v int64, key string) string { + return strconv.FormatInt(v, 10) +} + +func (m TagMap) findOrAddTag(label, unit string, value int64) *Tag { + l := m[label] + if l == nil { + l = &Tag{ + Name: label, + Unit: unit, + Value: value, + } + m[label] = l + } + return l +} + +// String returns a text representation of a graph, for debugging purposes. +func (g *Graph) String() string { + var s []string + + nodeIndex := make(map[*Node]int, len(g.Nodes)) + + for i, n := range g.Nodes { + nodeIndex[n] = i + 1 + } + + for i, n := range g.Nodes { + name := n.Info.PrintableName() + var in, out []int + + for _, from := range n.In { + in = append(in, nodeIndex[from.Src]) + } + for _, to := range n.Out { + out = append(out, nodeIndex[to.Dest]) + } + s = append(s, fmt.Sprintf("%d: %s[flat=%d cum=%d] %x -> %v ", i+1, name, n.Flat, n.Cum, in, out)) + } + return strings.Join(s, "\n") +} + +// DiscardLowFrequencyNodes returns a set of the nodes at or over a +// specific cum value cutoff. +func (g *Graph) DiscardLowFrequencyNodes(nodeCutoff int64) NodeSet { + return makeNodeSet(g.Nodes, nodeCutoff) +} + +// DiscardLowFrequencyNodePtrs returns a NodePtrSet of nodes at or over a +// specific cum value cutoff. +func (g *Graph) DiscardLowFrequencyNodePtrs(nodeCutoff int64) NodePtrSet { + cutNodes := getNodesAboveCumCutoff(g.Nodes, nodeCutoff) + kept := make(NodePtrSet, len(cutNodes)) + for _, n := range cutNodes { + kept[n] = true + } + return kept +} + +func makeNodeSet(nodes Nodes, nodeCutoff int64) NodeSet { + cutNodes := getNodesAboveCumCutoff(nodes, nodeCutoff) + kept := make(NodeSet, len(cutNodes)) + for _, n := range cutNodes { + kept[n.Info] = true + } + return kept +} + +// getNodesAboveCumCutoff returns all the nodes which have a Cum value greater +// than or equal to cutoff. +func getNodesAboveCumCutoff(nodes Nodes, nodeCutoff int64) Nodes { + cutoffNodes := make(Nodes, 0, len(nodes)) + for _, n := range nodes { + if abs64(n.Cum) < nodeCutoff { + continue + } + cutoffNodes = append(cutoffNodes, n) + } + return cutoffNodes +} + +// TrimLowFrequencyTags removes tags that have less than +// the specified weight. +func (g *Graph) TrimLowFrequencyTags(tagCutoff int64) { + // Remove nodes with value <= total*nodeFraction + for _, n := range g.Nodes { + n.LabelTags = trimLowFreqTags(n.LabelTags, tagCutoff) + for s, nt := range n.NumericTags { + n.NumericTags[s] = trimLowFreqTags(nt, tagCutoff) + } + } +} + +func trimLowFreqTags(tags TagMap, minValue int64) TagMap { + kept := TagMap{} + for s, t := range tags { + if abs64(t.Flat) >= minValue || abs64(t.Cum) >= minValue { + kept[s] = t + } + } + return kept +} + +// TrimLowFrequencyEdges removes edges that have less than +// the specified weight. Returns the number of edges removed +func (g *Graph) TrimLowFrequencyEdges(edgeCutoff int64) int { + var droppedEdges int + for _, n := range g.Nodes { + for src, e := range n.In { + if abs64(e.Weight) < edgeCutoff { + delete(n.In, src) + delete(src.Out, n) + droppedEdges++ + } + } + } + return droppedEdges +} + +// SortNodes sorts the nodes in a graph based on a specific heuristic. +func (g *Graph) SortNodes(cum bool, visualMode bool) { + // Sort nodes based on requested mode + switch { + case visualMode: + // Specialized sort to produce a more visually-interesting graph + g.Nodes.Sort(EntropyOrder) + case cum: + g.Nodes.Sort(CumNameOrder) + default: + g.Nodes.Sort(FlatNameOrder) + } +} + +// SelectTopNodePtrs returns a set of the top maxNodes *Node in a graph. +func (g *Graph) SelectTopNodePtrs(maxNodes int, visualMode bool) NodePtrSet { + set := make(NodePtrSet) + for _, node := range g.selectTopNodes(maxNodes, visualMode) { + set[node] = true + } + return set +} + +// SelectTopNodes returns a set of the top maxNodes nodes in a graph. +func (g *Graph) SelectTopNodes(maxNodes int, visualMode bool) NodeSet { + return makeNodeSet(g.selectTopNodes(maxNodes, visualMode), 0) +} + +// selectTopNodes returns a slice of the top maxNodes nodes in a graph. +func (g *Graph) selectTopNodes(maxNodes int, visualMode bool) Nodes { + if maxNodes > 0 { + if visualMode { + var count int + // If generating a visual graph, count tags as nodes. Update + // maxNodes to account for them. + for i, n := range g.Nodes { + tags := countTags(n) + if tags > maxNodelets { + tags = maxNodelets + } + if count += tags + 1; count >= maxNodes { + maxNodes = i + 1 + break + } + } + } + } + if maxNodes > len(g.Nodes) { + maxNodes = len(g.Nodes) + } + return g.Nodes[:maxNodes] +} + +// countTags counts the tags with flat count. This underestimates the +// number of tags being displayed, but in practice is close enough. +func countTags(n *Node) int { + count := 0 + for _, e := range n.LabelTags { + if e.Flat != 0 { + count++ + } + } + for _, t := range n.NumericTags { + for _, e := range t { + if e.Flat != 0 { + count++ + } + } + } + return count +} + +// RemoveRedundantEdges removes residual edges if the destination can +// be reached through another path. This is done to simplify the graph +// while preserving connectivity. +func (g *Graph) RemoveRedundantEdges() { + // Walk the nodes and outgoing edges in reverse order to prefer + // removing edges with the lowest weight. + for i := len(g.Nodes); i > 0; i-- { + n := g.Nodes[i-1] + in := n.In.Sort() + for j := len(in); j > 0; j-- { + e := in[j-1] + if !e.Residual { + // Do not remove edges heavier than a non-residual edge, to + // avoid potential confusion. + break + } + if isRedundantEdge(e) { + delete(e.Src.Out, e.Dest) + delete(e.Dest.In, e.Src) + } + } + } +} + +// isRedundantEdge determines if there is a path that allows e.Src +// to reach e.Dest after removing e. +func isRedundantEdge(e *Edge) bool { + src, n := e.Src, e.Dest + seen := map[*Node]bool{n: true} + queue := Nodes{n} + for len(queue) > 0 { + n := queue[0] + queue = queue[1:] + for _, ie := range n.In { + if e == ie || seen[ie.Src] { + continue + } + if ie.Src == src { + return true + } + seen[ie.Src] = true + queue = append(queue, ie.Src) + } + } + return false +} + +// nodeSorter is a mechanism used to allow a report to be sorted +// in different ways. +type nodeSorter struct { + rs Nodes + less func(l, r *Node) bool +} + +func (s nodeSorter) Len() int { return len(s.rs) } +func (s nodeSorter) Swap(i, j int) { s.rs[i], s.rs[j] = s.rs[j], s.rs[i] } +func (s nodeSorter) Less(i, j int) bool { return s.less(s.rs[i], s.rs[j]) } + +// Sort reorders a slice of nodes based on the specified ordering +// criteria. The result is sorted in decreasing order for (absolute) +// numeric quantities, alphabetically for text, and increasing for +// addresses. +func (ns Nodes) Sort(o NodeOrder) error { + var s nodeSorter + + switch o { + case FlatNameOrder: + s = nodeSorter{ns, + func(l, r *Node) bool { + if iv, jv := abs64(l.Flat), abs64(r.Flat); iv != jv { + return iv > jv + } + if iv, jv := l.Info.PrintableName(), r.Info.PrintableName(); iv != jv { + return iv < jv + } + if iv, jv := abs64(l.Cum), abs64(r.Cum); iv != jv { + return iv > jv + } + return compareNodes(l, r) + }, + } + case FlatCumNameOrder: + s = nodeSorter{ns, + func(l, r *Node) bool { + if iv, jv := abs64(l.Flat), abs64(r.Flat); iv != jv { + return iv > jv + } + if iv, jv := abs64(l.Cum), abs64(r.Cum); iv != jv { + return iv > jv + } + if iv, jv := l.Info.PrintableName(), r.Info.PrintableName(); iv != jv { + return iv < jv + } + return compareNodes(l, r) + }, + } + case NameOrder: + s = nodeSorter{ns, + func(l, r *Node) bool { + if iv, jv := l.Info.Name, r.Info.Name; iv != jv { + return iv < jv + } + return compareNodes(l, r) + }, + } + case FileOrder: + s = nodeSorter{ns, + func(l, r *Node) bool { + if iv, jv := l.Info.File, r.Info.File; iv != jv { + return iv < jv + } + if iv, jv := l.Info.StartLine, r.Info.StartLine; iv != jv { + return iv < jv + } + return compareNodes(l, r) + }, + } + case AddressOrder: + s = nodeSorter{ns, + func(l, r *Node) bool { + if iv, jv := l.Info.Address, r.Info.Address; iv != jv { + return iv < jv + } + return compareNodes(l, r) + }, + } + case CumNameOrder, EntropyOrder: + // Hold scoring for score-based ordering + var score map[*Node]int64 + scoreOrder := func(l, r *Node) bool { + if iv, jv := abs64(score[l]), abs64(score[r]); iv != jv { + return iv > jv + } + if iv, jv := l.Info.PrintableName(), r.Info.PrintableName(); iv != jv { + return iv < jv + } + if iv, jv := abs64(l.Flat), abs64(r.Flat); iv != jv { + return iv > jv + } + return compareNodes(l, r) + } + + switch o { + case CumNameOrder: + score = make(map[*Node]int64, len(ns)) + for _, n := range ns { + score[n] = n.Cum + } + s = nodeSorter{ns, scoreOrder} + case EntropyOrder: + score = make(map[*Node]int64, len(ns)) + for _, n := range ns { + score[n] = entropyScore(n) + } + s = nodeSorter{ns, scoreOrder} + } + default: + return fmt.Errorf("report: unrecognized sort ordering: %d", o) + } + sort.Sort(s) + return nil +} + +// compareNodes compares two nodes to provide a deterministic ordering +// between them. Two nodes cannot have the same Node.Info value. +func compareNodes(l, r *Node) bool { + return fmt.Sprint(l.Info) < fmt.Sprint(r.Info) +} + +// entropyScore computes a score for a node representing how important +// it is to include this node on a graph visualization. It is used to +// sort the nodes and select which ones to display if we have more +// nodes than desired in the graph. This number is computed by looking +// at the flat and cum weights of the node and the incoming/outgoing +// edges. The fundamental idea is to penalize nodes that have a simple +// fallthrough from their incoming to the outgoing edge. +func entropyScore(n *Node) int64 { + score := float64(0) + + if len(n.In) == 0 { + score++ // Favor entry nodes + } else { + score += edgeEntropyScore(n, n.In, 0) + } + + if len(n.Out) == 0 { + score++ // Favor leaf nodes + } else { + score += edgeEntropyScore(n, n.Out, n.Flat) + } + + return int64(score*float64(n.Cum)) + n.Flat +} + +// edgeEntropyScore computes the entropy value for a set of edges +// coming in or out of a node. Entropy (as defined in information +// theory) refers to the amount of information encoded by the set of +// edges. A set of edges that have a more interesting distribution of +// samples gets a higher score. +func edgeEntropyScore(n *Node, edges EdgeMap, self int64) float64 { + score := float64(0) + total := self + for _, e := range edges { + if e.Weight > 0 { + total += abs64(e.Weight) + } + } + if total != 0 { + for _, e := range edges { + frac := float64(abs64(e.Weight)) / float64(total) + score += -frac * math.Log2(frac) + } + if self > 0 { + frac := float64(abs64(self)) / float64(total) + score += -frac * math.Log2(frac) + } + } + return score +} + +// NodeOrder sets the ordering for a Sort operation +type NodeOrder int + +// Sorting options for node sort. +const ( + FlatNameOrder NodeOrder = iota + FlatCumNameOrder + CumNameOrder + NameOrder + FileOrder + AddressOrder + EntropyOrder +) + +// Sort returns a slice of the edges in the map, in a consistent +// order. The sort order is first based on the edge weight +// (higher-to-lower) and then by the node names to avoid flakiness. +func (e EdgeMap) Sort() []*Edge { + el := make(edgeList, 0, len(e)) + for _, w := range e { + el = append(el, w) + } + + sort.Sort(el) + return el +} + +// Sum returns the total weight for a set of nodes. +func (e EdgeMap) Sum() int64 { + var ret int64 + for _, edge := range e { + ret += edge.Weight + } + return ret +} + +type edgeList []*Edge + +func (el edgeList) Len() int { + return len(el) +} + +func (el edgeList) Less(i, j int) bool { + if el[i].Weight != el[j].Weight { + return abs64(el[i].Weight) > abs64(el[j].Weight) + } + + from1 := el[i].Src.Info.PrintableName() + from2 := el[j].Src.Info.PrintableName() + if from1 != from2 { + return from1 < from2 + } + + to1 := el[i].Dest.Info.PrintableName() + to2 := el[j].Dest.Info.PrintableName() + + return to1 < to2 +} + +func (el edgeList) Swap(i, j int) { + el[i], el[j] = el[j], el[i] +} + +func abs64(i int64) int64 { + if i < 0 { + return -i + } + return i +} diff --git a/plugin/debug/pkg/internal/graph/graph_test.go b/plugin/debug/pkg/internal/graph/graph_test.go new file mode 100644 index 00000000..051eaa2b --- /dev/null +++ b/plugin/debug/pkg/internal/graph/graph_test.go @@ -0,0 +1,547 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package graph + +import ( + "fmt" + "testing" + + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func edgeDebugString(edge *Edge) string { + debug := "" + debug += fmt.Sprintf("\t\tSrc: %p\n", edge.Src) + debug += fmt.Sprintf("\t\tDest: %p\n", edge.Dest) + debug += fmt.Sprintf("\t\tWeight: %d\n", edge.Weight) + debug += fmt.Sprintf("\t\tResidual: %t\n", edge.Residual) + debug += fmt.Sprintf("\t\tInline: %t\n", edge.Inline) + return debug +} + +func edgeMapsDebugString(in, out EdgeMap) string { + debug := "" + debug += "In Edges:\n" + for parent, edge := range in { + debug += fmt.Sprintf("\tParent: %p\n", parent) + debug += edgeDebugString(edge) + } + debug += "Out Edges:\n" + for child, edge := range out { + debug += fmt.Sprintf("\tChild: %p\n", child) + debug += edgeDebugString(edge) + } + return debug +} + +func graphDebugString(graph *Graph) string { + debug := "" + for i, node := range graph.Nodes { + debug += fmt.Sprintf("Node %d: %p\n", i, node) + } + + for i, node := range graph.Nodes { + debug += "\n" + debug += fmt.Sprintf("=== Node %d: %p ===\n", i, node) + debug += edgeMapsDebugString(node.In, node.Out) + } + return debug +} + +func expectedNodesDebugString(expected []expectedNode) string { + debug := "" + for i, node := range expected { + debug += fmt.Sprintf("Node %d: %p\n", i, node.node) + } + + for i, node := range expected { + debug += "\n" + debug += fmt.Sprintf("=== Node %d: %p ===\n", i, node.node) + debug += edgeMapsDebugString(node.in, node.out) + } + return debug +} + +// edgeMapsEqual checks if all the edges in this equal all the edges in that. +func edgeMapsEqual(this, that EdgeMap) bool { + if len(this) != len(that) { + return false + } + for node, thisEdge := range this { + if *thisEdge != *that[node] { + return false + } + } + return true +} + +// nodesEqual checks if node is equal to expected. +func nodesEqual(node *Node, expected expectedNode) bool { + return node == expected.node && edgeMapsEqual(node.In, expected.in) && + edgeMapsEqual(node.Out, expected.out) +} + +// graphsEqual checks if graph is equivalent to the graph templated by expected. +func graphsEqual(graph *Graph, expected []expectedNode) bool { + if len(graph.Nodes) != len(expected) { + return false + } + expectedSet := make(map[*Node]expectedNode) + for i := range expected { + expectedSet[expected[i].node] = expected[i] + } + + for _, node := range graph.Nodes { + expectedNode, found := expectedSet[node] + if !found || !nodesEqual(node, expectedNode) { + return false + } + } + return true +} + +type expectedNode struct { + node *Node + in, out EdgeMap +} + +type trimTreeTestcase struct { + initial *Graph + expected []expectedNode + keep NodePtrSet +} + +// makeExpectedEdgeResidual makes the edge from parent to child residual. +func makeExpectedEdgeResidual(parent, child expectedNode) { + parent.out[child.node].Residual = true + child.in[parent.node].Residual = true +} + +func makeEdgeInline(edgeMap EdgeMap, node *Node) { + edgeMap[node].Inline = true +} + +func setEdgeWeight(edgeMap EdgeMap, node *Node, weight int64) { + edgeMap[node].Weight = weight +} + +// createEdges creates directed edges from the parent to each of the children. +func createEdges(parent *Node, children ...*Node) { + for _, child := range children { + edge := &Edge{ + Src: parent, + Dest: child, + } + parent.Out[child] = edge + child.In[parent] = edge + } +} + +// createEmptyNode creates a node without any edges. +func createEmptyNode() *Node { + return &Node{ + In: make(EdgeMap), + Out: make(EdgeMap), + } +} + +// createExpectedNodes creates a slice of expectedNodes from nodes. +func createExpectedNodes(nodes ...*Node) ([]expectedNode, NodePtrSet) { + expected := make([]expectedNode, len(nodes)) + keep := make(NodePtrSet, len(nodes)) + + for i, node := range nodes { + expected[i] = expectedNode{ + node: node, + in: make(EdgeMap), + out: make(EdgeMap), + } + keep[node] = true + } + + return expected, keep +} + +// createExpectedEdges creates directed edges from the parent to each of the +// children. +func createExpectedEdges(parent expectedNode, children ...expectedNode) { + for _, child := range children { + edge := &Edge{ + Src: parent.node, + Dest: child.node, + } + parent.out[child.node] = edge + child.in[parent.node] = edge + } +} + +// createTestCase1 creates a test case that initially looks like: +// +// 0 +// |(5) +// 1 +// (3)/ \(4) +// 2 3. +// +// After keeping 0, 2, and 3, it expects the graph: +// +// 0 +// (3)/ \(4) +// 2 3. +func createTestCase1() trimTreeTestcase { + // Create initial graph + graph := &Graph{make(Nodes, 4)} + nodes := graph.Nodes + for i := range nodes { + nodes[i] = createEmptyNode() + } + createEdges(nodes[0], nodes[1]) + createEdges(nodes[1], nodes[2], nodes[3]) + makeEdgeInline(nodes[0].Out, nodes[1]) + makeEdgeInline(nodes[1].Out, nodes[2]) + setEdgeWeight(nodes[0].Out, nodes[1], 5) + setEdgeWeight(nodes[1].Out, nodes[2], 3) + setEdgeWeight(nodes[1].Out, nodes[3], 4) + + // Create expected graph + expected, keep := createExpectedNodes(nodes[0], nodes[2], nodes[3]) + createExpectedEdges(expected[0], expected[1], expected[2]) + makeEdgeInline(expected[0].out, expected[1].node) + makeExpectedEdgeResidual(expected[0], expected[1]) + makeExpectedEdgeResidual(expected[0], expected[2]) + setEdgeWeight(expected[0].out, expected[1].node, 3) + setEdgeWeight(expected[0].out, expected[2].node, 4) + return trimTreeTestcase{ + initial: graph, + expected: expected, + keep: keep, + } +} + +// createTestCase2 creates a test case that initially looks like: +// +// 3 +// | (12) +// 1 +// | (8) +// 2 +// | (15) +// 0 +// | (10) +// 4. +// +// After keeping 3 and 4, it expects the graph: +// +// 3 +// | (10) +// 4. +func createTestCase2() trimTreeTestcase { + // Create initial graph + graph := &Graph{make(Nodes, 5)} + nodes := graph.Nodes + for i := range nodes { + nodes[i] = createEmptyNode() + } + createEdges(nodes[3], nodes[1]) + createEdges(nodes[1], nodes[2]) + createEdges(nodes[2], nodes[0]) + createEdges(nodes[0], nodes[4]) + setEdgeWeight(nodes[3].Out, nodes[1], 12) + setEdgeWeight(nodes[1].Out, nodes[2], 8) + setEdgeWeight(nodes[2].Out, nodes[0], 15) + setEdgeWeight(nodes[0].Out, nodes[4], 10) + + // Create expected graph + expected, keep := createExpectedNodes(nodes[3], nodes[4]) + createExpectedEdges(expected[0], expected[1]) + makeExpectedEdgeResidual(expected[0], expected[1]) + setEdgeWeight(expected[0].out, expected[1].node, 10) + return trimTreeTestcase{ + initial: graph, + expected: expected, + keep: keep, + } +} + +// createTestCase3 creates an initially empty graph and expects an empty graph +// after trimming. +func createTestCase3() trimTreeTestcase { + graph := &Graph{make(Nodes, 0)} + expected, keep := createExpectedNodes() + return trimTreeTestcase{ + initial: graph, + expected: expected, + keep: keep, + } +} + +// createTestCase4 creates a test case that initially looks like: +// +// 0. +// +// After keeping 0, it expects the graph: +// +// 0. +func createTestCase4() trimTreeTestcase { + graph := &Graph{make(Nodes, 1)} + nodes := graph.Nodes + for i := range nodes { + nodes[i] = createEmptyNode() + } + expected, keep := createExpectedNodes(nodes[0]) + return trimTreeTestcase{ + initial: graph, + expected: expected, + keep: keep, + } +} + +func createTrimTreeTestCases() []trimTreeTestcase { + caseGenerators := []func() trimTreeTestcase{ + createTestCase1, + createTestCase2, + createTestCase3, + createTestCase4, + } + cases := make([]trimTreeTestcase, len(caseGenerators)) + for i, gen := range caseGenerators { + cases[i] = gen() + } + return cases +} + +func TestTrimTree(t *testing.T) { + tests := createTrimTreeTestCases() + for _, test := range tests { + graph := test.initial + graph.TrimTree(test.keep) + if !graphsEqual(graph, test.expected) { + t.Fatalf("Graphs do not match.\nExpected: %s\nFound: %s\n", + expectedNodesDebugString(test.expected), + graphDebugString(graph)) + } + } +} + +func nodeTestProfile() *profile.Profile { + mappings := []*profile.Mapping{ + { + ID: 1, + File: "symbolized_binary", + }, + { + ID: 2, + File: "unsymbolized_library_1", + }, + { + ID: 3, + File: "unsymbolized_library_2", + }, + } + functions := []*profile.Function{ + {ID: 1, Name: "symname"}, + {ID: 2}, + } + locations := []*profile.Location{ + { + ID: 1, + Mapping: mappings[0], + Line: []profile.Line{ + {Function: functions[0]}, + }, + }, + { + ID: 2, + Mapping: mappings[1], + Line: []profile.Line{ + {Function: functions[1]}, + }, + }, + { + ID: 3, + Mapping: mappings[2], + }, + } + return &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + SampleType: []*profile.ValueType{ + {Type: "type", Unit: "unit"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{locations[0]}, + Value: []int64{1}, + }, + { + Location: []*profile.Location{locations[1]}, + Value: []int64{1}, + }, + { + Location: []*profile.Location{locations[2]}, + Value: []int64{1}, + }, + }, + Location: locations, + Function: functions, + Mapping: mappings, + } +} + +// TestCreateNodes checks that nodes are properly created for a simple profile. +func TestCreateNodes(t *testing.T) { + testProfile := nodeTestProfile() + wantNodeSet := NodeSet{ + {Name: "symname"}: true, + {Objfile: "unsymbolized_library_1"}: true, + {Objfile: "unsymbolized_library_2"}: true, + } + + nodes, _ := CreateNodes(testProfile, &Options{}) + if len(nodes) != len(wantNodeSet) { + t.Errorf("got %d nodes, want %d", len(nodes), len(wantNodeSet)) + } + for _, node := range nodes { + if !wantNodeSet[node.Info] { + t.Errorf("unexpected node %v", node.Info) + } + } +} + +func TestShortenFunctionName(t *testing.T) { + type testCase struct { + name string + want string + } + testcases := []testCase{ + { + "root", + "root", + }, + { + "syscall.Syscall", + "syscall.Syscall", + }, + { + "net/http.(*conn).serve", + "http.(*conn).serve", + }, + { + "github.com/blahBlah/foo.Foo", + "foo.Foo", + }, + { + "github.com/BlahBlah/foo.Foo", + "foo.Foo", + }, + { + "github.com/BlahBlah/foo.Foo[...]", + "foo.Foo[...]", + }, + { + "github.com/blah-blah/foo_bar.(*FooBar).Foo", + "foo_bar.(*FooBar).Foo", + }, + { + "encoding/json.(*structEncoder).(encoding/json.encode)-fm", + "json.(*structEncoder).(encoding/json.encode)-fm", + }, + { + "github.com/blah/blah/vendor/gopkg.in/redis.v3.(*baseClient).(github.com/blah/blah/vendor/gopkg.in/redis.v3.process)-fm", + "redis.v3.(*baseClient).(github.com/blah/blah/vendor/gopkg.in/redis.v3.process)-fm", + }, + { + "github.com/foo/bar/v4.(*Foo).Bar", + "bar.(*Foo).Bar", + }, + { + "github.com/foo/bar/v4/baz.Foo.Bar", + "baz.Foo.Bar", + }, + { + "github.com/foo/bar/v123.(*Foo).Bar", + "bar.(*Foo).Bar", + }, + { + "github.com/foobar/v0.(*Foo).Bar", + "v0.(*Foo).Bar", + }, + { + "github.com/foobar/v1.(*Foo).Bar", + "v1.(*Foo).Bar", + }, + { + "example.org/v2xyz.Foo", + "v2xyz.Foo", + }, + { + "github.com/foo/bar/v4/v4.(*Foo).Bar", + "v4.(*Foo).Bar", + }, + { + "github.com/foo/bar/v4/foo/bar/v4.(*Foo).Bar", + "v4.(*Foo).Bar", + }, + { + "java.util.concurrent.ThreadPoolExecutor$Worker.run", + "ThreadPoolExecutor$Worker.run", + }, + { + "java.bar.foo.FooBar.run(java.lang.Runnable)", + "FooBar.run", + }, + { + "(anonymous namespace)::Bar::Foo", + "Bar::Foo", + }, + { + "(anonymous namespace)::foo", + "foo", + }, + { + "cpp::namespace::Class::method()::$_100::operator()", + "Class::method", + }, + { + "foo_bar::Foo::bar", + "Foo::bar", + }, + { + "cpp::namespace::Class::method()", + "Class::method", + }, + { + "foo", + "foo", + }, + { + "foo/xyz", + "foo/xyz", + }, + { + "com.google.perftools.gwp.benchmark.FloatBench.lambda$run$0", + "FloatBench.lambda$run$0", + }, + { + "java.bar.foo.FooBar.run$0", + "FooBar.run$0", + }, + } + for _, tc := range testcases { + name := ShortenFunctionName(tc.name) + if got, want := name, tc.want; got != want { + t.Errorf("ShortenFunctionName(%q) = %q, want %q", tc.name, got, want) + } + } +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose1.dot b/plugin/debug/pkg/internal/graph/testdata/compose1.dot new file mode 100644 index 00000000..a0842ee0 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose1.dot @@ -0,0 +1,7 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" tooltip="testtitle"] } +N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] +N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose2.dot b/plugin/debug/pkg/internal/graph/testdata/compose2.dot new file mode 100644 index 00000000..44c2aecd --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose2.dot @@ -0,0 +1,7 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" tooltip="testtitle"] } +N1 [label="SRC10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=24 shape=folder tooltip="src (25)" color="#b23c00" fillcolor="#edddd5" style="bold,filled" peripheries=2 URL="www.google.com" target="_blank"] +N2 [label="dest\n0 of 25 (25.00%)" id="node2" fontsize=8 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose3.dot b/plugin/debug/pkg/internal/graph/testdata/compose3.dot new file mode 100644 index 00000000..f22ad9fe --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose3.dot @@ -0,0 +1,11 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" tooltip="testtitle"] } +N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] +N1_0 [label = "tag1" id="N1_0" fontsize=8 shape=box3d tooltip="10"] +N1 -> N1_0 [label=" 10" weight=100 tooltip="10" labeltooltip="10"] +NN1_0 [label = "tag2" id="NN1_0" fontsize=8 shape=box3d tooltip="20"] +N1 -> NN1_0 [label=" 20" weight=100 tooltip="20" labeltooltip="20"] +N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src ... dest (10)" labeltooltip="src ... dest (10)" style="dotted" minlen=2] +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose4.dot b/plugin/debug/pkg/internal/graph/testdata/compose4.dot new file mode 100644 index 00000000..ed770d10 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose4.dot @@ -0,0 +1,4 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" tooltip="testtitle"] } +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose5.dot b/plugin/debug/pkg/internal/graph/testdata/compose5.dot new file mode 100644 index 00000000..3f2285c3 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose5.dot @@ -0,0 +1,11 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" tooltip="testtitle"] } +N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] +N1_0 [label = "tag1" id="N1_0" fontsize=8 shape=box3d tooltip="10"] +N1 -> N1_0 [label=" 10" weight=100 tooltip="10" labeltooltip="10"] +NN1_0_0 [label = "tag2" id="NN1_0_0" fontsize=8 shape=box3d tooltip="20"] +N1_0 -> NN1_0_0 [label=" 20" weight=100 tooltip="20" labeltooltip="20"] +N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)" minlen=2] +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose6.dot b/plugin/debug/pkg/internal/graph/testdata/compose6.dot new file mode 100644 index 00000000..1dfc3fee --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose6.dot @@ -0,0 +1,7 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" URL="http://example.com" target="_blank" tooltip="testtitle"] } +N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] +N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose7.dot b/plugin/debug/pkg/internal/graph/testdata/compose7.dot new file mode 100644 index 00000000..8f749a77 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose7.dot @@ -0,0 +1,7 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\llabel3: \"foo\"\l" tooltip="testtitle"] } +N1 [label="var\"src\"\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="var\"src\" (25)" color="#b23c00" fillcolor="#edddd5"] +N2 [label="var\"#dest#\"\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="var\"#dest#\" (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="var\"src\" -> var\"#dest#\" (10)" labeltooltip="var\"src\" -> var\"#dest#\" (10)"] +} diff --git a/plugin/debug/pkg/internal/graph/testdata/compose9.dot b/plugin/debug/pkg/internal/graph/testdata/compose9.dot new file mode 100644 index 00000000..2e163ce4 --- /dev/null +++ b/plugin/debug/pkg/internal/graph/testdata/compose9.dot @@ -0,0 +1,7 @@ +digraph "testtitle" { +node [style=filled fillcolor="#f8f8f8"] +subgraph cluster_L { "comment line 1\lcomment line 2 \"unterminated double quote" [shape=box fontsize=16 label="comment line 1\lcomment line 2 \"unterminated double quote\lsecond comment \"double quote\"\l" tooltip="testtitle"] } +N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] +N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] +N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] +} diff --git a/plugin/debug/pkg/internal/measurement/measurement.go b/plugin/debug/pkg/internal/measurement/measurement.go new file mode 100644 index 00000000..e7a57329 --- /dev/null +++ b/plugin/debug/pkg/internal/measurement/measurement.go @@ -0,0 +1,294 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package measurement export utility functions to manipulate/format performance profile sample values. +package measurement + +import ( + "fmt" + "math" + "strings" + "time" + + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// ScaleProfiles updates the units in a set of profiles to make them +// compatible. It scales the profiles to the smallest unit to preserve +// data. +func ScaleProfiles(profiles []*profile.Profile) error { + if len(profiles) == 0 { + return nil + } + periodTypes := make([]*profile.ValueType, 0, len(profiles)) + for _, p := range profiles { + if p.PeriodType != nil { + periodTypes = append(periodTypes, p.PeriodType) + } + } + periodType, err := CommonValueType(periodTypes) + if err != nil { + return fmt.Errorf("period type: %v", err) + } + + // Identify common sample types + numSampleTypes := len(profiles[0].SampleType) + for _, p := range profiles[1:] { + if numSampleTypes != len(p.SampleType) { + return fmt.Errorf("inconsistent samples type count: %d != %d", numSampleTypes, len(p.SampleType)) + } + } + sampleType := make([]*profile.ValueType, numSampleTypes) + for i := 0; i < numSampleTypes; i++ { + sampleTypes := make([]*profile.ValueType, len(profiles)) + for j, p := range profiles { + sampleTypes[j] = p.SampleType[i] + } + sampleType[i], err = CommonValueType(sampleTypes) + if err != nil { + return fmt.Errorf("sample types: %v", err) + } + } + + for _, p := range profiles { + if p.PeriodType != nil && periodType != nil { + period, _ := Scale(p.Period, p.PeriodType.Unit, periodType.Unit) + p.Period, p.PeriodType.Unit = int64(period), periodType.Unit + } + ratios := make([]float64, len(p.SampleType)) + for i, st := range p.SampleType { + if sampleType[i] == nil { + ratios[i] = 1 + continue + } + ratios[i], _ = Scale(1, st.Unit, sampleType[i].Unit) + p.SampleType[i].Unit = sampleType[i].Unit + } + if err := p.ScaleN(ratios); err != nil { + return fmt.Errorf("scale: %v", err) + } + } + return nil +} + +// CommonValueType returns the finest type from a set of compatible +// types. +func CommonValueType(ts []*profile.ValueType) (*profile.ValueType, error) { + if len(ts) <= 1 { + return nil, nil + } + minType := ts[0] + for _, t := range ts[1:] { + if !compatibleValueTypes(minType, t) { + return nil, fmt.Errorf("incompatible types: %v %v", *minType, *t) + } + if ratio, _ := Scale(1, t.Unit, minType.Unit); ratio < 1 { + minType = t + } + } + rcopy := *minType + return &rcopy, nil +} + +func compatibleValueTypes(v1, v2 *profile.ValueType) bool { + if v1 == nil || v2 == nil { + return true // No grounds to disqualify. + } + // Remove trailing 's' to permit minor mismatches. + if t1, t2 := strings.TrimSuffix(v1.Type, "s"), strings.TrimSuffix(v2.Type, "s"); t1 != t2 { + return false + } + + if v1.Unit == v2.Unit { + return true + } + for _, ut := range UnitTypes { + if ut.sniffUnit(v1.Unit) != nil && ut.sniffUnit(v2.Unit) != nil { + return true + } + } + return false +} + +// Scale a measurement from a unit to a different unit and returns +// the scaled value and the target unit. The returned target unit +// will be empty if uninteresting (could be skipped). +func Scale(value int64, fromUnit, toUnit string) (float64, string) { + // Avoid infinite recursion on overflow. + if value < 0 && -value > 0 { + v, u := Scale(-value, fromUnit, toUnit) + return -v, u + } + for _, ut := range UnitTypes { + if v, u, ok := ut.convertUnit(value, fromUnit, toUnit); ok { + return v, u + } + } + // Skip non-interesting units. + switch toUnit { + case "count", "sample", "unit", "minimum", "auto": + return float64(value), "" + default: + return float64(value), toUnit + } +} + +// Label returns the label used to describe a certain measurement. +func Label(value int64, unit string) string { + return ScaledLabel(value, unit, "auto") +} + +// ScaledLabel scales the passed-in measurement (if necessary) and +// returns the label used to describe a float measurement. +func ScaledLabel(value int64, fromUnit, toUnit string) string { + v, u := Scale(value, fromUnit, toUnit) + sv := strings.TrimSuffix(fmt.Sprintf("%.2f", v), ".00") + if sv == "0" || sv == "-0" { + return "0" + } + return sv + u +} + +// Percentage computes the percentage of total of a value, and encodes +// it as a string. At least two digits of precision are printed. +func Percentage(value, total int64) string { + var ratio float64 + if total != 0 { + ratio = math.Abs(float64(value)/float64(total)) * 100 + } + switch { + case math.Abs(ratio) >= 99.95 && math.Abs(ratio) <= 100.05: + return " 100%" + case math.Abs(ratio) >= 1.0: + return fmt.Sprintf("%5.2f%%", ratio) + default: + return fmt.Sprintf("%5.2g%%", ratio) + } +} + +// Unit includes a list of aliases representing a specific unit and a factor +// which one can multiple a value in the specified unit by to get the value +// in terms of the base unit. +type Unit struct { + CanonicalName string + aliases []string + Factor float64 +} + +// UnitType includes a list of units that are within the same category (i.e. +// memory or time units) and a default unit to use for this type of unit. +type UnitType struct { + DefaultUnit Unit + Units []Unit +} + +// findByAlias returns the unit associated with the specified alias. It returns +// nil if the unit with such alias is not found. +func (ut UnitType) findByAlias(alias string) *Unit { + for _, u := range ut.Units { + for _, a := range u.aliases { + if alias == a { + return &u + } + } + } + return nil +} + +// sniffUnit simpifies the input alias and returns the unit associated with the +// specified alias. It returns nil if the unit with such alias is not found. +func (ut UnitType) sniffUnit(unit string) *Unit { + unit = strings.ToLower(unit) + if len(unit) > 2 { + unit = strings.TrimSuffix(unit, "s") + } + return ut.findByAlias(unit) +} + +// autoScale takes in the value with units of the base unit and returns +// that value scaled to a reasonable unit if a reasonable unit is +// found. +func (ut UnitType) autoScale(value float64) (float64, string, bool) { + var f float64 + var unit string + for _, u := range ut.Units { + if u.Factor >= f && (value/u.Factor) >= 1.0 { + f = u.Factor + unit = u.CanonicalName + } + } + if f == 0 { + return 0, "", false + } + return value / f, unit, true +} + +// convertUnit converts a value from the fromUnit to the toUnit, autoscaling +// the value if the toUnit is "minimum" or "auto". If the fromUnit is not +// included in the unitType, then a false boolean will be returned. If the +// toUnit is not in the unitType, the value will be returned in terms of the +// default unitType. +func (ut UnitType) convertUnit(value int64, fromUnitStr, toUnitStr string) (float64, string, bool) { + fromUnit := ut.sniffUnit(fromUnitStr) + if fromUnit == nil { + return 0, "", false + } + v := float64(value) * fromUnit.Factor + if toUnitStr == "minimum" || toUnitStr == "auto" { + if v, u, ok := ut.autoScale(v); ok { + return v, u, true + } + return v / ut.DefaultUnit.Factor, ut.DefaultUnit.CanonicalName, true + } + toUnit := ut.sniffUnit(toUnitStr) + if toUnit == nil { + return v / ut.DefaultUnit.Factor, ut.DefaultUnit.CanonicalName, true + } + return v / toUnit.Factor, toUnit.CanonicalName, true +} + +// UnitTypes holds the definition of units known to pprof. +var UnitTypes = []UnitType{{ + Units: []Unit{ + {"B", []string{"b", "byte"}, 1}, + {"kB", []string{"kb", "kbyte", "kilobyte"}, float64(1 << 10)}, + {"MB", []string{"mb", "mbyte", "megabyte"}, float64(1 << 20)}, + {"GB", []string{"gb", "gbyte", "gigabyte"}, float64(1 << 30)}, + {"TB", []string{"tb", "tbyte", "terabyte"}, float64(1 << 40)}, + {"PB", []string{"pb", "pbyte", "petabyte"}, float64(1 << 50)}, + }, + DefaultUnit: Unit{"B", []string{"b", "byte"}, 1}, +}, { + Units: []Unit{ + {"ns", []string{"ns", "nanosecond"}, float64(time.Nanosecond)}, + {"us", []string{"μs", "us", "microsecond"}, float64(time.Microsecond)}, + {"ms", []string{"ms", "millisecond"}, float64(time.Millisecond)}, + {"s", []string{"s", "sec", "second"}, float64(time.Second)}, + {"hrs", []string{"hour", "hr"}, float64(time.Hour)}, + }, + DefaultUnit: Unit{"s", []string{}, float64(time.Second)}, +}, { + Units: []Unit{ + {"n*GCU", []string{"nanogcu"}, 1e-9}, + {"u*GCU", []string{"microgcu"}, 1e-6}, + {"m*GCU", []string{"milligcu"}, 1e-3}, + {"GCU", []string{"gcu"}, 1}, + {"k*GCU", []string{"kilogcu"}, 1e3}, + {"M*GCU", []string{"megagcu"}, 1e6}, + {"G*GCU", []string{"gigagcu"}, 1e9}, + {"T*GCU", []string{"teragcu"}, 1e12}, + {"P*GCU", []string{"petagcu"}, 1e15}, + }, + DefaultUnit: Unit{"GCU", []string{}, 1.0}, +}} diff --git a/plugin/debug/pkg/internal/measurement/measurement_test.go b/plugin/debug/pkg/internal/measurement/measurement_test.go new file mode 100644 index 00000000..7521a64d --- /dev/null +++ b/plugin/debug/pkg/internal/measurement/measurement_test.go @@ -0,0 +1,76 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package measurement + +import ( + "math" + "testing" +) + +func TestScale(t *testing.T) { + for _, tc := range []struct { + value int64 + fromUnit, toUnit string + wantValue float64 + wantUnit string + }{ + {1, "s", "ms", 1000, "ms"}, + {1, "kb", "b", 1024, "B"}, + {1, "kbyte", "b", 1024, "B"}, + {1, "kilobyte", "b", 1024, "B"}, + {1, "mb", "kb", 1024, "kB"}, + {1, "gb", "mb", 1024, "MB"}, + {1024, "gb", "tb", 1, "TB"}, + {1024, "tb", "pb", 1, "PB"}, + {2048, "mb", "auto", 2, "GB"}, + {3.1536e7, "s", "auto", 8760, "hrs"}, + {-1, "s", "ms", -1000, "ms"}, + {1, "foo", "count", 1, ""}, + {1, "foo", "bar", 1, "bar"}, + {2000, "count", "count", 2000, ""}, + {2000, "count", "auto", 2000, ""}, + {2000, "count", "minimum", 2000, ""}, + {8e10, "nanogcu", "petagcus", 8e-14, "P*GCU"}, + {1.5e10, "microGCU", "teraGCU", 1.5e-8, "T*GCU"}, + {3e6, "milliGCU", "gigagcu", 3e-6, "G*GCU"}, + {1000, "kilogcu", "megagcu", 1, "M*GCU"}, + {2000, "GCU", "kiloGCU", 2, "k*GCU"}, + {7, "megaGCU", "gcu", 7e6, "GCU"}, + {5, "gigagcus", "milligcu", 5e12, "m*GCU"}, + {7, "teragcus", "microGCU", 7e18, "u*GCU"}, + {1, "petaGCU", "nanogcus", 1e24, "n*GCU"}, + {100, "NanoGCU", "auto", 100, "n*GCU"}, + {5000, "nanogcu", "auto", 5, "u*GCU"}, + {3000, "MicroGCU", "auto", 3, "m*GCU"}, + {4000, "MilliGCU", "auto", 4, "GCU"}, + {4000, "GCU", "auto", 4, "k*GCU"}, + {5000, "KiloGCU", "auto", 5, "M*GCU"}, + {6000, "MegaGCU", "auto", 6, "G*GCU"}, + {7000, "GigaGCU", "auto", 7, "T*GCU"}, + {8000, "TeraGCU", "auto", 8, "P*GCU"}, + {9000, "PetaGCU", "auto", 9000, "P*GCU"}, + } { + if gotValue, gotUnit := Scale(tc.value, tc.fromUnit, tc.toUnit); !floatEqual(gotValue, tc.wantValue) || gotUnit != tc.wantUnit { + t.Errorf("Scale(%d, %q, %q) = (%g, %q), want (%g, %q)", + tc.value, tc.fromUnit, tc.toUnit, gotValue, gotUnit, tc.wantValue, tc.wantUnit) + } + } +} + +func floatEqual(a, b float64) bool { + diff := math.Abs(a - b) + avg := (math.Abs(a) + math.Abs(b)) / 2 + return diff/avg < 0.0001 +} diff --git a/plugin/debug/pkg/internal/plugin/plugin.go b/plugin/debug/pkg/internal/plugin/plugin.go new file mode 100644 index 00000000..276d2b7a --- /dev/null +++ b/plugin/debug/pkg/internal/plugin/plugin.go @@ -0,0 +1,218 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package plugin defines the plugin implementations that the main pprof driver requires. +package plugin + +import ( + "io" + "net/http" + "regexp" + "time" + + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// Options groups all the optional plugins into pprof. +type Options struct { + Writer Writer + Flagset FlagSet + Fetch Fetcher + Sym Symbolizer + Obj ObjTool + UI UI + + // HTTPServer is a function that should block serving http requests, + // including the handlers specified in args. If non-nil, pprof will + // invoke this function if necessary to provide a web interface. + // + // If HTTPServer is nil, pprof will use its own internal HTTP server. + // + // A common use for a custom HTTPServer is to provide custom + // authentication checks. + HTTPServer func(args *HTTPServerArgs) error + HTTPTransport http.RoundTripper +} + +// Writer provides a mechanism to write data under a certain name, +// typically a filename. +type Writer interface { + Open(name string) (io.WriteCloser, error) +} + +// A FlagSet creates and parses command-line flags. +// It is similar to the standard flag.FlagSet. +type FlagSet interface { + // Bool, Int, Float64, and String define new flags, + // like the functions of the same name in package flag. + Bool(name string, def bool, usage string) *bool + Int(name string, def int, usage string) *int + Float64(name string, def float64, usage string) *float64 + String(name string, def string, usage string) *string + + // StringList is similar to String but allows multiple values for a + // single flag + StringList(name string, def string, usage string) *[]*string + + // ExtraUsage returns any additional text that should be printed after the + // standard usage message. The extra usage message returned includes all text + // added with AddExtraUsage(). + // The typical use of ExtraUsage is to show any custom flags defined by the + // specific pprof plugins being used. + ExtraUsage() string + + // AddExtraUsage appends additional text to the end of the extra usage message. + AddExtraUsage(eu string) + + // Parse initializes the flags with their values for this run + // and returns the non-flag command line arguments. + // If an unknown flag is encountered or there are no arguments, + // Parse should call usage and return nil. + Parse(usage func()) []string +} + +// A Fetcher reads and returns the profile named by src. src can be a +// local file path or a URL. duration and timeout are units specified +// by the end user, or 0 by default. duration refers to the length of +// the profile collection, if applicable, and timeout is the amount of +// time to wait for a profile before returning an error. Returns the +// fetched profile, the URL of the actual source of the profile, or an +// error. +type Fetcher interface { + Fetch(src string, duration, timeout time.Duration) (*profile.Profile, string, error) +} + +// A Symbolizer introduces symbol information into a profile. +type Symbolizer interface { + Symbolize(mode string, srcs MappingSources, prof *profile.Profile) error +} + +// MappingSources map each profile.Mapping to the source of the profile. +// The key is either Mapping.File or Mapping.BuildId. +type MappingSources map[string][]struct { + Source string // URL of the source the mapping was collected from + Start uint64 // delta applied to addresses from this source (to represent Merge adjustments) +} + +// An ObjTool inspects shared libraries and executable files. +type ObjTool interface { + // Open opens the named object file. If the object is a shared + // library, start/limit/offset are the addresses where it is mapped + // into memory in the address space being inspected. If the object + // is a linux kernel, relocationSymbol is the name of the symbol + // corresponding to the start address. + Open(file string, start, limit, offset uint64, relocationSymbol string) (ObjFile, error) + + // Disasm disassembles the named object file, starting at + // the start address and stopping at (before) the end address. + Disasm(file string, start, end uint64, intelSyntax bool) ([]Inst, error) +} + +// An Inst is a single instruction in an assembly listing. +type Inst struct { + Addr uint64 // virtual address of instruction + Text string // instruction text + Function string // function name + File string // source file + Line int // source line +} + +// An ObjFile is a single object file: a shared library or executable. +type ObjFile interface { + // Name returns the underlyinf file name, if available + Name() string + + // ObjAddr returns the objdump (linker) address corresponding to a runtime + // address, and an error. + ObjAddr(addr uint64) (uint64, error) + + // BuildID returns the GNU build ID of the file, or an empty string. + BuildID() string + + // SourceLine reports the source line information for a given + // address in the file. Due to inlining, the source line information + // is in general a list of positions representing a call stack, + // with the leaf function first. + SourceLine(addr uint64) ([]Frame, error) + + // Symbols returns a list of symbols in the object file. + // If r is not nil, Symbols restricts the list to symbols + // with names matching the regular expression. + // If addr is not zero, Symbols restricts the list to symbols + // containing that address. + Symbols(r *regexp.Regexp, addr uint64) ([]*Sym, error) + + // Close closes the file, releasing associated resources. + Close() error +} + +// A Frame describes a location in a single line in a source file. +type Frame struct { + Func string // name of function + File string // source file name + Line int // line in file + Column int // column in line (if available) + StartLine int // start line of function (if available) +} + +// A Sym describes a single symbol in an object file. +type Sym struct { + Name []string // names of symbol (many if symbol was dedup'ed) + File string // object file containing symbol + Start uint64 // start virtual address + End uint64 // virtual address of last byte in sym (Start+size-1) +} + +// A UI manages user interactions. +type UI interface { + // ReadLine returns a line of text (a command) read from the user. + // prompt is printed before reading the command. + ReadLine(prompt string) (string, error) + + // Print shows a message to the user. + // It formats the text as fmt.Print would and adds a final \n if not already present. + // For line-based UI, Print writes to standard error. + // (Standard output is reserved for report data.) + Print(...interface{}) + + // PrintErr shows an error message to the user. + // It formats the text as fmt.Print would and adds a final \n if not already present. + // For line-based UI, PrintErr writes to standard error. + PrintErr(...interface{}) + + // IsTerminal returns whether the UI is known to be tied to an + // interactive terminal (as opposed to being redirected to a file). + IsTerminal() bool + + // WantBrowser indicates whether a browser should be opened with the -http option. + WantBrowser() bool + + // SetAutoComplete instructs the UI to call complete(cmd) to obtain + // the auto-completion of cmd, if the UI supports auto-completion at all. + SetAutoComplete(complete func(string) string) +} + +// HTTPServerArgs contains arguments needed by an HTTP server that +// is exporting a pprof web interface. +type HTTPServerArgs struct { + // Hostport contains the http server address (derived from flags). + Hostport string + + Host string // Host portion of Hostport + Port int // Port portion of Hostport + + // Handlers maps from URL paths to the handler to invoke to + // serve that path. + Handlers map[string]http.Handler +} diff --git a/plugin/debug/pkg/internal/proftest/BUILD b/plugin/debug/pkg/internal/proftest/BUILD new file mode 100644 index 00000000..046e97c9 --- /dev/null +++ b/plugin/debug/pkg/internal/proftest/BUILD @@ -0,0 +1,15 @@ +# Description: +# Auto-imported from m7s.live/v5/plugin/debug/pkg/internal/proftest + +licenses(["notice"]) + +package( + default_applicable_licenses = ["//third_party/golang/pprof:license"], + default_visibility = ["//third_party/golang/pprof/internal:friends"], +) + +go_library( + name = "proftest", + srcs = ["proftest.go"], + embedsrcs = ["testdata/large.cpu"], +) diff --git a/plugin/debug/pkg/internal/proftest/proftest.go b/plugin/debug/pkg/internal/proftest/proftest.go new file mode 100644 index 00000000..17ecb0fb --- /dev/null +++ b/plugin/debug/pkg/internal/proftest/proftest.go @@ -0,0 +1,166 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package proftest provides some utility routines to test other +// packages related to profiles. +package proftest + +import ( + "encoding/json" + "flag" + "fmt" + "io" + "os" + "os/exec" + "regexp" + "testing" + + _ "embed" // For embedding profiles needed by tests and benchmarks +) + +var flagLargeProfile = flag.String("large_profile", "", "The name of a file that contains a profile to use in benchmarks. If empty, a profile of a synthetic program is used.") + +// Diff compares two byte arrays using the diff tool to highlight the +// differences. It is meant for testing purposes to display the +// differences between expected and actual output. +func Diff(b1, b2 []byte) (data []byte, err error) { + f1, err := os.CreateTemp("", "proto_test") + if err != nil { + return nil, err + } + defer os.Remove(f1.Name()) + defer f1.Close() + + f2, err := os.CreateTemp("", "proto_test") + if err != nil { + return nil, err + } + defer os.Remove(f2.Name()) + defer f2.Close() + + f1.Write(b1) + f2.Write(b2) + + data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput() + if len(data) > 0 { + // diff exits with a non-zero status when the files don't match. + // Ignore that failure as long as we get output. + err = nil + } + if err != nil { + data = []byte(fmt.Sprintf("diff failed: %v\nb1: %q\nb2: %q\n", err, b1, b2)) + err = nil + } + return +} + +// EncodeJSON encodes a value into a byte array. This is intended for +// testing purposes. +func EncodeJSON(x interface{}) []byte { + data, err := json.MarshalIndent(x, "", " ") + if err != nil { + panic(err) + } + data = append(data, '\n') + return data +} + +// TestUI implements the plugin.UI interface, triggering test failures +// if more than Ignore errors not matching AllowRx are printed. +// Also tracks the number of times the error matches AllowRx in +// NumAllowRxMatches. +type TestUI struct { + T testing.TB + Ignore int + AllowRx string + NumAllowRxMatches int + Input []string + index int +} + +// ReadLine returns no input, as no input is expected during testing. +func (ui *TestUI) ReadLine(_ string) (string, error) { + if ui.index >= len(ui.Input) { + return "", io.EOF + } + input := ui.Input[ui.index] + ui.index++ + if input == "**error**" { + return "", fmt.Errorf("error: %s", input) + } + return input, nil +} + +// Print messages are discarded by the test UI. +func (ui *TestUI) Print(args ...interface{}) { +} + +// PrintErr messages may trigger an error failure. A fixed number of +// error messages are permitted when appropriate. +func (ui *TestUI) PrintErr(args ...interface{}) { + if ui.AllowRx != "" { + if matched, err := regexp.MatchString(ui.AllowRx, fmt.Sprint(args...)); matched || err != nil { + if err != nil { + ui.T.Errorf("failed to match against regex %q: %v", ui.AllowRx, err) + } + ui.NumAllowRxMatches++ + return + } + } + if ui.Ignore > 0 { + ui.Ignore-- + return + } + // Stringify arguments with fmt.Sprint() to match what default UI + // implementation does. Without this Error() calls fmt.Sprintln() which + // _always_ adds spaces between arguments, unlike fmt.Sprint() which only + // adds them between arguments if neither is string. + ui.T.Error("unexpected error: " + fmt.Sprint(args...)) +} + +// IsTerminal indicates if the UI is an interactive terminal. +func (ui *TestUI) IsTerminal() bool { + return false +} + +// WantBrowser indicates whether a browser should be opened with the -http option. +func (ui *TestUI) WantBrowser() bool { + return false +} + +// SetAutoComplete is not supported by the test UI. +func (ui *TestUI) SetAutoComplete(_ func(string) string) { +} + +// LargeProfile returns a large profile that may be useful in benchmarks. +// +// If the flag --large_profile is set, the contents of the file +// named by the flag are returned. Otherwise an embedded profile (~1.2MB) +// for a synthetic program is returned. +func LargeProfile(tb testing.TB) []byte { + tb.Helper() + if f := *flagLargeProfile; f != "" { + // Use custom profile. + data, err := os.ReadFile(f) + if err != nil { + tb.Fatalf("custom profile file: %v\n", err) + } + return data + } + + return largeProfileData +} + +//go:embed testdata/large.cpu +var largeProfileData []byte diff --git a/plugin/debug/pkg/internal/proftest/testdata/large.cpu b/plugin/debug/pkg/internal/proftest/testdata/large.cpu new file mode 100644 index 0000000000000000000000000000000000000000..382a9ebe20692b8004f19f303e61e094749f8e4c GIT binary patch literal 1201687 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 z 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

%AX-nLI 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≫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�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 z

9dslz$q17?|wcB}kM?9MF@w3;<~v+rsAo2kJc--?WEA=Zl=JKF<<(r6*NK!{SK zsskxcYV}ugf-prr$YX?z93!jVtXZz!Vv86fWcSvKM4{jlzT#3-7LK5}5uyK(Vq<-_ zm{?})Q^X7+j1V^2*$YemXNeCrvK=TC)_hEq!IJawwjb4R zFG|#JyEGI2AMn*to1!)zDYo5iv+dSvF*i-{{gJp-VeL0Wr3(RCb{{9KH0o5#8Wy>0 zdOO>sSRr*Zo05f7Z|nMeQ}gR*VoSJ-z@NDO9*IT5l0ifdCip2LTe5l-rC(4qjIh@D zmJ1Wwvvf2u@xq2NLcqs_KBjW9>?dxuCofnSuYTMyLW+i&>k%@>jM}Q^p1OlQeOPxp z!Aa&ft9`$|GfNtf(3&)V!M`CH%}i^gYd^4hFc*@=z>sfgLrRHIaJ0T<3 zku4k%mRAYe-zLc1_}=#8%G%R!>Q!Ft7RP)Kh=G!e+~QoMobBUnKcP>B2IwIi=N8A# zkIW%datT%z=>R8Q@K$7D~JAM^%&u* z_E30&W8WwvS_1-$-XQW%t-aFN)Qv)6pHqGF8e7|DA`l8YbQ=?OWvmls1P>)NJ6r3;&n;_g%zV% z+FG~!cs&k0ORk#UKHm0|y22+f={}5ii=()wSz#rYxW&1|tgzKqI36M7>$Mvoq*n`D zIuVp8rZY@xj&QPCH1e{pC-Z-0f1Jb z$>AU&_%F^6XYA{&8q6sVFIW}c-9CiAr6c^bW+OjXV7Ha@FgZ)(UL?I#SgJzxK?2)w zFw%1&-ujsZk;3j4#J#}Wx4GP$%RjQ~Z>rS3LPe+A*N8+|2Hc&nh`9NJVTVf#{qj< z0Y0AL$RJWOh44Y@HJBP9WW@<%<4mo+pO#?c3q|cI3lw%6w3%l1Gdi4w1v;EbZgFh- zuQQF(%iZE!ZiZv^O`NF~tzixd7s5Va<#19yVfh&0W}dLR7pK)tP)GT_6l5?s3ZsRv zNMYOEsx|E?7vkPzLy|DvEv$(Wa=#<&T^eX*SRGHg*n+*-e!Dg+@Twb=zWn-s;TRup z`&ng;r6-k(C%eV5yMtj3C0Dq`xx!4tdiyS{5*B>Gje99*#aS&T_>D8Y*zhYcEx2iF zw5`>YN$ofnC(L+^nSrGa@OHp%*@`bW**zhw) zV}zvsOv*49My;YEwi9i&-_!iZxY>ii7$Mxm!>zaV(QZW5<6MNW+Gy`qpG)qqOdcyt zX~iN31sUy)07ik|}O+p2p#_6w3#qp8u?D&FGQw>?sBZ9lK4Fwaj{c&b|*aUYl!R&teFoU6%T+;+!w2b%y!(kOC`v%rX(Bod9miGb`jh5ZrsI+fea?SJ5e8TBTZP~ z&BZ8DX{OEJCcHqxR~&o8Gz0Y1q**`f`hhJih%OX%{zHBzk`hGi?D;mXHD>X5T)dMN z9!Heb^Li^+*!VCDeONu3fEXdBqz_l;?_;rlhrH_fN`sRuy*5 z`=0-)^{!@_lGa*_G^M_6Z=g`#itRsAejAZ*YA(Q;a$)6zY;Q?GrEnuaIPte8eJ*^Q zT~R{L-^O+L4&&5dxgpAfG(HOzxL)?AAJi=Hn_`<5 zAynQ+;B(w66ZW};OK))NVJ`l`sdvbW7Zfvk^G~G52z$Tcyf>Q_=c)}ia)pfk%zT+i ze=_y|1jEXNqM_`l6#QDTp+d<2o#NX#`Yw|`VQ-;u_!A<2rQlAM84=m4W>C$<7W)qu zKPT=ZT!q3dm-+qOn%`d&+q(9gdy}Js$@_#Ezc9Bx+fsyy)xwc1A^J%!|3>}`Z1WY< zbnHx$knuJb?xdnOyFSJ@Nw{X$m1tY@(tE|Wvn{8c_{Vzm=GpfU@GE0XDo?FVC$?F` znA?b$w@7ZvC5@H(c-t>ki*xcylaesQEsjH;lmsQ$y2ZIxkAjc4{j$oAYEyVV(=85{ zr|?|Kb#8I4)2A#vxWI0k+>lGv!sTk=P*3t>g_8d4dzancGpQ4c?=x|%>EWVs>SjBF zYlPGl{ZNh(F0YKt!VthN#_0J zf57hM9BIz7o*ar3jy_NF?`&pR%1QX+Xs@JC7f-` zs<)W-Hy0k_IWS3Bi&A6CqC8O9B zo7cZFg>RvG2VV9%(!Z(&=VOIwKjRxD9DbIvhZQkkg{d#H-h^Wx)ev;XXyS_vvprtJ z7j4Bhwn|tQC9M02%YC@q1ovG`|B9PlswYf+M!#ttkl$@wD-ceq>)MC_tFbt96gjtR zzgNF(VS2V`CyD<_6p49}(kEDxEL45VM6GIijFiuq^(mp0+ zSsEf#+R<3v_=OU!r`4_(b8vFmCqaYPFF2Um)X}vgO`` zdST3QizDU%!vIdyo&|@_pY9qFSB;nvA zoPUOC_p)5;6u)M9b5kOk=1~-yIO;ikgNqtBu#0V>r}>N3?O*f|k=`6oDbtPBFS76l zCaJyU)69NdC!JEPYdY60j_bK%X07xlw>USMSz8a|wdYCe!S!lkd0+NE!jj=cHX-XN z&G4I(E?oC!#lsZcM@4J1)&W7nm@r{}JLVe4UenKOrZz}ysSQ}xku_ZjC=?Dy3unJ2 zz6k{mBAD-uE*@gl`7*z%CJ8_CTQPQA?ZGU52^9DAFYzp$%H*w&mW4{8qI);8+I z^Rm~$Hk|bc#UHc#4raFHN|@jtLdfsLJj;CTk{l_-wKCq5&?sSATXp<-+ixhd-HK36 zYMxshOTIPhqU2_`I5(ShvEJhs`=N>T>3ylp5_~%oHiTo(sPwp@$>IIjeH;GfO0+tH zW3q+q&2+q0xAcb3DSC|HXQ@gSj+F>w-_|mSow<7UeZ1{Ab!@9l{mXo}IF5MgUzFV9 z7Uvc-wr(}6{FK;22C(20R^Cb33yR7yZxk25R)F_{jwCkMYieHy5-Nn9_i@u`fK9F0 z8QbeIFrwdDBgmo{H^fn8}3grgz&gU-st!i;z@jYVmxy?T7 z9>?;w4zYwnZYeV9Jse0CPW9wOzA)nf_WB7Y-oyU~CJZLO5i1LXc|WqQH_JZY%wQH* z3R~Y|_XE0aRw=o85TPl;)$WWp&NHhMsrV_4%~teb@({+A3f1qKOz)#T2{Oyt)W;zX z--^97Xc1Cx-Tx!&yrZkCnl`@X^21zEAV83a0vbSUfT$=%0Z~B^0Tls36qTxg*iaNT zy^|i&dqR4(^S={6H-> znN!)gVp3hiR{A#cG)`KR3va6c{10Mn@mLmohgK2vf6e&qXLq5@g&ko+!7r@L5_R)c z3FU|_*++6JLW#W3P;-fpiN}%Cbv=HBn89%F1esVNh+E6;0Ydx7d zny?Wp{)1!bqTr^pf9r^>1QuR3$w&~6c?&oDF!e_Qz9;25cGwB|TxIa=V8LN$?$mNr zepDBxbmn@z&`+I^PWCGPcCV-KbtdsQrhSZmyl|izXI~^BM(|cc$j!y>Q6{c)Hl?T} z33%E0Ot>O9D_s{JWx`agij^#y=DOg0ruQQ+NXYM`6=V`s@%c_aYW4e{Gt}2r^gj0{ z%=sCg+H4z0`k(p(YgA%`oq&m4E@y(X-YuGtb-WhWzhL`V4OE|LqMTcyKXLFQ;@j$L z>Q(Id8sn3OsgdYpuR=a>W-NQ7#c&j)*_D7M&rc|7&B>-Lv2(5;S88y{N7(TWmy8>- zOT`P{6x;Es!oF@?h!^7B#khD*KgnW0A$jb zZYT-;IP{GEd!;i|Y=_;2;AdF>1=F80c4$eFu+3~ZwgVqo;PI#@AYyQ>)E=rQ*8JoZ7w>o$D^P+fTEpNC^9Y z-6}H`ayeC)>Q!!Cc$SG~mZfz^Ye7!!%=#v*?M%$S98VVJHrMczlie~qNd$Ig>p(8P z$(hM4^$~V8U}>h{`xjn6nW*4@g1QUGGiNASAF$&w5~c|eZMicNzjujxOEZHOe$KLP zOfhr_*6Z=e80NOXw+Wgt6Ys?8RxI!pPQ6K7Lrz8s34ai4++9{*XIQKd`VyPFQu>&d z3@Z&49*kqI7PA>gNxAQ;a*blE+on(AdIyeY2{T3zUz1r=L|s`+ABMC0=8h8zM~og@9<`u0nZ&Rff5_*uAwItBs&uT`JD|%LTPI50r}Q z0n?3672SAEY$rN$>ubVCvgAE(jK{l7G+la+8)Y?ERUq6?6qCljWC-(Av?NycCPWF03D|*^rY&Yt2B2U;b zkqd+Io+5;Q#!WBbu%F-_D0u&&(z3WcsXcN0jOS|_EaD??|dc1JC98hXSE=}pp%~yEv4awa&(}*=c;og|5Ny6Ql zc=hI!2uTofh8QQ>{;$Zc#@5EF zjfA(we<0pjLbQ)?{%rzBljTazYh3Hcp2-|)g_FIC`*2DJPQRy`;i|T*{D+0*3cgi) zm@!3I^tP5DUNVm9Zxh*-0;8K*q0ebwvd3Mx(3th1!lviA8DSDG=LxYtv-frKdT=yA z@a({%Z<$>n?0iNCXmw{DFd+l07d>y9aA_1#nR@Q3#2!~>h@sFeRtC!I_{NBmyZ{YB z^1dyrtstH%;!$k-gd+jMkrFZ9nnOQuqF59+nWGF*#`+j|wIyG-RgSPTN|-%>^KrsW8_T}o=yz;+lLNowTP7Uw z6s~+tMyRm62ABU}!K-W-fyXCI8N{&^A?r!)yj34A8N#C&A*{N>+??zdH$awQQV91K zQobc>i2l(!nFo97zgRt5-k)-<1zW%1c5@;=BG{(9Grq%!eT&s2So@mc=G)s{%VKZ+ zl-(i1?n&JHg<(uf_J zKcTLl`t1IJwH|_hsZiXE^r1LnMD6$gU_;NnMet8-f1kwiqxofpl=w_++v~9OA3|Dl z=|dDu7t)a2&RQ;TwT51v#rsurL!JDXjlYsUis&?Ti_f5SWp)lCavc7lLQbfU-%7C~>mav*uF!zQXZm*-;>beq-vm-F9Q~du)7;qd$<;kFYjOd58QDIQ%-1 zV~KZBJmwX{l4JFlu78}>@A9xeNhyL6oK{=p>@#f16Sfx#v&IlyDy;ZlfWc4i@#S|^ zbz7$_Y9APNLYs$6#r3eBc{dlkzdluBA~Nes#krt7BBRYCrQ&)-pQ;kAO&Ww>nJA@W z(QgWoyVZ^hecA9eNrHcw5HOyApO{w*ug_TmvBq9^YhVx1?-Um4J-VS(oTn9+iy&~m`Z&At(=>`JO=aITn6TZb0<7MXR3n!vJ7T#ONl2D75PqKS3lLVjb( z2c#AXE1x#dkrkh^r>5blj`^M`DZ(y4A#c2HS8KvX;MW`F=U78!q&_eTWMYZn+DGhp_8+){Z9GWKdX*D9<`v`+|Gb^%GW6@e@}) zg;_nx{)R1MSviKafkJc}_I|35T0y&O;)S#b;ruW{J98eEHo?)D!d}ej%=C$*y+&Mj zuKmO{55coO(TdD;bFl~NW$YQD_V&h7ao$v3vQ3-EO2zemDgoFfn~z>7{N12*q$H+v{wiLTXd6h3YXiW+B{w=uE)*9Su;yY8?!Y{DE*M*e-jfT%vXKtcRagttRWBI z;o%tW#|jZcxj$7X`iq1bN(sE+9riuWmJGr1A~XIXs7x;ew+8lLUAeV|D#JFHiu0lW zRld>oiBfSrVS3Q7Vq$xUZSz2`Jf?JOd%98Z8q0Ep!hF$E8V90;lg|@eCR~0M_fI*} zoJHBf)nMUBHA9xUp_ir&IN7U+`;5Na9L1bpxZ9L-HpLy}Yf@XiJ{4d6Ahx<~Nv4qK zEgbDnWVUdrIv1L7<7?*DdVF^9O%x%HYE4w)Ffi#gp4n^^dyDgYs1Oz*1$eR z2Yb9&2fL+IoFg6O0$bZBOU3o14%W@Z9-@n~%HV3YmWuPA- zyoGsBF*itv(&U5BxmusQ{kZxo=SH$WM~Lan<>pN9#X}d>&aQole{(X&7zQ=ZL6i;U zaCy>arBB+wT5^&Q(Ve+plNu&ysobfZSo=5Of8zZXJAY(;s1Wf9@l%B?<-Q*lzj>nn=9^;!A|=Vlg6OomsO={k@xQqfw%)ezF^}!nqI7tRerJn%zCEgKmAR z6?W_|F1X-PQv>WXpXGWZlzuoQQpoz3yB~8oQSkeU_&8zKX!6?{bJ)pV&x+Mu{3_SF zFt0mD+7bQ^k08`tn9-e!-;nc+`e~28PUO4n$q-Jx$LjCV1iXl8LP{T$HF`=pHrQ%H zZfKwmtutNN$ilDHE}7GV6Ls)-T*Zl#l^0`$-8QR@o_XH@VfM%Pwd2aq zY#hlI6CZJFU=P#%>RzDxb$h8eulpZ(T-#?##r2HYuht%Vze8A=kntWy~w$V%2=P|E=q9`QzZEQLCGtu3lye)kM|g+*45Wr!{9fc=cchA zt@Epled-OlRh^t@!BHsWPQt4_Az`AlB-g)S#jE9~JX~k(e5TIY4oxviEI;MiK3giT zXU(ixeH)7$!hwm*8cukb5Zax2e{#P)F`rTN66-qSohMxK74{YgXL_;8TgdSfwsa-* z1J)0u^nIeswVu%xXYT7HmWBxjzhTZ3Jn$8+Hlw6EbL*0jAb7pSx+hrGkTo_fN~@(7 zQr;pVSy&n;Y#5AZwvZbqEKd^Ro+3O%myXeGpXMCuXsF!QdI|f! zWxBhNQXP+m1iwNF%*qvR#|Q~|LTU#ROg@5jA*a5`VzUjcTE^jl1WyyRhT5tIs5$3U zwIYZrEoZy4zKzynEp5)yUfk@>{2`p~$+4l#cVhQIRt#fhTSf9O*PN-k%xKExZk&l0 z_GYOvP{p2~`WX5Bl^|lraPmhnqa(R5vhF=1J94%*zV+GGh~2G-`IYs9m@$-9-hzLe zup!U9%6f<{B?^0gWXC9GM+x~a;@gxoV=h>g*Rl!BeunEm=+LZ=g`_{p8Nh=lx$q46 z&vC?+d#^C9CB?bI@z==vlFJ{XPV{>zg4S{m@D!FzFuTHdpd<7$4>J&hou%S@zKOZa zwRx^oT+f-EZS8JSh7h4QlVUn2GcQocEq8ib&%8ndy=zeBMnQydI6$~zhSacPU)1hq zn_ZnF-y3br$zH`Ve^~2;j3neSRu3XCL0B`EEq_qflAM0rd77wH;Z_^{m31brzrvj? zVbiy44ij$uO~5y-YR7yZVdfarkai}k9+7`C>qq8&rl}~ig*7$EGF96udnUG^dQ1%! zRx7m5&BY$6Q*`UJTGhKW;ikEnB5j^871#4-iYkR!P#rBS5?LmAXo8WyS#WCvVM-&D zkGt-7Qa>TIDWzYSys6zjLXN*s@Uo7qOT|RJDYl>=S@#;(KV?H7?sX?$BU5VoKgF#e zVOLwWMGE0AT&qiAhLHXLZj#azVa?O5FBE3=Ao?FxPZdrzSA4>%6q6VfP@b%1MY$yw z2*rUyYBiEFg)Ngv9>kpf4cDL<%L%$a{+I{W<5%k(aofDy;9qk}sM4 zvHr+<%;LXQ>tp%P`tMdy!~?AeteBrF(&$QUCAM+0SMi8l>x1`46f|R3AMT|KdzDIL zGHX9Gn7WJ?m}Qvgt@|x1T-Z34!^UK-RIjl^Un2}OTW_@2_4pD7OtTNmb1U%Wr$Rx=%t)%c8XX73y97)YvJ zORGGMD=jGVku-lyLI*Xf&Jz8(?ZGP3Mg;H_7V9xK$73a+@ zs!X#pa(X`zp5EuW?Q}l3&C3can;P2YEu! zH!SN+IZJBgtu8iyPi9o7hQQ9mJJd?61jrKcUQ-iye6I1c{T`*k1Qa;mf+mr>6;_ok)!o zX4Ynd(c|1)>{E3cdK)Luo>Fn%R_+AS=EYKRy=bmhnf%EG_1X6V z+eQ%9oh)@3yEU-K=sT}ZQ^jo05? zLQI*k=vS`3Y#0qsG$8&(JfG9Vrdh7c|B)Oeta58$kJYc0rRvxAm5Os|Wck;$eYsRz zFPpDf?~rv}nbM!Ykz9YBEuEQ>VDOG7{$lHJ9=*!;uURpgggWGo<@!G)gbFi?gq%qP zrVESv6I&+448Y;43t4HZi!GrIF^x&1~eZB}~h zL#~|shxzR&{*l|=dGsl%r9xC6u0E@J`0?jC{UfKICg4l`mi5*Q{EgEs$nMOVwoJ2= zZupO^yUqVKQaf{(RVTg_pU^a zWl;+@D9gaFIDCaIJqS({W_t>b7x1jX!8pO+#)8MW9wW^CT#={SUS!X!6r0@M-W4TWLfBz@|-x89zIO2v8lm*y#LUN05b>-tm` z(>Jk9NGcOHhYLP$v9DA(pDElJ#luOY^<|}+z0Eo8BTShh?1i1rva>cB?{l>SD~2%l zbA?4Z*{iJ4(l?ZXASX~blP886#;Gc7cljqo77D)q;+r89*CjYgIM9adKe+Kcw_w#E z?tQ@7ktBB|Dp%P50hb=B!pf%z?#b2e_wvpfI!PCn z{Yz|)5b+mDUnp%)&LolsaAhn$b(vO2;kaAh!y{Li`zlu^5}If90IN}PX98Y9Vi-PV zOl0AA>@OCyDC3S_nBJR*pKCX)I_I{gtbW6=YdG1f#Dw)%PWjZ$&F zVYcMpio^1W*tT^eFI7lZ2lT%j8Nn1+ruz$bl7)ybarY5sX^p@E9PWizJ(hQ1dP9_# zDECcL^M&wdNv*-|XF00)LpK+DN}0H(UOJ>bSe-7;x%He?(M;8T?YpM`dPK!&Imw(h zZtWxRSb ze<(BK1n<9C{}=&%^ahDUJ;%{5O)!53Tz3`fph9 z1LuY-O2)}v@4bq5b`;xAcQN~Cc7ibDB~D}uB_+b?@g#huw5fY*k=&MfJ()U^%Yz6E z7reCQYdxzIc+MpDe#G=2SXd-vkLI4q$f@EE$n3|G;p$o{eN1aSgtzBzOBRf0Mr(GA zVJB>C%w3ZYYlWy43}=3xFt-)wh7s3{{Az^y2zdiEqO~+yC>3S@UOs@6ab{AiPES?Y z=eOs=_gpl-MC;A8xhbc=CHO10cH>B_uq8)$iTv(ddx4n)2zEDbt2BlupioDlW| zd(#E?0Q0?%oyFO`@F+Fk7u)QCJa~qg@j}RG_KfDndmMU~kPj%SO+;5Ve#h2uVR4oa z)|LG|*)xKI0bCu2hnJAu4<~!Q78S44jQO;dOv@;bAZ+f&iY6=@M4<7)SuM2vA8Lu( zS;oY$(y#1(pILu1vk?(ZNt#H$ous<#twZq7B*1D7@HC~kg8?x)*{i(r!0RMDqZ#y0 z_9{~0{9t^PF|{k#>$1e#On~)>gqLq3tGJu1Sq=Yk-aKnfs=e_mMYTBElmub>t1Nw% zyK%zSI!byo?@PA&36XEHBSSR4d;V4O1{=ud$r0tEC{2(2Y=6BSkCuw_yzh)C(&nvF zalK`Z{6`g&*-dP>bA=_NSd=TAYRjUo#5v(zi()_FNN+ZH2p959eb=-y;hwi}VFbao zi0{Mva@(;|eu(YXCj_-5_)GHsr6^UH87u7W%K7@-eUn9x6a6BGp4EOfu&3)So|USq z`>|4Sp87x4UE8-y#r3x7Xr)h}n{D|h9(Cu~KoUM<`p3+Aj0f-G{|T!)E8XGR7Thin z(#wQXleDZsLU}mNilEu)DMql(?oWDOT|%q2wz(SVkwW$;-o~RT)4t+x3s!v0wOk=4 zRLC8QR*uXmujXo%7z+mS@D-AtW`(zC<^IA5v!+&~c)>TUti!S{1odObcO>=JgyyR+ zGG!b`t7%WHJ0m_u*zqDqjEZI5MXHWDS&xF)W@HFQo@P^~uwXEkp5<0YqRJ!U);+bc zC#els*`MuBoG28oK2NMV0e;}&08?E`6CEBo;dqO~KQl8%Sdc5sGhPoj7kh@T)t>u$ zjT|o(=Z7DeJ*CY%rQ&+WELFdXJ=H@LgLSbMzF#n_0}I@Rg*{0b%IYt1bZ7G$1ohAu zQ}h*G12AQ z#A>hmy-LLEtZB)jLLt*vNcfT{JBe>nnkSrn2k&=y*o;TbIT$F6A-5xe^|?QqFkdsE zO64k}x-Ix!P8SRLe-Scpgv{%35TqE^X)ZTbjfi{t2rma_=AV zYOtv>>M74E6ZXEsvKZl1xqWEe-Fg3VYKk!RL+xS%`!xOd;S3c6r%J^+IKJG1*Y^EV zalLQ8Ze@44)SNhH7Ios-lf?eP+#JE{OvRUhoMQvWBs+0S~Kl zJ5bn{AuN2KMSYl7CZwharOv80I#mr2sl-eDl}ic2j>%*?b1_g@If|ooQG(>zb-CMy z%nVWH{uvtw zaWPZ4kS~O2@xbSZf1J5Z2@#HEnSEf@mC~MIeIJ&$AuvUFU{YYLkgl>i#Q%nZsEV_M zV!Nq;v{i3&w+8lXo%yrzI`gMX#W~f#eCD`dibwk+njo!jn8xrsg>)LV9M>zd4O9m?6-wAc0RB_v>NBUrtASSB~Q~iWvui!aFaL*DBf6XhXLA>K<_SVO}8_T;G z0kx#L@{1+M3LAU`_u&K#!cP%FmaToob#=ZF(1e{T(cN6^xjG9+4(cqN)f8@LGYi^$ zR4T5I%q&=afsrY~qMoMQMXrJvGX&od!QC(;_ODookHmJpo0jgK@jPor;n$BFkFm@{ zi0{Gi&k0Ks_B}^-o^ZcDMru+xP(MwXJyT3u3#OCM@}e zeKEq+kGZUwKcfljLiYP)w&CP3rkgvnQi&Jalpx`nvmp`qPnO<#Z((_=5Rod}Y{rb* z9Gu94c%fi4>9q}6(SKB{8BbIA1Q9A0s$8AP6WKeCmQp|?8 z>ZOiXNsSQpzQLiotZ7Q*04-*C`4>tDaIIVxS)HoOMr$vu3d~I>d`I9Y5FWkD&dF>U z$dwmKc$E#W5&k__ULw6vRC2l4^UB2a@Tvk8t`VJ__vUNLTIF%cD-#OFkylrlw%q?B z212@U!$(+KhkcR4{Vr_$Qa^8XN8S2egJCHXiF};-%~|{{I|j400cSOqP=)0;aKe9o zo7s-Nu54^g>NpBJP}+pB3G5of-aqt7t9$A2->hlE!M-}Bw+51EJOWk?S=F}LZ?Y~# zm_3r>x7bjFHTCf9NMW9EsRLW;k{v5#80*cgfjwWh`YZ!SIHv*0gmPJ;ZFh&bx;r$n z^8Jd<)=6xRHk|Llf{|LYd)Mpi4HSZ!6a75-Wx|;k**2K;T3i`T*<==efYNN|l{0); z6F;uKNpYI6v?)v5uyz0kKj!k^Y|9bCUR9j=MQGc8vrH`*-+S8Qnw zP(s`CTA2+hy7`3ImL&@_%JV8K=@G;>?-Sg=;{IC%{mzUK!LJpb?J4O>pgL9mVQr{U z*k=u6X+7@MB&R(Gx^Zp@o1=v*Xs?W}*oQxJ8JV(|*=72}65R@b=Z;gMH zuxSwC!-xtLPK64`yRarfSo;Z1_IkrB-Z(^Tx9X7VE=uO?^(qN2YzY;XwIZk%3UpE% zX>+Mi_7AH)g|pQaYqY2x>2ZSlNG%F<^K;w>Xa?EV?xs4C>LweF!DzjMk29?7C9LLAI`MOVdY%I}y&Qfsn*<9>OvhgI2JT`a_oC$|Z^ z-(dZFlq8BCXJ437jk_trrtb)8P0+t+shbCr6=W7LktEYAEB3(W13aBsqe#0a2_K5% zOEzbTv2q_{!8dGc$~+$-s5|G>q-&06A8L`-k~^l=Hs|`;z3vZ zb42|dj<%d_t6ZH<_Ih0^Ci6|PC3I$Ofw1WXwsgVgYpt<%-cu<4jaAA87b66`Ltsy> zgcw^Q%z3t4q86ySnr*1B&XY+l!&Bb1*vL-lGVY-YxbYRfeTc{twRseL zFyk#wMGG?<;&_RR*~08nK}&dMzt6ED#3c#)2U0LaSp2cBmetX@x&`OUGk2`p^l+Mx z(}2jycpDUT>l5d>pp7rp?#S4#egbmMgV}h#LhdH|PW%L|cen6ueaiZsxjoo7l+cbmXh2apgwlE|dVa#u_bGe^pW&p|XN!sKTW4hH zlT2?;{BtbvH`~RkX=jxR7hQ3r3%5TbXp})VEi(Fv)dzTbAi)X3tzf}(GG~i~%k8;5 z)x@l(L<^c0p8o=#9>PV9R=YK@7wLA-Dp584qWVexSC3KKUJh~fGW)$v#bi7$w)pS4 z^CtVAH?f?ijM$6P8pn_`?5W=X?K6W<%!xYiyfqeaIWi78_wT2`@Kdt=B|U zun_bUmq)YON7(N!WCWYZ7+%qXA!6I*BY1Q&R38tf7zW1TXVd`NqiXgrikow-6W8*E z^lAnyd^%T%8io>aDVjFECHoSEsXrU$&KtqPs=C}XsUlXRes*)zRqV(VlEQ`j0%2!& zJSVZL4$In-_ZNQAVpt+djW5>v+f#AE@%IV)hIy)C|D=gL1w&X_AS@V0Vl6U86XC+G zY6>oNs+t!(D@=&{ltbOgh!&2f2?rtmFAl%2evVSO>qbT^Hs%N=A2V$bD|=J?JgLJt z`3F0{)Yn;sBluag zmPWR)?G630)rY(FR}TKg;m4W%Cs!M@cQP^lV(Kqk@DRLOkQgIetx4WT92-gTaKc8h z?l0n>!lw>tjrDa_U)HX2_gtmA(#-DSHOFhJPK%+2!a41U1dy&0waPxh2 zrKvhlnk$6-#MuC0cNdP=Wp#H_qlEnf*l$AZM-zlZBT%glhKN;Axsw#u=>ew^sT@;b!6M{-NjepDZ*ld9zZ^Kv_h?Osj&7waIGmZ#NP6}(MG zCRop_R)J6LMCLdGlp3f54^o6B{m~fZiAl=I_@Cg)<#)K%lJF5Yp5Z~M5Y|+mumT6xDyM$Y_gTaD(ciFT z98m+gpCxQ~Q;UG!c#)Y#4qMGHrBy2Fp*W8GKp{O>C=L?>o+Wo2X$~`~m6-=(+vm*n z;S>&F#*Zw2mRUcM7$PJ!*R@o__K0st4i)@{u<%_L`3uWCvHes0%hl$}@W0qjJgK+K zivApJ%=!f3?3;LfOx9PdeT`lJ5*936uBntKPWCFlo8J}1L>Br8D}@sih)or?*HZR| zYkza`CxWI3>&gQf)(JlIp5~)nZOXMjN%??fZXEtiiTV${&6aE-I8w*z=3*~a;q7rw zT>zI##d+fkMpx0Mw?kaLjqI*Gq3dg>{z$?P94!)#b~4f9ly{igkLcGaE)xuy@n|yZ z68?*lHT{P~^O7i(z^5DgM{&Bk{?)p>)v25$9B9u$b2C=il)viJl}d})Vjd%_7N_f) zlwVCNPwvLdp}{I(TG;RUgUlnR%=XKP*VH(+O)u&OsZ zK4)`@aIiJW&$84g;FZyu@xjT$u0M%2d&+u-Ru|}8R=I>c9wWgG$7Aeyhnz+%PZk`n z>IkfX+Wk>NS}o4?VrvtWgviO7+by<-!#MXemr4XR^8S<2o*pKo*5qMZ?p7luPIy#@ zWrMl$1c_zB?)UV0>wZ}I1G8!v*F;E?aQZuTzs2=nK`Z)(H{)EndR6Jr&ZusSZ)Pe; zhW8{XS~ymXq-nxt7ySE?lqdM~3 zEGI5JL79)Bci@iBn#NMxft4@g5ii{9%9*bz>(9OVJbHp@uX6i04u%Qt&*^upUV7CI z-E)NpuQIh4JBo!=AK`iz3S5}hm|SOkA2aoc=Z<3OWHO&I1hofCgf(w);tQn=%4~=C z0B(0;dkI&t7t&Y1iJ>-E33HIZS$`i|P= z_7zjpMr_Mp#=8UQ{dAaRZMfZzg-JrzC(Ld}{4hKkFzqQ8y~uV`gSj%-QEaQe#4}S^ z>mw}b&eCcWM+hrxlO1m;l@~SVWJ}h5P3m{7=u6_)L^kB^ND7jK@K3pF&|TJj>C>&; z9xf>p*Vz{gKJap>IA@jP1GVYn5LX{_dss)XwFbNUvgRGqf57K2R=ODSj_7~X5w*le zSoJa`Wx|niXuZ{=tW_i8>oWH_Wr~lpllnfz?!v|h!NaBo!LDTCdy@ro_9coxA@m7O z^<(>+%=&^YJvmXE8RZI{HR?ILFV}0bvN^j;#8CW%x^ZU`yIUJiy_3C)8no+8Hq|ve z$CsROX#MzZWWUBSKOw9a+2u~SN(m~q^Mkk&AzbwpyuZRDT8RIIl7Cp$hYfZTKVp9i z?&Sy}zM`DLPWF1%LOGA#VDrzM$`R)L#_DuYFX+J*s#2}8tGD=014oeu2VC&FTse4x1RI)f>JnL%7+LIpv_sb`@Le6|qH4z+)hx=vF@WK2ttrYa1=| zelAkDJQknHoO+3zKg(CWRCR`%`&4JRQYy}~YZ{$Fo4yWl^);(*-F?Zbes^VRA41jm%_$ABz?q<7HlaHyq{p} zpDdW9E`+;(u;qIewBxcN==l$BFHvzXU$LYP=cfo4%2oaD6^r$b*j6d8PcycDzyvMX ze4)RpTDeX1Aovyv%bSv$AnF85O%~E>koN`;T)1ooV|9Yf=*Jfv?aKXTobE{0uN%oDm6&4 zEv?43w^(80dUNiF2|@3Y*PMByIqWUW`^ls#ZF!PV1(~n6n4S0FCKBiZP@*o7B}_I7m7x(zBkDxA@`YziL5WS!1r)(s+RG* zPuXNHU#rS={xc303j1M6wy@!S?g$Y*ar{A|u=sBhd*WoTa_Rzu78cz5A$ zcP{)*ZYP#U2zP7XcptyX_y>#fK0Dc~#2b!0%Z9f&-<(Z{q5Y+6;1tYmn*9(-m8=p4euV z3E`g;SSaKhrQLeaH)IJny^QN+Lo*V;V@`>1t5{gjo3*`J+>BXSg4ak6f6jF$vcD%{ z5|QOfv^AD>AVx@6Ur0alx{zBUWPHNTPL#aNyimdS6Fi)`{kj6R*7oOMGiCSOqx?8k zJPZldS(_l-4iJ1pg@sKy)k$aX*^1#b6x*2|6m;g`1DB zRW0!H6oqFj^b)+BS^uuS%Bo{*@2>x1^+O!(#kJPV9>`KBmNX#NSGduW>uz}VAp8k- zIO`9r7Nze9ZWRdYy0GS3{afXn1l2k865j23@Fde~kkCg3$gVG$`6m%k!fHR^R5Mn$ z<4!wD(}e9cSkmx+MspQiE#e#eQ-ot9^!3(tUDlB6-`nG^dOu_9OaNMG?<#T>sV zw&ET{y=Xiy+q-LcS=o{kpWt>IE~W`PhjKL3STa^=rwOO-?bRwc)*a91S@jI7yO8|? zff+)fE1m|OJfz|)pNcK(2})k$&;)M(#F1ZE`2{CF!1FV*(*&)}nfnn7iiPy?+)op; zElWo*Ya%=TByuE0ZCLgK$Mb~f7l`>nhhSAz)Y+b?6wE*9Un)^{S6o9sVWpjwHCXO0 zoM=lxTT*<5paLPNP;?{Bdz*W`aSsx13}UgL8LCx(IMkCp%{k+wZ?4>$8P#oN8h8sA zj{69Q>XX|OpA2E0Q8cX1gI%>K9mu2aIQTOD1Mut2vOrP2b3=aoN_Di!CY zKNxAE&0vSP2CFo2Yha(PB6~`TI^b`Yit~xEauKNQDGqU+qK{ejzSyFNFiUy&%Y^fT z*x@?A`D~UD*MZ<>+-XU8e-7D* z>S@#fRX?1n+LJ3@A^35oWePKYX6?H~cVt6t9b^Oh93A9V1M|64D$bYv%Db=a5Qn&i znC@GB0<(u`L7=6BNPeCr0Ll3f|7#X+c3N z?tRGA<{aur{$p&d&B}kZr&bkX_aBOQoY|J?!+11Bxb+L+Q-pb4So<y$KMQBpVcM1I7cq0Ie)h}Oitq_LvNK;e>??i4o{ z`&^xb6ULIdt3j0VD_onQ4si`Nb6|Bmq!bFPv>;!IaQhwRmI()*;mqF@`G^+vOMRV? z;_|T6!ct+mrx>F-LIFZXURdSiy}m4eo3k3TZma{SJZ@s^N#2J{ixu3vF?Bq5e`c#Q z1%g&L%4)*VQ9OKx#7N+DBXB@{Hv*i;!hmz95 zfRgTh!t`<@&w5RTnI*U0fxdMKtVY5pV!DtHe&r{}no;OoB1%%V@O@6!#(lCW!=Mo& z@5g!YD<|8Ko*_hz;{JP-yk}VYV?JZwFddnTeZKCLpi4G4C;PopaX$L0kqO!ibBJr0 z*(uE`roWNcw$(E%eyeM<`X}aV0!1Ub=qg+1RbhV%f6;%n>c{Jng?NV$UnqF}zf|s$ zHXLy&@6!V9Q>g`2GP3HOu%UiO=M+kkNtDlkiEt_B9mK#T6g#8IZ z=3nfch|de0x3i%a?wP`cUp1t4qA{^1fNeG1m2M+Hq5J@34dmQ-yh=q)=;Yrij23>Q zv;~RJYZtBi_PQ=zy@3^-?jyEK>B6nXO3pUzZOR66XbdxoguQ(zbm3ubHgw|TUu;Yf zc8+CVD=v3sWp6f)!Tl$erU`|;nOiKJ`d;@$1N%bV6SE9_{(&N{{s*7ec7#J*Bh03- zdi0OI%Kix9W|nZ>&a@!mw5O2#GYgfV4MJ6f=NfZ)0!s(; zC|t;`!8}*;ny~F9^3#QVH5FESxeFWW6C5gd$BN-{IA)}bRi5PZ=U|c$-2^3vaH>i> zTkr*UekAZ0f`@YEFV?{fIKwrPUHz`yJ7CJl^N*P}aPxL`+A#M6pDjwTqQutM#?Le_(Hh zuu`)H#t`T!gfuW}|D%p<>diD?As|xN-Ml-xndy(SqXq|F zVOu}Et1<5_Qp(9otde4pos{=T|A|AxSZo}ZR)x#^IktYq^(VBSR!`@qpSk_4;lg#Y zS5YkzlZ5!sN%)mRo?(jJwHfIU*GO}mtq!p5c2<6cZ-3@D zQBt`rxk8|aNdmajglOHqZVl{krqt6}>5WLzd6lP{8Ry3lZE#(y9R^?CQ z8m(LXHeUa-?+I4CNmkII2*>|s^>6HHNlGg=jbWyTIYL&z#`RaZ z+kn`vc=V*ePZSGv_D?Nvw4oC>;IuP4)rC-A)X6%+Ma9AuCzk1b>OyQS0^iWgnK}Qk z@gwe!CD(k)iWbeCzy&vUy|4bs11<2WPtsIT0);();F%_*eZks(ntd4fqYm9FM$WhA z{y-LetN(6A!g>6{mA`O&z}nVqa0n+~U~w1X-=eS_`D1li7Ws)Wwbn%mr(%SAd8UWf z4S&<1$gR4@27@B5V$W^%6mtLI{=01Wi`<`C93zx`K(=zKw&2mHJp7HE?{NHTD2;DT z&^}v@r<@O1*^2uwaQ#P)b>pB0A_Ii0A;J#xaNml<+g)r|ql7iTu=FQ_e1&ZTSl)wE zg~H7+VZ~=;Kh5p8i2R8;f8hQ!8J{RUt*@7GEJE~_@*k^Tw+i0%a5h8mcu)Uez4THLv^-E*SCoZxpEF)VST%s9Zz`Jiat|(r z2phg*!Ebn`3#amgrC+f8L#C+vt)A777ilB<6J}3j$@eVp!ujVYf`eo59YsRCaQS`a z{LAroSdbxvea`_Kxy3?RIbBSpqeyI9>ua5*N8>pDwaGy|(iG1^p{O(Q3hE0oK>1~Z zNp}~n_)g_A9GKCHg04JpFBk&0)ZI+?O@6h6s~D4{G-xE&!pG;VS$Vle6tf?5&j zB_wyJWGvU;VV}tlaBE;+qN4J?@p-yC#CiGuNJq6D?GV>!BPy-8%FL#$uVdJWSHI5G zX3WVI3V$OxMF{SRJDe&J!bb8aK`8x(4K9Sg!RAq%?~G@G;AqH{<}4`_j8|f*e!kdP zARZ2J&TDIK0&Pxpi0f4Sx?2PLvNCaBsV=wp@;Uq*FX zN*{`!CAvV^I1DA-T;?t;Efc&NGj}9$)!1Dstp7$cE2cyWArsl1A!JPxuDc7%)T&b> zsfyOLI9d#3KWiA-|FHL0vU`x>D?Bvr#nu(4tcBRFeaox?xQ7axHC9@a(8(Npl3Se# zZ^(HgC)`}@%XL@_@7dg(>|PFWUe(hKUYoHFagB9o9>LcYZym6(MVyU?omgHb1ZE0b zT=57Ny%Mia6?Q&J?oiYQz2BPn>fG=b_P@`;SkYAK_0JGlDoiaA@;!um!%3{eZKGUS z&vK44GdzSP@9LIoRPp7yVw*df2TyT+AUDe`<|-2H|LdR;y@-8=N5i=D5|?@sRUa=i z<|>Nn<_{?SljK)Spz+r4+#JtNQ?jA*h!*r9={JI)bPx$jjr|N;+j6Tr z3O1dSCM+9CiaOMVU{@l4RL_y&UofbVt%f$LXq2_alAL@ ze1zH6R5hD7kgF}pY{Sjb+pCL%E0bpJ)JZ!z9Bg z;L)6opBp3VQIfEA6t|sNZDf!2jb#HlIEsZo5m3t{5GhQ4YfXX+g+)Wj4Hk|i2%fdL z_?WW1-3k{DwdMX~5;~GN9^Wj}$CefA(nM_O?O64zj%RgmJZf?$Nt9~jT$FjxYEdp4 z!1})_{S>7=OdL&6e@^H_ZZ7uKx{3#H>;Cq0h_nCuW)-!W=n&ULvx-(l{z@0#Hb4gd zA6Z={q`b_@AYqB8Fzru5yL0C+=0ylwO#H>Vi;g>SXf)?Cgowk_jW`5kA2gu~Bp`x!LgTGWX6WZ~p%Jp7vI z_UwO>O+8sLmLuhAZ{=;i!fuPt5~7AP_ZNa{k@yWe2Xiw{ST}|pUc&jWbh}p0;ldUL ztvJz%RguD+_GnhGPT1uD5kc<0--sN|WjEZLu%-*8KXJ1hI9hqI#kRIL>pvv9Gbx{P z?@bO?=h$PWo4!S1&oKmkg_aHquq&;`oYowEgB?!B2fSt+R}+QkE(V03{-Z`D?~dV0FNOG| zJ;uI<%r?I0&nuR#x7dO{qWF80g0Lf6*zhlbb=cpFqun?+iOX-ZqYejpaqtb|>f=6~ z@GpsanyG)`Stcy~fY4X8yz3@|j+#Ix}6aAA_ zTgv^GjBoj04O^>|`TXA+GyMy+#5*7uN-)bXdfZBHPc=2Y=PH{%q@>LH{N1Rpy2fwi@UL8iVz$vL`Is-`P?@-Gm=wL!iMsT)+$=_USUp=X!(W}nje!Y z93Rg9i4?>M7r#<+z?FJ>-CXP&bz5a0)GhI-I4$SUQ9U zZCLh+(J`(MC+BG*2C;gYP}+;g@5)d6Che%VhsNYX9OAsKzv-wpGaTZYVLECxTGn(V zDN(pPh(qsF>@BRy7q0)yCM5zIX)69iwIk+F&QH*dwYfk0#*_CIWyWRVR&o73CAN@0 z%+n02Ea8-|s7L#hNvyGou{+(_VB#5-+K1R~KhFC4r1!wDBi`c)`-$C2f_Ec4$8n|> z2O2PKIKFLJsX0|{F80kj#Ql49EkaeG+078OnduPMOfy7l=;cu#5?^3?EedOrJ&AkH zT zQ;PG2&0{(LHzh5V`Z?hvb__QqKhCC@XxEk~;n*`A7)O%H*{}xN_Ld6M-6+xp9ir^` z^9Qo{XQp)LL6KN6~SdEduZ<@x#9|nnYZ)d4j&)MeezISr2rLj{pFqjwcXTH9Q@lTA z8!F5nq{$*{;)LyEh%;NKy?PA& zHGySAAN)Fy8ZOKYC^rl?eMmtkqBDfEzi5Z7>9b|e5nNrvxSOi6>wPVU;$*L4u1@=a zpfRk1t^UH!JRz|qCp?82(}dHF$?HpQn6Se`@U6?zPuT5D?B8s!jr+T#mkMVFvi2vA zjAyaY<$6`j<-1}F&le)QP%up>bRwz|o7KzJTXpY^Q-uw`5!Z`kXHGbTC2z1~1V`e< zP`V#g`B=pbzIzbGzp%q7P~TR3;|sCv4;41L3pX=`t)tnHDJ*Z!{BDMKX!j^~j$+z7 zMD$_vcf?I(Ws2baD-U9Xg+DX(U9NfwAyL9@JG1IA)lA4Iw;GINFzO*+N>15cMv%{e=xJiT#CTHT7*RD&F>t*pB>3 zS&2~GkGNdH`*UVY6%t?5$E>d0{GT~Cij^<2b|QJbIi4g0c!)^=+4LA;?{nsTPDKk> ze&pP%T&hiaTSD9@`dnXR{a)$UXargP5ht6ovjKtb!hsj{F>8)Z*=wBthNAxLe}Y0c z<_#uxD8nGygXZ_c#f1PQ~*ybTz=}6cgtO^qx&$9McPEKNXbGDWVi;G1+(ZIew9V%eS+n`XjoD-(()5j9P?TOjO;RAt7^#lBtpJMX++9T5(3 zUh=ZJI<%SX5Z7$;E~_1KH&fW)F3OIvyE7+0VdWt9^<{gRaPC(wKdDI^{|UVnc4fnl z_>E&tqOhhGCwr1^g1gpRHzz`ry)*A~R^|#Dhm-UymxiL6`_UiqohJCa&Qc#?V0Q#?NNGu8;L2(ggagw}lcLOlil1A6Y1zF*4F>!gw^HY#gcO z*(_EaKm1pgJxk8Z+tb@Au$@aW7e)PW+MVCrB($kg(>TU3;AyT}@g|vEPf;+kug+j;~73WR%& zI5AxPMXTx)_#!*YwO?zmZ~a5c;POMZOZStfVV#e5i1X&;@K23;9U#Itz5!QKYkb>(`juzsX#pvNc~!liPG3aba;_AeYUDGgO7F|9Yz=03GX!SA@S z%U#%)DlBQu=5Liba><8mDHhgOBVL)MUu2z^5c-UItYRaDwNDc^Nc}Nqx*9*m3ZvXv zck;3{!BLCSe4(HPo4auLD=x$ci|Vs+A^}4UTi>l$Io?Jm&Z@v2d>p@F1a>7aPZW8w zsxAS2m@~S3?RV?ihnu3VQyt=bv8a6QwVm$}*L<_~KUA#4w_=OZNXTm>f5(Ctp)g*U z)|9mw!hr%|w`N#8hR5q{8p{0IWaJ4mlZ5;+reM|0LgAr@5MNVc!Cr3=+zqvWj{S&d zmayOl?RzEN(y`}`KX>A}+;Y05Ar*c2RBRjm;AF6nTphnA9L^9fJkPe)q`ZVjcfy|H zo}Zu?ytS>#_>2ubc#tQQ*1^Y_tY`74&bbUBFocnpL-@NQ@ZY_XF__*!(H(ZyAE~ZKcAp#uPk8On1#upWeR0 z^ZRVYuo{XjtO+aK1^>S}F^&sAv(98LcdB^eHL*oJNwji^Oc8tog)YQsG>RkT_LHc$Ryj z#K^n8Vtud>Q=ikVIX|BJ1K6WHmJK=oGfD}+tb=YR7yDlQTHbz@Rk03nPJP^bO`C-d zaV<1ovu@4>&$G4(#V@e8Oi2EU8@&WK^3Sm(~Xbtw23Asbq z(g44fD51c?SJ+jbtma(&l})Llxf#*J*sb9(gHy0x9mfnFv`NLXH4xjr62U)H6hObf z6|=N(LlxmN|1Z4EjppWJ->)-x#Y8~j)i+fh0nui$LtKkZuPbA?Vw*l%vwRQy&WShi zO%yhEAg&_|!bDSN_Lm8_I}qHSflTX2cpZ*85%x5ZNrGbtH@Y*WA!~jm|4q_g=FE6j zdh52Sa@eL%;#gBf;1$$k#`kzNWLkC2)86@}IcGF4tMafLl!!Lhc-E~bqy0~EEKg{vb7R$q zZibs>t3*AnuYKh+E`7n0-?-X^El&Cat7@C@ltB-BeL+M+)_Dt;GlU0v00x^%I_ERY z3#|^=&AmC*Tmvn~CUdSe;eA-`CoJyFI#1zZZT*7PyXM~)_iSNKn4oELiyN|b0=s*X z-~)%{XiwOGPb&H(G+1tjBtA} z@h@`rOOCW<#%O|rgs=u&8N~VmVVjACSe1;Jf%tc0T`jho$b(x0`@u4CO5rLYIdw-n*{f`>mAWu)4eW<>@2^bOF(x|1c~@w;G}LyfLtIPE z-hZQF%rA>=%3mydiycohTS=(8F(*+tR3@nHo!OOrQ-#~*d)aCpTpq*TcR3p=1pdr| zf#sLNVHIgn*Yr|Ia)|Tw_U2O1ro$nw4)ba2_CH)E1x}<0 zXFuRt9ZFlV^dpwkXUcOp2C_ZaY~0F?BDVNe9PG*Aeq8^GWm@sO9Vdc?Mcp{tfxMsC z{t4^8AkRShtfqZd3mzp4*Sc~+Gr`>0+J)0y**Hx!IeSqb9%c!5b49E99aR+E�f> zOJfmLvgVHTW`Adv7YHZ(#gH9rQkvDi9Qqjlp7_;Zn~!ihK$Ls;^ymLuMmHDx5uLaN zCv@VH9pb#Qv6(n+mN~?=%uHOriZ$yYw%cFe|0^qA;K2L1w`NV0P&k;gdaVE9(il#R zC3+(Mt$EN+8K)mK=ftNRQG0t7_q>GbwRFZS)!y~Bm-HaQXcASl`iKzWh=$r;W?PDI z=V?5Muf1wHBp^Nj2Gs=rN6d1sMFe$-GJ=33HB3qf5Re0Qn%%L zfw1OPPBvnb;Flm=_7Sy|OE5z=`Kw>qKrE%(ZF4 zG?PVa-McGHX>6;z*(+GM)RdAKF#-0VrsUNo)6L9>#+}?7vQK4Y72I>qv!r6(51 z206+D`wlmUapgtM)#j#~lG$FV!+MkBWes&_{J@F;;Y^kgIz~rn?Mm)DWqkwob|88jrE#KH`PFJ# zvi*Rt!B}FUqdglwKXTc#PbWnKH%;XEcl3omhAspiz`fh3IBLemI1%-_19LZ zzwQ&#UgT(mFe62X{ECCMxmA2<>NXRsys1u<<=H*vR zcw7?PWo%*Yg`8Z3#` zHxv09K4ucFuQ>A^Cqsnd-t7B;TT_J{UlSH1+=~`=8cWpbN;~iZyB_0VW1?*21PPf_ zg^kYaHb>a%E%JGa1ut?@F{*zMF@VC~i7C%xvGypVK4-e?!dQu%z1#)A?>JpklRLtb zh1>eyc=owbG}#mYKUxQ$f7HT@c4Cd6u)Z1V>KL%;{7B(>l3wA+D`XfQ&6?PG^dAB{ zli7#j{$|jHot3ctQlYR~J(dx|^55_rMCjY(W(xWbPF3&Rqmwn^Dr5*pUu9z(Lmj>S zd%X=8JjUra&@AXPal*R(+|Xo)Vcak=3#%hwWvsCOOXk#I`&iBd3&EOgQe|2WK1GL6$nBY+t zO>10dXH`p%|EpuGyp+YZ|7-mG%spfE9wc{TO_6Z;Z&D_3r6t+sch-Yc@G)5meQ&1- z*60Zwe3KK8lQu;N_=2Ebn$nc-W8Q0(i_2X|c;9$Tj=i7+2M3~r@M;`v%<`5T@;A?0 zH`Kf_S_Y;hML0K>Q;H0kM3^y&tv5${CnD5~@tFoNMW*;9qAkM--;A`TZygr|s@ zWZXq}$8hX%eCu=MD{`M#d;4f#g?#Nu5h7}{e*iI)$uvft^~&@8kc%-wUY2kQp}kuaCuBv7VscYo z;e2CeKV}NMXow}oIK{1=szXV_>8Zk;SYeT$aN18$4*J7!!pVMY7|vl~PJgDn&0bBi zs-iI-c!IR|NsJTL4K_vfZuH>RH*Aj(R=>;*jeZ(ezjgbs?M{lPkP#zj{>w&_7UR~y zeoS@f*~Y<{;t=Qg#pQ;Nwx>J9b-Gcat)Rx_<~W*@-Oyl34%K2>gpgIoT;9{4Bg8{U z8An1x?$l&OxM;E1U4??rJGj^8See;<*2wOq)|~bfZX^kDg@T9C|E%I-$xx;i3VDOL zU;W6OkWk!oSaBJnF}zH^`aD_RlmWWZtVvv*zWjB_?(ouZ2~I)qP&npCi9g z@E-0dW{_5V;mwx``V#-%Txrbw5aF(uuyi6b`;zzzejUkw505bf_zI^KoccUl0t798 zdc=i2ZCPaO4(qiX?jy`?k57)NwS2h^=Xw(LIOjfPrB?oXg2hcK4l%ZL?9)US3L8Ho zt+wH5O76|k7VK}qY!_}u3%M^5*ba|Z@i1nF_00ESa|;$l2<{<*PquJjC`mn7`!il& z>Itp1`NdY)n9JWXYqEj>))xtv9wYJtwmz-wS$kTN`yBq$gzcq*M;*48h|&xmD;5rh z2v>f_OOslk(U(>V*YU^vh1k)Ae#M=>q=XA)!<3~F$clSf(UU|3z2tB7=Su^-pd=3|g`sSa`8 z`J}N}wK>Bft~2zoxw+U+l!@!?=?1Hx<`CzykIhrsoaqqPnfg=}MdR>ulnzr{HTYeQ zmkFzjMDxBqe1*ed!WlPCHX&;;d2ZZr7cNews23;7gjJzJ##CY3=RArQ?hVlSx9aK# zO>UM|j)Xr;>HBComy+fbkLI2U`CC=1b0blV$d*{)?gWna!Tm8d{f(c|4qmA^bj`%( z|2tlB-()Vbdh)>%AGO5?)a?9>UgIsEX|AC!BX<Hsfi^e1sbx zv9Uy$(+VxkF!deI|HN(=ifR$o1&<+QRO9Zqs7o~cU-rbB?^Z@EGOF8FX9(+~gcWXF ztbQTl1I+m{g~K+tbB&pP~qzDgeYtKTiiDpDAsKqYeEdxFu~#%6kd`0 zGzUF|vp-YvEEoS^oxiZCJx8DAjx#GevF|IUf5W5N9B9DSH@J~49Q>HnLgCH_Z2pS* zZRx`5QXx>aWj7c5DRYtyyf{Noa$j?jwK>}%uCvW>try9*ueq++pQo5Jic{scWo2Y< zVTMrXw_r^#_6_FRFKkFOTwAka zgv@`~{3i4MVO<|`BZQsN!piFSbft8v*|zN~c7GeOt$&iMA)*O}m)f#w9A%0Y%MkqE z!?QK9?K#tkfHw^~?LW*V-jlf7mK9S(K_tfo@3**Lo(fW_U}RLct%?v5eq+ic=6p(G zsIW`RsP{29>!m^DmJ0sunca~)&uIy7CwrCCybscbFmpJUA_WD^t^JAgIs|%&D)q{7 z^dCVM)tjQGY&SPqr2{&)x@|!d7X8SDMmV}D>eIt7tVwTi`(+>9d@?RepzkJl=p~ygOX6;UTdNggbhZ)wVvttpY=yp zK;m+5VP#h~yoTaTH@lm-Htgz18o2U>M%j33A~~nQ+7GhANjtO_unH5jnZ)+shO(p2WMp%Il!6EHJ*a zO0y-tOnlshlr$lIu-S@bpRv~=Ot+K&A$R?RO=ZHtYJ_(t;&Yud>mr`EDP!-+DZ^9Q2-Q6|FuqgY?h0DxlqGV5oeyQ%9jp*PoT z94Qdaw=JKlvpQ9W?x-l6rm_6)W~#I~&mpe!bgJB3?C12UJOj(ic8GIoTl17Q=R3r8 zzCKlDQBP+J{*Q6COo$ta|Bp=h3k?u&*P2xSu*gfe5-uFEajs059V=`~H}b_AWby65 z%uh*b$@S_u{DdvF+1!c;U$VX<7ovrW!$=y*y3cU3Th6Q4)|LrAHCXW^r@9kwe5qD! zYCuy0yP&j=m!4;RO}4(p;t)Yo`%k~hf!fSS5O#lsm#1ir>a9JQ5h>jD5yEuN>RGQ^ zpN?#c5fc1`Td_jmliY8}tq*h+E90EqYzI2CR8yP!;-4a9c2F<0&r|Gk+9oI zb8%s@uxlvMLs;+)>zb*-obM&vvXk*U4|=ilO)gHLs5<*&g^jOp)s6gDxgRM+_aW{7Rj>n{7rbrPB5@AR+7RdfQhx_A#s6MZs<1?X<5} z5fWxBZR=&H!1tgbZ2lMDFNpY#)ZyIii2r9C2@t}@u~6M!qqyFkN3U|S7Nw1qaob(! z!Tl251a2<&^JU^X`*MgL;2eiI=T9*EO`8iG;<~`>w=XNsz-M9$sE+>!tkim8CBn6M z;ie1z&*R>d%ZZ}5(A4^D9f5mwHmd#f6z9u?wWY$&+6EmO{{h#%h4eHbsJf2PdgRyq zgQ5d(P7zN3!0JKVNfTBnZ`1qi9)nLa{Xyl;CAR3-S(zyuC>D-4;&x+JPv(*48ZypK)iJO5-8n9@YQ*?LxnlEd#h@FCEw>p#8KT!( z_;40{z{xkXAC=CSpgQNAcLG1sKUt;C#@^h1fxCU!og$_}-#wEh zX(c8V^KF6+c%=i-j_erQtNIzCI)G8#?Ca|ju>;GWGcgC_l9w$suU1B&} z!h{?*CDQm$NV&{(rOM!(HSu%Pmz;TqEk42)Lz!vanMdjy=KOQRnXNL|oO5f0An6&h zI^q2O?DtxwtiuyAijG^>t4*jkU zrWwC-^;2SMu*-?~5oA1TQktFYmS9LX+opdAew~~CLW++N^C5W?Sok=FP1*htS3Xvu zyurZxtPzxz?=ojFp+3Ud<^^AKhh2-CFg zQ#00T?xYKA+Htua*Z#ueD+2UHySdme>WT7<*4>rs5a&&k&56?HLWj66G$+bBdrMz2 zu`rJ}NYp@~zYyG=h%PLj$l5kUdW%-^FLU9dW*-^Dv(lmw+nSoJ9<4qPMev2c#qDpn z^*d9|$+AMvT^#B1C=3`k&dD zEbM8;wzsrygZEcl`pBd(M?8f`7mkMs=Q?pIMihLUA1JKv%gMf6@fN&W>l(dRaYQ?c zEq*)^pRl)q0Yk+Rtjh~R_F08WQ@gY9_nU^3u`cPkDP48UsH1i%O zqbnuD%SU)wM|l6L-r4!ehf)rH(B@)?xGr|cv-T?CVE1q#;4zBrJSr9(p+Z7k-1~D` zBf2Wszv7UM((j1XG^ru1)Bp1l&gH8(uA=krevUi7LTo)EzvoI_4t~LwSGm;2n6+u? z!eUQhWjDM#>L{$2+Of}B<0Yhi&#qSNA4$r1jd*2c30nt~F_4R;!jS>2XhA?VeZ#FB z;bsel@E}e|G%n>zf2G*&)h0SrjNN^Fny@&@aJz<$Wy6ys6bJ=|rlZm?Cbk(h@yQgT zVuj2MAuvRk87izBO02(-Kb9(HR@x7qttqRer!V$Nrgz{>HzhGRlp*YDM9~XG{L1VX zx#1y1_GbGxT zS5DM0o}6i!!u9q#gi3c;l45bsc3?rcux%nG&+GlYs1xz8k<*k-=IP4pSF!DRkzFN1 zS+EciBh2}WOAT$_q*{}kc&09Jj^=|9K| z7w*16S&*>MNjqi*R_%-s_O!#J+?`r^Ev1dJE$PR$FSyZ)pGr&okcl9L@#Fd;rQD`Oe7*#xECdC zRKm0Icsi3&9y+jI)%gub_Y@X3VY3tYA8>Y*&enj6dHq;y3(AD8*}}18;Y=TnPh`Uv z+=C z?=PJBmbv4J`G^aHSYiBBm0FP4&V8?Vb|<|Buc+j_ds8K6fkT`ZcXig90NPyQ5Z5I} za#p6ftgzdb{Y+T8aAG3G?{Ml_^55cyI^Pw{TbpBznbDs422*KOif0-JZ{@BK+a_0z zx8-i4a4T9^YT!Xu2k`nYl^i~5fWe#|jTGkBR8a5E-*qajrfSM4d_U(5oFBpJKL{@q zGF~7%M({T0!K#VR3>U6`%)a)V8flhs(O7l|2yaJJ z=I2=Ohkn_5r|sR*3xv`+#gw4j-8iI+usPaJX0qsY^(n5Y&(;BO zy76jo^J&5|golZOPq~n?c6Co?EY_>_6&(R`~&_G+*75I42w(KKOd zl(1zq9tlEPORa9}WUu#4MGpswZRIf5{9_!}Q9p692fO+b2$@4zKLO9-Z5QIX9WSPWTSy+yqL}gzV0gIE3)dEU(Wp<6?TJ;uCL(EoB()y}9uN4@Xhl z4bN{`&y`suA6X^^#BGY3Ax& zOuFl*70>k)+rc{A>P%~vjA556=L3b={kZamMqjT?rf4wdpJPTp_O&AV7j8OhN&E-h zNgm4z8&_YztG|juCwrBV|BC11tj!bh(}Z9$8d~NnC5~#|(@0%+4b|lCl zq@dMprwk#x3pa zc?f$a>kPb5v2~i3^Uqx#&Vo>3?yq?J3tq1%v0nKmv%(@CjZl!I&$G-N$b~*^?ZLT5 zT9WX_5DpLL?DK{sHRT1)ri!MiCVZsC`cXc@%$}tEMx==-TbFRp4@@m*{IcpR0gbs{ zk4O2!!A9KiGqY;NC*RH$BO*^~*tM??$9gt=OfFTWA|l$-WFB<14ndBx5*NH2bhEdo}*~GuOV>pIJqQ-`5m` z2!Zvu+(5IM4i99_4|sRP*Up(=c-Wi}b3Ij_fQ;(4T`pXDn^SL+_9cE(gaj8>1_+Tu z@cEwQkK<%_Yhb^rr!6=^6DUd?;(Xj+%yHB93WvC^Fvsovifz(KY!_ca+1<(_g!3aQ z{t54v+#XHvWL7ugrlz~Sjr(J!?%{^Vm3lF7u%fE|;{ZI>jpz>*thZva{>i!zgS>?N zI*LPy8_te?+ zGGU#&uyPTZvCHE$CuRceH==Sk_XAyu>*`pxIb&lDbg%ep6+^CHVe5$8l%WBqZ%iqF>;o9FiwPa-+o z2rjE~5K=6xY|V*RIQEPF$m*?eWD9G2gcD9&8OX-R@E%EGm@usi8F50v$INmUu7Azq z_WDz+ewq0kK3|!Xjnn1qv(|w|4bUP-B_ELV8Hwd_;mTcbs+P^CH7kpS3$GLK6j6Wj zs5>)Z+4F23Lf-F0mI`U(IPyDd@&vD+NRJh6CJNL3#`|rqcnBV!X@{&6knO~&Z#Y%{ zHEU-sw_;{L*3~5MEiw%!MitQ=YGB`1b@ECpj`ZP9mN5To)_-g;pgvD>?*&sEw73hU zVZxCnipt*gHEX(YsVh5wXZ`0)Gpdx;B25Yqw!BNYnoWPOAxOABSj`NtR_X zoQf27gbKcYu=))W-ekXru%j0jU)M2OCG+hL#I~V$2&ZF&qsc@gp~dlQ=^5mJt=5Qrnj)6HOJaAUuA7AJl#}-DgKHrJvg2$ z__QOm7HT){XvytxA<|i$P1`k4JDF?72Vw2%HXq@7gmCT)mj7$q_EBT;v#a`Ws||5) zv#flpTAj!4Uvu|UBEyAwzY*!go)3xm0Kafym7QH9h|#S)fV(YmJjK~3ndihgBdDz7 zjq?y5^<`;8oxElhC!~?sj=js>e#CZQxsR}7l;$}l8imrT9GvtQ_Ns1ZaZQTtj<1m6 zL~*onUAqq?G+9WhiTju2b|L9CVt(M@-;{a?^V5aMcykJ^?z5aOq-F^-%CUde?dhE- zT}cm=xL`6`k!YwyU)%?!)STnE#JL$y2OGu{Rq4_60nOnnHFMg9){w^UsI5kZ;kS6$k$EJzw zY0A7(;o;xR|4t{WeMN`bh|Omh?!U9UKN`SHa8oe)iki%D;lczqeNE1X%(JV06l6@& zN)VOUu06?=KgjSFbyMB=hV#!eqZcQ-l2~6|CWS*t>_vi~aOG<@{=?G7%xsSD$DDha zL*J=eFYA4__9lH8G3BoA&K2EiC$?*2Is6#M26KL@=(q2GN8sngg$f0~k`O7BMhokH z<-pUb^ldVcus14x|FYQB0hAjmxcB3dkDxUW)#q@`L&$uajPJA~X(n~Ss-&jth2-X9 zzg;G-v-d=4yr|S6&JX@FN|-iRI>dFQL!&9yK-AGx;rJ6=AI5F1A=il$&yxN)SKL^q zQO@3kbkTXYdPuXAgd1;hvKyg$hP4Trms?#z+V9QlHr5fly7QgcTx&s#@(KUtKUDA22ANoP7O{@(8;k% zp$8tqRdX_}%HsJiSs5ZIf-n3v?lfj;GZM)con zC3rr?n)cj(gZtH(Yon+Oe#$t|ky*|LhWQ`Od1@_!dg1#GG^$Fqc}4kj-)<##TG2#38z%UdV@OUOHHix4zBf6aUP#Sbg?MHjKfdJ4M-;M<5R z&gwQ=Y2#dNgZkGDfw&A|b6bKNlN%`9{e$zrlF*#s`gp&lZ?a0xLvL}}WD$N)@%p#L zcCiH~f8)$=qJN{oXzd$(Bp4IW9(WgiuYM{D7XAj|U4RXh^Z~_?`?sa?4ey2=a zS7`=Pb^EgCoWF3ZZeRYK^AB#1*;hR0yvpV*mif6;CMTY|nJ;WACtk9yt`hzxn8-(E zeD72(+lfZ(6XrUEqF+p(% ze)X6-n4FOuXw7Li7QBx4??k2vvG3sJA)NY@6F;lLFtZ-_KGv+zlWn;&0`Jc`_a>WD zgz(=9F85njxt2S!sVRwmqTD5Mzq0Ica=$fk=xr0&`KsC(@y%HK4543gIaY{%Qb83? zc8eQ-eeDIgg3p(veWR*dR+@0UD`{OR?7>c>fK`4lqq@xzBTUT~9{j7tQZ97lW;d3U z3CClEguj?kpA)WZj~9+k6J@*W!Chn7RlY=Q8H3ngmy_+;8zC$h&a{bY1YR7(O|2XH zDH}Y+n0bj~I9McPcdVdZvhJa@kBB#+FsmG$ZZZ(8Nw?eo;odXsew91!!o7Dn)Sl>f zm4o2iPt5t=Fd3cu2aPzGdO_+$$5bWbH;5=Kf2<&&>IqQg?l~ z#b^?nXA?Z%QCV2{19P4xdpLW0a=rs$X5vOw^!Y2X1?Gt+6R!A)>66&%DO_yDmTyp7 z>Z-SpJcecM%on_#VpFn^-Hu#`ko-5hLq+$-gF%Kz`Ch&dlOx>d&DkbgEf2 z8SlQ&*dHRCdyDHa!YXeugh_s}!qjI8&lPSL3GvTU;2~`PseBRc>xAW>*F~7_5a+a) z%_3-XjYC}5m7UP9Nz(29WwhR4)y20 z`m3twI7&yF^*nd~)c-yC1&c?qY>4)@a*L&nvP}&VN=9+xD`x%8=D&#jn_1rGpubx& zdF{nkm?K&n&7&=sKV;D~VN0TL?t5nafX4(=c`3FLdwwG|K`4k6HXHND&Bgve9f4Pl z>#>^Q5a*(2%(2quT8Frs>g`Ev z8b|09!LvGxGlj@n%zuqbKWpfCJ9v#ydE;UBs8ug7EEG01Vf&XnC=?DhC%zA>6NKq) zI6suc=Q-sq6!hX=CwBJWnjsUfT(NGpou()KDrTsM*j9H%Gm1{tB;sGv75A*j*~eJy zE4T}D2XHH0C{Zu^XwJE59l%phn5yp)f3m$7$p*AwRqx`p)}fzJSdY~$*k04*^{k)B z>gp^X&T^YN2KTq;N^iCdB}{9HkHn)cO9p5vxRbq})rqq(OIY2G@b5WZ&NgWc%3Xbt z^;3nwPMmoK_aU5YLHz56)W|PG2p-JYMjG(WX~#Mt*5oW%BiReuaXwU-{Tf;0^zx0! z7M6{{_fs6-6X-%gjIi=sQhITG2f8g1Y8830T7PCgNb1*Y~1Pwu~_Yg80GS@6qr5P)>X{~rLk!`VJ&`jGq z>9km#!Z8zx?#1@b%#RoLy-rdMbHS9DThy}PVoNd$Zk^J-P4USQlE-tY#5 z_7#ILQSOQVg!%7OY4qACvSd8{Z%*LfHN@ z^ScsVi>tjjC|t}F*1V0ukUZ4Gy85Ob)|n1*-rvO>R&B0xi0e9YSgp{GMeVsAFT}jZ zo_~0#JVfoeG@3+%)3(m@>VcdcOUySUc4l2;?(`;W1etBP{-zG6@?eSWyiw#kRvfIh zVhars5(jWfs{^%R=GUZuz+o4y{V;nN_p*gEV>tdUnN7L)yS}YU#c$sf+o?C$-=B;A zLTCdbpU{a;5H&7+vxS@vEOsI4ch<%Vj%Z^+^9$B=LC!< zEYs{JD^^N_XE%p)I6;^hFWmY<$7!A4L#2Y(XwFO%&S?VnNKz(n{a4QGjJVacKPnT~ z1BE#@H|&o&w|16#wf;9r`WL&s%8++|&cRk1pWj`Z#7rS0U6j78s41uFkRK+je_WZ` z=B5irL%sX4%6V1$1+T7p}*A4nq6&-SJs<0_Ra39XqI(iv|II*ra2g-y!&XkVe zXm6riI4V5&(Xfmu>Sfz&oSVpuA8?;8Y>yK>rVIN=apxEAMGA}G!oLGf_If@4HzPH> zip^snT~T#gnrRCwBa?Tw1By)3qXu7r-Dc%*tZ=6%DdK4{Ug$hWx_Axx{wn(;)J ztKQZ~k@p8={mQu%;b?bOf5#ft@Vo_w6OqP%w5nw8NkT~-Zhfb2*M;ws(n;Zv;iI_K zm+Uw3(rCw5WRK%=Pj(GtULDT;Ot4~_-CXRRx=eGz)QdF7Ayr%l4FJI?Kx#qJgiRTydOA_C(QXwk67hZGT!kiJy7EOti}ZNV`Cfr zyH#*qan^rnR51^A#g_LOJ6fYW>QOEAZ`Kp7T>I-og{>aK!Vk1ctCPLTzA17Dv6DF6 zhlh0uNE8B1^w#?R)PC$7&YDcojMV=mr1@qDVFsvd?PI|Y`rMd`J`NMx&Q7S=xNVwn z|7#8<3TI#EUN1Zvv1bscI+0Z@N(Q$rUet>j=MYZUBDoq@TQaXRo3e$t&XhD{ixY9* zv3m%68*n{N*!w(A_A0RZf@q;&5UJxR`-Jr_6xJfG8KKV-_8BwdgchuLpS`UOmG>5- z5L*w)ls}305l$5e*BfwoIG0@s7{;M&;pj({^kvpi9=y$eXpPQ~WL2IpZy33n@Y;x= zdhAHj?c?TR_tJfR>X6=cbG1%MJ+rU1xyd1}o6Nqp<_#o1!OTIF4IsD%Uekqz4e=Yv z;ivt?0$gQS?wr7g6QA}pzpZE-6<}>(oMeWMSB;kIl zaIHDv=ALw`Z}*-qt_xS))!2B!H_m%{IE%$x^qwv_x^S_$JlojuIoW^ms2pQ!%>td) zg-gu|{)uoeQAkYDCwRGWW~#7U1;KB4Hdg(3y%~U2_gB5reX7Y(EE~eoFFEtNp@UBi z6aqqonQwFHYx4j8@1FOM687~cy*lBIc=Q#enZo9tY0lgtkHJVqEbNcBczR+Y#+2 zocfV{kF)v+N^R znJ{nR%m7n8^8V|@{Xg~ROm|X?gw2E1sp!|4sfD_E-CXQGszWR?ndtKz;=J}Fb3C=V z*&(i*&GEFthwdf{>yw0pe~8T&j{Lx}o_gbXe#HD2@R=@nf57gJX0 zT0>f~y(vi*16`d~7q3PfF^ThCEB4J>V%t@huwU`b64w39foa12F5F8IHmVQpFXJR! z(Ss?^l0H^TFrO}u9$O)PHzEaxpJ?XdbuInzI7?cwbBdTk;;#^#CG7nk|0l>A#G=2s zH=e?GN$x^ovhe5`E_EjBTOE)!fU@sjQhSpgDx4Wgs-LM7?^`59K91KfoD3GN_V*uW z*4{om=t+K_Q1TKp>gk^=;YVV-ZP%!HRFbKrwnxcxh7p}D>}<$|?rQwzwzTD;yD%$32x>`Tf^cSn!QW1MoG_D6YrVHJ9YRKL zZ z9HJ0|WlvJ{j~d|~ranfiir+RDTdo^7N`xyf?Btjib3AD@<#^(${dZS5c0( z{l7zXwl`bBT6W4#>MyXN;E>kDl@m&;9y_Yk7c3q%BKql4BW3l#mJrz+o51# zsYy?8Yhd@&ZRwR<&CPCK;1K7nA!7EWX*mf8I=qvoD z3vol){T$wPnAMrX&6)op2kJ2YQ?|cE#K&AK750P*@r_t%vbw*n=+6MLWfchfo3e5s zb2{UdAT0Tb{b@pSeU9pM`wOQdg`~;sZOVfVnzK?;AZ*VT=B9}{1rq+o^D~qlJ+>32 zV|7DX@6ppg5!i|YZ?Sa(r45Pf!}$+2_ul_ivNxE`K!UKO~g@0}OE>?{_gJ7BtSrc~G-F6zxJhIIvt;u;CQJ>S&EoP?(;cAm4?4%KFHPaZbn1(f62DviX2Eq2w#a~N?onAMey%~@iQj4xMw%1vzdvxOBuu<;cx{z>UiTuc*^ znrKkc!vGxJTNnlP-IdCDmyK$yG>BV@KDqcH_PuxKDNrikJy*M$o= z#uHwh>AeW(%ARy#Rk9FiQrN6Q{7#Y(6K+nA^}vR{M}R|EohuwH6;pHRb`S2TLG0#Y z4^m+te_d_XMGkRx?_^}XHn%&(b-NK?)&mwaT{HoG%loYVkdkri9mazYVY8hxT`B%g zY%K{b&b{?RJR7j$T^7BkW3B{i&2MQ_O5wGd_cj#&0bKux6-7d(a)^xMSbu^#k>SFL z&aCW3kP}*^W6H-5cj*1W3tSu=<@fgQ&@+*Co~$h|7}Y1g{T^2 z{K#Avj{MA;CPenar!i+=4n7oM7SVw>&HqGJioME@!fYOQFKFbm4jjJX~4U6Yrln`6_|GP}Y@=@3KEwxbDoA zPR##|^#eKfI>$nUDPh9WbRpE4!19nl&x#Lr6?)UX*1O%WHy8SI={q9Ya`8Db(uBjE**=a#Pce5CXFt)dHLv*U(_&ly1x4P1_Yh`R zV`aLiF1N>cRjtB2Xc$RB!okl;4Hc6AQHaoX4bA?=`ro-aRx3LlY{7xaB;*PyUvYl` zUdFL*RlyTp<$9u!K8l6PX3$^zQb}(yzoqTMn=B0%wp3?FQ_?4}pfS@!M6*aef`r@u z@Sxlbv<6e-p5^QtoP3P=uXE}Xj&>rTC5bF7#(gz&IhC>2wOkXP-5m=-29U(pE5O6INpi4 z0>Q7ZzQY<&SUF8t&_(m`HjiNDNJ1Numn#G$8F^*Zv>vv=vp!e9W6cw!IfNt=c(1(K zPSvt){a0Ua4TP*}%Po`0XuYswU*t}ta7z!MLztN;oCp#Q+d0((pEsCc(&4N!czSmh zd5ES7ZTN(c$2rzc^DCzm3(-!T>BGW8VcmzE&lk?S3v(aSeprR=fdJu1j&OP+XB7GS zmnp`#sJ%XCb+w-QgJmyLFp~A?@ z^*Qh-v)N*(e-O6&!sy`6s)cVpj)FzRtSOSvFoXu~(T* zU==`9>f%=&uWlT8nUjsV5hVCMk8f-0k~vjyH@m@lnV5Q$P%Q>F_AUog8dOGAVy16Z3VobwPKC@JkroT^Li&$`d7Zk+jjSk_R%-3z*L z2!aN)Ez!7FHvhoh!R-2h1!=;i56D#I;RQUK=o_qB#qLxgpggC^8rHbmf+clL<#{K2 z6^G-BdP-Na`6XsQL4?tStmkw?3#OV=S9y`Gu-mS5;JB8v2lt6w8KcTk)HB@d!^$^N zQz*BZR_(r-B&=)Cel0-~A;ff2Mn@-m6->_F4$SLGMhmWVrQi=dYBJ9dcv$1$>%KxS z*XcvZd5HtrhK*rXfH?$KSkSg9!v2Yh>Wb=*{~!7#t0lg&zw%+->27>RYX@>ZM^tOe z{Fg&9LiA`t%U}6Y#lC({Y%`xGtS0M{4MkIehmij|Ij?b|9cO>k_gg3U;4g#)2oDUz z!0M%*+nu~x>!4*9(}*q>9ck(4DI_?YMpcuf&5KZDj;Tka6j zpCq?G?#~gEEzE9DZk+I7gyyrXf0@HwC~+5*cq(-mr;Q({iqCREmT12H!E(*Pt)dT4 ziEVcm4YBVE6PD)+=UziSLH}`}`nwVvEUbKy%qK}Pkw@#1zE=YuBU!DAT=GBc8B9)! zkopJL{DiVHA)-jw(TdC$IqHn#Jr>3a4}MX&Qt)u*m|O=p7kh|aB++-&B3a@P=bP^v zi$t3{9pbvvTqKo&yl7{y>L@ZQWV*1zQ}B41=}sI95YE}SFo^w$!jWFRCMIo9sk@Y62ZP`*w?J)0P;exMl`$dXBqWBX+rwi_r zxM8&4O6e;$t$=f&B?Zm!`HOosIbSRkPGVydL#MyMPgwFgM}FsaGm6}W)t~cdFt>#@ z;btPNdg!JuOzBTS6J~rvK|?l233ob@^9GAlC+tCHD@}#lIF!57gtQ(kC@FQ> zzd1F69o4zx#GXHyJGk7VAEw^G(|dLGmN~>Z!ERPho4Xz2y4$RtRkO}<*4m5H>u9=2 z*mPm$M0{Vz0W;pxESyAVmfCekE7~q#oFWcF46D3V+sJ99rChU~Hkt8q9_SgU2T zzd|c*T{g~DtB8s*t_SOBJ@PiI>yua_tSuAn*JAnS>{JkSJKSHwGgMgGN^Lg(2qCi$ zTL*F?P#53L#U8HvHU6rOc)9uy-ZCTB<{pQ*?lB{_o}%L6L}&$*aukNOTlbADwfY*e z$MC4DQOI|WXa19HZpQVAJPH=3e!>;wkFmaBmk9-0{Vwx5k^c{x+f+DGgQoFKcrZ$r z)fxlcP>-k96*t&h+@?& zwa}g4ha~*VtiFUQK1AaVZz}ZGeG(Tvg*k(i8*=0G8hO}}ChU5OCH^Ki?@}xE`)nD* zT;rszyr(m&+u|m(pc{%kxHOp54_VZSX@j|!EX?etH`srYaLP)B(}BXaa__+_72>R! z*cP|ajDo|Fg4dg@`kt(JDdWZ&$i1WsB zMPHkH9pbvzthiOaT+SA<3xt?q93H{a@3=9B8@WQnbYWwzFl7j{ON7fc$^3)O1Grq9 z%l~kw2ZbH97giN!)?jvhK~Oc*?flweN2VTB&AsrxmNTyqUX@^%1*Y*4J34>tnMJB}ZY*rE@f8*q2p;3uGn&m^D0z>SZMa=eIa`;%r})n`g+fq)FmDtGTd=b~ zk>&`yx!9vr=;iFz4Y5jvUNs{Ew7K6QuKUfmtgARpI8~jT2}GGUR1yE1`cOEUGG`7B z)$x5&F)bg8ZFv*+I}?;GoO^<@{_KhtPHQwPRXFS;?CFcDT5DZ7rC8ZPY=4PE9hmJQ z-1wd7Upd|pCwsl;oWoBd#=Z#BOuW?8+B1^$d#=RTA?4jwM~nlX~I0BD|AzMXWCphofPo zD?+c26p7;zGfQ8V{bWC}Eqs9|qj)fbaCNL&v&fM<6$p8cWiyQsWZpL z|4HnN9I3!DJH3n5O<3K8z29@C32r8bQK#&|tBFm~`>0%@xFu^F==WYN`_C$3^RLH3 z<-RG6^|?jqT%EgK!oju#8Qz^WfqJ47x8KpWGCMqk0~JUu#T=c=?ps@Iu7Bb@f-_x6 z%o6Un3eQSQ9?C)L)QYy*@3Kt`??Oeh-vR0gI@Pp~(3uIy)0x>&Bo62EN@qr|j~0pJ zQ8P2v1s72wTp!4$znSGPtZTwf2NtIb$Lp{>Rd`}!Q)y+Tb<^Fi%<<_I1qv=xbWp5S zmwO!WixLjjV2PKI){wY`&po<32!aOWUzDOW5CqtTwt*PSj#o6OO&56hj|>A@NgI z|3ShS?)PKs0J7{kG?n|KSl)-F8Nw6c{zT?|OR^SiSuCR19)3^Z-^{DU?pPsFi#uC! z>vh)GqPRdfF`1j~NXrq94Cc)>RTkD;lLoxgWkKei5m0P`t z_=4>@!ghbNpR7(%q;aFI3<%eX>``2>DQUV+{e<~-xKN3t3WQHJS*JC@!s@y_P5Xa$ zo83nr!|FyT3pu_$g?>Vsn{eMth^fng>CB$06f8UY=eo%Hga{$gg8r*^dqt=)Yc$&W zy{HFElZ2(MC~0Z*7S|OBnbE@e7dY2}h2chFbW6UlrxW)h1)teMdP9^dzq=KM{q(o2 z!N@{4;b5$=Z>lB@65@sHJS#6tF&_3sfK-|o_v=~Ez-s!aY!z$MbgV-MdEnO>|85UQ8JB~Nz5H;AcTkY zi6740D&+mjqfbn%99bg9$6j2zf6EUHv3aJ5_5n#7&RkDni??t-UpV~+d-H`zqX1nF z(1`8YOJwH?b0UPZlgRxW@989&NT5d9?s-XUyAp*U6Ht`H>tZ`uTE}ZW4A#HF!hYO; zf$KkN0GQmK_033shtO~#BUlLh1<#jF;oX8OKe66N6v>~NAk1k+&SbVjO6f7tt?bF$i|tWWw!{c)zUNA^ zaK9PRZSi=OyD>soCFYJJq9r~_!lIW6YE8m;{bB3)ENjj+XF)5`=hP)|GApZc!L&{u zQT8jJi!JMCRyHB_H}3ljzQ1v@1_2Yu&Jy;GP>?2O0vnqXT94uwA-g8&-C5~K_?r|= zC3_0TzF_@KVa=O_yogt-=tGnrg!raoAhg_+WZ@yht36o0VvFrlK@Y z?;$J!7dwI*;rR>m+=M;vb2mje`W~}01eXNiRD=-RfNN>OiVj?x&dx^MZqHrgQd>RT z^DnS}FljBB{VB(L7%`wt^|;rO%_i+@C8geah1;LA>r=HH*`|iudPaM>2$=(zX}DX@ zol_pd`L_vb$T@f6^sfZlb0l0;1}b;}SF7Vbnv%CD67rIb>9U^CyV?^HD;%g#?gXyI z31>|}=TyT!TE{NkTNw?Ti^L(~2Qzkhd7?-hPnfZLzid^!E4C*e;+HF=3?}gf^4x`W zp2ATl)=t4KN4SzM+~|#J`9+rq+7!a>dE$Ud#wyg>PCX$_5zp}vqF~X-`pN!fKh;xg zOEQJv8Qjkh&J5@Bi^Rr?)@jC%=Rkpw`~{1ng;`yh^)jo{gv)JMpC>Hr&&*=snPKN! zy?}i#!qIP;GZZ&t?5ttSR(n<&J7S%wgMX6oEtfuHdtFUR+u1*NxFo3yV@XknE!ak3 zV}nE}fL1MczfDKN>{lircp|B&)f00%!g8#q)aJIkP&kq!(})TX4$dIAE$jZ~$w&Ht<+1(Z*KM(Xu{cOn zZm6US2dWVLDYrcYe^232s<5X9TM~qjQlg#p#REPf-&t_=66R-^XSM=K&Y7ZN=*D0n zxhkGhcvzXJ-Xy(<|6rbciTg~!zdxR#LTKqyv})aWwqb z?s7KMX9e>UqeYuqtnQ%Fk!hdc-wB^O>^1x?s|ykIGG8escl1ZDt8+7yb00FZP;ed0 z2?a(+5K@~(8hF2te-~54VP{{>%47`viaZy=Gg`P=nXQ#^`;90cVFvU6#U)Yj{e`>2 zd>>)UzohlyStV}z3g;autj2X4*}=lXD(wB3wXaebX5Qt)vhCAJY%XuJ?`yXC3Hb%W zbtl|=o8#!bBdddiwH-(wN?aFBQ%1Q9vl|d$xY|xN>|@mMZ8d!^wiJoO`M-_f)60`Z z;&{>+zOH3I^^Vv)eT0l@8hFg~HmNxMC$b}vU$eTBsarffinaBLDG`E7T^Q@83GxW~pIe}AH_@>T+)z8@KEv)RL9M9A3(0cmiPF% zIMK%Sjk`6u7%!w$Vt-Yl8?)m(od4zgXtD>XKE|F5VbvcTd!M^QDNuRCam@aL%yi*e zl8`ckQv-16%IQfg3l#he;%LoBrZgmV2Ej@d>B-iQdE`jWAI$xTheIi}kvo<7YTcb` z*vBeIGdEh#yWKxJq`51DuRMT`EfE&|%fS&Ge~TxkhTKX(xZaFC(ZY^SI%$tK7h0wz#0os2rn{RY=+oT<)Q)jDgzp{YDBEjp@SHYPQD*!<&#LwQ2P4_yA1eTH>n zJ?-~TWNVzTyCv6u=5Zw=r*OVL7k=Z;6i)YNe>1kVA>~_6{X@}6oi}UPlWCwjD?Xg62k@vA1yli7~h*}{b!(evj?V~V|n*isEZ zs|$U#2D6MKQEgb+yA2eZdrcnpU~2`_7p6pO+J+D`jQhPzg?ZvvJnPJZ4qR%9=M1*L zgWDvoyhTzg4u8a~f!bOyV2Wz9oh#Mevl^7-aV#7}Sdi$KE>&c1fv_ZAxbn5O)mZl; zeqp9`*LfT{`NI6~iLb{iEN_U{JM3wM=OUS(?%$o5$8H%0#a}8R9ULm0qv))mIyk|7` zT63npGAZ3AbG53n4FX!QWI7iIkp2oWRf!K0GDj1wUd4;*AkJyV+|Lx^E2+)JMl7C$ zt6^f4R%C06u<<=M{lb0N@(n@hLe5}Z6NQ6GLSBM!JK5M| zD`1pR7nk;2j5P=FgQ0kqmj7F;V|@Cux&^5tx$&wt4!Yg~jf-=CX73oTRAl|Htk=#g zpOXI?t}hv$Y-%^WrgF6l$A97a1P+-UQw|(QRkUeHy>u{Xg8L5y|Dj>Rf%dvRb)O}> z3!eXQ+yDaBy^{T-PFeX95Zj>|+;7FAAIa#d#m_4J98pcXoa|}E$@keijjIDG$`|G1 z+C8s#=-q>pF+zR^PPhy69Z0Wjymgm4Jo=sczY|eI)x+ba;XjF|HqGAI**|wUhgD-q zBQA{O;D=mrBq&+%8O18?c>3I9$D8-J)(K~SOI8!btB!^Vdz+IQBlwJ9)+elQW#m{7 zxe3|rDSC_9KeOpq5=N@H#SuG}76>zggo1at@)z6t;5wZ-!}ZC^hsCRccY?637t2zG zRO&_XGklpi5{#@G<*^c1vIqN2zauzm@BDMnu!-b`v zuyG>yGD@o-sgO>XvOf;Z}HC(uDA%NhY>Qt zgm8BDmWLMG;U92rLBS9%jpA|zVsnJ>pNJaF*#IGb1Y7>at0EzP^Y~T$s?`U+Sf7oZ z$$worh}+H6SU3BbAIUR+v<58BQNrU+tRKV9N<5m(wKvJ0sDz-xj+_Y;GJ}K|H(^^( zZggbvzo@LL@3$m0W&h8l8n@DV2rL-G-B<7)#j_0I_Ao7aIzE)Ag~F^nTznU=96@^zyLt;7`>=c@=ex0DD04Ie{~Qpa zq)9vbYULrj*wV*v(p}ilMfJI!8hVp8zH$!{eTm|?Ni^Hc`qh*-$o>p()sJe)T|=p{ z+Kg2{X~KGLC0rn+P}or#b#yPA{|;iCogk=~L%6T7*i*RN*2uf9sE(f#`E^(~h}AK| z=`T56pVPzH@s&Ql^|V^>Bc7&IJb?z#C^h*7V4L3L(?K3;b4Lg z7%LREW6v~w=<*;=Y+KrKrZM}|M17`3)41IZ&sf2$4#!l(t*iE}efSZxja&Pi|Gs1l zTN-NMbI``z=>+~xXd7+ekPs|f?8n+SINAZBoFH0R)y6+ zk=BDdl?iV~m5s+lICY(BhFLW|LW`TC2yL(}aRbc)rhigVI@D z%ZK0K_bVw~SP?87bRc9HX#)st!o647Ka!xz?C!>YFpj6ckoGm3-qqy5*)E)F&b-m& z4YKh^Ha_*mrlge6LBwPVIWKei59Zl3=M8Qe z$j*A0d7HeUm2_89jnlqDW_|Kvg~v_sLucdaR@8&0eqz_F1WFk9ccx96mYdi}|P!r5QA|1pOQTK#R=3l0(6 z#b8l)Y+FZm4>i#3<96(BLr@@E-dFT-ZB=qYgsdL8cQ>18 z_8T0krHTr33|L?_&G(XoNJqjZvi>EKd*EK1tF1YaAVhpgaercjm@q*_GPbv55;!s>Y8>Wi$b&Z$)4TsIbc&(@}#`-0;d zmDXa1QSL3@=gAW@h7uep?EX!`<#>PL$=@vLN`3|Qj%UrMY;J*b5khbuJ@&VM#QxfN zMG7Ua5?`9%wyuOEjc5{u^pV>2BJg|Co9N3}Z}@OD8|~OOh?qPfr5mT}aB&Q-BglN4 zTVLp>t-B{<63KPh{Wkueva134vxVJe{aKIdBd;*qICYXRemAtX-b z+^a-3P==J9{d3Unp8h-?g!ZWT50V)6qW;B-0vBr&p3W>&F>a@t_6a(BA*TPscI~#} zRXQ(veWpkp&zO0!em|ka$R<7hMsIAbFW5DPq*0t6!P>vI?|*!-u8(Rx%BJ)^vAK=q z&=hWtC+r=LcO^g%sG+!3z{5+pR}BSWH-4#j=*pjPPZideCVR_anWa^1{vW77?%XD@X?TdN0B%j8Ee+IUY;!y$FpW|tU=^%Sk#-4 zmy}|Azfib8oWv3#bQD@2p52(sjy!FL&r9SqQ;AE}L|Zh7MIAWbk~l{~x-+vP``Z&T zo~O0AWk|2q%-I9&8j>XJh!qY*2p7Xk>moeOC#`PLiXXXK9iN{}ZhD@vw$}B%ZwgOd zA~{EtM{(h6G8=2vww--7E3$MbTv(qb1UmBcU9>9RB}+KsA{>emt@U2(BjkO^?tJ08 zroWwP*eB_bo$}Wq+gT(I!IR98>E*d1aXe>+%=#OLKj7qGW;Y~cC=ppgQi*V6EbhOs zG)9=yo#MW%{2DF4+FwdHwZ6vs$~$lAUtv1Vsq&B}mZrx5a+1iyuMzVP@55ex-#PLkF)vaui1Xj^U@)G)vTFDqI6mrKBogsHn%2vmf+Ew z9fs`fRNX$gL>yP_iLyCWvY*+@p#TT51SZKPQqpTquerVE^_t&nL9d0qs#%k}^S&c; zG{?e)n>|SL7g9duLRVJJ5)!7deH!;W6Iq2vUAXKfN&qh?6q0`;=~qI1gjI>cjkobK zYshMWH%-RdP1tNm8`kpN;@5d-Pw_ZqKiwh?z=!u}K8Y9ffl}3JojJO5$*@!pA*%#`G?Oq$Q$8)qcx7(`J z>zX?3?9Mqi^Es<8yYLr$`f=SnS9#=YLayyoDe@M!L9nIp2Y&F1-)pp(blW2cIHIK6XP>cMZ(_nYFu>1vr5`~Qo zSlNa2L?Nd!VU1a(wrmXBsuCI`Z2yxT2H<{fO8T&F6!ER`=uTc`Qo57+870Pxu*Ml@ z>gdl}UAvrU(F~(+oRB(vinOO*HWFX#WRTT5wt#W-&DbuQ~z*#FthubBtq(E6ijEIhw!YE{ziEiGU;49 z;`~LE=Lg==|FUk#$bKx05@ycO|0qAL_xMO+eP#}0$vCo-g{Q5#9Vj{*{^kI(o@3b~ z+4?rl15q6Zzh8LRT~!S2?4QdM{XZhc zQCGvm5A^HSsPHHXhVU>_*sryI{g^p~yuaC*EI79!>K*Mim-`OKLWJlcr1a;i z*@vH&4R#N)JsPXVetwLw;8z}v&{p#|Mr!+i=Z^R!3b#^(>%H*x6B3$nVH^hsGJ7nM zjYxGj8^t=gr+;N>p|Ghw^BPeyoo%H_MeB<2{#sw8Z`l)kD7LjKLsg%mfvoDt#tuY9 zhyt^hY7i4AxHuWk*Y>|D`i5)&uy{0wqlHBp=l#Ia|5rIYH$u2PSb@;vY9Y-dTJ7DV zw>i<8oy}P}kUchTjMB%cQT8}5iOnxq2dAfR_XX14>22XJyA8zY3UzX&kdy>g#gY`dKlB3RI$;(|Z=^Tg zEPJ!2V$-r`)!z4P&AjFu{8N#e-HmbmokjHwBx(0Nk`^^U8RvHP&%r0&6IlN?b1Jf{ zlS=a?R3qwDEt&T0#nlAS1~;jup1J&N5!=pKA>HK6oNCyos;inApswn!B5{bGY+O~n zJYOV^=Z&js%|6ZklT6ir$`KM4rzcVG zl4JO4R*M}LEu6>@a_ivp77Kh$0Iil7J~u8+2(*;)m! z9;7?5?{_l$v+Qf0e9fcwY;QuaBl$5xv8%A=GoJjYZ)ja>Av%8ULi)el`INwZ9ImGk z*4b{{YQ(D2v)dXRuK(S*Xn|eWQI(xJV%p!#`AM7DE*r{O;Y?fo3F|DK_!%W17p96% z^hK?Cdx58uiT{{mQ(4@QrN6TGCr;Mnu$wTiHO`(w@lULo%iO?5@un zc(%aq`Rq=Hae}P;vbkU4?kpUQ6OQ)9|3~tZg+p(WS!$51hIipVc-77SK0R1iGvP2O&8{=7Or;j zs==~MA+0-$g3a%hr}I-Q+SWJV@>ouK2s5keyOkq#8GUT4e&^}{=C&Z}N8(ztq8SJN zAt6zW1qu9=*iSjHyWOd#eVRfr+f50-9)0 z5tMbYuOne?2#XMHupRn0PNX^uo;gD1SKNM0AI_R1E$Cn(j`_iYUn4!FgHw!=zBYm7 zJ;clx;E}6b7>9n+&i%24UTE0%r9JSqQPm@FDk|nRhP8U zBvc{KO*q?$dB2!=eB-D14JH097UT%dAF=6cTxM>^b(=iAc|H1{NPw_R3*PR zXU9-n&4`5Vm`dJwHWvxe4lJHT+yov?Wqz`-I6?4D67pO{dqDoiS;Ka)23a?zbEh-A z`VpjL<)1nEE%85byN3=^=dumoR&3rsP@8Mhc{HA^HzCgimMvTO<{m-CeKj<~78Yn=f1{5`uMmyPN;E`Zg=~)6TQ4tB#xKNJX=HK46Q+S3EwXaC%@oYv|M7s1C_SezlsGs|y9g0>y~i}|nf-~*0^3PE1xoy%WLY^zG0K5Jg~ z$wQ2&=lW(Bz}wA z-z@5-FV?DT{u_(!DBPaR!nz#zomrJAvBP^hY2R^WtRZathm3x!5!$#p{2n;Z8N}v-EYn3N(kZzeuzS(5wr+zEUKPSIp~L(Z&GK1w|ER7(}@$`lj|m2$}u;1wQP2^sc#R$1`--z z{-fNWh%KO@y1!nY#*FF?G6{rPI%V^p=uSRRBo2%FnHkf|t3~2?)y$ZcO}F${Vj7_( zHmANKtQm)25|nC4#Slh3}BqoK=7GOk1lN{zQ3M z#^x$J-(yjr5H^yCTI5ydaglJ;1V?X{y<1bUU24Pqt|WiMvR-VOY>FOt4P|}2kp3;3 z3?lm6VCHbUv-MS-qjhy2EE0#!GfP*eUSBH`$7|+Yt>ozJ5+S((OS`Ew z)|T$v=*OH4!97j5V@_JD&$FX1Q5^{I7uHW_`5z>G#R6YpnU4`Xi1!oXej)iEmbTz@ z1(sLR32t5XZcW6d+@Q_P@u?@uHiKWOO6sAL2`$$*;>k{+ZbPyQtz!#4zp! z3ffpdH%!=2k;KnUfk4XNtQ(DQn&9^eejl>(2iC=kh9X(hG*UY6D&+YHH=TvRQeuep z^q4h(0=~nyx|!muE;)pMuy!XRODZPk03XHUW#+CyjmC>5BpvwzMOU2tTkvnb)? z>~yYvg7bI8`v`X%b9J<;e|xwIPd?#(2d@2MdgL#t$)>ltF%=I7y_c0g9y^kw&4`@F zp$R+;6mo}g;Vs;!XbJp+dfaQsMmy4`@Ze*zzb3Q+x6E3vUN*rmiY>1WTMdoI>ck$d zOzdlv4AS+NQb{|f&+Ne76d}B-!sWB7bD}w`iv?G2A$Pn!mNj6$+ML)~q6~v2dBR#J zA}bnK+RpyDC@TM7jR@Rdr!YX+ZAWINaJ42Uzalw8$oL6W3-#5OCttA6TbTC)M+C1g z$nT}Xr2o0w!S~1?Lc&lUJMp-`GS8yB@X$|4wb%Rr3PJV0ez+Flcfq*=7pGJ3jh3PB z`HQ>b^zk2?LPVz;_BpzBb55z1I#eVMDYcE2(#z{b;&|QcTx%ltaGoV}#GH=CJmr*#L1X{39(Mf0{O)Y8j$3zfzU2I1&Q|A27q)u~ z&)#QFps?79{15Sp6n*!*&erP%uf`Sd`&?Om2tS*g!Dhj z`U> zW?5}=GlbQV!ixUn8i3U5yvM}}TY56H8y#5wK0A$v*t~4*H56O+$6WRnuG*8@lZ79! zr!fiR$o-8)$|SE=x9p?U#kQvU!`wMM=BtFpfi7F*yz zE_cA)Lpa_X?*Yu|riB6Pdvoo5~Uu(%cjiH`9^8>%cJyfyF#yT6p7;vvn#Cm*xO!$=bs!M&Z6oJ;Xn^g z4J5Zj*f5#khGh#V`qn!jrjnv-OUl!S7&YouGC{~eX@S!O19wq771BG;p^P}hV+pf{eUPR zVcCn^ZO+w30MLSk;?VrjFd|5NPk=IpeuhllX=l?8UJjEc%)2{=%Hvoa)PwZlo3pk>3y* zB0M#_v^;4owi9n~>Q_!qV%sp%r?ILE&gsJD=D2p{*;n{v3To9NzR)u6>obL8ucAB^ zjU=6F*yrgi72i;kd9+9z3fr4m(#u;#;&{ux(?U>J+zN!*r8tX~ zB3RIm_|Y8wo^=DbI*zOv?CPv5!#ZaXRao7XrMW`khg|xB+et#|0M=F_qAszYvu+ZZ zznNZo^9ORX3+vjmwkelOoffMFzCMhYwyJ@@BuqH_A%1N+V6Ua3Gn?ygS~1UE8N#9( z>ZjbD!urnKZO*em;c|?y+D$ZleQ%<9)jQrov?JNyaqE4&zhz5TLX8_*yKF}}i0yiP zRhzS-}mJ*(El$xK3_cuAJcNNw~NH_w%HC=cRcGu@=JsT z?{gm(P2uME-2Q_#|KOP~B$>p(sIp-jCbpCHc{p2G>?W%1e)3(Cx|0xI8v3ls7w!yU zV~%juk;79s`VzOsXqt0z6@1_2k%#f$JTrwYpHuifXO!e$x-H5B&3Gc-g6?r5Lg-@EUu|o-M(KH zx%Rh_`#WU*e`C0qJKYW#p!Ac*V z=PPXag!Fc7F%Dt5)jL<&c2IfuPBrWcbX}Hs>0x@jNE}MOH|tU_?-YsS9kVX2?oGxt z?r6Q?r<%Cf_74Rm!s4c^ZAao~ED9GgjfL%5wl=$n?dg}C%oXl93!y(#JO=MkC}Zj2 z&)Uf0@NY)2`0OY6)g;lLOHOS2lXa!|fz_AW86(WCp)Np8`$B!{gbZ~(P85lQS7NE_ zq1Shd#PP0q?D8pITE(_7UdXOZVTmX={An9*&lC=RuNr~>(F-s9fY=W?@HK}gqNx6Z zraUmUWv`XJ(<@?oJdM`oO8>Xplhug>O^%J%y zi{jJ?9XR0?oimZKTM)e#)E=@XVOV6nNDBGOi(W|d0FIG1#$Y@ZUEE0!Hqs{);%X>xQc+YGk>oEDeL~)6* z{9hhT&_waYmsPy~`sW5q@y``zR?uIw;w@{Fgl*rE*3+=BcDGU9V{%2}yRf>zOoKI2 zeOgIve)211e?(eM=Cr~6CoMXh`2qK9n#;*HJQQn^INFKh5yH98Sl^YS5yBPC*5wMN0;}0+rPPO6KeOm}miu9x?V#PPlv_j0C`*pmKc*8nzkWVwq_QX)M3jL={qsVo0c3ypmZ z?K@g*<4JQK3431R%w%GGg}BlxVry))(4Lup68$;ev0}s;=M)OFO%tLY%FNx@Vmthj zDlcsOiao(XSY3`(RX@}H3%1P?=8fc7iV&MBBu>||^c{|9qw6QLgjEB1_AyJQu{&Nk zIEbU2$Q#GXq3j$)mQhqL_Z6Zl+C0+Dg0Nb#BaONACu?3|*DD+x%w12R#7nqs$KgO> z|1=_+^CV9=Q_3~AW|fjtMREG@IN^Fr=Cm+G+k zeVv2y+~}m)1B~j;lD@b_3hu4A-iNqm%3}*JwayL7-no|8PSxSSOG*(u*@gR#3US)m zKNmDTo+-F~WMEB?UKISziCE#pi(C<|x58&4Nv{(5Be7qqaQiLcM4FK1BSdBh#qaYZ zSV$a9qEfn@YTD1$DcPQ{Zr&LseiW9vd3yb@NE{!UIkBosxeaA=gs|irg5Kv!gs5J_ zjW5|AEK1j1Ufm2rbLN%^EB?f*G8gJ|VF)FO!m^&+d`-84-ScJ42a8O+mHY{}JK;Wq zJV%y?3o)>8`%_KA|8`xLHcCeZ@vwk>< zdtY?+nT_!Mn0Y0_tgkumF1WVD+oTA~$7YSaZGV8^ zS{lq+IV892@c53cBRP>LWL9BaBWIXguNeduPf2@**TIMHWs|bwn>C#2@k#1?p6DyY!1H^+r@k#FizBA)@*-> zO%;tEMhFqFvfGi319W6xVu{Vv<86M6jo!iq522u^p$RQ=WPWp0V)0a_kY5U6SMDHJG=IKNcqcYhCxr}HF4aH*+KZfsX}59g%6@U#zkT}clS_J;^X z@xrkVM3=Ueus-}12d;j=>PD=M5oR_)rF=r$n}#AjQ`j^C*J`McrIzb@1PHkeSos?Z z`f({+Sd%3jZB5Bf+^@^(Od;MRL9F(q#3Vkfe_1eHU(ouONDZAWsZFu1n#RgMbb~DH z%7YZ)^85JC6z)z_C4iVuv?StCBclG$E;tLPGONfe7;EjY^AsfzKB}YoU4FyxnnIC2 zeS2=TV0RZzXx+#d*0$hoZL%8@tgQh)(RMlO{y|&2+!9+mkip1e)sS2N7J}wf+$HvB3U%DVgNKFxvr{dL@6Cbe9MR=;oZ4C-)qg?us ziad=JR(_>I?kLSbeN zR;36rT7}n`1*PS}-Go|{v&0`6KjZhg=JgEY1^hI zXSu@TUUl>4^P{F5GVWCUvgfQRw#~Jf=g8vE3C$2RxU+j+2KQl0_Pn8TB}K1s zwLi%(bG;D@70{i^f$1D>qlC~|$`9#C&=0JdS^AQPLWNx;C}_#j7dcUZL{r3NIS#~@ z{|Ej}nN>@F(Yj(wY|JVp=~%<&Z)8O{ z67tLtSdZZ&J+$g+pKu~dD0m5P#etn_*e}#2eAHc!$qNdHjWjDlFP|2P<5ROD+Lw)5 zE3w`Cie>MyqY}$Agvj67(U-$s!gA%f^~c+Rg(ZTUDKsj7q8_$uKIVz64*cEOLP?}> ztv46K#V~9=U%;(1C*p-WJynxq<*zI<9&NcJd8)B3>m6dVgt!J2IkB?zsIUU9VK4IF zJLZhy?!R1bLQxIo_9fzHGCL96n1ru&w5$*E;6qjw2@Ad>vl}O-nmXLn0UYUMbb2?0 z2?c#{_BJnIHH*=v7rb?F9*-fi9kbJg3tpngan@^W?S_9H0-BllcZ2F1nw3~SIAXhH zR;*JE`$f7v<4r4$i$&t#Zf7P#FP{~O<1;fER+*~2(L8j(twdNAyw#5U>MXFaP3y0mYS=H|q-2IK4-{I1pb9ZEmjD7m95|6;VztN#`?~<`U-oKMNb2} z=T&p=)MtSMNpG=gVi`bSML!~%u*(S*hP+xRJpGZ}U?KW5HM2GCm*~hI&eh=Ka*;T= z<%$_vy>=-UM;9}+#h!l5`H{FE*!ea~N`xDuaQ{vbk&LQr zixd_a!hgAoDK@`uENH}i!@RFkwqL7>ZH=3dK8mauAwZMw&w1WkUn5~EPd+5`E$+WT zQhzp##<`-V8X`WVXe?WQ=2-`>>*-O=N>Wk(X3Gx*WeF-D6gZY6!9v9Mz~fi zB))1gF4t!XD+ZHf{0!^1yE)5PFOL=+{Xx?jXHtY)Hcq<;=f5Ma9w8}W`riB}`Sw_4 z-FkAf8`nB=uN1qsuAklYINJi%_?usaqhAx-o2P$}(u&j?MrvqoM?44NKZR4{arv63 zADO>uyNrcNX8l-=uX~BG^Iu#)WtF#37$vw?A-)9>HC0F9RBLigD%om&lAKr&C_MX# zOHEC~i7PXOr|;w1hbuKXX6%_YA24$uSq>D}B(*e`+NNywnu%?BYrMZg>t8~=g#035 zRb?)|M)->yXpdKEL7x>ldwH(Uux`WC#ZglxaPA zqermZuz0QZPOEV3?4Q#oUNnm99zw}@eCra@9N%mqpaXZ3gk11*7NR<{wk45$*^w$l zzoIuN&(etP#AHr{3QxY`@pNJ;GqWS}-{)vm=9^V-)k2=7V24DqL@hmcwqVM8J3=Vgxrem(RVFUtRW_KU!bPt2C)^T?yB;uWo%3h7dl1)w4uZ zm1fQs4!z3ZK6si!)pFX!xyrVyGlh(n+z%HvdI;P8Vu_oO_PKHz?oMKbjiUoOn=h<< zmvyBj{*B94%WGm=GLrDAEc=9YzmcS%Y&{;DXsAuuhnk5k^+oNIogN~bd>!p}cd#Sp zJcLLO;ZSQX7(mksn9UCt#;7ZFRwIyF%=%tC79>?=+1sRi&1yI@oWNE@{lv)^dGab- zgcTXWY)@h1M7+DRDo1$Mo~&A&G{U@ACj0y$TLX}qS#qD?#dir#p38%EDi0S+rjR=xHgKV zTEJnj7c0eKRacg^H~P)1rjr>jDxU zF*&>cFjyCL;#PqW&_*-Pj~X(+K2hmHg0Gk)%C^tRauXIdr{q2STBCH+{{Tyi|7HDD zP8gQ|bE%enDn{`U>+0hA77Lql?R~D=k>M&P7PI@0EASqRa)q1(VN0NpT55%>l`XRu z#1>y2v-HY6H?f@x7Clr>_vUb(@T?Rgw0czARd&Ity8W^eaeQ#^fC@t#{l#HnB?qz4 zU6-k=Q=Ro)*fyG3vxM7Ynfo~p2eD}gPveEH{=$Oa*wtF4h!+P7CGW7bP?$e}JBET{ zwHv!XogBgP756txmQH z5ADP1@h2|EU|ao&TMfx+#K}JT9OY22*fzh-b{Ccg3fEs|-@k-+VR=3B&7QFy8o?j3#*CRY;ya%u zT%N-D_MHEd+#1{(%E7KG*LCU#ZkjqL>#)Vzv#f>5rz{H>mU#>Jn{s|US)~i#O4eEU zIXQKC_yOB{vm#hH(4Q?|vbib;`?Ez8Q(C}T0k>CGhE($>g|&%`5|(%h_w&X0fC*zU zq`)uAc0gaTt^bjIUvYl`+b3yTwktJRK7i%_u%rtfZ?NZAZq~q~4NIzWs-H0)xl?&u zoy>uzWboodLz?t5?(uhJw;d|B)KBsHh+=rKs#SB~g|LH^0;xwsS)?OL6xj1H7*&5#~%(+1}u;#PniCf#BVfP~$sW zoxh_sS=xn?fAH$VjX)tZMR;c8&ZorIno%O3AxdNUmJC9_G#N0O=A`ad6kH@QS>5SFR=V~F1(F%DbQf$ z63=gno0|~aj(fd1@&}hIQrw(}nu`5_l2qZ~L=F@Q*R{}2O;M(>%}BIaA)~|nIn;#{ zUo!JU=BX6ZcUt(mWQGdlEt<^2>cki)pi$YVIWDbY^9vL1x(NF`h2TWtra3zt9BdBG z2UoxFqMg|0w$q{RSoWnhV%tBJou8`Q$*8I=@3Pk=ymY=X|7&|?L{R3ImiL{QKup`Z$8~r)?1(7bos%fNRWGNpE z)XouSYZ23jh*BWJ8YP`?#aiv*K15kxzFk<9FL?by+|L}C$n`N~cI06#V*0V7GIQ$? z+lUKq>swlr_p^qRSsMB!kvpk=3;lvy&6sHtTC!J%KcFjQZuoOOP#vTf}!VtcZv57!*o zGtD@%TidYy6_&ilF8$FzSyqd+HCX-|aYNWQk^Mfxx_n__vT*5by`goHt!hk3b?$sX z?u+9f%vDbwbgOgmhIKc5wt}dNIdSxIT%3R&4l|n)YI-b?jx#cd(99#3By(_jI%H6EY?q+C$@YxIOd|BVx zNkB%3NweP_(eSw7H4Z zW<6=Z{Fgc2kVDORXvc-OaEUYZ{m+K0)KTqVp(@Qs!$Lo+^9~tQbC83 z*^~V}$kABoXYPz*bwdunOk_uHxC$9VIXsFT$)fp-Gt ztj!!h!wQJ}mE6u+8hflckH;C5b!JV)fe&C7_BlV{uD`H4M@TaspEa+MZI8>ZtbdvK zFUc~N!|E(O9A=7Didu4}s_MGjoIuVv&D`A?tixMwsm1mnL3lEjoBauL748h>WH

?*G#-^HFpb52HN@>N2+l6H7-o$c(JgpA2GiW{T4S`ajv%B)%qHHT64cEm-2A`jNKw6p5PcPkz#nIh3AmtW9Y)jsvpgT9a@+4kZlp$>H z$l6+@*JZ&Q?C(vyJ)07RW1ZOe7HfM_(u_kcLVB{WszgYv%YS5HgTCg;ugac@uFj(g zL{A_wSvWeKyQ#uT(?7UN*nLVSJpDSGK&+Z1qw$&nGQ;M`& zSDMQiU1>Lp#9?b)v(og^qgWh0%u2I*X9+{u>BP2p;ajc8S*ClvMDTY|e?RL(o($m0 zG}6O_M{g7T701Jb3=>XTXMEXUPAWm-xzK-oZ7zMp<0kmoDRt}GWY#w4-0ly*?CaI7hJ8|$qI`bX5`Kh+)n{B4j8giW*$*Hec<0k|) zQzn=H5K?`FMQwGdb}JjR_F_BtA_+OdwH7>lo8SrD{Dk#ibE6@TI&ghF=RYFqcU(T@ zu#K}X;5I6RE)&^Vk@PpoX-P_yuxkRh-G%5cxa}`mfjLjH z7+=%PIHQSv+bS4yxiSGwDe6pQl8`bEzi&yK%%ghv6$l=^@Ku-2sk;5z5^;R`z`#Ly zA3H2nIH+^k`?XzLA}sus@HAmf9iAl$KJT-(9ov5;K3B9@dgGg>9ntDU!Bs^-o`Y>; zW*Y-op4vHA*>?C73g0HqLs%OjWOm?gJ)(>w^-9^#+KX*PDFACtX)GJVntH}n%8nKm zzs&5nxDYICpU&fIY#Pe$nL_j|^NZ!xXJWhFkyQFxo$kXA|)Hid*@@ z{2^TE&B2d3NVaH?s)u0$Nqo}FF6$=-f@q&P(7X|ttrWMf^4u=yMHmS?*P zsj0%*I%K^=S{sh^Br!(t{YKyAR-UlXOPKdAOUC2%F;_KD?7+id;c+L548mjed2UQ1 zFJ15q7M4w8;fMIO;X#4m+JM+8itNwtMp|R`yvo|omAaN(nYBGxE99mK0cP2kTWGOu zY{}Us%nA_-hVnSb40?^S@q0;Z>W?imQkqu!Qxjd(50jSUa+!gz(<%@5Qt4*xZW;4LRF^2ybEIXSlsX@Gzas zv1Jc4Qfy1}1($bCP^r>VC+vt84*sO+)C;3fmRn9AtxSmdfvj)w$r26>=83m(u_ue7 zgv$*{k2mrm{x2#Lb2U_0Sci0zC#+reLk?m)*PFnGEEK$r<7OrH?oSeKhYFi3689B5 z?KP967SJ_NSTT<66Y)I-Ken^4=2-S*RmHY8MhI?dEa`vxGUU%-OO%isA}n(i7W5~!KhMVEW?o@n z**!iHTYd-D_2XHbu=)qw6NSg$vur9^oe68t;us<1Cw2r0@hQT!*SK4WnKhUnE39me zQZMpM>|%{-wOdkJf37#cHC9M@k;9GI*x$%H&1=l9(ad~TAJN=UkpE>m+#lyJj zEj+4>M?)^R!{a9weZalx>}bj1dOY?Qd^7`)W7eh>h4pL7(*f)=0kf3_x2P7{U;1o{ z@YGAVQh`M=!r_m(^#WJIg)82|-UvaPF#ksrV1e*7N(k-60#D(LLPf5^yG+d;ZZEu_kLy zzs|}x*;il&ZE)G`dy6fp1|I&xov)cwAe{7aLd^o!*6X=MRWcs|whHsej zJuyFOqVUo%!g_L|Eej1CZjB6ARpW4X=KMv0r*LH)GqZ(jt;v`rx<|ua;ha$*ajIdz zUQhjp&(xp0RU{6}N~<*W(yLe;z09fKyXX0=&6dvmWQbBD8{8wm-*jqVgB3eP4H8!0TT zNzNdAC-EQl?1rD1^%oD@vbq=9V>!@@;=c$s$DH+;xmJ<2Gll&6oUX#fjwBkV-U`Is z*Ll>2z%O#`Gb2;6-AmX%p55MpYXvit2i#1plbxO~8%o6S{^MvpUv3wP!)lLGlvl64 zi^b8~4AmQDL)AcR8%l&A55ad3M;$17Ps1Z^a1dp5vFen4vRd-Q#1Dx1pCWmZ@!PB} z`TSw*ixu|uS5zR?SytE@&r~k7BhUN?Ef>g;`>jXh}QmIeqsF zH5zx{!s8zn57H5BT{fpp#HQL+k)gtsPMm4MhVk0&^+*jK{)tCbLQUGmnq+hzNAbV- zzQBSesul6nta~ePaM9SCatKXq4_hmjbX6k`{YLWFY)lqzB?)or%2dGj2Yn)|XR#|n zNN7OD8=Rgg#G6uE>n|)fL6g-5U+^VS6*&1J_ZzdLEzfFjp$|$FemsN?zp=vKD0XE1 zO?;vmbM zRZYs4PaUxZf62)(;grghH)3uF&AbL_p82^X;De@Y9f(Juuu_fI@0@Exrj1RnbEzrU ze_`n#_<9JQ?-JLI^|OWLN_V!A>uxa3$aEq7JFc2D$y&gC>MH`q5?_JiB6$MY|RlaO=GL67qT8gTizw8K=4Wz4Y{9n=f>}(&J^zVB{@`> zH&gHo5<|ORm?>Hmx~mD-0)+kV@gHhJ&My>v$+qbP_2bm%?0VT)jc2tq8VLA;yih?k z6vHO5VLDH0v)P<9R=c$_S4eNb$zhr+E&K(yzXvuN#2=UXkR`cK+ zihuh3!lE%8`HRrfl%zGwy+2x%@VLGUaqsBES`W3=J(bD5q&^GAa$_pFYc|CijEK;mag zVA$d>Dsr{!T^{5Jr+y*CL%0$oL>hx?G>8RkF@s`g5F;PukY}P6Snr^&iAZ}6FjTp znk4u;5!H@>P_xCXi|FCEs!bPKoyTtzGZbwPV`u*yRyIqc*K}b|O}1CWBS^UXiGIdv zwJygBvrKir^@!OJFQmLiVt-b@U}*4m_Lcx)lE-Ac$5K+N{bNPvl2jg}Au$=ko-iS9 z9A}LXg>^_%`sm%tmuPB5Tl)KCPh|NxZF#!4ABXyJtCT3wx6G1$D7HIBwLslCd`~IWc{q=ItD1+q>i=UQ+2HG7Ky{D{svCdOW$H~^fiZIdCmB_ z%C;aMVN;24tqSYi1?|>3uPPtuMxzh3eF!B2$?>@u{a^h zPnauYzevoFT!|F?Z0zjJ>hYvx3uyxh%o6r~&-E$%#}+=D#Gy_&7YQLr!kyl%{{p`+ znD-lA^?Cdyiw3dcea^OHW~Okyjph{XtnhZY!($_WXAKF@{fJj*PIu5xepU7cgT=OY zvI5ja9XM7^53Q$8JnBU7AWB|iUISKDWktRa(TNT2q9nduKbaW%NSLTJMfgDWzQF#E zS(GfyD&0I*OnsvhS@A-^FJwjt$H$XXi#v%zU=NNP()x2S)*`Lj4HPo{gk#?l-=AZC z!u3!gygPp5RPM&7lRm#SgL0|{5h+4wws50Rn3XK-8bB(n9)#OR9391y*O?n3T>TaI zIKkOdxR@$L^yI=wmPJbGD%q^Q(xsUSy51`ihm^0)D$z^7VsZ2{tK_q?Ve2C{b?_Ew zoqao&b*Jb{4vb*wHwt`YbRyBlEKgB&6u&_{`-}&lvsu}FL&zVd8sG_|Sn>mpjcKY^ zcGDVSd-^+t|KR&Q_Xly*bV9Howq6xxsn~$8;5SCQv}IK#VFo+iVSZnIg_`zTbfKTh zuHa;Ef4@i^g0o89J-zlX7Ds>c4py^!Lg^Ka3;`{;3C^iP)JTGVCc#zA1aB!Z$$;$A z+E1$qNHz|T6&Lb(o0*ev8Oj+$m#{h?S6}B=FTz_GG{fx_A zPJBqMXp4V?6|L}T%Z5MkjTL;81)n!5N)^s02zQ`(EQh{lKdu^NqxzC<+TK{p;$#Jv~!fuiWj{UkBr%-L7iIaR-69i#(Onco6mf8mm|sHs*a z&*4ejtc+`8R3G@lzpQ_gOU56u?yN0uk~5N%t?=q*XoR6%n3E>AAN2*K?q7XOL=2tq>zpSQGbDxeux+Ny|oQiM4?tS6OwDgVX_d${WM`O{SKT_}}X zc&}`2y(Kp1459c(mJjF16zu?=|28MT*VcA7-z9Gd!5a*&5w*H0pG#t4dTddzBS>Ukb~ z$ZZY&oNC%{RpYQJMt9bOB5^qBS-P|II-pn_1I*5{PQ}&|!97LrOOpTb6Rn4{RxX^a z!PO8U=PTk(T6I|2n+_D)`o^SvNk)cnKU)Z_L9D)4O){D)5*aj&D=(8}M}oFlixw8N zXSc5qFo4UQ2z#Hy_H4`%vfGehXi(*ICAKRg$ZX5*#zyVI&i=WTzM(RE3WVFeDgIJ@ z#LFMxktSUEl|50y)nwuDx9VM<`&_?i4YB8Z#nu_@9EsN$o<$4kog) zd*ibAd+l6hTb`e=#)&;6$r_4Vps>D_{PafIhZ=}2C`<_ZnkBiyiJ#b3&j{z7twHWs z{dH^ocZ368e{$1R2pWNR1s9E2=2z7Qk=5fzZToUiR}7@ zwSN;ADV#4BW>4hGU~d12U#<|@grk4)%vG542PNrdXInWwbM3g-mZ*4Pc1tal3Li`K zSS~kUX0G7#G0T&LQCu3sjc}o)NECm&QG?@e;@%v$cBaJ7?s>V8yM4GZg7^X<+EvI2 z7M_l0f2^>1tjfEup2#k6FBI-5RqSmps@83wkpCAa>R}Md=jPkrLs-{~eI246$@J&38_qyA!J+mN%1p<9dW|ln)vo*b({%Cw>DA*v|H_Q ze}iQe*j0yTKe8-PSk#{VojF<$k0wN?36~u8;jQP$`EPjKUH{m!Y;ih??a^S>v0WM> zq_^SXS0r{r_2(i}g`C&)!%fRRTvu$7zCuPb&Q~LTBAMwz_9(ndV<#&yH|`U576>6d zNd6slh1R{m!WY;+j(~QYb|hpNzF!gcHqUCIoRGX3B)JQB-!_L+>^SDT3$BI2{XX~w z3(lnumem?>|5!VDn~!#(m2EayYT-Iwyo1C?8K=cAv#9b zXv}yG`|au=6_|4CN19mw!T5N38B{EeLFPfM8S=XyYPYDAAkm2SPz|=12=_k3 ? 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⁣2O-%< zxYIxpL@X>n@&8t}RezaPxCthUDalocvlbq;$73kA{z863?lw_1ikrNJvr~ASD+Dy) zOH0gSKqjJN1AgB2FU zcctJfwiZ)8p4VEbQ5hG^+AmaBoNe)fV@n?QAa***&Z1LoFLj2^=+s^wpnh(A^>;Ib zXTOp*AD@{#8^EPf9MBnH<2@d=C*~WrE+(i2*&|3DMp{Yof5D{`*Yy>R&W{R5BdcH? zCpb0Zd^e@Lce5Uzj>5ed;X@xb2MQ_W)JPf@PH#;yh2#mhx^b$H>JEM}RZwc0Zxo7D zzmlbwI->&8711vQ=psiY%6xUiK!;Mz~UsjW)u8j->p;rC&KY z0>|cD9D=op9Y6Da3ZCC_KU=U*7FNd#zF+gK9bN@OZoH7tk5%!S|F=aSZ^pSiFi1VY zZ-q}VMoj0@MdiB_Mv~N#^M8{8sf&5$Av_SmzTkWrj@yWe(o<@&GEVRh7Y>gh!(Mo{ zNHu%*uY$`M9(oB;COngc!4gs9o%=xSyo61wF- z-Bc`Osg{2^-j26}SfQpRLAcjmUCao}o=+FHYJkcZ!FZM9RG<(!opnBf?LYL%u-He3bv!zG@Fx6*jt^uNrG)PvSH11R-5aHioDA!d2+4Z z^?FYJg6-dGaK;_7PvxysgqTrm9YN%9g$k@}$$2NiNuxOx3fGBB0XF94Fm(l^TYFIP zu4?k}7Y?dm?vqCk{)J6h`cO8e?46b=QeIT9kk$nSChRZ9ntAwkVP6Yk(}lhIl_~qAHFar3!fqi2WXqL9Ce1Rvl~=k*|7~wl?EN ze?I(!uLZBv=KN%GUEAZ{hLB#YZbV*NUgQX|f3q%K*ieOSOG%#1!w%f>}8YWwo{NCP`02x58&?FQ(MyWdDJ)ttd6|%d@yt zlAYB#T$y#h^70!llqV!iaOuS{N8ypi7{4t1xuuxSo5i=r75-_MnDS$UgEP2Mg7lwQ z86_O>5xfVpPJw3Lf=vk(WxVU9+QvoA#@cxnPd#cehU6k!nyh6Pvy>N4#f)jzQXkY;Z9%d zOL0tjltWbx__j{qHz>Sh4KXG73U>B_?JN%d!i`02@4<8JlNj?D+cmky+ErLLnad4G z`ko`v!m(yVxC?K6^qzk)jEK_YCyQniKdi}NFHw;9XEg=a%sg#l`eI8(oEoctaTc1G zxvv_RLWS(9toW0+b$O%LSd5``o4D43v%Ft$$M*?f}1gxp`SD}!TnopO|2#aF zsz)g@6A`Sd%noN^8?4u5^hPzteo?8;p=H2rri0&3-+19;~7c^@k%iiW9eaYG8+;)Oby5wA*nU_%2)U} zo`(xrTOIeoB+o--I4wTaakHIEbZ4TgbFwa>Es55d6{D2LlR8{T5{|aSZXyTkav(&o z{*TaVDph=F3~u4V4efH*FC1?*F|AG!B3cliEqGVu`u7|T((lgblSJhRp(U}&6Q)&K{4SDP)*#D=p9PfOD2Mh80p7=WCx6(}g6?Ir; zu8SE^IHaCp3N6E_AMvlN*jD+)u&K_WF1!g7Uc=*lc!vrZRaN1wlAlknhexn*Fj!dY zDW`V?C4i6BS`{cc5_Kcij4M?I$8S6FY*_gLzp;A5A-gh0H1h#tWNEpj1?Ob&M?Fy<$t*tQLS9~^&b;tnu?Z4(1qnxgQ$)|u-fW8(UVY2e`RXU1 z1jj#csxfaJgjK(Adx=skKhO^ASYcBo9#q4BIO{CARv!Ds?3~R$Rlj8Lt74{^9u2|8 zR=8P`57~O$Mjz)vrYQM(wAmNdP7Lhz|rt|((xC(oSDceH`TF!xD+)5UXmm;DMIbNb* zxQ)GdI-Eq|_Hf>HQLGdnFX2HavJ?!YX~du8WyR!IirDI`o{U>JK9nNsM{R?iS0W_B ztV;8`3@L6xSfRsdtThN|h_$b<@>f#*gqtCPN0jh3TG*B$+^nYJ*6^}8md9ZMsvaTD zONfgRR*WI8Jc=mcQ=cQ|Gr_oRueHXpG(OF>s!LQA;#HG@kvOFb8`X}fU(wQ61xu0F zP4z7-v-8Btxt7K*)W_|4QgyoymYNmLT0Jp2HN<)$*7<^ehVb56@GTIWO7T2azfxm> zdUp`P*20G$*{bl}FyUrZE?bKR=|g%Dk}brS=AnmRUzJQ}!Kpq+C-b^C`{$}XogXD^ zXw3awAxC9pG%e70oE}aRRs47(UkGT8i=VK6AU8X)qcv|^u(btud-1ThdRdhVpP`JH z_RQqvSE@+c!txVb=3um78zQWqf~&poI!So{6HX@1bR#E7RC$t*1^d6o(N6Fl&0{Ub z`H8r(Z6!|jB+6CTT8g)2IX{&3^$2tqLR;`=A~&3bLw3R`ea0IHwfY;*jwVn?Bi|Gb zww0JvZa&&uC@9AIHfoQ4?8ftdc=-c9$)aj<&(+7(RY=sP%4kh8DyRqSPIg@RNbN1p7Gqs^A^tkhjSII`?01S+wBGWHX5^jJ(mmL<29HKzQWrPq_*cvFSbPQtzNIuV?`lxyV_CHUxnYKn|*)Va>YEI~=UBoE`#Qnr@B*;;rv zhu!nkd3 zpC){;5gyKCO;_Bz;;+nQ{fd?W>Wa}?ia9S&tlTE)E2@vX@}%l6b;bG>Ed$lJ4xCl@ z&Ce67n7_Mr%IAg0f$WCL>2a!Jt8A>bZ28OH%AK{8JDi31)GMG`5yu4!ktEJO%&`# z<2-_3VO6*ggtEK4ZA9I7X5osPB&MfBx!aTE27LUT_Y*j}fOJ3MGX0k6NQNO*lKsk=q}n! zCw8f_X>a>-y$2}^+24%&zCuKbaBvb2V}zA;*fO89-*U=Fl&_ncD>#(lkqYO7g!gS( z+ntNONcdOHlrg3BB3@WMj-)ZzOyEdc{C^>A7LT)qZQpP!UAS(qXSXOS4zPMx6W67@ z{hm!jSYd_lJfh9ol*X60=?hLK2zjl!`5kLU6X+vkwZf&O3M{sJ34Wo%vFSX}Lo!ar zjbTKq#)5O$*If;Fbm5B~BBrywNpm#2KUd}wUyRJYq;_ZPBu*+OkC(7-3BD6p8!wzp z6`ptqr`&|d#oBjQLZ?p~aITojq*z#f!lbfSy{>{qks~ZDKgklQk~`%}Phj15*iXZE zisIMaY^hiW8)p&|Dx8QC*18H2euBzpZfronVrBg;KHW&kWjGlwICu!Tfx_MKyy}eV zF?G5a`)3kUi$r_D@h|l|qYJjiN56${3#X!unDSJeLo3d7;PP+0NENoU=2%BwcU7fD zn-{TmEYb5hIZNjREG!MKl$bU-n9K5W8}rEAwZ^LO$`)cetCQo#yir6+!rGBxE$o{} zj&SW4b;U-7zo{jrlXJLMAFpz_cSg0L-24~!yD1>q;!`n|-IKAM!-_3+q*1{PF;c6A`mSaV(U>C2KhH)I} zW4JJelcNc&!+F#=nih_-u9)um3n_C*hP1idiV`0Ghic3I&@3-we17LIIa!I#<=NAR zH4eht%EVV^v!n3jE3CDPZ(JtZm*G`X$^Kq5iy>cAi25h*YwcJLD)Vb?Zk_JwEjV;l z+@sa=Sv^b6JtS-xYfBnQooYvstCf7L}|BZ7~Ia{0e z8Nwk!q0On>23Lyl_{*a#@RoukVA5`JXm zH){Hd4y&7GOz{qayY`KYbDmR&6f2_tBBlpHb5-zI$ud~2w@X=Sy{*U-EB9RUdQ+eG z=1JAPdc7Gh5*a1D%M^kO1Q&Ipf3h#lFS=#nv@{gcnZBA)m;V>Xij!0chab3}CuIDK zQzcaF_gR<`HV~J3xGv)89Kye3!w+n4M4Xp!E?GE{AY7`=`AYaX>Y&r&)7vL%pR?$F z-z;O=t@r!WR`|44=cLQMioM^e8siMTBZ>@-Te*EYS79vcN}a=_T5R?b zZ2#kAm~d|huT^EnSe#u%)snjg3n!Mbr6zZ#b8#eR;zXU-pB0q`TaXheM0VsxQyg0H zQiUs@EbV(?Li!v{0Nouboc0vePHb0s*5nKK^a3n0z&Fd7HvYd%;X^HcQ?v@jlsXS} zItAtnkB4#3O*j)J_>3lQ5pHvMTS<$RZHN)FRAZih$;cHBO=tUZR@C6kF!dD1lQ6tE zQ58t)%WHFRR5Tzly>Qi=z?lBI?;|AYY?v{Xa=#V6x{Z=C|GO?+h{zElE!Z%PhkxVd zB&rX=?J77&iSG5O@-;EPb6^Zk<=I=4L_IvCL9@#hu5{;lDV`(?J1413(f0bJqzKo2 zM3rXy%tZAsK2()0I8j{S`}xQO|(ANog#E_DugUJhl{SP0kJRAH=lt3(kFkosB4=bMJm^wLl$SS6Xq> zf?(lnoDegQ#2Q45jJ;qtl#pN9P?3z~gqBizq;KK{)z&n{Pn1qXSaBY2lmJ!2uW1%FF6*^($J2su(s+cj{iLV&^hChE*T;OldXTUqAu&Qg_R}9P7`cK;WL7; z#soEHm#?Tm&Sep&$6-H?gOy3HjYldStnB{{ajst$N&>d7l|pw=}uZOaopOR+6fi20UBeR(&PJ0<=Uy=i z@X~k*{Z5b`ZmWp_5-jDG-x}xu2v?Ro|eJ&3as1_xx*0#~Oi?;lr zBc%P`;}$R6oyW0keSu+xyQsgIj#&}Yi`#99Zpn?}9RCT$zBoBw8TE|%L@ZDo$Xj&@ z4iJI|ko5)jGf5nw6`z7f;|Y0T`l3aCotUoFC1?z*|HXZ#(oP9CQ$&gmZs%f`YZ7BV zZ#xza=4&yX_yOmsto{f4x*VR*LpLF@vwCee=8)kb_%2o@si_+NC;}A3ba)XDdg41x zwFQ2YDXJZGh|c=7FT8kjF~yF+SK%4$Rn2ZnqHrxpa8NaG{-UayHv|b6wJfR8@Fiyn z4sA5z{h2Sk*ISh6#`R`wu;5`091{fvpQi|W7V)4ZS@qcWr6P-YnDx($(|&UvTYF(+ z#a0_3|7WE`@G@AqHJ<~&u(Cf_yKwvuPF81Ais1PV5kbNx8^JkO*twYP?NItEpKvzC zl=Ua^=GtLn47RmB;R{Ig*Jd)J7dZ=g@G}qEVO^1@=Iv+nxHJF8u>z0Ab7?Y{HNn|v zWe)$s;gLjtg~wvDF|BJ~ku9;J>*-d92y2{0lXutmB}^&Yw#7ABa2cTlX|MJo+E#EY5H5`1 zL0?rNYhn3`P?1-X5a}Z9?nhjRP*9uu&O*9_aHSDDmk|jE+wm$#xZ*GD9gQ+KC;wn` zM;uMOYKbb_{%Fo?80YB1Sgy9sPc4Q?c3w4@JUUr4ku)^l_p-?$48| z`}J{Rq-eO*S2gp8+v2>0owW!n5cZf&tkEZU{sq@2v(Zi1kSN@ljlY+XjN{w3t4kfjpp{- z3Vzz?8Uu%8jj>k!9CAfPkx?3-G49&ECAmF-ORY(C6K)U0b`kgf<9#)p{e^eJ_7Ygn z!D#_68gs5EwzG-;oy`r1_7WVjgo8tg)9ljTg>%?VOm{5s=#6g~jud0fU+gup-n?8_ zE$8VkylBAr2ArCr8+fT<-x|sOHe`%fb73^P*=Evx!BP&C;8ANXsdi8GD_VxDh578P zslJ8f>O8T^FR2%%`gkBusvgh_)2QzCp)1e&u&FNjJvla>ZA+B4N4P@ozr)swyIt8^ zOzGFSHY4p%uD2j(Dz?)&Fo^;$VdFrYJ%tr!g0%7Qx~7Bs?+Ty1gP3-7=fW4f9LU~y z;eAQn2wPR{t^bdkVM2nl5KtMvR3R!<_|QQ;anTtqrn{j+V2H3KOxT+& z&JE#FGo2gP1n&s-3bXx{ZCR5iR_RNu6v114JeVg{59(KFOqfNew^bMSYU=7mk1VE> zGdUP7*o6y`{zBM)x=P4rDwpP{J5{iZERd?UKG#h3zp(TlZgsD^l^7Cukt$lKNLDwJ z{vu~7C%lF9-bw)QUPJEr2KjMZG_Vw!!#f!n^Ra z21!e~XeY!^R(CL>>Cc26o}#Pn_bpL{kH;4AYyq*IdGa5t?1g}Ap|lF*KIo)`ac6A) zUukSqfmFS;E?d3k8zU82*h zik(wAHv zJe`Cc>B72ZL{;ToGtLZT<6xZZg{NlHr7^}$_t0Le5w5t~iDM(#G=rB)B6=|^&CZc= zW9_KPM<3yVN+6dva*i%8Q$9+3EnfaaY8`e|R8wQL@`?wxrWH3j@p3+UVuf=)LO_4^ zH0DD!F3jWDQeGqqUZKK+zd14j`%Y{K)Ppp#M*O^mBqjfyA~-q<-YG)5zu@r|8#h)kuXkPT4|k8AATXwF75^g`3*BH7?q-?Z`E;+Es`tqei}W7F*i!b}3oCdFCcq z*Hg8^=N*M4jkFq>kgKeP^EGk#g?p-lwQBR#o#dtL9nbB`tjHI36z9!1+$l})Vw|gU zcqkuwt7$1R;c>-HmqUg3a}=j6r4u(Ig$Ip!p`W^lII!K)6t|q*Vr-Z~M51t}1=ogh zy)6kpaJQir-Z&a0glV&F^cg(9BCD4&Y?Umd6%67KU97&P<&8+OI_|4BR}sJzT_B`- z3;BPk5gM;?L9o>UhmkR3-;ATh@s1GgkHdPRsyR{s@cq%O?#lCEA-@XmJcXELT(siw z6b{V7u^8EdiE7HOaAEt`B!9^X?a&l?mf7E!lsMG!RN>}m+%#fr^wutT3ehg2Ld*SV zHuR})dAOK@Xw7!?Y|POZQDO7N-*Gb|fkr#yuAM65d7vg-bzs|>EJT(kEJm>I$!!zc zJE?gvg0+4%2${;+RAJZOY)KHV59a)rJYTG`Svw|@>n-e>%B|5VnS7x(#}}z96g``m z{3a7ylg+>Lemb#L)c+PCfns_;SbI0Ni%Dp%eB!ibY+ZzRoL&pYG4C!#_B7r%V|Tca zkRn7U3me;`MCdJy(gSnuDh<}hb4#d@xz$js#t7yi!KAB?*r0Rz>UD$a#T&!Z-Sc$=-j42Q6oCVwY zysA%(iLh!|+X@%8ie8_>;eDs;#7~05Pkj8IV;ziRE1#EgY^%*7rJvv~vbw9dK>Hk(R21%B4SeJ%>Fx zLP}ruMhF{}pkWsh8nbo~yR~I9l0J^+3O5%Ml57^hI@6Z5|KPWfE%t&^i&f%DTk7#Z z`Myn6EyHUwhG2x=pG+agQ}F+ZyBc6L?xyEI5-)^T=3=Ih+8WoN+1;6Ej(Rs4&%rC^ zpsonh5>rg15LiQzeXj-y?g2tZL$c@M*;^&N&g!&co5GjZL`-KIk=+z`)!S^C(lLD9 zR98?OXoj0&Th?OBGBuY)##T%>tFhsCZfeHP*uqN<71Nag_^IfjJ&($1=={`tB3p5K z7EWEU{hRHo8~uM;w0Kjx5ZQ$|2f-y(NDmV(eZ|gy2yznDbnA*1(=2)}=VD=%$sbKt z2UIVWlvbSji$rJPe1GnhCd6J(jnQ7Iqsb#jh_@B|^&2!U@3p^@^);tbg^fK};VG(h z&-Ssn*W{LVRg9j+g9yQ^9*>p~Q3*%IP0kPvP-m z)~g;7ziTqnl_vOCV^6RU;U?@UtHdhOzsJ8mTUz2Wl0CojU>awVh4Z6$WQliq&ghvn zS~0(DVV93^wH@1j=4zg>?{6ah#HWlJNBP1bmk`r0Dwk(r`3V+yTh-I(n&Bew(z)0Q zC5`PVxLD%ai0!sQj@D*2?slj0>?^4hE+5v!Hebkg6THk-T*gQu>2L0rWp9kI)k!#C zo~`ME%N&);PpqgKsccpS{^7zUOLm($Hi0Le!Uo0O@1_P@w1~vCDpAN=&d&L)YCwIg zOA$Ctoz!VnxL1<%Bh~l&7C!LzV%k5D^F!#$Lp$MtdIR89orA+kF2>FdoSw=3(nQ+{ z&!_XoTDY=+n|Z=T^HUg4@2fiIC?XjI7dKtc5WIS@(oA48e))vXwHp`9opGd0=5CUZ zF@f9V@M(wdYz3la=qm4`h2O(;U?R5`qN=*S=cV4Gl?tDzw3sr}g_Gt4o$-87GA#S1 zvwaf2gHclLs&d-SS#WNq3QqHMD%E%-ZEnb^5qO0OIfE5;x7}S-gR@vC!A2ht#**bU zS7Fm^g_2xqL)s5ov?01X5hYcMA#@aO)^U6pU;N@WdB8gmNh9dn%gZ+k$PQN70!xTsz)f$>5@9qvqKPcPoO2??E)0?R{Z!LK*Yv-JTPZhnDAqgs!%jR>#8rVgB`#)>|~ zDfPFp99~RP9UQB(Pt%=>UYnTwmU7`=QoiCw4_;|M)(B)@cNO9m<7<=EgYqlizdK#5Pq^SQ784JTuob8ux;dKz_ZD!%o7cXu|_hBsV}<)d=UwtnA7PX(>)y@%lTCRpDKX z5Nl2=8bidB&cdl=A$Bg?%CbFDSeY!G>W5z?0!QK5fK94vo9Y&)j>!6zEMrxq zS3_bO^Q<8`HbT@=62Ie=!Y98`C-jc7Y%9U-8SI-)!e}yUtNR)O+{A^Xe21^QU^@ek z8u$-W-zYLEam7t9GX=lWs!YMzNr=c6e5$IZLIuCEt1BMENY57Kk#G8z!U|XznIGnRjK5eHazeUUUw#TGI34S%?20FVsA06tx3RGvcKlIA|5*nZeMWQPk1;9 zZ%dwa!G8>~t;uMKO^)!`K?wSd*ia#AI5#G;rjNRy(azk~Rocdb`NmwXL<_OM@u3_0 zDzc+GryB5fIl1Gw7%ixHH^Rh|Vg$trD~F>}y}fzfo);QHGCtkQX>3grR0bzv8m@g= zQG&M?#LwWyuM{*^gK1azbj`%%T9pr@IPNH{?1$R`vbvB~j#rh~*qFVIiKx#}54GFs zSG0^%=O$m>b*E;3g=Yg3FW?2 zC9Xi&spKt2tCp*u@rMsZ3J;Tn*#Ff3bSxa}*JAQ2PS{w^mcu(l@b(lQ*$79z;<~4B zur2R1gxAxt`$hfExOXo$Mztvqt4gx1@NyYPe&tCEo(jTc&NCQyw4LhBnT^eaK17(y5PDT zAMMT>7ym(>N;MwHNq;pZ?`nv zN1N?PTTw;acdBz(JM%>kwVC)}q*K~=;av|B`?1S}t(~wkNJuHqg~c557T%-?rvrq84ai%J z-E>~{(`i`?%ksY!zN;}}aT;#oxM>*? z0m6q0*aZq6|8lPiM+TDpFE?_9Q|U&YSn6% zt8stc)=`krIZbVeqIg(*YTU!dYoO72uF{seA1|bKWp$8|1s}?6Zah_x2H57**Z zig1v>gngaZIg0x&NdAKh%h>HG&K8#Cjl~G>x)9ibtxGu3kyTB}{RX!r;g)t1 z1{IFrM=_~Bj6!yX;Fc#GNftuJaD0{uOFp*ec0XPYW3{C^bq<%tvo{6R$chmn9fZR@ zaGkC0Ydj$ikL5&T0v9OO@)pgpGp>V6W7PMHA{{Zkwh>bP<&l^0Vmh}Q@S+qsx?7Ub zO^qr?U{m(AW&5uL{J>1^eZ!q!dFw8!HskFq9%xj^hykWF(cne2+v1cY1s-fu1>6Qv=f81A9aGx8)Mf09FCeWNa zD!n$})*Cux<$MmDu1b zyspG2nE){z^%g!Z=g}f{*%pP*_?4Ir4rfPCycZJk2m9({-AJXD->HrgW4WS*F^%!; zy~J2%42wMYn`KP5OYo`zabI)tXZHQWWtDvTZTt3h%VAG#ox+T1aeHt}DT>`V}n` zl*4-HqdGg+=ZV$5pY_?PJ|4-Fsz>zMX(Z(2{lJEWToDO?eGY{R$6bUSiZhoc>@x%0{R`jC4`O;en5TbmKSj8z>bHimWLk1_PFx>VE_Zt|57UI~<$UZxvM$ImzURG@dAo$CwNTl)@PUMe2>auOv`isiD>55t zXzmknTh6OG9RH4W3vd|4rX?I3$j30@=qOYc%y%Fm{dk=wc>4=)9EF1FVnO;#P#OIucXda3;brJa4keg?M?b1?5qXb4m@6NoYS%9&K2=x^58C3`h+6{*89@Ft_BO#=A8bbC`sFCDH^6Ni zj{}8s4O#IW+5d2J1gYkfq4BuREnL?1O z;QBXS9eJVijYeB~@K-*%3Ll%OWAb=&_Le73mwwi-V3}ATRWC)|R@4*M8CI?hKWRps zSRh&g-@@_}dfe7@1|0PlF69Vr70F5vb~_6N<@pdMJf2BnjPPJM zJIAoT8mG;5HpYh1=A4^wbtqlT-u~iz#C!sWW)qo7{QozeW`9 zuz_Ma=r5{wjc0w5{v@LW{-c#{h)X3rBZa84xGiF@y>O~Ho`16?Q8>PgeZ5J{5?1&N zITeVH5M1<`SrmlCOf%i7iR~nU|HW4&P}HvY9sg3?{EHk_z|fp6<_9;9+*K|6`V}pc zl=*t{Oqs6@d195_RhuvM@o1h@J*v%@kt6xSO$aT;`I(%n!LBe-j%QMV@Tdo#i`m+N zyESwmZr6$Z3vjDONqzr*!AV;3@#1CqaMDEu(13jKeIbX zc-4%cMTGr~()hhqjmM37X*RjWqh*(w;%+n-=Q?tFBHq(*h!#S7k=sYrwZtgEw5EEP zBD=ZW(v;Yoi!Q>EJkg!we3aT!O_bj@on3#arfp}dlaedMFD0@C>mr5y)3g%78*|Z# z(f?Q#DulJ=%}^pIqdL}~p2v;yJSd0XX!31^-9Ib+kqnIm8GYN+18{K_Y%6hOJg28& z8zHEA`p=4~gF=LLvpDcG*Z$zi&+Hn=x*9~!;C*lQ_Tu7XY}19)zhPndNq+p;7}Ye& z!t#^Vdqv~%MROTf+_YDFiA8f6U}Zay8!>`oGqS>k{IcxnOyE#Fr?76$=NH_rbwi3= zpa_nQ=Df3T;%ogXf~%8dC!ATt$t5U?)wNO_hqry$A0|A~gdL-+=sA&H#aX8-GK{hR z7F%K0Y))vhVA1%+bTLKS!=jT+Ox9^a))?+hVnqv%%_gG@+ZwYwQB?K6%Dx@_T^({E zQ#otJ-DRZdxhqOc$4oOFpG;O&9DX6UHr_Tu#8+gsWSiRipG0O`TUZ*rO))7-`>in~TPg?t z+zjmX3M^V~>l&LBS?yS^aC|l!O0qIj__%~?$-+r}N*IrV^aQh}PuN6mr3uIXY zfz$I?!CQqG3Bu);s^3kVov_|f2n!I-%p>O;lC6a|zM|yYQ-&${e0wl2ZG=@{u%m<4n?F{H$UfMWP>IA%siMkBJeG55ChO{O zT)UD+*X`bayf34kRnZ7G^kqZ1a5Yv?4NZ0>372Z)J4fY_lsbZki8N4*Pl>^bj(q zP!J+SWe7Q=xVL~Sy*R24uCIAB9=mVU!x@wHe&s0mkK3+7mMX^a67KcaGK;VOBE(5} z-V(1o;j98bEs3g3L0NXCiIUy0uq^*g;WV`p)1AMxFlbn59{t4nZ#nrTL5@Orj^Ny% z{Eplm%(~vhnF%?@DbLX%sw<*K}&OztRF z&*sV)0{_td$W`sK7>#Fe6*h(mN5}HyUlM%PQu>64k<^@we8IaLx1xpAvN%pBqbvu8 zDxk&I48Rrn5*r$(b|S4QyIPXcp5STh?#PV+_)K6^o+vS_Yu|7`T{K*3Vfjfm@ODF$ zW7#{1C?DbIG%cWbxC6IU?-T7$8|6sj+haEkC3v`D5f2Azy86kgN-uYdlW<}JiIyaG zAh8!8MsPe@h$)T|AaJlC&RX#6K&pO4Mi=v1S(UT&o=#j#9#v+=a!zWD?EAvy)=^CM zU!sb|9Vc^n9J}iCxFe6-V)r#G|HQKwH>=@ag%<<(;3wSg!&Yqzid+jZoouZXWZZg? zx`3lTLh^7fr3x1m@24{7`{9rwO6vDqeNLNo>y3oL&CT)D8?tD|#dPu~(#Nvf0@rRl zokH+(RH@G4%4)6?nk&~eqc=}R@Uxn6W4h~n140u7J8$87q_Dk>5;;+cm~&~u-PR;d zBBdIqHC$!fIpKBHm0A@}OCvEo=+CL~-095f8QQ>yq=@qGS1;wJwXiKlud3;VKloKl ztJ-NUt?h7JnsUA(Hg(w6kh?$OnkghTR`kh}&4?e)>y|wA6`rV?cwgaZTYToQvK~pl z5&sJh>k?Ro4c&Pbr^&irW)|yjg?Abwrob9(m_$sF;F2gP=>Gf&;wx~vIJpW~i4*)5 z5>l22v+yg1lCC~IjH`qBj}MVTnxF6?LfA5c_#wo8L+lWa)x^T`lgPvWJ0Ob!C4AHdn*5BRMU3+K{{UdPa;;o=>LWUy`_ayl#ls2y(yG&4(WKA?r_+ zv$9i%EymSwwJAXgiTcE8Dj34PL8?#SwP`$=L3VHMW(t=zLSQs@!4(M25*{hnU%SM0 z3n#6Ln4Zt&Zd(eoBA-ybuH-v~m4CJMWMBRxZS zUxBMX;JHw-K|XO1)-^U|&%%EJyK{sCZSek;xD4UUWHNOfk@0!+7vQ9aI=pbG1H^Q3 zF|SjFy%Ra`BlnvSY9cRL*f*Szh6Icxa|-8Ng#5wm>Y^B8A4+3w!TFweR3d8xn@4kC z7}h=1sEqfDU&t1nT{C7o^2!oY75_%u{g>c@ysb%mOZ@zW@OlK#V1-Vw)~{%pqH=2K z)~dc_Q=VAG4bum)`glA~svg$|u@UV|DG)wPR-S~z3_^5n&^VS?rP-um+M+C&n5+YY z2WCo!@k|f>iMR?}t;4z|3f_9ynQiXEX%Au5aQ5d32YUU_D)lIw#LfX$mqv0|@Uaoz z|HXC}VSP`Oci>!`w`zgR#qBH3&E`fod`jzXSXXcD%AJs9oXVNI(oI;h2TpgP&ITRM6(gne`La@KNn|mzYUKku~tJ>MXy&(K~-3lDnw=rx2!n)6CWoM{uN$+ z!p^QraWtqAcd~@%^EsX_M9=1NaW!hAy}0WuY?{oy03l7Kjz1Z}`KF}L#(E*XO_eNP zpk~k-C(N-Pm#PzCD_jm19=mGggxxMe_7?|&wB9B(^QU0r>2 z;njzTslY`@8pip2VRxo*G+MaqsC&2i#|cjqYHr1)2qC^5n_Y!tK7wDk;8B71b=hR% zRG{EkjSDf_rW*~Q(ml0XNMZ}DTe8ba3*F~_uLfX5pDvVE>9OM#xY322#VQWG*MVnc zIOHU_Hzv6|n+K9NfI}4tD#i2CZ0d+jDK>Uf7cz#lyNjzD10@}@vm4um=+byD$73!D zR_d$9B^{)X@F9iM&__&;wnAu>;3hntje8yL*I|2Ep4tod6V0V0nw;T6Yjun|+jpKNm$d>e3LmeO$a8HHnjpqg#2$r0`^=jE5A zjVGi6*IMzi7prFx=PBH8pqeyim{=7gs2a<|lSy1aUU#l)@WdEg9a_f8Z@4s+i~kU4 zFZi0{|Hg#_sV%0L*+O!baB(t^zag<9&wKImdmKBc5gWsj%pl>&IARBqH4^JlJRHu) zd?9u`2@b*rf5B@Qw%yp~DBN%mtgCS}O4yL0-@Fk6dN+iGuT|5t&&u!Y{^h2R;Nv0K zEl~k(v?XgNa&a*`GK3YaIje1r@lqijxx0+a;p$RF&~IFE(}AzZ{|%+M_rhOzx)>)n z;jV>}PrLUoC+vk2t<;Z<*vzAvI4tINEv}jwh(@AKo~@ASD_GAWViqAaNQf5FRjHf` zOElhKJe3|>3g!YjpLH@_q!I=07G zlz36TPK+Cu>TykA`MvOcjuX?Ff7s=qmycU9Vq=7jbx8k{s~x!IFSKWSoT%0@Z^MPC zUL>f5LRaF(vStp4!i8NkSU;NUmc&lwT$Yg5hMWaF(1yWiNKSpryFa;8UlroSS0te# zyLxlF7w?*qJ&w4ZYHp1yaZ{SG!A02QC+vw9{#WtQyKv;)#Pl<^uA+%iaiPNND!j87 zF3rd58(nU8w>mxx2`fW-3y#m_A5K?b^-y(ke`HyT2ip0(s^95+Ly?JX=n@h=OObFmLDOE_AZmj*-})puWcy@bDJ4sy6J? z2x-AKbKb1zMeZwmVJunIac~tCGKBn%S3B-E=9HbVBSbi?U!*ZOu~9vX$|*-+cPnlw zfrGlL*2bYLtN-P~KkP^mva3^pdwsDB7LH87?RWBe649AUxq|m>G8(YXMM(1!a=s^A z%|%n?k!yD+O}RUFZYZ2)OP*Lo)z$8f`gk%=s-D#Dj?px4a}^4v^I|v-4R}yoQ$q@V z<5FJ|da`O1w%?EzFACbb-kJ~dNGlLkt-Grnx9YL#D{g7$zleEzvy91i2uG}i7%NtH zR(g(4mJ-k$rErt`yP9UBr|IY+co%3BXGE=62k1W;t;@k-%I8w=!e4J=H$N9y}xp(CfUrkjBsfNm+JDuS@;kroS31Tw)vPn7^7v~@h>-(zhA$iWx9g&w%k)o zWow>T9cr$Ziu!mePpY2MOU1|)u&u_unb?+N)gm&K=aVcv^Aaw7r*gqZ%5Wk;)Go=Z zNz~V@970B8{Ficn0>&Cjb4A&qg@e>kCY;^feMK&K2`9&S%GtqwUEpH!UInsC{Iw$UBc>M zYr`(eH>|Dw|7a>wnBtixEWgPy6rwT~* z)(h0=MF)-5qGKsP;qwRUMsaICYaN6aBRTmieq-6&-al92PhH<{LI^IJ|D~$vHig;*>KoK_QR?azD*gsTdQc{X> z*j89Oh^K#WFIot+_KC*%*|=sZG4!m_;45!uuo&sn_tN|S>;D|6#lUi9W@u#nmx z+sXtKh~nAWrU*MmX_qfVXYhkoJ=rhSB$3(;n5<{z`og%pk^9@KlYa%M-kqBel7{l%QW(U7Z7&dd7_| z?sLtZY*08cHN>Qn*E@%Cbv%!R0DHlw8+JO1GuBLPi4ksw3-6kzuZZKR-3#ou1hi6f1)&V9yw?M&?p z5yHP`XDPBPvpq@p7$&S9fm>HKp~gM+p*VLNlBwU7F=g?r35j2EH`lDywM&O_MJrxR zEx1sN4|6#-c2W%~- z=&9uYMsyRx%VFaqYJtbp<({Xoxhd`g2x?B;0$l2cO$i8^hM|-=QIuhhA zY;BHbuweI}8iR58`@X{4TG%y~r^R_}D@1><=Uo{!kMX={rTP3Ug8j5vu0@|>nId2!M!uuOG!mH7IEJk8IE}7J2jF?%H73a%xWCZ)Hg^W22miW1zKp2pej0e==#gLdX&VqJ^#bqWDgaXY%GRYz7eY9mx?wcq8KSMCthL?97u& z+;SB%r;@6g#Z4fn7k(OgGxEw-^dV&)C%)vl&ixpVmq+D^?oL8?cFtsDo)Da2ZUphs zRyfmz)aGi}U!Sj9JFfhPkKH-Zp92fnQ~iG?u;?MhlsB6-9)k5x9ImE?GCoVt-5Nk> zvf#CZGe2_APB>eh)P5v82^Tc0#JK2ge9gx#Hinq-tS`lVZy~@=@a%${6|ZYx`!}!6WJ;s; zJoq(PA;RwB+-||c`UEBk$92yAlU-k(fT5i2#kHl}G^ePH=6rpo5IX|Dnq-XS@C@SX zad93m+EUPmJ8d{Pmn+}$rVhTE6KNQ{)+f{oNSN7@9G^N^A`&KPzkNP zWFgyGc(q80keq6yNcgvE5nY1I-?RHqJce_3F|k?~$2cke0|{zL+;18^IrjgGp&rlS zwa)rmSeE~#&_w@#v|zpuVkDx$!kS;oNK<_2uM5Qj>)7q{A~s~UCd-i>2*4KCE=c}s3LQn1w~ci~2$aH|d(qw$FoE|2Gl zkMOY($8;&SF&f&c_x zDRpuFnY=+{xd~h6aX>4D7=!K1)_5ffNt3uU3fHgssCs9nisl4=W`UhPTVUHQP47w( z(2VPjLdXckae(7dHchj4!ciNd8RhE8_ek!4n8;#VvhS8duCQ2&<<8o_&9_ z<0l-4aitZz|KeG^U|ki@T;axFT=)^6Zwbs3*8au0ahz}z-i%TV4ckgw6}Gk_z6P#e zYS-zr&Y_M!@vIXYhT|}SeJ0FhFuxXVr4eFMX!4onJn|I6qlL3Ug3W(?Y>I1Z9`)gJ z1=e@v)eyE7N}`wk;vQHhW64^BeY?i%p7P88LWW8LUb*iAJ3f4d8O5qAiNT+ zI}<;Z57t8DZ^W14Oe0(xabqUd8i_VCDV*E#rYjlVLjDv~6nkhc&l>Tj3l}SJYBH~! zg@-P}i#DA5i9j=d$7n@8+VkjVVp{Q3hq^|8+C!(xjS=^?7Wiigsr6KzHGUY6>Jv1L z=j~Zhnx_?cm@dl2_tdN(qbbk*hntzgn;z^<5$;!3b7|bb={dr^QK){p9)GZ*KZlBw zG8F3$if-p;mVhV{aM@7Sbhjzie~{)YY_t`&RO0vu?lfnob}5WitJ|t`Aw&2OuGhWM z=3J_(1RfPf!!|>>xtxQIc?2gW^2&+?4?z(}6l?ePVtmZv2F6G{vNmU%&S*|l z@SzI(_SYf57ze-Qt&6Zz?`z|n?THn(bm4I=UM}Eyh7j&A`2B<5SKP}Lu2mu6M-&Ak zWFl|PXoGP<-PIna5$g2p#@zs6?eFa9frToo$WUb!w{EDi3g7Ro!s}W|`8I_!*(9St za2tNfIr&ZT1st7XGAyn08H7O~}>?tCtX2M=d?$|2}XL zo+SwH|K_kcC^L@OTSqY!3a?gDOlNwsZ?U?Fk>~3^ST)0$M?p)@_271rkkgry8KU|g zY*FH+Uy=VK@m4sS7m^V?d)WYAci})cyhd_a@$<(hOeVIXsu7E*&+eJrDMxCI@LaY0 zOcb7^3GV$-xJ+UjqRl>+5f3u?FJxpv=4 z6o+ctFrt4aGFNz@`un!zil<;-j%RI1nvd%ew&&~3-MDZ?)D~0DQ0}xPxSg)lIoywx zGuV|TywJo*V_a%IgD4+iLq$$l;4zBe(x{eSX9jX_A(0w!DzY$hl*!sqjQfMxQ-+XK z!PiOHH-~dAHIvZ7@{@Qkxf;iPgeOb2#!bLn9@OGpDQ1zCE4aa`T3jljeq_WS_l63p zPhE5sJayjL_@9rw1?x&Y?2ZC2Ei6AV=nwxQY&f3%XvxQ4vC$50-NHGkBBqBEII#$~ z0O5Kywsj?1@4JeH-zX)f*JC*wspoP=;a?|;X@5;_^(FpmoPXnDfUtGGrYxtaYTCIt z&*NYlb+83H2p@{EvnTt1P^w=yEy)~8-1nSL5v&K`)QSs(wV##dEsCA3^tCN4%Ny&H zj|B@EW!PO8pHxBh+kQJ2_saO>Yk)EB2kdLAws}Eg271mKd++z(cSu#HJU(0eogzD@b8o~?q_dR@g>d)iPl2F zR30zm%yM%6Bz_D@J&9R_T^BZL&9Wa0=di1oVjYDG^|)@qg)~vhwr{?~u{|3-h3M|= z?ZM%e1drsguds6{cY70;EqLh{WaMt2{enXt!o`Xt=?F6RY%DZaR zj{M8}CametneW(QE!bD%>{slbKxC+p)s%wytSE+eeU7)p)||dAawWvHB34LB6;}MF zhGw+hr<>zqFSs`2;ZGEl=XE6t7U0s8`*wmVlhtGjqxHT#L>0nc%Mlgg-Twi{zFhx} z4}TKAh|up?r&8gO!Y-ZEFh*W$2kQ3AAHU_p0(PRd?DhcGKqjtZUA^%tI59U&R;_Bn>E~-e?!txWR zIp{k)264HE${M-!BVZmbfx?Qm9PLX|Z!(qR6eKFR-|j4AnPD#@{n%k9&KaUw6+3-} z=K{qNeA0r@-&HT%%ocb!3ETc9=2uo$xb81(6zsp^>bD%|NLCGwRbcNgJpNP7meIL6HKdbTy*M(eH$_-Q4ssjdN1nnLny#JBJ83fNHdJ?~|whx<^6J*v4 zG{%evhmcScr(D75H(r%y%MVy52`d)!qBRdkv9bns!#ET#Tx-tJ24sH4MH}H|Ngnn< zRmtuW(@ex8`uy7_-_omp`>~TVh*#k9635n5xw=xnBcOVnhpWr^zD_oOvz z+L7Fx)NhnPrrc`SwdV0c9`)p2JAA5;5g}~vime5&RhNa~c-ROlCK6pA$C|9s1yhp? zuP|CnzMXi}gKcwp+=}(RaBj*uSK)bo{mMP7Q{W`5w-uhwC#12i-``o9I6Gl=X{=KO zKRY4(A6D21;W0wyKjdh}v~e-5n@NnLuvfJb4HiDMVv~6T8H3Dy=77r>)~W7m5hd81 zC2UtM<@*!x6MN?KnMllup*&s0$1nLr!x`w2UyXfp0??ROa+wrlO#Se>|Eu$#|{Z~rHSYIG29PA5l6ftBU@PuTuR z>|hkWoji)P!R&{aCY-hrQh(#dpB(v5y|$F@JeaLA=kF8rFpJ*dc1zPe;YNnA+Fi5@ zuzevLw8n}tL^!s9%(CPp2}k;}Jx|CF6YOAfsNij`b})kLF^V+blnawoa&`4j_*TX% zMu=~VW3cGRGk*g6zUQoVM~qwfnu+%srYZ8iZ$ zi1Qcr_vUmJE`|zctEtw%iYdBhHfODP;U`>-6_ky7Ii3wBl7oehDMDI3Y|S~kq8L(4 zkF^729MQw-_-Ykz;{!UR33hYw>%^h9xDQlzGI%-%YT#ilgbia;l5nRAuaot38}XH# z3D}KhbD-dyBwQRsNEaNn`dF*N&D%&!r^fTRBKIb9e58{2O3xCuSkQ;<9r5)Np8Tj* zsBzp^{#AdeU3iH~V)Crb-hr&B#~URuh~Lsdqs zHp@wHYQx!jTDIMx0qeB;WIVxccII4Xo|@4l;~;kQ;Bgh6hY4?Ng?BoZtXVk73Sv4o zh)rd=|GjF|_dz=(MR1y!T#M;M&zl)!&Ea$#c4Y}$RT-|P_#17^LG$w&_mO{Vu8b#k zk%AMR4`R2*u#AAGN~wqUWa}~lU4?aj@G)G-X^2O0R`g))54`?`Q}sz+&P^*6-}Q)< zf-k;PwXi{Yx{WX3wPs8h|6;B2eWTe6`jXhrT#6BV+u_p@r%1uyOg1qlX?FDFa8>N; za%~vv%mCqt!Z{l#Cc7V4-;kY(wfhSpgLu7IF~GM63y~FYOc(am;8a}>EFxwx&pMJh zk(Wd8nnn6Vf~`=K7*-cYy@ZP5dNJj9BxE+$^YBa-&czAAKXI@jVNG#1XYq`#ZnTrA zXzP7fHqX=rA8YGzqciT!d9WN$H!TQY?JwLI%#peZM6&p_XnW6G0(2pRk#2W%FmWA8 zvlil;;*uv^YDH!(E_cUmKKY}0)rpUpf^UHEt{ zHzsH}VM)TS`6Q0vlul+EU(_940{5kr$;$f7wh{^#J!6JSD;CarDKXv46preJZw#I@ zDky|^oj!t$o9j-PaJ?;w%Q@7Zv<5tL6kfoJnQC;#pxCD=N559V%myV=)r@TAF2?P(|-A}CjninC$nI^n4r$mi1lQ&EA(u7+zwk_dgIg*yMb0$IKRMfD_ zT3Gcn-nG@O8x=lLEiox?=aRK>%2l|s7`rx{E3OUGXEnHY|0I4skC&7EJ^7P4-;K<4 z;cS+$%TY*~$$=8w8OObNZDNek^@(qZ`%x9b?);mRwTYXo(lfE6No~RIUPR5oKSsFz z1Mf<5+gpgO%B}?AZY?zeBjocwSx9mbj<#aeIQ5@KKQFs64;!;9U%2oU?!Ka(u_s=_ zi_sdQ&hEu^KVd^Hp8n3}5j<(cn?ya-28EMRLrm}71$CPv9)j(^qz>gxQx>Xw89~0+ z_QJz&*=fZqE0XPnjlROB)>_CYX)62ban(ym(Hq|wL_5X_yR10TfEW5GF&c#rLBf51 z(QMIVA-_E?14-3cXQQ?HungCD;e?A&nt(vzUME#fy`?yrCE58S;a`%OE!bD!?gFm2 z<5dMbXX5-V*XD4#rFsyf!H#th)mJ80A3R1QZ~_htBe1l>=I$kn>L$G{NVFi6yN2D3 z)?MlN9;-)273_u{grpukFUHO>xYr|c z1}kf+r!(%#ixmi;#m717??(G_sv?ngqPLO%B97S#H-BW8w{Uuql8f_d!U{{?FXQ;P z-18EA8>+2$W&$ohaK=+OJBCDakY+5&JJD0i;VXIU8>zzaCaiE5@~dJ$np+-1qK9xu z6DE!3Bz+dQ&0HI!HHhiQ+rP-2LRh@;tTAu86Jp|JFNN~#ZKm}0HnbwRl?ux9I;*J( zv0{y#Ud+bl-!qykt=O+Ee37dsrgt{N4J$5IW?LtMM-w$fW%DgQg-{t#p`M8`;m`rNGPeQv%)44Gnc5^ zTDRStnl?_#x+ZKf2Ma|Zn3zu2BdQfo>v8W35(9)M{gvLtl{jHt6NQaNy9qB{ggwLA z&`Ujyk)`ysJ1^!E--?_vTyD;}R_Y+M_*8NxL8W-g8N z$pn?z+5QuUEqG(b@Qg>vtp$WkqzhqD!u64yZcU7*uwGjiqbvEUs#3{3<0IJrh?}c$ zXQCR9@#M^{%z+5qPxwKqa9tJj1Pgca^ddLfO)ne4uMN*Svt}S$>_h{p*YxpVbW~i% zuyY_W)`F@@i}x3HcnP6pdDBkysR*|d_O-yvOE@@!cV-XPc=kli#nV=JJ%bD8{c1dR zeWOH|{Mc2(c0Nak1+R`zk2ncbu7}R%B>4G>q^R-uyV*ZtJDX$I_ zqFSn+p7+v(vsDRN&M{{}DOAPB3gJ4|Gj8zAG~r|;vdt8MB5%EiNkz;%U4#!!xgVfk zNWa3B)Ll&bU4%nc_=O33zUTT7;@XnDgfq^<_J6fQ`L-Qb=kRDUTNS!flGH(LcN2DM z$KRNDPo2%<@?7h{k)Mfafq#+^oF+W}ohK%4npG@{9#YjJKB~&OUMQyQ?Jndu&^2?3 z%EhvzAsYBg%oCzU<1!VWIyisLy2;!L z5j@QYfKkfr_HfRI3U)a{RGO%scwQ;Oq1NnA7B-CMdb+T4EU%^$`K3zo#LvUEIr0DS zAWJykkEo%n2obKg=H?e{F)u2kALNuQIJ*g|*l$le4!8;S-|(y#sk68@n3w&@i4u$zN1p8PznmgQ|1V#Z^=h*0x3G}>a1dfXAV4C85k{L+Pxg}fj5zlts6_fC{$ z^I+^2vF|T#=LwFb$!3zF}i!t_PVnSzcR2;p)oq8o5~G`W^+SwQF@+@>nJ zMJ3Cu0;#$xHbr&6*p??&UI}8Qx&^4ur}L!hXf@rgYe&QjuAF3!hSG^CKFMWjTPAICuAup0WZNnUC3+8`5L_c znoVPs1verKS+zJfnoa$1UBKoFJku%4B82X0y=(QZ*L&QaH^P~C;fkBEu^Vf?2erkm32xcK(b*I< z#&57flP~sT)vvtxm%vt>%okP_BX$^uw##4ogB+rbq3(#l&R^@7oaDmK0whpfzbdIHc(vRSFke zSut&l(_T$fQ+2&sh5u1eOdFe#Iat*a`HbP&|92FQEha@_giE=iyvGFXHtf~R4cU6&bZT5Fkp=#1H4s^hw2X;eIgx=TPh^VWSFq0bd zusMOD!izt-+D{GB7=7&U7u7;M`Y$$k3wwfu+kbJq7jd=O-W=D?xGW&O0ZvY$m z;MX0W4g@bH<4>*z3Ad`TN!uY~5^P@^KGtPhmhkjTd^_`^6LDpE+l;*aT=y0wMXdTR zgqOfyd-BGe9Xf^m#Z^w*;!~FL-eq|FLsFcm>J-&s&sJw#j0g0^F650-j1^~3;bgGj zS(S{R30us&JRul$Nn>EMGeT5Lf(Ks_Qr+sMb{$mY;YsiA@N07Oj2u*%Ex& zpB?SkKa{j4xGR~!e|XxM>p8;NAMtPz!fb@ABh=4~Y5vtdf`2XS`?5xXG}DQ+5o}BI ztQJRG@}UZsZAIxO+-Sh2;SB_OK!qe~7IE-)3`ZvOADo5cn6_yWn!c*A#8~gHwqyMpMfnqCLSbmZv z_G`wI7{M(?*iseSA^0sJDNS$`RyX8QmJmFjtKLFCmhHZb}d#9UKC$$ zw>0hlm2{2V7X4LB0i}3m=BgQ|*mHoYllU-BUBhT5yxQ?JK}hPw0S94YcTQH-{WRBS z2@x~cHJFpJLO_C$S%J4BIP557R>p2NFM>oB9j7nDaRK|5u+dv|(#68^lQn*Jn$|YH z_y>Fc-iY@>z89zuSC5LTQIX696pqrIW5De^CFrU<$HIar08-}15% z5lcC_Oo@+KSQ^5qeP!1U<>5R&IEiXOaG)2j(gYRp-x!PPe|mKZPySKAF*@hbt%z*E z$HAPcLt=AHY<8@S{UmOW;!3!XmoLPFixr`zi0nfC0(MSdwG~I&@njxPhVf*crYz=~ z!`g0zbK71_F%!5wfD09{`HlV6@L5Dy7w&$K`xv&3!)`biekJKoWv8}VaNrv?v2No4x)ACqyza`TifjrH zoCb2T6YDDARF11td03o)FuhrgaQU9DYT!m!GWG`^w&lYxE>$9@B5(g=?Kqyf>R%f3 z;ZNIhvVu~a^A8tJs}z}f)n$0lk5egvZ*g7^SKjwdvkzoswrq3~o{i>d3v#W6&ExQK z7D8%}T7iw0Je`L7B3_O~fi<_y_NB-n6O(5#MY~wj35Q@Iaygm5VOs(38CZ`X{TGyw zM#kTqsm$e6!J#5I`f+3yAEHEUAYYvlG+K-cN+499amJ@h4->T%o{!;Gf^fSv;km+E zRhlu2l~t4?RJ^U=F_m1M_%LD_c1uWg6I^11ER`F!;Nei-RaEo*UEwS1Af{joVte8l zE~?vqMh9M0AR|q5c(A@aE(t<Y#G!^HLB3ot%&x3@We!|`oS~5wAYpl)?_N5A^9EI#wWH<<35yJb< z1T-Q^GpCFhx|L?f%(%U_{Xm+%5MGrxOF7yQrw*vT+fT+Rn8IZuzRd{t60ZHE@^=p> zso5~D!~42&)EJhgSE69CLQnGQs|tl@|FWtLYodg(?$}l4ptIm#jhz<%N7h+~S9LsZ z{F%!K5{d;YPH}fA?(Wi-0xj;=mKG^iNJ2u~-H5vz?(XjH?(Y1a-TTdx1Hb?7liYjG zp4~mOGw;0fj=GW&Nqguc9BRtVXi<$ZqTAsxpQ~L+&Ja#n3r|#8L<4-I1^Z68HpgS7 zkkVIO#fTIg>_~8^aJP_7(OOu3wZd+tc|4I*WmLIVLUEPcb(+YE+Uje@H)->KtamgY zUw(Dj9wwasl{IG8u<_;HYb$&xj)NtR&Dj|&csJx#Gj9CL`z0J|rtHxH;gOk)VGKGS z&1H?VP@fBnun#k{6zwLeVf4@22i?SUtS$bFaBs(&AkjFr!wA+aBf(zyQk1h3xm{Bs zx=&{kUjX~XTr7o3V`NSzsI0n{(F#VlU~^6N$9!M-&zxfHD8!Rc;p$S-7m{3nPeGzN zpo55a7F_1B)l2yB9ibh0F_Nw0aGt`=a8cwl*KVvE!a98?W4d_Vd=AwiunBiuh0xKc zR?0iO@W^Zv$LBrYh~R9=u1JbPA%lc8FX8-OIF(n2$cCmQ|INSb1SeNvwTlp7D;$p( z+P&F28utpRXxvGcdpFFxV+}Fg>(8w&obJiWpJ_wj46ZBCe-iI4l-k`lFtyJg+^Isu z0+f7-T|pJ{t}4$BC*g8cuGiy3I}WD^p*lu0S{S8u>(GR)t;m?cx!*Y(Ae`0#WZk^6 zR29>$rtB+?|G#+s!=WhQgr^WPmRIxDIE*mUxruBW$h~CYK&;?aR7u^g>&8cKVXw9D zu{+kv^Pa+r?{Q2L4*#Vrr`Hm8_zU+N5mSi0D}@&}f^|vV&h}gf63vH^@obHsK|)`4 zb|rKU?lHo}DJnKU*OVQjdHy}So8a+1JO0I?B^iJ4L7zRwajr-fUSRsm__>Jo zDpMDtsElVC6WfK|R-Dfg4iw==53(~vRsI|tK-Pbpo`7GB;NUL=W(c;H*pJ{qEd_*H zSe6=-H*vp+$+iubl^~B&9k3V9OlI}>q}9PbS`?hNbsEougx#fhHW}9;_*>xmH?G-2 zYH0#Og?ry|W0mlJCQtq&M`ymK=UslBn8GITdOj~4g>3=C_9}#fqm5wm2j`dI5+!^X z#m#19^ygDu9=GSpFKq6sy%zia_;tszIu8_kFjG`{`l&^n>QB-_Ht6JWpS(MD7SrXP z91IZxi}U4YvMO+<5?S{8ZQaz4EtPS!6H>n8awly5;aM&21PM=m;9v(eBgUZQc!uz~ z2X{vB)=%(IQWY&(nJw(9r-z>4re9bi9C7eFoP&fFQNl}mQN#fyD;gIhTi9?IO63WK&08j>ok;XR?JyO^E1CY&EQhay3vm8Y$fS z3ESzMS;XVvZ1ER$ux|Q^!#cD!+M-Y!;aojFR^t9*p4Q^+5BSy~CSKUupA{w8P>b-c zidlcWm>OQ_RPL8ovypG{ZqzirD?wy=Hh<5$@v3jj%|YrLM(;JVI$r-@q-4Lwr+?2| zpr6E~BCpd)f>)T3rbr4lf^yhz4`bf|-gYBZOAOGc-?z{$L${? zf8j)Zo@NRg%x2dZmF(-tg*sf-BEZIUq-ty6RE4m<>>R*@M!F}$i69}W25VaoKaBqB zo!s;nxuL?b4;&BaYuD{yuht5*m%4e-ns zY+{6a6Nvwb+@5S6qIxdwYRZQ1h?>ErLahFdy*%Z*Va|HQH0N;}jsM7XhxvpvZ17uKq%>0c7H)f|v_>F#3MJAw}ld5|O|3}P z4YC^#h$qE4n=HH-jjg?~_7@yxDeJsLR~Q(lUA^gVm*C?iT=-8(N7%ODc$5&=M7z@W zE2`lby%2{6>MzEFF~CU(TYy_}-n7MO7SH^Ipg+0Ro{u^qQ=^P!My`~9`{<0RhK1#> zY_W2!qpcs^UopU+m!7mTC@e@{_*;Ni{K+?Sv}stsJ?K(_h|8M(rt5qzG&E7g3W zG?#TG`E%at^%s-US#>=lPt>5&~+dlk`p*&P>Fk2YaTFGEbTIw?jEto!fqb+j0^W z=w&TRF=A7uXceAsBo|+nPx+DA;DSN442A# z&cdr54H@ykcm4)^5?pRGsYih7_tZD${-IP0ZaO$fnp5FImm)YMo0yT%LsN>AK z5Z?MuM*FgBISx+3>IqyfN1{r!>Lj``C$Uv!!G;lEo!3p+x=2lQrMz*J64RHiJjoK) zSPPFebKkf@?e!aI3=1QIg-dmHd&w<**jb1<>|aKZES?bw(g*ES_3W zHy@8XSlqD>$E<~fihBDU>A>^l>}}23A{^5ULE}l0?jfwxE`rf#Uy&_*?nkVKB8^|S zU&`%Fy~u6z9<`~MP7LL(%7~68d=y!UX5{#AIj*%M%Uie@DtZsAp<7sfHHWz)NVMc_ zdmNnvN6qFkI+`zwkT8Y)_QJEFTxrCr_NajQs~o`Q;-;jU+{+N$bdig3ffFJG#fVa( zh!&P#K{;vv;N&MHw?m2Czwi)NSSa`@CrP+4iRKEtNo2OLu8^vha34hKTrO4Be*8CY`}^@kuMoB*3fYT@=&QZL zZv(;mS|EXvTrQTnrZ;YY5he<2V=Qsv@rR z=51A;rwYLh@#w(ENn}mZqGQ`FNuAElUYswhV!3blr4K`e6oo86mY1+IMYL9zdrS8C z3sDxzR6S1QDP>iWjwji(b-5yg%SA=6(t5+T@G zaHt}8Q-$}9SzDS^SG{ZV{R1&=DMNZy{3C={6*%9TM0X*iIDVrD%M`9QCbJXq1-Uk# z9nE-C5SNK;x8i(vRArgFpJ1bpdm}vIsl3zTI8A16EskUfb}7Q%;T+Xvj7I0^bW8l< zv&R4OeLFFo8_wFMtXV1C7)$C@Rm=X(k{;r-;yW$* ztPupGNxWrZL!4l}lq@UNY1G2i%TU$73epg>@r~JE20*3_dO9ZJ2OTDezZed#td855MuS zjk=K0FZmrjxmlw>=0k z*N7SMg|x|Rh!!>_i$0FNsUzS29T~&9+>!%5c-#iJ#T@F(=@J|r&ZWOt9V0j<3b7tS zQhg%agj-W_juu>lg~#EdE@yOBuNK06D7ng;N7onGh6|sA1c(24J4~m!PUi>#Il|qJ zB>b*NvNn$ezeX zAK_r4@XSTH6)s$D!TLW4(8tfDy#4W;XnkLop{(qVDo*&9ZGUpKDQ8=-KSS_QGA}A! z*@G-UA+jXl%W#Vo*3=_xG9JD705OG0TcNdY66W(RQjh(cZrjHyD}vLfKD=Ja>V_oP zh_bWk7wv7ODK_Pj4ec2kv{x9h_5Nre2(iwdl)MNmujmg4nL zZdb)UT-X{ZL>9$=8mB9&p%@SQjcI~yL)JzL*;9z=itYd7TOOK6dNt0qVZWEK<3CnK z>d7|(mC?U&qNuvG@yw3?o0EU@Hbi*bmZN2LR_*y*0+NNq1+4GReLvygDDG)Kf-#{T z<|BkQ<6#HR2bs6#Wmmzw02_*Py)GLUv+X~Ev=eW1Jde-kY!m&`2B-!}%Sj3oeA|!) z(HiF+lef^nh$(pi8yhJW!M&xt@el$>lGu#6Dr$(2P(<qiT zm?fVI5KxrR>KtlCNNo=Pu822YZMa+!*Ah4`!LuZRrMXjhElRXn`_&A+ zCPt&Xb)|5|UH{oQNh*c1cATTrl=+rKBKvi zARLPko;nH6HSk%+1qb2TA~ppIj%~?^7gTeROXf8*7He&-t7v4mO5jqQP2-dmwi`-J zQJ%#L=i`J`Zo=`Ef@3YV%;iZ(MM1q?SGT(S=qnoDzFqNu=$SE)dD4z!^$4;PY=360 z0yq|1c@D46QZ|U zoxI;w5mVR%B@rG|fmcm98Y1}pKFq=c^MM?{A3rl;~N9z+Ydg;3>UCv1iLmYl3hS|4%; zbG|%TVZx;%+9pKLR`)ZSrA@X%;4-pia&<9*6?xH@)StQDj;K-O{DfUC>T$mY$z|0E za-}pc3$ZgpNU~yG8!elLC z=QtiNRb3e_mR3MlRtpX`A=pOPKZ6`y#A$SFGk?Zz7Ec%R`DdP0U~3C@S5?}e=e2aN zajMsLV|#rz4#Tq@xxbRu1O>e)S&sYDmC)Nc6~DH`wj3{2XgHcpPC~A^zS!vapHa$) z!-#@oy?9fQ2X2C|mN7T(J*Oswn&Wz-#aLaGtCLvUmZRgipCFp@toondpM}j366^CR zNi-^EVOeTs-kzNxreqZm7Q|Yy_}X%=6iJDK(*o5T^V)KDTH;WF#Lisq#>L{q{Yk&Z%~4xHrb}yd0~F@@WJY z8*(F7@bVPycW3k89MzW7xDQvhBQj98@4s6fcg?0UF3o`g#I_-h2xK1tMt4{D_p zBSGwSSMK~k>_6NsLP}dy#m94RA+;S5e!?-$Ffpp4t{BOeHoOQF0^6#<^vrZzzbB=d zN_l)7&-*|jq83j(9U!pdzL(f!yyo!z0rnR#sZMV%>O(^W_Bq#xK&3HKu0*JCpRo=2K#_SJJG zh@e8E2?~-px{!nRg7-9nw3#$UH_0{G(SVJ!SnXy`N__>9i0Ro1A!C&gs{KIYG(4%! zVIA%pgCUzze6iquqM#~LBEILOs=W*o1qg5V5>8iC$Ystjj#{vL40~FzCsOeC)2D!O zGjCsjYHws=`4ud4zadX%b8niWd0JS0_2h?_v8e@FEj2^)RZG^4=3F6CmXbc3yN%c~ zTK&Md%}%5Xn?`Z*H&RM+qbN_D1&8@OQGLw+AVVJo`E?{>a{F1&(S~MhF3a&=#FxgU z5w25s`Mt(|PH8%q(cj(CoTyIfnjgFJ-bc7Ki(N%I^dHau;p}1stZWiKYYfe}Bp!u1 zs+@{SB>koL!Z#wG=bVJiJy9BU>xNF3S4(iw+z-;2hx_;)_7#b2rJe1MJ$Sd63uRbm$>U_4_yf`VsvL zj?SWL>o4~qy*W-ZG;Jzq0Be$k^W~JXm&;PZ8>$LG54{9N^3-NOjfZ&s#Pjytt3YD9 zu*XyHHsed~sm-Gig!NZ6{~+O+1-k~Sp&7S=Yb}nAQ@Np#!6eLK{Yv5559Aiq`ygj7 zclBm78phnNd?~_{AmLS49{#E>Xe^Jq7p_Y>5BdsWt%#nCOIcPn;KT1+EJIXdP6P^v z?1c42c;z7+slb}~tce$%>nAn_%zJ%>kOpj>M^tGpMF@@ab|Oh|rcYe}WHGyVe}1>bNQnidJdMAL{1fCcAJUY9_gh)k*SAHECQu^%tX^ zahs$#nyRtf)!sNLIh5uE_v7Iz;jC(MHj6#Ai0Nc5p2^CU@(~}BRPjtiqF8N95Gyh4 z#jIQ*{7;r|^80@U$42T6v>f z-X7ZUqt>;rb)t zYSYvxW0{>R<==jGR9O0+Y_ZxqS!3zy_v9PC8gGVV+w zz7AUpqLNVOej~cPjw}0~o znTf)QS)9)ij&|h9R1Ud|5@z#LwTx~;te5cAM>y769|ZUN;9P{0=DDS6 zyyn(}j5&OBupP4zuH^`y+H>Y_ZcHVoA)nKPql(@68wa)jZp41BqzGI7BcmOkW{^>W z%gK7z8Y|Q`x5sThj?qHoe;jW@Y7sVi3851SK=Wy?qzOv)e1(HxXUYCJeTj~FQ`1sR z8UK*2#%<(2t*kC8DN)ZyuakeQdN^`vw?|$P*5w3*@NrQ0g&zC90H{#?N zjyL47ek+WdZ_ONas_)L$BmW_92|+*eYB3qZdAooYVZ#1$stJ~7WnSrX)wmvZnL_R= zAu3r=Xv=zQJtQOip3;WfK7!kSxGCjbcOhkk;PMlxZMi&%;}OC}4ZjaB>aS34H6VfN?S_f zVde5SN32wO@^P5prvV+~3A1}RyBe~u98dakua1^rKGudS0m8l#-2aIO4uZY6aI6t` zf8oSHjwcF^x<=4w%Du+%Sjiux2``4KUE*RQY6KqR*j`(OUE)2zn?k;Rik*IB#%u*rV1Oo5~D4A{&D1zAh)W&pM%S9><$sOB?+l5`K-Ee zj8`w5F-nOV#C~VtlqGN7g}7F%AI9_H>RUz=mRyTli*fv&Rhmm@#C6>2CUc#Ma z94krMH1;%SeK`&f;948yyTuOXVIQ6<@!P*i9m&dWoM?$dq(*FBjbhI%vdz4h{(1Yd zo0x8m*4d+=f*h(yRDBh@olFw855=YcS+hx7!l8a_@5QBw-0~467ZGB`ih`tu=pARA zeH9dU!l?|;7VrvUim95bmG3I&ZNPHvK@j zpD0A74Y>|N^c-?+gw2E1lpBw+?KQBQ!3jrU)sJ|VRhscPMv^;C313|rg|nNGJeOA^ ziC4)H?Ox{NKVpjbhwOUT4d-2e5Do8Vapn*158>fo+^no_X57AO2l1{r!T;gcmlM+n z{Sh}uVQ*WmsmiS&;pAej`U&yAqTTnTQc4!ar4J_-;4oC79XSJW)5vv=GL|_?@#T1i zIQLVEhksh!KZpRu5U@oZ2a7WH+t*WC}WwME9KXIxMr$hVYxS3thRlx zPkZ(8Qnr-8q)+?dc}p=+OmBWtWFV*E^C$1H_RTlqTA+4e>arT7> zVcx<+Cn0E&x}))Rbo+;>j^y|VN3>TkD{smsifPYu0y2b`3wY@$ToYX8@T7ujowuQx z?nIkemY217(^9n=e>Rg{b=lRBBroAff^dHxPO3D&F?(h!f`MCiZg(d6H+K68_Bx0& zA~v5o^Q-_zoAA1drYAX-C9WPWAwp=b@MVRt;SV;s3xPk9I7Dl3trNTwjDzfH~?boc9-9Ieca*G2ue? zETRgjOVrAH&`M(3R-4@;IoW~tF1iPViwULXVqy6eg)g8b-s+Tb63+dtiWv8_#Zh~kuwo(}0m8=+VQotVgIHL8wWnUT z=2U>NCRjL@E?ECbZZrG~;;geb`Chb`j#gpYVj>rCup(;;6@p|y7Q=DbwrH|aB>2#75AbFIel=NtN5bV zR|(Ovf}fADt`2W|t7)i~w`k?W6z(EQKXBcAB1S7={&S7gH;iECCr{x@K~g*OW|d&= zDEKc$^}{<>j%!Oequ)UzzIqdtigfr(wcb(9BtEvnzJeBPy*(Mv)@&V!cb0IX5}$-C zQ@N*4Qe!|E79iyOfcr4+bl^q$Q>PdEa?o`0B zEVtc+-6c4)fKM9WFrtzl6$MG1^H%In7M?~5$HRnmHA!m28%=zvQQC5~I#lCsnQ9cW zJn@57U==Gdawl^I2VJ&h)WA?x5^s7E+=Uy9ac{?q3C?q{e@39qFmSmcEW~5cz6r%GK5y;JLsU{rgh0g>M9fjw?+L1IGddH!hsz%UsLSjWB zIeQv&Y#MI{a=bSxzjk3H;gea{g!D0Z)x=((6!|#NonofLDWVGhGXsT}BS~q;-QRJV z!|CG0cj4I|T$|3`|DP}mZJ{Cs_fA}~6+-4|)z`Jf)uI|1|JSCo(^_~?0XIM4VKY2` zQ=Q}wO(SWQ@Y0gEjX6D9l{4jxx8lNrX!s{L!@fJ2{MvU=@I#rgP z;|Yrpwkr5?2%BbN(}4Arc&VXO<12Wt6&Y2zQH%5KIPWZk6lG^!HCm&4a<2fXV|b$x zDPt@i(wG}Rl9MAijpac@c6jS$n4Gsvzl$lW4DZ5(q;Wb}SB(CM64;d|b-60|_8m!T zLH0%ou9e8?$HpIVNDwwwAg&8G!+2AZ=gSD_%KKJ?sSY5`Sv7$tv(x~G=G~=_m>e^8 zw&8d`zW52&-Fdo7xSK7wHRJQo*!I-YFg`!y(Uz=0VgGb4)aF2Q(u=8$pkj@0wBS^~ zkrP93nXmp~^gLp+gyaz6xXue3ZNjC0Ngu{de<8twXWz3f(k$EbsWdKC2`bIuDB)?k zc~u-81nWq1*OABm!m9~f{sqUTyfP{3!kt!JtH=94*cLAYlvabt=Ok>d{oqG#739qV zRl}mS9-46jc1~lruFx=!*P}LX72VCuGc&HLO%2r{WS`y=M)&lzPKX<$^VJho<^SbQ zs_4_g@~ap3$vDo(3ijXg5q8h#Xl>U1sCI>$x8Og7{R(RQ>OkIGRHd)%GKJ5I#5a*s zb?{XFp;ntQTJPL}tS-i(MB!Cy1%(`LgpHGMbu`D*1;?IhEXHB_S0S)ASp`(lh=t`> z=+2=SA^S&Sql7hGxz>ZnLvWjpt+kNenTyV%lIk`ch_e&!rVEz}a>rk|Jx4hV0Sid} zgMHqDgSMtd2W3xLHrM0r09}c`;a_!ME35y>+gga}rp_oBGsO=7;#ioB#X6gFM|coDB)urGR-AL#<$pg7=bOhyg;$I zeJnJm=Ba)a^N|KIZTAtyIEZP@ixmCOzIks@7cm{_i_;X8R-Wf{Ql^q!fXKh`T&UU* z$Cl&bU)*X%Qb+8o6I+wuzN#nMhI(w#fvMp(VFag&N*BJU&-qYwn;K;-*W^n1w@>U; z)VeQQtdd4sDTOKZ@p875zpNuqW8`wL8#YrpG@1wPh-k+CMXLD7FHl%LnxqzNpUa9| z(RRnPKMrl!;3(W!$mdd=D9noy91IftGlko;iS-s9+X}Z=34zsEW9D`m+d^%&!oDA` zzvJjY*3INb305>kwd{(YM!-nkhYDND5vFA3X6hzcA>P8?fr_oXtuq^X;8>n@|8m>> zf*CQ>bXC>fkdyV)t{9d#*?q<2Z~fl3r)w#w?<;J9mw?tY_}qF z2&*P@bS@hUbA2(7%p28sVg&!r#YMcd{U07)P!aGg)D~H*w#dCewMCu`wpwMUfDI#x z>}$n~Za7(uHd zrKvR8{%o;|NEdAZ)aNVNQvQmz07e$d>*)jx=Fw1<5_!;^)f2G|5KaxF4vr-WZp_*_ z+{+dmTk^?SI2kJ3n1f9tqEm!*xq?lU5Zi%7U*UCCER0QdH`X=XQVo4mg%#a6t{QW6 zBrHLQFmXOgc)L=#Srpr@T4S^@JG${|mEcia$)4E$h;KDAO#jo)HUe9zBY2)999*Po zkfThvtPsvLA+?N>c}Xrvn5(EF^lwh4BW1OihfOa&kH(`nS9)-EntH+rf8kOsc32A= zmug@vXekks@OKd6X0hiVrIT=Do+`ILx0pkk=xfY^CyeAlys#@3 znXRSq)3K5`Iza`5lOdyO8K3IL8Z{J%p#hqFO1P9LBCRO$@i~ zMC?LU=V7}TTX*48cQtiJ|KL$^cK^(g8Cd_oI|t!lpm51n*i?yU4ajM)zHfxUL&HUT z<){8uGNqUQVSSSDWE2tYRg&?^G+rw42@6(E;PoJKoOHcQTq$)KW4+{-;;0gVvnAM5 z5}y^Kz^Z_M3D#bk(Kpy(Cw%Ut;&H!{cxhz#ue|qos+fF|g>}Wq8ok>Xy zGeZtV2~TW>tt!v1a_mph+vBTHYycN3^0^7Q-;-61ojpjMgKAvzt_rRLIp!{O)fEC^ z)o@wB23>b+H~ z=km@4+^NT=KTu}JuQIld!h5B9Qj2#{f_*pDg-%I>9GF1*3L(c?@OBsWc4U_h-&*Be zv!R&6CX%b_O9O?Bg+%lqxIQlz;ao-K?GIJwdTY*^3+;{X==FXiOyqn;*4hdm67(V% zoso|XloG*lvzKCg%8i5gxJ*}pes0I^-?24cJAY{d3!0+Fs=Pw7`5ZOA+YkTJ>I&%# zxW7U;XT{1wWLD&LqVTyO+y3BWoDjX7<8#~F67h*Tq|)eP}n_)l|h2*96rPd9;t%$e_XA@>FPZH zf$gcH0PiFV-i~9P#(BP)jELr3auQBzlhQqJ?%Rne;2(~U)3dZ`IG!oOOLgUv-0jb+ z9voM7U2Rm~w#&u&P=pojNVU;3{cGMe28qd~5$As9^D4n^6j2q~6f4+%&yjZOY<%_; zZ#ttO+#Lae({MhF=JRAFllx>aucoqh9=0=hIE^)0h1}@kUFxAG$yghNpT@i2**jZ_Z3VRFU^`s2j+rrBa+*Pc@N^8Pr>F}XeaH7rNv)>v5r^emUL|~K z#_Loey%fjm@V*tRT65h~cs~e-s>F>Yb)>q2Q7mq!n{coi=TQi%cR`%9gs`HxOyh26 zE?98bS#bY@wcSWnwb}jHQ;5u}toIkqntjrqoM^!%NbvkwT|0lPI~H)s5F*lqhvik0 zCR=kU^Yf!(@($B2R=s*^KPPL2us&OGs?Dvb+#1C@Cs6`q-vs<&r8w*(Y}b9(YvnCx zB{3yU<nV#!RcWE!X;l()burlu^r9c z>AdK}$K^yd#^VRh4B}mTE(|8UI9HPNO4i7`Zv`=38iVzB?3hn@obW7J2s2acjj6~F zUAY}5+$_kgY8)DX{|{^(!uc9XfGtbgf1??_^p~prNNvpS?|EuY-ww~a;XpBc_!pZ< zA=gUvJ-8AnT3S0`AkRXDO{I9-jnz@YsyZb9$${bo*bCd2v$iyTt#}Bx`Vg^zJ35Lt z?xp=d6W)UTla={imnL}E*UH~VTC*WaxUhtzWKmAtxmq}f3Mcg2TBD5RdgU`-b5#++ zfo!pIpRHX+_3>)9l)tK7Mq{o_HNRc2Vu47(wLSM*eY?UJCX!W(1he>HKEisZnCW4( zaIZI>Ef_;4T&|=oz};w3l=Fakq>Uo8qvltH&0t$G_Bso%QLP!T)*?znL`I{yr83^u z!s(H!;Pki!NB&mXhLAc+{&z8H1=tWEJT1<#LB#hbx(x5@vbqvqDs#9Whi0(723z5R zSp~&-^gb*}R8_({sV6gT(E~lmX{(~xyH#+tGYe@2YHMLU0d_X#O$)Nkr0lYJ3tv=B z%4b%ch%78i<)1^21+qF4^e-C*^UO~7GTvL5=OuOD#)#$ERwd{!6szx>f^P3#D5ZbL zDA9njg>qD?^W|qn74!Ou&-Dop6t)!Mh!#{ahW$4jgljE``-fwyNYPU``#TSNa@t-v zUJKV6gl7pGrmH8tXe(qn3Li@nGMT-@u&b+Iz=(;e^l{BxcGwG9b-6l$FHwTG)>JSu zt_~08Rs|hAp8XD=IVdqDpI+=)LQ|zKrXUS(F#uP!O(#D=NSDRYF}%=R5=@ zDVg&NmnY&@mKD7@oG!fnk&B%Oj1qbvfgSXDf==8rX{y`k{?Xo1o%6Fn4Cp ze+9&JW2_R^xmcOkX+q8{?zAMRDc8b9sk}b7;L5M0*y(vOE^N|NZWLjQ`Ete+{De-r z8S@?vzww|8F5~zzj*G)tHHJ?O*|1Vn(pL#zn$@NpU(TJqSsancK6JkdO7;n|fC$@MBn_IHxPYx90c`4rX;6s>ju0FTs zk=cP$136cahrLJ&7pxId0c=@3l2^ua4aXMam7w>vKP8>K3vb7@r`=Zp4$P! zgGt<8gp(!rOazVPn#Q+{w&F;L;8u!z75Ur&+e{&=5-CHuri*bJ=gm$nF&*xL!yJ6U zZ5XQM(pwkd(lWgN#jXern%B}d@9SN}^w3XO?IgPR;ZRqiQv~}K1PsTzmm)?z8^()Z z!D~7}%QTVdaf)y&OR(0VZGIY0Oo|h3Gn5r2*<~Z#u@}W_^H)jx!CWgq+%(?I!AqY- z#-rA~GxvVvjSl#XYoxSfEG!LpoS2?hJ13WukX>mj^P7uMEeb7@pFkVj?lAIcMNQG(YW zYp{@4X6MwnXB3a^lFq&xt4MqbvvIDLuUu7=9jU^Np4@O3UY1mE=9`)-UuN-j|E5ja zr!<~Q*V=JY&1nO6EhKj`@lCk~$;pDPGVK-wP2%Nj#hF@Zw%f+ty`g}*ff0gy)S9>& zY^ctQ+IalP!GdfpM@nHuOSZ85ioUtSPY9{Nj`5@n!=^A>E8*Eo0VXe7aHKJBN2scU z)8jbqDx7c?)}{#?i>jStt+KH-%2;m5mGYbS#VH5#)I6(8;Rz7D)D#Xbve>z8$E-i61ADQv!? zqaA5VOfLn?JuS%NKHTZVW8DhMX9sk{zCdxjmS*qezPvGO~rI%kfPY zyn=k;JY~Hb;8TrPU05+n-OIS( z=O?JY7@4zsdXv47gvBVDcxbTjWFns$@nwbZDoeQ79h+kKCJQHYrGU}qdDP+U5FU)j zZn|ow5z~+jMYvs*oh>zw;Cguu59ieiA+Q5me`jB&@GwPKvw+l4;evt(Ym~LzsCI!( zfP$t^WQx@xYqbsXE!W0e;dO$L@GogCRjY25Q?XkqWDdZ2Hn(-?Y}^R@=HR>x6@=Vg zOiD{W{Yus#o_dS&94suqn$etYB!!6PVR`juZ-{VZ8W+Q~g)jo0E5;JFkb`bQ);N+z za4k`ISd^geiJM1^yZ*j05)rfUoJRI{JouHY#>D#x zH+=*fP0}_XW>7Ipa>zSHqV-Hyc7ZDai7Ai(VQE_F)OwX#KQ8cX?><9 zybSiMgv0arI04_j#E;Y&S?AfD)NCRnwz9DrpC@rURS2)Cx*#3+ms8EyP?bHJ^xrM- zrD`iCr5t{vFVBm!(WC{Dc4Y`LRk=J(b?kaI0PE)X*HF#gwvQmII1kJ%UyQ!_#|7$e zv#|UsgwI$d9GyVmQqERak)(y?S180)H(}d&_5=uzM=NRSqjtih`s^-)>Z-c?H_rCr zxvvn_mxHwkD}c?XK=I8`zgYr%9qWQ$p87JY}FZ7`#T2@L_QIttI?JnM*?0@rG~L8xGY)$v;b52$*NdIO!trEbNn4bGj3QwbcArWK5v((oXj^)*Ynbpj zTJ-Vr)=vl>NKzfv_F$iW0^`9DtQ4VZD~I*`G;Va@OrUUZ3J=qT>!o>B9=l?sga|2h zSz*bRUwL0&&6cr5=5q<21PE`yKSr?b!PeF!m*#wFT&j_^9IsHpBUA_;g)iLk5yCTt zE#ZPoeb!dt?)O}E7UJy$yA;8zFt4>+Z#?P_Rn#I(d!2>HlUeN}IQj`$-O1HqL_V}6 zrmNXPmO1HXOt#)@&B=+lbk%#rw*~3lIXI5pf8(De>~IsdTJWJ4F&UzoE3cbE$PBKV z(^mP*E2iwh+%LfO?ra>$s=3%$3s>smp_K*q%;9)ld@JKR0i`4}lZ{hY=O^5A(2`ab zMm$qYj(?#DvinAIumPJY;5n9EF+xT$ocnXvU%2{%s!F!7{Oa-CVuZJ=w2Ni*TSHe0 zE*`=;JKuD8pd+wP`Moi!?Qwjjz&{Fp4tZbfzD zjn-|bQO0s}u9RQv>ZJmcgV|zrW1dF7)yHeuQvRAozK!+`u1(z1 z7)N-YDLk0T#!lLtrFBzOmydqJ`k}aXU(e(yvs*qiftGdOS z@lCv^tBOjM%Ck;|?-Vmxn*qjrP((~hr|IxmZuDaNRCO1l+ossS!IQZE3#TC?RY+(? z)HH0$<2xRkqJ$RY)pYiOg=MK4dH1OxrtsQ?e@{RmcGf4=S{O&Xj{1!jB{WJnGJ?y) zm7w3lqWJmG%#( z#KG8P;g-%f86VPdAs-_}*_1d9gMFVj*kWSJZNQB51*C}GP7%kT;joR@NWAjex1Ia1l1FV2EPxbWIuU#?o- z5Xy-udNSL?h0C>-R>A5eWNNC&*t~BH7tay&%1`HRlS zh74zaQ=U}eZDnk~!!=#lr|q#3pzya79Abo^X~YfE?AZ$)Io%Gwo}@J9)c302#5d4+ z+GH|f^b8meq_pz9NfPY;;&q$4qll;!UWv=;J#AG?yS^ET*i|)T=gBi z-UHW`M0R6u5l#)}P_|%KkUc4)^%##W#a3qlj3;c6r*PN`pVmC_6q1*6d^C=+!aE&^ z7&FEPO0stbFMI^=L?Ks5juygtaz0K7sjQl61;z?b3UO%xX;pcvv>@AZus`d53S+(cDBT>TUORMDaEDl;j-Xw7g?7GJlPel$yU6FnR)?D>VyCLI)c59M&YsQ2YgUA8vBrxn{Z``IW*9Q7+o z&S()K4uY+h5Y?1VisRi0&)<3Q7jG)zU4*P6*v=*(SlIp#pNo-WCv5r|cY9&OJdRf& z%aWXI`5(81skN#6d1b20X{CA6=4I^*{OCu8?F zX^DbkQ6k3@(v0(i6@l>^Pwtx9aW%?VZdJ<>`B5#$;cT&TAE1{*eY}w^F|Dk_{t@g+5I&71wjhcz_>Dx)(=h}j2{!_Ty(73^ zj*K6aRJ*=L8Ov?z#NP2NnxuL5fjX9$8e{g*Sd!`a)#j$E+ zS7Yyg?Cr$$G~w=loHch3H$H51ady|lW)2TxL`C19ebhKh86(fw1i?w4hQ?FJ2jM|~;;XU$KOX$X$9`N%7gmM}`@6CuSdY?}%=eEF*0_nHS-xJ* z$uR^}A=E*5(}+}GK~hODMExcN;Cg^cJ?l;G#KM%5m%T0OqJ3EpDNBx!8ZT@t#I?EX5N<>XpX#$&*P|K5f42`L=5N+FU|TP( zt(iHPhZQ*A4!fB=AB^7&+?|A^-n?zf%jN`4CDT__llrTJc{B{aDkS9y=NFJuh0Nl- zOBI~7nKV*(4o@VcG)aqj=qGF{!mCVC)Q8p6up7sn5^VU3gG<$v4a__4dWb2?O^6N_ z+>%5U+^2UT@jt?5vA!B>%5$tU?(>PP#-T{T16CL1>@b4b;}s&DH@mY&1;rEHRPp`& zxjeNNV*cZ0fbc>wXB~vCe_~gGlpcI&&!HdHW2k!{vlXQcWMTOg9KNADU+VI96vs6K z%jkDGt77BUtZs|Ho3LXkXKjTGD}*%;!j=T#Y**~7a=~3xlFhj+@8%Idk84x8SdmjD z*{7skMv_{E`;MYqxNiW?og>-jDk$Ag&-Ut_vMw<_b=mlx(r zlWuwI-BwI{!$t8u){NKgxAot;)na5@_O)YoNrk_?tV?!1Lg#Ce^Nym#Y3isEm+|St z)-eRtu3TDlOcUght}XsTw)SR|5AlI@;CVp*PA zYSOfWm*DcR{`g=#IUb^PmJih>q%Dt1aVJc$8Niz=>nIDt?xxFr~k;3Ll z8WxO57s3YP(--$Yd6_D_?#heWr2MSF@ROZbJrf7ToG}wuD(B66X)&#C&kiemMv~e{ z^@95*G54?l=j(H?D(n8?e44P%LwMvWd|Hlk3r_lorhY5M=#R7b)RM?j#4O`bI|9va zs8LlQcRcr6kohxr=5cTU$4e6$F9d}PCx)pk;qm@lO%y_YAfXBImdc;Fro)JQ7gbEr zp2CZAWSD{0=6MfNPfRDqakf3XOe(Scz>1S2cwd!!wehG$WDgD(!Cd)JF7GGB#grT> ze5p>TKK6|Ni0{kuve=pJh!HQc9ml=y+#JKl1w5^Z^Kb0;6P2snw@P^TJJ$wrr6Er` zaBT)>HRZy%$FCM)%V?Zhakd;cmHu3?kgya#YazV_4z2OB!mj}?MR?ml`6o&v>l zZt59~?uvam?wJE+qn~=WC#$<~tN>1JR6WY0j+`!~?UjYGBuz{ovW1(I2@e&v_fY>d zrYqBz;yI5?ZAjH9LjLS-D6J*=P-Nl7we^Esd^4W=qyZ3pZ;k?8dV{r=5foJ+So@ zZcWzx>bHDPhJ$DnIJGVQ-w_iiI8WrVKGD18nX5Kp@~O(bKp}NDv0Vu4$CU}34Hh;I z(#<%Ij3=-%u007Guc{q_tFY-$HO9JmSEwqcj5Zt#7Opg5b*k{`FPz4+qAxqfsxQ{h z`(iaQdBzG?OOmCS@2Ys|H&#u>H$%9k!?X5zUu`a?ON$vyRHE>)A9q`+sPO$*o)%UF zzN^CN&TQ+TQjIC!bJ{}PCZ9AfrX%0+qPq5T?{;Cc`Q0)eG^%UQ&fa9qMKQ)yU%yR7 zRS&rEY3yb@B?`R=8L$Ghm$}wCj!8>!hrgPqR zeiW0<2yWYo;=F8d6RoS}&K?{7#=jW{XRy9J zFFSMbFOC!@r==3v*w~9eD{d}E9V+Jn1^Z+n=SMzw<#nvEwJI;n$pzy+$_y8xbr@k> z`!&DeS7u183o$1%6XFJOy7*;d6PiwOegG1YI=NmVewm^p;!I?_>*}l~keJ zw!d*6&V^r<&d4{gjM=d_K4|s?GBj54m2EusH|JZjRaK1CVV`D|8+Xh_r2+0JD*tk_ z1DEu9pMTNlf~G503eL5#{K}l{uEX&^In$H3Awr<2b~N7%FHyG{G1~PVC5i7y{CJN2 z!pWVLp6n+ZYau`rg&&Gl0VC0@^%#!J8YUkxCx(Oq;%j|9c(o>pnBdSmlxBg z-khncRIyJ52uVr8T}^s4x)x4u!cI@&v9Dg;-}8R`lb9}~2q&CHvHzp91#2Z9+M5Wa z2%RCk7|WXOe40&Eb0X{FyM*=A+4>6}!&OtO6K=w~N@TbTx0YgScHE35?ROfo;ty8T z=6Q&)c|Lpl5!;SaOYpYj!930u;)Si?Z!6qY#iYf^2^10=uxTLYTi_I+l^Zry$5oTi zjc7>F-$ak+m4|SrJ-e2(p*QEF1y2>4EX8vUH)BL8JZ|j4>))}C63+a`;~HF>pwg<( z+u>hLMKtICUp^$VG;6~}$$mI!+O}~co{bcuma(=BSrNi6edgq^L`GZFv1P=TWPhaK z*qir__@J?P;}Mn+B!v2@Rj5(ga(k|nk4Sv4^nO0pwhHTGB?gCPd#-T17?-LljA(OZ zuEhy2Lj~tV!KXI~mD%)34WR91shdai1r z+=R7e2i9mP?*4Ce|cn`pJET64~&qIivNYn(jw!yC|u2$@v z!Zu&wzK?LLGHb&GA4k!U*Yh;t(Z4(~XPb!d2qW)8A2fj1$ zhnMc6pZ!E_ju#=jfRe`uEv2quT(yWU*qGxbWAJzEJ6;TD&o9I;V@+ogm*P8FsfcXr z&0RMktuQOh5?PlAb6n%_#>DRKcu^5e@DSE^;bB#tl;J{qz4#w0avTl^2yT^l*Ojb_ z3VDhv%8tRj>c$f*UN7N{qBwpPi5&73cK*e!NFh2)h##ZDFHa}osS@fh%wcQcnWyk& zI3EVHzbNLGzeY~i-QuiLDdc5*b`Z{53xPd3q;F+hnUi{kjGG|(7Y+^PWd%Hw%=XyV zSxEbyJtH`hq{o$52iIu9ewlvJuYa#9v!5mj{uR_)uUd1it4oY7q&6NOr|pD?^|{oK zkW67eycvSyazd*TP?bCF$TUMo`J+2n{IO;{8XebH<*_fvB~79=+VFHMRrU0#FEN&C z$&H?y*KexE>+JW0P2}beT&~Zv?!+eve#*(KQPy%tu9RQvny9#?N3+H1MvUmZfcktZ zTguyCc_+wW#4$&A#WM>tI-SE*}FrWOx`XYQ7NI-~iB~`fQDqLO2nL>EF3Z63w zvlB(!-8>EF#;hNJcYk)MxMPwAN@E+lF! zH+yj-U3k`+YvZ|6jC;kox`HreG^n45TO(UiEu?-d0h@!wH{m1FbJYUA9 zj%@G7%YNMG&i%i6@&_NgV53cG#k^Ctq?mTbi^^Pou0Ud8buVKQYOj+J(glZ7oJ$l1 zFm3&dRey0bO4!#0PjkGJZ&~gXGe!Q$8du?vaKuh@`}2(II5p<(Jf0U|^&&+#x3DZ_ zgitcfj60)&JX;+%ZO4qU+np%k_HR6~6;3W7xe~h@^QsSF-onms4LLq*${8(&Jt^<` zeiPHl`ds*nZAFNhhkcl+#-VoWuyYoUCJ9-ymFHy!;f!xaT5Gn>Qf`!m0nC>;>tV;H^QcTK+^~vs}(9-yD z;i@8Q&1d~WHg;iCj2@E_ca4Y=c2rTceN~QXI~BipQ5h^H%W}3Jr+?vDadssM2~+v_ zCkNUo5$0#jRhPq*pV-!b$9k*f?;J5DRKo5rk{9!3DfWf9X)8+X&bqZqaD4t(F$>+b zP`%NQeOpqqgl_gDWD=JKaDNV;77)=(Q6WC}=aXDI8vy60m!9G=V!Oi;mY_!$WV|;C%{>IAR z@$19-2_#HYVDgblq}Ao+KxMFxnqM2^_KB~_h6U`On>}fQDuD5y!tTFGZNlm@#FZd-2v0jJ(#VPV*p?@-Fwe?pU;9fRwk8RW zwW^)bQbbh7M`M!tCN{dD>B(@;EL2a}IB&bx64U+BJQ~BH#rV}{OI31vXm#cL?Riy+ zgXWZtaYKGsKx!9_sJfRWW(wY8I2$E+*5dw z3Q^zTV<)7=2`eXYW&-D3gv;G=?!gXgA-yvjeTA$T;f=R&vpx4_pj=@K%dbw+q+}r= zQOIn`P8;FaLX-o%?>k%+yWp!3`qUI2x78I3**&<{lC`zDvQpS%FQm-j&17}ye4I{9 zVbP*y@X0KFo~d_z`$#;eal%g6FcqhHDvF66O;#mRm#UIEM|eG#hk64UU&gJ!u%f=| zPm?i{mlIj>uVzlZSxR~p!u*9Z-}6qD-USO+vxIFr?P`R-cMU*sbZx9y^#dncE66^_ zS$LK$9M!R{5##vSS_Myc6NTI1LU?0t{7P7FE|kRoS4}!}Yl+=(u7wF3$8fR*`@=-R zjOo8}sG6DsBk*>88f#kOGlB zf?IbEc?k)<*>08{GrB;jcEXK6Np=*a=5Q@jco8i)j#os(Zg% zO7D@MuqIWw+=3IWR2|CprmTxn=CMXu%U!ur{_T|n<>(#D7AxofIeO~z?QAK3TRVD2 z-I$e1HMJ)X=c7=TOZLK*OkuO1aAqJE=CZmuS+$i&>)py^G*T6}t0%E8S9lgB?8+70 z57^@Co?W*JDDA^Xy_H_*-Nm?u2+yrZ9>vF!*f%9pnYXX3K-M&Di;^;kHM0n6g3l~s z9R;Tbsz@Yz3U-zD^O;C)Qy~DUw1HU?aslrx2;od|pTI-t_dl@-=$IUUQ+1XQ# zFTO(JIO3*|m?kQrd3+krCb9Yl9%wYoXl#!C!nr76%Rm=y{^lRIjpG1&7SO!72diDA?>+XjXlfp?M6Ur>@*M7nA=|8n#e9( za}!Q9C#j;+fqR=I?En9Bv#T;|CvmMTS8L-s8M{>BK?6=!#V1Bs^AlOh_RZ$LuK6>< z$5#guPzI$n>}$zc3(`7~T7v`ANH4*jMT+9^`FoyM=4d~h3gDulBIA*IswTJQsi`m? zo-39s9l=)>`K($CHsDHaCB%EV2r)zOancK$zv1r`Gd=D_;=k;!&oOh=mJ#LMGYv-{ zA<;op`?nqcayvqJFoTaviLl_Ew)Msr~~E~)yD zMkFV50(Y&2coX)OiSAEAr0{0EMik?nMfK&*=zv`}-lPagRk^m5&keAt!kbnqjCN{= zbF8qg9ILByUk}Y_Ti53>m{xtf zlP%@%Xj5l&7DrK(R6FsQ@mz@)90qgg zA6`r+&RtOT&tWB1O=Wro#Xd;wkDtG=X9BmDvtOszjCqzMPVS0Yqjg{5Lr z0$W#XgvT?uIgialQ5|rOb>?1I^-ZG-8_>;Zyg!Z* zQ*3u~m+&M>I29wTn!#}w;oe-`$moUwie~coKlWPjIzotEA*B96uA}f_5-+E+sy#O* z@VY(@b$D3=ucc%*QG=wEe&rrsS;C>8acD+z zGkn`~c@AG(1=}!DdK8yha-k?uDZ-C9g$ik1SmPz!n!;X9yff~PV=YuSn|I%-8|3@y zVv4jCt}Am>qm1Pq_1Zl8q$r{%vc)QPuzqdS$Gh25{;qy)jP$dW!$^-7l%UDWvUm*O zzJutQcbmr1*|?6uZ!zl%u_sqJ5hlExrZjBNXdl=(#UED)2NrPj7tW32c8+ksP4HZ% zhH88ShiYUD<*4?-jPTdJv0PiksT)bqW^9j=Xz0`Bc<@w zinqoH%w_~GQNoVD*j*OK*6LDY^Y+1TG2JRna8p$l8stH?lB#zE}N( zlckkdh0=IG^B<>1DPy=+&1i38ig0Tnw(f%UJT55X_toq8c@bOd5!8s=O|dSZFteQ@ z!c#NeW2|6`Z%BL}_7~Kp-s@|z;}14Rnf=Xcjd6n9g1FCPgRk(oAA!EYNnvNIkfuUthKc5qtZKvQ!R+@Df~s5#2{RK1=UeAwJa~q z=dh9B^05-xkwR7}c1~n_7d|MNF%y2p*-?bcNrL_FoL50j5mqne^dL^C)(`{K^cqi! zQv-G3;+~=U;Px=r4dlm;Vp^RjTprEM|M)VKGl@dL_dIOQ`EES;1>0WiX-mp9E-b*g zA(y-HAx#J<%a?|n%n)9*C!;hgO?>)W-MCZUzG)?)FpAv|9Emw-XWrgbRV95AVHY@K$E5Em=d@@gMt_^ROLC3;xPK9GHVs zuHfk*JW(8l#e8ha`Y~*-`@bz?1b8A_u%a1jQw7I{#4k}jfO6`g1dCl7@#JrI>ccL7 zEMj^dCLBr?VmtB1OSFAS>BXt}JRL>GC}RKQTz%$kNV^8uMM}+&ZKqXX$caRVXy1GTINk_12H9*z^?&;DZ=|C zVFoLfa8~K}&Lh4P#|m?@AlqxIoniFp6bmM?2_I*0s~-`|6!^2cGJ6~G=}#`3X_-a? zap+I1%>q|O1F^ORud{{JzqnnGWF@p0A$-aaylN=S^L{1P4dtN~C+jJHvlXCj9Z$pQ5WSIqquY{Y$~(UNqANS|5>bS z!wwA*w#%E?W@6g?Gy7_BV;aiK44R}xG*nsBO%LIopI{#-sDe1P;1-r&Ihq@*=oSPU zwE-|RQ;w z=#X^hOiukmXrQp$TDa&TBNQFVqsZoVBS*n5L4hEcumlBkJtsA?8m{@ zD&1LxU?t}tBP0*Tu@TX3!uFort)m3bUe_i3S8fdi+L@p=~D^stk5u(d&!R5}Zoy=xy!NW^< zt;0y8|6^SSMU*(WkgKX(p&y=gh@41fFD`Ubiqi)>WAiIpig0c^zEe3flRHsDgatMW z)rhL*O>tQ<9dj0L6=qYWC_Y7m_P33uV#hMxRpWF6Qes4D{N107YY99Zh2xdDQI31z z!qFC_Sx}Z_Z6#afUA>{0Zr3N^Ke7fX1*S{ASyP)mv+-%pwV&8HflX6*Kc6=m5X(1| zVp=_u1as9?ep#`Yw$9*KG1mA9k#kX5%q`P+Sd7!1*js}AA%aU=J~#<(LkSqk>9PE; zX}@uS);SBuQiSO4+-bxSvu>yHt;n?#4lU)>0$%-!-%#zuZ0X0&GOS1yT*HOX2;qKx zzAQr(_gYwfg+YF-O-z^&mnEEDDQx{g6(PLrsfhnCit;j0ux-G$!mRm2?SX^^x_8yN zB{~o9GM0l~vD4+wP4nikj+nBVDj5R>JznoeNI$JDad#wMPQtA&oG=5(z4Ct0QB2{p z*!=@nBZLEsS>26&|FA=;LssQovXC)`te@ECtTh5o7gg;|?0Rw2JQYUj;hDm!-{ifS zT${~~#RQMxmO@=5q-mVdGR1OEQ#8l~~=J zP5rs1(TRL4>rOFKbR#^5vbq5=t3-E9xcCPvW6XG8SS4N-b^ifsdk@2E;!Tt+C8 z?&n1$b>RJf*aZrwC-Gnik%c%`jW9P+oKg$RufUzSo41$bU&}OF{`E`jR`5;JWPm7u%5p_hj#4942tzP59VF-P!1C9sh&l z131=$qs#< zHsRJUih||vC(dgOX5YrL+q3kqoK;zEb(i7EPbj3(DT;o4t>vF9k56rv+<56^}F)zE46f9hxM@~&5 z3*&FW-9O3wm$egcucEHhGjHiSh$+rZ*y}EeO|ICv*OP^3{-S8K8yoOGTF7k6sj;LpKv0?jD`x9Potqo; zL5tYsyVB3fpR2-&Wo&BBjqkWS2*<_*s6HN33DoYa(TaO_#JVD(mYkl(Su37ssMz=_ zr5F5PuvjZ^V3ow=P@Ipc!o_~X{lYUFQ7^}qC2A7#7iDvC)Am_hE6b7w&3zYd`jZsD7wZYwzN`EQ%R4Q_C)s}Btp2`UbCtWL9ZJ}~v zdNPua<9Sw)51rX##anZ*UNi3-6~%PDx>A=6s>IReJfF+yYP>XC5hHA|!%^7XQYj-v zFXPc~`2WUs!AWB{UGgs0T1;tyLdaM?LNvjTzvh!?`&^cg8!{mhDUUu!!tNTo_LH zQtgzfNO;Y70^)SOw;hK)gm*vSR}CcxeY_br^t)u#`cSB{OPp|WDtBfP^dAr0gl#R^ zQd2QFKGkMNKh_mtZ!3jlHz2Du$-POZN4Bc&a*avv z&FlY&^AytR;jVd^`L=muUDJ+m;buq08oW{zzer8A*jNwGf`tFW+W$}UiZ$cv`L3#% ztTTmsqj*)DH#oQJPkJzQekY z8jdk!-rEGvChYk`y^XI&aoCcKxf}=<)_Mug{YA5WxBg0QxRBaW{n}^+x0+CrH;)u0 zVIUDDdH)wDO7PBF2wlRf5aH5dKL5?BLh6@BSIVa>N;+}hUmWYpq2{bMn+fA-VPjS; zF($J@%d@){7b{|0Td8@bOeCa%3iiIy)jjSdIP@i=Gcj|BYs9J+9G#-Xw!U$U9~V+! zsD))IW9ORHzY#f|TMIZgkgIb@i5H$MBBv1t6&ZIix5shRigT?vwMwuL6<$_VYJE>C z^XWfAd+>1z5mU6$dZY`2jFvilrn;NavA!83L`DiJ)z~|kv*|*DpRhGpxTCt77sSg> zR57}R?&NYh`*8&YQ^E|im;s>C2aUfxe-~@*k&*Il)|<;K7H{X zM4Ha=8MoxRippX2m_d?g)qpD#xFKx)j$IX17XF=w@Nq0h=Hg$Rcz5BZ70(pKWTrx$ zRxeg#Ga@3#YO&AEnlLWi-MJj?M{;Qext$wCN&~VQa9qzv{^_{6xaoXt?0;p4qGVes zp`)1MtgFbCirh>T!V0N_SU;3TJ!J zLze>HTp`%z2wCIQz>QJ!!Nqtk!tVb;JlT#ylAg7E8i<$;=2Ryqkj02(E++n??}(a^lpBWH0RT6<+>I`cK$83VUJ&|3y6ekEoTx zek;B-<Sd4p;rrdvM3)q?mBCTAv>CvdqCuUl}l30u5{?PXA|&&`>vs!xao z>$-7djGA2|;GHs>3nsDyg>&DNT7m2dWG*KwO$fIawz>$(%Q;*I4>J?Q_!8JoB4q#p zI(gSWZ&2ODq<*x$J8MjYTX0w5(1D`bRIaJb%I(+wEL^wl?B;d0yBHz7cvv#whYiG0vn5A2lz+_#%Jq zhie7a%)~lb*j$Hu%ea;)-1w3B&Uj2^O##-H;&mMyEAX^FCv(i)`EO#D>ls4&I6|B? zTfwUy=VAo^R=n@S1AR2+J4a%Qtiz!k;lwm{m12LY=w4lc!$_Ep-*;>@pNhs!yk3Ds zDq5({-I;8%;@ICL7v^-BsKS83ap=3|(!Ax?0rgteW%ZppmsT8b&zYzsT&{i%hR9Uy2c1j9p#17a+P=e7`P($PbIfWM5c`48)b={9F|!KIl#A0Nj`2 zW5$56DWA#(}A4Tx(%@@yPys&5!2(Jsdd2YYcmK?tnM+tTVuSELD%(ZUt&`x$Y7 zw0_(!N8Df{X7j!le&4Ih8Kbec$-?ne;Zb?wI&f~K;Ach~jo|0&?rbQoioI@XG}g%4 zx!Oys03Z98-EFX)s4kz+b?j~m{((0pR<`HFcy=t|T9Oc$D!f_Dt=~8msrQDlS}8kN zIIvWmXZ}6#Rk*C15dH&ho`MnuIMbYW|7woKhTnObET}5c%mqrD!cPUs!-!dqV=LTL z%YlJB7|JR0S!HynR>TWer*oh(ZnZetg^%@l*PCOlh;B~6ctUFMXevP^)U)KD6=Djg z%&XEUk-tZEahkvda}qm0WC|>3THlAyv)Md_;Bgw;vatLrT)mJj#Iz;MLkRkZ2VIC> z!e}!3u(qX&1C&@`jEitr`FEXpRI4?-uZ63GYYZl_fY1<4G6n z8*;WK8S@FP%Yimrbrf976S|0ZjR+sajg>;|6l`=UrZM}zsWZ9OLeBTBTSQ=#a4JP` z9)NQjo~;y>G+!Mi99qOJ8@*=Z^WL8kVmdyF_hG`e2vKcZJ~;~?OXF0RoauxpQCUC1 ztpXMlT6?d2-prK{Q$!nzv#b06%E63>%{EtIUmKM+_=X>Hc${MW zKbXn0+JuxLp#wfa!tu7){>b*KgcRXw8D0(NU5pUqC&d57quFe57tT8ihidbU;`P2L zA-Xf+bGhDx6Wy>?5}H%6PZ#A`gpA|CaDwz}ZRFde6k*eBysYqVN_0QYH)Gv@Y+Wg2 zDWXLwRXF&#h8nu@NBb+OE%|PR@M;FJVM4$XMZDcMj$OZSVj{bybM_zgqp!$GMcGo0 z&7s1fKa_m_-tO3U!wZl@QwB^2BDIc@XUDfbA^|eYUV@4CM0`+l{RuM}mU1&7D;FiuqS>+L;BYQ*ZXTp7$8Ur_~on^m5E1a{rA zaTWYZaC9IE<=HTdSFMP!7J_=?xe(_iocNJfnom|g@2=Ivbg%=bx)B>FT#Xan{zh_R z9MXh9Gf~xOT5~gm)8qNvmh@Si)5(zhT&0+v&t>xnRuRP&i`ZO*g_8@aRu$ zJ%l)6t+pXXzxkbya4bwXJ%U{wIJK07C7f1T&0#{&BytMlH=m4>D%<+F0OxyX{PY|7 z?@RSKS4HU{C%Ooa2XfgAt{ZdZj}nD@J;`<#K8$8xps3VIu8k<6l$=$oDO#kg%pDM@Dh6BcBVA;V&Fj?F9ytV=s!lwWT??Cv(3qUq+HskF<_z zphkS}u)Xm3FLG*;+nI~QSW%P5WAL0xMv69M#$)d8IP3;;`Fmbyr9GoB6f>60+B%ef zoh9Vj3rGJ|x9X9%wC%;@0af0Vh#1#%kt3F$(5q9|?hkD8E>Pvnj+Xj;)8f0Y{k872Gn z4Nj43!SjJc49BJco+Fh2)|t87=tQ)i5ZqV2MPBiuq023$NUwptix6I)OgrJ=3^uk> z0Z~#xr5)teQ(Zfsv$4z4bTLRcugIWFx!HxxG{JK=&wnF#0I#f2b$ST}I9&mMjKB5%W81%O@Jl$tp(@Fyl=?5YMc!aHjh^V zfu9C(doJF~i0s1VOyPNiaJf61`>HXP&AV_>F}(>ARO#|JT5p#fgy#!5=_sU4SO3gM z7sPbaLr~#cV2rS#Cm(!-JsyJhNbR^B`J0yoG|q0*g4b<094I{RimEZYG>4m+!b`nI zMq8fJjFU0KdhL4|p`KG+)y<8E#hoI!+Y0_=SffQ}s^&dRSut%M!kb~-^Ab+36n6bT zySLr^3K}mL@+$$QG#~E7B6X|$%WW=h3bq%{RpshL)_u>mYU=;v@^1I5m@<}drvj`0 zCQHd;bmB!1qIz=wHcRH-6@H6%A2+gShi`_x%Mlz|8UD!kIU#X`-~vmPSkF^;A56b z`-a8k5-mK76OJ!pTcohoT2O>cCDN6XAh`WUMgh(?B2m@g)yBRAM<#Hv8+QXl6}Nl? z(>c!PP$}hq+V&p;wyjEO13q2)>|a@TL9H9%3c4;IFu zJa-~R3tOH3g9p~a!|zyQFTB#^ETgf$_&d=(@tdon=IFVa!u#A!I6aCd+S(dZ+%HP- zvKY^QAS+eatDwzgWc=&vKN&$iTVSZK?MHB zhXp*UNv0V$FdpM}6^Kq2j+Ew15k6H^H!`{_)@EX@k?{1q7``^bo(SRfXl}MAc{~Bb zaBZ);!6c03K!~ue3Qalr1G$B`P?pqD?9+WDjpzJ_VH_ApQVUYsV&f-lsjDh}?)eDs z8*tN4@U4pCEv*X?LaXt%9=1QI(HXOZ=NIB2tS!#%7~$b~&isUL6~dbm)|i7sNDL8P zc?m~SgseHNsm6tFgjrzMP^E(Rv`2LSSB(k23Xxq(gsl=zG*joc!!l*zx0K{WK|UAJ zX@SFY$>_u*TOqC)Z#2}JU*r^q5*&D1ovq`@Y@zC2qTGcYlgMbLZeldA*R&3$(Is)# zw&GfQuJvJ6v~b%_NL<2>3}I(+9#mIq7kjkWn=$%$*p09Pgsl*EF6T%E)$8fjT$RIk zP?F@4>aNCF-;gETpUuuh;lV8IJ9D@qJKC@#POzOvT2TfOCcIrKZ0^9dRN;W@|1&`e z^SIQT%gy*OiHr(-)U`53<8|&Y)|FwE8Avhy<9>Y<)htNAE=F%L+g8X>B(!!)3;Nuj z_{`$iP?DCBWkJ>e4yFm$7V=TM`n~hcflddDfB1{LA;Ogvg3AyxYU;P@K78~ScJ{}k zB5s3u+K}u};c#nQ;Q34(%-*c=EPC3G&(qki_H<`8XU25Ex>Vt`wg$#$2^_|m$@rKh zvGScBG5KT)+p|S0>Bd^Aiy4=Fua>zmzG839M&9^RM$O_yRjxI}#$8C%4{dw{6?5iH zf^hd&R*fesK}a2}iYNDF3t>*e$>v;j6KvYB!9notiFZftn$Zm7P~J^bgEK;>yM9oN z?G$Zvjr99H{n#)L$Fe-C!^TFM+I6iCk7w|yvi2%2nkk1ym(=!GGQEZDvV2N2XX`)e zsx#xN--;FDXYp3JzJ!yb`H~>S%p+q6Xa6I*y?%)6Gs!KX#+i@Xh-v3!0xRN^D4bM` z-TJtV=S=}ZEm7*sYb@0Fjj^3#kzV@&2OHtqK=v)R4{Ya|fewEOzn%CNjN3x8y^TaJL-y)%^7(Z6RM; zaHgN?vk;K3@0M@SHrLLbOLBy$F6$Q-albq}#^X@}4|A@jPTuXSh-rh1@WNZLAByh; zE=<+ce|F}i#*ca5Yb2&ilX+X1b9K1kD{L;$-s(Ja(h%Q=inzH7>EqdL?pZw~?`OTm zw7Uzgf=glc&*X)pusTK9QIehWIl4l$3d^DPyh;#F_{pxr{_j{{pI6>OoTHFzE_O0b z-msCA=?gwQA~O~bu18FN_O6z|1&6vMS6Pn?7`gK=NZ)_QD=6|#Eqq#j3W z68I~Zql7)nIXHk#f0Nr?UD;?T(#^oR5iyQm$|G&#ji9Nkr*NtyXQz=kht+eqzl`-d zZQeC+m~F&#Z7AVUqN>+|Q-pW3xV1t!R!RM8+W^8!aZFH}0;{H>#1gOA>y7bq-WB?X zao>uk>TsJtMt?l}v!k8j57=1?8^Z;k%A80Qj(1?&G{p|NSqMj4A*=+C7O^!!xK@~x zW|~C4Jr~o1QLL!IgLuLHH!juTQyFfRQ+-2Hx^UP}l#E-|uq>x0;b7vXc4duo96Xj+8N#7axG&^bKSgj@tpPNnd-5<_7!NL#6^$KK`$2mA5bT3`K9e{!p3zWjx)>Ly#3YxTLFDXer7 zMYVa*m;IKU)6Pr&Tei#6v{g@UKA0e;^tSA3$>qOLVguJJvc_HbG?bUUR12KbYCh`V z+z+22ysgNKc;S6fZY2o5=4_wQIoRKs&HcFA8@r-x(;^of)g9rdrG#&aE&v4=FaPAH# z#9O%cgJQU;9+M}FkUfu$x;V?Y(?T@hX-tJB2ML)zLUbE)C$Qd%+p4_FTXae?pfuhU zd9{ScA%d;B^?>oEIao;bDm>>WifxwFmCU7VQ?1OuGHEu|S+CIrV-oXijIe5!LiDb7 z;Yb<0EmW(WnDWX9IrPK76t}yucBNyJA#7)Q^ z&*3=Xc3oC?z-bE6DjruPh4HM=p@uQ1`Kkr$CQyig+1wGFJOuCmi1HMo|0JH?aR$(yz|pDX*@k%v}Rkp zaJDVkeR%#I_bPB8TzDTSy#JBdQcBh&x(8dj6Vja{(|MwiPowX*Vx^E=j(d*6Nn7Dj zSDXg3rxJGyt0EGI|8N+GdpVBjQtkZXSxnJmx!o1_I^1cgrB&|~A-Wd_h4)psmnC@Q z2zTnT@fY^|#i%!U~;i&>l z`*XYB|IlrtgP!mQ?!Tztt^bEGvxbT>HdvD@1kA#-hPrz`Iay2}=5e<>Hvf=o;$}O7 zf5(3ki9fQTmf|UWLjtp_$;y^I?!?7Gd}+^-I-F=kh}qRPvY*mIh37SSWnv6(6&-Rm z&j%1Xic1SgbrCiWCi7=D4d&H6Ra=s1sVw0pd*Rk!#F=qsBhC7K4MOU%ts#-BtDCBM zn94~F&>1l-he_<6&JHC?9VeWq%4S`AYK)uKRv^RdHW-cgt)fKE<768i`3oWO!hv6j zuw;8(_4vjJ!dk(-g|sZw=Qg~p#!0hDG+LCC-{Wh6w-sl)@~{?r3lnZWd5pmMrc&hm z%H=w|(D%qk`NZU%E2uWWk4BT;f|nWtotF0ojTKYsPk3}d$t=7m%gLJT?!j(fA;w>H z^sy^QIJ^Llp6vaB`-^$uDm>}N=E7{Oit3c{ys)Zg+Z-%xXrtKGs>8zG5uDeNm(i}S z_zOiPTInHVPUPVbvZs>r9bO9wEYGd)I9gQ~C!Prwj_Gr|Ro*BYis?%)4lm-QC85Q2 zo-}G1=f30pFl-}*XU@Wt5uDdLEk^ojP)XKyBw`8SbJ_R5Xl1?2BoyFhdpor3vrnu+K(NS*cH|?|uco=+!dbA#fH~%rx_TlS%8# zt+qHS0-BC{^S^kfm}$L|0nZk$!j~LTJTJvsw4be>)#xU_QVm4>1+OaXAHe1@99>Sz z2sY1S(?0~e3I1i-*O~0O>{*6y6MQDKCs8;vohvcIlPp2CU(jU8d`C`9@6E@SaZ?7lp|C$Se%MR{C>qzPQ8Lbe$c`YNJT9H-ix{FQ5?vF}7i88&ugrv^!lskNg` zxn5ASn3E=QeK;Fy^R^QA2H=|}d}vByj#&m_*H9kC3s)8qWCmi5PLY*R94&-v6Kr(X9|-Xt!s(fcHFkC^VXlI=(nT1ATMM?#D>o7&lQeNQqN%w1mmi4!ONVK`lKR03;ag0FGAQnPuD19)x@Vcd;jHVPd<0# zRIKnINk|^Xx}_+U5znPOE+Rt_b}JSpX^#L7DLI^UHL)6d;O0=m2XWq4cr}XGhX zAlIj1^Dn8hb=_^2K6s55#lH*d+Ny~#zVP0&IX;Tyarmgl-*Y(CnwVL<{e?H>QK}%j z3X?pBhXHy3#%*>yRd`XHcXbrO;Z-Yk$BI@V*seHtD+R}Ciua@>fvHPUc=!4&(}(oP>7; zI6GGCci_Ps7&ER>Cxgz$P ztYlbiC7$9LBJBSSk5;^P6!x{|PYkCPq$rK=JK-KLN)R>G66$?Cq9?wd~YsTu%|lrTJxeY*DK&X2EVpSo^0nBl||Xmo8#KWG1`zj>P0L> zSRY<{3s>jj^fMcT?Tffr8*g1_ZUnMCoAclwu1#WnL6Vi(GVHg_wO?qqn6U-liHW*) z?R_5(x(kraA*;5Sy$t{9CgzSa_k4bECuOpJ|@jqe;TW5~L>xYr1f$wVG>V ze6JM0vwC2wsi4N(#+G=&r42ro+^oi3J0YqUPfKH?SkWq9UxB^zc%jkiMtQrvrkE0z z^16yD{=M0Zhg}qsakeo}7br+%rCEz^aNf6jiRplikW!gbMHOcKt|nP^h+fF8T3ogh zLPl|`8Sc@7O*342@#tS%YOyg<_^e*ie=rLv7~NN;?vhkYu_7I-kuiYtBZ;nu&yOTe zA;CwuJ()Yz2pi9V8JtTL_SECfKs6=CY28>F`&hwc0UkQfXEdYtt8lKnvcqvRh_A=V z#<0UTbJ{py87d&yeAzhrk4e|9VUvNo)ahB8pqZKxYZ%}dj-(tHs-Re@OT_f zeH0cE`Mru?6z2ZoCpKDgHAr}tDjXhR@nqN`%9sKoQhEsk%0o;4)4 zK5rJOY-+Tvu-y``ZmNsa{&3;ISc0tZDo0QyR!+ipDHiHDKCG;!{{?j%KXVhSHGA?h`eihU4={$}U zqKgq%fv3XpYKl|ya3-hQYBtB4nq0QzK_xsUvAerUh1WY2%Tev=4LCHSDI6jpvvBJwb+>8`|bE*exYjW&w&ep)*TiEkE8RlXJBj|Of86Js(%P8IqL8(<= z?up{QIj<77c?)Ob1>F$iD`(}5y(qoWc>1;O~!i5j2C&L8n z7n0e9pg`e5Z%(PYjR;{!3p^ELr5Oq1aA-x+7*792PH*+t#$2$`#Tj=JaNrx3F<2DWkZ(LO5H1qoeTejJvCFqadG_aD6c$KDuCX<6_?apsw6BZ;*Aw zbSqr&2ovJ`h4X)NeK1OX|5i68D6y&-=3~#8ep82IbX7vb1p6lJ&k#;_BIkQmowlMS z@jsAQoW~JGhzF+xS4<``O1^2c@CJCMm*cB;UZp+qxc@!jU zTEMy?xSLS?!-z%PiV@B(VAFRzQ1MbvJ{9Aji?C92Ym9bEmE9}JVxQr>^bu0@P&(v2 zehV?J$`Cd3NJM1{X}jpE$wtQKIIiP6<6rhyQuAvx zs>d>gZG+Tbjd1gg?y9OGVh(#_groC0H4#ru!!SAr=ZkBl;|MJ+W{ejvPaw4~tGn>r zTG&?uw=QI=Y;Zd~v{P-gp<4bo=Jisx1Pkt?dG0MdauRMY<7Qtj#R%`4aHby0 znx84mia_CbSz>!}-A7nenDu{hVS@7VZZ*MLdH7!)G&@p-M=J%TkZK<-?5V~2Quw+G z=f*0W@|rnNs+~9KmBn;o0_*=KW-(tD^L_@OoAF>A9y&d3v^kNL@m`MmPx!?MTlAT3 zJYuqvg9xsD@BKanl?$8zDnG71Z~` zZ6=3@voAo{F^yLpQ7o^JhJ4D=nh?HS2^z@zC2SwT>hF0og3w~TcNQ`Rvw1oP%r?ci z>T6tu=ep02(X|Pv#i_}xwiSi1TUdUzQ?rJU5-&V+6WmljLuqA~$`2WKS(>b8vo%(T zvJnE)1?L916jD*r)qhAFpz8gURL^G{Az1}2L)q#sJgiDiOI8fj5-Z>I(cWDcYadau z#L?cooyy}?!um?wDuSo7tzC(0pnhU>qmqPN8zHK#$`R%U3;QdR)R_bI2`Z~J0UcU! zpbYNiR87sPFyV54RyJZwqVPOZP%3^NcA_9KmjUY1`6pd;LDSkF+1rjUrPT#r1q&&^ zk=B~mrMTP(Co@TCVBQ|;A*P*W2y_!JP3LxJRwfEthqEn3NG`>}5FsH|SREy#I|N^qM@ zQehD%Ln%hl?nZ?a)Av;<-uRZf_(LqdZ>B8ZuB*h5#rn0XWyQ;Cb9Pd^MadSA{ znXoB5j}Scn;;9LzuI!)AhX2&_8IzG|3wY6t=$UM*!`eCATA=%$oyZc6yIFjlmVdTf z`8(fq;Zx{-Ko1<_M7I+D9w_Ya5gd!CUWD(aa;65ST4@;hcn!X^WSgsKags}o2p++ciQEknR!vq9nNO_{ z)0ztG@1`TFtwmJJ&+C7vZy1^7FGlgyM+k8fc8ws_QP?y?`yvm*1m*c(jS#LE#jiA`AbJFEI|O}l8V^Om}?nD(Uzsr3{I^l@{At*uu1|EWAp6E=20=_2n; z6_P5eF&Te%WCA|(c+eit$x8k?Dpa_rx+G=^NeMbjxn?=f%ykd7^6pnjOq)~?*P6@o zaSIbd%c+v_J$h8eys0uZkL-lZmiYX^M;*=OdmHa_{d}G;*8$8L6W5mD zs?-jDVAVGjg z52mYBQ9vi&!y0pr$4EJB$+nifHfN~o=Ka2^m~Qo9e;FKpQ7s|;y#?ETM1%-$N~jwd zS2ZwO$a2xe9UcLK^?3G;|F^o`+S09^nmi}dsBgPj`r zH3B*5)p%SI>uKDN6dq6Jj1{{_s(>`0Bx|RzeJXdC@=@2bbj=%J8!_Eo%9&2=oz07t z!nJuM_vdjt-X;i<%{Z`9R1Nw%OSY8e@OK<)tujj%mZgkP?|KhmZMg8M8}BA)l52K* zQtEPIsQRYy5D54V=MkK@WS^68eJUAcIPNb5G$gbiUP}n-%B`Wiok)5WGAp5U1a{bK zD``X^-xlIbb1vBk&kJ(FQ+Smo+@C;j8$5ezR5C;RG{#BGY)M2{>}#kI8NrL^4YcrK zz#vi*gv3Ai^c}~;gk2S}sj1i(PC8X(G_LWAXtNyO`dn$s&iSnFq%PVkZ%R9gDPTIT zqe&l$brT-+V)sw%EX8SmA$p|{7b`se6W8|Kvk`Wb=5TY~*5=_V{hUT8?s5nAw&H@5 zkX>Kh!uY>rSHZIlk-w3sv&hE(Jy^nl=6Lrf*DUGSIB#gR#H8||`zKRW`Sjaz1nY@J zwkCTT$07u`D(W`IrS-`cwshfhcXm`}_fP@?gqRp1<0tjaPI(t@C8od_;l*Nt;)UR{ zT${x@chOArz3ucFy&+B5H;>>N9H_^Eztzu;;f%NDG#d@fwM4;o3Q3dMGFrLVyH^S) zt8qfB#kS15a|1Dj#fs_?9bHWmjqVL4Aycq#&N>I-b~oG-gv%Aw{frUwwT|4Lp$yEP z$r^-+oX?FFg4;iwEXQSM;dE(k{)kVwuzwJ@!-YGe*fT-BhzOZp^RIA4nU%h}nNmCiy$x{$k&dm_y1-D9)oeeL*8$9=VXPW?Hgn zRU@K*#CixvgM^jE$*I8JFyW1}@bMpPLPa&E-946D|8nGeQhV~IDr!MmI~1|3VbA2%CB|N-I2~@i`BJ(Iw`9@KFpT#4|P(uTi!yp6;oCz_I}6e<$PSi z;}l{0_dKY~Ne|&juJFZ0@QM@8EW~dHhhqcfLt0z(aDo4p>Bo4g^{D;p4h$@I8UIoPn_lI#@fxH?THqynC z7O5Y;E5Wnn-1(L0L3|v`r9PY*#cDI)Q3c8pDmLujr~={8#`yAfC1 z-QC^Y-FesE`Q^=_-#@yV6>iSmXUpuFXP$W`YdOwyRldt@0x@MdK3yG&WB+h+fL17U z?7^{I;fCfk8IjdJCD~Y>`@x4o%|Kbe<^zjYvU>^JWGMTPl-Pi3gpC8_DPTD8lbI)>TZe zrn0XocUtpsA!$X}*?Iy?dM>P9p%{nI~&GxH(p5pm+ZRO z{6nt7GA46n1`fSd^m@iqa2UnaABeOS_6mEu5upvG@#yR+p}s9bT_*K;tvMzjafU_O(tH+5RDwTG(6h}&-beI&p^o?e_m_8LDbvltvluCk` z`8RjibwBYB}$xsgD~S*)uM}>E$>pC2lt%L_4yj^3Si5 ziOTctjSG2y1s~cI-HHpX$+lqMM0R>;V^rX-_Ap(Y$}V5whNb};gGl>weEyLzH(@xg z_JVz9yi-Iawj#=tI+$l|i7!XUB5u@FcVdX{(QS0CuNNh10O>#Kzur2C4+D7K6aNM} zP+My)>e4u!D%|VN!Mu>$_}5_xg8DDHFE>1evxT`ogvjbVSkA-#M5YK~qxjUHW5aN^ z)Nf_1*Knv2yg4+LtMzz1gp98EFXi(j z-WOtfvM3+QyA^K+@nt-hMssUEuD@VAoI4KsdyTf>&}!k+JkE9G#yl=M3fbdXTS8f* z6F(ANpCN2kx&LG#c8)4?dXu6bVce4M#*;mUnC`4j7oKR}qF}wmbaxq>EJaPd*|#Ow z=hH;-w%or*IYqV;xj#}(*|tg?iV#wU^JxsBGf__8)6q%|`{QJ+mhdJ^kHF}zt=8#q zqyM+%H`Ns(VLB&A5!i(dHI!-FpCowv!2L#CUqNPQUWViCL=LJvfSHUgM{NH zRl~lh6~yFSM#kvEb~@HELg-M!2cwqMHCj~g9_=hVZ>pqLuKvcG3S@uJTh)4^1Xrr? zqz7i-_R@Q3C8VuXuDIQD-S+1CSdLF&qt@Jnw-7Hs;by83K9}tpUopZLs>{pqf7#wZXZ3=VLG}?|{zYA>eMP`7I>?@p}tGu&v=Ev35pPNvqmbv-)Y_V7qCHn4HKR?Nq3QzRiZ;bzs z=L%6a!iB#%R+sF~xXxGPHi!O1tt7iPj){VcyPB0+WzA2hr{C0$#f5CK@Lr)Gu6}%) zEft>XhZnG80t=hoEFddXIFTzn9;Eh?(UxBPR|)baItgdpMRj?9Rz+t<&xQ%lC-Pwu zn>wktDr0^!S1P1C-%)%m>sl69t67NQpq*4#R~|3Gm^nK=h_fBE=XKOtxKflWg<02! z?A~nrnJ+!qohxKS3YRN!@mDo8W6+e`n3raFYmc~A{uZhzrZvU*`mZWTN{bQ>cfhV3 zx`@vBTA7K0T_t=Lb8<3)3BqAF;ZQ5=97UanL!(&xr}{qQ6>(H}pD7$%!m*z0X-%q$ zBO_T|m9S)Ca|6{}J!=trhH|2c;xgV_h=cOUTm}xJ_if8(&hh}FPNEs(RO<;X45a~ z8;xh>gSGYxZG41nbNDig6A(~=)3(CLE}X2(>E;Bcsk8Ep1#t@z-i+j+ov=Sd_^2x} zjrZb3y_UxPx8pZ#{~}RifX0-|`R{S*&W%;tc}}d1b!C;7Q1u5VmU1{oc<_hny7R6f zJ`LGkm>mPjsHwKg^L~`%REDrESvV9W1pLW?MVyS&qcu8r>qc|G33dZ`_Y;;A_)?m< zyd=9Z{yJHKTSM5NCEQxBS>eykaZ_zHI}?>69GifDFYJHg%Sf$aym~T68ge;FIM4@2 zFTuu3xLJxry}72b&jO5LQ+<=izr_87cVp#NzwU*lwtL3K+4DC~^tg?Hff8<2>ZndZ zf^ytGrU*)}>t2v>t}X5Z2`r)_YyV|DY0L)YPYojF4<6UzNk!EFUD5a-X9`cck=&2C z0Kv95o3;B|E&sTb6Vrt%99*Rp_xBCP&t8wi7)<$8RM*9U!FZ<$sinAG9NUVVYDH8d z;@yPAd8|tkZVu;=#%c0pGD~|j`XoT=7S=gtTY*l$viR!$YPq-%e{ha?s{ls)LO^68*omdZ^ z&5iG{AIjQEY%a-`!h{xKV;3E-2m1>5ew-&1d~|SPG^Gdo=&K?4U+$T) zvoVimu(g!-(Z9wDHnzf9UFl}T^c8hw{TL!E;ov2BbRZ;EIM54w2(eIb#fekH zSE|ZBDtsuN5p(D5%EbN|$Q=G7_0jh7Ub!F}jR?Ts;^Rj=&A`zE19GpYu2wa+RtUhiv zdHokh+=PVT+=~%)t=%1o!pqH!$uu!-ZO@0{Y+ptCBp&s_rwp$q6Woyfwb`R``BiZD z6ym%E|9H`m&DAi$u_tG>F)yIWELdL+&p^SUHn)G`V?VsCg%jo3u@c+7(pO{fcD@v< z$zya$E=|F{gBq1FsQui51ScUOPOz!VrIviG%iikTZcbnuHZ|vnayS!2=M_(Di(7!% zib>rc>$8O~1JrYkD|SyWY|s2H-BC=}+mh3oXMgaukcy$+wBS>;u%|I+hAT0V!zrQ+ zh>}0I8qSvKJRizVT_j>0?)^^OC_><1j!eeAtcp1v{KoU~s6yQAA$SD|AHnHoZvDh3 z)S!$J((Q`a<_cCeg5s)dEKS;Cb~+0iT5xfmN?aXD)TE}k#cci_=lSHe=H*m^%~kDX z)BD%kr7tH)zzZg|4o;-;{__&N%kiEND&c2D94wly7P>u@c7yaJ!runemFcyNJ^nLZG#VbBug(J+ zg2d$IFNE3%K7oQqb#@NqrITYKbPklK}GFCnulA*z<7 zB=>&gk-e~21M)`eo~XBQzx>V8O-x6A;A3B|dkBYJg?r^xN_eBQ@TI(NMUjvyd>P8C zhFUdPz2&Y!_!c524{R|ymDc@u?I|QrAm(S%i*Y4R`1(8EW%!&TM6V#J25D3A8qS-N zyzvpj%@teV%u+%fgv-rv`=8=?KZSJttx0nAmGiv!AC9&rrvkS+^Ep7clLzS=A)j59 z2uv3K!7f6GE6awS1dicc5rUnC(;mXRe@NDvx<+cy#ou`nEM(aV$9u85iK?W3t{H*G z4NHRD(}TIiMVuiMY4K#zRO87F5%6+r}K2%zj(Jx0a$< z*)`!*pm4LNf{etgLx4(wvKSoloTP?h@eS+-PorlBgMW%cXEsa#Q;@r#qN zu?2z4i0g~5oe)$Q$A7q_c{fICx=#)Ek0yL5w}+@ixXW~`I`gSIJ0}t6AbhE$-qU!x zyuE~jUD>{rSDC_@B*8jf$Z!_2twgaok6R151KHP!!!y`rfw#MmHih##zA^^sw}-H` z8{X{|{Gd|BK3zFpQ+-`Q&R|o0)5+i2A200aj7N8+|K`$P2ZZ+%gqQuu?SNegtQN7| zLMgsE%^_M}-yQN-riGZYep7XSinw^NGIz)GE#q{7I=UCijKB3K!hHg;z~TZH()9 zb;Y=P=y4kXT2%>QJCWR6!AY~NjsDcN3Y;CJ^l;yN&*eX~K96@*HZQRFUY z#)~mwVq1cb5rRiuF3iShnDUWdts-+N+1|pZT6}R9judDAWGuVzQ77|^6KSvC*Jxt= zDzK+Mw`c3&+XM?~g?OYxm8SWxTt`fH-;-KX(PtfhCV4Oc_QG8U!J{47X2dGdgVF^A z`Yl#s+6!Cl^D2`=y@cm+LZUwR#w=)Vj^J35<5h`l%5?|f%6wkdRfU0BLzDjRp~e^5^b?y>1&4pw(_DF`!PPjMC%ff(Fdb|H{oU;Ytye zpvd(V(x>yPFlT?mrz!4DaVo?2&QuHo0~c}QeI#3?54K4h!Db;a0UpJx-f z8zBUDz^=Etr@s*_5R+8{P1rvYDSWUXelZa(IB&)?OW}NR0v7Y85AG#UoIEr0(#B$- zt6{>W1zc{#I>pW)Kyr6h5n8L3rxUW${&xKxY~ zGqPHs8aiBD!to%%vm5XF6W)ppFTv>#-p?bc8`pFkYqZ%r7V*W5P@gbR=Ch5i1*_2EP%3x^Vgu%?7m1Fp#%GuXo1VDyj!hP{+F~A)6?d}jVEORyGP(siooyKI*_luIXi$a8Nw5lil4wU z1zqM58H|gU6CixlfRNFJz2GmznzObo+ZOS1J^?j3nkXczBF2$8cnC*-R|{?oY%l$( z2=$K^@nt#Q!NLhE;YAM~{!VaR9``2BKCfqdTnW~7=1ZDzBttm4NM$wB@(9w#A=nhg zs}a$ia4ErO7val7qJJjtJDzpn^C;f+&oTS#{m zwhqU;0Ug;GC|CsvABys>0oxsf+hKy*){$d5JW|VxtQo6M%Do(6i<59kRifmHG#m3S zYs?8;MaW{()!SDh=ucd&gwx$QKZg(%rDh5d;ew-;a8SVv(L&%%l4@|WJE>8EL$dJs zJ5|cLtvdI==Ygg0R`ZjG=D$@RF+J==Rz*|^e^7N)1a)gZ4h=c6m=CJ=&0pNl6nuh& zmlfIgBYs5)_Z0$aDZ1>tdSq!Q#pnX;Y0Qa#*f|6{P&rLAmEk_EYTTb$sjwj{QY?~3 zTZqAmoz4}d;MQD0pnKuFEJBs!3f_-sS)|}=p1Qo(|E)S;?Q5lcf z>Z^^f^ekKy=x04fxlGB8G~sxkJVF1%`v zOQF2a?1s(5Ejn($=`hgH2-4Fwt6r3hPGgaffcPgT&}`%L??)NTj4wb z_i*8J0|jgSr;Gij{#?uyJRo@vZ-RyGBQ+6XbEc>Q5!<|DX3T~tOgt@GbR&-Ee~|1h z>`4~3P3LYgGAHtUG<#;^I*1Dk`BIInR@nC8-Ux0E;!RPq2lL)RxHE!Rqu5nj4W|G$ z64MSp;YO@*voyB-c<3THSPCC!s(jc-4ZIpLU2AjIIr&RoHmtzC3@mKAP@F7PxZ^9l zYr#`BTpz)138|VOX}s%$l7;nMI9eFhbu>9waBan2od7fXk}2sz(j1;u#@2$hcB1H+ zfsVp4f8lc{l1dU#nnNpedE1u~WVIx!DA5Cz&}K|;w&n_1^Vw8^6RXra8xt8}9rzF} zxSOl2{mpUs&)275`x5;A!qG$6(GkZPN|++J30MEcu{syD=$bK}I;%Ay%HD;c+nw+ndiCy@(@a}j-E-I~Cs;%tZ&lskFqPqvoeoUS!7j#FvnY;41} zl04~7d~bp$VOdAj$|xlDfU6MHPRSLeI0|o9i$Y%=V)cGE9?;`+@koIIQ1Q|!J<^^KdfSNA8sxsswey1gm*u%zcSmFv+Hjn zV}$iJ*gam$PX4Eu^3D|Q>oqlI(1RK&w&bn_sBXM!>;1=ox|b)mIAJTeq!G)4A&Ken zcf|ZgSZlJaMU(#TFT^%F&r%$Z6+GJGV&*4}Tu`(bjRG6VhMN|#*+odIkLysLFCuzA8Rc=% z`_A}Uw)!$K{^cu6;pq@QCW}gsK551d)#N=u?~NMyJGQ)-4kiot%WppRg@P*lCWPgRn17NNqxH z8+NrLXauPXc$g?y6~?DAZ!~~mERBdA%CnAq3=&ok!mSj$YjOWy(g(7oo`Ttr{l+UL z+7Kiv<+G(0H-_>xQn;HfxU?j(qk8Lt3q(vWg(E`91dh~H7Jq#+{1@@wgxwG>{ZGy` zW;W;gYAKK}c0$x*V#cb#%4>;E$2|I%s0Db};9Q+$26GF8_dBHN>EpAGh!PS3= zuf+QdVE{KYb>4`4910LZI0JV#8|>X7sYmnw6(6-R$2I7n{@ zqo)%E^xV8cipZf@IEpUhuUN6ID7Fl(5elEHMNp)~BV`HA$ zfDteW9)P{xutti=yo{k8LI7QGeX*H z0iJP$h6^uB^H3Xx0$VO7pAaEAFR5TOLV;D7PfTe}kLE;%@HJFOEXxsV-Tgm2O~{TE z0(!BdG(NS+>Pm=$FKd-GKcncAk1v>NnVDb87K?aujY+E?pJz*j=NgkXPSLIu!KylE z>yT5L{q@+jj1NC*YPaVfteuTjZ_eZjcQS=X>B7yXd|kz5z4r@tj+hdI1f^g7(NV~; z6t?S66dW!weTo-W7e}%9ZHE$ChqNr=S#MUCM9InJwk4?)nU=z*(z?%+*|+sMb~-mQ zI{&l|7SqPx*^(`s2p59tb8Z2bx?@!Z<$$j5%duj7@(~n>8WAGg9)ojx-IjgpGy)uj zSE?v&_vGrQ8uJ@pt6*i~RAW;Az_};a(uHSEg7aKpB)Q@D?QNu*qQOzL%2AfYeB;PVI*jvx`2KwrgdYwR~6Bd)L$4cN`<oI5$G0Cts%#HjYbk+1Z5a34%jE4wU23G+t_!nQ`wtuFQ7b0M&>t zY*bEgajw_|S~1>_V9x~1 z%)f!U0~LMTO?cLs51rW{sy69!mhizz*ykvCc?jpig~z4XJPBu=Q8xM?$_!o9#aG6Q zImJ)dQkFM=;je4IzM1AX+;rdFdHhZ|5Nh9{|+J$SgmGs_~!EF1R4V`fMjc5NV z<(Ic@a9+iwfuwciQ;gs?f~`x`-xr+3z`~~66WP(0tvY9E9MjYK>`E5Zn<^p?z%^>w z9&r*r%pkf58|UCS42QxTtVc#u?%D}ynZn~@yza#6dK{g|g)uy=O6+1>vPIWtd|srq z=rVPgwy|RGg`Z$uNO8v9)hCy-roB#tY#ht|L7Y-~n*KQdgZnU^*HlN>wwS8x+*(P! zRF!{2X_~lhC8To4QPC~e& zpo(Zce!((ah>R9aS_`>7x%8VtcHiS1qSj}nfr;$Q>5&gSb}atGnil(Zbt!C_`go+b!3&9sfZsrP!pei2i0if}AT z6idS+k6vU1I9w}nuPA%EuxAV(r?4|Z*z78*LBh3?1lHq`hv2@L6Yj#5={OE2Bttmb zp4;hTwO9TWc3N=VTR0IRI5cC;RPGJo=}Imux?zssu@K7jWLY9ehrP;As*y1l-97%;@0UsKVP7TWCh>>-5f>NJgF31&W1wbL84tI6Wlpr=_;TGk^Y(HqE3hs@c+-)4wRoWOrBm`B zGe%6S|01>=_gr-y{=;8*WGUS976Me#xIOFt;9YAhXXqr#jec19iZUoc!pmskW2~q* ziz=eIKj*!Kqj`6ZF)UJu-MN7T*2g_Vh@OPoBn5MNjA5^vUdMvXET%o<6ywx#5c~av zje`i9!}SxZCRaBanjk&Rso$Zw^ z^6aXxOhty=JB!#M>gewLf$*j{S7UpsaKWVZb3v0gF`aD4uCl~;<9HjkSH?a{xRxel z*5FG!_Wi}yAJ~^GIR8TI3U2ozemdSoi5Z7YN1X$8HL+1SpxFh!Ybjt z%SXs5$*Y#6_gAAZ8nF#|dS$Kh=ctjGR(B*YNw90EHo^xVVe4SF{f=)pp0?y=D|VW3 zzTJPHvm@^=Hk!}uu4H$`u47(aPH#w~UAw-FI2*zC4{V!oFIISx2L~FLOZAkBp2NKv z*wn{Ynf-Vnwkof+hNJP)jBii+3?8`%&x_*VD5#Rv)gjswxmp{iB*EWaIM9##)}qbI zozBFx#H#`ui}Jh{-qFHMU1?&x0TWfrqu)3*hTT=z(v)LUNLozrG}dQ`0{)JeaWF&J z+?A-Gxm=So^dJ znKjz>E8TF?UW3tlR6%^w&s_BvEVa=!7EZXX;LtKMJF2|J!(Z6aOKZf${lZ1P2-Wh} zx}2EKuNJO*i7K^?UqPIh%_Z4ouZLJR=Pxm+P|1~Iw9uE~6E z%59ag_SE~^IErnnG@T>0Dpo)6(VXaEgjM4}8De#rztIDD?j_tRMUbs<$yP|JPvT(J zDd*ilK1B&OF2dtE6s7O=Zm|~0Ff%V*KYy;OiRo5Lc8D`Xi9BCIjXl_S`s30~#-T8Y>s;hDE!5{*)J8 z;L?#yt>bQtoZrnRY$Y!z^Kbx1$8f0>$wP^op{T$1W4IM2_*!uM7oM&bY_xGS7DTRh z7q$)O-U2+bg!Kck>_ui9EnsvsKsaoHb6d{q%&XD*g~kaULwMUnmxfub;#yDEw!$|_ z?-HXe-P1x9?md{t#-+UYiE~vrr(LFR+(BJWX>^w&ej#c&x3zKUm_GqOipgmd4y%Rj zlU1R@iv_3){mMVs!1-+9{6v*EzA}-g#R$=r*~T*Pw5DW_CULc}Csw$Tmr|^e|M2o+ z3h0epbI$d~zB@Og1xHo3SgVZr`CO^6(IrONoEMA*dvGJOn!p9vf%m%VKi{o~7Qsqj)GWJWQ*3%R1mpAp45GM%htO4?OPaNiq^ zZDnGYD3>I89L{>f8Cj~=t6&o^ia7SEFZX9FV$frqlx~ziZ#B2nJ=liO1qAsDFHLMt z5q1q__Yf}q%=04ZI2d2!*{__g$6+liX#_J;YO{A9k5v<@Qc7-nM@{xl;9_;s2a)`X z?v}U|4|AmgyLJNiTdC(7alZ94*f;_AvH14Jr32m-SX+rO8^NzW!AnWbtH&~~_MU3E zE#zsSaJw`CT{)?r**E{ax{4{M7e~fudFX@l*&8Dy&LzoFS2didr#Ql%LBhT&Sh@+R zf3rPJ$cPoTsavmBS@VmzQsIt!fI=|?S6JM$6bmWcEdTL!FXjrbe^9Cg?yazC!Rp3r zZpWivIp39oWjJfEPm=K!Z+Hvu>T|v64Qn3Uv)*>mlAlV2&&(}wWj#^3%mX$r6+EA zhsJoS&d$@$v#L$cvJxKY)?daWd!QwIBZQAViLcKq4`HtbNzKXZ!nIMPdJ4HA!agtI zL7aYNBNX{;nra03usLs|1b0W_s@ngC-lbwXW5MPMs?^4M47ZA6KZPA-a2t=^9Inje z<}ch#5?+J}in@2HGnvVvUEUXC6}8{Y{2N}>nfg3c&2C!qVg-9!;Ma`^89FYZ2J943-&iR=c(ZB_cjmQZV9tp30=HwshUki4Vn0#xX)Q?XnEr!22H4P?zf#C21jH2|{FQaG&SWV&cKXTvPwXK=a#r*uBj=#g*A(`YcF zS|=@tix2|(Vm*c9eU+}@S});kd7_JO*@RD$aC)+;F!_(j(NSl?b}4Z^*<6+9we{&a zKOgG>B$XyWd#OgpWz#$&TVtOtJhBo(yRuE4J$E4~NwDn3;pOaD#1uqa>viYaL^M}8$ZQxpqF5eiSn2-{cc-j~V2La?2%t|5opvO&3Fc6wVHt*LWI zw*5kSsBqLzxC&o-va1BHD%tZdmwzN9LkP~x(-!pE6_a%tj#O85OSU$7pvn0u-y;9-bhWh**D_^hwU0{B);-d2L!M7~s0w5M|BmvW`Tm#APR z8*Lxcbmu6;Q3Be&*qunYI=@>TC!Z5njTMJdrJU)$5qhf?c(7tBhKu%*3g&oA-Rl)e>p*%t z9`_=u6Onz?92@siV6<>;728X3{X3op2nX#%%Y2%B3-5=w$G0t8mvgW!S3C06SqK`( z`F}a7lOF{)OAnLx0un=oH62i(?xzX7)jQL8aXtH$*Av8#LwPgfyw7W>EY!c*|CNRX}%GNNlwr{kW7uzrJ6_Tf{S z5co5RRoIX!L{}%%L+}%#vILudxbH5MuSFW}A;u214oMfSN07le~8!W(x{Z(s5M zTX!)%7@?{vuPtD&&J`4FH!*D*$(j))&BSFT2S(z%h~0xp&O=3v6Yek!ziB*36fEoG zT$I=*Jh9Bf;zLaY3{YQbG;c}z#1wcgVoLpu`_%~2K4!sA6_bAj)=VI>8?XN2?kuha z3$}fT9z<9z>}zu`LHN*1?*VN#uB{mz!!bSjJK&rD;23a zPD3d)`E=pbPwep$Y`ulOi#gH*|6#o9N_a``uVi(CVAYTfg@|$#)@YERz>f(mY&!8B zm$HS^|KeC1D<9$9A3P|+It%U#yT*`GpZ6WP`L~({V*nkph@g)6E$6U{aHa~Y6+b9g zIQSc$Lv$Y7=3frfR)1!M*^_dGa~VQrC44&LItQPhIglZ|YD1Q;%r@>L>-lWU%jguC zFfr{&6^?`m;pI5}1D~36Ugt@STg|2-nRN(lNLUx#6v?G6>lR?Iik8Zv^f-^1c(8~f zSp7)GNIct+RaPTFuPbx7EZY->Gk>a~8&hW1KM~PN5vRhd@Iu!w)Xm?BRm4<}d&9V0 zmXKk5ND)HHbEGIK`jw2%vg=U%bw;}&kQCF_I>aniwD=4gT?6u_4(|1ET*OfaebpF~ z1|h%m#YMQfM2n_|x(mU5iD^qkHaiM?inHbi9+lQbA`w5ZHe9&dl~04!%aqF>?)PH4 z;xC-e(NFK5|LgW*N?OU4rR;JR9=5|SS=6{(eT4mmRq>psnGzg3K9|eiv&mZU`Gp;t zYi&%`_>|(AqYyO_mn^|$0&8HeqbM-##WLQF!LAN>0)$)6LXwNHb_wp_9VXoB!shb4 zOcdPwg-@Bn7hmB<7d7^R`$0^f2C_R@I9Q3G3ixV_#&|xT>vmDbO?Pz!ce?PQrRLRd z2p0~Rp$I*Dny^~?m&T`i_y}LRa;iNEGx5?BXI#K{H3-s|NAvt?t0$&g%TO@*t03Xs z3XUz~*j&;T;+-uV{Tq8-@;^TR4~B~=pf)zOxw;Im+N6&nt1`(INsSP$En`Ev5ZsH% zz8smt_4?fHj-#uv-c9)25x+`oZj4iJ?#y6Yr0~g3)chE+mwO??YB#}aweYzr=UZ}e z4$l2}QA>StPW~_^i|KVG+yjK2gUGfN6kWt+5^E=LbSQ5IaeEk^9dI3lOLy#Ch1E4l zFOR3H$En4|EKzz3F@JJDTSzX$>1^R+fN=g#j;862)jI#18aozp>chQGJP#Mm(cWH- zt?t6PQoKtOUGR0kq4v7|6D)nK&co?!nZvad!8Te*T}to@K06A*P+xuA7}IBzAQu8^ zvn^3jx4F#{wv^`hY_bHe_U!GAOA9iFYK>m!yu5Dv{6RJs)A70-uoQf1lWQY9>C2{7 zym1!1TJo$bi6e;h6|Vk`ZAJCXM%!??1i3BvGMtoI|7Y}!^u{&Cuq?~&IKjbL@M*=H z%DCyBWppAvOQI-^s+H8^`MjuwmSZ()4s9RF{4TP)Ym7+t*(ac&vhU)lK-IlXWxm<&Y9O2_KRGHHqB^OARAPaaJtW)y2nva2lj+=Y1kwxx|#6dnx- z{~gN-v{Jc|bFrdIQXJZ{YY@SIa5Y6#fO>ljyCEfB2#gfAR^jF_c3E(@DUPF+5M*#M zzUZA~JZ|x#`UadT&t(WM%1x~l`puqQJ)aBel-4R|epRL4)&(e(!8uJVHd={=lrEWX zI*MG)BVZP+h?o-V;5C!ox{A{H`%}|!{t4$AYNZOWh(je@EAzPudspy&3TN$vBkDM>v`)cqdPFql9$;cyFFSE!f# zCM@YfWSHiJB=CRMoMC4AOBL<&x*m_B<5YyQVw zc%Z+?h{Gg1iZ0;aJ`CH%#8zQl1F}+tcji3H7OwYK`Jx?jcs7cFA)Ij#F83kJPI#uL z)fijEscdi;Zdc&K4r48dQ!hXt^ym=c$=v55*h@3!Vxf1KOk-;4XJ zI8}?o<*}K{W?d9s03_Y4Z8}|4&6E+R`?`!Z-*YKR*Pk7*6;*H;T9ljR$cPaX-|N*s z+DS7rH_Y&sx-m(@jj9CpW6N?P26N6MFJbq2GzYtJ`ezli>>A9893f*eTfLNR`eud? zBd%ZB@AI=% z3ekTao<2fEZPggq*-h9MEJQgA?oBw*PW9o7sK)ap-1$RAAAKs5q#wAxjAza8?#=G%>}*0zE!>B&W*J{%1pCgn(yOu2$d%W}1metR%v!%jo4GI|FCG|(%H{?Je&L#=x1`*VZ%Z=FQCS1!E z{D!JyeKJ)PweCrMUa!I@QmcDsj3BPRYOj21iW*Kq*t6h%ituDC?$vobTjh{nG~ul( z-dI9bo-H;8y=$wJvY0o+NOKTE8gRcBPo}eB9+}Iqsn2@{;n`mtUBTJ*IGK~uf$gLD zvW$#ha9*swczC|C?k}d>Hi9Z6j;_nPIlNlVyWhC&CTv(tN*yIx{-g(AYI5l>_Lt$Z zQjILjwX$T|2#Npj{xA0D$#NJ^diX$YjwaGt*!ew)!wIR+zTw=P%5hKOa~|8=_(FC~ zIF>BjP8G6#C%OU$Ero+k**}{-j)F~R0z(Byr8$-?s#)Km#hj?kjvx4%mm)LrgM!O& zs|dS_D!5$facpnItwBUpR7!tW+(q#Nu4^*;fc#nLE~e;c;jkI8130B5L(R2n)J`|y zMTGG1H%>VV_vUiBF&Wdz9?Z4|Y@S58wQ#YMno(nfbtp#oq&zIjod`5Au4v7`XF3q{`Nr@F)VnmnKe#{V3O7cbnw*?zWOg_a) zX{E`0kGk=^BbR1!;d_!=VV!rn3ksOSxLim{8aV$>nzyKB`MMk>cl~@WkE@d*WHlt$ zUx=*Db=A&1O}MCpWh>)SA3Iwic`mo6;QKSKwn9j}Hho5L`oIL9tGWmaoPQ?HQHz%4 zx(lB|gb-&T>mMS^u(K9kQNpuEtggtDG3*_KRUz%Qy!;p2)_CYlv@smrYO52k3GKN0 z8+$a_-w1MT_#4lO-0I8asyz7#hk+#d3F$ijT;TSJ>8!QjP?D&+9P7xtNFiHC$wp&q z+l4hsJzzRJbhgom3GeU_RXOWio9%sASCy}>g69~Wl=!TA9%Kuf)Fe%0t5$aFo4?Px zis`LtlNT;*sK&=Q!LhRyOT;6QAOs~9}72K$GS*n`YLB>%+mQ3U?T<-B4n$!=Wc9Cvzq^PX;?|GM4_rsj~Rz6?x6epYLg6+8rny`H8q_;X_vf6-~UAYCHUV zIGex2wk@XyX;NnNV6JxNV;xf4va2%hD-pJg$eP$&3SHPUg21v`M)vl6BI=QtA_U|G zhDJE*{wUThByk42LWCPOLb#i-rI@P64j#--FKq>OHQ~%cHqB>UZCpp=l*g$udXs?z z`7nmNG5S~;p(?cw`$4#Ny;P{@BSO@$Qa3q>AcclwhC<-~A2Oqyy^}GU+C` z#|kICh4VVPG|scC!1=O@!?SUptw4?=QwbdTo zprQIM<3d1_~?reL2Yc&fX*DyIX4qqEc~j6SGS zIj&7mzchwD@za%`_^>Fei}9o-x8jA3b$FF1?2iz2Vs~gK!Z?L%t%Nrdx%n5b+Hkrq z&leE-Cyu&Dgz?cg%@hfE>l{3P!7@VloGN&Y;fS*k(^`3w=kdgNO4-=0tPbjgKtNltfUL%fhuhQq@-I}qPy>P9)$f`>n; z)ix%Hvy^J^98TB@rv|8hG}drNwIVu9c%O&e8BO5r?pS6E4@UA(xSk_i%n|N)z%O1{ z>o4q$6#SD(R7wkCY|iMT9Ll%RFGT&ci85Yrkv z;lUWrFC?`N5w^lL6%F)Js&?N%vMwdxcs7vSioBT3u~9hL3OQXkX2It?rcA;9-%`Tl zGKmepaiu=H3UfnwHoihk2huv|HrQ6FqKYM6glM0j0Pzsh$-Eq{(Y@WgN)^szOygt= zozaNQ(0^4w|5R5K(<`{UiY*p6_z2<4@vg_$cAWFkA2edn2Nki|R0Vd&u6cLkp34ptOb`OVS5Lh zDiD<}Y?-2fKmTCib*7Njh3slPZlrFe;8L8j5zda~sCMZKpwYm>rYly$njGP9Rl*jl z{t!npg|&b1DNK00K=+aQP!(0^9}=no|K}M(z!-K8#WhCQ16KltP&YjT#v67+F|PIJ zVr$ZS?LcTN;r-i(#NoWnC zbau_?<-D81gQ`Rh!>S%Z%Q+aY$WmAA~yd@``1%ES=!UdZQ zJsHMxcDDr^T5@F|yAlOe9q2TJ!*z)r!udj6QC$FCgdG}0Z=1jLO~rISRtT9%Y?N?l z8ea>OJA`B}!EYdM=JLu$cr=&8d7-?~*zE1cCY@3#o&T_+TS}NR^G<;gvGp9IQaA2@ z;GZa*s;0OCo7?fZEfK9b(+b;h{HIX&bq7BE%h^ofSxM~k4v5k0ziP$Z3?a-{h*ycl z<|K!UxksJLn4Kr;GpY@`zZ`P>MHzu7VqyWwoEO_r;$tu^oMMO|1Czj9y|s}<1n zjp2=Nuk_{|M<{i$kO6$~6+A%u5$Itjgl_;&e&k=3`|qs$?ju5wFH`rLgjd zZVqLO8LxYj?Iv7Y#iOyr{>{RoJ*%c$y??!n6CZb}8!u z^u9DYK#w|;>2tk~owbVM1aFQit-S5$BtzuqSi87S2fU6t>Lca%r`*J`YiN$niAcWUweng-pf$ zHbB8Kg-zLo*`O=oj1at{9C+(BGkWLe{DcU9VKR^fwO$6*vZ zTd+S}*tUYeKAJKgR*Wx2*}sfkv+(Q9lWf6iCcgHUu{YW| zD3$+J=3@Ggx8z0?=17dNt~loha%M1Bdvbm%M;dXcimLC(G3R|FLL7y)m09bnw~O(L zzTKY8FdB&0f{jxmUguwD7 zWePUM33e0g-1S!&alHdg)glg|iU*q@9xoYE!r1-HMLZdT-$8JS&p+=(OIIBd@5 z8CX?je+}&Wu&*Ci+VN%#H|nZq8n2X;seI|qy<#LT<9;b3JM&~DxzU2+*vC2vPg--{ zS9s?lTwczbJnFvjM6|}?AD%72$yr#FpRA}TZUZ_fPj z-$`grza%UxXr?ID#`eGxx6+RpHL1YzI1rxcyala`q3lTCN>u&1g zx@k70vCc8N0;hWu+g?f39R3rPC*CofQ_~fx&SADXqn{R%1=sSDuSQ#{g0Ck{3He)5 z1-_9wyIb6J-&<5D>Yo=i8ZVO5Awo)Tf`8;hs1R3_%S+UBKg^ruhv>+&9AFW$MLsHy6AegSUl;j*^lbSH`!9*jZSnJqrdcM;X*O( zbX?C%>l$O1z4LgSDnvyJS5%s)R$22Kxl&E1@X&yJXFnR`}|Yhe7CtNd?fabh+amx zjgU0}k8r`qTevg=%PPdQ;QRz~e&>3RZ~szE_ZsM<5nLJTHr!X;lzMZ%3S0hFeX3tI z$1+QJGm{rl`jA;zm@F(W>?&H!Oib~b8E711&MMZ|XZ?7hYT&4;J;p26&sMltgXn2w z*J4||aP2$JqzSIS5Z<0}D^V)I-)vDarA))ME}!~iqeW?q6o<%3?5N3I7vaNFJj^&- zhu4ca*q76u!n;txeJqY$Sv!y5CL~Yf+6;EO3s?HGsSoMjvA-Da@@%Xz3fZ15Jc<&M z+7Mt)(oiBbdQd)pu1knXHF(TzM&fuiSmRlPiT})$4`W3;;U9hah`++HqfI|4_wKsC_kC=#QgkxGBpts4y>KSZL7A`j9MK2s} zMSEgrM{&thcsxS`WRJC8h|#uN>XO=m%&M3kPUX`?4rB|*3S;jiY>pOG`@&lq{xFto zfBa4*b`CA$W03H<4vB*_>~Y{vT+)Tm@g&)aB5og8MSNjgJcL7qxt+IZCge}v2r=!A z5MFfV=?eCgV6&I7CteiM^HQqtX1Ed{q9^bhZ4amlM+~)g59WX-!EV!MVJs$oRtELkM3+{8YBqW`8-9R{WV&g#U_v z8MTsWsRaEo>h^YGIz%#Uo5~3}|UVVus+^n$5#mHx{p^Jo=8i z+UGDLBDsp8*N)A>`VbjI+HGUGI7)}-JB#AjQ{h!M;XcNz)-3=g&(mF+E&~wc0&XwJ_Q{MM_B$l+$p=Ne^jI z{)c;tx)#r@#8&A5PT{1b@Ua-rlt(*~bu~D)NOg_6IGNjnh?vQNG$E`i(MdvDAKdbi zs>UTby;_uITRW5Uf3P+$1~S?V)$`nQ9?zZga%^Vb>Tz8etds{bT!lUQGWf>-*rGIT zloEL*tQBc!7?y3>mM)}L@IN?NS_*+L9Q_GYed$x5&-%8NRD z{gs2ivb_b*x^nU-rF?a;dX8sF~AY(D8r&ggHx$`REb;cQEMtb|RK`IsXpM1A8@j?Q4; zF9a!aY91xpxZZpJVyCx|Ypo~PSnlD}n4L}VAI#Tb*et_t30EqzAyV+G$jy>C&LO~3 z*gubJ-on|+IFuq!z}V;wTx+VudzJTzZ$9+K9dhv|$ z;iK|c&*Ro8KDE*gq{ojaEbWsj(s2`3Yqm-O4s^G;X{$od>;$KQSjXixaD0{`_;%v$ zSoZZKv@cupLMY>;y>5=`Y?4`ozPMWES^n!wNfP2}@_9V=6I9X1tH0GG829VDSzPVK z`qu2U6CQm}M5>^=AZH{9pW1UFP_UoOjl5Md-qZ&*qy6Xnsp==DfT=uf$7*N6x)Nda zxRWCs3>9p86S$J_IKeYscsi5>B_yjL&E>eO=IM<%J&l|aoYHZ;@jyDc3jRwqYyVya zwhZF4n-08uJ%lU&s&_Glvb*!9Wmx{0`ig0by%=Jq~O|yxO(i15YDdP z{B(8?wC^53(2GLa~G`3v7;MlenPwjcWUC+h7;2` z<0)iSCGu~Mh3ifAWByw;=wWj36png`>PopOOnBoUWdBRb7(FkK`l6&k|0A!M?Iav& zL0WxOU7l(a_F)_kBZY)t$P5(45Lr7-m&*Dt=UHCn+;|Rx8}QLnIMb5XGl(olj)^nA zfGti4o!#^4vvuyOOs>@%I&8H05iQ zkd>Op_}k(koTv{MKqNwI1f28qCZE?xK$aO;X3WVxgz)e=I}snMv9{0Zmh@o7M#_P zewF<9DkG+o!&o~8o1ax~=)5*i1(D2xPl3X{`r7iEnST=nS;h&Q|G_(0RKx$9tahz%> zS@kJI@?c!%sHYl3J?l9fi5EU9#9%mgM_}bAO8a`tC_=pj>ntI)Hjmsz0sDS6xK)qr z%4~}iK1T~D>JT#)HyzT9%b%N{#T4f!8kJV*)@^gRJCI$f_C+;eugV%vA-F3}-lAXg zPFE#v_;m=@(^St02UUQ-oU1vaqAryfF*7ecCI8uD#1!3}OFs}0E9$n5s7ahTXX|k_ zM!5Vdk!@LBNmZomU!t0U+E*lFDVGxRq=z4tBEBPO|8QXhXIH8}yq79O>U^Cs9>|_c zL_^Yl<~4+j;odyeM?$riTdpKGbN^wtiF9A#(sC|np4fo=;dK|2Uw|k=(5u0^VUO3J zJRe11yl}S(39z||0&W9qa&sJ>B{{y7E5iwB%t3!qEGjeeZ}#Q6ZhT%X+>a818sYrA z=59P+%n=pF{KhK_QWLe6ZJIxTI%0bE3m1zieZPpF3Rl`w6uS}Xj&gDmUgxf7GtMMVtENq$Fj*o2<*s%-?`9*?BYC55Bd>bTh%Fup79K%}wJ6fX z<=Ujz<$~6ZG~x*F>W~9BRN6R4NSQ){-hba*sd?2)HS*uHyqKQ1;$b(EO5hnQ+#AH< znrgNSW+Je#$)+RG^SL>Ly}#f*kvl`V93pHj&5l*1jpnWrb~0nrBsL5nEk($*)vWjb zl$(EA#DfuRD?&nH9E$OAI2#j%UA=kINqw}yNQmi*t#E&W%C4K4mmZNn*a2d?-~)3jQhRVQGsJoq9@M|vRb0pD4%RZp*yMHu`Ns#lHhgZ(Rbofn}SF_ffY zq}hx5cjw>L7aA{@H$~KM3LN_d$7&ev3Q-B zN3>Qyzsr^i@3N(ad1<2`bH6^1M(}(ZVFP&7i^IeC(p8aS!$XAIO6aXMP9?dkiuenw zS2B9q8!B@%QPeKXnaafu_&W=iRttv)D~?mvZ|d_#EdAy;cX-QwRnng;=lA#-)h9)U8j&) zReM_ZmaHB?_}+MzcSmVHW-Y^^9sX@p zJ0LUjZ(_FR?!v>$$^m%Ng_D`W*TDq;i>lpUw}j2A0K-ynuSRlz_67@yPJ;6STyljS zL)qGpr{%fUg1FLz*$bCOtLGcTh}+ZInIc@XP`8xdY#v(*duOUHX#0O+`)c96aOzha zG#X~~N)AurWj$O{1n0hdHD~8I#qs-37m+7zxN9Y(EaOO74w#eNgL}S$V_kMT2<}sH zjug};jGe$oT`4?1-v$g9lf%E99D&~|4d33f6eTpWwijoc<2INyYtc;X11ppS!@8zy zEl%!aPPHXFNqE(oPyc9UVQ>SEPUndZ*Noflc4swMyecvF!p7R13>0qUAqC~~-{*TVxjE+XF?2hw zJGoNfU821bUAUDk7NL_Zq)`d|@LnJLf;_C4(tL!g*22w+9BRm&T){m-P+j^0 z%W<+T`>S#Ncl^8ZGEH+~Qx=gnSmpX$N^`XqyPSlG@to4vmhra!Sd`B*SQ8>#QuP+X zy4J)iy7phBjpagNR;LTQtFV0uu0zP3!~3Bs<(p9fFC9o0Y^L4jragZt-hAi;0=p7E zmObghkpU{+`e-k_UWCVd-kXv5otk>%HSi@w*xQ?(y7;Pf{**Nq)2R|HPe<_Sdz@Ag zlr7k{B55=!niX6?%oWr1m3%73k&>M3MI>BWz@DE~NMdGQdTjpShKcD;2@>3eBcoM~ zgi-~vR}hB1u-RKUy;Nl>UN_=vtZ<|=0UpB32Kdz@V;sBwCZYxVhLE}n|FR@2tgTjA z^SilHA<{Bj?FpxW76;wsn<~z`xk7dy*5~Eu3&69$!lsytJW>d|pO8A9<10x`7G5q= z12#Is_ABuo$laN0%YPV zBlx5*Nh8V@-G!UlY8Y_=TTj7eA=y0${FN}pkWLod&B*?Vi+TAH<2vq{PfQ8+EZ|jy z;5Clzg;7lII5ovq!q;CpTTF4Bv&R!JT+}IuS{7nqnRyb8zvn8k?lSB^dq}_lh}dljfkGYzOKA)&W8*k_cu0< z<7+u~MhH3c+2|)+2@oA-ztxEnC=1xzJ znBg;nFSR(;gKdAZ!9hrj7Y^79A3X&B&iGjgiNA0wLpbj){D*_=qJXFv;b0rw;{^ZS z?1~T)=28T!zj)Y-Bz3y0vNum{%IHO>%;Vr99RI>QMR;G5%}K(Enr!OCtI_!A3J~L3 zt+N#p+jC$6yNeUq31=J8!sE{uve8!Xi570B2|<~nwqB-wd1DsgOM(#7n7A3FuheCz z$-VeAln2vs$fJ51jkmq_ca6!HbCp=rpFN{^HJA6p$^8NAD8YRON!qV7x+DpIbNM?? z*2HE2A^ix>%Omy3-!~n^6g`0VeR)5OE5)%@qSC8$Vdwkyyj+NOxkqx|UwGmroSCjn z@;h^Na=Pa~qrI38)mL4Zk5yGFe2*9MvITcm3x08ePeql~cr=7lKXJ0Dj{o2N!tp%X zkkMNUFej})?<(=wO^9_A9LA7bjos;5+ag8RwG>cJ#q^~&Dec&*4|d)Bp;Qr*_n*96 ziQ81Nl7!W2{ZoW3zpD`&&*rge$|9|;#It#%m1q4-&Q9g7k8oxpZ}jDCoTIhr!Uh}R z&S)<6AQ^5|!m%3JS$PQmC%79dL=?wsB^#!(bB=0nY-a2wAtvu|;c9Q)P0zkAZ<_Jk zLkK8CfO@tC)_jW3ph{SfXq(Ye#C@5yi%k|*+PH2dn~-9z)lpR2p*o5QwOM{P!uL$aT6 z`X4S-!YMDDHUfs9YAG(k#@0kA+Vofy4bQ0#feU#(o(pX`+d;PsdQ^m$OL^Kr@eM+| za=^ru+FaJiYrp(=?Ix!4;ljs8#8<MgEZMi|NRZWYptuFOGL+zX}CYM7dZSO7h_c z4s<3{UpJ%j|6)+wkGE>xuKB(>k$s8D780XGR|KZp2&aRDLltO*O@weHPEd`-Hd){v zE-F3oyfXo-REGOh9TnO92SGnBd%2Oh$ayeyCL^=^0y@kRO6NJmaOF1n}UqD|*awam$P5$Q=W=*DFIKVF#9LS4 z-8_^Go9ToEcUXINX5X5}X^X{;B{(6w~p4Sl^xt(ZcnWY^Y7* zOssn->c3N@;FB!)e$Sau;lN6KtB_WQt#QJGnd&i}^WU zJXOOV#}3t^-cq>Ll*7Le)Q(GI)L)m%|7-Iw9OL!c8!gD@0AceatXFWZ0S^L&(-ldo z#rw&4bRjiOc-Bch#b_uGwdYDT(pzx48<)lrR0g*~xYXg0;u)E|;T&4EU$HG;FJ@U^m<`&v>}z3&z`y-F5V zTM*HNkOdGrqh+UT%RMF zPF%1d#1w6(-_m&MuJmVDhH$tYwiVeln;cadRbLmpJ5LgHK7Qp0j0iWA8wY{mRvvTniPP zs}i7{6C)(~WF?!YaIArXLxQHEq&vU#R?Orr)ktWqm3LoM;@BXb4Q0z@tXpz+B4G_V z;V8UGE!P^59LvNQhw*s_Z*N!5kJYRM2WOOa}bs|vRWTkL5!&7r7 zjc#DnV77S+PGfQZ4(kxnrGQ6tMQpYF#VaSKz5UrX3C9%SO@NTBLw92<7pEZMdW>+~ zoV}xYxs2NjG||9AMZ^ihU2D<7U2G9H#|lc~a`!ZX6NN8}a2cy!#%PEmN^@;4jy6JO z8?IMC>H5FR7VP2$%TVD=d90m;i?PCm^1SHHt2~;KaS^{n2v_2T9d4rOp#kmjvKMTE zg(JP$t3+=s1*=x1SK?+_!t|jkI5Ry=w-ZFQbAHu>kQ5=qQ#dz|^yz%RVK2`?HD_9Jgx1TP)t8NVj&Z?etV<0b59sWXxB4b(gu%~wo0t~TS1{=IQ$ zy&bE@zh)ZuCljIAA)bPzjj*{cZkpL)%=fwXAafMA<`6!ggTHVrPEaW7gZfyHRMp@+ z;)IKTu%!&AG+tu#S-mH4%uPrbgmXu3n<;>9&j@U%sU8L={>3Xrh?%WMZFDX^7w1|Z z{4Iryp*&p7ogQ3?5FRbyv#wD$#<~Z7z|UJa;wS0=ef*o%xx%KpT=Ej)LxksM>gfel zsbcbo5oRj7_k(_1?9a|cIQj}n#fa>$$q27w1b^6`B&f1k>mS%GT%W1xk=J$N>|~DB zm zrJ-E1;6Y2a{lU#*Y*>NS2vz>IPm_@fJ{efpbfPaV(V~gi9<6x`mMyR?gOyH-8hP0d z;FdYj5kmY3!sl^nE}wh^8-1;|$=}LN#Pnh+ZrQqY;h~d|lp$;=rIJ1Ag*n=j+l#QS z!P>l%K4aXsraRAqg^PeT(VI|&88dT(nG3^bIXfdn^%*$rBG@kE!AcUUaiI~hd0@9O z-EgHfFJc9Idm(Owk}(YYo}0fZz-4D|9P}F*_k-(SxVj1NCz08Nph0-d;fbdI8A(`y zLve3RlDhTh;arH5)v=kT$~;t?t^?gjN)Wu8k=dA+b2-$UtY7)snJ=YzU5ap5;Y9}` zW)c%5M0QXwH!Odh`!0AfkJBrOt;p5Jq}3o{BCjWNq7SE9vZ*$n!NTXE1e+_^@Op-D zAxhZNfk%I^BS7#@6^`qbFfOU5i7$OQp|{D8`QOw)Om~a%##Q)GijCj1eI$F$iBJ*0 zYL(EN;NMuSYkG{cv!kS9h=s)oiPPD=oE`0Xv0S}@(W&@kCG1wW!@p|l1?i-$(YEg@ zjAtK$TX4S$JNt8N44=!haTu381P?o5udY!tu3=JXu60ym<4)Dty^yp1qIUG-rlcnd zxw^>8Xt3W{=`x#$#vC5Rn(lZ;3a@(+Qcckv%*+k@P)rejDlMBcfx@S{?43dQ@7yed zf1V8}$Z_sAH-&WIR)V1DNuK&bG+K!F{di<4oU239C{8#FpE}|(8yA1!(PFMU3U^xZ zxF|k$!i68nUe0bU+cYSDJ$mjoH#rp|rWrXaNFKz&@qC&<&|>_2gs7%`7{d0NtXYA_ zM2;j0Z#xh^0h{kwQd*`lC2$*0;_ws zxM_8y5HyM%R{Eb>=kKA$cZ-|0&1Bmu6|&nE<3=O)w;(r22&t-|ludO|X8fb}T8sr8 z_RBa>2TOaD?m8t zC7dnH=JtxAZf5=s4r=EqM6cqF87I0C1=%k$G!-;A0Xk0t-X(8)_gv3Bm9mQX@ z#j&IU^qp66ttFrQ^)?-mzfA{->0n>(I0%`Y@J$hX?S

S#2da!9B%iP7(G^Voebx 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

xag z>oQ18CzK0X6DJD=cz&A3$L9DI$0=U4Oyl-8eDV@L4q{C!97fOA- zY8;39tA`Yj#>8}?H&09Rqz&ul@}VTLE~0xHU0Fo%G~CR&S4s)3-2It{LkZFEX*5}% zMic2NDidI4Ztykk7B_wM5$v_K>X<*>KZ?n}K3lwX@u+K%u&Eg5Dw0->3pI)S9>)Y> zPjlRAlQ4}4`(d{~+*G&C{Mpr9F?$EY}H|hk-~9H^+x%HH-Bm|z6+(f{txH=;MiY8t9}@k z!lP+Q7{zfe&wuCkbgjFzeks0L!t0v24k9E(*gBNs|KO&lxW1&xrbrsY3kUZ{5=t4e>=X$nqr!KjJwN}sptu0{m z#g(3b^Itp((JDOWO*#qtw2B&!F}&SUlc1Sw2@sxCA}2?PwiG@Hk0q@L* zRpxOTjMS-{MfliOi60$q&-*AL$4%JTS*b;z(BXrzx9W`%+-XPXN)E*eX?1yMD|~el zp3GL-^w(^Kw?FXAUC0m!_Og0-D+W(g161;6oXc8oxbql*wehGeCQV8P?Q zDjqd6FFhvzfD93nOEFG0Bf?*J4i2-4?9B_d!n5 z5Dl~VmnW*bf<87*#6hQ~ji5~ULXK3`LV-tH;+`dBDc3SpH{LopiJ&<=s?XInxO!_M z|1lGx9)fF{U>76Y>5HunHml^1wTzfHISE!l!r4Gk!S{dCKGESq@Sm)2gzc|fZOyYV z;aDfd*85^9?6%T(e8C8}lrZf{7Q81b+o|&Qo7-@&oObjw{$+13zJv>Lt=JSUB>&7q zH(~u4p85*mwMZ+@t2%0W%*?-mO76|#o#6E=FWQhDDXQwl_b+Z&;>&bS_2O7t(h~&x z!R%PY&KNx+qbIjHTzI5$Nn`5AwmXR-Le_Zo)U+f~4H7Sv;i-fEd!sk|aS}&caYjRz z#`|xa9i9zek}dzdU+6C5qt-6m~nnGv6U35 zYrhHW_NwP`lQ-kbL` z$SuTO?V1^H^?T)b(}vx7(S6hW{aZ&A<>S~G-dXUv7pec^X)Ema5mh%5z8FU>c3`Zp zeKd@($wF+5klhSd;ZdmQR%4-4xHgd0b$L*pOLcJx71jg`kIJxiF}a0_O%s9x{!Nk^1?Q+O+e%dEl%@UM6!D*JDPJi4>K|%s?SPrw=cI!@=>7!DZ+-oc(|Oi zMcCL%S95rpv%NB3s}sA3Ed9m3^Y>9_F}=hVbrBuB8hpOZm`&D`rGx2p@kY zIzxEwDI_-HYlO!tvHzQSCc_WLq0ll$($wB*M$mWVAx1 zG<=j&X?->g<#byzr?5};wO3LHp`v>qAJT<(#vyAur$}{m6GVSuSe>0K*_$9d_?e9=XY40zYRH$O>>EkSICZ!R@J}(l?54Q( zSpiyt_GL3RMhh1Q^Flp&2=BEQVvG{3M)I`>cSmtc<%ue?qY{z+!n@Y$!3DefAf~U& zh+o2naoWxLlp-of&UF+v_Q9>1M!!QFb9^-W9fVWbx)^u2!nr^7C$qg1KP z%e;iS@mk5Y7Or>-YX{=dk{5M2tglw%1+}{hH&zinn6O%;jb&?jvU(DzWe1J7_m?sM z2T&QWWxHzlSLAeMf)vrGDc8M4^_>ZF6>R&c75OoLw>A*dD^+Mc2bX1v%lcI1F}g4JCOwn4^7pFouI9>Yoi5IWLWC7!zn2iK2=}hS^BP!BCakqe)nzp2*<7wpP$ihI zDxo@Cl`NW>f3pPczmrsjuYVF>jyvC}gR*rZPlv0I89mPv?n108hMmd9JY!Ih84%M4 z1$gJREHLuuq9?I2M{u1%;uszlWm79`LWMVTaj2^?asOIGG*jW>60)p>b%~+?%(OPd z>FC{<+zP8qda!ULM|f9Fmw8?d6rPvhygAt!LU2(vWFzMErJ?#wul#B3Bqp0SO3~b@ zG-q;!_e%+NIl;ntt?ghm15bbB{0jE=A!ACkP*HggwP@`UR^ZJPZ)7sdT-ckg9T`9l1V$T{(J_ z8NcXBk~SPStDy*FF1-@xJ8gwctx5Y)-wK~s>xAeQWtq~1*Hu*s=YMiUA$@o< zpI0sM%3~TCjl(Sbn{v68>Z_3EE^ME`t}^Uzhh+t_x~LY8(K;fjlRq1k<9<|31)Fw! zwHN#wbEGnxyDPC8GxO3$uleC{av@_7IfZyNk(&cq*PZkT;rKwT`>9VGL5s5GdSS+HkA^A3EaQibFl{u|TN@#42`tS*7sxO{Vcfj@+(k zW?p(?{u_)G)6D_wD35b@LZSq>VBx*$&%T1!@j~t&B&v#>{@DG?`~JM^!MZd-mARZ~ zhj$Gks}WI@2R~{y%i*cqo20(5V1mSSWDe;e!dG{}t|L3XXKfu`6;huv;^yy`^RYM& z$Klh2hz^|Z$`(!eEtNk|^Dwq~>3J|(-y1WC9>`?AFaAQ(IQ*-# zOP>+r*1YvETW4^m9u8T8?KG}V!M+7H34(JYE)V0<-()sao^@iP!u2Dw3F^+-vbYxFvm!x#b1pUo2oViAqgXYiN9K=epqTcz<553F zR=U`frvusbE7$92=Kdp9GC6>R2D%I>+FuBnO7aYDjOTo5tOt{@l25aFRg6t}$H92o zw&V!05yI`-tacUE%JN|+&c%tkJWl!vaaO|DE_|&-QU`1^1Z!P$Y7FByx@r!onR)3x z`NQoZrW18I{XO=T*fSgVm0aw_&VKk+<i{k?J`{ zAb0EE1b0<67!P#hS#S}>6gGLaVn>ADFvjtO`3nxZ_OHOLa4eKqoh;oC$Y^vuT!b?n z$!$txy0D7t{qXNZK#G2*afjbnjK5N~ufWazyjY;{eN@ z`O`5*Ofiet6D{oS$)_beugc>r;k}!1$ecYLNEpw-Qap?k-UJCDzwxpmUlRnYp*(Je zsytBI;r&ir|b(>gTW7QsHa1BK{k< zQCu;e=ZbEz`EW8jO5mcx`~C#>R-$BytA)Vk#M=t*d-K^%I8mM*tq3g7eoH|K;+*c! zhu_re8U3@p12{Q=$E!&Afy)CqK8BaGd0dPC$JSYgNp(D5|Eb{vy9u^fut0Ev69|$7 zmmt9*!6iU~CAcLJSa)}Kcg5Y^-QC@t_vxPRK6~N!{s%iV_xA1EU0rqR)G536?9*xn z#?yVp7i|8X=TV}HBSR~b-k#O9xb`>E%SoHW87Dpc#{5x8MWTAL`FCwtVcQHo#0igFgfp&YDXJ%>Su=>x_QZ8ojcuM+;b~hnV54^&vXEOI!poX` zGz&(wC|ubM#N^eVeam_C4LLuk)*O*FIA|~2vE*$-BD)bXUtP_(KW_yIJGFf@#%Id1 z?wZBD9^@qp84GxyFC1J#&O)+#Dc<8J*yDyWrjWke4iFrAkn%UTzr)!_NS~^E><9K? zYrJSSeO7B6t1Gn{3(HSj+$Y_*Uxml5xLN`qo%u0(@B6Cqa5AoC$(*P1PV2J;?*{Ds zgMH3IUNJVdRQ7T6Z^UbQYt6#xs3fM8t~_bYCMVI2s?TbUtkDqct&5wJ;Fcyl93ccti-%-?F7IZtXcZoy*NxJ%PO=c$XvGNf9n)2`8su zVfjhgEHOkR_Um>g%?%h~zg}?SlO{Gwh{^7WZy@NR3gN-Hb*yxijaMvm!%yScklN92?82zlnDh zUe>|A0T;d}FI?DEg-xM??J!<;=FI~3Itvj4v1!QpnYdW-89ta;o!9NiP83~<_P!CS zge*BgSY;l8ag(ib6lI@2Dcam_X?i-3)6+OvilBnxCs>q)all7Mzoy*4R>>14Qzu0cY4O_uRdvrz;Rr*-PY5Fil z3Bla|kITzh_cKpJg;!r;`zt#K^U+&Wr(*xEtnSX9CMsO~P?k9DWtO%wSy`Xi_QjXD zmHkW{?RFzx=LiQ&^T9)~_Y&fJ5m=o4#Za9Oyr)x;BD|TP25z*V0U8-JvR~e03;u)I zUYmg0ymS@ZXWNp(2yn$AOK;dG|3R{M!Y+~{IW z;%ehij?hG5XI1Wg!_GPcEaHHbmKix*9hcTzu@w$=!?_R9{-PNOpMl=?V>sJ^1kKbf zN`GFhYdV)A?EHd5P1)Lu&|twkK)BlwmzM1F6nv|&ZM3?W@nApP6R&vT+BdxHNno0A z_;<3W^K>j}6;zqRF>Pp#e#4$r;b~n0I*{coyc&SxLiU#;vNq@A^$Wh#xjg6xaZ!5f9PDHYhpCZH$RD(92pSK6` z+*?Qu6Rx)4;CN#78ZL@T#B}%b^stz$mvc8%cp4b!M`upCU8bC z2xCYWP>krxJR5*hDU_DnmhU;$m9wo#{+8pv@uVkVzmeMv=W1$@Mn_c<0&`6~P8J-y z6W^1!KNB;Kl?&AujqI;*g*A+0Z99clTUdUA1fL$rrgY(9Z}wK;PL6P909U+(4@)_k zEIg~sj&Dh>#NDbWqTQ(~9MsT|aZTF}CZ!2Gs^L_P%re+^BW@=9bh_A>@^bn|WeJ}5 z;oNNAe?`<-Y#I?8C#-Cy=nxewpA<-y*EzweTHtP;SS`1b##Z`Y*7;J!I$vtpVb-DX_Vl_p7P5sM0 zU#i&WODzZewdVy=WvyMJ`q~FKvFd0g20!OXfjljcX9e=SK+d?!S$Fwl5rmizA7h4V zwTIwoBY2nBrFN;E+1w24l5F%7?wTutijepX^*5Ix#7;QoEo}duwf~@mf!|DJ+XUsN z1VjtBMiQ1Mcv-TgC;2T2*U6BIh38~RF})FN)Ai0Ma)8Bj{3~v$9RI)Sl^ea0*cf5= zPpmA@o^sqW$4W)UFakGC-ZCDw8{&niT3RT}!t#@M8XY5AiRkSgsE$p0ytV2<<|JO1 zRbMq8nAa19$R5OJXjp&3B)1&bhTuOHk8Z4q5$<`2YO#H*1czIY zJcuJL*lfl7!Gx*g!7O}7;iAlJkZ?lF%M>|8VsakIiGg_3<>kLTnZwPxBzOx!O9=mx z%=T;?pm=uHz10L18I|pprj0qeb!|bsXc;)wtn;&A@o)_iTN3$&lDW08`~7|Og z(@rY0^dL{HV$4Ce`ln;QRB_B#L3a_P|Dr&MSNbX6aMhAC%eav)ybBT%V}<8`akV=y z3xvnR+25Qe(|8yryspO!NM1yik8ofT>lU%45;3`=9>nN4pNDlVaGS&1Iw~V#VOf4u z;f@$ACWnbUw$a7c7b5qHgMT)iXuopM}<6sHam0?w70!oslI?IgXj-PO4 z3LZajy%$l937^PA?MNBxNg{ve&X+iO2@k8Xt|L!UL~qi=A;P5?!KNJvvv~3wuEV+1 zon4h#UyqO^!L2&ada-U9{&TtQsEwKN?6}jCjiXf_@8~Z?wk6e8cwe41<2XH2J)SYA zf3z1j`tr0A`+n!%9Q-xZU<9&b-35Z;6Q;;Rtc2{FGTI{T0+;mb8 zS*N1qs{*NV?R2nOH`imtYFlwDDPN_~#Vz})K+eU=`B+)idv)(My+1)GR#xOqWxPfa zIfMI^i1Zddlv7Y*Xgyv>2|3@8Fq3t?dEly9WjAVRjSkJ8E~?lU)8Y1PTfoj=c~_Mk z6$xv>@hKF{;;o~ws-x-$mLD#pR8ytUr^gaFQaw)j!YTMdOz|V>rT$j*h}$hqv30nr zGn+*|%idb&ny@WXIM$M+I&5u$%AsBPinl$~&y5MlUClW3GY|WaWm2}~L%guP8mc=& z!E*NZ=k#>NpL*Dyvwv&FvylEg(_o;{+9@RF^lfP*eFUAi)js<8Og(%_>AP}cdRYT{h!I6qv;mwzT?b)cz6q2YV*KG zxT=rxqN7?&aoWi;ZvB@Y!r4?|Qx|f~-i9&2y&5EBqzO)QaG#@KjuRtsjuSePq+e>$ zqn}#v(nZ*Bsln9KGk7$U8$-#_hnf+EJL4^+*C%5d)=RO`&sP-Mi|JM$QoiAh?lfVv z-s?v3raN2ng-COKg%N+wv=?r6B{@X6R-I$X!ugThtIE?fAz%rm$!JAvcf1mCRLEbBe`E3*anMuLIyL5OHvL7&2#!o3QuCR zt*E^ZKB`^q;gh zm8IEUg8Maj{5Pj7DCowqHZKOUx-L&!@n$Y-1BELK)Fq9E%B2{as&ODsh)mUBT-rkR zHQ;z}R?lT?gmBF4%^G*m^S0bqQEzK5>K#<%pNZ*4wh&l>9nM0=Fe3j?_sA_y!uxC? zB~u735Z?ACBwX0jmU~|lRF2Rv!M_u0+hVtnt)4;51%mdc)_CwuF-& z!nry;A3#J$RjagDGsKN=cAXiCGg>(hg&fV~;0SJn3#;__jIr^nlDH-cd!qF{#uu)!-^6sv zLvX4=kh73!BiQxln454(oj|2HxsX$(*!v9;PJ&-2BI=SjoT!GpXu++Y$Z!(wcV*LT zqQGGWSH8to1M^=M-k`LYo>k%fcdSLNPvelDxQOD#zDU+XGJcXbmTU*%lsPc`vG7{o ziRoG!?zG`jS$4Y!P7`=5>|BUPj<7yhxc9Bfab|wcg(e(TXw4@p@^O@qHI9_NJg&*c zD%`TsH#P=j&ZF43nAqYR`JU8~?Cr+>Kk=xqs2=CqaK0;UrO2489;9gQgNvI!ROV5L za9|)iNAO7JRg4(iLpOaRW6J2L;;MJzNNX-PWmlFEY@v7p2g{I>ETm~Bq%p&{wj4K8 zh5R2?mLktp*zaR*{TR83_-Nsjn_!zFJY0@XKhj);l!>JJ>-!dAqhd<y@cwu{mr{hs zO4_#uM}OmSGfjfEuq;2YaJBs`rnKc;>VqmcJ6wl70Yb5B1 zpU4}-tIlM$!-dzV@IVgnz@D%32NT;Y_Y43pS&b$#~U(t-7&5or;!k zl&nnRYvq(Z%oD5No>oc_PyN#=U#d9i5WPd;Fk6f1W?TF!aefi6S}+gWGNe{iOXyiU zu9f3WfoO|;tP9tz*k*RNjRyWzErRTXJ!MtNK#Hqy*IPL2Dm=6m?sQXDEx!l%OR32* zW>M}8#ijxqN8|DpyP^e$rQ|nI^uNyfY?2oKuh6e|Rz37f)%vo6BLvZ}lOgXNq| z5W*&^NixEJXY+*6-^k9>Lw#f?ID=9e_6QXA*oYDlI}<8AaTC@L!?_1`UAg}w+h&qA zm&A&k@24(l9E(FAax(>|itGs%E=*@#b&mTA4-|nhLP*LKHZQ?hJH&MgAEK(5(&B_& zt+6Rdwu|uGPdKObe2StjFCW^2u-1*9jeF0b8D}*?(&($Zspgt> zNbbolJ%7d@Jo<_kdTxvev2QIL0)jTwB*5aLpVHBN$Uw(#Ny+`eM#*KFyDcT;vw<;f!AEAzNE z7u*F4%koBIfPHr&`}1nDl3-X{Uf1opkKrlo?S~@N-|!c9dkJsT^ivoU{|VEG`kgy{ z*#94grx9O+_a1`3kkg5z7TA`cpejoH=U_M7mSDe>-T(374-U>DK&e$12#(EI?JDH; z-Ce!@jyI^4->mDcpAzo)+gtu5hL)$Cr`cTD`ua_)|=wI%GE@ zGOPb##m~f)PZ?ViuafL3&iNTU{(?ug!YWt6qd0k(O;T!-t&+ZH3ZmEhQ1K7P%sIe7kpueGQm*ciJUhtO^v~_h#$wJk1ui`3vuK_&>bRcnlEJ!DQii z2ac9x>nIMi;$tmV|I7L|yc?!%S?DAU->wwabj76u>l_5=}qHd zvBO1pKZUT`Y;UXdNb+^0Z?pl&y@co_A)pd(2eQRe$gRZF0TftqFH5+SE+m#SrxxE9 zNR{_4T8L~*Z7U}wJXUnCw*^{wEUgc2KEl~JAx^VdjDXUX3dD9%)E>`7A?PReX=%BH zAsqD;BJzaCt?`c$PJ0OiduIS z3*U1|F@^oZ=_G9^j4;HeB;i_Bg1;asK)7h)Yzy}O&66^0oW!v<9M&30bqlXkO-z|- z!rQ9sYe)W9WQ^o$dtT00Hyc^_r9oo4IFh8!+^V73BJO24JP?~;&GvaZhc)$iUsb6k zWRJvs3@7}Bd$rk-BPxWq)#iMAMJ3sHe>@?R)uoNABRN;NI*}VGx+72I2yPEn^|dx_ z+50aitT^9+4L=iT!QJYrwtVF%3YxRelEA;&8X&|E=g~s4enC}>UN`&s##L)yl4mV= z^(ET|5Lt;h7h$7^@UgDy|9i_`RG^VQ0uOD*j4{Ir^RTbk0(~);Vp5QZ@jGnxj$J4q5^21 z_Kjlq2)1=)TL(4iMr13Z1UB_~tgxCtu$!#b%N-{nU^(uZ%`vfXTqDKwp(^f^IOi!G znTL0>urXHHSr?CGO7HqaMQoPiJB)n`xa}h(s~Y8T+$zoauSprmy$m6GICjp$Z7cRR zS0S9CgD307YAY0Kt+K4EQc6Ti`PH!_&@b`qZj2^8h=0GV=JP1}O{|C=q#SfQ<7`@#{l5Z!ro%lAZ$ zP+H3mmvEsXJ5ziMpb)+b;=7f`wJ`C^59A2u}P8ZXKO^(94GQ65W+;Z$) zh1l}!Rmn*G=D#T%|5x2iyBBjz_0_1#Zdc)Trk>)WFNo=6HO?2K;1}NZQpBMfI(1;2 zR%b1@TD$O?Rm60`UwAo`9qu~EvY{2X^t&iB)BDO?ZLX5XF+Y=Mg-^VY>nke1`rM?5 zns=wL7l}@BvA_bPgM4x5ec(7X)6TuVtWs~m#d!}AMSlu^%tYv zzgw|T{Lgrs+{s!U@5&@@M+>RpLZpM>HjKQ{ocW&B4uY4BaHuY}Rg{JOjNS7jO^7H? zc12cAPz1XD3yJB6v%3)BF03n0&`4dnkUfg@8mzM-)SLn^hGdt^l01@)It(%n?MzLM z{>{rE;ZA!Fl~a64&!(jRPR1;SruogoIbU$C$BTZbCYzrTo)ylNGMguguu-R?UuDmY+D_qPxREM6YeYsJMfGy*$h!jJV}PLeE!p{^ zS|9ti;Xtl%Em^o-3-5WH?ab9V+&A|(DT10rAx%;7g4YZpC-UA?FV`ZZL`-gV2>A+Y zwKT@@;!EDT3U5`nYSr7X7jfmdB8N zN1pK9T6F1bz%Ohqr|M((YI1}zT5|fH4^F~`e&&h$1XQ^+|pn z&VNg=nQw30oN1oIo_++@BB(g|vBJrw>Uu@*Y%iv$Z&;fmY%9mBMw+OpI0YA)@uVBu z=CZ7l{pdn=IH?Q$sTzR8jpnI*{kxSkYYJ_ZKa=(1GJgg1@ie zuK6WKMNJygIy0Pl)CoW%3*uxZKrMB!X(Rmt$#qS`QvIE~!> zP`EN$ipeouNc#^LD?(b6>?z!}5#qxHn=s*Y1LA%oVhkQb3Dob(Xc)GPBdaH;l!CIg zu>VUUwIgOc4R6&^gDA>It!rosY)5t%qV0t@UD^95FMrpZ`EuBdCcO?@&FPk+ysLAu z4H@Rbk0G2KgN=4~jR3;E5j-u0-}ks^wr|_QhifJ#=Un0BD9+>wuT_G&1c6C{k|lV) zTxAmWm*s3*Zfj7@=t1o+g95q>`VuvmSL4ZZ6t;KfeMfv|akMRdse+#ct_yjbBlyl? z|2UkAvD!wo?A|jI-X&E{cgSEam=jONQ^Pe{@JSVNmG4oflI8mXsq*1aw5sY#$`Gr2 zeqtpCqx8N&xV3;ZFTrIoFP3w@o0?SPiR}|BTyqgJ+TvB0m)~--E8D$<XF_cP86E>Gpnc`KCq|uY-%5?pDKk2&(U+mleL_+4&vb<~ZKy<;D04 ziTb|AoT=grA8XB{9!e1EjhEn*C8RDU!@SCiHpX^KQ;H>b>Tta}_vWbXVpoc3k%q)T z;Z7sobs(s-8k+Gevi_HINy7GFY@9{JcwUAIo*6>OIL=SOYaGWSh0|TwGl`c?*;kxn z1;PajuKvxM+PIoMLgR3=(}a(UP;^u4zu7v7fCRx~826I3(Kl9le3(aqi;&PxcSZ>K zi-5|U`hxu>dFd~NrwSE$(3R}@oL$JyW?YLDMH{@IqOWAkrsj?$SvWTqzhdOo;$=%b z!i5U~=1p>OB+smcz--~RV)VNT5z)f6zZ5&yJxqw1&$)kiXvL~IJTJ~+7kvZc;rCkM zM=iNsgZ6B+!XZbL4$5Xl`)kbUMP!%fbt7EEgmVLVKZiY8!kOOe?#^X5A>~Kz|IF2J zA*c}r^Rck}BoUK6gc2P3o1??n(Vw^9;`kT-L$nlJ@Gs<#<+i=>G*wiX?=o45-F@aR zpRP%Kim>M!^+6Gz#JQN-iz!2uvZ(7HxZ4Y%wOQpLY%0OgcD&6Oc621B9Z!>mZT(r< zUE59vvv5_d!WCRuOzT{QxJDdlqgsosSi&XkZ%rut#&9v+%N6zx#B+&)w^R$ajA|V2 z&i3)VSjdqt$&V9-Lm&*-&wiQioyhE~Mz93ge~^ z>&FEZg!bW5P4;S)MkA)RrYYC{<5VqH*a|^SmAUfMDI}w(^kN#m8u>TwJN0tc>KaJn znXs)qn@e(_D-ZjtX*EVYXO`huf_0VD-;Ia;hyRGP5uP>X;Y9VB5s1FmS@A0NBnisn ze~>4vS<2b6su8U3R|*JtP?5V6IP5PRQfA0bI5dU(WptO56-lCfSG|3Wr;~S-uxb#; zoJ5sqxGurd5}%*hSPY+kC>TXrd+xT!rK18mD_VXikSeP@9;i6#ah_ORZ?5Ag^-q_4 zsp68a;;3eY@3fwn!aK9WS@=*OSWi<0=m$HJQi(f_No>k$EvHw#@ayHp^uY@EAi+sx zvNU{SJYNnp=Y^NBs|>IDs%WP5N;p@wAuN@)gB+B=NV`?I%%zo?|&L)51LmixBg~uH@ z+>WG*#MI}xzp!gDX7Y;h!MDuShtKVPsLn{+zvH%>kd!EF$rE;Ko`5lv8rJ}y-Z)I* zL^bwyAa6NYe-j)dq;$ifHrWM2a8-8A;@WH;R3g2WdOG96xo0b?2KYt^ymSFavbu)jvjwF@kvIP%1aK0MnE24A&Ej~rvU*!sZf3r#zj4ZZ3sv9(%7$T+>v=i!hi zJn|MCCUR*Z>Al%CkSz^4Z^^wV!RtG&RmQ@ye9gi~swAe|<$M^2Y5rm5(dBb@I;N@Ehb^QNB?OZSc!PIMsNS#itJA})5TU~4Q8*lkVR*2H`CD+!M!u@;3n*`7gP@! zmsDZ*0yPk$i{&_v*paGF)}u)ZiNCLDVn$~zr!NH!Sm!BhQ+?*<67{zdi+QUn@{AP& z!4tV+#nHyx_?mxnKXMX0Lli*`w-B%o|NorYMWeFLLiByiDnkNU**zeOX zu+0?iYnyJw)UOT3I$3zrgQpAGJen$8=|b>OPB&JXCNDAs-&B287ZJ|miklv4o^AOS zg)6Rsm|i6aH!ZR5gO9E7q&zn=MNz3=F2>7Vh*#nW2A54t*)@s%l{jzV#&le4g^x|K zcGCAUg1PHbgscByGk_bzarl81|KL4>kE1yt6l4ppX0vrHds2nX_QJ~^oUWtZgi!`* zdq2|bMG@(*{mk82JW3T+AGc{Nw?}fnE*}^0{7W@?4+8~763d#0|9sy3sd_wGd|ITk zr2?DF;y;em(WJTwdxN!LjeAFKy9-KPjK|#GWjq#cmBLx)PL1c{3m3slA7sYP z0Pf{fkwttNt_KPae`B4y@S-b8%Xl@GO*2?q3!hPBy9tj<5>*!ec6{cpC=SGtN}QXb zhHqSR?h!(IvT)H}xYtH|j!rS6`igvZh4YqJ&(qm}&q~f-&LyclX9jaLUI=g!lE2ga z7qZOT%*caWGX(#ixKWORwnTixodz6T$cDunEY772;aLp=v@JFs;@9S=V{glJb$*<- z7DCg7%#wutskqXCrP*Cp!JO-VAk1Ib-hrEL!pR!kY)x8eyuF0b3PfuoYII7Hmnx04 z&xB`hj#KH_f>In_sET>t%u%KPSzoCczEXwv-FP$$`y^pUhOo~^*fNwLrGC|4Db;(= zY_&M zCp=ro`Caj?ts{hE+Ef__yt|`nUVb`9RA%j^m+;6*@UO+ek!+a3p%R?7QhFPCf2!H~ zEC=NK9X{XkpriV`u}bfLOCJA-eNBRX$6cKw|L8^M+lq*)+)NNIwIR<8v>8R?w|3)F zh;Zdcl4fy#A)XGxyFWNqiIrYjltIb(c{gBHjBv0e{w~6eEJ5YN3M%t9PuN?W{mpn+ zT#2zOqLt!tTUZ)SE-~%(6t)&4xt+=tU;KqN3PQ>i)xcH}W%gLIYXlDm5Zep45;*9V zMn;EWLpL5Rz@{wMl7yQkVryYHQK=!Q*Zr9WRh+M|s~ua(pOUMot zMKC=3ElRt_!t#@YZdZ<|1`HR6Di`);-T!fNiXLS{{mk-YFDJ1c=N7!U6dD_4kotEIi>b^#JVEd2UU50mpkUd#FbmTm4&){tr^}Y6mJEet~ z4*Kit=%#AqsIa>$Nz-|_kQME4X^(wBHiimWv$$?&&MW2=LzdGg-ksr zg+cmx;WV?9zch1@pe zd_{PM5H+6U{_LrQcRTeIMRqQ@xM^>c5Z08f-ok68VUaBC$`H=BVap=D^;hXknekXV z+@6y^sCn^e&pCf#lWKt$CtMgvRKD7?o%XABIYO>9dR9!zGZW^x-jS9Te~)xYo? zjLR?TI%oT`HB8uL$;X<+h6}E~!rKfXEltSyne|I}GC-{k<6hX`oX33$?yXxC2ad#M z3?ah_)7&hhmvZGRtQ&G^Dl32HYM|izGuK9{{r(_Bcpf91%Mi}B#I85HB8AO==sfhz zIczcW>x~a}bTp~Sf@5(m)>Pv$0>Y_33Qj*j2@obEJZJb83BT7*E7=dlM z(}b`gIO`G%qdj>#R*l&R#(MVTdW2}{3=7Lon8!*oGs2?2jRjjoI0_2 z9=2br?;9bG1{Y6e21!g?Y6Vht(s6F0F3b7gaP1qVKN`qs&1qbSBCf0{~ z?8(rtY)Ii<`iRN98P6w^n=Py#!Kwb7t&ZbAw7k1kV2U@b+yPCM-~Iv)hY&WL=kda|5=v70TuZiS z84=@&nQujGcMc6_e_17CuzDf>Z4_u1P>xm6!s+jct;#Kp@Ef^4yJ`|Ykqeo^!GV07 z#x^CsK21$|(YEVmT3=lkzMgNy*2yGvQXdz2A!52RTGioR%ooDPlH?>jZAnCHl~q`+ zWvPtDDKke{sb~wI(5WsD=a7SNqb0{ugxl44*ovL8!kf9QN)kM4D@Izx2r?RS_DfVV zv=`kt0Ja_2Tw5iYA}qO;B?MIAn99k_SNXQjTsfC-aW2WpUwPRc=MlX997>XK!F-&hXl1hFxU-7$x_Vm$edFrAP8p>Scg6w?*Oy)daFmflo#|qO*9QwMUHOX z!nqt__hNiIav?_VV&jSoC{IXd9+t%`TCnNOg?gMx7cMmCqLLt}Q_<3Tg;crZ6jQ8@ zh2@PUR%iTGKCph_aK5%)A*`9tshZT%y(R9}nIN32&y7$~ z{o@XdBhXi9%Su;a{ZxFKvT7kAWeLp|4iCYx821(^wY3SR7_3saN4{lJ3P-zMUlO=qp$liQm z?-RaCyKHN8A z3b5dMo+t`OSP9LUxsf5b_vMPVJI2F5PCHLUhre?%k1{&h6WWXmDr4j>sJ;(ZRHoIe zS=FNOMh!NUF`bGKp3P&IzYz5UHvbYhlpV{sGD7W}BjzpNyzmG0#dK&Gs*6?BcviUy z?rFlF-drD`8eSc&MUKuG6yYiV16eOm=1{0`ej59Rb0b%DG27lIL^o3#E_4=~W^(c` z-ge>+tWgc>C$hFQ$I^soKfy)UNEvN`Zz<=AUQc4OY?RcD;c*T1S4QLXTC%ZbUmFOOq{^{sHynWiGbMO<;yJ6qxAw@Q)6 zt3Wv33Kvxg86(_pMVPg)*-1F^1D86pVj?j!@q$NY*R|+G#hITaqz+*F z2vlSCUGvziPgf%v?>!Ei;cOhn>)LD`i*>%>8zYLruZp79PUrYYJoS-f1oV>9 zxx&_PA+0j`sx^8LhG3G`;lKwvvA#W7Lpd@H=Po=Prx+Ipb)L>R-B-RM zx)(Qo(&4Cuf{Z4*K-Zv(?2WG~Qv8pa-HUXV=B)4-UR~xc>G66Y4!B}?r ziCUb|`NE18STDwTnUZ@5o=keQ@HRm>)Jx5a5j?XE7F@OWn%0R|!#GrtEu}fSNcGs- z^rc3p?posGAZ*m3L(9VD-B3*Te&l^u4%FgswBT2g17q-Q!jU?>E5VwPSo?^&n{kUA z)%Q0dhP&;A{C`ja?QXTXI+*k3T1caB7cL}pWWTqNu4Fq)kUyE#KhQ;4z>95E3)$!W zNz#6T5eu;Q7u@0n#f3@i&vVTaGV%))-WF7wcZ0c*BjgQb{})PfZB-SLXOl9X*oC}U z#HNXa*Wp`y=kml7=Py~4BkH-z7S2S8nQyeAHlF4?>_ib01E-U*7}qb!TEtan;VkU5 z3NFh^PvR? z7ZKi@Jst2X&i+w&me4q*wOVUm;68=j=HSeT10JkL>}*`Cv3)onI)ta9(Uwarf}O)IM7~uzJcEoVD@H=5l`^XT%EwC!AcI_Pm65)Rygz1sdUM)vFidzGErjX} zPtoBfrn?fHW|;7Tfm6*P)>1GpP2?E6M-ynB^3 ztK~{l*1HS48sT6Drs@{XLp3oSnZ~1UNV4L(vYic-PKTG~#g8uh(hxEEhYP+Q!o#}6 z4JM~0nWK479?$u#9>u<9_Qo@TB3Ooe6v4kw)f}?QiD^&LI^zWQY7jBl~sM#_V z9TfY@r2a-qWp=b-g^AsNqKYrqBnl2cu%Q!c|KwFEj%Nv5`mnYO{(W)(Q_X?Vf?pQy zy9kxY&ee<5xQa9WV@HZ`xC(Bb!U}WfYV<|Dm$J)Vcs`H~KV$s|532CtM{<_wJkXYk z?EQwr^>E7&yz20A6lbTf-a!;I`$a?cRbW%7a3fOR*NAmKO%Z~Z@?aVVM=S5vx|0&v zdpMV)wK?K0JZPwDcrVt$ElPNAFYMCsqmlcPGMN<76B17kVdFgRWC*dpvt~Na zdk~?v$P)IKR*CO|+B|PWf$}(_g>YZtvcF(6h~$<;ga|I?Jfm^PosJdW_2iYC5M!Yb z^-Mn@c^Owb@OVCN7jQaW6s1Bj?oS2@r#*ztRoP?W^>{XasosMTE5AF8li%?Avsy$k z*~SQGVuf9>B5H);jN$W@IQh)g<~Z+-5zU89u4PMHIDzyG1bJw{MwCc=D|cZ{ED}& za6m_~MgH=JGNy}dv9HhNYUGwC^ebZGg`6(xX^m&l9T&kjPk8scZb;x#oJTqbk}id%;z(uFa7+VRwK~phYN+2itCI z;lpoujpXqtye!GA!JGc9?1@4N@?AwSI`)|NSrHr|rb|`vauF^plQ{Ypqh-nt8WJcYMEalHmBzu?F$)N!-nM^xfFOL13KDk@qC7{$wecunL< z18%e+OD~O%g%;#{F+Cc~2RmWSpJez72V4YiRWme$wEm=5Py#CtJT!8hqb#d-d%G3> z{0A{TN)(Q`2^-oI{3UDLg?IIMGLN^@b(vAvKwN(3;UHFj!O1VRPrJXXnpYz#5LJbI z?PE4Ayl`DHT^Uct0#rM-knRj)^AHrh)_H*{Pq?M2rhgQEdyJT#l;+$pr49f3d$PJI z8t9vHs3xFSdJ~=?gbwCvns89TL0@yFJ6Y98>q2-LA{DbdLsWnDeZ3Sml{$&F(ZYe6 z++V6jYSe&8@G|e0&C_`uDmbSJIsSrErYLkfEJ)b$1anSz!fFfJv2hrAnZlMD+*Gbv zwl-=;m-qS{9RF5Rd!Z&liK42h{QuVc`(*QaGdeRaLvZMa^)kZykg|XS^GNxHCng@w zAjwx)*F`^6oQ?4CclH)XDFORu32yB;+(u1_(FOF@{RWKTSbQ7&mvX-@hxKYP8ct;@ zZJVN0il59SN_*4p$K{s)A|%4!a>NH$cNvR&$Fo^ zd1eU5$R^xkBDNg9w!+E(>lL5&7G=Alr}CjX8^6(s1Pg`7+pdr*m-YlGJU(xv)usQe z#BlK0t`NnO*kVRHjJSXj@%*e*#%Ch2O7X^Cc<~o^x?|gqC*N{jMJpXp5Rbi$;4qFC zdRZ7fl^rp{<-UZegP|i^I+F7T_p5SZ1g|FI@EI)~7{5#?pC|u}+VicbFkEi_@Lr7gtwjjMPZVR#bk+|7B=&BOLX{~vl zE!h9Uo1yAT#(+I&IX11hyj-PP<3@0*6)~wo^m6W*qcdYBMlo=*77;d?3t=W|@;iwfyTCmAo*pR3vs0hId%@glFx?Sy?sn}P< zZJhF#?xzcnHC|;jCovk+D)OVnbYnSzDw8^ehjD_(5+#grw?N43qX7Jk-8j(>)$;9i zXHvWUul=IY8(1}ml}$|o?5jz*J2;oL))tJV@@)Hvn9W5lQ4Po}|dKBL3Co#oXYE1{9 z;zY#=CzrB*B1dQPd<3zTIP5E&@)It9tC(TOM-$OS@r^#}dP`#pGPw@csiM2deZpfD z)1Dd%S$fus@UBEQz{OEGyi9$`ILr4mLTf}Jw%Q7jU$Qw`qZmhr;b1}JG+pU^&RG<- zYvow-!h~(ZxG|K+zQXy=%HParz{~%WxQzUggX4){(Xv=@hZvTd&F zhka}*JInE837-FlVifHwMAzr^ARVEH`wJ~pr>S&H)rc+ZC+sJ3-B-9(fvkn<7K004 zU~e&b1PD9*gd`8)P8pu32xL<=Z7BGXEB%OWt{%Y{2t-%r%si5P zgzN2jI+W~WAu-qNs(02BjyH5}r(xl=*A$bJt*~_&8GqnBi5vZRJDaukg0&{-8g1!{ z>bfp&UsLv^32%n6ei85LswBkIsT`ZmPQ{0=PP`?Vow>V!XP&~-UwGgv*cJ#eb9k-u zuExdU@EfY^+rsjb1MQx9CmG?qOZ9mZBXBcMXK}*CnW*yL{4h~r(}7v6Zmb4V6cof2H|?v; zHW$J3XH}DsVZu33crk_GT)`nruH_W71BQ{|jB zP;K5W59CTuUTgTlc%tp@&Fetn_-{N*5Ul?u%naG}EL@@;RNnSGwl?8IC$6{QPF;3Q z;_(EoTBt{lbr5#d$G#o+XQG^B#Rqlumj4m*jAx$ne6~$Of$bjI!kcsYr>c`Gbe6SIsgGFhkp8K8SgLqw$gRz>uyM#xR zPz|dsKJ85s?kqTD3NO5cQ|-Aig2%&@;n*;a$Z_O42p{Kh(c0{UsuJLL<|wJCUQSFw zjo3As#9?GqWm^@}e`3D{p{2P$hwD8FwB&Rxbz7rXdMRHB|CiK`IGc4cjr%1yUsN}W ztopbJM`|d#Vs})VBD=C>{+^sTqgGoS4pD4doaYg@?azzZZv;E9RvcGpU+t z(!Ov}v=Gz#IN?kiRyQJRI&srkpDpAz2y%pGJ_WV8>ZBJb#X<=EuQsFx(wV{mZND0n5Xd_~D zkzU#8P&MXv9JL&>@c}ay2;rKOR!(i;klK+D`(=SH|Yr=(;A%sq6=ND?I#^Cc% z9i_wK{wHZMLjGKC`U*K_!3yJ9`O;fB=_;x#YFwo7GDq+n&YEUAr~1f5pcct4GItSV z>ojzc=X$mFwc6KfC(OaSF0b0NEmClH72Kz*1~?mk!L>kmK3(z9c7zMh2djY=L7NHR zsb8=EiR|G#8&1JAV&g>-hdyik667XWcg81O*yt_1{)w$=!sUi!WD6e$v2Gr!1;xuB zxa=;xSawY?#h~eDw+3o zo?;2z8>_t*CzU%<6q%*m{F(s}Nrd*9ruT!9Pvd*^nEJRQ&AUnCzdi>5O}}a9wu^G3L?zY=o<>qU04kvxR66 z;l)fc6Lodm^(Hut$K4F08MmQJ3DtG>Ggsbi952mzQe(L0(Oak6eX{<~K98=U67Aar zMNs{$ouA_}wl`u^RZ{!#G)}mjDV$w|(@)rF%-d+%_f2Grqu{rI@I*n?q1vvW0}2+zt^{#;qhP_x{bsc;RiV=pCCr5vP1% zLsP5=s!JGMj#tG|s=>Dhb8ZrwC$pxaDqnFMtT1&8%TK_q=s(#yRcR)kDa)o1VSljT z@Hg8_a=C>P^ST`_-0Xnw51e02+<4VHaHZB9Ey5|d9IzGay0iZ`PR+#6U)VE5DcmN^$Kw}bdSTsz7Y#VwOb3eF zd$6}Q4%6B1D%=~5OAXbtAHvEnx&9+c zB79RVvcG0`TjIYbF7{#OWT1dfB2aG@8M8vL()gz8d1WK3cKUTCgtlKM^hC>6ZMjS|$foAI0*7jnKv=|1VBxN5g2@&QBq#9nrnG)rsJ0 zM3&}OUmmq2c?!M@c>NEqr3g~(PAV(rz&2aK)lLX($ia>rgHvCVRaXbg+b2eKzKa8u@6a-q)(r$%Rd6jn0RL8>dNuF56Hqlky>YuLpQpGi2 zRe2jpTiZr+p*jwOxLg6d6~adk;aUw6DiM+^L{3(_%(x*lf8)*!UbJOPhTuDZ)Mcc8 zub4isE2*y<%O%b@2-_O7*HH*=h?o9+V&NQ()H)s~e&T+x5Iz;p$vmvViNSa_BXTLq zIf$&z)`2)!@q9EXN~~@^UcD*E6prT#M@!;Yg%4eHg{t*p{5^E{xKGNd_LWKMz@{W& zYjZwE3og#0w1HRV3VX(K(MRwN6V`mgb4Ow49Ob8eR%__)D0qzFt+s7Np+JCDjI;18 zNm%(4Z*;nmX{fi3PXCAGmy5wAU5}kNY zQCLVD&J9(nIbpxyp{qTLzP_)_q2}CPMoggYb$l%BBxSJ`D4^yj6uV;K>1%F*SGM#UB$FR6?4pE#IueTpnFjwjy2V|!txt+2-IsT(slTg({?BU+O&f@n*wHDG%? zVg_JiE4qdDm#xVZ~27qKTp*t~$e zCKR+GY$o1|*b*-s9l^^8;qK48>5O|L{9AJw?3)mqBwU!o$sw%oht1dO1sWIX@&2UG zRJA7_W{09^+lgs?3qHmONv+AZ7HoY*c|9qCf>(3hmCC~Mlg*KxCtP2~*@`5V3a<(}M3H7<@B*cv%X%UVI zf_*V1;t^Dpr&@!Eufa_=y|lsMY8? z?Q#^7rjj&I>1^89;7xJDOOX0I0pY^qMcB{5_5W%xU24p8GkRv+6ZWxn5EG zi5L8J1Yq3ZigNF-p_-zTbYB^}mSi?$-!goZn6Vl8H@?aU4w%393j_g=>mu zeE2(@AS6J@HItu=;g>@X;u3@bxHQ0Z5`H~#ozJ6mQR(H!?!x(wT&TJt(v_?E`47BL<1TEr%AVZFVOKba^q zDZ=>Lj#k9qUbr`&9bd4wBOCn%_k7`04X$Y)?`zfaAYnn?QnJx_Wa9Z#pCf2 zB}2ca0TBubOcnOcRu?kvslBek(Y~Btf=vZf>hoO#-OOg|Z|a*yHu28BT#gb>)+9v{ z+7@uBK0!YbRf`qh5#E*u#mKf7B~5Tm!*E6Jl9&SW1;1MCN)^1d)is)wgVj}{=#x`d zO!vG6yGUW*58TWZo@EM~|5hDFEG$34r#}41`KsJ2iBiTGOP~hGiVlQsrYqlbCP=XF z%H5gV`5x;~;X`ZOQw4`1oOBnp)@&-P4j~71-~X}I`iV4pw!KEC|9q@`1 z96Aw~Av|x%!?xV5g{rXqjoqbjZNMvi9vbcMmEVZ?jdWeGIkfQ7eZ}NdOqC7oEUuer zy>HCz98pOmrQ>ieRoGddeNm#is;ufk@~>ns#;*s*>k!w1$3emecOg%=m}^jY(Hdg< z@B@zqv#T_5|8h)-3KU%G60SW|<0?Fla@2YccIF!5(Mf zP+4{*3Twt`BeANfdKE@TO!sc=22NQYAr0w8|CL6Dzai6D+7hJlB5n}|3BPw5^VoMC4#+5k~u(i z-#ar7uTmU05#EWw2;p{XC2qfREUP*ZTpI789P$-T>HSocR&Yy}>$R_s=jnV-h6-m# zaxhd>O5bZZ=gYI(LD;Gl0*#={=0)T!W=9uN`|>V8c-onF4#J9NJYCMt0oXMlBUd;S zAv~Uh?G)msky?){BZ!R^^?1hEFJHK4Zw4#6z=-W?VY~Cf3#@pe+0A z;M+iHrM|30w#K84C;tYOh_mGQctZPApr^=q`7_@VF;_Pb`2-dVusZQOcN*}nG!LwW ztKA9t7Kf&6TS%5ULo=iBsV0i)og)3EiSps!WQuB>xHUxBw3MgO!qsmG8$fP`kd+{~ zj=}X8Y*cJNkI;$abS85GE&;;5FE}`bE%R|%$mzbUnZ&IiVRub6Fr$IK3WcNoQcQOLaz_Ks#&;HF zc2kUJ=aUAw{)T5)0-}Ut%ULy-JTGDM5A5+5_WjP0sl3t@n?Z$F? zXKnZpDf$?HUXB;PaT|{10*_lkg7#1w#5)O0Lwx z(%_PbDd%fEe1)|YbfPL*qj1J;n6gX}Pcp}lJ&f4yJe*BNO>Tw?_pF7(gL$o?M`JL0 zX%dNTI2I01)!5NR!>>oea7_dG_2kLQzwQ{JLTU!e}d zxtiS3aE>w4{VG{l^8*pXIkAvEp@Q4br2T_aRpP!>_ikIb>Y9n^NRkjYiUZTJ@5JjI z!T)crH7CzkSTTwKSK(GI9+;_PMheBFdPKJ;ZWwkyW0xWda*S-xqv^c;M+bKwX5siR zf%Dm0icQ^68ew@Y+0cTpM(ppz_72!jQDZTN?HTF9#|Tk&HF7u$$;P{7_qSY#GenV#trjUHKLA(RDDcUR+d!< z#L4OS4dmuhGA+3&?CPnhFBgZA_B)%?g!A*+?j!7U5iYk@3Q92z*cmO{HGAL2CFEF7 zJ0@YCf=xBGdzH z=})fku@v|I=DmpeG508HZ_Ka{uA*0m&;DVCO6@hwcy>D zdS9Ol=wxV&`3-9}KcLbZ- za4A$cXoZV*H;jIqYbo-&b6DqEjmc!kws^GU$t2D=3M-m$s}d`h@v0h5*23-vsvPFd z_uMnX`$l+ccYkjA39-MD-jsD;aHAyGztm@uh2^y z;Ki3^c@r!=F%Q*<5?`y%gSl*<#T8%SeZ26ZJ*wkJpao|ub4|lY#y#~WSvXok)ztWu z;Qk=qX@J~#pg$Zny?N4t*Tp!gXRK(@<^}U&DbHu9H)ITr68>U!q;Nk`ur5PVu5h>{ zcE6C)jAv6wnZ^1pD!kg$nqcjI8Ru$Wgm9)Bnf-Y?kUQnr{EHdMw_hPuR=sd4R>#8f zX`WcEoT!m}^-s5asp6)Q{G!2$DWWvDCSbopyJp6tD0KnHzrm{uUZwH>m3uRI=P0;V zC9^3nl}THq9>;hzoG8bOp`?}K$aHmlM7Lvux4x_qs!(N>4my@A^4rA}=OC>4ktdL= zpgT*&Te7hHWZmtYsdV8l{Eb_4ZqDF^izubzJs?ixlAn9B85XFJFikoC1Xu4;INL@jBeVt z2^^bGmcQVYEZnY)hri$&ECjm=E8CLR7w2~BFb`XRQp9=n2lj*5-Gdd=xU5#DX5|{= z{)pz>TEqqyLD82JgrIud?Z{pi{i1smPR~zb3hT*XCt>ek9=GRkkl@>owE3h@C8|1S zmf_TqJ9dJ{LatBcMnfL8!NrWN85hQ-4ya5)4)?)o#y@c> zi;>%kf>s25tNgw-p~9;O!J`pjTD8s?5j`?9%Z*lfou81cniY2Dc%Ts64!4SI9!}mj zxc5=r?hA(UtQ`l&b52_o9Gvm*FS84-?{ta^V;D_Q20v zs#4@S#uYaOFD5rw*x@FeDZ`c^!OvM(7bs*jC8{Ye^946+P2RDvG>|sM6#hMHgN5jB zY*3Xn{n$~7!$Y*(XVP+BRV3I|xSu3E`vTvJtgXR^={(aOyb%Dk??pftPXEIR^RaH^ z`P;Y&4vC^$AI!(wL~M`{2rp_XuWx%>a+SfEOMV|77gJgNEm=bFGVX*3IW^UQ2NW)Z zo?>$OSw*?Wzr*WS-cKesO1R!gaU?#53yGeBOK+{1@G(^In!~Q26w%NX}GeLj^S$qjPm&KJVQH z|4}4bQBX$pY2G!6D`ul(oCEJDVO^vU+L_qFWGrO;06hOwoz-I&5c)SN1AM3nM|<%= zb$K7f>o~!^6L~4ZOYI>T6$rPtXJ;h^#QGFNiS|GLp7gJHQ=gp03f)Pbz^dgOEWx9% z3HlpX^MWz%g}AOnCJU={t0*JdWj~IM9zwJd&2PeHLcvlzejq(jNY^uG ze8VY?ajDMU3RtV+_E9{W&-)TOrc$byH^-4MiNnRYP@bLcg8RQ*oyI;@#2G8(YE6rx z8+J3jS4HnG!mARzEUuC{hxO2n#D<&oh*wO5;^ensO=)byh2XC2P&LpALUdiuH)Ve* zKK#YXw%oK4&h{Z_ruxqodtu9OTxh8j>|EyYq6tSU@yr|w84u-~eR1s1y$Dfh?K>Vq z%xrFdqt4chMTE5Ef(0tb-q(n%R(cnm>&}V!YIPKCF)^L|i-I=noXpOf!<^<$&O{gACKc@fcEOg2lDzDoEXy#I-Ue|hLE*pE?- z%ww8hXD7T07i|8a564>Z(27T6xm*Wt9UK^UQA7o5cnm#vxL`U zlqY1QNFW-xDtt0#KZn2IE=kzepPS9qkBmM`w2QDlR5-9i)fHP=gp6f-q^N5a z83r*~594Y(ZY@9+Mnumi#(dTo!|1d$A$THTUD;EQ?LYB!EUTl1$p4gR#gk0EohB5% zlHp?Vnx=&Z6Ix=^j__if{+f)g#8``B!g_s0qPd14gB>SiGK1Xo0;>K8R zO(P;oxY3QROW09`T`9u;ZYZ^lgqEo6=%I$>_E+jfY1$ht3K}EG`-f|0O<3chcf1KJ zGKE#M)F^5cPC!L5ZBm(w-??9(7ZbTQL47=<@Z*VMT3uJA-rc5ST@t@htX{;SWu%P9 ztqgBHh4nLuO%X!Fgo{<#UKtyAA%7_^N0A_${F_7e!sP{|cnVu^^^7h&rx66)ik z-5cYA%A13#P;?6t^=KBBpB%Fh?eLn-$>lhWWkUy)W|B>3Zl?(!dhlj6DI>TSDr}g* zxxaWn7(cz!jPc*@C3sino)uoBc&5Qxu8-n*O|JIF?FXDa zg!2lGO&0QN6W^YvVZy`iq>bdka-zN?Y=UY*aBZo&k@4L2^cMCk&@us0X`;9s=SL`c zb_+{`_?wuvEaE_Me5docA_qDXuh=xd^Q-~!s#{qt?v7{kKOC$`&KI1`5DxhZj&pc7 zlEYC#`q!)~`M+AcqUCk7wCUPJZfG>hxV(0h!?_gKg7y9~&gwhu_WxQqP5s1lx-s@a zg8wuXs_*=h{6ASa8TYw7s)W*>U0q5E=^Xx&wN1DkCcJM>s=JW#B^yR+EXrO*K^j3e zIzGV-73uh157u=i+)LOqoWu;_-dFhRP~SM()D$7BB3lQmDKjQkLi=&>4<61UHdP2; zK;{y~NqbS8TcdbaoLlucIbQvy2;vk|!9+qQtLj#VG8`(y$qXT{JQ?4xwj8#aeq;Q$ z?RT8@79zjrkvcyrVADu9Pf;|zi@J)&c*t(^7E*fhq%+P{Q0*)C{G{pKA=$$5+8oie zS7TLD&?Kcj_P7!LKd@m59@R+H864va2pP*xdm*Aa7bl|nPT#c_);VhW;o1@edy0Ze zohB;W{o*9W5%C&~Z8t8DCw4wZ`}3$PDvxCGDO+ltt>CTXEbW9;%`@GaBlrY}`l1mh zJTyU_{kJPBtuQ4Ut@7cMN$h>wd%;^I(J za)i)@Wc-FtTMl>Ucv*GVwuNiAnV1rX>0XLgE0R|QmjN88%+pD#!qdZAbPRSRQm{53 z{F4fQH%d$&=M&{ExMm8c$8%>OyMz-3!i^rhYp6mwX7; z5zvDMyy?fCh4^(-wZe|M!UuB+lkwe$k0K&MxHptYH{s2%TF=hH@)Ni3#TQCRaF>k` z+>uw2f>&i8|ICFTQ9ea%sPKF&4?Kn29oYB<`P!Q@9v9zp+)-C+#C*kGvwX7A$xE!x zr68eT3~%c4Vjl5LS!W}x6E-YjW4Msh3t#Qc8-cP94ar%;rg9|Y3b#@OhYaETWKIoN z<2R-`+!gYiA#D7K_cO4!(sj1!O^KbxldfE;Oj--Fdb7Qfvc&0Xo>GPV=2~52mD!n& zx@p87Rm#Eq#CA}Q6eb}uu zRDV((V>kN?uUm4hIxd>>Y;;v$S74VGCpH>$$HnSdjnU2XuJ~HuP!i7t*yjiy6|~5h z@?JL9X6poUh7&Xf?_PM?X+vN%*#}ZZRkfU(Nk|RSW+)-z)jfC_FGOf|Q_-Y$GaXo@ zFn%S$UzxY&OBsQ~;D)?x&c^?^-G%(Qe5}fy=B%ns&@i5LQG+(7nV$Z^@v$Umx7g_G zIQ8OIuJF7g>DGdu;5mjTReACY@2YaD1vmQPUXn{gxELesSxmgIu&*>*LIu~EJgY=P zo^Z4jSti{yKXWcw#R-|g$}-#@rv_nkRFA|6ulE~6U_5CKwC04j5IUXg1mXNRPDTp> zT{tvNC$m3Gw#QT;r5zV-gww@IH*XlD?{vL1w|d|(nH!Tx)(5K58sBMyXHE7t#kLmP zhbS*8+fjI6#tV&u%2ZuzBZQOHRX?_S(Za?_B-P+%j$o@-SIt7RSxHP6+%&!w+fXlx zFbz~2{lzy0LQ)4de~FSRv9SCkd=F`hdv7-M;Zb9J#^600Ri$-alv2^NKIC|cim@(D z)Zoo-cVW*+j%e}L5rsn-D5fV1**pZd25e6e5)y^v8mt&ef{n1TJCUt%D8bp1_&W&~ z2l2EOms)Y65343|cmf`aNSc9DvT(^=)cA^6OmW3c%DK6=kn~a9>(1MSJpPpfBNgGp z&Rqx_$yO`%lS+kyDRm`JuGPL?J9eV_vr&x8WiGz{qDUQ^mvN;%d;Y-t3(oeZz)QF% zoQo1RjU%KCN2{?SOiIzY$xWmnp)@8DvKY5BuX-o;4cgEZQ~!R)=P@ zwmAoN98;!nRK;WS}KxEiIcL(%QTl=C-R zXJD;|VLU7z{=zCR;aVAzCbH8}$PE&_8L0WjEdrSG_tdEX$87e4xQ%diFJeal)-Wcr6)h)TZJ5O z?!%!j+{_oH2-1x_mbpgOm- zpI2ltf{UB>|43Snu(~Wea)e#I$!tUNXb$${$#=M!MY4))te8Tl;XDZUGMtDOd~|_~ zG1KPVjNP-?Tav>+bLTfMz_EVZw-runr^|RO*w^4fwy+{lxac7y)FpB%TZB7b5MG>h zjd`<_uqNCJ5DIFlDXLvK{Z-5yva|tg=}d&H;6IhDs_HAoGc?{&xY?6q?YJ`(|4iXt zFV0pcG)u5Iaelgz_sDNTb|p5BB)*+O(vP-O9FTL`qc8?jZnfEL$>xdV6bPyi(qkg$ z%wS*Zr3yjL!k&sm z&SG_IoOQvV@wG(`C44YZjoG@8jqd+vAH7?^yOG>!q2|!YW8LZ{ickNjHoNnMRe8ew zAmLbN^}Qkz?bW)bb4uPYU0BnEwaG%pT&{-*8|{S)Kkz72$Ve4VLm|6k3io@ce0w!ZhZRy~gG-#LPI1d^wXJ5b=h!3R+sKd4jJZr)^b3ujCy4=aq zv(l^ZWponL13zI!ntA#+4IpVAs+KOLKF_j*+{Ub%s{qivXdy!tb~j<`SoSaaU)h)u zB)Fe0s$A)fqi}Bmfq&ulmvX9;y0dMmQf0KTEMJuLieP;^j{nT*aTMr6T%&h&NtZhr zeT3bO)p2us1O@YXH;Om&c~y@$tqJ{?6JK#cU%{9j`tUU&UlN=wL`4Yu{Dsw}ajB}% z=X-x@y6}~uoEXE_r9@05D^NIDi@;K>S&GQ5>ghHhSw{mQ$LYEQ0aE( z3?zP}W>TH}iDOH+KAOBz#4W(dO|-IzwWn~sf)3wS*a<5t;A{4{EG$2%h{$P%ho^9P z8V|d&e=+Zqgj2l~weiUi?tZC&rw`xZUWLd^;Zk|^b7L-Hdjm2WvbiBS&ceNEL@(p* z9G)*DumVqh*8H8^1ti)EDSdbyEUa`D>{Rc+a)eh$QE4`|Bz!jBxk7lJ@W>2<7~_p| z9dL^j4o_ugnBd-&^mI||9EH?f$`%gxCbc02iNfw)+*OTazvP7yHPqOy(Gh!GpNAt! ztWM%DWR_LWVqA?E+p?}1AN_=bRmq)2ijronOK2S)FXo*-x{c}E<4d{Gj_bb@G)pD; zb}D<+1(&hd%p;;0wqJ0%G8-}kRUG=+tiMYUeE#9}uk4@6?H*hhNT7qDblD?@kzg;l z`-yUF6C8!3jnvPL&VL#tFC^1n2pECmNbZy;VjlN0g||A`H$wO}Q#ocQJk1xCKVR3A zjeqf~Cjq{qaFNqZ*xH1TmHw9vGddm$?cdrR*CiBm#1M8JH55G{mn*P zYsqClA-WE`{v)RiXMSX#1sQX=`yDquh38X=`ird|!mBXhLs#`sMZSqyRAOV45LB0> zcD%1hoVBPrfs2FGH-{A3pFU!8wBltWw)hIy@`RM1*gt?cS0Q5}2eX8XQn*%89b{}X zh4@jdT84KkPAw*-EqkY`!kAle+NK#}w(}Kuq^XF;qxg13wtdUtwmAPyPOxx4QwaQn z{1DMjt9?gy*5i5u_J7L-MT`2x2TPkzMjd>$VK91DF%>x9iR`Xy@6FM9WDF;?80)+8 zY$(Tva2_5FXBIA6@X8n`D9Kv|Ltm-E`Ckb68P}=2sltxwYI=;G{r(&wWdf%o1W(OK(L#@i^go7$^Ky+oX_fD!RZ?mRp@OU?KwTEOm=ZzE+pY!jx4};F3-xb zsiC@4QEU6);-&`;xcUcYm#7*Z6%CKz!`GSPR!6ig^F`iRBS^G6f>B151 zdmC@>lOeomps>~}gE*wqct#U{uRl+UYh{Ehu7al!Rfl6H6&mCXQlRGR#oV8*UXVi_ zR`p}OpV>*un9SuNSPQOm+0ahSsSyQAYRA#$*bZd1qO@D$zKozBRb6prb?(QChFv0b z`29oSOtci!!30sd75B^%``i8{r5mn82q?~xVww?u%uRUbC2adz-LPo6M4*bNH+JHj zxA1hb`fzyRbq9#)l8tb#99QO(UJ{R7A$^1*L+@_NmCkI2Oa0l`lkHVi?}l5U!mTno zwod8HvzjWC9o7lAhU6#c{bn?_2gcy{6E~}q_czPue$j6$j8^94)VV6$B84rB#DLffTP$eErW6csWzT#wg4$kF#2?}O#T}Kl|J3< z2|`{)t_BDp|KU@d1AlO`pZ3j?MsYqs_*j?VR%%m5`3TROux%M{7ZK7I>$+-uM*rj5 z7wRva3TLj3m`>*imjXp=r9So&sbsfvLflP07n#cwacZW)K0;oKEp&5S5oT-z;8 z>%PHy2G@R3RgI4aa6}pLn%wwZGnLl;!ofNCx(m0Qg-d;TW-HvzGuL!n=!Z>~;Aw^! zjcl8VIMyONT(}gY--uClMr2(j8V-%1Ptx8n*SYz!ZDBxF1`@Bf5Xq;R<(;eT?x7BPK!Wx?g| zIaHtQbRn=ax3Yu_f3x~0EG$1UslhXNWX0M4lYWZRL5>l62sE)iOnBOvsQNtY$F+8Z z3}@wX_F4;v=HlTf+_vPzPi(J3dR0Qd=9R7BRG zOd_QWXLP}((auGUBkK=>8uB{L+y`e(4bCSEYkRV~EgM@9^Dp~*5jOQuCJQhL^F z64dh9w8Uy-gjk7zo8YuU*d8n7cjHu5au>7jXLSeT41To0Zy`5+VRe#lC0=+whud}V zEXfMNkP>67Mpd$1ho5}qpY;_Y3ItU4N!tVN z%4=c9_vLwChJDF`^FY?P=vQWZ*uBfxZhqK$g_o%=ri`!Io+zxa7uHr%Sjvswd~Bd@ zRPLRT$v=r0$=y)FbGf?XC$FL{kLRg$xI;I^?soDNGR%?Dpu%zW64NuapUP{B z&P5j?yft|}2(#eALe970+#ek4qI$Yu+|jqcyGwrN48%Dp$Lz4~n1&G1>Pa{bxeTliEyuRP<)W z^tvs6O;sZeS6ktjMi!0d$N9nca{yp_VtKdB-WQ+O>N z6w^9O$GfwtF`kvVA0es;>yg&`HBN}CEh^|h>QwFz!`70>&V-ET{x__17GBQ6t2L)0 zgbUvhSBc$U^Rfa5Cv&j_tH$$mHk*FOxi3ena=^so)qd02j>Z!OYq*zuQOWN ztFyT8C#-KtLVTy$`QOAg!Rq2F`P#~5m=FvT4U7c9A2Km?H|Y~!?9^R zRgQ8Aw)JFN3DToQRUula1H@VRA159vDXDM|v3m8Ll^7Z#IGYPijA7%EeysHu9VuET z3TNl?#Kj!IK3+hP4F#K#IB#<1xhE@TMnEP0}%7Nf|;_U<_R#DTBKaTGk};k=y9bJ&n0 z1Sbf#|8gr`P+T?Fw%qX5H#IKM*YKb*>njq_ode%t6D|Z*$6JY;D>}cM5KvFO)^dfr zP@M^zG?~^24ji6Nyux#4aiTN(=96W~!Lq!Vg3SU7%HyRBf0}T05W9VZ>|yL}#UpRQ zy;Nbk)3~Yjjo^K{DE8*<#!8{c!t#^z?92eH&F0a#Sl`wpxiP!@k@ycTx}eqQ);yf3 z@%8gR@}WT3yhL5oxW!-pitivC7UJ=%`p9^E`uxmh^TZirfM^{9^evp0u42k{6*8>_ zl|^DW(fHf~^V9 z=G^H`SXZ~4B^&1+=}zIF#*4F zX#n=6IN~YnGn3woYtLgauA_NhlEJKw5!@!>TaNwJSh<9xA94R%@!YQsQTH(h7_Td+ zO7(q}xtFaMmT@*#1q%lna;7TlYbX2bmuFG1;C zTQ}rrjHm{aX|;GTL^0EL&*W-Z_GAg!+R-uYwWL9;YQ(w)#0Lux?S=JeLQcHk(T^IUP*mYRGzz`{`>k|Tf_qk zJV)V>Cc2jWX+IwR!r93<)m1u7tA`Rdl3fA9cGX{I6fbgxgPDSI7(WyFUh@Tc4#Hzk z;gY?OHI$pNLZYG#I0y$*L?9)>9mM}h1Zae(y@-#n$j8h9gO$y{FV)bmNp<9RU=@c49j5Ge6Eup9IN^3xo(xn%KNgmsjNNGl`_n{sm)`v^_q~NTmB{GG^(91q$F08z4G}&} z!B+KwT8PhLQWq=dVM~1y#}m~Z@9|{mEl{Cwq+g23a}Xc(@W&SZaoC3Xw@2_YLpU{y z?b*T(SJ91oj(p3LXyL>(Qpey~hXfPrhLKrH@3!|7i88UV6`51mIh$kNg7aMV#EODl zKBFRgEK#&Jm684I?D29E4r=W_?y1sNU$DI(H0TY)@h`Mh^k_`pCr7A6Ye)4qye#sqWt9*Ny7GO+@8qI z8F)AgSH2^sC-MKVvkh0w7T@R{`9uf`2lE`o)iP|K&G`snm8WpAEx!M9IY~d7(GXv# zgd%Jotc1%%RXzWFs*<@|J)WpitWn6pC*MA~kS$;0pDdj6Fmni3&((#!X?=OD6YEC) z+l4=HOA^+*3CEVPdm@`sgl$2>et+TMP%;9AXJ2w=o~qL=5S|a?M0Iles25&DJ`vN) z4xBE}m9qGlo5Tf;Rn*z!Ur2Qm&4WzQxgsOI@UEYhj9599`)x;n6SPduZNJAB8uemIKa$PJpUDTKe0bWxZH(PWBH$goiX8dayFZ7 zg!q4zC;t2g_Lk?RN#*_m&HZ?dj>dy9;Y|l#j^d%Ye$MDQo;7hbNI!%zDmob~g!&3^ zf&?2+!Q)3AWLbP#6_VyGoU|2PIG9zO-PJi$S`mQrrf}L@*x)W4GNGWqHxqG=7d|c^ z|9kd~(rMPUiNa>Zf2dR4(q)BIId;O+RHuaHvplh?P^W~YOK+<+Us*|GEBzPue5vA| zFSR`KrF{9q+5W<1g{v^77ZEvQ_|J6S|^QDSszSJsH zr-G&13aPU5sJ@X)Z>!UlK7oi`SBP8T6+eM_4}DF+Vy?GQ6JT7R5BqUqG436STtKo0 z!Hm>we+$kp&}1}KUF0^I3!>1U4c)jmkYFcK3GHOK-kbF?LgY|x{YG#XTq8yC2^67u zcS$a4t6{XlZ-2u(Qn*)Bjiv~o7t^zGtXrmz?|3J{ri{`Kz15nxf3UqBd&+R?Kb|e+ zL4fe`A0AKUT7BYrk&-QJsYY&&aB2kmi}6`>_@p84CX&$;>+iV~A~-E2W2Sb(E^5~P zgu<6GTuhG|kXi>DFHzLa)HaGB6VRI{5rWrP&Q&B~HfQpM^duo*F0Tjhu`$-=+4(gI zV~83^!GGL|5RxjAF_2Xgv0k7a(dbM0=L?sMvBTU?uYKXYTZk#NB6k|$;~~mEUR=hC zP$4WzI9Z#Uk;2(=oNs~85_ami&=?`u1`4~U;PO4$nt^Ymt=Y67ygoa14tsjx-F_F- z>hc`zM1b(hM>yY})Y(dA?o?A=+6h}15cZ``_NA)&NRt}Q^S`*1t7)i@22fB_owD9P z6A>$Hu@;{D38zwpjh4L8_>6HcTG!^mj~uAY{q`spi2G84%}21&1$xve4{E0<_+fpyUW~n6SU(HZ6Fhn*alNsN5zha{)ezyrJaU#2 zsu_UBwAAqgA!Gsx!}!<<+(bFT=beQ&qlmH*4f!Ye>8CM9&7O*394m@T zlsl0V->D^Ie1-A<;4vI`EkiT0@D+{>&68vc1??auZHu3#mTBt#POh#;UzvKzZI($E_}L+5&ubM4cF?24qBqU0Sne zG$~6|--fgE*t?h`6_uEVcR7v=Z$}U`lE*`p6jrdi5Mu82XnfUndBTe?aqWqX1$Uf; zcYV2DAiOgJ=*F*}v`{i>8|(y+4B>DIRIT*;ep+Gelh$_|%9vhsWp5u=&Ly)hj(_s7 z9?$!#FB#eBu~Ye&C>#$HUbkmMfN-z_?$ya&$l6gH`HIXy!7WtS=PIo4LBJo_R#F!+ z&Pq-xj%xtdc;!2d$j%U6Rpd+`PW??uG9v`nT%n)~_u_=Z7F_xl_ekNchY-=2-C7u- zPDM+1g}d!?QHh(akz#f34=XX)VfPh6W;vcZ3QD)ge=1SFLfRLsQKbTXa9eO;~OydO#OpW0yEUdk4Cz3{9G7m$UR)@dl&n84lE8kY$~e2M)`R>lfB zQ9@E10!wl;Q`k|Qv+2T?pA?=Mw-i4IVN1Ah$69!A&WsxQ>mMr+w}>mMXX-2p9EI!@ z;Y>RmoP~XhxDzIdzq&}#k5r{c<^+!QWX*5de>wdZ**#f56bDzqW*~Pau~SLRc?fH& zl3`va!wa8ffS4jj@b)iWcE|5eB_H8fowrjtmMCn`6jJ;Jmt^5u2`-f&X*~XZ!sV%K za~Doce z$I-92JDbDpxEdquS*TWx(RI&X!1Ll9RrQHW@bMLPcfz|72V3y5ltMv=a%uko%xkC3#>=z%J`_-Y#KyRXKec7<1Dx<5`mZS zp&NT@kmDj`kHH~ZaJLcs%rZZX3-4N6Oy`4yvOGs}1gAXVQa7cw^0Y0tHKJm~c@F$T+TThX&9OA6OuS#lxmg5F#!*@7o+>GO zU1LMWgXrK=0!riREaWaDYJxgVIdD&=*$ z8y9EuvJF|^aKukI9WH#FroL+oEqyaZxyCAvOz6escwyB5wpP~qQ?`HcsGRzNk(e7? zg2$=C)jpgmjqP#{_Gh(=5H*7v%ZT`zJ9PdaRHtH=fz4 zj=?u)Tjh_k62l~UtPq|wg1Bgh=i zsgi76&gQTA5GS1L#H&A13HO&)?4E}rLEb444mb+edb1`^c)FN1=6J^Vu+f^UVD!~C ze??Fk62Bp;w^FFwy@VV~wtmC?QTPrgsVUq4-Q} zH(V{pl}>~y+Gi^c%p-XyJIt@&xJb782@W;6HHq6Dc`=5l@7Zj&wnoFW_Xkp~g>3`a z{{sj9GQsR_%*sozysjlW6Z>aHWEj81Ink6U{V28v$6DGC#;!j_60T&%uq z+zQqWIX65GZNvkK?(MB%F&APAtM+opOq}zmW4Y*{$W-jM^V>?1kX= zyzm#oLWS*~!i&p~+VLVCFoJ0pcR?Ktl(?Cq;_MH|1tHCeblm#3w1Dob`7BIgn{7oS$# z7(mn)6f9(I3!X*^SEg~iiW-6Ol-|;UQz62e*|@Z0duxJwQP6|D7C231mleKsxjhVp zW<{4Et|dDv@u(%IT!kn*!8TiOnO$|+rQfZQKY!R-$e)L;pAa!ciGJ+rfYRH#r8wJV zRFr?)*{C2v>4;FG(X`%kZ?`cOBDHcGoOCL`?l<_M`k$^dh<3? zh^fh?HUy5~WJ97llIA2Fa1izuW3?)AtH65g0~j-4PWABXz|n8X9-`*P_>uhtoPHy) z4o`HAdJ&ITOzVrY$ATRRLSU|N$4%5^?QF%q&gvqy3)gEEF|F&)?QW_mbGo~*HcJT7 z7^rbc?i|K$eNGz>sgOpvPE@^nuDb{iRX?=iyl>CGAmM1bC{m||rGWz-LBJ%=7YLVQ zg!?mz4ibWWM6ILHnJ9gmgNxalE`;c38BjRFo)Nfq#y(p}o38|_x6CH+Z&m2EwKiGp z$e&EkGGay$){JwDcvW`y))v#qdhG$+QYu^4?4r)eZq)U=|I{&++Su5A?7kl-miYfID*WVmVz zVI=Qm#0uv`HJf$q%AMh?s!#qhVnRg4RdJT{?Z zZ*{?jQHs`AO+9N-yuQK*aX%vCt0k8)!$d%O(C=5o5bx}243WyB2P)gqN_Rt0~z z2C=29swX&VLTQ#+Se7@I*k5xM_RS^DOIR_UWCy_|P4KBk#4oJ=mbb3Lfx37tVsCfS zl7x>blhR zf%3P?Dy0{gsbB@G8yX(;aP(4T6xQT*pVcvrslKDAJb5WalNc{7uK{S z#$8Z{*p-T`&l3&>3C|{S`4_!o@0nj&(Yp~-nvLM#EnJ_CcQtk`PmSi;Lum+HdmivbK*8_x{@}#8bK^x!DKHVm?UEv*?i%AJFN2UuGMiSVA1HQte zEMd*BJfDeoiV*84Y#hz5Ug~XplKyH=@B$*O*isy?fgDX0%-PSPO2lrawdulMH{r3h zD0#E%eYl??>=>hp5%wy;HdlyNI9;6ROnjh;oF44^hNC*PGx~U&Q-p1ci1?P&EaCPb zwKWg7RDBCRTP6qeQyZxzo9p8>5vPTOCJGm|Z(($*4m2TPI_o2Zw-Lh5(L8R&Jx}53 zY$8jms~b=Dh>@C){V-av_7z^n2p9URlPaY?ew}zTg=^Wu&YHaK%ih7n>5ND=Wb^b|5dtwNBjgYOI}pwaBm)m3b|>5%@;iVm7w}+ zOvWM>pW1BbL!7IqqS~w>toxhml{uFoYzh%}*JW3C_V(od*VvdzsYZRiT?&@-6jk7K zw-bS7S)uqpDS}Nc0&8;Dirotd$q}r3u|HWz{6Bc_tMLRR3OWC9Ob2;J6L;e)LbY)< zdcGIFR#SX+gsOw{{9Rke&oZu2KcUEs7M7nNn~CW{x+OQ7VyD{OxCq;(u+yYGsFTIm z*Fy1Tg5reW5aCB6CaB*V_q~_1aIQJKgM{1BqAEKc4N%`Ha+-sSo37|&xN-UHRb;x~ zIo+8(Kj4D;g;8?u@-$rQa;y^mOG$|lj!a}#PZjf|1PLh}xw$|EM0V{dXvoTz?C8jg z$x6`U6Sz=JiE~Jw!Qnt5pb5^M)Uo5MLA@gMM@)Ie@%9l;b>n(l{D)BBD>w}xy$-=u zv2M%e25b!z!sc)?MsQugn+{|<3Qh~Ku>9nqUVP27!R%0)vqQM6d*&M*w_ELroyx`> z;ZUex{VV6R4xw?|?3_(r2VU1ydF`!v!aX}7#ZRzpPN0U4j6rZ(X&lYws3`IXE^dmO z#%o96ST|NA3uk+h`6o$f!o@#%+XYo$YVm2GhIf_}Oi(?{FU;n6QzbZdzAbOR=aq-> zU?BG=;PeOaSwexG;5CJpBk)*6xUNw!uKIg}xzS%m_*?t)E=IV~Txky<9H}{aTkGJk zgxia8$q-&vWbZeM@cLO>zgIQ5Qj1mo!a2?DElOi;w=^Yu!F`pE|C#sZh}t-}o0}5( z4|hzgPZgZggv^%e;zm#E-drAaBr!+G@)q9fm24co(_}(xaV12Q)>lpyZrBI~F2cSV zDD7`WK|fiOi+$PCiFZE2N4?ICC&7D--y2T?=Y^`~bqDSo}xvle;a zV!AS1jrH0joJ){rBkcH@pnteK36Ct{P&uCEic)R5Jwt)D&x-SOBoD&`ukTpxC%o>W zu4g>CLz)xVj7?v1x0O=K-mDYo#xVV5j*#;o>3!8NhZLTLeZ&;`GagRD?rQk8;9a^o z)$crpfZF)?$7M8!orN{ODfww9XHnvhGuYuPyc&s@i;&e!>0f^)DYT;&J6wbfU#mi} zZ6kTxjJvJ5*OKScS^XPX>4JM_{EKmZ8S%e!Qg@FkGDu>2VdnN54N_Q7E-YimNFwZo z%_^d*Q^C@6g;Yu0_=U9mWNAp}EI>>zCC~Rm=9l<4d}(;30$7b);TzKC$AylCGhA@;$KQ8`)XC5R^eq++?Q~@J_RFH!?mro zQ8II%$+BGNfKsY_I*F6TSz(4wji=AmiacMYeq?;IZ6gVF6|5aaAse^9=dn7l>+z;G z$GVbe#luwLq82|hZWyOO)P;)BgPD7OSB+cGFUK)R2pWmEt8irw!E?A0V3tD+@D)P6 zgv&$m_<{^KA$h*i-b;-V?sw)yFJe^|;CpppBj$PNcOJ(G)}uMTm{;w{4iu7Wkx`2W zUvMi%`!~j5MR7YldXo?%oco=ye|hU7s_5EjhPtvbsDII$Tg$kzgpJxCX;8TMYlta* zIbq+C-x$TMO6W%Nf2

U=a0Bga1&8Uhhxc+L0qra)A!TRIOAVo{&XNv0jkp! zU}HQD=mxeK4TZ!sT-6$;^}X1!>ok8>eN{`(djlN>aZv?zq!%x!KP;2I(L!UXfktb< zv6wt@Gq8plo!0kS=e`7CQsV{$_zH-Yo_<0vxwOcyZ^jXCac`4&vB=cP-m}?6&J{-pQL@wCMZ+F976REtsAf}-SjJV&gaS@|3 zDZa&yCXCI~*Q|yHM4ihLfgc zC$5~@OGlcIKf77}E*bxj)r+;Jp((t#D6jh|(`loLg#NVV zhv$x(mOE~<*jKqk!#aE3QlHW@R07a{a`LLx$-Z-m!a!AUzV+w~enwrM0j>uuzh_4POsk_pkBvn|P-P8L{= zB8I+fwjALC*b=j)S`@7Sif@8kEs9`E{ZEh%_Qw|p6+3qJU?rO0Q<}KfSz=Pgb+`zV z^Z1KmIc@*$Phn2gZ9@80m-Db0v79hyMQ~M^Q!QK0i7w|qzZT1>9u2-t&R`G0R>UXW zkhguVP}FRzk-piax_n~VgPmd2ihmAp&WsNl9PX+J_6%EZ5_yEtYS;RY&Wg2eaK5Gw zG;DP%=aO2h^IJo5t_*V)F*?iT+3|HIy!$46D2|KpQoV1UFM5Hu>wpwR{w z3@$ZMD1!vO!HEV}M8#N;qNRc`0jfZP6GFzzD7ILwD^=@Wmudm`ga83rHGowR#JFwoacGYevY^r>GnG3Z!gL#6T859G_Yu0LqZx$>>8M;l7aSY9g6DgC$(x4}Ybb<}kB;1ia`gL7(_*qHR zQW|I%VOnZ|92|)DP(B*%gIOPta1)~8X*L>3$aSwqPQAvHD}{G9Ju_v-G$=J91}xfiNBa%G8P*Lf8H7+JQJ~w&DcL#LwOPo5@qIsqh<1 zM`cZzyZ46cDtZ}9MjcYMcU(o*GB25mW-k%l#_l{z!+LrYLT7rIgv>9!uhoZQiheBv30koGZdm!;;cH$}_ zi$}6+1XSu}M98}oaog7oI2xquv=O9MK+#ftP~A$DIJfC47hOo>QKLxLemg_bL#Z>J zEc;X!>U7^-?Mg?vs3Vwe1!C378YI#N_4lOuF9gZbAm_V5L@FBq5-)C%q^(QTGxZO~ zM!j9yB)bn0kU7qVs1y18D+igJ!Au~NDw_#WI~00RlQI8xmK5SV5?5AW-BSl9*c9OI z2MpHTjZf<8b^>6}!n|R23f68^zGeZi-3UZ09tx6|+~6x8N4(0zY8(*!dpE)20b9Cj z+5`(r^j1&|$jNOW>ut!m2Q1f+L)t*zWkWJ&k-{%2g+U-e-G@~*!2ZD%u2K_uk3$-D z2&shlaD`JHm8VREl4!Rr1H%8A1A>F3l<96_vw6@7dgI{xmQY}#Yi%AP84V7Z{N!7Yl0^ZuAsws_=AxCu&Q%Aj9E>G2fYnT>jNjN3Qcg+kfZn(yL zSDR$VBLV~zI~F%aw+e1<1DHkT4IEXY>{e#kAS-@-iNtjN5pZG~Dl;N{7 zb0a&scD5(!&<+1ven;KviJqz%X^OlbTfYa#Rkyw!3*gDRF3kuZi`Q5Ie%e%JEMqZw zh#X6|TG0}(1p(@xxV?(w1AeTYz#T}imDqX=nUE$bH*ak`vm?{tuA%auYCmk+at_q4 z$bXIVqMX*Q^poeJxJs=vON$QZ+L_nJ1=000+pt8{Mx;kAeaTTS?8>=@obG0sbKh-> z(f?FpHIc$6WivCjh|86Jip`nY=A!nPBJ{$qE?btcJDLxvB*i$@5;w}P<*lMPtrNq& zILxCL#s;t)-cf?7AI9>1NP)o1abCgydj?;SrA1EN!u=l34M{x5i47a}>S0fBnK-+I zhf3@2#BL+{D9R!j^_DbuMuF)OkYF@>%!aP`T#z>r3=Vr4v;*co86LU7>V0T1`iPFH z&de*t*_vsaZDkLi%IqRnzJ>c(MFkzNeGru^iR^5@xyY+;ZB2-+!rCKH`S6FJGMfGB z`mQ!rSf$;vsHF9+*zIWdvb{(pg;{OG1y-{VWb5lSY!yeV?Lh&1RB(q>J|ujO zPZv``s3{u1XxbOohTJvAY|#N}*2`=bMm+@u?x*LICi3H091ZaHn*22A_RBD)Sa9|@ z1iJPWI4@lfJd}i2U|($>wzld)3i_^vLKdpceUEA1fDut~e03ol#MibZkR*SHIBK@L zKSJV4BL6ChtW0nk`$S~9$R5|j-T9&Cu+21o?|B_()<4*o+* zaJdeCB_+5-2Y=U3Mr%S@rA1$2RAohM5W+E15gQ=!k4PtwgJrfBf0k~9hoag=zb9x7 zc~p?@GUnkXXK)Cc24|(#oPttoC_lIJ6Nk>v`vTgc!{1;HRf>9}dL>>;tjjRain%CC z#2Smy$$J?ev>xWzAHFyeNY97e$0!s;aonH`(DdTeER=`sWY7T4q4I4PDD))NZ=Oe) z;S51P%M8;R#XcXkRJ7HlVtT|UUI`tn)YupiDjY8m!-}ku$a~m8ToTz5jO>eDfF@f~ zz^^3WT?b-k?4;Cy-Ux7X*!B(<7O2R{l%vieqp%U@U5k zy@^FI7?lkKt>J~SYw%GTsb~Gw3@OG&rF;*=cm3Dtu}nOr{RiZ+2e_65uD6-F*yA=F zEt`qOOw!Hq`m`)vKPFe8 zTdGHjuDgajrA^k$0I9}l79RSmE4yRJLf0K!WrflizQ`3Na~|Jpmjzg>-<3zbe!Q$7 zFX+e9`tetJkeqyq5#;cl{!F*Cdp)VWBt|v#*|*wTLU(AhbeIbTR*wU!XJ?EK4yh0HiuY zXFp|&bgEYzawo(_Q|JXN71cto$<#0ME6gsbeFMNpiYmNJt) zQfSVo19s&plP0+sZRr^b;rH-R7WW2A3t(-_vyw<={i5F4v&jlQI&>lzeG8Ae?%sG0 zBea_2O@SK>^_9b#k*9@NIrSfBnB&&AJVxwgrd5)UnaP%Sh!OP-);hcL z>eV&Gyx7rVUQ(bx+!N2MViEHyB%=J-xp39k6`O{K?wfKqq^7Pdei&@aW!=F7dM#7^a zQW!3!m*WR1B1XO_P6)D!3LqQ)+cZ2h|h9FoNkfqNfv+HHb4{)pC0~n&Xc%wrHOb<>Wr= zLAGWwdlBl+YvMh;!<8dhC6UuMqB6!w@rdTc%)Km~0`zr{V^vs)P)v5s9(X9yuE+e# z@?u2&B6K}ZiZTa$$m$WRTNc=(252&>O>iwNZ*UlVNxEGo_3HOcqL3fYfI`kj zZzoA16Z$ComCs>5&_n77rc1G)gg-1ChFG;+ZAo*2W5J^I$@l46M%)P(7F1-@|DcPx zf*7C#VwT+f4{)(6Ry~4?cFsecFdmCOh&^Hvs!Qah7fa*5;Sg?1lmR4Ga&cF7>cdXn z$Ycs5ASn14HD;$s_=w9~5|$QCe~KQMrkD|8;xb9G^Deqbu0Pk6K#F8LS}N*ZqLci2 z7#&?I4v48ajB<#Mg!3UPdylz~1mvha_JxIhq8EQ9l#MpWVP=8;%~VUi6&iP+lbYph zX&iA`hD~Fkrtw7Lc zd2&FS`1kSJuFA!Hp3WOB>Z6}HRVKfCFKl))s(I}e4WNqA+yj9LkQ1ysJov=;P=8Er zqN-ibvr6vp5d`m9T+_$%Ru>?^s%4)D+hoya4DZP>=8e&aV8KWUk5J3+@Fzdeb57(t zx_ndQX~#uqrd$t*PUB382to1?e?sW2Rq~OIR4)bN?UzC)Bp@&75SnV?7Hy(sXdhHy zIWh*Nff5H3d!_|ZFO0{M2!~mexw?^4f9T+@-ne#Zm2mJ$`Qg@6XHX2A^Kwr_NQ|bUW3(CSOTVA-)wUf8%)O!jwE0BG|AJJ zaO{5Q|H~l4GyjfE(jwbgp7-Gu>)WDOc;>25EwrX|T`pT32oyh8$1E7M-bN8+#~G!g zp6Wt)%}T5r4c7TU1%mmo8)0=b5>_|fOln_#2%=zfaDkJ!(oBA&=Y#F};z3akm*2`9 zAihLewkV`r@#2>kaFL(fC~3Wm$!{z0vrtZ4*tXRMvPgjY;yPQ;ki(nwKDW3G05efb3vZC5%zKbKK%|%fLQLf7 zQS&z0ibHyZA9yXjS4eHb#5}g$oK3PzZL;G&EQNkq+St+lKko0XLvHXDgLI_?2Z0?F zf4&=mTzF=n!kvOK-gpb)nC!>@{C>M*#+KBatjWqeJ>5w9!~nhf=}O)v{s` z{sGk;R1r=>J$tX_3J!^5ahR+&=8Y1CPnobjF)?A?KQUpAlXdlkHI72(ie{{tqqzY8 zi8w@L&Y{cj;lU{$a9weVMU5cxLXrW;0?&6lpa!jH>N#X4yxTYXm;4S5;QO3@TnkyW zk!O+&^9>$0we#RH#-Hk19>Zq;hw=9y{_d5WS{Bj3Sc*O$5k)@)b~Q_JLCqP)D=Z!ty5KWF~WlZ8QC!RW7ZwG zF$y6=n3gw2MNgmLrPIX8h zQ|LG5EkQ6cT?{Z;DoL-&AVeVqUn33h?vcS0)485l{Sb}q1%w1oY^?Q#t>-P=i4O5ZTY{p#)1!FU!dKg{? zt%(KYJJXCDD2X)1aAYa;TwXDw+8WvLGNofihin|&RjZ_GZ4l2k@wd>?aau>mn@RQ2 zI;v5UKL&t4AIZut{Jf1rx(o2yA>}17L5)y!vU5pPiHmQg!G(G6iST>Iyl<(0xM$qQ zrR)&#pNhDf)_YkV)LJ}>l|3BqxZxScXRr&q9J|tt=wC!_kKpMrz_XR7iOj;hrFAaG z)unq9ENTe7RcwXn(T9b1cM4%ZH=K`DK`Z-xWL8>KU(p@C#_V5p?#0flQ9WEouEaMY zK^aqu`?0G@IWY#V7OQ_lMlqBk4~Wx^1>;$ib3WIqai*)tfzYEyKxfo;#v%o3SMZ2y z!tF0vGT+*c9rX+)hjn4LL|{2l3>pbFhh+n8o3tf@XzIp~T)o$t(4lP!)aB zMb$4!)w5`xsWC}ZEx>eS%Zm`tF5Z3g1H%KB1-3{uqgzq3>v8OhUB=e~h}#Th|9_$aUNIL1>9q z1e#cZwgWWxq5^WpeyRXp&1G0;(3RS4tVqxJX3t7Cn4k@)!PFTx5cHp+1Rb@PGPQp}=_b{G z(t`NkTEXgu1pt_w4rl~u*tj5**`~tveXS+xBO%ji&%HL_T01n$W&>n?Q z)Vm)$T!3RHma_4w2f({}0xGA9AuRPQ!J^(Bzf2Xybi(zgJnf8SaAlgBqZ7R1mYvi| zBPdkBnkF(-+rALIcelaYmw4CM#O2B&Dhk3Hh4rUsN$sFHftB(^%_btaYm(*@+>sRs z4;*t~0geEv#~_?%Ts42BiHO&}HrJ202s!&tPi6CVMu2Lq81=fsUE2n1BEZz4pgOh> z1ghUNo2Yl3doBShVLd89xbvVu>T`fdFANK7V#m{Seu|E2>_aihxUTRe$v#u>!?V1x zG#uSqH+>-TThBX`t?WaOWSzlguxLL;!HXl7x2~hm(3)7`ZvfK78Gp_R3#bZS0-Bvb z)3Q`u40_r*zvmyc(v???j^rJ@!1y7-0H)lGcKZ-0*CH+=HLDZ42N+lm22LTU+sFTE-EMMG# zMC#g}UuBv3LJ5_3ZKk$2C>6e*#(oK^NRHMz);zf0x##!G(?bKsBE+xyHHaTY;+Yp#sF*#!uTL|oIlhFC!^0o- ztJ>3Z#yM4cdd$eL+S5IB1m1A*N4O5TfVc*{1>$cIJ;SQ@9EufK;X3Vr34)T)5r@qH zf?g5}H)JEQ;i@nlV^r-qqT(-!6fP_%;~bW8gO+o${$d==eO@Dq>tDTD+z{l$1#I$6 zg1Uxr1fzQA8tC8hRQ+$8eu0xd|Wom3nrcF$_6M$x9J%C!F8B=0+>ZQ&JaX`67JhcW+S!m?q?K?5){8jRqi z4XU;JUbh2=Ud|nk^tj$nk0ReFOXg1rtL6Lj;dZ%P(BiKR=AA5C4dFA@E+pp&^vT>) zSBQL6uMfn>GzMKRi(*$>(3(;6;Yf(rSyDKI9(^hTA@CPYaV3E&d(;z5axr6(2Ks`+ zIEM*_=>$)?$DI#hf|*PZMy%?q$@s-tJv^~HDHCvl=2xxA3Y-VfdlFeu)m8ZxpsuKqy#2H~9vGqTY>d5`0hk{$eM9UV`L5GQrmfQW0hYRzOIVE8$V`qYPm~p(&qTZZ)Ttp5e*Wa$ADbiPgLQFcTJ2ne-!`+=hDTC3Z zE(4?>w|E)sWQF>*mY4r*7jifdk2;n~niz{TS^~?N;5D7#%9C9QQ2rkE9oc=*PM{@l z2NQgWAT?i8mR03S)t{*b3J+?=Sh$mq_tO_9+b7)XmwwttF57;&BqraC;IwKe29;I) z4T%_Iq%CUkr355kqc96GT~z zMH&<%tYS73%+v`!c6ZptklDUdFC$i6qRAM0hRcv)ym3P=a2ayGx@)5loj=G$ff({w zBJ5&Qpk2wnW(0lzz9cZ(Bshr)HZm3@i>j%$OmHlTs$(_?2O-IZ9Qz8&oKj4K*2f?* z84sO;Sg~fO0NJuY0pzQ#7>Po$)wx}oNc*ppQyJ($c5!J3NXc26^xwIMS;S51YLE4Cr)q)2PN%M!~H#iwdc}~?D=9KZO5LAwLO>7o=w^_EQ(!^X!bFuYa5Pemy4kU zZNqoydb4RNY*-(wgFA;|!)su}mOci@x}%u|#xd2=Xb+YT`o0B6aIeDFD~>Ka`73uSn6RNRIy=$WwLazF(X_BBwBR=i+3+d7VyZu&Wyk$zo3WyOc(cYZY2>L?#(2Pj71u4!!I$x zi#kEyfGZEN;TBeT-y>Gtp~<-C)E{NT8{QG3$DiavC^mc#5st7a(0Y9aDL6$_a9*1P z*D*m)JAt<0PE2qOiQ3O>z)D*i-pVqEklh8fM%yraI~>lia&5E&G^P98?n}hGow?kL zm1b`7TB!Y14FXZL%iQBoVzjJJ)kMZ3jiz-B6I`MbeD@2NG{k5ZFu@si0xgXJOi+y= z)lXBla;7Vl811Sxw$UE@2UnCB?Nbt^zPl7g`=D*Kt}Y4bLi^tLeSJEb-|@!uOC$!@ zruynX^1Y0@5$`>7x~wynVvu^d8NIT52Kr0gF%({wh666bb?H2$GQ(KXrM}tMWwo&s zs)tG&ZSpuuzT^TC93^suGKWe{Tuj3WKr_8M?I0Oq8HL!tCuuG9b}Zm!J*17K^bwn#8o~i^mnGW zNxCD3^c7H?x)d`torMlZ0nO1QP#4BkFzt$b0*E;>Udj_-4Y_6no&&W@tFg2=??@D? zu@pkqB^xy}IM9JITtBA*BWmehh_JWLhc#c?Y97SM>uDnxdIOJo1(vv*ljdp#5X}bV zy&0_#2`n|YC^^}^7o{j|LEag-ZXjwQfFL5|hpY#ewD`zX+g{UN-_P-sE~pcDa>1cO3yzq!FyLOo z5lN%wNQPm?w3c|RQ_a>j=B`a<{T}r5Kk~6-h|M)v!cc|iL7QW;d_sor8)ZBE8UzO| zTqCuyLUH3pGrmi4adZ%s)x^^1MVJY7P%qFcqA`(Q1t5-^%;XY?$K~Ty**V4Al%}A1 zG@`szojWQfavMxDKt^Dji1jF&$~>ZA-c@`Vw>g;cz-mNt13%4hm~~zb$`+!?zU+LL zoYZwK@j4L9WB)p@Sp&IZyOFmBwaTyxHJR5>-u^sr@pOcZ@|5*Z9EFPxUR7*)OLz42 zj6iEVWJY?gvWD~Ac4X-Nyws_K?TvvT1ow^Yjb|)qc+Nb>l5kMJm7M`h@I;`--nJO= z#g?Na#)B}z`_ZM_Dr9vHj$9t01Hvo#RSCs z*ywLE0ElUYeA)&oC=TC{YkZk;Y+Ulm>$cD#@xDD$vsH{tb5#E?Y<7YcniINYV{=HC zwUlKOjLw(d3~u{5U(fQO?{R?hL(%zcb^*yu3RVgoC95c4tB70WpTld=s@cs4h@KL( zcvF>U1RBK{Y6U&cBJ24CK?$EOlwp(&(CwVms6Knyv4Hq`fb2WE!V+-rqdfXdJ3G(i^5@g-!gfpGiBMU^T8JfUUIqEKyR|O&s{>+iwTSL6h0UbonX6h-u=vYxMh{w(az0{~2<^)}sNYBy?6jnND z#rDySX2zd2FZ#SQ+zARThIySnUrPHlaQLddas`V{)g9a7<^{`w#g(Ix3yrzUWks4a z)(M{sgB4v)Q-SI-o7iqq-Gh24t(mcbtUz9!9`U+g4l>}m?9enC4L25la+215G^dtg(e z)PsMO(OX|Bq_q?KPEj$AH=X(AXmwtI;*|RE9Uhf2_sf8&_S5#tX8Q?pO$o2g%jXly zP$u6C@(TFGdZu%1m4{azEm4$H^hFI%B~UNo>I{1kt1)i{dJdF=gElt>t<;3kUeAqi z&@Qskigw?ZC-CCazN(AsbsV8XA5Pk-J{vh1OUe$%%`6}HGnU+Vc=+>vfx>T%dEF6F zdu86qwHN0Nq!OrUawIIh5lkyb2x4UfyRH@CV+);d)-z9;HfRou1ZHEe*ez-b<*usE zD+d_3vxPTz1!amd$L4TJPv0)~E!bJx7h(F}S>O9coD0&#^Jb}9LX$RgNA{RqyD=W? zm?w?;0!|39Yd9P)L_08QwpQ&i&{#mg;9kc3cd-a!a1W#AD>NPkA8O2dg3i+}4P&W! z3K=4=#?mpTOyD^xQ|N`3ngs|bn1K5u=UpvsX-dz)_p2}oa4x=HH_3F`s_IVY5*SNv zLR2H7jz-iQI_kaZ&c;$4p!T9ZCKBpyvgYuJP%x>_%SBG*{hOmpWuL9B9SATTg6NAe zjAmniFJWTbVLAK4^R28^XvW}jQSitbX!J-cvr)`F7@=pawiSp@bq{(ywo|RRt)l{q zPjOs=JYLc))K{k&OGlqF_mkF23Ir>`mTphm$j(jCDr5ff6#RhgX7mA%XFKl5+syy< z`*1(%=NV@It!CN|W67AF-#0)kyCAGrG|mmx8OGA7r_B9a zCKrKt{W4%L)u+IWF4ehgHFs?_>klB8ZOCPpnYNG1;pxsWig66rV@x!oGsKMtXt`3s zpydEZW$zFyS~VLxL~Lh9YzVIu zf;3ru_>#Om3Mc-CykTIf^>ulB5pNyg9o*BH_gA(?9QVP+8z^G+u-T}sl87!g4W2wpmkxO6r)h# zTC9R)>w7mb!_2nh$yQjEe7|V7Inbc9GS6bA$l6hrVdE9u4ZNORDM4Wb0~BVa)w`=y zf6yDj55xtz@yQmws3i!(13D5;qbgp zFf{Kv`iX-$(eJK}7l2VcSb&|16^@j9;BC$hn)?HBxa8dR6=@y2@agW{9~Iv1&K>Z~ zw2IR*Maa|Ot?r0z&VfvGW5rjAhgMrtTxgl1INtJQUBss~9R4WKfx z>qD!gkWDh^ab}9Q>gFJAd3JF3&_q;x^KO%#v}0-}u*7W?mbHm{20P4~HxP~l1MTMZ zAP&Y623p=oP|0QMar_;zeyx)dtJ+Raqz%B@;~c_&tj7AT4oE}w`PtyZjrk8jF9si0 zae)g72#6!;i1bhYW0T$i`k#pI&i{gLaBhXuR%)Y7gO9+Gg~=`+Vu*`SyHPp%!ET(v zjrM1UrToA8(Dze)=;auNLO<~eoGS|FIWiE0rwtEbAY5A&L`kQq@T3!MmL~`Dt;}82 zG&N9ewXnU~Ox+v=QM&o)jFsGH_moe=xIg^lUfHqEG>(s%DIV@Pp{-*d)8iVKhudR& zxGIu_(iPHhryDz-YNJh+G#fQ7tmB}wAh83g9*L&`RUnO9W-*#FZ)W>`S6F7nH>=!5 zmA-4%u4Up>U5o{z@Z2IrE7Sn0LNrwLkU@;@E}%!HevKuAj@PP=316w0Z2k)45`o-OqmxQinzVDA&0Gn#~~Rj&8g&czYg}%w>e(P;mZ^6 zHvzCLZY>){s`{KYtA})s9BZdGzyF~d$E$W7=(O7|2BM;M6(_MA1rZu|b_Xl2qZ_Y^ zm!mN+hOy<21oB_PI}&W0aCO|Dq~qOBKXUb>yMA=lk7@d`|4xBi`I1Z+b$1^gAx9o8 zXyE+Ms{rEqn{abK@jFZE5jq#4s`ty1aHIP;21(fPtRT)Bg64K-G;8cZaZDD#_D;m| zHvFNT%zVhLZc&%UH9l>O>C=H-?|qEjlNF%e4K|E|gi* zK3Fo;EiF2#s%r1h89C@;}hR%4A8Kp-rud3QNbjD-h&yD)ev%((_t^c@F zmv5Qj+PQmip1Nnwg6OTD{MOdFd-!G4+=Ous=oK@QDWU??vPp=};icd{BYYW$Lc)79 zjN7=y$epP%|11fa)h)d^dT!OQs@+44`9Kb!V7ClSi!uLj1cX2DT>p6wp(m@$yWwp^ z>$i34a)5O0h~9x~j9Wons{t8*fld#+G3m)nX1+sNsSSUW@*KQ~kHidzyF5{x`QhD_ zGqB8vWs1>&8s2rzubf(35eF&b6W=!TLnxgYSX)MDTs&>m>_Bv+zJ7P7@aj6&0Xenl zAV0jOsup9bOpiLsoxU~4Gd;LW3fD%GZq)qMMv@g?-E1R?tghcfjnJ6F%|pYht7^|q z7nG>!6DXs#iE^9%=#W;Z&Gbhc0yCzcL*jabS8sRW&5GmIlsm|s;0(!yvrTcvRm~qn zn3ei5Q$KE$M?$pnHak7}0W~C3SPCLiKgO`3E6R7?^)cJK5P|I5- zRw&1JzEzx_6CAM0%$Nd`os!e?F#yvmo-egvR90Cfk ztyjpQjeO2I6>!kVA4F_!O9K+e#=sPTx>H3NP+w`I&I0OO#tud-M*yS=ucAK%dtJ%g zeek4{1#yN8F%Esg$^jX+<{&f4KJBL>Mm;>)m`CbB^`q}EHdE+BP$Q!8>2tIvlrtQ!o+;gzM8IYfQAM=X1_a zG=?ZRx@Zo-@B#WpQ43ktv95`jg;uYp1<#axr}C-)B;D-)&yr}?5g13ut-EIaDi7*g z8lGMp=Lo!EfGv}jt&kCR*Ku_>#;&O2KJ`~87P^A#1rR4%6T1TPwzAJargAt#V?b0s zw#O+;_>#UyXMV=yV$i;G&|Z-cur=MK)-FRW+TD#&EP9T$mi(%??J#%nkir{(mdt z*l(dS2^!SVw~0?XNi3d5n3SI<`h-S(n4th0u_glM{?)b}!l&I>H*2gOYk1Y?nc{LSO-k zst|LDtnsYT{_2cjn1$-u9UhWqt}aLYN(+Z^0~@_38W}|E!)_Ctc0z*aU6B}BwLD-( zvS0@nvk!rp1u1CtpNry6JYFA>lp=PW(1FSkW44*ca-bDD0mnTFqo6_=@y3P&id3@< z6LIRFr$U0OP~2LADe}9Nowk(yN(=I;fWlbPom+188T7q+-H8h20E5T7 zJU>{perjE8HIdYPlR2!aH7(Q$zv&fQ&o!2Yj_fpH1m zr59Txb0A+6@(ql@D&J5^WJPggbxCC1p!LIceT$+gT0afW9!yjBfSJ;OG9e7oU}?rq z0wp##azc%WH1;=F=w#b0ra<{-VrD45TWfnnYNVGU_x1PLv zjZ&TaB?ZXEELD6)?I(Jz3;7-1-5-~ooo`)uqLu+hF6nkq@;!?I znhV?Nt&W?>eC^&82$mX3I~VoEK;&NAuK&fpspPe17V>A-6s^egDnUF6LJeb8nRe17wLpsD4d5x+W_M8q`4M zcb_{ya*3(kTFz?nGOAkX>to$fMBccyD@$MKBkkqKME8=*P}2nYl2NFNTK%N-VP8GQ zwN?>FGJ~oJL(Gm51JJplmlC&x)Z}230CASnV*B>YucZLul|JpimyZYU#Q&?ZH9i0 z$^frK`9CEGvB%|qB{S(z{wINdKl#rk|0vV5v5HdLV=Z0WZRfF7#+Wd+F)D+|UQ3cd zGXJ#4B>$y#ABaa{7-bB$T3v|6d}5DSjNq%iIIoL(xuojQ+cZ4#t?tYvA==$NTlRi1Br>A;zsGG6m?ynJy*M6(2 z_=a^|Xkd#&+<%lV0qqbuIJpJws)6INxCVRUnoR5TnPKBcB`3@i!qdW)HpMei&>>^!APAM*~7M?pA`5_ z3#(&_g1m-JDx}k(m9yX%9__7d)^Bea*8{3JxeAD+`W2#&v`&9>mCg;#XtXjrmkij5 zuJVP!NN3V=`m;KgqZ)xy%U3dB6JmX(SXnv^CBXha+nGM~-jPmr;v#etT`(e{oc)>T z`99SFY)h2pT?X?WjjkCj8xBa#wxJ>YAe;Q4TSiu5U$cRYh7Y_8+YV%UR9jd!uhBb! z-;F(p1j!^KndiH2Ah#WR3`LT}csY`2{mFAfXE!`AtTY zBfMZnH%EBCPZHieaCkH#P{LeNgvZg}gz#?Y0JdczR4vvAu&Ud!Fp%To&GaPuFlz3h z3bgfqPzp56P^I2~jwVKb8Q;i>s)a!=6-2D@onGChW9MEa_I}FTLvg4DR;6E#7xM(~ z(R@U_=kZ~APm~9%K{Vtd*?stl_08uI1{kmUkFIj<_T>3!|HMkbhU2cuLZXE(g zgvpP5OpW8hj(Dd%>Ye63O$b%7N4=#dRc0Imws3|N*kVZoKhKAlgA1(d5!kxjGTKi)-V z;>CH|(e0!+Y965H>_DHb?8?vB7tCJxc@L~Ip0iw58Q;!BYH^lTwAWwW=;@i?)yn=e zo}6u%*Bdb+{@U!9>QVJ$#OVi=q8;=Qf}qe(2~OzSDfh6UG8kBKtU;w{g000$daBSI z7&P@>HQu|wRrOH&TbHqCh)(Kp%sS2T_GQ+)k@c+zUxw^GwccMb>$=cX`|||JR+L5y z=B7XG$5F~a^3m%W$tFC3q@vJH@k5;;@Y|nX;1hK3{FJf)-8cOi3zvBy6%Ml8fVh?| zJg;a`UCT-YEN8&2Iv_ShfU=)KSZqJsCr0~?MfGx`nfeagtD&Dc-hwO6u_9>eod_N9 zxg8q26N%JKeklJ4yovr&CTK}^hhFxUewp?6jbJ-Er#132U&05{c=FpH>+p^v;m~>> zp0kyw{NO}7Gm7Co41@Hq&fwLzm-~2kF+@D54)*f=tz}SR(1#<3JHcpj(`Y)m&bbSY zLrJm+qvi#zKZUICG4{(J>LC1~w2A2i{FIt0+mA9q6rF%iefBSEH>y&4zS_|=AI@8J zA-ZU-HYbh{LMYM>@*<^b#@GWBp_yGP{6WF~Oq5Y?_Ex)ep8k4YYfE30?pX*yhc@Cp z1uvHOH2k*KMZ6~xkQtLIHFmr{3S0K84Ko|7mH{3AVWZC84*-c4WiK;&2ZJFjY>kV^ zI|ePI+3Ntn9O_{rEAieE0U^~)Mbr)7XkQN=z&_h@Sf%7qy&WDTco`)kI?WnHz5P#Z z^9Arg7+{4_h5YzUuQ)B?Vgyw-QLS5xR{IMnF(Rm?jQKOD`Oe*26puRV4rvA++ZRez z0Hrb^3!mw2ZOy>hcd7?Vj@$a;|5D1^Xj9$*$h2?#m9z6#*$=(TI!Q)YZb_`W~lvwE+60tjrWyJ-ilY%)LhilX^vq z`6bFyYZ>%fRRV?#`cbmaA?9$Bl6}N$FzDz)_Ea!Q&<7=XPG36RTIsvMAfyqIA1jCX zN=GH?Jyrl%L??FFI_PitH+Gj407Pv<`#ScHZJ-uyMKE!(f=)8wtPvZ_mmFm0(I@Dq%+}? zT{ORc6p$`+kS6212>8&#Y}hJcw|i`>yIb zW_XvKVN!lZ%@PzU@(eIfY^K5w022C%&cClVnAgwIPpD!(&cqrmEfY3p;lsSw&_zVR ztF)kxIuVqhS9Z2;agiQy#EL1Jy=%2Yuh;Kr8g|S|N$}K_eprDJn0*vHD*M27pba{o zh5qdU@hzJx=2MQ?RKFt7p#Fd^q1@5ph*F+O{7t{4BYE26fyR=levCo%*JgzdK%f?5 zn;3@ZuBP?qSfYm`>y|s)=4aGgtL@#SJOh+x!13>e^xS&HFWQZ zX+n(Zh?w?-s2XbXiI1(rjO^>TQh3?p_^=}yhxs6*_@`CkM>FGS0%UXrXs&=(2@ZR5 z8##1&<*r!{eFlUB(Bz{1!%8 zy@oLHfVHR{E2l_%1>@)6n#S>U#${{xTw~-keQS)Z|JLa4jQ|ba*Wx{U9#Mh_RDjwz zV1dw$2^_OZlO-0p58GR{>e$T{@!@wYATsU45M{SWZ}^C4DBas0Cm zhTo`>E_quXVAr|kIIW#Ist{{zV8X9^U1K8MSt_mfJ2nAk)${y{dawP?HL%i^U>j|) z98u@47#{-I3CaZqt@cQIbtUskkpCJE1dN%eC7e=C*mGjOrxdkThx0wUH8t9?H5g&9 z#s8**!c6NMpJ~e)O<4 zuG@zbK8@&;0^H{x?*OIs;y)LIkzll1o^pG|t&GR;z!di2Celx06-M^E|6s@b()?g_ zZ2kx~+9~hYN#wOiT)m~rddtpRm&qgWDC zqR&axdE0|9Jaz*)nZyc-p!PzRK6SWFXF015RM1gV*+2YT4-{o1D)nknvrjY0}a zy=Mp8e1h6C5YyiwhNB}>WXch2Kg>|7>#wEopU$fS23$Ztx){IFcP|V}2Tm>evOd-sbYSt4XBv*2=ym*?2^yviMnI9BzYJ}oG4Jt%R&4ye z<+oI%x%I96@ICh<57xHEWPB=IU!YH3Jb98xGhaV;pqCPR+Ubbd2A!~HnIGG(BIon1iyL>-9s=h_uWa01Y#n>j-?{MU(~9dx zHWoMT20WxZYx~5KqCLj^laT^;v%MVS^`Ss@x^;T%^C*SrP5BsT>k^Dyn6JeFa}*m> z1)a3^icz7B4}v*17>EsmAcK(&u>taw1{;QZc*nZ*R+ugBS4&PTbNjOYkDw@ezs7Z? zw(eJ(Y&GB9Y_}e`(|N2ASOx+(9~V9Sz}vLfSGO)k4scuYM4SEuGcpq}QZ4I17|!($ z#sMD_qcc`Yr-9}T=OZ`>8nnqo5G!;+K@&d>;Vmzz==Guzhv|o*9~)6U#&F^`oqUo$ zOg|5{=BF;$?REHkG!S6C|G@kMv9sgJYikJ+#uOCjT<<;*$4}9%4ojxpQD?P0=u{-_ z>EHA-Qu34WAgCQ0Xu^-w=g^NF^~ii(PuV?#USOf+g*NmL0zRZoDa)Qq;;jgKp<9-=CoiMsNpJw1C=|9hz@y(8zOY7Ou^uWFwbuf+sCPzx z7vnOcQjewHEJG2k8mAi>UADQJ1@!Lf9ve)z9=P5Y*uMJE1qM6xsA&LGeHTb)j4M(Q0Yp^TZVEYfV0c~IgV0US- zm2NP>_7=d@?=^#^?s-aSPWvlGzH7QczK^sw9%9tAD_;mv%NH+Yg%m5qIeH3vkPyAd zH?DC7>Ut~!0;}&I>(V%p?;x88Es+fi1#HrmRQYzb!L&r4)?g#rfPF$4Kq9)d=CuPR z5_#1I)1@_5gYDm(n(3W3n3nGu8thtkrh@GTfT<%igJ11-Arbl3%@+AyhfYcR@@;4S zw$**g*-5m5n>3aNU} zWdTt{FkElgy$pvbdd3KbiJ{HN#E%LMi`IB$c+2DM(~oPR+Ki7;%+C5F%VQk{D-eyA z3JzTcH0{Y6@>0ej?BzI%I#d~Rdces^Ka=G(yaRqHA0$@4!d(OIQfil>7O&IYjFIM#N4q_x68EL5{Ru5SdAzR))GhV@Y6*{ z%Q$(#<5w64v=>Wa)JT{>D5rF?N?9v;|{FL<&ce-zg zI|Vq@@i&Q8PNP&()?dZPCni!y%c-N~T1TBSo(czdQ@+VttIvkoUWij5*JBkUDw5G` zn8FU($HYJ$8`5YJvE)N!Y!)38+t3IvlyJNRoEMWX%7Y0gvRp=+8*Q&VDu-51Y)}_p zEmZfxq(lef6Vjjg1bCn`$jfQN!oVjy+|x5SZMv)3TG3fOd<_w<@|uWDGnbJ7oM=%g zg>(3XeXZXbIk0|?pACD2y$tX2PWB-@QSXPc+YQm`H7sV+r4;eL1Wc?*6L8PQ;qG+7 zMF6K>JPU+cYzBIN5B%!1;rm+E+s&9xJ9996YOibY(@gJr)KdpqS9u?LsHX>$Urw`I z{R8tRG3@ASUHJd=e`aL28QF;<|AiU;bUPIh#>uT0(IL+_ptBXdFK;5`WJaz=_|;Iv zerDu1m_aliimVFn_88S1LYTYn+-q;BsOUR)?{zm^TT*e@+&wphuANkI$SUs%e}Q(a z^5*j)^Q%bbor$kq%b_lr#+}|=e$;bP3?GN+5BMg0v@Vty4{l1m)4S9DsN%;b_J=1O zA8$J!K76cpK63D}1Rvo8oo5YM23y4(w(-!e26#PUxSwzhe*JN~eDE+D#8m4KP0vhx zR1KMm-?WNsAV_NpH+SMaIAHBEgnCwaNAZC%=YKARv@rgR#qN91Q(bWsHVigl&fvGp z*=0>Ly;C><9T^5O4$EyhneuJyf%Y)=caBGWB~xn0(A8PqyAfdy;YX-*B=cAhiE_w3 z8i>ZjKj_J~sJ929BJhU83ihjBzd0alx8WLTPADf@S8F*g@?Co|tl(POPt^NB&u*Tw z>pkkY&IejYk5=;233!#M@~fJgQd;l!{r z4Fd{Zbq$71;l=GKfyii?SA=GP81@#WLy3O8-?WA!MP2A9oX>_hPz+bba`C9!3_o$8?^#vq})Yo zTqt8Om(+sd=`{j-iOtBNW@L*)or`DYDd@q6BL|>s3`j+S`3TLAke(`t@n(@`9WLJk zX5Y*(t!ZWM(Bth;>Pcic%2`~^)5NkWdybVBeVA)J}kFwj~FxfIoj4gt{;@?AW{Z-@LH zRj-B#*dbHkmUIXRl2ikMP=|mZ3HdS+lCDFZL?hOQ$nxSLj}?I~&SCO(eGRuVib+JNeKdx;#>0L^h| zVPZeS^vhG*!t?lqridL1;|Q!i>JE5rNzV6xV!|a6(?u>b#j0G0ry> zl6^2yZjYj=no;}7joJ{PknBeUNS5hhU5tycstGD2Bugg&XU@5xK=O%#)K#jO>_e&A z*ypZbrVVO7c1Fc`1BeNd1yP*jWO~VOoL)E(p_fn6%V!e32q3)zXN#CeLfZ5SIOt74 zkzN6I(fcK5L`W|qKrbE*>OCv~OVG=h4(Mg#IKA*{LNA}Bm(L`65kPtc&Y>3{HoXE4 zdJ|BjSAbpg4tD5e1n9-1LH#0$UdD7l?`}7}@Qgw)pQM-1Bzh4*dIip*7aumg0uFi; zP^4FYUGy$M(TjW;0ebOhP&4+p<;$3M=(TRlG3OrOT0EnAA*{)SLQ5MEXABP64QHpd z8opAv;FDbNnZyMG$c4Z;T;RjzLcqaA0*YJ+u#1aTvLevN4lWSipq_^`V?jr&nIz6d zqC!pR_rdu&+Tq7<^TQ|k;WLRJ1dtzrbNIoB&5wYCp9B>75nvZT-=hGeR2Tt%@MusU z;iRwxKaBYq{G9FZ696819X`nqpGo{6fcyxY!w)`eegqu+B%sKT0K51(&f$j<;0F)v z&r0HlF+YQ!TO59>fQS6>Nq+cD;s*ibN8lWO@L}^K;NT|#MScX>#m}WQRC*;wfFC>> z)G+KkO_UE~eg;43X}0~KIuL&NBtLv6@q+;JBXABs_^|mAaPX6WB0mD`;->~hA^b1` z{NT}`Zp0aB34R#!bNESj_(`|n}At9 z026-F!OvfC395@9#QYq7G97+0ZGP|+e(+4@CsXr7xHvzVaefF+e&SHV4}o3$e2${f z{2+qmlL>y-@eb3te?!pE;>YLk!%-|s4o~3+&t!glnjgZ&`SHd1AvpPoLkT|wcJXsq zoF7DxA0PNhOXdeLKc{?f@(&w=K2$iGA3TL0Jd^p!(fklD&QDI9AA*ygIF#^1U>867 zeqBlp5#$FOHPj%Sw{2+q-1i;T7+mrY~%+KMc%HgNV<_AyV2hU`Fsx&`@i}OGE51z^Vc+#Z)AzYjvPnuKz5S;wP zp@bg-yZGr8=LZqw$CK8ec6^=04`O~6Kj{uXm}e1waPy7*OyMV8^8>g9Kk0FPFw8Fe zI8d4&0K544B~(l68%E`YpY#URKZT$4pT|$8!%wEoPo~XJW@`ClYJLEh;3qTA55R>V z2TJn;U>83V^8;WPKYv0|*yZEX{P-Hw+%J>)!SOz>j=SAu__6(kbdTMuN0ngngP}v=CnvRh zax_1HOYoBu=Lg`zj{~Lo0kDgoRVWIZA9TuSKREy3c^sMQ@&};fXYu2A%Exc>c% z`~);VfJ^Wbi1Pz*;m3i}`~cX+&v6NU0-B!y`adcB1lr?=(-S)vhE-a{9vLT28Z3rR zau5$1FUtqV?KZ7RICLj`VxAZKwPl82e9)d62wGWrr4cg_jAC6GUJ6SZ^wv# z%rYFdhDnZD)jzbl^U(7nfHVz z?=a(&i#=p^dQ7Plpic7W)iv?NT)AX}YJ*Llp8=`%P<(iwhi5BXQGjLSEd!hd6&Q=P zp2i4S6Qq{1{R49*kqL#II7mITcHWr0{HOhjkK`|=nHwQGE1902J zeoleI5#f0MdHeRZVmU0nYyeQ^%qDCz(;7_+2qHu@hdX|p`2(4|apgt|Wa6QaB_cCA z-JT=;R0O^IG%?g6Z=?!S7xs)q1I8n53EPE^%$lE3CI(!C$T_< zb8%Jxw31I`s#l^UGOZetRn6H&uknm($uOSTZVWQ(KgQ{kO-$lrfuh6`i*vYSO9UrN zsK}d4&0)EO8aC2i_`sB~I%h>nA~U?%`ig;aGm72Wu@g}|ZU8%;S7o7nhV>vZOfI+} zb{caqzcayDQJ=Zfm{RANU`$>;!T83TIlm{~3%Ar^wk2n3UZ|3jFw^-PFlt_*BI;=u zqvnD%Oues5M+giG2dvcPOn73u5jt_FG1=U1rmcaF?eca5vdvk_KAY+n_j2sXP?0i_5=px;m6-ZW)|`_<9C*1*^Klt{C$hReFXoM zKVR|Zd;YZk_^@w22aa#>_ZbL0+C|{xk3c9gnY;skdjODq^E|TuO|P(i_ObNy*gxv$ zN%!jK=@0AYkf-Eni##EmR9bfy8znkUvQ~CW$e!rLB{|)$WRv@cy-sI1_ z{P~bS%lY$9{?vnR=p00D>q*;U_%5uAVZVO%$%NITSdOLj<9Sj~{XD(5eh$f#=Z`9e zVqX;{9P};Z<6_@pKCbjV$H&ht3!buo{T5*IClv{F-h)5rhNuQL10o^{{<8dOc>LWA zi1Gk_CYIr6N;!UJPLUX@18+wCX~hO4tn&NcDEObmHC5q9DT>SCiobQ7 z>X}D-(&+@eOXgB5@ba4TvO-?oWgYKIZToXOy=eeJnxw06(#>*S!tEn~w~ctZ!PWP< zB@K@*8_g#$pNn$=SouhO5n}sk7HUg0S`5}bs5wxX#ijxb>+k)p!#3K$AA*&QQibQn zhHG#fGmt{RjUVU5*!X1$L4FJ~B*dSeoB#*f`ixt4A`Wi>Y^OR0oc^Jjt|KjNFG7vQb3V1f~<#~-|W2#z$g3w6$N{K2_yUNOOVugMIr zLTjuMe=Px?{fz}V_pQQEHuIS}WaWX$o$zPi?@~X0uJ*6|A@tG8&q80U{P*VXR{rqb zyQ%40TSF^W?w&yuc#xIpN0}CcbT}Z8$m zXPD8f55S@aN9+cw4(y(Rw(KvF$_fE^!`CUorcQGEicXxtlF5@`w=!3H#)Ao5ocjklrGdsGd%>Sl=BsQw#k z^270i@SN#mAySb!B#BDO042|@P?*VBMy&NIW6zt3&$Na7PR!hn;&m}5Nbo1 z#;Y4~wCb%{eb3D5XWUh1Ml(mi&Ra_&X+p*HZl=}Av8wTC;!`qT8^| zG~P0ex6MJjLWcwO+XM}NPSh0+X&~7ggkzF77!TIrKnM+ ze-o&&ll{=v<K8d07Jrk zx3~0y2n<^S>x@^|R~$<%!_Bx;KQ|+di1fK5eI<=t@7dZwYe;*qB!UAsuxu@c!(?>> z^a!Ll#FZlSR?+*@)|Nzaq_x?1yAu`JwBh6WFLID!=xN4Q4LN@%&0*dIU>EX((JT8l zulRWO%+-+b;VZuiZNkUln=6i^wg-zooTY-150j(1L7WbOD1Z&XE_Cii4v0$l%t3XD zcS>}j+KWR(7TVIc>jNWKd^ZE7elc?6XMEV-@mj?GjvxDCbnk3*KQ{+|e*Do=1OFFv z5J@DL#=rh$IeI88uAA`xTg0j>xJS za^_TNB83sZ)2Qr>zjIODSDuSnz4BaC-j(MD_*2H8a{f%g&wQfebD{lQY(Jl~pLO=L z$$mE5&+T}cb6ZG&Ik!%~!}nc;01z&n6rJ6Ha&tuy|B8b1O4bcEV? zX1Cz#0DEoc+Twn#4Gj|_ohL+!`yFVAbjD*p)+%@AA4a(P?MA&Uf-Ua1-FX!mgJi^{ zh9)Fm+^aQBIkkJ+0Bip;|eu7&iLY*+yyz>!Ang{M?nBh-4?==4!y8xPGMs}EK zn{Wj0^jGv!*dJU#X80Sl<-hg;cs~?_?RpGge`pTa8aoteZ|!tzux~4hHprp{$C*>T zRwtC`1gq1n=cl8rYcEJ|usWgJvmfOhWO<{#&mw2DpPeBVeNc*C`WnH$+aY*bS5TBd z0?*GuOYY*nDA>tY#^WzQVCBW48CRx&Ug`(r*aG~F?~4+gJgILJenWy_Rx*Oi09tu9 zKr6?K5>4s{(8`dYoz)@Q2?5}{p$tFM%keX33P)y&`|44fzIxQAuO7AOt4D1>2S7*& z9;5`14oUe9&{s|d`pOwVUs*}?P=BI_Sco2s6Mf~C{fJ&@$AiSzN2ZSd?*zYOn$-|y2iR>#K zuz~L-b^IOG6dbUbFPBr?ldsv14#06iE+vO6m4Srw{dl=FfSIptJ&cZ{Fe?`9vrYCnD#D^^|R{^Be$lGg3PU{ zf=_9WrMaspD!YmxTieLiHn26S^v#=2L4WsPD zGwNN%l@Dg7Aq-(|8RlIWw9FiW@7SgAJ>HTH8eWwxT>Me$CApMC} zVG=mDF&+$-EF{m54qA^nN&icMvklL#9VR9@N+^(B#JT(!3B z5Sjx9=aOa`m%S{!$lM*Qki9LFWd3;W?QgIPH;n1)yg}IRa9SScN-@nS)96g5Pit^^GNXg@27QlYC!W)t z`yBx)kk_r3^Y+?Fkg^}p8+P(L=?%yWLp#Y?URUQ?d(T<+bg0arVk{9?sl+pWVMKcw zca%)@iDOV`enA|?`0+2pmZpSybxYn5nIb=)S>#`aeNtM8`JA84b?~I1T;c*940Z9T~ z#D+H$A}-SzqiDO#0Snl#IT`OC%+l}U67%4Q86$@<;3a6)vNpxU?%6owkyHPi6sHkcA(0IRDR0~yFMKo7TTCer zGxo(=%36^fLhYwZ-x}+fUUea#vF5M%FM1GV9q{X9-Y+oIZr@bJ$ zC$%4%V~Z<)*;;`GKLv65#KkL~kg(2SU*q%gmvO@>7@~Wj4=O;7{T;@rJ)sjz!h1ZS z<7{tOf?c^K(V69HEZ|GA!Fhbp-uJ9#ZEbBG*80vHlM%CQu%K)C)|N$_UTxrwbzz;I zu3kEnpL=};J1ywcHa4cCa)UG;=m-PN#4kGxU76!`S+1mr%OfFQ?V$f9(cs%C050VKY06`EvV2Uq_=YNo{7 z6b@=#mL=a(g>k)$d%xsFsJmM{D9!>_dpuyGklQWwITdUOsO7(KmY*OJ1IP8a!!b*= zT?6qP6Lo(a$gu(~M3uJ!+ZS(f@BicdVUyeDk8HUtNb&%Fb;a7fa=kzfjup!pR99;o zmqyFcZETUQ11XY-DC)w$2M2RyhfaBL!YR2Si@iWuv&cu~kp62H@bq?pWRsmluTisDm(P#&3C|ppM01id{r!z3 zWr~i1GC7L&r{p*s(3#AuIGj;&fLJNz|-T)C_k}j?BkW2WZR`{NXIhqPIh5NE9x%$0fPem;#`w zpgI-;wlFU16m^73eql!JTZ!1XgGvUWlJBC{bE_msZFvYPiMv#JphdF&KG7C9b{V8G zXicn4KX_w|`uppU(gz1p6f{X*KS@8A_fIP8Hu@=Lc7GfwrOfg`O}qXs&s7c;R946z zrzznG)OKB7GW{w0{V@Xo+bL{0iS7)`Sb7HNQ3~*~A#U4hFGNBx$ZQAn zY}R(@)V>O?rP+a`q3z&iYiI@5y5RN={<>GZB=KX^Jn^ILZ#Cqt2KtlABzgx!6K3|{ zYsn^fN0U2RYDhL5)V6*}Xy(@Q1k|`is#=kl9Q%<}`>G3Gg^Hc24Y7THB6juv@%Aq8 zQB>#qcoq@}m@q*Bg9S}=Z4*Ho5No0!2?U+hjYdU{)GAtwsAv%qKuI8B6Ue#@sKsg( zTf9}Vr;wsBICJpn`NqN8@1YMfJPeS;i#!<85oI+A71{Lpq=HfxbB{DTEl%DmDcbl z7WrE%aAe(m>(m_<`CH55-G&r3KzIp8jk=`y%fLA4C}afJLQvnu|1J1`g*ovJ4D&QK z%outtAdFGxX%S+mPvt{Ft$}mQXI_t>1I%8e&Gp4Ti%^rlkA4=ZCe15D&%o=RqIz=e$IfZ;h`kpB07vWL`|7SALb?6@Jp#EO`yc zei&D_7Z8K*TH+**|G^ejy*$qJeMxgly)hXkqsFG5?SBH<`z64h%IAqko@5 z@GWqI%@sDZasJuj4&YTDDriUhSwVXU%?8`)n~ZV>^xY@r!%5}@F1m3s0Hp=z=x#PQ(&-0fDNW!OoY$i4q4}RzF^-GEFH|W8pJM?>{Cs9Y0$N+B6X$-E)&S?eVO(T!O_VaHj^?W9N^y)QocmO$QVgO70o1_N zA%c;hsgd&?d~J}rhkn?aifkMr=^K{;7NaKs>VtRUJprKL|7;G98vnG>3GgqNM6Z_7 z;k1x(7js{xJ@y!g?|ucyO?V#Ww7By_L(K}G+BB2)pZL(CS@e|EJc-SBaDHef=L-yD znL|VH!z^+>4s{u+4}>h~p-M4>T=cTyU!e!TzXutED2sTX1}?>Sb;qUVD>~plJ+g$8 z&}jU35`N*mDJRQk~wn% zds`GIZ=KaQa)9=nelg=65Ix>v67@HsN-^X8>|cq-J0pI)7MlxBiBIyo^nbiPo}&d) z08>OD1-~pUB*3j*XJe$v91D0P=hPNNtBj^cC;5SKKJ%u&G59Hr#!nV2jR;kW!Ow~p ze*}J{|9xw%(H#vxfGGk$_+{ZofLm&}fI!nQz;jIe{4e@iWd4FaQ8>%?Wl(F^HVGG)iAb(NmlI7j%$_=ai7aQbU2PshGjskv5!*c`B`j$fNZE1`3Z=yGMP z5o=C%f)%iw*SF;%o@-8*ovMb5G2*t9Y+2@+I5(az=jciy731(?JSgLQ1%X?BCv9BH zVfj8c!MhXS=|&~`!dC5jd1hQ)1TJ|Qjn7W%7YPG*>21?YK#6l>S^&EF-weA_j9A=^ zlRD%5y-w<1>HmRukD*@}x>g=C5C-J%2L*&^72rzk7NB1~d=BXPeJnL&@zY6vNZ{L{ zbujc>(bbRhht&AjSmTfJhkCO4#Qu;r_w9uGCProjLxremo*Wv3(Ac;f%xuRTA9yZG zu#L<0@Uv;L&%mYjd*h;?)%a!Ele#EG9dWgu=+y!Ka{mERITPulMBgi+v?Q|OGQLY! zhj^&`PS#{>q!1Hc6&P_9A}Z2SQF_m%yshJpOP4swdG|1GQdr76rEZ-*2 z_6VC#%x|5YKL|hnE3E_g3w|{G(*8{?iQ(V+?2m?Drgi&{>j3_{*?~R(A(LTp5H&wY zxGI&^hs}2&ADyJ9_^J=|u;I7pnGsD-32fXEsuV-dZ=Oy>&s!7GGurn=h$ZBE z#s_|J8iDO~;==Me1(N+(pjNBI68JTz5`dZ*f8$u|4b==i#;iAN#l})9Xt;5q^@c9- z>kVDm-~BQD-4#7v=wO`LL7&$sa$wn_OI4BbwTv|M%!DLk06w9CB_l>ak-WJ^oM-b@ zfFOZwOl{uA3PfR2SjY1xj;OL#zB%(LaPPE`ijU^6PWaE*troey?D0e3BE?v2<+ScL zZ^V%O`zL{gj{RriKa2h;Fu*^+sG2+oi*cf0vVUu=1-WP>m zZLV12s5t_F!>(A;yxp&RTXboy>gF&6z+jfrQpN!Av?6{X^6WAtN^ZW6oM#&$SfZkL zf#&#%16Q)(?(Pq~tS)~Tyr2tf`4ixMJDwO7z54%kJ#lore4j>u6R#(Z{{L=0 zk>_Ja^Dt4KC+rHeLpC|NmKg@{ZGPM}iYBq^iI+Vd?Lv37p7>B~Gir^^_Nc?_i9&hf z{w#bHShpQ+fkud58rw`>WIfZrBnp}uf4)49~trfT7Rt^#2`;!#7btT;XYT^#1m!-@Sy3C9>k2Vg; z6e$XwmW|9pXXXc36IV8JCDao2=G*xH4c)jeL}257b%}U@nIWoJ;>xm$1AddV4SeHa zIJ5`~S#J}DBs1a$r%7h(W1!1aMVGLCiTcu{ic1V4GiNX^agrUE0AZl_M86HTzChXb z4HlD*V^{%El=CZK6Hf~^TkdL%z3rrbqx}D*C|QY%Cu9<1MyOH@@AbhL+6rA`40ToWBV^6%VM9_AF<&VEfu*wXl{JORy{Ff9l_2!_Fu?f zP#ID2Kjpp_%KBijT3EdT(=Fy9A#tlF)U&KH^tkcM7mV^zX?n07Jn;84*naHgJ`vUu5ds! zg0-NGzBXU~6GmR2SiU>`tR)V#|-USc3{tse-Qsl`*W}&pNM}CJ&fi%;NMQt zk4Nj6$A{pz_%|kBSLpW@&f!x|Sj-^H2}Rs|`i{=gPx^lXE95r)hKSeU)BA{{>KoSw zE4=-&z>D==dwDm8j3DKg=KnnerF2h}!x@EdZEh__8V^&9e`EgQAzNGp6>-ZZBJVp6 z*{HDa1;rJ|@Ba=}iosVgLA@ag)Oi0`n_I8ojnx5GfCV^!A)5^8zXy_kquZvfg$J z(tCYnsSv7b;RiuSj)Qt!Q=#Jr*kv5Xz6R$Ob&#Ed`83$v(}>buZNTx(DdIw08Jg+SDd*O zXJ3_P2&6>jmhUY;O=Js7CJRaFQKq2saq zjwr%KzVg*zCak$(GtUR9I41W4SHT{9G7Fdo+hK}>y*Wx;yy0L8M8;dj)j0sH_F9#Dgm3t6HC`+RIhb1kn_wlC$71U4jIE*9kE1R8S{P9lk z)33jci8sZl?Ht;|Zr^smPsaU6<);MxI0g!INl;jlWvmrZ$s?~Qv{iM2OcUGvHbwzL zThau&8CY_+CC$z`{pLQP<(U5X4~S1a8XuqHxgqiKsVRUUE!$Q`aYAHOp2BLmmJR8u#@ouQ~`6z9bv z>k_Q6TWY>y-Z27JFDwKS&kOMu4RW-6mPOkaJAXVB-%D2V85!T(wt%b@8Q()3w(@-f zjuBEpd-#>;Vdy&eKumw3e2;v}C!)3ZW8)9yOJ_MIxUl(|<~*#WThdwaBydzJ@`oAVihRmnsmP!DY5EobM^}e% z6pf#&65}VA3=GSnBF;^^7ePnBl4_o{FdjMCmFr@Wb0Yc-J}CYX%^5}ne1`Muv#T-@ zsYqUnKWR8{6?xuWW_}L16Qs}okMzWD?bvwjKSX~-)3a+lJ#RJ=(z98~L$tn?cx|2) zul2Nc)r|XCO=JQPh~kZ)Div=&6|YeBS|SVnA+&FV;ti4ZIjol3idVcGa0s{n!CY_% z^scYGe@4MRrcaJ_fI{y6F#fBxS{|ng3?5Ap&zTQK7#Ly%p-v3{PWu7!@(*7;OC-Q= zGJ5|(^3t{H$IHt#SfTH%y!_gC6nXgp`0?EvkDugt{`>6SABdmip8!ASV%fj5_&Fbd zcBoH&0Df-w#^Wa?9zQF*KM+4DKLLJD#EO4s@$)kP+97^^h`)G}eET9=ffdF3i%-@A zL2>@#V@iJ=#U2$^-68&>ceU>S6dwnMzv~;;UmQkXT0z146(gZ#HbI4#Z^8!V;tfzk zV>hJIg@k<)7qX9Sp9rJuz}$ruavNWNIEH-+&I7(K45_7P`}70&>1Xre`KenxKb51~ zAEb}E{RI595=-zlevW0o*UUW%Km7pw9IlJUPmg%~j77IU2tPf30{lFKwers5=O1-P z!A~dSfwEtu$s}TAc>zo25w4yKJ%r+c;?JlVg4)l0yw*^NEgu&r=SStwTjn*!f9Yg= z51H}E{|~_f2LR4o!u`VOp-Pa&NT3(h0_fOy!?aGuXQlrptY4D|nV15~LVKPBtN{$d z6E3*+)_5a&g|GXyc@le09G}(ZdJ?X;!5u=xTUw@@DKYvP#KBp+Y?=rTjQgvp&%D+` zqtuhwP`B86569K(&-On4BBs4%arJUpuOYVHXL0o;yt*K^-k!L65<8j@TaTx#M2|ya z#uvoalaCcgjklQa^^2}o<1dr;BEy-btoQZj_IP91qhb!EW;~{fQTkS!n}_|P(Q^Va zJj{pX#e-7lgey!!pFd;K+u{+e?hU{&q!BBlbu&U&=h#=ZClNxlmFKG$WWr6(_dUW( z1h4A8Md_F>$Qs2W;@b;ThwNzfm%F~bxUDtR z^T-;l;Sm-{STE{mAKSeOiLy4TF0HjuLFG$Jtf2;1>c+i_F05+Qt7{7_LY{e2mpL6A zFbt->T@isc54Isz!rY;#P=zE#hbrR!Z*X6s-KbX#%8o1vP&Xg}B!Vz&e;cyEBANS> zUWPinN2JMm@nPbKti%^Z8n*w%8dBi$h!?A+UPO=ThV`O|+cTjTd*MYhry9)k()Y4S zGK!x%n-4bvU7DkIcEGEvW=H7X==M9go+$0_`?EFL==iXC8=LQ7J*JcPLy$6OM+flt z_|fpI_;&~J|9#evhF>;ZG=16u{4RFzqt?Tu{V7-x7hMs9|1Yb4H2ed|KV3S4-^&hu z6#UZuzp$*G2>vsEJp4l6QQJGf|0<}99|ym*zYj~-iQvDD&Hp(57uz-GlMdkT5eYx_ z8gv={le`fLvC@UYcA|?@6Sz>(^4>{#JeB;g51(#lZxUdPa8k^>XZ~1xO8ZY>1w0Wx zPh#^w4xh50Z)ivGzlIglAIA^U{thg2CxU+*o9_VrPWrFn^Gx}#jejvfaSK7>K$V0l z#W*M*-VG@1{J$7}!7k!dY$&#N5o1Ey;qKMg_|^>gHd&0#TKT0$%HYSl!zv~_&8|1A zbRWymdeKGtUo!jPEWC=-XnPTeg|Sb6Go?4`(+9Qz&P3QX3kRXWs=|x4afmu7XOdbwK;qtUPv^l@R53~kj zpX|hClKGT+nt_q@(O&=bB<%rzefsA9eUh}-wC zedNcZ>c@%l!>fMummlTo$Is-)9r!V2){s@`Yk>AZV|Gh@%2l`pXq}$c?o)emvXuig z<}I&xJ5M3ZJjL3i%ZEB?c&)3nbE;}I1wXWgvCdPnSJ(GVSNBq-LKpP|U^mvM902vg zEdv`_=38tr*@*@nQ;)~rE~x1BqmQh>_;&bYjlsR)H_X!MpxMkL;lm%|))&Tr7FawS zjB`c?JGF+CzzKblhC8NVK@PV(D^izNbT`ji{~glPnp57zGlw}C%{8Yq;u_!CwJMpr zrh(a?mMJ4C2pXknPmmc9?e7C-%f$A(0g5MpM8{e@O2w@-+=|wZ7sdPT%nK`2j2Uv| z=>hW4O!NIMwv3|5NF8|D`N2Z zm*eB{`Q=)L&pCMJFed?@Kz#2L`y|z;+=W}sDYxQp1aj|XKM&jU@yHGcFr*jqGJgfc zgOZz}HT2dRw(7ulZF8&S0CP^c`7JQA2$Xu(cgx1&r>uHrOkWL^F?=k-A=cW za@F39q%p|A$aECprA*JR?s`G1HeXUi*@1j-Kx??$QJDY9)RTaltnb^=BQA2#5W2Ql zp(wv?%BT3cQ5UUNEj_g2I|n+dXbsnPDKv71lbEJP~w;o$P+eh{wS7ixA$&nCwc4+<`Y4Sq1 z9-Ht&k58~zt}60e-w@~>56ZLS6#tHHXrjjE{G)!wFq zYqMKwb`WztnnEo_;V%jZbP?{uJpNtsjd`3Zl2!5j8s4;-17#$CfIV_Nt+S{9f}D|w z15mZOzd&!oC-n}ZDle+@5$#Z0(+gB>PaCMd7Z7;;{?=}umPYY->brP89qCzBU4OB9 zKMD;a+S@adrn#31Ye<)#Hjw{mtC2KM%XX^~Z;QXJTc{;a&(l&}KdOs>6h#!HJ}IZY zy{3(jP5Uc4K=G6fVAp9E61d|%Eqfx`O$)WFAh#R0Z+DemqIkq?SS`4HK^4!c;&CY= zaLda`{3`jQ)D2m$dpGd-t>s85(2VUEvF73NvRcEi-eC0VsVO*`EBHyF)^I>KMjSkg zvN`NrJlR_zPu?l=?tw76jkJEQ0{<+z_hM0_nGB(9ba`4KvHwJ)u65gS(Co8cWh7k$ z1Cr{%-{e%cG0x#CSgv{MP@`CDxURQjO#bqz>2C>f9s2^mgJ~F(zjX>e9CoBj`B!dZ zR2Nr4RP@MwYsv_=~Am}sMbGKt!KEBn-h`%vwW3c z@D5c>P{j?ZD3d}V@+ZOHt7rZw{7u{~`0JAj^cAN%65?+|9R4={^!UpP<8N4t;O|UT z{9F~Ms3KE}qu?)x$z$Uw185OBFhdTI7n}8h=BnXZ!|=0uf;_W}Zt7j#TyqY=+ zL`@z##?W!Qt^f37P&cbMe`Wb$K6MqJUH+kpMa40eU+8LIgm9Om5)@ zAN&sht-CN1nF7$5aQgu0pBR4ip-U^qML?A@;)2Mxgv46-Ev@!$yreIqPD@H^709?} z96n(}$f^(Bs@1-Z_p1-xS^ltmF|Z?AnK_f-C!dYF3G{o$gq78K1V&gli$-+8mBPq4 z?^tU%srv9Bt?qQ(VDvZ%2k^IBW?+qGkS8_I)p$s8I|&kaRz*%>ZF@yu-M1_Yjq2WI zIVj}d`QR!rYED@8Ae?Ik{4yq9D6C>(_B3SZ#sgz3TqE&wIlHw;MHogaKR)^ z;~z34x|6V9C&7OGPOCde8o@lXhyQnsWPw zqn-A=DdqTEF#XOj0;_(hc@ChSjl8@mCj-cW>6v;>dj>vBP_-F{@V_kv(x{xVHn>XH zUO1?CT}sqocv4_{La%7N@>i5ji@-S`II|*ykm@U&AvEpQCx`YcG>yWY=*ED6FL5{i zGE0O`D-{b5?p;*<{aF>m$ih8^X-mAzgCDvv!&6Q%Dks$=fvLFuX6FzLXJ{llSAd<5 z^q77*+Q_TWa0GuvPgnaI#ku#nJcmxGI_(l;m>2YX-(?KDtHik2;c9Oz@!}Jhdlmj~ z0si@Rk@ny_V|wg%d*3hdt_yAzR$Yw22&>lPLY%PaBTI~(s-oLPcT6gb_v>l8wP)to3~hPf8YFxxtX^-fi?xxOjH^~pfA?%k)b zeh^&T$#y6Vk4g0{fiu`fK@&J6FuAiWR3AFCLKC)B!f_*oV?D&93>UP_S-^G@FLHPR z4$I@8A^a1;Yv!)EM0B>RVv8!)t7455A(@HsUxrb4#GElyOef|(rF^liu~lU0K2a|< zhZv~R7H;LennMj3s5bu%`~ZazaFg9n@H7r?l>>;(zW{8y9SHeRWE_6}VB^wQ-TGM< zGc=c_`v(551z|ehITKhE?5phlI=`C|d|vnU*${;54cj9w3@%blm$WMHF&>a>wW?aO zo36?w6uyCdRKqFK@YYbnn&)g8R-cW*$14!a&a6Is&Xo6X5-dW{k}W+oLmbL|+Wbc` zVjQ1}VBsb`cOTAvN)7+t7oKfYl4z-E zl+!-#TK}?sc!f&wA*`_hWIq7eZ|d22`&sq&-&h>njB|#k-ouyi;`Iq%4mXGq4OW5K@V$smylZvO z4hPw$$65=6jr+8+#=t9}l35AyKL(Z1+5RZ{ z?FS0~b5|_=7+1Aj97Yr?+#(fPrhkHVPf+b9v#?2rI%#v*WVnF{tQvYxkglhY?mfRi^*#%W zbbPsHKS-D8S~f`>R5_R#ohkB1}5D3fniM*4YU8 z)Xy)%M?Bw40pe?RH;SwLoO2mV!zz8X&K9{3_2HZETr1aH56aj>slk*BZX_%XGi6HA z4#L;Fwqzvn=Z7>RFwYY~88lewoD4?5hY9yE9ik-ti6#T`GvNMM?4p{}{ z)jBuJIBK2SrJRoyGc@P3#$2<4sK94jL7L%+2YhtcT2^~bx0lttwa#bx%F4o2GM+EJ z==&3}x~A3rRmPhBkMlWy#Q6yOtfvBS!r5RX-yNOTKIJpHbeNI1ooXOYM!@{d) z`O^1($GT-XsC%;REyaiNFa`pn2Pt&(rTajh_-5SDK--^wIl)tqQTHRuB}6`A=Bv_( z=QywsBsJ0<0x2o_e#GMdr#I+r>mh6CFJ2Te^rcZlzYw5u=uK+qOV3L%^iyRxGW3}- zL;p)(8Tx%Jyro&bz6TClLtkHUE|8H!^%0_(k$%yar1X4?bhQadr+e*99&MMYF%#tA zEAcql67gJ}=%~>0WdTP)w7eQw6twT5!%sWLO! z4WX;Gzxxc?U^bQrNf|Gotj2@to!s@!fYN=-GspRYkamW`|%1vbsB z0gKZAOGEnqeWm}EZhuaxCFp-qPvCW>D;2LReMu~5d>NdtHYTdUM(?2^Zg6SLiO2`I` zI2dIEo;fGP^lAjO0sT=Y(gvu3iVc{RAxuA;h1h_v4p>ZY*#H>>fhqo6*#LGQV*`3z zqL`bH!ZtwlLK_gcIO4f&1HK<-Gym#{$F>dF_>DF6=ZhkSPK6pC`Y3=JVFR9%2F3h^ zhkmjQCu{>EhW@A~L!Zw=4fq@R7dBu##6m8_QGyMa3=ZL3 zv?Ckv%0|WLS>`2K5jNmH%Ld>@u>lLLYN=*2a{dISkUa3X)nccfKpy5>@{ky*A$joc zvzX%Hkr7O>EQ%@4{3gl>JTx?cJoG@FNFxxz6w}g$DQ;mQO!43SA*K)`V9P`LFib>Z zjDSO2wOVmz!$u%X^H0T}v7XyT;M*ZK!J8r;hm1fzjX)uE{<$y$zY;8mj6n8YOC5?4 z;8Kei0qicoD>MS<(g^%2a2$+4n3JK;$-?|cBhYGJ$7>-=U3KyW^QJ3d0McU(Kv@6d z{331cR=3XE_${bIv6!VZ5Y- z@mk8?a?C_&rtVF%Jmu5whSRlmS zX5`e|Fu5ms49#TTM5d&eu}~8@9R+72A+!X{jO8if++U8X$-K(r)eM@Q`v@V-(8DZ4 zCzabcr-I1nCXawCUYO0r>X>psCz*U;VrgQ&vymluX9>%i6~xJM^P0m0;g*87Q)yM zS%q|>o?2ZI4gXt@{7L@x*S+`(l0PC!*NP|)0&k5jqp;l#5>=yVgh;#T?JM2hReHfD z&G-mJMG6CY!U{lI{utwOtQQ>Wq0OtogQEPcn&-E;&>SHY?& zDae|b_98wyJFEvaNc!n4RxSq%A&|{TonlmM4#bJ@tzS`*^>LaXoEK7LoQuM$bFtEw ze#`$UEhb1d(pR1l(qe)WFRl7$)UmW!IbB%}2{v3L1l@5$m!+z3LWcu;d8$0zSY8y8 z36}5$BmMUOD!Zn*+2&pn#K;N>U@dqCPuh9Qm%axDg70tOCdly@kfZMQEiYTmTR3Pr|2@*g!Hg^vHIIjq5Y4rk!AbPT5PUq;|% zhW+a>cjAJh?rp{gaTP^3A>roWez$>>VZD2F?;*FhIWSLEu9!hit;YLW!`WD$%fopN zVB%T7)*5DVjb}zh9)5SN?E6{<>ZrgiW4L<*L)m~YrHdND{%$h(w{R10m6flSw$ffp z!4T2P>ue(%;%mMy=?_H*^FahHL}Lx4A_*Foj@IA=@)wiJ)8Fs=jS&I4{p=_hezt3 zoetfxVMu#neWi0GwdE4>Po|P7>xTwFNX~aG;qczMla40iFD5ArWdfhe74qp5!27 z;P;#`6yWg606WCHlc|&^>b|?Obl=@MZeL0;8D9d&@?h~3XIDhcjO85;zq8!KkQ z6<^?_Iza5M)>7m}nb13Ujsaw#&N+NiFTfTdpCp3oy_TtgM2Knu=g)xBu0~x*Iz|?H zk-|Pi+$@5KQB0&43tMKSXwp3^WJFa6+%C$FK?Ho$8N|)SNQjCI^O~#FH;N^U_6$|E zO(De2Wi3TlYbkpF^?LSNz9bIJNFL)k4w%zwFDCwkjSBqJht;kx@2Vf%LeZv3M~O2A z%)#*=MLRq|BW1QpUQTwJSD$0^GP)|I;uS2Xe;rVY_uqWkNOztVQoPD!Qt_@v9ZT`v zO)gNFmg&^FUCGXUb6AM`_-Cn$klOkRN=yz%P#6igksjQn^e@#BxhyeZz$vNbk`W5( z(%`GM_Enve7#{m!V5-nTwC`_EwY|%mLyylA?F)GgEEAPU$u00t?OwY+@E~s(DP_AX zH2rc|1e(T&(X`TxLeuxz3DEQ;>U4mn)GmUi9xTLAO_#b7c?6nDEi|>S3end{Um-J# z`N~!57)^{x-aXt_F$vIgo&7KpO~YjXMDd8wV;fD1`vX&;o0vUuN9_lJiJ zkkl1i4ij8PDgYzB@}o|%8}T^gdz}6~cw?6j60FwMMYGJo;PO;hTTg$U4 z3k;RV@FI+q!t;m=yp8Kctb?FG-Vi$V1vsl?A{pqX>;%s{7th-Lz{9&!%p|a^PI%E;V<7eP_n{K>irzz#%j* zNzH>F>&C1ux~IL1Hs=rCXC!G$UG}Fu< zVS5vJC(E*OjI===m%*(Zzue_ri*Jt>9MlXR?OfXx8C43j4MZg}{}-$mby!KS0=xqp zpaUFGY`%F{1Y|%07C#>r(*QV{le?US1q@`@tkLGpJ0PfL)hxWEbHbS52D&& zEd{8vTmt^eFn<;aV4)7wIRcH)t1j;seO?t7Ze%ni9({uU3tj$7y!jL8Z(A<=yw{< z2y4=py=M&;HbX!7sqX)>D?Uu{fWGbvJ$El=wwY5_1gCNIdHTv4LNCp>w**hDAJAL( z-OpRZhu6Alff}kD2>p{eHQ#!S(I%%_W1q4rn63MyA>CUe%;ZgTn#vED1X1c8~|4+NMrEvIHk<98-hOx5(<5sN+N)runvVBjcq|Ftf>yBqhVmf-*z!k zl1Vb&{bDG=iwE@$*cTv)JFdDtTHPSFXr+l3?62yj*Bs_3r@R_Ci%;s14Z0s#2=+vK z4f?uW-1Fc)qHp*=S6yp)5Q(iK)W#+4?p%mlIKNfju*;pjQg8nNiH5-w-NuBx3+n-G z`*K&i|1x91qn8-vhSh zd{^XAY-B=?4JQzF2c{Kpgd4tgdG|3JDO9~GV=6wu*_=13epsr@xXTf2E~#5Pt-F== ziiE=8D{ik6YcJf?Q)EU+quHo1}{0sp5K7tQ-j% zjuINi%1a)(D~I%gl;Lc=h}3-~1%6zWHT67X@DC*ghcH8bC$|Pl0Lu~;1dsE>c?A3w zAx0lRM4%!CI);CaDE@&Godo3t{sG&jtbLqG4(Wa=XkU;C>UobfjpQqI-vB@LH%!x8 z!v41Dc$yVpC@>;9WV4tDzK|DTow8J5oAVM%Dc=j_@5^GQi!TES&@N(4(YiAK#_*v? zCd0u^&QeHn8WYRBYu(;Y+}`z|bLDJXk9(L)3@oLc?eh3h!5@`E=0d7nNY-86^)4mr zZezd$u5~+0a<{mR8`@op;i`HgUm84xc96*GKBYZ)FB3ECnmv*l9l%Cd_*>{=B~m0I z@6%u+BU;zJ8!b)ZHj>f$c6YAdZCr%b#rjvJO~s+X{yb@T85B|ZOIE|dzw17aV3gj6 zx*EaXl~9rLQy%&}qBo?D(jbUBOoQJ>>u%+-5s{MfWB&I+;mVDw_&^o;f0Ubk_3Mlg zV9w9M>B1&4{2{X<&u$QL5*QTx0WReXJEYso$0!D_TQ&O^!O`?Ja&(9e$(%YISTubi zLs+wh=d?n->}eZ5`y;7^>Z#_fmXu{c$}*Q%{vwE!wYX-It;s!`8E!YTqEa=(nJ8Pr z4*vGw%VybdjEF%lj3{P2j4eR~W5$CJL1Ps>R}POba7Y-VQtAb3t3KC-5K}9$H`0O3 z$ckHZ1A9seHdY|2bU)bw6JoTP22Y93`6l)fZmq6y)-N%A2wA|hxOc1F)3o+LlS6y3 zsdjzEitxLG@Ged>ULQ2kk@knC;C3?;Oa1WBd#mD}^D(;9)#zfzH?1Vz7G#CSW+^O; z4fY{oY+lPC!4jP%i8QuuGc|M-d@NFZ#N>lfykYTvPlSOpLXBRp!$x8YlGwvs3wu{U zhdZhd6-?dL-c;Ymp|>}}2r8bob(v#`WoIGGz@RdbQcqajb`QdS!uJovD7aYt3aFIV z=4tDrEnIm+D9;828Fs{b(J$@1NT*7!-2RiQ&tBS6D}Bh zWp7ZiaxY{URuYO2ShdEXTj|0D>#Dv$@;SneN6x|Wig7o1W>ZB0KBZ#u4EFgg4=zUw zv$FIE7ilQ63LNbK>RIqdBNmo62mcK1cYy6^e`pMTMe)i63qa_tF3tV-3zO`YB22Ov z{;#E;jpKi)XIQ((tvL=jAKUqj%SX~6!89RJmwU8hyS5KGpmJ^5v|YC( zdkuCTxU%=79e4H)$rxVk?y(iecw`{gbTH;^(Lu3odiG|dR8qKM61b)l7H-U>cA;@Q z!`Yp^TCdwzaiSaErFRQDlGZtit*!sCRKHm`7WvW@{e^(*0ImZAt(2Zp=M4Y{y@B zK}-2vI3`pe{!M@?&!QzYTYS=U-^N{>koY@S#U)Br0P6>rBsGq`*&1l61G2(r62TDCbYT* zyyxEunYws89YTLFPd_M&K^3XG{|hL2{~kJs{;%`(gR;?w_jf`;`dd}~;gR)|asNA2 z|ANT+2qyRuIbi!E?fPKUFLXxE@(>P6Wo!WBg71jAnoQ|1K$)c2CuD@i!}BWxSwJ{w zo}n7e@*be9X)nAF4nna3{~xx;>VOl!2@@7OHJGwz{@w!%}8?j1|XGsi{>e2B_C3D+fm^q z{BZe_TY z37b=u%5MN-)-L$RbisBNW69wgf=wAv-dlr6kN~a>!~-};5TG@6>W!EHfOmLyI;N9- zOTWlqI${?RooDo?f!R4QP%tAJJN-hVH*}1i9wcxds0B+5X$<@WPtCJ^V!sBf;&fG< ztcrOsL0uCZ%7Qc;`V`U-BPH z(Q|Q9#v>O0flq@YbYsy8>i40paA2S(J%_H*JagC$CqKr(Hzt!aDwn6ayp69!sOqNU3kJb8xZXaC*X_Z#$tYPD`}!;gnz}-&MXe)@CfFfcd~dn6;CO}A6p9H$ zN00!Zn(PB&<-je?TW)Ii3XWzB0Xp_8+YuwbVhEz-m)ORz!J>Y)j9;J>y){o82KFci zMze;|xfIJ9>6?Ea&HTKd1*4M+LJx-oa2iLgM*R;F5Jdo984`BU(;t*3`hb-=4Fo^q zefM!T2A~7$#S4YD7tjvK{DokktMOs>GzWTR#B-7L9Ow<*9_!CP1m7FngnV5JL=_slmfBns3PQeRa1?zCDR1dYahpKo(knV+S>^WTI z-CV-i<#tzgD>n3C=cIBlg4oU2c$v`$Q@$NAiG4KV26SFhuzK1q?#!9N0Ox{V@fKWw z+!m?gc?rMW#=u`72jDVa^71j<)ABIxxuA8tn}@6~I=IK%RHVJon2YFxWh{A72(n4Q zOSdn?YA(yd&tRWoV@jSIDJ%IG)|cnQi0^QF&ARo|&M5MJSoCj3yh^kecDwvvomS%A zJ?8eWdKTw?={6>|yFA}#O<5l3jsBI+1!X6@yeop~MfJnGxr{N;8={I^v#NgK^1kEF z-Og7u&t__2-%vNc3WTrQRu0a07qm`U6Yx{_8pY1-!p@^IOJJeAS7cpgxYM>{My)Lv zhzeLHsJn+18MCjOj4KPBCo@DervBy>Ywwc_YOuZ0)xOH@-B{w?iUwv~ZlSxxy8%cq zdJ`|hbNtMe{as1Hj_KKm3N@FHnp)6B&{i#Ika-Ezs89p<gGB$}Bp{ z_~wn6Bp*7%WOtdKX>~5TSjBVW!BMCP+y=%6*9cQ=RarGi%LsyP!F_>0 z3;S}Jcx90ad#)_XLWk(FFr&UGC%z+dWt~V>qZEiTcVFC11Ou1XUBnb8PGX->QG!QR z-9@UnW3G}%`_1IL@^ ztKd=kGP$lJ`W^)9kJ)PZhahLwkdVu{e%g)AoTe6LlHJf?mLg~tOsV=BEmW(-5I}!^ zAkRNFm%D-68|#yM2Dh>n-m)VNF)x{C)(U=qu8LEn097VD5<>H~F*bo562HMyJ^b|f z(9@kNTHqc8BFs~^f(~>H{tqw>!n1oK_2+o%&+$YpxVg7vP0Zk9-?dPt5Yy}B$IH%Y z8TSRu+Nv8N_pZh;w`z5#;fL06eFo;#MHxl;*wdGcJIwduGI@y)r>?i57Vzfs&A=;o zzaM_!#HrE@BzV>JAZ4N5qLmu&l;M2<(t8;`4w@89X9$<^d>!$8BnYjah7Y1F4+r?f z$nQ|W{NV`Z@6vOTvW8&(%0N3!fKeI{4S$_;2Ewh~$J8eeks0pBDuih&^Kc+cGW?zP zOwF^3)qOLeHjZ-}uyZ^xCIgfBBM1dNFV^Hr=!+|}g2}pfCQRXIhC^m$V}~SI>1^GY zfi2LRG|x;_Ma(A;hf(B}e}pQSZmb-g#X%8O^`j}I_u-dlgYn>>iObzIO}(t_OR5*N zXyxSL>_DiMS@^CIHgawWZ9By*^<&OE_}B~0W2HfH|1A<5@ycGlaz0l!HtbRc4Lfn+ zKb|j-z3?}^TuP&dK=W=cIjGDe24<~!gDtq)fu)Z{&T7ER?|Zc)c?x-tVXKJ4Wl!P>PO|cVMmn5 zhllwDJcFB#Ghv}hvRAmhH$xqPwR2!@lgv7F1>SPz)muqL&=86bO1w8^x*gjiTbAHN zu$#-fjmtO2fVZ*qq1+UA_Hq}jaEb5K65nl^u7dA1&rXubn3*@ae)wQKgSuPk@}e-3 zs}TdhydUpieb(*WhUw#GcfrR~pHYyP!|Y+!B&(_dxE(0q3o=Q=>ljsz*@7+-0}q-8 zTu?r?4hZ}l#wzrqf8>v}$RF+2v||SKELw+JD9mE1HMlbB^#tN#?w=)^bGItqnJvFQ zR=+l>Vy!AxsbVM=f&*X0COkkHg8LCvGw{D6oS%3Cw_&xrNt?5h(BMH9Sr;lEE^x39 zf``Su+l$&;F03!^*{(Yf6*$D{`8qgO$wOTZ#IPEt_SbzU$o_BNC7C6N_LUSgO=%9y zXM2u=OgV70=mjgM{h9|f@z9b&^aCI~IEIlO=5W(?LG$#_Ma{rns=&FPqaoVIL7_~8 z5_JsE!{H?>M_UL}`i1R4t61$sw;KJ+e6dP!_ID{H*b;9qgqu9OF`<|Q*B$nvl%P#U zun0ktwoGloG7iT``F4?Iu)yJ|xCNgAa}M)T9Db+90zm}^nd~8ABGX1lh~)Q=m(*~{ zs-K9N66&!FvKp^u@G8$d0TRQXy7C3kRDLKa0@@2ix}`5Suxv^qxVKm;Tx;udzIaqq0#SqXqD5f%KRgOVkhKtary<@0<9>}ZflygHj zHsVG}T|le52Kx!%H97RI7h)GT_74EW>b9G-+Ljb**MS2UV<#Unu7~0$5mbuj40+EC zGoj^$7;ieq<6->nzH5<5rnW^acD4`$b=!)x#f`;a{Cl+d6JhVF+a_qWWpZ(mHgC9G zjM3`);KFTO;y?sN(-v?+7uml&e(FJtiTGDYqo{!vY*|Sga>=b98SEsJ@M7a^B{YZe zvH(eSwTJ3zk2wVUI|VvmyR_czEHnRvq<Bf2!QBvpedUC|IDR0XJnE^JugB_VHeZ6Re z$np49T))UE@i%B1dFlmaa4oHqGAbeK;;*@Z6AKum8r7K1c42=uEVaUJ^d;`WBm!I) z_zrGCb=yT1$AgP1Qq&5LcS~RkZo5#flgGc)YFEg`Efrs)UT`DwKY5}S$CY7^AJ>`I zHN5RCUh2RJpX=T<%T)u|;2|+fSYt8o{DRB^6Utq5kVrZKF#9=Nfq~_#1ks>!TG$j& zv=(JOC?`LyogC0L%kaCf{$*z)?*odQ2#E3`uJa?V3+-#*ll6)7NUCL7ZB52Axkf!T zk{B9rhzdTML;P6EHyOz=_wH3YYq4`ptL51#HerD8>Eo;0##D?ViDs~SOqFpw5ppRl zjSxX1=0PB%&oWVXp&m^Iis8Xw5&M184lC=b83aUe)q)0tuT;1Fu6zj;0XNNAoeaXH zf}Pc^pZ!O?`#^QuE#)hM?{-e|S&J=Gvfw)4unYX4ttF^4ae-M`jL{`CDnZ1PQtRD( z^KZNY(LrE0r4k>b?z}!&Y$+*Bq^P2$(d(!W7F+s2oJLDA9#t=#`eVSr_9E#Td=1N? zz@U$XA4}x{xWVFc#IuM5sHAeZRc_3%qqR|fX9w@@fy9l?fhQPT^|TgNoEhOq^q#Nw zN&wOK5$i_!&PTCJWhrKu=HI5$?}WLk_FDGQNJ%-zj&l4=g+gjif`fAks@smKRo<-o z(oRR#0?Zwn=CnclotNMmz~51ug`ZOgM!?@Oc^e{F4H)=OhY=&Y#v8GvBPsdZqONM| zUYecx&MXEzAU>()O`BMw)|tmUT##Jk%;BY4^273jWwE^o^Z)ff1Q4nK{m1u}Q)u;t z)-u=x!oZ9DFc`D7`7{Gs!y;!U?pGgzwXDL8>O-)Wj6p_r0v{Z?jf5=qzX~#G%L1d; z(Q*IJ+GB-jAcVwFBTC85z;%m#jqxwxbJSbQlB{L@mTk89&Hb!8hRkP4919`hk5uai zybcTugM*OHclO6!T!*c-^zRK>YY%pTDr*gSq*N0R5au#-Cx;Iy9ZxBpNGY96C7CbX z%y$+_xyY%rgxM6z*Q_8zEGHi8cG5+X4N7PTU|OiR&?Q5l4Kv@^7DlFZa4F1<2X9v& zno!=W`p_*}-9xIa;J-o`LB5#`Jfb=CuE>^d<||RW1)C%=%LD>i-};de;xQ^Vb2o2W z@6`(b5@Yc^_2CE`aoEyAnsi80xK% zgIBI8L*Ajm!(j;EytsDk+^s}ha;qG(ip>z(0w%<}vDn4kBV08hE7ePLRKMYQGE|B^ zCx*vHvVOD=Z;X2L#BO3qjVw^ELQWM$PZN6OA( zHCHd#IvX1SUl!<_lY5`{{6tInbCA z4QOifb8LyE1PalfPW6cxB*5 z{Kj0C@DS)Jnr_^K<)_2iqUC`z`D~j6fb2mRy^)7O1yb-taQ3$Rl%qsrVTYlL5Q42* z?MGs`G3iADP&*cN0&C?)G`Q3lBxBT8i0CTjZMR4m`M0Wgw-@C3+=TL6>}*xS{5)H% z*{w9)bIxjvfx$_Zw9C(;tVJ@%uUQTBei*;O)QDs4TwS5N9rI;VF+I~t_IrC%|^Ii z&B=K(5pH1($>}|!8L!YU^Bi$#3zveA)d2xLo0BuJp#f>FhY-`BeZ3;yC$mgWwGiZ? zuVAFFuA;IBD~SY&auO*;noX8D@ZE@jITV#Bd885B0E)kXXklsa4x=|$kvLNl~aLJc?UaO32-@15Jx15Jj=6<~ubjNa5v39NSdMA%{Y) zc8H7$Cd)iyP5h8Oei&9cP(?u#oCjEL){Ljwt^ruE-Ojt#6|u!*o$H|KcC0S(wz&Ll zNbNe*)t$QyckK6R*oy$`%_#~?nK^u z-!JZoA~-`)VID7##%Vd=LPzsB+YrJt;C5l)_fSc1af3wQN-8I~no_|yXRfqAEMA7l zP+MB!8LHh+so>jzbx=+ct`%xw=F1WXK+H=O_AkdaUBlfE2vb9HwYRtqZgyd(u*O`cQQDNg!G3gm*h1gh2%YcP+8=R0*gQn&C zfhK0vfmjpCeKVjh9=SWAzF@F5%lv9(XslEf5o%&0>4$F62#ux;{X!ZFY+%E|F(}J1 ze=*X}k8Zv^L@N563&PEZNkvT@9?AH?e-5#=eSzDhRfT2DtH1~8AJ0e#JNwQuha_tJ zE(hZUIGW0$*7a!oH8E=!u^S`BCrxs8@UlX<;@>cf5$=u6A+*H8Er?hx34s>HtgdWI z1YX2LGx2Pok_i!6;vPq~cY1*-p+dSt#j(c3Ir=4>btkewdwB(JYQmQjd z+}K6$`5uyj1?b`VZsS6HifZkw$7#&4KcEuo0rY^GOW8Ti)-Mc);wHobadxU7MIS62mCvk3kes=2W`Z+2`*5@Jc^wOusFloBc(m(jxjz;ucu!n z(9q}#G?+sQG>Q?Q#bQDXG=f8_avPe!OPu(5n}c;Y7p%LqM)f1D3Gc}o0>?HkL2F14 zw`Gv&5#(L*Ciqzju5^;h#4<_J$g<#wHt)}T0L1Cod5aB4l@M1X7tK@8aWPAtTc>nE zH!k6eID#PTTL9_iVI&XJe}^iNfQ3~LzSMoFAB4{W7GnDPUP85&Z4~UOx*A)k!Dbt0 zZ6{@QT59+SDZMJ9h#DR^<@rV|!E}H|>AVa+i?=1<7FEu5eIw%L%MBzV6UP};5C-Uz)8{~qw!JdAxv;;%~zWeKuUpB!Woz;Cc?t3ML1hp12^HJ zS#h1{g^yLSsVmgO4yeDle7jR^G1p$fY)c>Q<5a$^v7= z%6%LtlG05^JLf8Cm=YU~tVqMxfgPT0OwcfJ1`N&!tWkW`M;ahsQN1af6U|gNNh?u0 zO+xgfZ{Qq}dW*n-5;S1rr{cExCkMEP>zRy!hT|U+|NNZjN|5jFX}wwVye_z8`X-L6 zuectIFg>x3z)cM6wrdTmbR+F@eC!mCJ2GY;WZe-|I@&zhLCfQ64ksA62t5Xm1^7foGG0 z&zg^1E28uVWZwji03UWFSd}sONMg$g@B!;MexQP&!B=fI=2{Cp@K@b`i94%4BpUmHv392UI15^R7XT^m znfHxxOu@yek=v+{(ESa#i`%ebj6j7~d@`}MnJYe8!(!)lRADm8NKs;zHNrtMoQKx6 zLzONoLXBYediU_(U;>5t_s!azI<^bzg$<)%=wNV&p?7;jCJ0CBLPmtPVP4K2J?yC#$`v~ z{iLNL{$8Zb`90K3U>CI?f%rl~2X+UNPt2X*#t0o9U@ljDuGPUmr6srX2BZ+C@`ENl zwK>PrTGSj-UCm{ahJFNj>F44xU@FI*QT1a}j}S*6Qxc3KF1_MW4jwfZr(J(011O&o zjR=Ft0UmrjuM69Po@^9ct>!m_JpLkT^HPK+-{!U{Y+GlSC~L>Gs8SdScG39 znwvLXA(RLcERn{pqkociqV9!rWfUjhU};#o9@V)dty;mL{F{6M>adhQ_E31A@k9#y2zN0J+ut%g{o0OXN7ECs-2mrTxl?WKmdi zH~Pk_Zzf{Gt zE9BRUs`$GqJnGqE_3J@ZEKtQfRaC3uZdFW?0(SGYi53qUDVO%K(-_A7R{HpN8&vf& z%v^1&7Gux06CDY@pK7EPBE4Ps%^w)a)2G&9|1UMRk?y_Ka*}LoWA18*;Jr)+P;x{b z!@>ZmE2GTdA(zl`mBl<6rrRRYUhKRT7udE^?7R&ZXP8$LEY!>+Gec~c5@Xwc)u`?I zn{Vui=o{TiDlDBY7!(}_rF6NutQAOriyUXKaDp4vtYXSPqRnt`HDDynH^9nH7}71SXHjJfEL5bRt#1ld6ie)?Lg`$`0@Forl|RK2?k_UK>Y&>AxERdk3; zKfR!B_9;d6eS}9aDO;?95r}lpT>(uKFa#Hioz-Zgp0Pe791#SDr#xg zJ74)8>HXr83$s+xC07$EQpJiFs`dbH%l6cyU^QYxY`AHHB{pEO8RYF$G8?#5SWCK~ zbADW+E^y|YMR-Pw5R$aKRpXrBp^HEls&XS`yxl|eG+l)tUczC+WNdJ^`0O?xDb5J7 zjKx7M6?dxQmT#a?{*`FHeHA1T`UL*LBxfP@ zNg>r(nPN&N`cjjKNy8{g8D*YCHG(=5Mw=SeW_`0KLtDV=Z*mTFQaBsCx06QuaU+TEx=w0Xz}!m z@q`sx0C|Cr!13mOe1AKz09UppOE^DU+)MC}flk7Zf&a-+ZN)$mbV03?r|IDP_SS?Q zamd{)W~f&vq;YPr**bzO~y@ zldvr@8PobBvtHmR#?ywBG829@l-}((l93p+5&0GWRFo-0bZ@;7O=i*8IN1tp1to%} zI74xcF19Fy?)suTE23gAbXc2FU_(WTKzU%E&9m!`l&{BIo!e+sye1l5+;Ily3j_#R zMuSgojWa|VA}mk^KC5ZN{>Y@N?r`XEzNuJ6MZ3}jwBxsZqiFXw_=oyVh+xyuvBx6a zIsQ1(Z5RO34InWfQXrWf|4>Z?j|1t>Q>4QQQ2!gRqg9HK_Z3ml>^WgmyVJ4GC#TQ<`nO72F7NGMN-s2X5%8H44h`eOP- zqaB`4;Sj-dDrlX3d{KQ`CTAhuHn@j@6KFQUIUFr)H)JaP#Oq0$G-sR-#CZR0&&B&d z?Tz$HMpM18nc!oVaK8T=TRxPVp@u397vuKyNzf`(zKCat2KLy``TZtPTPCnZ`fbw3 zF^KyL&R{tPaZ93zi)C&=C~~0?yKee*99}hsCr2aSl}f@cvINe0;Mi;l+}eM~3EWNn zDb!X)r6yHcUEqFLc6bnvUq@uoYFU+(MvHbLcKn1Gu`<3#EwS54-0_?13NQ932iW5B>oLS2(T{Qa zS;{_e_#1W~k`~y0OU?_{G4WUp1ooUxqeMnPl_gXp@Y9}^(*EvM*k2oXL1#erJ{>~3 z%syn@O-=GC=fQgkb1hVl4RanHd1iJ;!hb&C2lxaJ-lg;Jv*5>8PoZ9y2almMdM?ZaP$iJaC&xlQ&=i$Hs(sVrB z?4NE2T(S&vC6bbf>uN%Rxx*5c=olWGwW5iK%CofB?L$aK1DI~6e0CL?0d9Dx83~_6 zd&0kbikJ<%SbP-&R@##e*61h;Rtln99xVp6P?qs553V`6+jWTlVx4#M?9=Ph`f;EF zwGA-1VX2HF45;lrq~{B)K!ftu!@+a9H@+uBFbehQdbZnBI5MH|z*d;-2ZM>bWz3as<>Gdzfr~2s<=!Qx+;oPah@v9R>k1YFpa$k zJ0Y!UY*ajU8g|$3hAYYg*f4j^APayn*`ipfRi{K;vXOd6rj|}DicKxS3oClhl}yV9Pu^a7o_0HN#?)5vQ-Kw2zqnF zFDgOM-9$8woM9YW9kXrj`4nKx1ZRfH8NFWrBj6!^0MD8K3q0eG1&=oO6UARS#1SG> z`~y5F?BjEMoEvW80@8vd!XbQwkt?33J~S)wl_|Ud&XeFHbw59ZQqAhvv%t?N;Ly=S zSQf)h1Z*hP9s3ZjcFgKGqWwrxQpIB!Rv~mJJLcl@2!^G~e}Q;MRf?yzM@27B>-h2> zp4Qn~9oJD~YA5&!O<}iXjxP}XaP4-GCD|ei7$Q~o4u(n}?9^VB$TW2>2%8CDar_eo zy-}@5Rh`E*;@o{aY?UMMe>swAx9bkMd4@~D=BYUsYOkghO(^2mnsj6AP)87p2iX0* zFZc#kC9sHoJUFh!oRCjQ$QF_P18-od4!Z}IkJ|muFZ89=M0Ea+)%m|;I%m3l=+OTd z{nCqGPVD|UOV^G7DUxPiYv|iOZP!m5Zq(lZ9O82NfDzB*2~MJ}w`0wdAO|%os&RL@ zb#j%^H1?(tCvOt2Gb5iGzn%PAJ$jWhuo4+JGuWQ_B79((m$rB?Mb=Ls1H%z}IHJMj7&Nkp2L=I26f|hi9-XXly&|H<6%`cS2nnEqB+LXD zhX&lm^;SGq(RDp`S;RX5o+q>Rt8f zRn;qCXh99+yj9v{T$>_elfo2~vc?o30;Vh+PHbwz$Rp^+n`|4)r*X6u9T;unaJ~Zy zxjD+#Ck9fBai0Cb0MQKZsAPpo>Q!>=$50pVqjAyVDe@v`D3fde^r`?3bx6u}AW!CL zBtzD|AxwIF%S6@+9H+hF%L#N~D2~WnEm^bPVuGs$dX760yfu`}bS?H}&E*a{5Yw?2 zuvPb)nAX!KL^}od*iC@DM60>j2$TZk+RvLz(}= z3lv={E>&F=s{m?6e=f$U7grG!v8Kk_v z($kO3WyYCH0q-me*!@1+gFr3NqtT6EyZ6k{;G`J<$ZfB|$~`@qs8iS!;6>-)KA)K_ zWqzc2X4!*jFWLxpp=73wFY!a3h@6aGJ*;@}@2^Ra&nc9tUy7k`i-3`KES zwqHXas%Y3j9@6Cg-GKH}WC8pS_UF6>u_g;YtSZK(2jF;IvmGu&$_T5gTVic$3x~A{ zIqrwm2=PYW1%JO|_X8}ENseH)i0_M%@zJl2TCX6AyTia2geu>(x=&RqpVsl~@3Y@x z;V}c2!UMZIOhPnFzf$U&gv*Tpx4x>? zZC_##$cC|n|I?kT1EhR1{tgOWENtlIY`dq>DH+})n#0@n!0;Y1IUAu~GS=e1j_a;f z0DrL`fRo|9v}OF_v&1Uyg?7Y0v@Z_Q1a=RZJlf=LE5&l%WflXSId}~=(^NsPj#vY7Ouw;WG>zf_d0AROa?;h|{Inl_7aWQBWC;_> z{~ce$#rR0Z*CoyIbu`)rzFOkPOC}Eno8#uM0ULn`-0Ol(;<%cja9>r=bHbH%?sLME zApH1=CA7-c9^81>!BbSQxw5_m9{At;a|c%9qa+NlKdz))tqF=LlZlD0V zk&4mk(dYEGuqHn=YJCQOxBkdRNn}J zVMmEq4&nCvuB-v3jugW~sVc9tG()g#^k^Z!cb3yZScqW9;dV37 zejjSGe=N=_L zmvUXKX1gu)d?sfLQ^=1>T`&KeSOu9oy`<0x9^yn7j&j*G9dd^=pSV#jY<9zwRU75f z6h5l(c(kikWEzMXXkL!Wg;_?)gLS?;h`EPEJf{fatO3+_?OfK;JU6;za)c_Ut7{bY zU_W#!*<`O#J3<;oxNW_c9kQ^N4WVs0vH}^|$lq4hKbEmOUA47hJ)rWzbn)1ALz?l4 zQM;bX1=a3gaiZa6SbK!6LOOtliSpoNX~ylhvw{}#%N|{BOtX4y;6>5ocG;~O?u4kz zZs81c7&<53r#b=wwW9i@4+&TUH@xXEzNi&_h7ns_Jofg%&HEIT@ckfSk#vYL!8l@a zxvS8GeN;*UgKkcSGC^(v3eN6AFf@nMEG6SWzr?|OUchvA*Xxr3aRkN0qnE%<@o-ca z#dT$o2054(&h+2F>%tlEiY8si9l4C!2XxTj0Z@D58!UkD5=%G{ka+?~oCic$A!b6% z@NfV^lhx|+x1~fNtTfA6wy6Xl&pR`Q1g%^S(gXa8(?Yy(u&P7t!cokW z8hMpe=32l)5x{kHM({BCp3L0{{4!7Mx|==ZnR2>HN9hyy&?UgTQg;MB@~S3sBppTU zQ&vLz);dQJ;`&$47Y0e?B!3Y*m@n*+wc~aU^s6c_V1HEyfs6t^dF;n9m5}Ksr1t29 zLa(SoRjXkP76IvwTZcarocAeT?YS!e<&}^vJuh>TBzVW4)dH+Atq5M&HIyw2p`h(N z=vbP)5A!nt5_5VeG6xpB4_b>p&NhhByh_g4lKD(7%s%?hBel^z)Q?Evceoks0dEFA7azENYSj_4a3Hg!ZhtH+OT zXw3xHg)Y!>f$_s*cN(Pl41pcRLqwyo_7SbC)d&G`=s?kHVffM7x!G`4!U|f*pD9dRd&f_Oo(7>i?0RF-BWDoQcVTF(n0Gqs9RaU{r{3Xu3H zIOjFZYZwKk43wP5etJN2lGM_ACLT_v!aPF|5pQo!O2?_`q3CaZiq(T9S3Ij~bQADV zw9ypR+~KUtujU9?=EhOA+O<;6TnQbGi-R~4_T8zgs78pU`Z&`5y_K?j+)+W^Qi-xDpXYm|)gZICy#eZRlXRSTcuJukLvDb6=)xEnAn-qebc8Z~jTk1=@O+lxA}P2wUSf9K zmW%b^nUC=qww{*=%Eb@%IUk>uZJmqheXkQJiL|Xbr~ut=`&GD**hEWWXwsHoe!I`h zdz!+oiYuUL>Z*Dvkd_x^vk~X!9nwJUd*NrV8G=HI@xiozsaDMB+IT+jJNK*ED_;j< za6(HE6UT>DoHJk9LncMGX8T6A275^KEbJkrZyieny|jQCa(VH9(ptyYH7 za>_vS+~9ra5*+%1qvosQXa{|dc|P-!Q-%GBM6?&2Aa4<)+O=CTIXJ zI2c{=JO-E3MesCzYnGDiuv0`o9bIPD4X$1KV7I#&knW)u9L-+RB*P16*8;+e8B^ z(i;}T-cPH{7#gT^Bl>B3_8WzJ>h4a(|9T6O<5j*3N!LQM~sxFIu zK&Bl=eS+d&gyFL(8np-Dw5u5=^U+*D43{BAXBcV5!*$V+oh{!63u9&r5D{Ei(*)#1 zu(7a-CwDuOU%kcnuPa%>&T6HAr%y^|w_YiSrH&kU$C#f$^H^@z$V}8hOQAFTtcUTMJX01?#HeSEw10)8vgY+0t72d4{l>JKoRkH4R&{y^Umb!Vd59V-rTrYgI)>ZcxoL$9}K-kJ2qo9}=G=@nFp0hsI=KcRav<-Szu>Ygje^K?-goNYA zYJLW+6G5vw11+w&-x=SzUV;G> z1HuTp`zGah?K>eOtP?Eb=g6v$XqmhKG@R8RaMZ5HJw>52Q3yL>5z}O2q*xji7q<8! z#7~JaRHU;MZL`8sR#-$KH=|2A{S>Tm9b@x_>|CiEL(<{=z`24MGToT_g;qtTar~o_ zjrSToYMk%bVjsqlZWsRtZ1HVuSd0xqDe_*f_@gM*J|z}k&@(Gx2Ot3{bt|vU1*Tw@ z0yqpxJ@N$T3ODbJ-ARC#7pd7o`Hy4@2mm;uaxgpX><{@i1F8J6q=~~9R3se)35Vj_N2L2gs;ieF;5_HJ4K>T`o`VQXkL&pq{<}-@Um5wYl>CRW$F*WKk(;@a3DA^_iTgDmuTLTh z+{T?fhBZLw4gV{*q5>-g3>;SfC6q%Y&DxHGhH^bUV-VRG@v;ZGi^EyoKXgeOM$hSM z!fVBYL?0q-&7f?=2_NL~TO$T}N-(yK!2EoW_BIp`^0JQNaOTz$7GGI)7{AIyJ2D!m z^m7c4Dc6pV>d}ta1A#UbiBl79phRo5I}{niXdY;xPzIYVShA*ydLH63o3 zMsYtzJ->rtrWc(G7&#zs_9F$qZ!fOhE%;N4R+t1~0CV zIFq<~K0I*PD3W5x$xN^?6WGiWqJP1Y)RG((25cw}yO#Kgow}-1fb|WmxZkeGAIQu} z==txwmO+&b$;rdi;{9ZeJ^}ft?WGJO`+>Vvh1iJentL5LnzBo-JN08Y^Eki-qIH5m zRNy70xD--chHxO6SMo*3Vf^#aVDwYme<}R?7$Q+hh@xZ#n#8~3VNGv`WRBs|llFH^%5XK z{W){9PYKtyA!y`{%6~?e+D#Z+BiG|+9L6O27}MsE9g@aaoHwY${tV~5focZl4L%dH zFLOPLkLmUgkHP(Axi-(%Y&P&N&1T`uk9@*VM}eXKT;3_o{u;{7X3(u=u4_?NP6{}{ zXOW4yeh4lUQZQ@R9Gb4Qdhrr@Xd^+6NAYt7WqTrJL|eUjKxTgE zXc<(+_5pj^TOU=Uu&FlnJFRoxfEw8LUD#wvOnpYQvAm&S^NoI+^dRz zic`^0^UB+@AEhfUl?F^@OC?z41DN==D?-nMq&T@(WIV z@XOIjU;cY9zR0E=#O1s^vF&&HrH_=!d`G@GBxlfF0&Nn3+naynv`7t2u)%=rfbW*81&MUI~*XavwOs ze(p!?r0HO1KMvv^jTg=J-zr64pq88VLEn5zMJaFsD+oH95AbW2Q*P41{X%xjb=pn} zFT}?l6D2GhSLkmmVRe?Ptp4QH?6i-ZNhgMe`UPIWO;qn`NX&h*LRVbnFiyZ42mkie^dx?vI^Bac7-mElC%`S z)xe{8e`3fxrU@JpeVyWsZ!|Yzh_$bJ1f3ZSUROP7u|E&9v1EG(@RAuPmoxZ3`emy) zBIpyrfSsR_gF;}_tiK_q7h6_`@W6ifCBr6|%Ki*%ZtS}NpRbuf1E`G~R(?E7Ase_# ztRvx-q-^%R^Ux1EPT7MLdTeL$!1glApPs)0hxvFbWGHYRikt^i9?(|#qF#86LK)qh zj}@Noklr()c-Fz^)qZRq_s_&`596M?hOIdN-x@0IFO1=y_Z`-fyAO*qjfw=IH_ELEXduje;Qks9rzPbQ$Sen{g!L3w0f%GB>(PJ$Q%-e= z4mls~vvvuMpL-Bs4o{NUBzPr$2nM<_KnZADM0R^X1~Ug#LJ46IP)T<@W#iQ-q+a`Z zTEF;JKt#t$Q9+bXjL{iT6@jqk65C5~IB05KYbJl=Z%^U11b74rNVSFns3Q#t51-H` zAmS4mhLW(Caw37B01G2MQ4FeU&P!NKnnUcyh-=^e03f6jCr2dTmQ%ijbQF0E%0QMkmFh&+{BH@J`5_nkl zhs1dCSTr7;;UM%^X@7%mUx*7JWXenTJ!C;RVPYHu_R}!E_S3#G?M~{q)OaOa?-Irk zOz2Ziz^mIX?NTISFVg?04gp|G=z00L{{Vl?U{$GhK@jjyC(yC z4(B$XOpkio35lG0X3=s&JSrk*=&%w&kod<#e2XM)0W7=W9`NfQWl&1u7h~G|L!%dO z^CR8>GX)9oD0&qn)5|%y$XmfX@e@Lj%oFG|Av?%RJyMYq5(vqgC8&iUeJzphGHrDI z4Cy{^5Ym0Y1f)~AaV}7qtM^j3KstY)W~3{;@<61!Of@tDNdoCEQg1It(jw`sftQ`! zB~9(L1{nz+|47C`%WC;N18& z48_jLjF^pu*BJ6$hhbu2hLqqJN#pk35vkl$5M2-x{2r?Qo=Bn(#RUHd^){PtXYhpX zx@e7k(p^BrPjSmqF+mDGL_;>SFGrEAv*gqsw7oD&l|%JgrBWD1rytlB;aS0diycoCgUg4&%w`Ef7u^?*09^n^aoU~$dlF| zj%0Z_vML2~kxS)hQGt{RNST*10WQkPZDL&)i5<&#R3PiTaRg`u^7^IwQ6OJ@$G&HN zi6lXRe5&4V;oF!3X}lAiMf6&wKvLwT4+o;acGwwX02gfbavBoV>@P(|u2F)>U?P)| z!^JbQ1e8FM$i&T?mW_?4^tP;o5$j%7g>EZj<4;xj=*vk0d{%!Z7_sh=EHiWFNvdP^ zL+O?SXQP~JCtMHW!U#vnO!_%^1GADs<+{G2}S)||hPf9{^vEPtcz- zJ~=ZgnTEyfBVffbp~Yk4um?tL`<%pCqq1dNVy}0??5}Nn}+LOQp!CK7Wx<`OKw!;!KaL_i^#{ zE48|d^{X=@oT4vtwZ_MEJL@xWZ0YoUO?EUwZ>Ba`VP|q{N#?VhNrqg{Aql(kPT=}Y z6^M~Fi|;MhleKN|8N)dA8+lhOC6Duvi^MP@@qB9PnpjE~mAZVY3- zdJm6rnbAIC|}pRyxgIsEOF zcYyyc1VxFYBzVV{9XfvYhEnkp*xh#0npEsuh(@D-NomiRCJvwj;0Ja63fOrPOX&`F z9{U;W{38VHT&%H^950q!3aVgc9CPJjv(R2Fd~*o~9_azb?1eOx0(Im%eW+cBij%vbq?m1H=T5CSkvEAtK1a!P*wDG0UNpek^y3eHm%xCp`V zQn-#~2*HbZh(o}LQLQpmp{?XyYj_(L%9BDtr_gN)g-)sJ7zev@JW3!G72re|PwX-U zoM$_wPQ!!o;(%7@;0gIgEe_y-DwVBTp}9dut=xPIIfQ6lp+EV4ieNDmGqTzNs!A8M+evCz}~+45HvUA7p|Us z9&SgIu>F;-(uIVzPY|lmr(7#s!W_7jX9jX`VY>Cuf*qAMD0Tbq$p?YavG;+xwOF)n zH^GSWQ^dd`JE|SV~VyuH}G?J?VJ_F;u``q3z!Km_g~_UF~dDd+3G!k=Ep z94VB0-HZC7&$4nOSPHp|&Jg*jy_2w8!*P$+hm(5paxH|@Gy*p#bgmx931JB z3$|wa`(67*53p@AE-BXV45GA$$R>6zD>bkS526N6%FjO;hXImXV3e(cZy~v?I0z4} zTYggPWv0(2VwI(~%sMcCLsB45r zMXR-Qt}<%B0N*-l?Ixr417YK_Q2yUd8o)iI)0fZ#174o~G9JQ%Th%n3bJa~%RYw>v zPNMQ}x@v4y2V>zRD*vWiD$C8#nid(jwyClw#+~fIl83AJcAJ2MF5e{x>=oRxpNx%G z>;?>oRF+Q8B_0&4uO{f+HD>w_)|Dc;04#b3a8-gnQ|cTHUBq^Xp?B#@A+sZ@or9s0 zKO42jBLh1K#oq)B@iZY07Ga#(GpV0h*l0}us}y|4n0^Nyim}~cXwB}DKi@R6s&ldN zVlj|}-&ft@91VL1=<(sWrL*bbLu`L`m%x}Dg&V}&f%=E5_jH>u0)tM;1y${_^xvvg z^_~kWfv-IY`0C5!D#@70BIWWvWxj?_&H5(9(BB&$eZ=@{dGsNRaAR|UoXLnwUUKy= zb~_LE48{kycg*zNEh74z$Pj2o+&maLOVXqv!#G4PA8yRvpm@8qYOJGSVUTMLyB6*Y zM_ZLtChFGq+zmr|K0%L1a&Nk@#)Fme;YKY20FYx6Y$ApkliGQ&jHsgF2eOGa3D;b2TU>*hD2xq2h!>$u`j~ zS~MnMf&v)D6+#$0poCT&!}BTg+7?Pe`dvJ7l8kFkP!AH<$pyRp(t?No(t<}Ge8Cu@ zBG=M#Oosf3gRdvB_e!JoYv$Jjah$a|!cy^IAZ|J-3Ckz)_9p9AFvFfnC-Z>C^bNvN z&_QeP;KMU+TsEsIgDKwU?|}(NoNr9(^QqsX&*a0EL{>7;T@PNIRYA^6V_pfz`@lCvs2s+X z)|9sYec5U8{(F+FQOR?Ig zNp7!Hy?jX}|5C}RDjA@X2UXHXC9_pBLnSpTxm6O!;SirsV{Lf1il?!W$gJ5uL(u$8 zPBl|Yr#Ou@pTDurVBOAqIKeBfVcPW0vMNGh%obZldkL3icuwGO2lS3aVR2uLavm!9 z@G^HKN4xkD8)D>{GyI)!N~eySt3r+N3AZ0R0KDGh!>iaHD<3}UJyzID<+r;2#kX#o zAG-+yOiX2AJP=-GZ9LvTp*u~g@#JqrlcbP+g&WXydD~^q!Rnhj#GP3i{rg}dQ zVX3RkdC%wb0L@=mKY6qtcc1$Tzq@@St&%c$(a!tYg?hCYjb^KdyJfREmU`_+3z9Z; zz*|<}w|qd7Z0eB7puR30eiPGaC?bCD(1)C^1eV}vEA~P1LK){)oDGOGGT|Bq8<{S_ zdC*=dWnrS3j@b)9vHXKa5d-BE2v9tz*Pk_wYnGDq zaL-M`M=NV|guSGnlFngNt$In&y!NYuV!cEMd00=l0dA=>`h!Y&5UMERrxjqidPz-i zFCyCxk7_mjZ8^^EAUna0?+Ekq!#=g1%l#3&~{Tv zXO-MG5&n`k_^c!#&i@j>a5DKO`FuN=_7cDmF^z*&5 zd;`F%QI$gH0<|tmSzX7Mpw`4?8Ae|$f44KHUn%uJ8sSoHzp z6=7o9OYy%fK#|`*=0P0L92wN67ydB$gJQ%VMf|ZyevHAgTYyLUV-clYKYmGOqX&8t zS;G-2g5kB#8%SmoKBM>4K^7zmdl%7nvO_g$j&NQMetXWT41P)oKzx;qo@-&>pAb}p zJx68SZ6I~?CiGa<4#rS>WHZNk_X-<`12N( zj8(~|D)8sEE%2umiw{1VCS1*SB|$oV z^sIu+JxWxb<+^{E-Z)PPJp$owY%nIGz`VFOa_0S%2`ySLV=e&m1>K%;X=^&?E6j!^ zg16dJkgeaQWN~3F(xhfbxrQ}?1Q%-EhX@3-7og^48ScJjh|&?engY3jDJ}<)kW@)_ zF6V|RwP2MGpM-D_E79TD_hpydppfk)&2v>f6t(!43}JUFepF~OgU2qw4NwX7JF@L; z`3h@RbON=bzH$V~I_fhr!GNS;1Ry9mtm>CkB}k=}KFUfok`%n5|Ek06ls$-+q;voU zA;p;bzd}qzu$~8j%Y1Sho5tV>X0671r3xH+#<54@*U`xm!5YsR+5TLT<@`yFkl0unb#FG%i>fv|FHeoH+|H z#DJH4fL=OVyeRabZ-Fg(0-Y}+8cbrKG{z6ekjOuoniU-W(P7HL3LDuAu!0O{HB0B= zC$@gOx^E>Zz`-$9KxVY7`V#4K@{oWj^ea?Ej)DBxODlk1oJ~IfeuFu<60Av~_~xSo z#nr@g=$V{}Orau~0*^+gAOZ;D5$Py?0@i0RC1AkE9C@Z~0*1Lqe!xbt%Lg;7tXVqd zli+NoHlGBg`W9X33x>4Ik;Tm6Ixze++s`om*#Ci+5~OG2NTp;vRBmlm8B<+i&A6xA7A zE3G$cKmmW~@f;Gv58yZo`>}D975Z_*YZ2-@**-(rg1ktVB#?%M#A8h7iWA+!gEDb;C0ySno#|5cCV=rTNKWH^PWf{TqW!-M^ z*Z2i%tv`PO5p}4Xfgfw%!GkZb_i&^3LAGaIfr-oBDeabJ^dBC<^~*Gl{_=^IL^YO( zX23~4zt}}z9H-OqtsLmG%(#Nhx$9~Em2^d!h6Q+acmsLuPL2gny>aq2U&_&lT% zLKa|lGlG{wAngh-$cq*Ra7&jZf_J?+`vN~3lzSCE~PcTpZ+s#*b zJBbDB3R*PQ#aM}HG-kh!@gDuhX2AuL$(Of_kF3IM*zAX%#PFs*B{UUU=WF-|O^~o` zhE=1L9V`VMis1{yF&OQn*^grf1QCTPkqk*ZV-4G*0=7ptqgHGv>sA2v zjxqaLU}jlHms9Ym2hP$5_GKHjVzvkN9Z@+Fzq?mnf&Y6|VzqnUk-R!Zh@hzbi}3CX z?S*ev=oqYSomRmt~xK3e_UfX}<38x=dfb;apYFoW2-3%vZl# zv;AW7yf1GZ=f4^;V#L$hh#@8{8zlrWJY5PsnHxElg@kHxSV2GS z?9*|}EtfwTRtyswR!01KIJX5@Ct`M?i<2QD>9kP-`+6EdMkXMMjo=pb)XNBdz^BlL z$froDqNNj->-`UtP~-@&4C{7oO0y7Ng`%Jys6>7bD7P?NsVJ#X6NQ(p$AtGeSUY}e zJT%L`DMvxFj*E#?=mUQU*WkwFEAkN6TOc+Y6@iav8G6c~*S;Rn)->khs;5GxWMT_B z+DGbw03Sg6wAc%+dd?NDP(tJjeIJ=EMzbEhp*(`8Qej!$PvSs1AJ0&r#`Fi!0eM&g z-*jx$MGlVKrj^lOnGiuW?ki&nJYm0y9l%;{6O`vK5?+p^%1%&lIU{N0ZSkkNUf$3m zYbd>**@ws_Lnz)(ROfR@oC70Nwb&A8B&l^=p$Tst2Hlw6aK@&C)!gEjb~JY*087!_ zWR=o{`uC%zMSI1?yt$hGN$xjKQPX-5xM3Gm1zliy4OH%0qh09OzcG#WlGMQw5;#>F z?N=goq!EiL2~z**`z?}IN&QI(wi2T%!1zT{Kd~j+CQ1D`(AJUq&LZ`Wv`4O^CWDl( zRZ`xsWoVU@2aj$BtzY6rCFv+#*MXUG1PrTYx=Ks=Wsq{eHFk?HurJ-1_8^94SXEpy zHiELArcA8LOvf^bVAm!vj#GSH`cfJ&-Q_Up#!MeBgG{U|aU`M2fkuUM3{Dk3LnPCf za=A?QQ~+WzX8B?R7G`PPin$9FE~+AZhiD419KcD+vG6dqH2+GhvtKRoBv(-|KQpBd znKR!dOL1zfA(r_f6c@%ZPRBS;v^Vr7vAE6y4u|T{7=Q&XwLrLug~(wHFpH^t4wnBY1TT$2PzN@hl4K(!C@AZiG$6TQ| zA^^|8OwG=Spksimh)PRF1E`F|(Vz}O{ENn?$guBFbxkAp3mCH(DUsurA0v38`jH_& zp1}V;>u;QT`QThx_qDlb`5)L2K1-$BzDbkR}btIWBOclOCFA43GkSb%9H^d zT#xk=IG^o~*!=t}A!ffK*%fmIS{c=VjVdLV09&r_-f2nnvybG=jW5!53(3Z&)5S;24zEz$Z)>uVOC9x=h~vVknZa@j1=j zwgnZ@ib~|LUq?e8y&Y9sF3(#n;!BOWS05R}mop7glejnt2Siu%$y<_%&Vxc`Xs3!_ znj&MI7RS)A>C@i~4c!^bsHTz55Nz?HucoGv0ZEM6D@m=I#&-M>lrguak=sj*;EN!Q zldX0zMrXJNC%5(?^vt3T8y>3|(tg8Zz6Kmw>4+h3v2so9X~RX<8&-}q^AJ`$Hs`O@ zWS6c2gfx4{=HINV{WwQRL9?@FBdZRTPTMrGaJWTg5^+-h56+&*e>l{qwC#{s`n~&; z->lz-Y`dmWHZlb#DynjatPy-w5mJa>JC5G6MgMqO{lW9Qp>oYs$tV_)^-8gu4&|+Ph(aGx~Xd#J;DG}!T0#VjhIGoDE`L}ZsRg) zuff>s3;fv8n0Y!m#=5vwY@)^8w)07OK9soeu)opJaxMOS;>s;*Mttl52SuDVWWBJR z#rV_HmtSP;Vt)sXS2|Nug*7tdOLX0G9lPuRT7Gg@YI$Kz@iit^qU_fHMah3aC7+DG z31x!14&2kdf7DIx(+qX3r|uthkveI}b^4nJ=;~j({FYtqgBj1k@C>f~I8evWIi^|1 z+t;X$D{^2b{9oShzroIjJYqfAaRNG%Uy)B|h8#Hw6g!xF?MYcMJ8m*#r6#@Up=N0{e&PxQy{d0zoJ!{rC6X0#04yn7G2uGyD=1SxjOje^;)l13 zU%5<8mFKfEPGNVnn~A=W9k)@uTj~T0(8Z?&UpZMKoj9Sww04FdW`SIFiSe=h8(P-^ z96}IZO%+cA_aAuei!y%#0^p~Yv)?T@D)pk#d}&vF%{?I;AK=zm? zW&6%GD!D=>m#CyvB|ep$p_0{4NPz+B*9j`=qmo_-pdYy&c4vGO5H^!yc6mJZ<>DW3 zCGKRL$L+Vt35aS~{{%veg#$d+?Q5~oAItd?FX0VcNky=>vC2}8ugxu4*z zx%?PE(oZ;w1diCI`i8#~htj|O<7cPgarL~S9quJ?Fg5uiW8q*=v30gO?^%q1lwbOs zo3cCl3zyyA_7%`RExHybsuluUP3KsX&I7iZChHF`qSDOB?|z$F+Fvt$C$Q)QNe1q zo5Ih}Xt%LW!IHw~-1#zDqK7FbvazsJb>j)f+$BbBDPPO>;SZdh-+^uEX8I~D52sgU z8VgSWqu`+R|M5I%?JgsDBpzmr$hi^$kw>#lY*;H?F}Vx4il>$PR<;W)18?nXH{lD} z6?`8JaUO&1#)iNeqiA8c2ATut!eXbXqdlZ%4bpp;JQf?b)y zK4I(UA|R80Q@HgGcDuS*XrFVj5Hx7HS-9Aky%nRTX*~A&bx&+o1x{bU+4xsRf^2q z<$0w*e65?=UKNdxqspy@R`141=bOdEb~fH|R{&gZmo6deSSjqTjB5O%#i^m$ifTR(p(ngfV_Tn5jV|nXQ!v- z%J(N)WO5`4g$TPE*_{rFhP_&@r_h_*IOq^Su)W%xgku1$ZYK4+=GY(hXT%lm0|X}M zn&gdQ;momiXGR@4jc=uV2$9{?G6wPp|GaM?uUg6AqDqCdqNSo{DTM`Qv9orrw&JOp zu)1RZX)v2rU!#9d=%(-7L+IwD(`ZrZZgOEW*3CHrWY+I0bT@aNl+aE2DBTQy74N2$ zZ`RFw-#hefs+!o%+fGgDW@xQ!22bej@N*8KyVj6|?y7-NQ}ub(-Q)kPyW2XkyYf-G z`@om+?n?P)-F^DqL+`GtiQS!fN>X>@%)9N>#BO#Ww9q$LTBF!luIr9fpVcX@Od({P zx1p)EuyWY5uhUpC$z9o+w@b;2GZYs3+@!JaQ+@)`<)dKXZ`hCL@V1n1hK0x1A37FP zO~k^q!u?=j&{c_8z&1(nYrLCK9r12@?RlpvVnb@-;*h+use7hge$6`lM%~TB6T2xn zrJK)v9`B}`XlmBY*VY|+H&spS=EJyrI4;7tE7qtzi~2B5^~q-^_V;I0*7K(%Ft=>= za8y<`J8xy3H%9lj&xr|Sm52kV1Qq1hG=4AV70gH;z%Jov?t|wp!Vr6R`Uj3wy?g)xC@ts=}p%dM#>{! z$T|AhNb$*q?b0Ia_%4p)Zf6|=j{SuRJT;%t3rOgSmkeTMMX%R5UVK6VjwPqy__A$r z97~aAJT>~AL&veIi8wy@)st}4!wJ-CU$Skz{Kw1vgOu1 z+z(@;oWNmx9fg#CeCB{E&)9EU#P80a8plKTViJEpc(_s@y%Rjh)Ku``VO3UE`e;q* zjmIV6p+e!Ia!VW!lD`=qroMgXcu+MF4~e)wjOS+j35;sO}K=VYTX2*5ON zhdE>h1}tORJ+h{?{T>hAhMvip!_?9#pne{|g)rNZ)zB}b`X`YPaBf zecodVI)I7mD?qwBTfiw0RKdwp=}hN1=f&T@5%QxRy$1kGy~%(ZsSS3@A+CEY8kAc{eNf*uTGCIdV#Y zeF}uM1c#7nDTNN@5pDqlubltSxZ_4OAr*2mqqa+8if2E7n`P-C#e7Hm>`I%rAn|_C zj|g}C&#^Z?(gH>fMqXl+ad11Ug_`VJ?h@f1I~Y=ZLh6aFxO~fb;1C(Dh5Ghg3`IB|6-Ae_mZb8=G@eC39T4U* zIlb_nZ2X>?H^c`uLVnOKSk@4`2L z{%$rKHksVY)q5jfmYL~zxkL2xhdjVBYZF@oT7+4lt0dn12sRGQqWCxFerWY@5(I#e z%H(!~t;18WVtg>NlGVYEuK@S<{}V?upr-vX&ST5NKSL)29#P{BQ zY9~_itCL>$TN$|(5@^5h7vbZl3&9iv@j{q_2zSff+N;d^2sX)W#mU`zuuN0s4Lq2> zjyvmm5!<-QX26l=8~g-9QDclh)_kdY$_pE0HkA%P7%q**E!}E2A(6maq|>pf&~z_x z-qwHF(`>iKd5RXv7!$})lLA_Vts4jroa=Q5x8#Ze1Mj=y< z^x}2wlyT)4=3ci2xqF$f#9`XV;8H2w8pJ?SxMQdOn_g!6_h#Y7+uJWnu0IT4 z(!4+L;K=(WPM=Mw5 z2Ql{}m4{O2L5%|#i9tgQ$;jizwr9!Xkq79#Y`Z&8{Gm!OcA$4fBrD0`TpE=*E|c2H zvHaZpXqnq3rb#?X*9y}r&OjraKSG0gq5Rx!l$n>yX7ed6_PcW84>Ci2S;X8)s;3-^ z4q?7=1u}}?4a)`0;)X`ZaOHyUgS>~vxRQ&x&kXyVTpt2*B=^6$f zFI<5uoI}vm$}AE6CYEcehBJbXu{y2dl2qBtY3**BfqluaTe`Q$Ve}u~X2m-yD~P=! zGh6}FXICZqKCuYbAx=3F4=||qPVQrd&+_nUam>tLN?ZBik?6=2xoVtLh9XBu8Qy6H z@YJmRRWZ&;FF_+pz7%UZeMR(T%GG~lNQztsaO~~QgT>GLZwY>k;2f4n#Lcx!rv#HR3gT`7gvYUZoS5NGTZ9P~ z7l>vlj1DA5?>h+?{f~puBzYZwd2`zas8zOH839H=V1Mz+gSfld>2^o1M&O;$GnX1N zpI^lwK^OJyyG3FK*uBtn)Qahf7WBo-#6?m}XI73X6$}M27(@a+_S-x-ha8YxtcW;g zm{sH>=ioAztYW8@&4viJptZ+hfmy%jbiL!z)aRDDd5-nOj%6XUmC+u{GcFokQeXu^ zC^dObGEa_3mXXc9=pbT7pVkk!%>$NWeN4hH;v;j$+bn*LiC(v){Gfcw7ibi}v;$R*gc!3xIbe zE+bWn-ivs&D7~yWLy+X@Z5w4`6*(j5D9bIoAkhS+3X9 z^t@h>0oc;)lSZgXpD6r^FQad1uk^rwkp-;4a&?m;8U)O~X5bqOk{uKniYzf)16gkI zP{*-GeB+l2OHxDHrQqD;JK!bGl347MxL)8$`Vr(5JroM?zaOgF65R`A1X)-@$Ele{ zlN6DTaH1A$5!i@d%ZfXmePd!%2q8vu_~4tGC0$5qYWx|d1&=N-cD#vAj7k8M^o^r~ zG(J~jA;v_Jg*e(v(7{pbA-9nyQhwuNOc1m_@-=jU{pvIsRfnnMG?ffe$vlPCKQvV5hej#f zF!?+m6^Ikg$`@K63uo0G;jBLM=WQN_>&$zL1&#+qbQ{`)4JPA!fn~flvs+X2NyI*l zKFWpDyXvAJOK#ITACdhQkL$6lxLXtKIfh(;U!%wj1IPf@+o7GJwq05)efLSCHBf4Q z5S4!=tVeVTHN%!5Gi{AR<@cZYTxTu)qDWE>begvxK`o`{}&(}elOW-5SpK&w_UG;J^p|W|? zKdNaI#W}NH_1vW{vNZ!h7gEm3YDaMC2L za;TPC3Ce@(4r|v>zSJySa{Kw_I$$c&%Ul$n&8(p6fmWpwQxgvS2CvH*23gDya4D#e zX_L82sZkJ)erfg+RDC;QS}vLNcOpACx*SazlrD4vqe0|kT5zEip>>htIn+OQEO`5A zXQ&r6r{MQYs^Mn-474Z?u;vre%9{u(hCDwF7+g=xSZkBr42e*HCjz%>5<>Ad^8hRY zcKKJ`(l@}$zbP$zYc};Yf>q=Rw0%(1Un3|ilr#mxbao=AYUlx}E5Qvo!_C`hj;<5V zNtz$wRK(S|cv&b1xdU6<7mEr?p;_YLOJYf|2vpH2!%`%um%^KCx52>-USN=q+rVpU zfR<+YX)lYrPz03*m7pAzO-!vUgu?;4vdZo-B-P)cA{qdrbIs@m9RW0b7g^3h4~Q!x z=HniR(2mFqe6fe+g45;!D@pt{{ub~SY8?Z;0NWhOft##C%9az}cB_s9JsvxqCvTA> zn>pB_GI$i+_Bk3o9%4Y$F~mh&6Jm)9qsk>uIOj}Bfwh8bu@DbI5q3H@$F5D;2JHwYe^0E?PPKu(ZY+ z=Eh#6tt?aj^Ubw~*MD5hhclgn9=`eT^6$G{XEr#Q&_w;$Zn$#Vn~1Z5iNxsjHxel1etGDf z-|Tz^{e{~KQL!iGWXrapt3_BEOoV3f!F5>w&1q&j;(w!_eXY#;FIzDNF3#^G1X8Wc zr4mjFMc6>RT25PN13RaM{Gm0zyp<)~iL)Lg(j%G?e2w%9>^;?(737n3E;W+*a=YF^ z&l&FCK?JAaJ}vrm_E2YM5KY!O=`ag3jldQu;#&BMfjHsCb23V|+479>Byr;zPP?L(zoM3K#vK3EbwF`+Nu?VzqR4pSMyi3qkt>!O9@L!_ z$#o#JkD2Qm-Tu7Az_Ab>DkSd%4$E^<>zYU>K#b{bg`Fwdus@Q&RvW$B3 zB~g5tBrnD^IUJwlqqgsm5MmiQU{Od5)WIv&6Sh1ouHen^YxULv^eQ1;Sqmp&T8beI zsv{Q@>xMfgAR1Ge)?GjqM<|Gh@^WL7<22@{i;}}$s+W>=pahDE*TX4hUz!8SYVrPX zxlbA5%i#+04vFR1hPn7@@KqeORp#OdSxgcpjA@qZ>?NJkDD<$Z=Z@8exc%r2AOS0g zuEG0}uc35uL3{1d0EB+G1QAcd=lH=Xwu8WfhHNgRuySCOPF!6z&;~3zgRNbG`lHV# zRF21_`i*H`(WnZ#LKM^QSK}3zr#zd(g0a{4&D~59o>eWhT{^gf^Ch-UUxb7jn~F zfSSdJJCx3VE^dt>eytH0PI&9LxWI>WZVkY{Np26myR&^^uANnqUBo=a(RrwED0xJV z5RpwUf*B4~Cr^{x?+HO~6a&{WqB7!A$%h#W%iP!$y&Y8Xq%YzBY3f!pr*w*ZkDmbCf_cV(3B!7u zm#|>Bj1&cbY9AR!ESIZwqAQt8NA`>?wP&b+7EKY0j3V1ru;a>KYX5*Jnvn|dNeaEY zPymz02Q~)Gla3^%8$)k~VKIz@iS;@pOyP9py4|<0$-3QD=5qc{TUL~v&YcPvG&3gu zj=wk{%9rAt0YV2gQWy)RVt~s52tnnH z5oQR=9F~Op#$rgp*VE_?@C9L}Vd&VPrXW6c>DS`PXXE0P zPT-6kF_#pZQH=t>U;$eFMVfA27SC0}i+ttmx3W4@ii5#O9$h?L7YDUuA|O6!a!RbY zy{|jEQHcJ=7&6`;3qj?mZ)E@cUqMlZpeH+op2?|ZYN=Gm@8k|J?osFJ1yk;KVp__q za96dwFDj^Gdj{41DeRWuNWpml^K;k8JpH=@>9U|i43+o%ZH8y+a&uLFFqUCSP=@`r zi1+0vDNLtoOXv0(c#ATO+SYJ(htr2#IDGWAM(r+`G6cYBNC7lgH5l0AF|2!;NHjTmR5-*P?&l^k)m*kVQpui%tJ&F)B{SG z4k&mob)L~JauvbjcOH@8H*iH6v&6sxS13?4SKyd~paG{7tS-L*BqDsRU>IlKv6_YY zRQ(Gym+IYrg&!E!NFLxglrH1sQNLX*k;^`?6+GuV&)B8p#WQy;@jJWBZ|HIXvk)?R zQWHUvuHtyvDCRHRU|3VRWOC>rp^7?IUH?^U?qXt(c|wiV@^BiP@fGedtgT!TJ%s9c z^o<6JY>m>Ds>+>8cN^B(hghljNaX;X)I3*%t9X$|1_^EnE-SGf#~5)a;NlupLZDT zt;wqIEDL;vZSeAzBvi$C%QsrDX}vS5`30@NDb7&W8LIU&53%*wD4_-K z)Xx$HZ}K`Ncn~rjpf+whLG~bz@UBAeaLdS_;1AkJc`Kt-mit4WiNswbcz+&+tp^cVvFHjLy zawd-}nlTB}WlRt!B9z4B;YNVh_8BU`tRbR%;B9%{8nNBN=ZjJ^WmFIg?bU&`bVh>wyX zRq~EQEy<0>k5kR?_8H#5a4~;y2h8h$kbl)?Xn=cJvD=+??ebzbhY*sBB8Z7nP>03J zZ0F(h8DSCU{m287beQ0yhjb!NF-?HR@pB$-dc&E=y@2_GRqA2uizSabkjdEuv!P}) zUpT-Fl@^4v_CC-2Wx4RZ)J~B6b5+Bk(pkP|a zey%Q|Pat=;6d!z;3IELOkI_FrOgulVnA&Ig16q+l`$D%AscnNG(G>hLeT8c$cQyjg z;t(SJDSrrOv?&PM04IpY2C`fm-A!4riGFxx~7(6z#hF>Gi{E*H^Xk zg?y!vD^Mdx4=O8vNN@49M`x(%)hGoxI7BHk4e%Q%#J?#HfRQ8c3osdhqtTv3s8&Gv z3$c__f)&<&$Pn*BtlX!fW;AI)BC0p?8dV$r_)PUC*l!G#P64uNgA{jb)IO|ntb z3}NL2pSGYJ3E{Ty#wWfZIwSDo!^tx6=ufE^2B-m%N zyb}rh5P|;`SX&*LqV&|G*j^4T`Bx@Mf^uLZy95N9o`vDN1eYOCckv-_HKWjt0+1zn zs~88M0*}51L|<$?y`=Z5^Q`ViF+({sgjV5lg2*t8JATA8pZ*p^g`T|Wuj0X%haH4! zhULrKL&HT?^q~(fa$oN~CFuwmu4YyxIPds(9DI_p)1?yBHbE+pl7vRrrz+XVAYcC8 z%l+vaoMSPOc04-8(5u5xP~zPTqi7 z)EK$y2VLDRzUGyvU-ALoa#&gd5EOIE)phLU^vq<;bu6bZj!faP6CS>PQmR{POy?dK z*=?gI5P9_+Nfl@x$~r=CY#4!`5HwJreHhswx8b4iRZ`1FV>$w9q86-`E1Ge-2JgNm zn{$l3_hPJ{V7+I7t_YSJ4!*4564?JS)@j)Fr)9!F7ce;l{sBK?0;!v}%H%l_xdGh0 zoGvJ54|pU37+x0{ABgK)B0hs(g=-m1NrA5pL@+|gaLr|+$!D~#YyVvJh; zK0e?h^dX&UA*y#ejjmcv`q8|{dkiUDXqSaVENjA-ys7eNx~wLmG#b_h1NdNuR5wO@ z=3>=}bI87&VK7mrj8LdfOcHL^0)JLZMcOwIj#c3J5UJ^;5;zGT+QcD{)c^u7I;T5; zSGlYny?|%VJ}*7daTw`MH7(uac{OAk#cb%FE|6_sp=*LlOx#nR2Ys>D+X8*9V2+yriGS)ndQWP$PZT0PqeRuxDfo9DyGYm)c^S{o zJMW?VtEDW6hjDd=Jd=o%-cBH*ARI#g%y-G4H8_`9h(t4dhSv;r%xPN7jsQa(G#vC> zSr>dlq&r9bu;_{c*rh8qab&>{)h-#u$~xgAm0j%#hQ1Vv705i$J|<03rj({jwNxb* z%S;vM-pcwspTifT1HAIRW8|P;l2gt}UN~P|v&HOffq;OGQ3;5$GXI3or(`SDRfVfL z_FFfqvp^!%HA{(bXgD>Pm?4EdRUff;npjxsYxH5}TR~XKHNcCT&sJu;OX#s?_D?}{ zo>X~2J85{`3jYY1JK@>mJcDeiLNsj6%wc}1iEQnWOK0(r?L2tD2EW+%y`?CM6$z|U z{8y^a$dP6&*ONae!BD%zI`LzSHAL#bztRZA#;*HGSpoU%m=as@)9Tr(m38Hbng}QF zOdx{f6e7IyM4Sl1KOr+`qX!V#P&d+pX*TMAif{|)24UmcmV6i`q!RILw4Q_(gE zsNxT8GG46A8IEn^hIOqQxy1WBmL;3anx@io(_0y}5|fY-XQw_*H<)$nE*R0f5TBH0 ziZ8GQ_q#N;GOX?>k5YlgY-8%J$mqAuuyMVp?Q2j*QDAGfk1k^CYfQzk42qoHjj2A# zdCup4>w?d<9p(#c>yE2^QRPC(3D0t4Ph)Dfxo#n$T?MV za#_S{O#KS*Bi9z>!WfvGkDh50Y~eavp0;T_`!P{=nDpvERD>0|w^w1wKF4 z7x)Qq{!Vg!USf^zix+*3sWr&$EBwTmK2eI@u-@13iLd@A6#1gBFa7P3bl8sAXOC4~8 z5ja<6?Q%B@OAsCra=Do`rifh=57%q{q9(daJ@NLTh@Djkw2r~@-uIPGP>Pr~3v*Nx z3gg!$e!7##KI(Eas^ab4~~UxIrliN6OQ^OK_}e9T16+k@@QNqNcm zQI1K52J?HlCxQ%O!OAgwD!Zm!~m5 ze|rMvC8uD1=p%8=OOa-nKW|n`n1AWopU1qakC;F1ha}8{c?4ggTrR;Z4{K31drHr3 z4Xbk}B&KYS>spp(+@g-E8Gf_9y@vI4) zpi~bys$Q!=oV~?bN_n?-2DHny$O62MfyIT00R+-6YhX0 zK_W&_38x$?K@cYrBnYbrC{bKQL5Y$8ib`TaU>HX5!UI?FSnnG*D0n1*fUv6|E+Xs- zh>JZ01uqWSHUH;%t9qs?-RkcD`^!h^p0}%>dh31Pdh4y~>Z)shGOT%-=2xsaq^!9< zc21Q5Z%53qW=Sd5JpHkRHA@zcHJ3*Gthoj;7+?4mvY1~9@Dv`c`AP|F+}MIj&KD)q zktAMli1tP3)V}l39#=|mHW?hmNKDPJhYER4u5Q3N&W|571G=2xiU!SMwKC13Ofa~j zY0nsr5Jn9QLQFo|QCT95V~^tJ&`4&-*e<*S85&&CzHRJ9b=R_OY^J(v+AKDhcaa7s z#L{qcL2$*n$+3TM8b8sGT(R3!C}LLW7+fp&^dlqpsN||2N!7`Jr5_pcqtbsqZM%?O z89mBEHJco5)$lZ}{C|EOSH6rrxdqCtk0vyqBeJX;+RqF7Y5u#be_!(okD8x&$n;~8 zez7noc@o085|I*l|F0tH8Q;gPor77_R!lve+(%obXX@G>+-KBwmg+AfOB1z~^d38Z zc)nk4>;D(ERd}pzvEEB>GB~Pve6jOEfmc?}Yole%`nTOu>XglJg1=)PM{` zZd}3^oXa&aWWI%Be!61*FO_lT-{5Ux-o8_mZHG0X*g zM1jFs9pi40(bL2M$>$~GGYdG>n@saU8y|#T0TZ7zH+l)i2f~0@oH_%SL1Vge22bZm zC;{CCX3st>8b?|ISNk@mg-({kOZniOP~-|&QSapDkWs%ciaUiOh;xqD!%m*quSq8! z2uqN8)-ADKxWy~Iy~y%WvxYbm91=zV@sMyshnn@E*y#XL6_2nq{T7%LN=V2*&QdTg z;GZm+;T20}aDiCl-9OYB$Dms|rA9fl{F+zfWL_?8H+<+SM_Huuq0I$1Atu$qkO=S$ zr^h$(2uD_V^2G!s4X@DZvs1JKePxf~KrxlX+FiWFt)0BgQhfzb`3FlISEjuuf1=hB z`S4{6e;c(c424-c!C=(}?^i_?qH3I2LUR6brjr8WjJF?@GvzQ0m*2Z6gRSH5MldL} z*4G6q13m9+o^)>V3~1I}7gyZK88wp5cwL|s9ws{<;Nxy5V;KG!cMvmY(ZJAy6fHQW z1K{WV&Na8I?=K-%dD)Y?<&`wF^R5q2Ji)oE;Ppb`z*-QI{bkXN&d$vcolbSLzaiNV z+^@1|g1={KMO$@WM+tCLMt3LOMD3s5JnNItZduXxZcz|QmUIlr`tJ`s zS=Sm_`8hDM?m4KrG_&@xN=3pXC+yAoj9=DYtWqWGCEl!4{IU+VvPxZB7+Lw@E*Q@C z%Nky5)|FCmwm+Q^lYG7v4gB=2PhE$5v;HZb_3flF7af%#5CKax@Mau<+EOY?Z6W|N ziwqS>+2aj>Wp8B<6}w1@1j_G)onh*t>q+EU?v85Or*Q^ zaG>)`F!ex=U=-hg&iG^yz*TqI&q8PAx5Uo5b+fK|ky!&OE8_UnH$Yeycx+MgBrFbe z8zitE0bSVOgpZSnP>wxWV7Wz3CAk9RYoF7pRb61R&UgPhRx95b!kBNAT-unO&-mmk zM)}dy!Pb*^`6QyAoM1h9icfmriF52bc%1vO?C4x zi!V?TM%U9tzU9E`j`AwiNr_0&J&5s32C!l<2aw-B4l#d=4Z)HS=Xi{+B6y&NyM-#fls^IE0iHgL6=oK)Pm*mVCtt=M$ zL03(+WT*`U{&NV-MB=5_DL+`TfaX+o0EJEkyWk;hQ5?m`f-=DOj0<<^C6^_uYUGndA!%l%9psv)5oT>$muSzhc;3ETtv~ zdZlr4K!%4>9tx{@%DDvW#;!nr9p~8A*Wh237eV4O;qrOsno++ZlNfr4nrC$hHvR=( zd<`4d3}r6(&4X%sBOR4CMZSRW&$$(_@&9{!Yk==?sEXgPx0{EGy|rU`|E0a*baPwR z%HFZZ2;~QR#|garehH=Kz|Qngfr3qQzMQ2vk{%3=hP8%;hG=a{-_EWJg`@f3f+I9? zZa{|?@FZKnpZw$=eL-X!DkJKnyRDWio3Jg2m>qaZXk>SoaO=a3n)WR03;v24H(} z2`D?ot~af-PJ5a$#$uh6_+3$V&8bX;%3`ntxjXOuQCVnO2;;~Sv5V{wKF%wtt;PGE(A>?% zA7e{Dou#Q{iNv$0Pt-7(#qTqPOMcdulmw2La|49ZS7fC62L2Qosh^P1Ygfc&bXt-t zqhV^E;?4b#5f^N^j?J$1xDV~`LAaLK9z$)at=_0~SY z(-XD&wT`o5l;|ykJpI=9n!$=Zr9Y#6u+s@)>2djAAsUJ)r#u<&LsEEfZqh1d;7iDP}S1NSqS_B%pE0h-DgJ4QfS9)R(Uu_CU@?k zqQP8VCmY1oEMpQ;U^Z;NFTUDv>(W#f-h@yY{9*W@*H4187$-}h>2;UKH9h4QSE^TE zN~z-MbBU+t#h(tAr_M_bWd2~n4(hZQ{rzAD+pvnMDDP~_`(ZFc9R)Ddw5XX z9w#!>sPLjz8xGeD0zU>i9SqRXLmmn*Tv=ZmhnrEFMS)k%8!{3%(*c73;+A zdJGYBB(;ne7$WRa98tWjL;{5>#m%_X{Da+I7D|&LW47GH+m*9#AK1K_9?#-$#x(F| z=#DI8Y2I2Ol-9g40u%oTHr;ao{Z5Lm?Bip5W` zVje5-YdoO=q$E3yHDj3ZR6@%#gf{$7BD70*0bAgWfpy##Al3mY#ksgBp($BGdUbhy z{a@g9yumA7pvCWup})f`mX(SS$*W9fC^00&iC0KTHT#^QD5~aZ5B`54k0j@3ZA8BE zIPX!B$N9YY%cHAGaV9RmBabJ(`ajAe$$1Z>G8)yd%Hy9{!47%!K~cW)_*~gX4*gAE z#tir;kY0u*+F=A((LnFB-3IzpR~5eItI!svTYU=W_!;TY2XJQb285c$IBSVU91RS* zg)?J>5yRmS_3Rhbm_n=_odPG~kh*{t)fe6+M5`y7;KueH~f1IA%F9->BO@<^T_(n3`#h zcd=Un@Y+)nA>j-+`7Vn(IH4L)IrQUH!#rIVR9)@t!mR;PoZaZcwFtz;i-dtiwiJ%@ z%^pZ}vLR8szIoseK4L1oE98k@S&Bs2U@7Gm@I+%}VQEe$fbe++H3?HN3(JCBv)4E! zD6Hl&C0F;~|Dn8@R(Z?O=l)K4X}?!quwpYX{pzT6a3icflG0GD-nnLzvUQBFa#A`X zUnI45j!Y$=hH04G`fOM*yVQ0!vYE&t7@3!*+*p08N*V#uoFu99prfXrD%6acwIL{v zHOf&+?V+1vT&W>ZY7<6qNCmsrO3hd84ocN>PTviswopp_ALMK6bL;QR_qARB5A`|m z_sh%qz4C$;@`leFPjJY5JqCZt#RF)uSvrImxJ0~v4lkDX*Wq>~aF$AOHZJh~Sc1Xx zr2;e0lYFyy@ymzS;q5gQrn7S_`~oJ6*KiQ1Tat{%pTv4^XZV%MKW6Zm^YJwxJpz)` zdz|DtWq3g4iU#)n;Ck}6FOum0)Gwg*ZxWHHkN*l*+^y`rj?c+K%^DQT)?vFnaTLQFY%yacXm5dk7#t-OGzl znJ}ZxD#aFDU|doGw`Oy-XjMOX9X|j`RL2L+$wUoe16?V)-qll|2iYaq`_Vx&g{Y;( z#k15+d1eW3@W)c&Ur^WSHV>S8&(!^kI3QzzbJb}yO?tOq`ltoY`?b?5Ktsf2fc}*q ztPFLTk910*R0)*l+^XxYg9?`9eviN$SsXkK5C}#ZrN_W#&Yb~{_H$TjK@B2F>E$F4 z$%jQ?-VP=(##oChOTT0;XBdRW^cnQ0upsreHCVn0czUxfzPgQ`{N#^ld-%$K?h_)H zdT29Ef^!$j4|Iz#OAJ@hx88}h1GPodf|Zx3x>0yD5QDOiM3u_NKv($oAK#t@=$$a} zA>UCO-!?3EMhsLj1llKe`3KVwz_>H;Ru|SCc;X&0uqSb;!3R4V@HtD(%leA_3+4Bp z^z{LLW{1tv@XY}>fDW^+1+kCla^vcURn6j(n-bJ$vGeKqR?+cPxbYatV&@qv^JSAPx@&WpbZ_4Qw}duiE$0{Vn8j7i2&tdm0&@)PnYPrT97ZlpV40@rSK zin{nd-nN@a!b}QHGg0E8S;5KaZE*1;!&y62X%rSCLp-=h+72vuG>ibTb3L_8FNe>; zAMD!YFNfjXC8UR#@O0)w6LMd4yKmz4=l1ZIW1#*5sDCu;ap@Tt)ni-x)F&5F{jHwD z1?nf7+Sq$m>};48-$5@%W%)yH4<{Y=gk8Q6Um5s zmb>p0-^E?^k~h(3;4|hQg5~lZHN9gWc|0p6FB<5Em(jWXjt1w-wnUNsSi29Gb3`P3 zduD!lBhJ=L=I5=$;YX&@t_F&X|IL<-l?PN5JjKUR@f20OpoO!(u1(ab?~5}LBYyFT^O2%!sli>|E{Z)qOSB?XdHS|(0tVEa=dsJ*2N!f zpz-F!&ZpISlAh@%m9L^WNuMt{V?jwC|Ctp384Vo8yJeMVzbOY#jSls*YL2q|#->P) z9WlIK5N>AGd`ByfTf9enFIpgrou$_A-_ASDO6wGyC4t-(pQ23`VP?c99ueJJ>p|#T z$3UUde;2qnljR1s2_3;TR_G-~(*LMtC~rDd0@V!Di4jdbezMyP2X$jJES8sHIqob0 zn|6pTB87Koh{)_T8eG@X)9DA%;j#-xlF5smvc5{#YI1h5Gu`@~sD+Uw-%8>P+6uWG zfPNCujVHd*=Q(60#?)9Z^Xat2dKnd$V!ceKvnlL#fl53~c78e?FUA*R(?w_YKk&~w z>@klZ{lV{yAUy-}an8D;&Psx&3%DHM@XcI}AS(&#gMh5{WGRD=@0&C0_hag0tqwEm zDwP!iOMMH3b%E2skgOz7tO9Ep=v1SMsdjvzR}wsIk=Kx1;k5q*Li#!(B+H-A_%GiV zcO}0)djHD%;I8e&2Sb1 ze>hldx);gK2!&f_s^}kNSZO}~9|ObBK|ets4Hp6jtv9&Mj=w;K-NA!#c@PeFeS&(I zxgi9G@W<3>R1^EsR&&rVAPL@G(AVcXfeq?K)foD+0y@_cNuWapbhwkzi5ISMZr=?3 zz}Q?PCi~zCUOLnlJZ4LSl6XVC6twggteC?7$fy47IL^g0eAR$WWZ4yRA*>h;!WP8~ zD`>(%fc9l zG7mc7FXplZ(^W3qepFdKH>XDwH=crvw7L?P*jn~IU^PVkbL0$>kOA^`9ONPc1m}y< zBTJ5!(g|wyiRMDF2?RA`GxT7~SZ#jQYga##`Ynryv^t2391Gz5?QbyGSw>7=#~$y5 z4zZNBL;$CvA)-mn;@Z~vq|hoaKnmFek)Mt?WpbFE6by4(_ynyKUpFvvTTz^xi-CTy`y4_53+YPLo?Ph>Hl6KRdbpa33Zbn_9+D#4(w15y6GJG6WM0d3AoQv7;VIJU(o(8BbrdeKSMi?A>5g|vSYO!XL%1mHj-h(gI{s-NoBVJ3 zr`M4}`6qOmvza`M${1avv?}pWuvGLodRz{ZPIt~nWJjlvL1Aanbg)#v>JB~jM=y%6 zhbi8E+k@q;i5)q)YYD5-`%GToXP`suKHqBJBQT%e+hq4d@sY4v; zWdq6VnH!0FA;4(C!;pxeg|Tn(lRIK^5vDW;N`-%HqDnHlSy+;Zqz)DyTMZ$PImqjr zx(@9CJ2beFrSJUNYcxW8J_psBELK$-ZwctBFNwDV`Oc1p2!3bLB-5Pra!8tf2bDpy z&ywKKq1`b`{0nc8G@J58GYI^2J53c`pX_iR34GxG4(OCQ%KD>$og=ls{QgzLO7jz4 z--2tEmA*tFMN{8@P+KXzU8GLGcNNlV6P@Drdnk#naL($s zS7*~Q87^M=k!6{wXHjmER%hc9`#@V}HWkn}R>_|R$bvXXx&b0aDdBx~td;KbG{7GP zK#yD?0oIy-l*VFpi?ZXj$8-q<-V>+p!6{)2%lgbt@ANY*Ihxv>f{eBr@b{FY7*+v^ zahJF-@byZldI(~`wz{5-M^bOVC00nw4y}P@_rx7cx{iO3l0Vy?u{xozYN42!6V-%Z z;;>wi=R0bgmQIyx%aw{qlma!1fzuY#o!9ky2qcR;_qqc+)Ptf)h{ajD8q6lvds_U? z;QDsh9~Va;P=*?YFgm1P(sLA$|d{l6{$0yKV>Ux~))^#5PV|5NpEl^?9=rTh=HF%`;z3<}>WK_xL`i_?anp&S^_ zt=$=Gu{DT3sJ3l)x@rThK)%3*&Rou<8YNOsD)l`hI%XN>|22c~GfrRUUb617$ct<92^0q8h6VFv$~=lZ`F4F4yQW(smfQWs26{%;NOqNzC# zYyaoEDUOpTAr1Opj+5swmMLLcy@4Z2691=?WFZMY?~pJ7{?BacxF`SoLpg(otFUny ze;Pw)w+hM^juE9feU>ZUC-a3ApJ=Z_jXG`Jhp`(I!QrhBu^M!XKkMjZax4pvonh$` zZ$>WKS2k@6!3O_hpa@1}pdfFqOI?;JC1^n~OH)6LH2=O4_9L zIa$eAkt`<0y)_@dQo65f4xPWI-0=t!&KHNBU0yG8@*PNlgHGnk@e|>Cp)h<&G%$NH zg~`@KZ^CI7PP9$NBz?M5vr9FC4Dei(tD8d#9Q9oywTLw*kY9T z>CU6aRHYzgx>v|62R0m9BL!ei;}s&JHVrb>YQ(80sp7Dntg84Px43nKLdi9lKw)V# ziH7jCeAYMCUrd4xIX({)drd#2ndZl2rXTexM75+5DF&QV--U$?M<-;OhpoRE zWjq`Z%R-6{)Esn{y#tfE+bZ5JKUjgIt!O_`;#9`u{0Ha-p)mUZ8LvsCC9i@JnWAf& zg+W5P^JlDs)LhYZ!QAG42y;W;S>fu_cz}9v<(@Xv1F1=H61Z*6TPPm4*y$!UiNyjR z1vN!M>@&oN0lzR*idWrKFIHSb8R<^HQi=kJgS%;#DY~NcQ|}>x_EWGWHTeKh%Sr$`smIiFIw=X#a?nh~ zNtICf_=DD72r0*;+V=KcQ1gd>XvaakhK&6YX7GEa4BA#YZ3{sT=c{1h@z3^#6CYGjLK=BSL#DXFNje0Uf!EA| zLpMtRwucuyl%{T^aNc?wc3z?E+$ta6hba4o1DFao3m!r&ZH(B@ILSPUj; zTTA&Y(&`l)vCS8;<+90ng1cy|wHMOXFnHbhlwoT*v^B&h=oY7sQMR_1HH@Y{y)bTT zW7Hh-6|mbe>5-E!MndenkVdyDYw%?rSthyjGa{|J%46ycYZ8P~L zl_7@>U`$OU6z&CZ&YXR%m)WW(u}j1P>FHD7jkpH7#!VBGT_S;~H5*1kVKLI`@@dp4 zN4x=imm@D<)HHP9?|c$T-G)o7oPj*FmMsl2RxCfk5f?P9j>#D**aAa~qX2%O;6u6( zt7^{uD`2TuuV;JXI`R9A>tL@rv=uWRj-=p=h%g%%+`VR9;uD#E5huZ(=+vEVD?_?0 zs!9wM4N*p{eAy34>$o@oc52FCvX;Hd`9mR=pF>-Pc-eQE<&TM%U%)%@O;SQSxho_s z!x{5W#R-^*PYpvHvp94tfhlkXRT?z-(VbOsCB)-7f9U@tj|;x|ALQ}VUwq}k^T}b2 zQz1&o0|vl|*pvr^B^{L3Oqw&^Z*L>()i1S>4SUC#k#kt;Z=6p)<7(S~Iaf7jKdbu2 z6skB4uSrX9q7}Eg3ztah?W5W3i?Ojr;A+xQnD%4Q)O<+@LxM6=oF|{d3({TA@i)Ok zINnLy_HYi$M-fvQ0P!ExUm}DSp)mYbej7GW(#yC^{Pi5Z(MF1zJ%>M_SmBzxHR6QL$qoJT3QXtV2}P+^_)FAIwh8>W(L2?@$bc5CRJaJ)KukX zI^M{y`G9>wLQc-R@h5Pf;vpB!bv@)0?z31P9cbAee4==@yH?&AkQbV}oYg zIiJ3P2HFjGaZ6D*mc0ZkPE`FJDnAvfg3U~(UP7*3^4*&;?o9!2=t--wsV6j#H(K~6 zH5gq2GJ2WL4>Uro-o9Sx@e&a37>bSxTvqLom6XLudLzfHQ8z*?b z8N63x!o>rXOuJ70iHlpwAo`AG}A!-sr$sb7@K$z;f0R9c77~U74}gg5HS*$5XXmcN&ZoWWWG|EKf701o%e&OT z43+)qCk>&=ZZr?*?BZ(D(HXR4_P|xlj}~31uaNA!hpW`&ggoNcMNmpx*{VP^yI7Zg#w|N^-7BWZ#N%;PmnO zIj~G+y)}{b&)%$^5?LQoSx-jRKOn2K0oxL;3pBX6&W&Y@c!AxqcbNEI0s4aYFYWt_z@D-@yR92DyM8xeXb3)c=6z4IM)TBhw81+t13XQ5V-NC%)w7tHbCG=w)KXu1G9?f)$5+^$mIG zU0LL8^6Bt|141~sto#8a=bk*l@_Eb{;mJl^B{m(`+1Q`wqoQ2dvS(l@G7M_sg25bI z$6;rp>Y}vnb@uB~%)4uWoGowYF>}p!tTF$T%bnG#Z;q%boOI`=4TcGTOR!h77>Zx$ zmw1pjacmIe;EZ_=68S;Jo^|9gr9kYzfHs1+1^5U3dFF+Q{#?b&=+6h&SN(ZIJj8|$ zfwCt9Ng>#d1R9x?4xK!%#+1dh=BjBzZ88u}os>immdCL{s|y4`H+9Z`%wj*rzyv^Q zv#wXi==|I;^2?#BD_S;znji+J{sKJ(atI+)4?aPjU?Fgw`7+f3+%qg(be&1gCjhkcR{_snpUCi;r zU07twLG0mcy?q+?;fSQR)3}?*TKsM@a8LKcoo?ZZd>5Ixt1nP;D6ny78@M0;$wv++ zdvVV(ac|JLhpw>r9cAFo^ut|0-IRmyyGw7GCUR)5aZ7C6t_E%gKisn{T#@fQ6L;kx zC5JQ{ckh1^dRzafj~v=sxWaEY6Zaa8y9{#=rav=qr}^Qoxy2)g&n`9EMPrSdZR3tJ zaNGFd-sr`hW8%J%qvTL^xyA2t1NZ%-=!5EnJcB z$0H3n)YG`TFSGa^VBiM*aHn{2XPUS#3{-L`v~g?xov?=$kNC);l^3^ziF>KWO|o&9 z8n_euaNjR9jbm-xxS!WF$;ZsIP`xY;&tnSuMDA8x7_w>Hn#rE|U@c3PM`4b?m?7-7}*;P(j|9VL)zY?9-SO;%fV<-!_g)i6Vb z-}X~=ZD->?Zr~ojKcVwD?lqWcPmHDTrAd-A(ZpS%abLK^;&+6B`;;H<7)uWP-oR;M z;-0T@``fs+-zDTQ%n$cItFK8R?(&NbIqd7J#8@Mg}aJN|PSp3;+6Ze(wN)C?< zvE(qqz+JV_M-B%qe#Jj@GI1}{xLs`A+WiSRO!ULuYPAc|+olT)IsB5X_+2^J;`e<6 zw}~I_P%ppJP26WR?!`9lGy`|JEKjZzpG7UdE^jbTGI1}_xH~Se_&wdg9p{I;(`s)b zhc$x?IUMe$xG&^b za(LXpeaa8_9;>~HJv1?K&)2y9ZQKzC?l3>x?1>(~vwWZ-hka)$Icywg@mu?KLJmL7 z_mRWkYfW6y+c*>VZjC$E#(mYmUFwH>?$su)^vCs0+&&t2|M?cb6AawJez-N3oryiX zc)lTrFV0kQxXs258n`v{eB`jyi#y81tf?ot!?qb^DgI|f+%o@3zdoa-Zp z`>ggRb~f0=ouP4WuyGq1xMhC07g_IAIOE{d3^3$yipKr9zs2v0uM+a@>W7N|+s441?T6dV>W5lW4tx6>a%in_ zU+8DaVg25O96I^o?zP&5=q+O6zL%xs(BH-gfpg<9{aPFxU^b(vpMp z7ccfS58{7EnYa}ix3P`e&A`3S4>#4z@9`c6zh`UQ zN4i;ZIQWl*90vH|uCn4Yep}!?W#VqjP;%&E<34WS?w#!;hZn4VD3!RwOx!y)?#i<* zen%L%5kK5H)_j!2eLr+JWACk>MvCM zYvQguMaf}-jk|tFLcUvX^^wC%`KBDC-yC4#-lTEc*|;+e+}VD({~m4PN;}@$&5%QD zjr&4ZOAe%AA%{(~eB`j#YR4kqo+j=jjk~dn#qWa# z?sPxg36`I1!uGcFY(owwYTU6l?nMUfNq)Gmj47i*nft_?~&~ZIjouK zBZnt1F>%Enx|+CGY24dv-1iOKDSo(JEIX4pYU^2s92#oe#y0LW1Gj}AZj(Ql{7U~e z+r)k4BqfJOvMf1tFmPAR@R7qJYaAecvXhB>na1s6<9_^ELcSCIaHm=Er1V3Z&NSrk zOFPBy%F``==NPz6{BR$%=2M%|&Ze8V&uH9>ZQO1K?($+EIecif3*q-96ZaC0yQ8zk z@2+hLIgInez0~q&(k|9?HRN!(t&+nHHtr$=x4s|lGHc#bs95#y$A=gd9fs;kFrW+OM>WRb31@e4DQ1(9Xtv+`v6P-G|?` zc^=$}ChiiA`$DEAhY<$uQ+~MpEWaauy@`o?zQ*lu<6dOo4)eqP%(4fGcb1=F$YEa_ zC5MfjEPjuCnvm}gxA@4R4s5c{of;`Y(F`%ks_ zooC<<_QM@!`AP9-FJ>8X_@cFv!)-S1IRy}mYTR9 zwN!H0(ZS;PaRYbfG#@$4vE(c5c(92(L*w3H7aR9g19zeyZp4ebsiPr> zUxJF?m2EA4Cm6U*{BZXUHsv6GeY%PJjK;m##tj;{%Wv?J!(uP)NhaL6 zXyPu>xG&(qPzk6%35ki!>ElpJoeao^vVkZ;W-A30okp2=@L#;K!B+zO3*2umOn{K`f? zfeTKRHTCxiu3l4*Fxl^W-#OdVH`y8b@f7$$Al3K2wSP?17264L7uD#=xX-a zB|~YeK@;}^jeD()d)(l6gdc7PtIw4fcg0DD9QL1};A2JXR$K5{r<=}mn1%168vORqxUege-{q?l zb~extcd@l*K<50PHF0+|QgRq=<4!bizrMyt4jZhPQGCk?6ZbBS`_+jSzXJ^1MSi$P zte8gH+mUob4qY^Ek&Rns;GW}$d$Ki`g$^*udECVPq@j{S0~@!ip|@RE`^e#kNv8b@ z?nNfC_TwpWa6%FpyY6^jr*d3`|$)HIlOK47t#-%W8&VRaests zHuxQ9;Lh~JeZumS;@5YzGUU))gs25uWaT>G0Q44{*o zIVSEK^^_deqKh*49bn+Tf2EHc7FqsG`Nu5` zIn>j*U*VC#?{kgViTWaCaZa951?k;8)CCciSK>|o+vs&O0G zxDyTB34XXU2bs9i53O%*$l>QC#qa&-stq~JHgFsH;eKV!NlU*O-+zYtPCTh`Gi}^) z2JWlleB|(kH8&*kZDaC#vBrH9A~N`GVc=fwhkKKyHw2AI&il;_IecH+OumC3V&iUl zFJWi3V}1BN%NkRPe6KTcAJMog5yB?;l})b#m$a5x|5?G+u|6XvpS^wV+i1l4*a9o{ zHepP~`jZ485$n&)Hg%rNx^7J~>e^8AbfU#mpqo+G7DipO-B|w*7OsqIW}CRL{Gw#| z7=~zxx(0T=n~>qED-tq{4SpL7E)NM{eYvNVY?2mO*_@}hK6tE|I=$81xE7K`0wl!7h|Veb0Ez|{ zA*p=tuCnq;13amza)~d-$UeLJ@j3|sKBA4N2fWx%6}5dP21af&xb zl=LULji8NGOnMJ5{YuhTb8|sE{e`4o>ZPAW`j^}f-%j5ObO_?^W(h%HLV%nezXUn5 zygBxg{?gALq)nus>!mLz{jWU2$1Zs(>EpfhGSUwm^`xId`t4r&DAJpH=>tfAl>779 z<#rF*r&r2kcN-$(jFFMT%Y?Y;Dg zq`&lo2WJ@R=X&WqN&hR4f4BKOiS+SadVSIleCJ7DlLz|kUiwzjn|kT1NPqN@2j?l$ z&-BtGq`z~}lYTnsd0zTB(*MEDN$q+KCVi@x-j(!!f8$Bd{U~A!z4YVQpCQ)XOW#ZS zOFYNhE_V~?Xi0e|CR$RCYDup%$M-d!91oK|!%HtEy`h(WJ?TsKdvHdQ-q}m_R{Ym{h56poLfon(zhjjhL@g9dP6TghMgZ`OZIwjwvgW0OMjd6$}c_XpCEmx zmmVg48~5?IE$e2|Cwb{tkbZc#C;cGOE4=hGNN??>HzWO-T^^ic*x@18$4lQs`noSX z=|3d>GB5pg()az-lm21SXL#wQq&M`^uP1%UKRh@iN$>2X_anWMr&HMS>`3}hFZ~44 zx9#wx{|-Am#3p&^pOb!=+wj`>)udN=>Ccni+DpHO^k=qvaBd~NkC%Qm>FYl8q|YV& zGB3S5>HD^M(zhjjhL@g9dP6Tgh8-SaOaAV`*+P0}Fa2%OD?jz5e}eR(UV51HZCgF* zZzg?`mwpB5hd=S8A4GbEmwpE6t-bVSq(8I8gL4c!ImG&S>3c|Dx7m~aL((tv(qAWi z-^ZTx50gH_OD`q8p_hI==}SKH;EW`_vzOkF^vb_^(sv|%sF!{M>D&J5N&g*oa)?dx z(myBt@Fq|CYSJsb^yf)$?WNyC`ZF6nIJc7C$4kGO^mQM4(&v(XnU~(3^nDvV>D!V% z!%I&ly`h&L!%hydCF?ynTS)KhrN2#j@LEs$ zL8MoB>1UAM+DmUn`ZH@hILEMKL#&UNzK8U6t3ByIB>gfk{dLm!ReRDuO!^Ejy_EEZ zUi$T>ypNbl^WzfF4OTb}e!kUrE)50k!ag(v;Zq)+nFuOR(!r6>I$(ks05Ge~dkr8gt} znZI~&j$vnpSRXHa59#aP^rZig^vk^T*Gb>E+>`!c(r0+-rKC6X(yu3d$r~P=k)(I_ z()*EK`MM{4N79FS=_ioB?KMyO@37-TY?7D$Ip`Si^iNKVc(9is=MLUyj+b8bAU#WZ zwwJz$^r}}p>1UFj@1;*5efP_r^cRs{=%sffJ;_UNL;B*EJUF%3+aZ?WrGHKOYcG1z ze@uFgm%f7Z%`bS;KTdjqmp+g5L(hBCPb0m=OTV1-G%tN1>C2w;;G9l+wwE3xz3N#{ z`XlFpp6{jaB7OHWp7iTUFZ9x1B|XVYe~|RWfA-+aAw9!OzmD|Rp7x|4L3)mteh%rI zpYo*dKzf0f-iY)=PkPcH#NH0E5-3_eo#&ga_wY(zCtvMWk0P^Q50idOqmR z-!8&Y1hXFZJFf!gY##~@7?c*QxRtZtr3V&sqBZ=II_fT}uQ>VlEzpB2cb^a}>mk$R z3*`vpVCBd*^G9cn2+98ckLt7T<*)^uOW=%tm$SAibLh0)m>UjOB6Zo99YQCp4n>A! zX7F?c9Fx(zOH)h~_xk~7;Bo>P6Sr^%<(Va9CYt)qJ)F$NNqsm{Fp|1U{~9ABCrt0+ zl^|YiY@f}tWEOWwW&v`wX~bjDa8U0}`XkE}`j^R^@kQ1YzMX2YuNm<3Q@Hc-NqXkG z0B4zDI(VVfI8=SCF@DQ2Dc~rS6-nLvFXkDOfkVC0nQtk1L~@y-#_4Iie~mPpl!n78 z@Oum<*9+5l$^>rSRL4p4R7l(}lY~W>vX;4O)G=Morg6F~A*z-DBvHkLsNH0WWrO_C zVlCTU5Gvb%v+c?=Hw#_staL3^iPNrd`m7v62{gqco$Oe>!2}+0^0{2I%tr(DBS=cs zB-Xo@#)X#wU;yG_qIPbg*p^@T5NBXU1OHk@iQ_Tu-!4`6Y0iWbc!mi`o!@ML$0#lu z7&cBFHksm7zw$GlI$bV=iT?3F+C*7UO0Y8JaCN=n#_?AdYu<*6U_nh&s`sR<n zf)x)@Ze<4``l)zffb%%ytw9#3^4=s{ZopCoxpyW|8f1`X^R*{;byE_cY;8JDVa-FH z=ty!C9a*ou-bz)0md&caOj)HW(7x>nJAx}d0ppDWwDBzRh&OvKhLbh~k{O0Ff9<@N zU_}p_u5~^b`OD#%u}X>!6rUltM)|5n?vak6Xeb#?D;la-o*b9)Brwx1F6BwEPsj(= zFMz&-D~4pYgHVGjV6aNE(NKLJ00N~ZyvxLc}F>#xwS?0 z%RXw5GruTvAR0*jH*{O!=~c3+u=8N8l0^oEi8@jtI2NtqC13|D$7c?l-wr3`B?l|+ zXJL^?wWIkWRDC>U{#YF1hodPgZss$HRtp6zjLDgQ3(WJ1|Adb0MACtwvc2^~$vARr z)_+3%js)-i5!_1qMy2UdR0D@IOLKbPM4f530#@!`#pj}Ga2E>o+Y+32jHEL*($D9I z&e#+Rf8mzXaTAl`{F`%|&}b?)AZ2d2DpY+mWqyOUp|YP*m6t&qGJi;080XMmczj~@ zQ80*eHj|Hr%2xl9*KhTm7t&zJ#WI#etI5MZY0g78D(2X6v87%_s~D4TpIVirYpLNi zx#7(fx=f(qg&vbF8kGG)Wh=Y zAL`fN)#W3(B+fGo{4}2Z8$Ak)J1v6@8}&i6gMm9Kebn)W@D2JsX94p}20wp$#pNgN zpLYZhUZcY3e)8ar!cFzzUY81&iLz5qlLcvfY09!YO4<6vY7~pI(UhEpz3Y};$Op4f z_DG{_A*MK2>9VEQ6sN%&q&VB26JZP-h-SCo-=;&mHe{TCt+Wn*mP3Esm;SgfjvU(k zI3k2d>K3_(b*;Xm)ATz-)n7IUMH)0iJ)24E&u3v{*xdWV3Fn{##Cg+G2CBpPQj|E> zH^@Xq(IQ)QX-3i0Z?XFHM68$=`2)R-6D70xpf0#m??I{4l=D%iK5-{))n~@pb@~?Z zPB2>Mr#Ft*;ztUA(VpWT{}h1Lykod~!#@qUI&B8(WuGr5L63ONY(S+rFTd`3P5gxH zrlLY+I2GJkdmfPAsMG)bAMlF)ALC_eJX$V#u29Rv)ycu~2cZ@GXj8VQ1I`|8IrC!t z+k9ph{M)PuF7H_LqQ>a#ML%h4a0k1AE_nwpr|yomKpat4)z|%91x4y7t!EOWl{_Eg zQWGhUwc+um$J!P@iv00h@#nM}ni7Hv^m5 z`LO-KEV5u0*=Qj`<3fly&3X8KG3z_8DX8@8^a=qD7Bw&D{{Ib^@=0Hie)m}tKM zcF&K01<&Hjto{X@o;b5Lp{jSIC#U}c4s z9M;b4x-A!~X9yAvEPFoTEX5wsUXqlvtn08&dzvypo~iLXf$v7T4!@B+bqf1KLdO|J zB>qG`!OEOg%AWq}{%&38cbl@^9W*JC8F!N2c#yEC=#b3KDn9vI#V4;x#a~jPebl`M z#{R^GH;lDYN4(ZhM3WMV+^@Pfs6WlwaNRF*ykZtzBD#su*gPJGtTva$Rk|Of0t(@& z6+h_V%il*-!(;oBtILyNiVZ^83o|(>IIj=0;iPmGF3C7$WA~jkr*e=}LKdT!K)OXx zZ}ch*;+O#3Na}uTg3+rOEFsh>aF6YcAd$;$%S_lsigV;=Z3)53r00^0|J=Pw_?0j# zaKq6608n4FniQ0Wt|E_vC3JqyRfqKv-=s-P$?Cq7jIsEdHX$5iTo{VZ1b?@Kf!g(< z@b*ynIDbtJ^*bJn9wMA#PEPukb9;+;Zaku=$k3*2K9Lhq)R4$!DWK&=u4;hfFnS%^ z;fz5%O>uf#H3*iM37_m$5P(wyV-PaUIg7E z{J{D1(^U5i{?wt>tIAPEzsAQrEA$BF!FLw zeTEgpxV+Z~gPlta zb{1-O?)PVhmI-xmU|ez%wZ&S`IEtevn>gJTiI)jCRUsOZTp3R?N+oI92R`P=@wksk z_yfiRQ{ii~=xa0RYhmEfaooioYgyD!_oT%w*gE>E`Y~Y{4s2zkaUKOUv!OydV9*aE zIXQJmPDyX@GTZJE68uEVGY`>xWJ+lgS|X>EAbOcn;uS7xzFgnQd=A&(La(eoEyPi`ePCIs!sxrZMEM==@+Mc>KnE95xTt5<0#JYr#? z=$mzuEOe7V;ldZDO^{NFWv*_o&^3c-IHYAn!C+y$`!$hS_D|iKqhi+3r2M`u1u}yHFA&dV7_Kb!TEu%@Ba@ zQfh{F@tV+;&?qPHe66^h6WwC99R$mZuz>UJ5K7m69LMUGVxX1=M;_%uZJ=ckEgJZK z8XK(XS8H+HJ-uqmcgm|un}yNQ*+j2M4#Ax-`XGSJ)q5}#(|hF669LexF%GY7oH8U5 zxaX5*Nf+`o?~9lQ9#TmN4_POcIwV**sO6x;Rfzo3k!H|aWHdK$3VK zp5{RS9I{>5{gax;xn)%;xwWhF!h1vEM>9)69!?d}D)Qhk=o#`*wRHR*9!bxOPE5}2 zw>G%wUeH6;dmDhwc6rgM?Z9U5{aeW9;o?Sl;qmQKYW^HT{@s%QX+4Xk986yLOgLqp zFrCtwL4@meR8?p)%mq2*9)TQmb@PynOyr@)WIhkcgt>?UkM%_J%0m?#$(wrPO;iH? z16>G8lXjY(7rqw0z2p$}Ag5NN-P2P0=0ywOF_i>R^hbyPo1%4T;SH`HVh$Rzp^OrA z@pY6jsK=nv-L-S5GbrZ5;EF95CU3x{YIwiZ!FdC?t{n1S##%srX{a(x>hT-vnAGqy zHmf1~U%vI46skd^2v$ySnR9p@Y~mm~{P&dYeo@{qxMFsX(yuiOgUP~%A<655D{6E5 z9ShET8!YFYfuTIQ^5NkPxz&5>=ayC_B^|2GJ+htuVLD-W#|?SO>n_A$z!)K{gZ)(H zg}2be3v>G&4My8iPpE{<3xwayOyTdyiFugS%S9y@&1dCc>Uq(VC;fCHlD2O=By!q| zA2&;aDK$>HaPC*Mp}fW^HBV3m8<3o~_>jm1;e;|EMhELVsVH<7t%m8SLTQEwRamS< zB(xpZW(b0Ezy0yVq*#ua%tGne5EJyDN+BaAP$on71s4R9L73+Z7dh84nS3#s-zZOG z(?B4cSR)k38YPi42xzg?sC}l>ErsfmK7OInIZYR)ULq+t;=zw)`Ukw^LX9C|D4-=~ zAz49Uwqrgl+j;g9ia>@c<(b==owiO7xLL5!1#4C|^BQe6<8cNm82#Uz>p`L4D$68P?KnBE614O2$fu{}$AE)dt{L|fhY1KJbjw&tEg2+)NY z@UdN&znfRMbq7~|dX?z0&^t<=I-O0t7={V7g;gDuGhyL1yCDs(N%b>U9b~a*i zeY=-^6x48tH)u z)Ve~3ph3AH!M>$#;2C&vh&u`^T_TD0pNXiX_=t{>tayZOOvNKtz#SkSQQ~+hb1_wc zc!XEPA;D(ah!HKkrAT!`lbZ$>n zAqbzx8zws~DSmZuZk{*;H-ZJv&q>)5Q6eyKP8!A|)iI$_UR9h*|HhoL*35;(icv;( zsI>~~Uib-*+^}vLi%mp`+eatDIx31`U7aL<(Mi^oXQn_h5TjOi=~`+Z;{(mYeKZcO zaCDV>FQQ$=1IU|f7}UKEOd@BlowL_}ky9F<9sE9&ud4<_qGVh#!u{v~4~-?wxg8(G zQ96jY-q9^T&hyGq3WDOsU4?Pzp0WYl1$S{<|`@It-TYtOWNK| z>T=x~Xo7diyl$fXVSEy-_?Y_h&VQ+Jv_Y`^KG83lPJ;u=NZE9Xu8ky#XMj<_%j4VUvCZ2bW zR@b*^g4AYvjawV=2LG2|TT?$&yAh*{+fNMjTRnYzu(Ex#lH+F=?+?|k24Uuq&>5RU z;Wh4CkdAociD_?CC!0RlnC4|wvfVn-S#1I&vp~FTyPPo427*exU2FKUplr4?wv!5626%%e(wH z%WF~G7A~pBr00`Lf)7+7GRR`>^b6N$p!$J$sSV?$j#s6A&>5xP=hc^ffBGABoOvxK zDw`E|K~1x1nDA=TOb zn^iA8;P4WDNe_ec6-H*Tws~bQ@pr*ursNXer!CwX1{bTYqbV8KI*=>c;@$a z#q(`cZ2a;}i04c6FQ$Kp4#}La(4lt}G|Kh?ZTff^d(>)=Lp{=oy z*<5MQ(m&Fiw`G$(h}slzMjSKI=^oH#AFMDvJAZ-X#2a z6cb%>eNANvr3a({xP*LROtqEuAtGkP# z^+mmlzMLfq@1aHShFD7eaiQhvmd6kaqjh&=yHL;9=#UJ;u9L4>yv6FI(2tmlt}yi@ zwMbaQ7urIhpY3E6`Vp~}uB8;IpUrp2^;6u()z6f$=;zZ8&=2O;&399_ek4A7R;2VB zeSC}J>mh2sjV&5x&Ksg*!~37Kq?v=&3>3na9-&BsEpGQU8rvGNi$sK?=ap4I-5oC` zH`M$~hJ!WBop)ynx1DG4f-3zd8n4nDz1=E3G+z=Wvr6aIiC7Z$#`*B;e=~k)RovC= z#b4k1D?O%S5!_5maMLT!O=HE)^ivQ~lp6NV@_##CY9{eg4kcnoE{zi9{G*p!>nG<) zt(&l%UyGN1yS%o)R^EdP<5IpoUS1DX-qMr*f0x&yxCP=f(YRf|(-Y;jkC(Svjq$tw zMtQ-Cg}-l~m$>$Mj%lBv9;JIYH%NwpD>f&~8bE~7Z6%bp6rgNzz4Jt|Ho{qvxOnd9 z>8hiJV)yp;Fv80dMrhezuwv)$@*AAXC2}s$vrV4!dz5~e;CXxUX0BW8w+0dD8QVkQ z9T?x&50$Rw9A@aq4*pmD^T1HYt)b-4{oCN?-Ty@!EOYu5iJ?6y7g+tR3*yy(tcP3u zmUttAH&%C?gzBdxs&CtWu;Ob~f7mz|;b6>w!3jrQT%A__qCCV}wDP;uUH#$?C~xjJ zY9=V3qn9zV5C>tsyMza$zvoW+l_fl{A7W0{xgBKj?>a8Fjy*g>&uy)Tkm)AcUlcRbs-N3z#1!}B zxcwX#M9i(aqcIuMt0FL51p6Z)(<^d9{kGrn6)T_NuAfMc^s0yVPnhb&%ICE^-7zLa z(--xUVQ!Axn5#|a72K!k6Kzfdb}AajLl9#GUyo5wLjR^@ZCmv><&3YpZk; z%>0EQ0Gas{U6ih+YSw5vWT$oXJ9H;wn)tkMYZyiYZ5RptOZ;>WCtv;BHzYh6#ljS@ z$VBOVx6#m_KG)T|YUsg*e-ky@O*|M?>xbJzxkWoLId(W${wUK$&-;D{n;6D7A}Brd ziuBsSw$WD##!Zgg%stGuaVOfw?N}dhG~So}Y7gJzV-C79MG^L#%5VzhQVHE=kGQvaAuY#8BR9gNf4|+NLj!zJ&Ccp9G)bxx*SeKrh8=K$3%p0f&3uJ7*{}a zukC&~b`5S&rL)T7ed#q_-M)0g9b#AATf(khazA{~qo{;^!M|)*{^eULy!3!b3I1gn zxrKj`E5tz?=O29x4c%*NeX&r@9X!2;6yLEt zIb9&nA~_J*LOqU@#pz8mYd0&6BOm#QPrQ&3!`ho+d8f<4Lz0eP+Gy8ai^A^DtRfkH zCHgPPs-L;`6KPA9?=BRd!$nfaOh(D@VqU?Rs(|ivBKItl#|<)TKOu`Lh(THxVHz)y zUbP%IpZk6g;IR|5ladsXP(JySQo=1WYquykm?jLpM3v$Sf~B-AeuSl{ygA6L-lou1 zQd(>p;3uu7oQ_Dcm#(F5*T~o?b~7x;Y1JIIaR|0y*aOxs(WqqpBafSImL90024NC! zi6+%mx*QZw60Cz`NB+?|cH`b_9qsyR-5~WcH#P2`Gwxq=?@_T0xTn}3;x!srkP^U8 zIC8Y46e$TeY3@xrZ=7wj;~S2-b8hN2tb7)Ob@sHIS>0>#F8;#qAI6$sE6u#fn=(Sq zEnAn7ht(5Q_VDP0WWELOi;}r=q6F7L;p*J*Uqj&|x#53?!rLhMBr=A_N&}CI=JLYd z<>GBw^nPpz#`P7-cGP%14-#|$AHqxiS%eNhEsHdU%+Jf5Lk}h+^~gwgGnC1Mkt^Un zA62ioBi)%Vg=I$1yQ2|>fp@PGAHj#FIs0Eybx+6Q#qz46E}S};L!(I7Y_dqcv=bIk zYnpNFKiYo?9(&1!@mJ+ApZisL@Y`w5&+lmbb?oxW^?Cuu4htoq=>7>m5kZM>>Jrry z3+2cXxe|pX)|^R+K8HK3qX~s~;j@U`@OOFPPw?I${80i}flAzgAu+P&=j27k^v&z{ zNwDly5~3|H9TCagD)VQk8UJ{{Slb3ZO<7xG7 z7J?=#?B6C+Jdkh!u6Z!K?V!&epLr+O|7^y6UPR@|Lu(@3h)B`av_b5(f@Kkm2}VRl zZ%w%{SUI-Mpt8Lka?6gl4wfH4q|db&V+51yc&=ru#1cLh7O7XenOaKYD$}blAmNWY zp*!puw@~k9%R_D@3nHU#Ir4l&ZqHt;FL8IlUM z6l+bBdlsRWcc(c?(hX@aS@)_}yI@7dqWhR0;#3%qsu^X7RhdCAM82wb%ZpwFAD~n} z984_QhQevOqKE3Q1G(Y6{%N`4(f!jSsi(Zu3{Inc|KZVV`{Ps3;xk>{ek!umHDfERk_xD`608Wzl+V->!4sArA`z5$rR;d9{DD*$mIL#-Ju?j} zjkw5X2u8k>Hy*FelkpDYl|1w~SQnNf&Y^@bsO>{?)v%Cy7RscD5NT^k$6gU1bn^4l z8N;xyZ))unu}sE!ur)-F9Bu#jA(w&ptTR^Xj-4S`saFaXO!n713nFJYPYa$bRFWa7 zhMCJ%ywSjndTuLHiX#uwew8lR0`{&*v;f#_QVfe%nRS4h_18IYPA^t@Gh%nkkR;I1 z%>>aEP*mRXrq?MiZdj83*Zc+M63Nsv$%*>(HStsA2kZ0HGj4t09i(l3foIw?1?O&I zLKu_EpbSJc9Z1F*`UBmPXiU#0NA(hd-BLh&n00;6L@ba&vEh&2JIlDwcJEPK37^w1 zGzL!GFDyff|G_UfPz`wx2`}ZDESN?r;BYT2oF3P8Gh{$5INdr2-vDk5MQ_D=BfNx? zbXf39ro!iLcnf#}^qVTcCu>ka?=^+A@?LJw&EQU1Hy1gzUT-W<%;sDIMoIT)3M25x zieVKS#BO5j7)_lnc>jf^uUr>jKxJC`a_LC|f9=dsgR3+Z!hzd&g&bGg8{L)KFvQJ) z5Kw6y6PB*6f)LiwWxWPEyWDIL@({;5-|cpdLdB$E*LG^R(0iagxxs|)^PvKYmf-|k zrs|RDmM0StiP~Eln72(Vk~;J7UA6|vAMYND~s8Z~ z;h^S)_u~tUJO*;=1?2GXZY+$r6G4`KqXoIoXB82DEtV>&crZ7-@xtyqFYNx+h26gq z#3Az+iZJTR!g+gw48Pt`mjUYXbVCH(i+=o#_a#xhrlL+H{=Snvap{3HS{!7`l|~$r z@v7r*F+#MQ|BtpSfsdlP{|RJaLERbHjKbm@V*>8XRvNLSX`)FF-DIXB78TP^D@{W&UjFACfog!P%F|%99lJ#I zcY7yj>{$3`ojFlI#92~LyY_obQ}eo zRD4Sw>aI)(to>IW(+1FyQGmZTEja}Rfwa}LySggRa`YTNI z7m5cidwE(oN@%j?SjSJM6Psz(qRRc+_uDu+He7^)14d6gk zS8z82QvH-dUK9&L_9aj|+VT+OE^Nj*LKFu82sNz0X?Xw3MZD+9>N;eYDE*yRy60-K##eq1q8X5YB3S zC<=;wfWmXicfj+A1fB{1A^gSJO>OYErW&}NzF6S~Yn#rwX;a95YA&Qf_O~YSPq;F5 zVuF9?4|O5m`MLzrS zw!<=Sm!6YcW1XrfY+4s0{Bq~#vQo;9&G;|E zX6bgkt|<}q1kkh&tEAr;(PiuyUMKMq4Q=@r)yxdSjH zk6%1gja>S^5xr4*Q!i3*ZX%)B;>}odtHG9u>|Z43O9i zu{8(aWR9bA&c%*FuNv$-z$@a;Z)vq*edn^6Ng$wuevoh?=?d&q5AclPqoxzNOkW*iF3F%pM{c;)1>$rHNd!877AR@e@%OB}A!BcTh$oe&2M$yA?#8>Z7 z__082ay3aeCzIgbX8j$hA4HeqfSN?;BA(NhQCeXb0oG$YeG~ZV@CzEycns-)0hA1J z%Yj-T!gxaT9F)topV%#UlGuBoQ}%#{&l!8Mkq*#k;L*LJD?m6*g8*gZ1c{*x0)GLa zT0l`C1l?f)jzoj3;|GBi{2;Ir38H@Q(aQsuV)W7vT_(T6EEmvMArXWh9A>l!UKH44 z`gt72-X)3yz$Qq|SSG+xe){G~+&J8zs|k%kwH@#X4Q38_NsS~{rr{H)WX3n74$|+B zE+lq(W=W97$@F)i8J~iv4U0iUY=KY-WoB$SpuF z1?Vb%a8DdbL`g=zS*J;mSt4ESqrJYszyeT_|0r99?zLb0S;4RUti;O2Ze?7TxYwXX zJv;MD11tKqpOp!w`c340rDJG62lTYR%8_@Zps6$2FG!)aUtU9|_MhIzlMSW)lnZJU zWcX;(&z{BecZGHt6uvs6!e8t)0Y;v}U#}IODEbw?DwD#0luhBEf5rt1kcu!i9w($p zR`?YdjQ>dUHR>{%zO3NaHddlg@;T`&_aHfah~|%SO(*Wvyy8Bfu3L0N}PC z-?LK^a|O*fs84#C*(5DTv#vWUfgEz`A_@d~6X_ji#vf2s<&>NuMXm2DLP{+q-b-qF zfz9>k&<_j5JnR#5FG=`O$P@FL6)rRjq-_#3Fx8v`3BG#o2f7482YVYpP*%*D#WdYb zJ$)rx0I9?V4s-+0OtQsQMjTM18y9Qg8@Zcf7Xk{!-BiljKfwZ`QwgO^@XIPITA+gE zRciCbCL)1gS(FOFvM8N;8To$pjF*xZ>faajuQDqQI%w0;Ai|-BpP)-)Q6+<8cf}bS z0UHN#Bx_77mY)q{dJgZRy9}^ zTy*yVM&o8m@(Y#68!udZ{MGFGRrLUyt1m8*2Rw`tTNQa6AA|ApA;ua|=mS^_z53%? zCG9~~r*tv)V~_}5MaUy9mwn-CRk47fXT4MrfuJFURsEVzz!BO;^i026q+7sLQmAz+ z@DeM$DsY1e7TT{O(jm)=nS~pr3|9^S2Mn4K)0S<*EvG)+2qnUdVMvUW;R1HgmVseT zf8xi)giy7G$=`KFC`$qppp^j=Q(^Liv~Uqn8VamZG5H1wiVk4{T_c8IM>2-`c^c+z zJvX5v_QyI;$$d_pjfQnXIlVoM9Dda+2f)xEAITo}ibT0e7uOspHi^Kc!seF+*27=``lq{ zM#+2t_MRssaL$c)3wW5EHZU#?Ky+Y@Ww7q7ANS4mM{}o&HRO_{wK3#Ru#A+qlhGY5 zEC2Z;y$XaxSQo3rx|mvg#=01GgAT)C!x0DrW4nrY-ZnO&!R9|+FOVxPtNEITdnzQZBcB0HiCq3k17R?Z>-$ zKGSH}jD#T72eE)ovd2dw^N*3Fn|RGqq`^*m^bcGrk!d}521u+Ai8U78Ba_#eqhUPj z5nH(?r(rU>b#;iwlsoxoFfoj~^X}5Opo;Fs$K3yiO3GhPT&VQuzGwL!qBxePGNX|+`ozDrI+(Uig(#pft%Ao(l+7rknKt(5* zJO%%ttH;lpe3$6XxA0|c8|$~Q)VCyXteq`yuf2O4GNV ztmFL+G~m;=Y@*tv#QXO63)Bj3Ayo_t1sS0XLC_d9$EhyLB^ef0gtmv_OfyIOB`PmB&_G<=X!A5KzH0whUtw9^0+_%vjCBwf`tk96(pw<%os^D z!LvSAkQD!i1M|J2sS2jB%u4Oi>~qog7#O*J`G^e9LtjH9$sXo16W^Rf0pZ+MWbPr z00tOvJQFbD?f@JYi>2Us0$%*bKc2<~;!~I6+(Jyi)Q1LOk(WB##J#F*J&9FzHzq|! z4;*L`P{0oR^uKXk*9{YNEet~6={&}+tO2_(>H@$am>7n%(K$h}Z~&Z^z0m&WLlo-_ z+d+YYEJC>vPq{U+fV<7A%M-lvGayZ<&C=yl&x_zt*a%(;DSiK@n>l_pPq!P#?Mp8T zM5$aO=45UpUi6K-7p@}qx3jRNq?NgEu(^fBFpV_CjImU1AbHAU?_Vm~-c|kNsGn;$ zLHF~}4RbU;{YPS)qAKfSS90n-ZA&3KrwNcWE2jMNi{POe&-ssm#5jFTBUXiL23KF= ztp%Kb|G~Dd;Bue)Pv$D$J$kR_ES=idAOrLT>?^uA zXv{uWU4@L<1JzZbG5gz~l!lGjZ}4i`-gwXm%4!+<5oo*MkwTay3vL&Rh(*h|&1T85SQNT5L0uHdY74BMQOCA)zmmh7p}PLjO2`zt~9J~(OU!uKS$z+M6AQF zcw~QA($8>?Hi+r&n`0zbhp@VgZ!mDM3XFjlQEneek!)fIs8LO8Kki)X=*2jH^t!3) z{Lyab#(FPy_R^fi_=W_N%Vk^)g&DVt9fP7(p?D7xscrWa~^J-h09*VLYSB0JY&%=*>7r^X=eUB`(1K z^3Y0#vn1v`N8xWr;Yag*L0LQnJ-Aayct?d?x_1Nh20EHv5B5)kMw4YiHjtdB?Yqi%=WCrI`jB?pN zg%N`+%V74Vj{3af0kVCH$97DbBltWLJ5$(#=HiWrvWFq$n-~DIyB2`mCfOa`bG$KU z59jJArN}HF)*JhrKs2?Gbam|flB>&N!;a@{QB2mlnjXWZt;nfwZI$PsVFbG$X5Pn> z>EZgVK7SiY6UI2lx)fyu-9E0H+MZNM@DM3u^MAuSqu~V-)avud0JPw~vI_+eygn#I zj`PsOffQd`>Wx55LGh9F0J&iGxmH@Pocaq6gZY&^pF|IODh)hD6Jm(lNp+RHABIEc z7|vqHUd@9re$yV}6j>Q-+K#y#5cf3LbM2p3Wp^US0O*a=enmck-+W3Wu9FUasEGlC+fM?kHn0rbdo0Ol8I@`R2QLhOiW6045y zTr_^A&>w0768rpLCw4Br2via~7lmLQ1@t=1fKmaSYmd(G6t1Dd7T0j5b`57H5CHN% z*U-3L`Do{9zMTOv97i!+!8%rc%as%n%~NGN{<%_ZNF*M#Qc{y%+xb0`R*=QA!?jpl zg1v5}9W)4$OBnT?VXDffhv_Oqld2T5$|0)CA#RmENmW9uvWI7_TY+2Mfwp5iSz@3d ztE^X53X1eVtCOnGOF7T83J{Q(joY7kP%5nRTlvOiv;|evXOGk#05cv5L2-LSi0)dz zGEgP)x^q9HkrM|ukaS++$*N-G1pUC*FVUDl1ntfDrS6z~&ntUNm05wGma#e{&kFS2 z>YA+YpvA_1OhV%E#&hV8ROiq3RM#Q<;$O3K9FNT^ulTCW^{SjGRZ#r>ncf%=Z*j-C zU&gS1c?^d_rS*wQH+Yq9QkDMx9)j`7P; z-47BJ#0vFjjQH15XNSEW#_g~d*<aK&`?)iy4#qsAD+m?H2|79 zVUxk@dh|Tf%Il&f;G{?Wh{Ipy*aLGE;;ae5L^FU|M~fy;;H%J)p4*W)CM3fC?nz}R zgIxP~j!#|Ey?`7mK4V05#qZxIg|fDIF?O~|&{~5ov6XMeU@22Ch{}WC$!Nt=5#+ZA?cHc!(`D4$HOvN@^b0+BRk=v$NPG8zmk@VMI}U~{KeQ`|Uv_iWYE zP>Mt`VHDxkD(fmG(XZlUGMsor4pedO76iUFW4rM3v9lU?`O zEbQasUN~*V#FLjys#orkhEB!{RmV^J%sns+CxbWTuE(G9QoN3dlN&)%;1e0#M475A zx9(R5hkc|!!dQ;ivdagqkK|$(pZ-)u6mNVthG;P4YaV-yInP6}m*?$|8CvrwN=8DR z(in6YHbxV9o8aNYx|G0bm9CPt1DX+#wVuU@)|D`G`JQvCg<=k5BgQ?_LnID^)S%or zyx{DcQ6XZTgNJJQLB8?8cTVNv9>VN5RHl`82z3~|oBdFlp{f&Gu46JV9f0YeOw6V- zRBo6yPXQ5wttz}LU9#OAncpPz^$Yj(Wl#{O8H6MsU=BSwJ^%C$$mzUUlrGU|J(YuW zik!M5tNxnr2Cl8A=^iPk5*U#xm=7`~H%fY%Lfas6DqJDSfxIvc5(?o|M5mCFRn9yy zO6wt?c+0{0h<6l|*>Z5VbtWXW<@S-w^9~v8eV5o0#@IdhE|qNjGBXG4E>FV{s@)r zpA<==^j!6Gw)zRHpHlU6y!tsx{S>L60qUpkN}BE!PVS^D*bK5H5|ckc}= zGT@*68M0H!t><*L8hG;CT2zuA;s{F7CCTf3217b45bDE5aEV_$=S~GM$k!B~1Sm$s z2MDtW&Wmyt-G#t5-?9s+K*DYju9bN(i#%%I`e&{y-cb zC082biJSrD&CXF z5kg{v@t*wZ^Vf_~c&ZXlQ{sc~!H;;K>#pWf)`UVlX~buIFkn?7i%!0X?=a_o_-2OP_y&BBTi;j}y7kXv(P^>;-_k zNA-cH1-wywL$r0Msf;R2F$j2Y*NjB^W)u2H`UW;<-rd^f-1Ll(MdE6${M&cY%p+NLp;u_-kGX=N z2l+znzpfV)LNxh$70CU(3COQP|X} z3&jYaFozIBm1NVZ6*yj7U(?b6k=XXpF+~>G1TTd`(a~Xv)o0IRBp@XM??!P1T7CQ9 zGu>w39jYTiEddEA{>1Gn!%Ku!XhWvrrdV1-mh8#jskQ79avlPMC0CU3AFo&VuGjdk z*ZZzFxz|>oF$9o_aCwD=Z#rWk3B~GlXS`^~>qO#W^;S(zKqS?G_x)1+6@3`ObE!?{ z`I<;oh`|CjfeI{?UmOB~UmA@Ud5Nv5e&D9G?ONGOA}qHn>rWC#z9vQp(HmI{|1+Ylf@8OarhJVWJy z3*acC&T!eWTh%YRvVLY2zCG*Jbc#{(`cT%Hh;--6ausbM_OGZ#UMo;^ye~rIco0HZ zCB|xn_T+j6Rx!bXkYR<-ox+;23ku?W`u?{@sox^+v<#=m_zK^N9Mzaefc7YY2J>Oy@sd z7x=CVeb>dlYq6@VZw0P;ghG#1jDPc9rQg||Y5f9ReMO)A;n|Q4UnYcJssXVHLwudGv@wx0%TKr=%Rkr=Cv| z9UxUL$jy>vEsS;jv0Ct8MpY3Nwid_uD5s0T&=nOK3TAJ`US`SB4)K}=x_#g#a#u^K zJ@j=%_lKz*tuH@YhTQ-X-2V!30FtwF1=6R~iW7o+aRQ+JLOkcY4wSY=q?2>pH-cw8 z$~=<1!Z3_i*6^=5S)J6~IRK(!U6dOWFGZP+UhK zGwKfG|B;BiKfHY)_A4Xmu0qt^4>D01iWkH-qCJwW6X!ecVOUzbdh`U^-RKel^FtNn zQgiiue94p~%DYM{8YN2m)3Kto{Y7aJr!8QoIPEIN&r~}#5}JuClu5iBd%2o=)1MTF z>L?D?#FjlbFY+M>NvQ%ICg30fcWUwV?W3_Z0|-t4g8cB(xo(H^|$~{E;+_EWDK>GA**o> z*&lArLX(P1g(kg}Aw%kFJ2qr;sEqy@?~Enb7H^sebHFS2Eq zj?I8Sop^NxN;=MgbnK#Z+zR5=dBjVSjzvgQ`K06gqthvYNw><@JbFtON}PF#&!l_O z0n;w8Klx^#nMA~xb2d#x1~Fj>f_D#ByQ1<}sGW$) z7hQ)X%|Oe#y)}Gh@6JkC^l$@{Rc<&4y8ia^RCP<0#w*+*+L1=*28kq|E2;-oAcE_U zbP1oLmh`1Z-JFH+Z(ZycL026|XA!~ApH{R^6TyUL4D-Ospc(hnWdZ911r{cg+Qld2 z;C#v9m2qJKn`hGHz|^pfqk5oRtH)oE^~EtYl5DIjG2<{qd@0uQ zjS7Q~W52P`@Qi9yqGl(=isb72+er5@tqF+f3Ee&bfT z4rLGdb?6Ia9PixxiT5|7$7I80AKX)1aUb<_+l%mA<>*zfF8cTT@%t}z8NNTm!-%50 zg0-g`i^BaD)^jsFCX6_^t?Nw)0wpmj4tXeF%+w#VlgB{8|I7+(8sxg-z+YFpKK0gt z0^sK_0J0k)gdSw-BH>@1e_kkKbW5u;;AgY7s~}k4>NnVV{u_^jmU)Y z(x+Ww{;(4Lpb9%s7n}vd;PKE0 zGe2MGBa*}HsG#{V{#0_zo3QbhBgMPPV9mc&w;Z^+5t_W}aE~HOSGg3qwooXtZV@QL zW0aF9l0uK8Xvv~m;5e`~n)Db)mefJ|cmzW&@*_N_T=-K!5DF7*Pxz&MQsRKg#L z_r1A^7uy9MOIpj+Ff5#*08=o)T?2kj3E*s@l!4zP??qOalA1vLlw)^!T7g(a5UUy5 z)=R5Y5bdeYgQz^@*d=NbJty6qDqDF)u+KU6V?8|)fIzgYSEKR0`N9&U~5OWghy#7=^T_m{#x)BnPGkjN=&nIL0`43_iB6(@9xaIVx4AFDeAN z5+dt;w8p3t4w2lH5OFNAsJ84%{|gc2pu$C%zB z_`xVqh+={NiI}S%ZNeYeH~3o)@!-$*;J;fX1HSuXTku0<*C_q3U}}8YmS@Nd=>J0g zLjUC#`o9AAiN!G-r1ei$h@0RwU%AygLiuU&&6uz#)!?Vc;65tjLk?8SvS8d#f1wZ$ zK~xrEIi)XaqyIJ19hTX!qes$#;zRWwgK4`LOwYy3GfV)IbJgr07DIRlCG?*fML>nb zXUjD2@GTvwmpjA@YQDj-=d3n;F1dD>$ zN8M$qgw7B;UD5|7_Ir;g>jeRlRS;R)(_w@a7{pD;fE9e>Y?KD4pMr7jxl|dzV6{UOSXfS#6>KgEazDRpPmCQ% z?X5DSO)WHyGyW!&5ST&$12{3balw}qfao$HMDf9PuP2z(mihpVa1X}UR^OZq_<=51 zO!6vWg>fGJCnY7oiE0^ci5o7kC+p~Uf&&wT{$#6sZw$-N%vi27$L&fzpbAtc z_jf+~8;5Fa|Lxfx&kjOAfcrov;&vg>{3yBg0c?Gw)BvTxp&+RIpheXqVeh$468aSj zp*SlT?_lL&0g)~}#c2G74`PQo&G>CUp4!4D(bV&*)O;n{V$|FQ$qUtjQwXxQ8=-Iz zfAD`#_yqjbfl(o*m&IT!-~x;rwkh*qpMRIK2*8y#{*7>umOP&CjF6bU2O{ymK1>x1 zHlL}aDF1o6rwi%*8@Lc0Z-;Te!MJ(&6a2;)^QIabS50Z-qi#s+pGqi~?t805+%cwiI~{j{2&>FM^NIqgkZ?g3Ea7**z%6LP#|X`n|`Dmj|0?^KlYm3+`5ki^;Gz>@SQx z^LJn@5Bo?K_!R!0qWD|P`2!*i{z32I1b=Zl%pC+CPfJw18iuRB6bxp-`U#7y-k0FX z8h|-ujXCYp1?bXPbZfup7hvx$W6_D>9m{iTIH6br^F{QTIb?n$cMY)z3B)yVY|)!| z%^LX#;!R!5=$ql@<@j6J+~jgO{*~r(r#Y!yJ^;|f^B*|VQ>VH2D|J%4e60L>xhISN zikB?X=(y&WemdTjuOp%ld+Enk;Ph8qM_nVO_Q#Ka$_sr|PNAbsXauvHa`rsdvaEng73C$^3=0-G{@Jn* zn@J5x5pd1Z#m$6);|(=Aw|rDJd<`R{U1j_kQ7gCuvE<7e86?pl(KkbZ0h z9{r0e$xpbY+YGOCl2zVms0zK1rP^BHn24*@=(%-JkWUv8F;MO42wjH zwsfkQfWMt<5!92?#%n-XETE?ic)#;YO|;JORH88(8_)mE8J>|}E~%=ZGhKKfy6~(# zBHfnW4PCfV^E7RsXiHwr$p9u$GXQ_P)Hb$NQ6T+UT6=}S>zSU1{62ZC1TX+iwCm7r zqFpl|0y+6TBAD(JdM*%3rRRH)UhJpSi}y4kj})fxdI_3~98I)UdN-DYAczdZL1yUU z`B$IrNm|$6CrjE+dE<%{`=yRw*e---u>AS+XR&8@_H}ts;9v0|;6GF4e3IawbU}J7 z5jJB$AM`TGY-p~87cfG2$F(5WmhBUGR!piDl1$oVdQpIVF@|ftFLV6zwvs=n`FIQf z|0Y^IPI4s!QD!W{{>z3p;h1%9b}Apfw5gkM$1B7TgTf9-)Uwo#cxv&UE+5Abag%K{ zAtC!P?r8>~aC$bL>nvr^~vOA4>hBcR4woke=9-=6l8YBX~F29u*=bk&M=fvK>6-G z0@wq;(9$z^hEL_NC=izPVm!b2R8M*)JeVv!)pAeixj+YHZ0AbP<#+m}XJ8j?rpE23 z2E^F;&%0)-vy|H7=RvmmB^+*&d>PXRv|(>_ysAx3Z)3(^$O5Yp8&-DbPCgxhYqyDm zC49x<_G0EGpC-Blk?{-=%bNcQ(KNwq?Tel^o@<`{rWGA=nWO-D+py(CYR z^Qhl|fXh7svJvcrGRKAf@2yMx&#$AT>nzks#s8ou;*^$N#thMxXbVm=eSnn3v)VJ* zcUVxsg;sBX60%SFhmzj{7TOoTzf;H7=ng*In*(5eC*Ki4oj!X1lNc@}XTm{c?Vm37 zti2<-sG##K$49@Q+xzl}$o~zWLvwyDYA41KM|`CW7H#QMbE=T?5d1Arht`7ijPR4e z5@a$z&xmdLr+#doJl@BCKep&r^to8CNe!Rj=U!fC;oc3u2KTBw?xp#M5~fV1ZK)R; zj7NqACa;c(3Y9DZRk$j^d8a+%CsA%d0kQhU_I$313}u= zdbR`s2Hbr)9xh7oi}eQdPu_!i%;~|Z3}v2Z0V^S6Ed651ljAU}U_@`AlmQe~BGyo6 zA!xh+%3Nv6Ils3Xg6r7-+UQc&&04TN*oAsBt%5?>-Afd~X_)bK3-;vJ#z))Op+Z={ zCV+Wa^dHDHUEDABiOf*n#r%cq^5}LPX$1SpNeo7^H)1y+M-ma4Kx|P+h~@oxLO2z2 z#~OI<9@oQ+5^kCV5IVd3dS2qu3VB3^OtTZ@EAgM~c2<{i z&C2{oy-IX!DPlXbAxd_^eGsZ=C4BS68&;Y7J@nJL(9p*B(80AP_8#+#)=rUl_d`@l zv_R7H`^_9(bdpp>f=XefvsJ1O`q6_vQDP}iqMOhxQgl-EQv~NL$O4fmuo64wqmXrc z7#Be|xTpss7~oORZa7vEKEy^)gZy_dp-m-obiN!+qb+(;9|%{>iqJs{lPVMy$~rgJ&Tbfp_0}Yy|8ZgU%Q_ z1IP(=od+UOYjDJkrpP+kQm>bzNhi>ZHHml7eojhtv=dGmTAcugT98`^{g=0ULa)~w zhy{yCGSs2mH{Pi#0hb==Z8XjQyKW*xzXOAst3vTUU!K61AWmHsvC38jv1$4sR!4um zk^j)U7-Lgb1)V7n)d;Xtw%}BZrd2#>@07sAEmEk}d#HV=!xn*~T1^c#2+k4clpUdr z%3HdE@0Yu5)T=rebB%PSUkOM0b^-78SL7*1C4zr+WKuVOjXS(1ZgNElba5pZ4IMp4z*Z^^Zt~d^u7{rnT%lCs=|cDilrJ%Xh=3;%5;uV~}{x1@fQOa?w0O_RE=&1*&Nz3rd4;3f? zSX>f2i!KXe9?)_??aw4+EN!##Xse$arZ@uWo5*o}sQQDYDM#i8`OpatCP zMf}y`h93$%E~G4iQ<6vi{cQ>+QVIOut@u9|{J#SkZ?w=&|De~AJzJJn)rQrM0 z20y;9jLV8|K&7TK;%gn-L42P>C?ohbfA8Vj^tg-f^cKPQU-&$Cd-zV8*oJ=Ff7M7O zw7r1ZzDjFJn7jgmhXvz-4aX!v25E#vO8-sGB0MFFas_0241ub3nUF&Ny^M#GzSlt> zk8|fQoUq7;XrRs5j`e5OMmfR&?#xh`?rJ*231;ICW7dUIJ_Ydv-*x3n&-j9;G3N|k z!07`4stO$-q~%ApBBXt>-q93fG3-$U?Zs1KJyBltqae#Q_dwn@ku?hOl4eQ#$E%L! zD%n9uTH>=F93XcCP8>bajD^(K9P6o0@K20U6k>>&%>4WGV{w&`a5sqnDF$#s`;B^K zOaz$1=4a#iS79J*o0ILIKm#fR7@8jt!N(;YQP=0V?V2~zeAMFL1)K$H#&Jaag<{OB zoYi!wm_OllISms?*JR8pm2ijWlHjePS+Wfj2%#;`rNr0b<{Zd!EAY-I+TIoE{Z^;} z%={!nGf?szY<7F*C{QPN4dDJiGX@(ghTh#uiMNM5qPS6mj}#2iVw}@Zl3tLI29KIw z;sb1?3KYGs0r}0ORKu&L>nC7vjLcQL+InSp-Q?_5a!-O?remc7qTt%kYj5`3&!hfL z)xwAq@flp9w-uQDsH=GSZt3VmX}MSWuWxnR6BDHed8KQm)IK>5{rIQ5@|mI^-ITwq zOwEt!`Tfqthk}Sk!%~uxv*JQh89af2sHLw7BpBq`6EejGb)#fk~%$ zEQdqK@`_rq5eQ7+V?-I=KEp#LUS}``PY^;~R3>X6h=rim%F9V}<^?(JT42}4rn82GdwG5z4 zQisux*zMvL*@TL(7kS@Mti?xy&IfoGV|uXOh+fCea4bx`tWzGKg;XQFUU`l(_?%?l zel8F6fuNH8(ZWG6}d6QOzV|IE&V(^1)-fuh8BXM*ehTKo?WXccBJ0gBoveUprY84LE1!H`PbG7#hiyZ4paza zxlkUFXkXsKkN>g+kU{#=#^Pfg=J`R0wsfyK9Z>F9GZ24!7>(C3N^GNYJC9WW>F*hp z;T@>;Du5hU<2Qguel0A#dphXPbVPChnL_{1g|eypGfG7N9zmJ0DF2BwjGP7>r@RSl1qIwk&OZeWVnq&E%WBSTHDu!9nr29mO?6M6D^>5*Oc`+P z>fs8`LptcY0r87HrII|B{zcMV#kn3TF85(?AFM0oe8#k&Q(VVhInFnEe#_&S5>G7Zlaeq=|r5J!J~ay zwV_#8UC-X=whrL~3@Z=3b};cSXb_zsZxmdJ6Sy{*V}~Sz%@_dGt|OZYDVGzN!BKGF zO_5W49^> zo&<0Rmiol6qf=zk7HU@*6149rs^>4B7IVrqj#nk9``VqV?oieZA0&0Cu%LdWeeGnm zl@r!V5}SH@1u*Bbq7_*2m8+g^5gESjEX5YF7r@UAQARpquAaRedV8)LhI>x#N;4^c zl^?(eY4$vvczs}hW5z*LZ|nTMSOLs4X7E*e0_w$?))26H_jA~_#`9^*1>vi7A z#|R%1b<^NMlkjE5<+GK3%4u5HvK)ep9^DhY`qtcFf_;1%7IST1iPI0XMk8wAb8gPn zdjc^rv;rgFB#lW`SU(-NT7mHyo`MI;4<;&NFuUi4uB^aFG)g8#jgx>15jNm-v4h=D!+BDYh}4AP~nI!fGW2p}#bJ%K0V>-MV`vQI_AsO6E6Z=VsY zH>sXhVBm^$LZCeCoWTIg3gl)ew*m)ceER(x>3vy&otd7VzYFXROvWpf>B2E7>M8Jg#;1SD@HDy@;iIi7R4^mYC=_BqLT`CVg=s#YbI*sX2b+A+u|PlG}sONas?B}_D?k|9mQmY-u|x? z>9GF{lPEi}0zb)!$=T^o?OShw-F$zyJ1!@lqVk! zze@X1@&U}~35n@6IYPPN3*+z-GqDr#e0bCd-2&n`9(n?X6r0_axa(MOCh!sC;c=qN z3b8D(yHhQ`-;1_a$3o3maM+#4kBH$Ow|~ZMu=XjrMf$G!Vf*2mf!Hx#Ag4V-3Vv!c zMS8wG8-8b9nT}sx?P=IzifqYt>=ysV=!wbFz9JZ`UFmkwGpG4=`;$80z|%n5@@LOw zW+^;jXz6=KUf=a2UqaR9k$KNT{zE0r;_}t%FM6oBz}eb=(xT03`>&D(b-iW^AyzqJyT@eU-7kT63cep^#2081UpMtilxy%6xb{)LYxNIDnaEF& z)VqDR-V-OtyZ8$7618PU{(hm0hrBTf$aha550?MO_;1UK|Em8g{?Y#i{-YAXIS8$fv{->Y~PvbVmgkgP(647w*dAXko23nDC9!MOmg3T(W2FJe>3 zy2aXBdWl?2Me8-k)KaWHwgwPa`8bxsuYH9#f6KnXd&91MgZJs1+K2a-`$%6)E0NGw zELZ_~vE4L|Zt{4MM&%cH)*Z;-Q7Z482&hL1l~d@e&v)psJbbK$J{4Xgl>eiKt~pm5 z$F7)kZWicw@p!wAL%-d)bg}C3FCZ@e)x-2PKV%OiR&Af}Ap0L>qQ4LF{=K&2$?}d* zTL6M17t7lnq8@21$=gSkT=@$Cf1Xe9Gsh3w|8|%^`A$apZ+vsgs16`;#=ddJ#J4oo zI@z;v%ckJ7==%Q@pQrw< z7`zWGy7q>)@mac${CWCi-|%n;l0I`e#UvY81OCu8ue(y=sGSD+s7fJk?elEKx4uCz zE0_Ji?TcaKc;HwFo~7_>xxx<$(16C=T!p zMP~cGul$_{~dmwwo&2NCO_wCDg7b*4E{&_Tz72; z_$i6-wES+RZ$1oJPRxfPPk8ZOPJqKfq>xDnmPE~*^I@C1*$w9*%J+u66f1R=f@=>S z?M|WbNYe{lYw_fybJJz4fgyOxDGuV7nIW5Fpu*-~**V1Mlw=7_(Z{#05UM!W>^v<^|MOvSPBK7KTSH^9+8=m1!UX_0n@=F(er20kv#YLv0*V z)QXK#v`kDHCnkPq1Il5wXKGh(wFfUP%T$@GJyhyMN&+1vSl}u$>WEgmQ%faa`4S+a zjv9+bDau#6fV1wN?(U*X6rsb-c!ir|S^1A1%~i)0YWpb$r2UdDLYe?WwQUu^xhC}P z30T%=3@&x8z-J!^awrTu2H^#s){JYMFL9I{gD~P6aE`}Nrp{ma)$um{w{Swnmkrny zk@=v#`%O;lNtbz=GPM(AaC^KqupxqvjZ;i*Kz!g3KC3qO>(5HS&J8!*O<8WZ!5$$y zs>dpY4jxr2WG1|>7%x!*x|LK2>LyIG0!T#GwafMx=66xB57w#Q)gae8k}H{BlSYG9 zCG<7!UZ3F*mXW}fCcgBon$U54+0yi_Z~%9(PA`!P8U(jM*7Hfo!sb(cKNHf+xqdlozO!vu@f_bvG1gs6lS7$cB@Z9ouTo~1rKK3JK65O3?0 zFQ1+l0X1d681)aU^J!?0}SGFG=%C3^sBD zmC+MZp1^{R0B;Q<^3#4qrz@!qX5-KUvM3XB(d>lBfH{TvYCrh`{)~8OZ>#;=E#E<01NYz572=uy$U1^W+0K9Q5U?+Ig_524ORA}%k994Q;Qz|qgoQe+Vg0h7g-h`VIFDAp(JX)o^Nt0+eT z6C9d?p^G{6a~wKx%HV%G{-Xo4j-RW>f1tK7E6h0h0F^AS5}t<>l418IRCm1nHYpqA_Evbmc>mH5YX_PO6zjh0V zQ75`AxYYi55qU)BgvgxLWX@Y&=V|gWCY3%)>PB)LZgQ$QUcG}3so)WgFsni{;2yGj zEprtKw?loTxL9DYJ6#Tn%q1u#1m!7$@_34T{*dvv>#z>mnmqo8&x@SiaoPWN{3}+r zg})lVQwPSsGBrL>^p_(}xCsw$6w4U^ndm=pojX3{6-qAgWyBv$*sGrtO4N-7C8m=T z*q(Pv?Zf26d@U47`f5yj;EFZG|COjR$rdfF1olR zS;Y#eVn;T)dMGG)KEVFdr7)q`jg?p|OqFM2`o$_fMZbxdOQb_I5(KbMO^T zZ(5K4-^2AkR5VCag|AYC?3b?sPw`GGpcKRqNjBHxqb)Z}Xg>s$miHSZ?J@;{<2kp| zD^fzd`p&VaizY`%lOAX?g}qCpQG+H08Jes|P+|WcysmSn#JR3bNs^yQm#5kjnvs~_ z-rCoXNs$4_4ncr?a5GgXNEsOPS{pL(^caY8+#NiX|C4S>)h8j5K7^LDU%oC9KgBHF zRx?PrMoxg&=fGNK=7i7a(WW8@E3jLz^6n=oU;KF1?gh}C8&bqm`GW=>7Z5+7m*Xry z*p*^(C74=HLKH~Fu}JXvu+{!0wZ7B$5Vu;!{+upZ%6DWb-<+lV{U2KXBM*L9sRHEk z&FC9zsKj40aQWIk61(5zBV#^tIVFd|0-}Cldi~wErPoI`U_y=)Kgu0S=$esU3HpBw zRmo2OME&_#a>!oa8ByX^^N%kZ!JG%YGIr!I7yY1EB*yzVsd9$;B1WuVDDw35N$$WJ z$}Ig?4DCpL=P|EZ#{QfgS;|LX@23JNbNhSSEKk92z{ze$8Sn#r3v-aB`A6|Xu!UNmw&l!=W z{KWq4w;z6VR#+`*m`L`pSN-9OR-Z6wN~a0Y@g)&TdaS zRNtBI8BzcE%6@I|$_Svp+~YSdlz$t5^>Zy5>c=bc5oVLm5e$IuO(WzH*aoM2Vf$j5 zI<_xSj=|slW9-XHYu`0t<=MW_ZC{+;etw4b%hd*{9H%wWkBd|`d@3^cS5FX}%Tuj; zIz3bD-#f>7l+g6_IZVPL@rMVLbHni+sqZZJs%7M-)At0oo6O}`XDMIQW_b#Jr(qq| zC9VAW$5ZzEE-<|Xuo_zd*!h2w~Y3;Pqx1uh<}@RscD;@J4F}6K>Oq09ON17 zLC>~f`=36qz4+IduJ?NuQ)7_b^3 z?r`R5W-SEg>ocSNczOf&k)_sG{^feCnrm9}CnLTI`|&D5a9{1L^`{nfq`ougaJQO& zeC1zm@ya>^Us7e_1Nl@oB{6aE`-fMtsVkK*&Kn7z%l7U0m#LZBKaQEUrV`s1(zuf` z8T`v>8QOdP<)LD)AD8Ia@Y#xeUa9z?zj}h;v<^=1FU4P^*xwtHoIB~6Qa{DNlou&N3A6lO9x0(IR6WBABYDS!A(5emp za!ZE#%D?RAO|^ugS?J%f{Fi40odMoNtX+OB_p15FSN^5{p)N1jg}>b6cVfJ;NtIbY zi+>r5jcI9wye8pu*}gshG9Xj?v$1&Q;+w_4e2iUVspEV8hxW&8I0%d45% zf05k2kjA}@`ODM{?LGgp@t_oHXUFH5%>C691m}#@)v0w6 zXOBI8IgfeOGV;^ek)?cu7XV~#e{Y-RDfkUYL;?yye}Bq<^gqMTg!J;=S;}7ux6_{M zAH)3R`|MvSscF`2(fxmybEQopSh>-AU#9>|d_m)V_bo!RC4Uv0u00UyeEPzv^Gk#ajFS zz`qC%+efF*Uw;1Mj`^2CEw0<}^N(Vik{^53tEd$&V|`~5P6$tz7q36(>MZ3K?ry*R zh%DtN{?PJ-zs>Al?!@M=R5OB&_!1 zuzh>}<<$)BJ^ym3;q{}@$?9Kj$lPB&U7T}!YIKlJ&lLN+wL|eig8o*Tf6wHPoNVi# zCwdM(Bfp*LS<2g9KTW}JY$6g+6!wp&{L7f*{Y*$NKlz0A%Xha|4*&8%(iVe#_AmQw zXy3nt!FYSb-EH`ncmD6c>R-6t{y*?9g2P>I-@f_F{s6xt`LX5O+O_8i`5n96t?1g1 zjPl#}8@HNY9@vfeE2m4A@*P>qH)kn-|A&_23(8vFGy9h#;mp(gO9`BB8}pal7o^u$ z{w3~BwPe7I^h(hGecKJ2JOMCkJQ~u=vuZ&&z%RPSj;7h8^`dR$T z$D`5-<9w0uxoqE_f0>`D{Tp8TRK_oainld?8JnTK=U-kArcgUOKKYsZt0xG~p{d?J zot`Q7*Gh8k+39~wnt#uzpV`(w-}k!7$Zuzm7XV}~Z+rbT1;6jTjwoFC=kHJXm)%GC znUG$-;pq0uA2_C+a`=~%lQs$Z`}gGAd2EYk4>Hly6LRM?9AK>w(SI}dx5KNJxqNe$ z^7p@ThsoT2d6x1;Kdd}~Z-tkLY7gH;{rqHWm(1@3y));pls)R6+ZI2)_KEQ-k}6Za zve=^vc+oV&eo-fHNVad!9_43he^SC~vwb0rK^yt{cW^Xl>iC{L`oC0bo*kd5nft3J z2+o{TYn{%IRDDfYX2tM~^5+rRnV+!4?bLU6c-1oY=Zx?Sapv-Svy^XcvpfaA8@hR% zPKQ_7qw9|FSMkH6%10KrU*0`wlUGW6*rO-fEGJo2{L~jm!KTCKl_%)`v{zA8PqMFG zedlVY-Ts^lvy_kcvixE;qXCJp>M_5|>eqK5!YrOV!hW4I)G*Z1$cKbLsbAQS{-k9pG(&?FEKR!Q+I#Zt?D&T(kpA(#a$X2xj`f*a(Ut#9{BlNo?pDj#pL1fC@zkS~< zTxAyf1B1L;)tLxK}`IY_sHL+RP;+bRLF~#K8fP@kmM!CB2a)Yq%G<{^uyXSa3Bh3gO5kX$KZDq&hc22;k7iEeR8UWefB_}nF03U zRE?(Q_v~v3MWaZ_e}sQf@V~Wf{HOP83;%xY;(tBx$7|Yco?QZAFT=SZ3h{WAB1GxR z4ClxR0puhQ>Inp=z#evzmXhXoL50=!PXUWF#ghc3FiG?h|Mm6YE~@?;#3 zN1S~;%fS0;eEtHTlNEmOY?WU48aqxw*=Wq6)h;s@4cq^$hNhaI4|}l$_h#u{d_#pz zQDa66o|MNvGzWiU?)=DHyypya;3xQe{qe``Xzp4zGw%emb-7u(e9E_GJlBlX1tT#t z6whyYKEzL_=HojUl=Di+c@>UKq{iX^J9}_<9LlwM*o%ee8wU{Ka1)TU2Jb#v`Ln0H zhl2G0N^+(OG~52--QCb}o*Sr6Zi15WfIip)oU(#r*Ub3Mz^fZTzwH!ClxfNdecqWY zA7ERsqKhI22ZQ>SP;O0j6Lt_s;N-=f%}oi2?M*+IFFSqM2YhHiIXRF*{|EW4rfFO1 zfeKkrM;6raJh_>8g6}H@ahgm%RH6W1{xur^&1&8UxOwc!J^Jfy2lpi0U>;Al!KpOg zOrDBA#*CBLKPWVT6f#XK&k#CdfVnaxPh|luLiV@A6pH9V&e>F_UV;$(D)u$cfgw$` zeMkfJB<7|L-?y(vA7Bh#Z&d|611KH@cRnHUF1!UxFi7vRYsR9zr9MB>JWiG=$(3lQxn=mkF6*u7z$ z(J+WI39!OuJVczU)PaW2X$qct2w|*@#5+ZxfRWPG#te=k7u(P@LX2pbCzM-xK!AX_ zKnWFLt?fUAeN==5CQ)(VvqD8kjY~xhsq`hsJCT6cIRGRm2AK(bWLFRvRHv9)fq79y zVC^z+#t#7nd^k46{@2>wtr1XkDEtgOi$@tDf>3~+#5D;Z(UlGo_38vs^b)jJ@oPL@ zGmwwAK~Ajl1h0Fl;MIxXy(Ubd%!%~1EqJ${;Un3&6q0@QCm|U$K#|PB^a|i530(g! zIQVp>JXbOoyQ3YM`}-Q20>8`wp){Gp7N%Bv;Ps-u{d+-uF+EWUvK0OO<$p_m)5xgw z_sEXw?~v1dWUNjh3e{0T?}d18ipVTKltnM1s?j$2X>ny@+ms6CDpr z3TF>gcrLAF7B}QV?7PuZ$p;+cl{kR`A8?$#i>LisW4htHcxA?%Kj7}=GK}*Y{}_wv zdW0KVjfOi}DgH`PJsz6VV7)>)#`K-IDUYph?iHRnWxrOl^{w*7U*<((A4Fm+&1h?A z;=qV?PHTB=w;BDyh*$%*>$;l`&qK}}!?XkJX zu;pdlT1(hD!o0?Hx9wkUUECTeT{>~Ia}z3-Tj%3$i4naVH&XW~JlZRd&eD(e{=`^R zwg1dZi%wb|=0Uu0t%Ki3FlFxi#9X`=A>;dI?luYM$_KBZql5qE(Ra`6P=`;SLZ45*#x-98fdf%l)z4?@=kMz0EY)C@x;v?RW_w{w--1zLGfe6$*nvMh7;qduNfiJ3k~km`L4J+|b2XbZbzQvz1Oferti*`Bv!k8=awi(Bwz(^u;oe?{)scH0sQ5 zm_`{5r{j4fer90>BJOVNyJ06-#4xV9Ji04r%o&PXTy-)Uw}P9{-{u3$V{e<$Pje&I zwIyXU$Dh<%zIIC__Gu)x5g*&^G;#lkb$M$=>AMrxJO7Z*FDV(>pIO4r_Q!u72sM#Bm|*R74{u_%Ofz*wN; z4W@MwI(^HCcEaQ3Whb>BgO2xKekKoce#@Bg0SEvCRCJ;lI~eM-#*DpT?p$v!Zh@&- zW9EJ>>SPXHOOv5ZMdNm5D)8+_e8N|oiZD!txzt#6!G0LDw>Ri?bk9MLYL1~SA7%Z# zvY+X)LgzZld2F|H1%4aWMPgq#Ww-*)q1w~RqkBTe^b5!*VtAIZ=qwySxf&{rM`z6h zntTrR#iK!ZM9lXBa|f$Ex-;a7^%b^mw1VQ!0{kkHma=28y}x36*96-aZ|UsuJ!ss~ zi%m7}-*rS5op1L^4NFH`_GJ=-detR zE8LC~fkj8PiHDWP-hs3l5gIinAR^Y}R!Cou{VGZ~Ph90h@Tem84`(z$fmZB~^Xq;r zypNxQAW34TgNy7F{-rqj<8+Qvmn0=|3a^4pP7H=d6@Zh$^41m3GcXw_IcLAK8s4n^ zidXr(`rNq>1!o=CnT=7szin+JeS!VM-HP?*vdLM&!74&Pyn=pSny;*pJoEvFhgt^;4*R4pcwA z)X#qECr|x+KUSLWP(S}tKeqb$RDOU)ag9d93XJXFRRuftQkASY8W1@2L6ue97Dh=~+$2BEg#< zCqpXP4juBV-iZ!bsdsK_i`Lx?qy z5?ROx$cCuI(U@)x9~lkez2ajEc`&iHk^TxX+S<>|olAjpt1JDF? z*QI2{%qzR(LLr-t5i^hOJ7Q){-`w)nri$2Zq{|H}4l~H0sS=}H0S*4#XqbRU@SDbL zMw=DZ6}jc5-x+g0hCxApeG5@>6u?1<&99v+Ft%f`3Tt#xCyal+8vjrfg0^Tf2q26f zlxsA63IHSVM}^82rJIcCb7(fgSafvGS+TE%HEqp9>#Y@~?-)@F1!tq+sA18~Mn&l= zBYLZha7!mV9dbf>Dd>(Jf-t=hML6rCv&&}I6pesduKk5;U1}H&N?sRXZbasVMNPCb zIzWQ3L@PcH(uhdSLC=}Y)zn%f`$^_tzO-hBd z=w^al$wwsq|Fpdcd=y3cKAvDkqY^qOXjIVAjT%%Wcx|Gf6F}%dfZU+@l5>WDcp0}!JdJY2q_xtCg znV#wHs`q~1dh4w!b}2ABzo)7-LJ~f6DhN1wssJFfs&+%cs{qJnucrW{0=dk+reK9j zLFXB`CiL%ou0J>P6Pd$M84OfycDV29k6;wMxn__V!u-Y%j5ex!n&BbPmld~X8jHps z(6AZlZCHX>l24BUXff=IYz!f{m^3sP$7I^S{hree9u7yI9M*hQ?g&bMIq<&sk8yar z10=oUv5}8Qt*ax9Iihznj?H7L8nUpV>bbb8TBi28<$aK5NcDpEN7w|sf z_W%R0q}#k`w*o*dpDVEM?1%&46ar8ehrcnsjixX~z9K{#xTiLW8+6aHqbFSMJ?9eu zAtHp(cZW-Ae2sLm#^*Kc1BM?+hF>hcJr1E^d80@#355p-vzy)Y%M_)ie1sV(r zL2*&a14Q) zg40wY5ge3Vp#o+YBL)!A@?H0~H+=+J!*<803d+T(>L;doL?)ll+24OlwU*ge2B)A_ zCZEXWZ=ej0d>P|-NnxMA6EfZx)-o>ONZ|L~1R=N;?M;BNV!SH?W154RQJUmi{0s5` zf)t<^A&x0AB{`CBXZ>f;T{T5ux)BIx9eG)Qs>wMG^}p4s;Q9N=rxCW#0>3?C0(P9Mu`Aw=GdD) zhnPKKKh^<^v92+mT^{=cF}lw@s|W+l`7i|t5^drVnxDIcpO*fF7;eLNH$Wf6N5dwB zNsF0P=H;JAAXp*%!$GnQx$SsaPLR!kgU-Z#jEC?xnTNQI8!0g~%(wsjp5n8qI1CIy zl#X;`dM0{=@6b=M^~74Bvx0M;MK_ z>@RS&3g};e-;e^xy(o=wVj3dQa|f<0L6CSs(W}hyVsO*B zoD&P>W=JIfIh41~!^7~Cxn~#E{d{swX3=849C;7l&aFNWf3L3gnVqXScQ+-sb{K}W zW6XXXqpjTiOF}B}Dh|D6_G^#kGTM>LC@uWg$v; zfXHr6?i%!uF?@~TjDUS<%jkh@Gs1=rN+Bv0Hs5};Y2AXO=$7C9d6XSi@8C5Am(-Dv zL>vUYqeRmmER2tdXhE%7#DYp7T{tyR3Ir3UQ3J?I=T^W~Z1vfnoiWNV3zr&A7a_=( zi=P1_twU8*sH}`0w8t^J*-gigP40PfJlGB$OH*LXHZ*B0nn>ShG(3qY9AA3Kmm2kj z!!M(u5?^rK2|~&bjF}h9ms62{H>Tep0O-a+A^?Ihu(7BBV=|1(MrW3U4=J_ArI!Ni zSvNsMi&>}?8lE|{c@U0d8=4~-HSwxQv%LKg&9O2fQhMN?ipPeb#mIQJcAUfHBXL+j za-^>{!-#_+2$GUL8F@Jbm!q&tMKaGGXHc0pHz(kGHnd&m(fN-|LA|*+rZTR;EU~Y z&YM1z5W@dB;jw&!uX2T62;z>(C{%uX_VW~aiA#9&5?Wl$w;=TLHs~>1zLOAolHI|= z6d_0p?l6aWK04WOrQ1nNvmmNeFTZ^vI-yU?qwv9N$VA25T)uCHF31k|UUe4`URU!Q zGqexyRw8yb7NOzd(8}V_n-t}3c-A?DLnaVqYk{vZX%B> z-xs3*A~X9`5sU=FQvQB`NEwUr19iJjG#UdO7=_RaLg+XWK$ zn#QHX6>yMO(KM&Cmx2PP$UnCagMi=r_y;K@d(Irb$}l*jh7{Qys~#HXAa)S95Rv+u`gr(j2+Bs-km#5tA^v}oG>WVF1($QqQ?tnS zfI<~^19`^SR`1cJKKP%tHRG>YUiUm+#mkn7u}nCt!OF&USpap1u%v;2xjbOX{pEpT z`2+^}q!k7-JQsn?Q(8xI-}9-$B`31n3~@Y2@>#y4|- zFP~P{H>D&L;I*<&D*VCY&v8sFxgPs!9PaYs~xHOAK$|64^vd=*jpdJa7${oCRV(hh1Nw1w3`4Nxw$24KE zJ-_BP_vO**W!==sc-VXxeHG-H*VMw85{u$uD| zkdj&%phCi)xz(IHrv%<1K(YIw`kAew4Z1U3got+-9?iW&EC{Bi=owhbDd_^8tXQrh zDRRujHC-qFQ4-1__Z5(PhEDP-2y8$6G0e;ovLyg<&%W5T9w~}FuY7{m!&@u{tofc; zIB37=I5LKjC*slPG9j2?Az1oo414KG;7rzvCJ#7Yjo z%+`1O{6e((Sf1VE79uYU3gDK2OKXbOZh~nPBPmWq=KjVq*2ZD>Yxs(v{Yx~G$F{%> z4*Ky*8BHCyf#AB6o*vH@Ffg0PUhxH5ppTQr7qG}3Cb%rHLkJ0+A2ewa=+yP7Qo zw*n>Bi349yS6mJ7#Ra5a%!gKxZ2ktcXuG5CiLQSUgJawStF+JnBnj+#Z#H<8HXwg~ zow9f!0Plp%%y8D|CTP>jntn<&La_N+f2hvF^KN{tM<&o8w~AdDOz0>~B%?iUvufCk zwAfF70j#M9t^rKISLeGbV)n!SQo=G1e}!*=a(D7>*WRJXUWs)U|C>~U+FGj3m{j*; zGz(&aMlSkVkVUa@M?`#{Fh45QFZ>snca`rt>-R`?J*D{VmG3Vl+3dl;TuCPg3^K*Z zw|#qP?`65$$9t0HfKXl#rGNo3NDT!H?AB8J(SLwd!LQ=y;feU{k)MnI|K;a60qEEA z^Yef2nV*xYpt}%;2~Y*-E-Z}iz55Z8SXuwMiCWZMjZR5fa2#<7ufSf>Ur}=^?-Nnw z1Q`TIv6jJ+YUbt)yNQDo^XhdNcUhQ7Gf= zRecPVp^mLbZNprh9`M?R03{X_VG=DwnHD<>7h|6~LJj9~)Lf!AQ=)bSkw-}wyo)z* zf%mo56GCL$BL*qhVD-edUy_^WOaKk+vp)wlu!u8iZcs+%J(iqq46ooAEv;mFr*BX}FuJYv@nX9Yc+AQ3dpIgUIOMk*GJkIYdt$0zgYHkWM=J&1JFpAo4 z%<9Jb){sD z2m=!4$EqGlF<{hEFR3eo5Ui^~dK6XRdLY3A7H$Qdyd&)<`%2Gd&nPS8i zK~f2QE7%#2_Rx<(;}zQ+Z1#lI3P7Uz*7+?N6!0C6DnZ+5vYK~Hga}u z0H~3;SF&i@q?I#t6gJyOtyfg3Bz$1Arpn7~K-%Y09czq_aN#!B6Jp`sCZlOOSgqfN5 zM!RE&YI1~{0Ei$+m~OIEak1m8Fi7Q6q-@{xTNycA|1oSD>*^BXMd<$m zrT_UD!b1Po2=4P$MilzL0^e~UsL|8SV8`dSnnlT>JIhMHs1BehDUp5IMT>e++Mf}slpTqtArTzuPt zZ)A`C>Q-76cfN&dXBndBaJmiES;nlhIpt-I#Cs-`_~1O?;m0#rP>3?9uW7+B#UdsE zj;V!x037+w(qk?HK;Gn#N8ygce^LgkyB^`7D|#nr#Rhpz43?-qP>LC>W7q@@*7Guf zoFov5HE%j zpd&;(XA+*Y&p1&vrx4NS$wOUOq*(azwBMMRFEK;qAm9Q0lsuq!EjjheC`d4dzU&fL zhGk$FlVKXeD<4Q{45ddghTVwTx*Aw~n1MGn3L3cui4Z#^(7a9> z$GAjky+J=L!t6GFwlq$K0b>Ge9(fSon}jt~i-~+@->${? z$Xh7BHP9SAjTK6F8pOCOLft3iC837>lT=lP!TG&B!cn^Ad#czKvJ{4L*S%z~*hsOK zu36x#FqBo!@pOmbvV0($r&#EUs(s3Nyrm;P81aPg1TgQ7w*SEmPnL;kftHs*Y=~D1 zZJ!1+-IWRaX0p=ui0~>(GAJ_44pQ1;<365-;z`sOAf4Tokxfl6zyrW=95B3u&O~PI zIA(x2LgoEbdAhYce5Tna48(MXWMZtW(Po_P$cy5IsKI}^XAim)Ah_Oe#<^0W5ACkv z)#l38N^NEfZeF#~Nj4W8=yHe~<{|Z}1k=GP95E}+ z@+{qXG`1PKO3_Ddq2aQqk$aVVj5jNX$irG&HgQ-EVpChD4(~!+*32Q`-mpSoMrT@E zjzvrM;R7VBIQRpE70+NO>}F=v=T&C7J0I&bk)N1!5r$6?vk7o77|&*dC?^Hmt81`M z3}V-Sk!1_aTShLY5-y;?ML{Z%PAoLjd$o?}5CL?#F z%lQ7P(H~lzfbkLfgWQ9g%z8JMKUBbW5?Mk3Hps9tD!355&kO=*5CkVjvTo%({cuC$%bj z?7`w>U=ewi@1<~t>c>JgzVNDv3t-&&I3 zx@RR?!dB>=!S+8IvmO=1uU|4bor?Z0>_Sn(^2`%k-BMH>V z3bb?`S_-z`R5O&^GR=CZZFbt^BNM@d(qaDsQmH_?_HuUO5BT|LX=hRm{4|IRNiD-f z%T-)b$BVOF{oq{~G$@GRODG}H4jrA=}yM_CGNWaGt_V=_B%R zu)Wr34DsPEDV!);pS_+$m-WzGXAD}hJJv!Se$WGsIQ_)>4Z6d)JzvmoS+IQsRwW46 z&#fsUO$$&@8Eh3jK-nE=BQhCiyTM!>i9nn>B^M zt|`bL=3CHIktxd)o)-iC)m2v<57|%GHGWZDYEu zi%zU3pcf@vvqnQzE%Q~brEHR63doI0_Lrwi&ak$xiDc z1RKnVoCS}kQv#Um=S+X=m*<%2o6NPC{ny4;#u-vcS%+Q~S0UIr_IfRZwQYe>7+i|) z1E0-MMy@$(OTI*p*EOIKua?36Sr^4bvH`Tijro@pkSH$u-p;NMWbk^-Qoi} zWSx-Bw42|g>qbM7_b9t2`uq{ATBUmxkqM%lGo#b7O-n_s@L$MGvLV<9zDJMc3;?Uq z!VB>&Od+Yzf-2qES6WC2L87GzkKZ8i$KeuxylaM*y3sdbbWWnF0!uKYi3>p9Y$X_uod_TnaE7RMy?n4@5bmD?;ZL%RP%&_CIs>;a+nC@#Okve261O6+R3-D?ft zlHCgT@FYmT{$(XFIilne9=!h!Ublkn6M>>1rs~&x$q#3kwcWZx=$*-AhZx3Rex(NI)xfvfzfY4fUqFlXrh+L#p@t4OKvg#oFS>bVk@K242cCi;K3vd_`^?K6X&Yy#0X{+{uSs0 zgpqk#g{S))L;5>jquo#x*4u(%6bv=`w$L4xaUhM{Fbb%VD_0h5ShFgiMnZ%0Ekcc|sgCh^nVG%&%u=p@FDsE%yeh3^@5wm_%nXPIk*!9aOrcB*m zA>e>ZiGyU0>0WF~Ii{nasxjTzO0lWl)csPX?i+GjggS94qRC6tSWa#MzjBV{*cNKx zt*ng&qzeI|i2{pZ*=5kp?Do$F|(0nlO%P+4qn`CpVT zl9O@^0F^}ndR3@sjYrO$D_&XVK|NCmAzWO`bSfJ4C|q~I3+Sz^A0D7sk+~dTNkZr$ ztoJ4}(NapC%OdnGHBzmtnuJy)u!@aG)sYgG2k0Xk=sO`+Sr1^3HxK!s>Eaj(zu*3< zG0I0yqPal8u~yRA>V!~I4{fg~`Ups_EPv0^4WLI^K2|z~GC_>NvzR|;r?t|l^e6Q` z4a(Yp&ggVbu2?ncyikfkl5^IF(#phg))ymvr&$|8y|fun=raFBLUVYaN3vOkFDMpx z#(*a*NwzvBS^=S5z+AJl(Xb@d1bj@d*=byPd$SqF_JmC0$YD0D#8@NRN>{ZXo7{DVmz^-~iY&5_vfaQtPx`5^9KkWgQ2d|9T z3(h%8GK!>k?$Gu^$PE!dK!epxSiVpCXiO~q3N4_0-5u-Qi;noPUrUqGzelE)o)ZZd`_TPei*2KdY~o zDElR(jU-B(EHPdbw_n{|hn}bN*pKVk-4dkuTm(row@8qtdGE;f!pn+m;29k}Ij!tw zBH3GQPPd3G`@qb=gCbNa@d*2K?RUYB@|ppB z_&#}97aTCY;{dgny*0v@bm#TU2-DJF#}(CY`}d#kt;HN>1P;6yc_JOn$|zq z@yF`FjXd7OngA6Q9iA6Y0C%oUi=-kO5VLd6P=pZHLHl+)Ga{&kWgZlBcoL<>=0Qst zR&yS7rGPjE%iUlZ>VRj8nUSkeA5C4aaPf0vbr>bqZoGdP;|8PgpAwI&W+YZe2xyJR zBsGWpZt!v$A7T`9p7e~u1=?NqY+BLa<-1wRb9%A@TOwTpQKo@dPpbybN{cKhX0a!x zmm43D8v+vO;RWdo-XTa!WP&X_M4RpI|N>0{%4BE@Z}Rr1XOwnpv>R~*tvK92i_%eAH}wos$LfJ zC)YfuOnfbkL7Cf%Th8KAlHxu{o>cnaoGv~dX?=kDSbrB(u_W38} z$g9Gsqn#8)q3&vQ_UIRsa@~{KPnFiq3(T`v#Ss0)eUy94kyHe#M^`}oUVsvKBvYep zDCnqxDi;Tw*y)+6Iz3n(m23v1O0Wyv`(~Y_{AtRvp3iPgG4Z8CQbip$!m*WuQ=1v| z1ax!64$>f1LXx!Nz~pW;M-7D$@dk0yl1RfT7kdH?Ro0`4dy53p927t*Dq>Pm_NI8zo^i(2Przv)tVEtWh0R?4AKbkLcY__Z*kBG9 z&dsa}x5^^$21r+ZM=u?0Kip`rwZB$)WU$m^F?2~x?}C5fsRY|@?>tzX)DPIb%DEgb z$5JJ7mC9co=!0_Z#$Q=62VrNQ)FC8Bgup07O`ONO7AhCm&q7Z?I*(c(qBHZ@a(g2V zge9l^Y$k_#iwJ3{xWi!kAx6Vso$nyZ#-e7f3&M^?jl*ax!)7t2%S}qa<%(OfUdUV? zF!30&-g}V(KoR?2uIyZ|1p6P7;vl*%;n>4Sp^+HEO$FnA#3c^K>0*lk;{>tAgbfuBb!fu_ zhrCsq-HO`gu3#LfVcbW&fNMw6+v-VS_+To!a8Derr~|w$ClsV6=TV&;BkXNz zwN{GJ3QBXLwM|lne>oWpr80pTG;hojqMc(sa=oH|aD(3R1uJG%?}0kU>!fw1DOO3#c&2^fQDQXT=pi4AUxe+%Uih?~ zarRQzD~D-2Qr9cvD4uzs1PqlbGJ*YK=tKK;j*X zFg%A*BQ_vyMBSCAJxMhT`+1|I6T&f^-4(biVPG^=d81pi zBOZ_nhTe1R(bxiLww;**vDx-_IVsS!e6PAlq8m7TZR zgpXF%_E9L$B`P%Vq7nGwk$=%906~Oi+r=rMoNb?)^4Gp8ezh~7gT1-{L2R78lJ!~d zay}}!72-XCD$YN!OezyGBe#w^7%IvM_wHTB<;&yzGzH}xDqhAHkycR9k3s&Wr~pr= zg-`$TJU)6$UWrwd-}sZ!`0q?Sxx6Tkck!7opIojn4L9^Q8^K*;Yf7nN6{LKnqE%x{ z^{KD`BWqa8d(733fzk8^%xrz=`yv3g;cxbMV1tm~-6iZhyj3pt1P%RW>Etgez=i&Z@riliN=& zFd8?2Iwh8G-G2LED+TzU=lDI$GaW`E<9-mfe-cs(i5s`kG+Kj?t%maAz=uXPnQ$u} zltUnl#&_`mx6VF+kZ_x#Og+^G`^{l|46}jYro)w=94;2{DU;6!O7No0Yw-7M`+*+O zaHa+%R8p+vjI(eiXW?YpE)WTm*a3I>|%6!$vN1=~C1gnj#z zN~|&(8$I|LP{o*$X=8U9m+#n}pi2-OADQ404Jm8@JOsu5dLI3a>NawJ(PH$T_6GkH zz0AMPYvOoFH<%i|$CFDp%lC6Vhz^?Mk%sw5Ag0-0Z6W_*%vD>enW9&uv7u;8X@)aQ zE@yN*_7GTs;-$mW!fts_w zhf?7Gkr_tge;HYVRo@%qTa;+xs#UJC31ChDjgjNFy%|8V63n=0CFGPFaCJuwCO+Ve zRqC=Dsmp;ZT>3j6Q_?yagj8TS)pB{VHE?BL-gbESJ_M;`yvVUv@WZeaUmdF}H zFXI@=+u(s-_9Rw9AvLBzkIYitMP|i4%C>shqxfix`=}ET)CSulF?U`kde*Jz=~s=W zdFZ>o^Ml zjMC`>!}9k5!yp$1RtdS*1?=N!hwQ6EuXx&T_uGW0d*Er!zL4rPg3r4?9Qm5CxR`-?wX~0KCVvA!oT7@8 zkDi2jI_`>mMBW$NjMo#9`|>?Jc6s!%yHsD1yX0}WJCDS@!ADPXA9Y3uFBV?Xxdlf@ z2>1t0Ui`k%SWld+zR%?-D6yIL;nk(}o$_EKeFAQd)i*H)M*cZ`rqS5O8zL%GboL6= z%(26p(PsS6VrJ8rsQyV2NRLHt>^Lg!ers}a$phE`KZNyd`rA9G4UZZXv~cJ>QLgf>TiW{Iv8ZdXUZP5TnhU&*$L4%J~5Iu6g<- z{xBz(CnK24hvX2UaNnQKWz2W8ALptxUcx7q5ApL3oMS<_?*?@@&$MpM=M!sX_14^6 zQ+gkd5yQe<4p`05&G}~NU2IN=HP|?xVET#2mlBjoB}qv@n9x$0>&uJ6uQ zX2`tfFaTYFCW@qTYaZ_43d7wdd8QBSFXAx?EbJXekdus=FsY)#5y>pgQ1w^gF~Y6R zb$kYzN%I!2nlDmWxTQlM>;$V8%+W#Twz>6 zJB2HRmQ+$&7-PJNfxNs%U1KbgZNJ&a1rtrJ zk*?=wJ%O8Ve~plVDGrhM`ehV<)Dv{c zomVqGXver1M@_9CB$K#8Km?*g#O%Sn)!U#bfdE+%T0#nN6J%wKxfADQM{oLxbB^;* z>L~;(#=Hj2JQ2wT%{&Uvk`%Ac)UQ)Vb(vx#CdxqN#NrWS)-=jTEG3K59jA%V$Mx)JEjwHc%&k z7=b_~TBrg*Rh4tlT7l2@w{w)am%Dgg?rOqD7Q|XgWGX8OqdE3Vlf>Qfb zIR!);FWUn|wdV+xO3CI@ha#XA+C$68N?00P>`eAfUB&Bgw zBa^=Z)$Z&#`iYt>JE9#OST#evM;jsgywOJZ>8+wlilzBdoiSHa**&dS9b72|5%=a2 z#U+|s3l-_Dj6+47E#G-J`f!_OnUirAr#g+a^{(+dK||zP8M&)PKk^D$8FTZy z(qyLL%N2@^g%S3@(~WXDlqb@vXLqlGm#t9>5<;_~<}kEXCL)WSN~6;@P*!^2s= z&u{PwE9_C4Jwr}z+LM*}sZfMf%A%Fol8L*xFe^!Jd(Ko7ciJCVzB(o>L|CdRtc<1< zYhWzw_2p!ZcV^QSR^?3;)()(33KjXgi>PQ`U-*O6+<=e5pf+A&6 zN~u6GCAyD+ej5ytw-I$JsC4UyXGL{#kuxZg%F{o7k1_4#7@XlNrdulT6<3&MxsW%8 zbKGYYq2{kWeR7`3a2FH+EviY2DRG9;{tNS8eK9;v@tnPI5pJgOX0W4|(eN6Iu5q@L z%nhE;tT=PERuPVQQ>>LUw8ICLV&AByH;^fmizP?V5h?a?V|Q}4*g~|gq^18KywU>y zl4f7_*4~)56~9$J=~P|Q7?qg4QiT(6=$;wY&ILfFC@Lwn#$X+e(w9=yzLbXjr8ExQqeU*3 z^(Ei`D*P_diZaT|=&t!b>ld6F9#v*G@SA0K&xZ`P;@7gjb zF3?p%jT9HgLhM0g#RXVta74&joeSC0X-?-(;T zNRHZf(7vv<5l7$-XOttjdh8w?K?ZSISEFK1RV}7^bZ*fxr+6SRPCQUF=Ij&d!au#3 z?A*6Ddo0&F_4y|AK1Fz6cM;?Qc@MqjIv##fHe^^OGMef0Du z#gzpjnKRVVE7wOiM*Z#iWUbaKcm3Z>0@EI%p~+aF4Te3kk1KLw)G6H@K`W8_Zpni;edilB1-X&IAJ;g30$TiFEb~WijbMyI%Njj3?eL2i86F5 zUfBJxa5g%UVd2R+w92m4Tq0_jVpzEOwY@RL=jMYc7#7OPEsrV2coFbeoeyN?E>p(z=i+XY?Kvp?QEvl-l#kT@pk(a^4#WbFB(?oGLsP zR5B%Z!C<-Ts={JdtDzEb6x@MN**kA-Xf%rc>mk&!-A2(5;SkW+kWZrM;Y;?0DGN>} zQ&jnz>l+i3l}WO{`cDZ_^qHOAw6>;*qODTW7V(S@rCqjZb#bkH>L|JbUCHkL-srhm zs5~RLf>gJBOLnQ=Q%27Qde<9(A%rH)OiB=Pk|R8bQRS^?KfB*#4)P7=OC z=Uwehcdq6(fJw~Ug>pJ)q}+-cujF(c9OZwMhG3mwMO$ZTZ*HGP?9vt!IAb1$ru=m_YvkMiP8(G$BPOaG>rDqd0!Gp zu7pEP*bcC+h30k>P7yv*h?gddJG^_(FNs2J=x)M)BU9~kU7#Axi!6a477ws0IJagJCy zy4+Tr!OjsH>RMZBFiRa9i>Gql&ck{n7SoB{W?x?VOtlQF87<3-u1LV_6ushDc4RshL$bVZbbSbLY0&4;TFyKzKRv{GmJbMqk9>#$S4TGA|Ss#VOWvw%3|38JcV z+4O^+w?#uD<}ezB_M4(4QSRbZWh`}?{ZY`Zx6!bIg1IM-ZT%V#Ny7SmJ|1j8%xIW} ztH@grjvQ1SXNs5{W;8yCD>vP7uu6BJJZ%W7&JMs4)?mddV^%S;55-(o9vaC}OZsh? z`uc~CW%eu+)V>ws`Y__MuX&8%>r5tmQc`kY_mZDD1vUy5TGU%GH0>@=FNlpKZ}7xOvw z?)pXK8^j7(85jdg_VB8Uy#5g#q}iii*c%hN_*iArpP-t@e5A3c=seW7H`ME&_skUg z$e-iGg5q)tl_HbqnY(#6bO9t5MWMO1mgKGx*`0tjx~PKPX3u+;kl!Hi$SsnSkHGje ze8!8Yv?j*xXG(2jVVlu30?(E3;$|sBP?H3V;T7e29i=jNu5j2#J-;{P3SsRoP2lTV zSRWV2kv)pv3S3WT%2wcKI>*r%WB>0TndDvoQwwMSyIvXW}46hv( zR>EE+uT?iUYrTinX z2SFZwv|#mXQYlx~C|q`vO2Pie-ztdcV3FyPFh>#%oW1D1Cx{mM1tR2h_c23QQJ>oA z7l&39Z(D>mXiu5b_LlDxtt71 z%qT@wuTfF&n@GZ_t|E&$;!_>DwRVUD2{Y;du{|oCTgs4l2-f9_*6IMtiWbPAgXbLky64bN?~l<= zu%o-tbTr*Hw{C2@h1A);9J4rSM&kf}q1)(2+z<<4_5qXBZa8+h8NM0r{#$qJBwW0P zQBZ8ege*K?Oy8ir{h_yez5Su+!>)L0Z`{|azQRgqd35yVT=WsCkZ4f1-Gl+tAi3qb z%-)w^3w-4@Mejw+=)onbeRdF8B4Z`lm{7k3mShXkijs0ll_nr}Bk@uMi68gj@qq9Y zvv8wJ5nMdQ=qVZiX_t|{O;hCMGA~7B2s!%6y`jkBKFJh0_g|?f@^KX?a)R87Qe@;; zE=9z(2t^Q+DvCUG7AfM*4^Rjx{7DocRUulL_AL)Xp5EG=B$wZ=(pf)OcgQjBiX0Qh z?)KcjQ;T-!#uIIm#4ae*9Yai~Rp+G`I6WEZcAT(-zm(bji>)qx6o!IF_ z=sX4a@lE^fJD)_;Uu{f+aV4ge6ta8KXk8qg1sPBp?2Lq*2$74LD9i4c0K1M~jbP%nje)|U1c&gW(seC*N3w!p? z0>flv+Y>fLQ`tBR70-Gbat=yrV7EDf&(V;ULSc++wYgU4!yJ}JkN3laVJa)SUPy~& zrv1{=*m|L4Agp!7BB5wi#0-Iky?O!(pn8k^ovKL+I^}rDHrBP{WFlMCw>PUyaAgn6bm|Yo@#$jVpu`!bl<-7zoJYrS@$J*kvLY4z5n=n=n5bPhn zak&MT_)zPVo?Od2VE?r^$%8dLYa=++2NkUmJK?>rKHz(B%YtBJF2`VMq1?cA16x#g zeK1_HbJqyzt;ryLGh9Av@%is6)3g7)F@0Y}f0OGk0~~n<*e}lRY~RP2!SI?*mc2r1 zM)ol~-!xeoz~%SGqCP$Ac3xT&AvFsWl&*0S+B3ywe|$GZ2c+Y6+8F&HFM)l#u@f+7 zy9!rTA5CLcf#$#~9x6X9w-RQz3cV7NAP!(NJ3$US6L%l6SM)xcLJ$>g2N#tDAhDf2 zJz!rk38ebSL#kBt+Cfm`_U9&gWkjeP@;XgzaW05Zx~c$0tze^f+C?%X_$=F?6oZBb z)a|^uX0=HV*%n-Y8|h|0Alznd-(a@3<0$AAX8Ia41k=H(JzGvbL5Gk+$N*)=->|OQ zKwLEi>pQt&QsIUv0|`<=TitVL4jl~xB}rIbmGi)8e5rz%*OG`Dtfc#dTd1rau;2fu zh|}3MppoOHQGz^eQ}R?nc`Bzom9ty)Ez=)z7!s5>RvC6PpXc1i0$yM=3RtT_&)BR- z!@1t52Bsy=uKf$6nqf2pvQ}E{K8-iI(@ErD1~W$EPK|sSx48;on-gFSG&Aj2f=VV` zpioXE7R3c>@>BunsNDf{!x%3>+)UE`VqO;jjTeAw7E{_$l#Wm5`Y4QLLOn(Hb<0rXYPR+7@a#vLIIXF{`USJ{#Co zA0r?H_JFrVD)J`Mz9Zp~Y+wHG<)M10m;53Rm5+2m{>?r2AP-MsA*NSI_y3jhaCnIq zAS_Eyvp;;e3xGxnKzkt%H(l+OhtEIlLLSb@?}}F`>@a36#@>${Jz0O{g;g79*e_`prp{J6H8y2fRd~z@ zUV`R~MT2?->N*k78u^Ag%zNSu(8IEW>;9WfZ=ghh6;T;o#>oFNiR~Z2b(u4e~CeNx1spOf%dI zB?b~QR8#vicml?U_#ww$^tvmv+zp#AGpvz=0Q2Q_WH|Xr#7fbDat1Ky3-$V@cbz3r zU_k5KD#n5iCf1WXd}H1r&+cFn1LiZIiMGdq5qm74^9jI>oG1A@x3l*QQZbV_>Ao~I zPcRye=z(7uox_f0#w?osa#*$R2@=?*AQBo{-aHD9a#$`>@zn<+c-XHk_#9wB`!f_U zJk$vVF$&*Zh9%jK!W~BNHgJ!8DFAS&LhPPhRM&B`(a5L2Nye+hFk>~WpGjKu7 z8Ys?SJSMz=7#-{CYb;gm_lou3TC4%-%%gM*|7Lj@XaUEz9glB zl^Ag0PtWeKjN#2{hkY);6RB?6`FluFq>5G79SU zy%F3-DR2E8s=QFE@{}W?%6)KLr-=O&sX@QWl6dH;qBTwn) zGwnx26Ftumbi(M|%V$-ynRX?sxY2BsHqpnb_*i%-hD~J%d-RF3;fdhmS#k!*ewhHC zhk;xyy1GOck1kXj!lk#1pjf^N)9dmi1p4>Aba}C&N5wX^8b}J4Bsd#=fO5uDWKOg} zHxK<)G%yz3NkfkvoEr0_HXFlbq5K-dI+Q;^7b~&WGtjUPc5*TCC|3Fw70V|}ldXwx z-nwWSHOVDmEF(fD_!+*+i$-W>38W;AjbZ|E9^NdrG9Xcqf6F&wm=`Va8dHk7ZC>qB+T1*v`1vJNhhGXg3tq&9Qi(1{SIsz^7x>2 z`h)$m@Z5CORG*}yN0m;&P(?M}ZkYdn6#c1I>4C47kVGje1;jG&B@F^~|U{y3`SKs)M_EqOEX>VX^ zBwGQ0W*>Ci9_;IL`vS;yHL9!;V^SqvPNf70dJl3)$!vj#lm0ZVZ;w}|b(>(O@4BXS zu>b?G6*u_&T>ZTK;&y=?EUcHiHLeU=^x8Pf7x_T>jFfXAXCE71&?iH2{i?R=R3$M$ z(4lz%(m4{H;V|;edQUOvvQ;Mamb|OZDj6svzFuJP0KeVPWmP7 z{^4DFBNRnG3WYk{Q#GCL9P~3Op%@<{+O^|IWX+FnWb#+fBU@Rk-*e14b{azAg9kS_!~tI^})K_dDs8GgEMC5;?KHSr_*_ z{u^=yGaw}hAPU%PyO1{4t1_oFQ{aloG$ObbJj8g7U9j$d9zLBZ#J20hO0b2A9zoPE z%Y*vzjF1=KbEzUuSEgs9bMl#hkG2^EDd8#_0n!aP8EO1uAJK#qhn3iXiNRL0e7Z`o z{34|Uau<-xT~`TSOXlaj@_f8=i1POXnN*!C=));R)^{cU#}JcPS)4Q(BeOV9z(Goq z(vRcQ`OY&Z856M#0ZF~;Opr%hW@l9j2sA5Gq9Ru9rXpTFnjln@&j|$%?2Q&%^{(ja zJj_7a4Y?^AjLwzVf^Y%(!dXX1lb9~^eNU945@az%0fae?5kPp2a!lU24Vb-u&DxhwyE7cogw-gT8yy-a^}?> zgS8X}onaouSGQ@S+sDQf zpW8?22Cd$guca*Zf*{0fjf|Ht<6u93l$OP)t*K*&V1g?M%JyhM*q2>HCdq%t;rf(c z%d_Xc=!$0?H)6QhAABn(-wcj?Fq~`~Ix@X&=x6|zz_J&(*aVVRs{&*b%gtQSWBig0 z$jG=e8L}Xl5*)#=4a7CduNR8E{6h4UW-pzwH~i|~Y0xL+P&1@SwLN~V8Cva};$fD$ zM`n$>z{9Nd9%eoNZWqk*9oaRrgbbQf-MyST3stLbvcp-1m2OCMoLI9z4<&S-LwzK^ z_OHom3xLRh(P_@Z>Zg38@oiigi)u#(x2Ff1Yezc`_#SQOHZGY%VF`wc?cd|F@Li+n z6WRh!e}ABjLItW%%zhokp_S(Ljb>{Hvf~|Q`nN1`Ewy?T$_i0Xx&-Ov61}8w6~4=o z!Z6xklZe1##XbJbVGSUGyt2AO&L7&0@VDQFO1i9E#^y-xbmyOO{jSHVTBz&;5? zgp1k`0$_wmx2)IU9nnWQW9&G1l?nma7}atyn@SBN+GSNq1>G=vf7V$+h5ej1M1^$^)W+z{HQ*@Rv(kq$CgWwH(ZSaL1gAd{fW&l zSkd!Kz90gr_k)+@A?7YP7p5WzY{og1RKJhdf=F~B<+L?$19TF&iUre`$xfb}8nn1H zZ5XB)I$N0O!s(tm8^E*XE+ha5wM^u{FrkWh9@P7T^0X*n92z$TJv4S24aduKQ(#hH zAru_}8+MyC8q#sA#LD{0pOsb|uAc|sN&sBv8g|OIrL(_<8nOa# z06q!Qa1N8DG|@HaVU~>C47|=Pv4*3_cmo$dVW1cqkKHqV>sN=%S-$&MD{;~8Tyl#d zE^vSL*28ERl42u8J;p}i9T0vu3$sa%PFv2Ll!7!elXR&hP0C{Vmw${_VhwfR?;s`H zi@b5}z?O4S^^C1KIWD!dx8RIGOD0KyR)A>1Js{J7#n0g4%uj#@laI5> zzwijy9it?C5zNtetV&%v?VwVe8B!7&!TRo=e&;qZ;GCs{q+ks1Ggi5ZD;5Y*Dnn@~ zE~_%H$VtfwcBM)q(>sI{IOTAkSePY;rm%GlRdHyQRO}IY5Wm*BPJp0@$Ma~PQpF>P zvgQ$ciu}!ONbU6rMG^pH5|gGKWzGeGW)T>JAOs$C2hvwr&$e?-tj0P;AGs?KA#k3=7l`Ksj=Ie$0C3Ev?zl-sc6H)HdIpxS4KWJ>}<4d%-jK^WZ;z>9pH0 zVzyi7jtsT%mwA`eLkiui>7izzBhaHNDKSk{z-h-^=2sRW&D6w zkGX-dihi{(UtRH0!mE?z)jQRzIe7I({Ltq6>3bs$Wf;VSK%=b-*(BQnaWd@%BV}nI zHld08`F{R9-Tv-E@T2Sb_DPlChlf_gCtuo!j21{IQVoSff12Ixm7fG*#7-r6D%c7@ zIcA|f1y!=g@}ZAjb|1p;&0oc&y4mJe5uxVMW*}}C`ks>c4T~Zm{p6rtCiFVwsd2K2jG|Cu{2qpN0h1<2?Jags5erq*vUA9XE7Wi>VnCOG*h58Bp@0c^72Hz09k^e?4j|!} zaXs4KpARy=4$rUT#QmEH zI9EL~OrZt{050-1fV)EBB7}D}!Ec|+$QEtqOLMpYD(nPr2C%8g)R!W#nNrm&l2-u8m592o`z=o777p zUGfrM*BTT5QjNz|x&7hwu~aOrvC?xkd&a9s!;8j7yVx^a)eq^019*v*EkbQv0TCK5 zT%loZXP{0p)d=9>F0pnFf)v`5%RtWOMfPI!#P~wTld>;R>UfePiFv|DclNngy1DjC zqFoC^VfMq&h{J(kN1icj2Xi_YhNzIOJLEx6q=_y;^s@P04)%Y9{Ni|K{=s=YB8a*h z*u_Xs;soKRdD1_l50k&bG_0Kp+oI1w2xBi>p_8;7?G5a96~6|vos5}CNauSkkQJ`! z6Dn80j!r$DU8zWqRzRl^Aq||i4F504OOI*?_5dP(6Pve2f+2}RawmFLgw@obEN0t z`mMsbWaK*<#ZU>QISC{ z+$PDu2@x7)C{kco{RA5;gQEt1Wp1q_dLW;H?U1;}1zQhKpbZ{uqi#*u5o-e(%&3^e zQOwmSPa8rpz(EHj=+d7;R?Fl}hL~(nIrTtE6ko9bSPKj0Xg2oJ<68XgZk0&cz?a2B z(1fu#!6;}kK(w=TSB7q#4;#@3l!&OriS)g5QfUC^T zRs4efC3Mo$R#97AfXoJ&TNU{Si-#!7PKoG5e2XBEv>2mlVoL#u-WJkqAweggUCL=J z7v&HV#(K!F)B#kw<3(f9PBq*4#O(Jyq0KSZ z{@3icU4b%9wpr^e%q zZ1E_hQ8@dK*>59faH@(!?Pk9ZF()zgEVcp#7n@4&6>C^V?=l6%oKcR5jYJTTC+94F zg?K}&qOVHQ!<~wgBnJ`m+Z_K9^hzZ+X}TqiiB_RZWlsc?e{s4e8W@R6%#=wKt7zZI z!Gsa->LW)55#+1Fg# zPP@?9GVMom?We+lrTRXU7rf)Q1o@tHd;Iv5jg=|D3Rg@V?=If}CoaL#jc^8%2Xy*{ z?@T<~Z2fNrROJ+4dJ52^|A6!XUPv?;lxgo%sge?YCf??9q+LOx<^hHLrS|D4jlxQk zhlc|bX1D~lB>0T!n@FxC8iUKq(Hg<$`G8(#0@4edr*(rh>Lv;CVr)>jRsS*4FcXp8xUyy-4h8BqGKAN|zH#^&b2>dnhR_f|R#YzmH^m9q zp+e+C{;P}))Fw~%&yzWIW-MhnuYEP1p%4%xPz7Ye{GQ&=}~eoK$4VCnRG5_5AL3XWXDN3QOEcBr;_?^@(=t-D5R=V3`-rXvCvc(qK7fvy_lUOA`ruEH8PkGK zHw(|I!Q9zzBJaf7ll;&9N?!6wGemX#quMqan|TZE7qI;sprw##{6HQRuA2BeRn9B& z(@W$Wfm~G1OZKJs?@NFvJd|@v1LgdPs}toM8WffD(z(LteFb#;*`Z+fNZL#wfdw^Z z8I8=o01@X3Ed&Yp>{9r|$$-$xT{}gA;QYipf?X6REXG>pDhJDyx%{e{%deDPl#5>6 zjd!$Oq){&*I#7^sR{3Y57in5AvPXuh)9`ZC8%I0Q8mIue6Q%LkTuv|qKoNWYA6QqT8S=AGK@=0RUIJ2pSWt348C>RHYENU! zPyb)z*YAg4hhIlvxA+YQeqeDzE<^B>%(j%876ufeKwsR1WCFxd^1UE3(e^#;;;;Wl z{OkDo*Wq{A|A=4l*?Yuq(K-Kz_#O5u@hfEKspWI8_;=mlJ>vJl*{Sin9P$BMIRRD^ z@()SZK__&g2%h$vkHpi8Izo)nDKiC7K~xDtKI8(*kPR8hL3rKWeU5G|;}jU1ckN5r zaoD3F>;kr08N#T!RLe-z1h{JOG#Hy`-R9_=67-ktqJh%-+uPLd6u>bGtImv}hU27X%l69ZA3 z-{~WVao!m-L6&ddr`*X+hTWiGw*6QK&vqqaLCb&+mSj*OUX1ZP{7)?k7R=!CEu`T# z(r}wS>I#}0?EGZ){RUfKnIUGa7wRoSm^9#P9FJz(pDg+b6X%gbOu&wx-~=9eRn2de z>(PBJN(ZXPamZXpsKbb~kWMUyL~|g6T85y-p`=KgM7@%REZGmebl-1S*!R#TBkf!S zuLxCo?H9RMlm-mTwBI`!`qD%MD;2|aDg`aePz5;$yN+Wu%eVh|X@fI-IX;>C9L<|Ly zV)7_F9I*7j0`VtKBNY)}VX!W|W1J;SV#hi5{hJic5I%rHGWksxUAT7Q4dK3XHyZen zlLpqHcMwuyDlOw3M`lkDoC`MgivEm0qA&7k6_ue(eVYK~ZcL=hYr|TY>X&W7?WHJz z;1qyeb(h2`*Qt+ng@{uwb;pUWLd5F>$BQ6od^{fxfTECvqa`92^96w5z!Cj}JAm=dc|t-I$H>eICR5w75n~A-h9I!nGC~P6 zl(4xmzAOF|AUDNl!C;2kKo`_tye-N~QT#hL^z%Gn^*()!mYLWyk9LbjnbJzJP+1Wz zn=ONCl969iJrTK?YWS)h={4uG*$QJ(W?e^q^%=}E*Blhitnawy_Y)@8WEzVC8H28_ zHlmBw)qD@Xg7gz$BZ8RzN%$%)MiwUhsuL3AFZe1fr+AOQNKG~SG1G~88-VCs3j3e* zy3Q!DbKf@Qn^Zy^fp9wAMT2S3yP!L3!4(MsC4O157M zc>u}Ea<9O!tGezLo*!OX7<}vjKAAImYng?yUg@=XarHf)6|G3IA$oLWvDQ5x;q-fJHmfA zm&FJCvN&hGxqXw_x&!rvZ< zXPz^_Xna^;%DP}V)KCyCT+1z?*&SbXVg4}FmnJ8W4o+Y4^t76*pt%)%CE;oCpBO%{ zFP=UOVkiC891pkfyga=ou5GNJ;?uqZ@N`5{gKoFZ8hn+PBdr2fq-pR)_w;>y@`Z!n z-eu0K8H)b>9*~WO$?T1f)Vz$|hP4s4H8oFrFv(QCU6Y00rm}fHtr}lF__}+YEj1=u z9qDN`4p_|Y5!g1O#*G;U4;r<3tI;U)+?G%1SGcD79fyT`s@0F|UuKAj|4DsJQy=!J zP@<(snJ2|_MbI6H-UJ9HbO(QYKleeW5CAY!>uHV|LV$?~AX{neCdu{k=^%$fVKg3j z!gU`B@nRm@$7>T{Fwi~>nC~PT%cszwP5Vw0l!<1tm)gVF%$o`ErZHX0^OMeRuOnrs z;uzjf!bKT$9Tky`L_##mG*FiBI+1$9%}^980wqlM<5Mp3+>3l(*r$T7oCc`F7Xgrm zQ4m1H1vqux4EKKd3xE#)@kaMFL@KdfjRslCgI>$2HD&Cs0e z+UhSP?wzjSJ_c|*7vd*-!$8Qx-9Rr<9*pTyf1c#?t0>ffiDRJ18W{s!VnRMDb!Dhv-TatBDLb4geZ+sl9mspqUgUV2plN zLvAevM)prw0ndSw*G#enLljxZW9d&YPA!g9^P+xvCT{AWmNd&I%|QO%*L|hjhMjh} zhy0N98G5;^nHlaq=N*U@3XXH7reTiW>=`J})r)q@bHaW9h=*`^Up5cfT}{uAyJ~$8 zH&>afcZx3ehx?wZp3LKuH|Zx8pmdLt94p7ky+^9YvC|nL9YnK^ICIT z^N0sVOVD&dF30Y%Ub{aclTAWcW8eyn#xJRj;i5bSq&LZhu+s8Pkw&Q84H`%4G`>jH zJRZuii$Brhg@&|n)|7ur5>w<69EUV$F4Qk0bC70GhC-wv(|+h^44XC+!YT;9;dTZC zL1!ceBHO*l;e~zieLr=EeZA2QndZk>tXCBI5IBsDRtHfmAWo1obOx?w+NYx*_c8Rx z1#}3p8$V(nQOxw((kOBbYAN1wwW>jZp_ZY@HP-LX)gw7;Ms5q6lD_(VA8#n#MG-Uf z$l2%bOWO$0h$gm%02kb6T!RTx3G$SIH2b2V3L%JsX!0D*>+xk~_{{qM`LoiEEzF5BEn1DA8U*Z|0FK^OdI;@Vc1a=p!S-R@pnSRblIzQGVT6HQ4X{sV?v&8$a#aa^YUDS+IfWt+TG+)nTkz#{tuq#-Q{|j z_PQgLwTKxCxBZ^-Jmr3d)**`Iqq}|nC0Wrb?pa3f+S3LY3eP6OAklq-xGI0br7-Mq zUf>^AeK+1uiUV~^72`8Ml4;M{mdL1id>qa3Rg$SpDUXy}C73s2 z!5m+!AZT^EjX*SHw|u|c=W;&gJu~h765w#PblTk#4ch%+@()G@L9)L;oH8BU3hOZe zox%rIuzQ$5QrFW3zcdpbkraGUbQ9n1u6+R#_E!O~#4swYGQ(7>n?$F=`;u=rAe67}Er|k2kaqW`l=`SW}shC4t zgUc#mL6@tQ6XDZ8{7AID{Y5uYdL|E)Td5)?72;lHdg?7Eot_xq3PE5CxoKLs8<*R- z5iUt;ABl`rBw}BLW+N|3gR%B3_+KiR_}_gI;nDv>4aNWRlm3^VpnkS|ngPVU1sL%m z8(fty^&0nLEg&}AD8Z6YSq5|wzGH(R16$MdHyVrat(a9l4dD_0i|T&v zZ!|oFuecg)G~A6Vu1Z>gmN>qCr1z0&J;4CX+7OnPy@^(CRr#oIR*V~dNDqc@eLzgeVf z?4&?R{5>MrVa>AAsw&U427iy#0q4I(tn`E*;y(MV)!O^&Ed|rCF;1f#fC0rQLvkns zbfnh6b(B-UYr}mGsNY$6^@OS#tWnauA+y&?e$00lg({pC#77$8A;F8H-HVDlnu*WaNSM^lxH^UH$@Wp=dq&mPuv5wR!3bmM8G#aXfT&{T+*_tE% zUb9^4g>oolfDE3lm`mD^m$xMt> zEZrFgxb{I`COID$I(}NdwRgp2K)?_g*z6>}wm`qOn4h3Yi-3+#{awr@xUxcj7vlo~ zM;9$|o8=wN7a=1=h?1jZ1Y8i4j#v~S#S~pBmQNWeh{*^d1z`?6IzJN?!qqF*Dp?Q; zELd#d_A-+66(O~JNB5;sLd7hEY|hcQcma}$IWzg7w`$P(!o z0~0e2FW-bX0_VXV!hkTm4|Y93l{P#JZd(_^l8gz2Pd}@Lu0`crgP*~*Y-;=oL!8i< ze6E5C?V!}BIatglmZybaBJ4oW34xa{q&W3$NH0Zkc?43UAi<-NMWoAYd03}s!$bU3 z*v>UHMp))#G+cuYqL%4JO~Yos!|4?00)iGqvD%JsfQj*}YSZ0h$YY1LN(Ag~M5FCc zzO+ii1_3OPFEKmh*Eh>}ljb_v4z0nj$#&>Ol)Py>R5vqbhom#1%N_qwq9WjBlN4-- zW_$xbaej%sMoEEQ$t_CQ1xc@M(XZM31o?%~Xl9%KzTp2c_a)#}73bgCu0}~XK>-7T zUNqXot-(?yih3gnoal|lN;N8fjbdrEs1X9h%93yc$>DGyDy?WyX{)VPZK(^JTLMbh zssSp3xUg6~muoF(l}*j}`@J*gZUnUbf8Xvepf*}$~~c16?!PA;uN9hgWJH97ye_E2dyooID2{n4pchl zE1nS~%TSn!Ntd3@iK#)ZVvESyurL`#UyoLK@o6Ow3#tmg$mL=jsZoW_@GysJb_)2c zLCQZq*Lly5?|wU`7+FM_Q1f>rD@GP4*RyC6j=CA~IKt7N!j`Ilha)x^Q;h#3vAp!W z|3|}Pk~uy6r9;i>@q=J$#~2-b<$%jS_WST-oQLV52FAA5VzI@;+d#_b*!?}L`cLz_ z18ZgWdd7*EgS`#BB+Zv3e$q#zC$3?D!wOdha%E{bfIefW;Ovs~jO=rk0WnTRAx;Kjz!fHc|`W`!0;QB=$ zz}1z%nfr-@fG3ympEWKK`wW*pWv`a|W-&A}M@T}e#O(O1cMq-m$1L#X zhi(d*iae_3>E6Gw`8C@cfc7whI16JD{auo8MKkmr8giGJ(jsE%3(^&tUlDv7!8H3egI%8Y``kB0K zOdXx_q9HU_M&%OZYC zGIZN&W6sO4mspon1HZ@q3}en6d>4&wAPrDEMA!Gjj};+eUIBMpw}c}%4lRYcs|hDG zYzg%P2CuL6$^IMk3!WJq@_g$*== zHoQ*0<@)vhRTQHBeSZt@=FzgGQ|yOO&HMu+7uvAoA(g0g4fcrL%M%I z|6lZ_I5WO4VV=X(rLcATBwpAU(&8SKSade0hetx7)9cn9tc0>pwh=V~tU_@>XShGm z)eR=U2B;!LJD6eYH0X5q=RjBfT`eahkB_HQ;1b41?7}(c&t0596BsIJ9~o`Hv76o_fALL-!81QMV6(g-^(2%xW^gMR>hQCU z_&pt>PxSDR=?*vI1Rx*E6K&GG1e)D5lfR)Z@7rC+C6o)b6~@r;MR)HTssSUh{SY^a zTn}KwKLsMXf_IqWAJj7j%!oecQ|*BTX(~Z|GO*hohi9B8zQ<^cpnE(U$7qy|cL-He zr^b&%$`de=z{wghdUZtgh08tDxP&|Oojj@&T` zJwlnV5zt%z2j@`oAuYM?b?4{+$jC+nOTVSi1GUeUg&g%aYeSC&DIl(FtpA6JR5j^Shr;^fuEy*n@PXw4pz_jDQU7OPlm2Q2{b}MyOkh)+6^P@v||bS@B~W zeStCrjT3&}(1f}sW3-Fj#05%>%mKLvp*h51W82kW{K~*yw3XuruuX8|AaE+o0a?Rw z*Y#2h16U3i|0H5iO_1Cp9)C*MtD>dbkp&Fh;Blg`W0L&+7x>wlb0~h&55><2wEbV< zC;fkipJ#f0fBY=$_8s^!X1t*28LwX)U+$;M>+Kp}DIK7t1ys(*oW*Zv|KU$EAIeAk z-VG!^_<_MhYA%HN(hT(-^CeIjuVL`1xsr*8TykecOrwavff_RqZ|0$OCNA1^fcz zdmhpy^#4S%0?oDkZso$KGZeQp9yoT=McjD5nInlZ68hFkU((sGbPr zx^9kp8Qhvga%Hqh#0m06g*qa5*^?NI<;YnHEPwz$lP67hXZNvAWJfC`($=rPLIe}5 zMtPYSa3_i58;aXrO$%nQgaJU{a|ji9fk!a>x}94+CUJ16RYQgug$C9OKtm;T1y+Q4 zqNTg(W*LHSQc0ys+A_fsU&qColO%Ec(3pqd2E9Ii5iD9v2?NBq^^EeiJ1UhULK|hB z#OTo|F=1CO6wfcovftQCBc%b_- z1r-D_IZ(D~hC!srCT?oM9QUO`B!?HBs;}ua$SKI6#FHfRs7D?za<|J&)S6p zId)uvnt{m9+8>$gcbaXHlg(xIQ~&yo%n?#?xJIlVDc7(Ac`xB>`3Xaw)$)%`sV3*k zw}D>~iC*JXY#c%Fl>$UvuCeTs6l2|=2N-+-S`@^8_Tw3 z7$KSM0wLnqrMfd#f?lMKM;ex1;=A=!4Jo8*Y_AUr4wDe6(@Gx zUI)igilo!8H-S?W*H?)gG@9)apERq8lj4t)TBl=A+FOs2=!$X3P*?IShY z7i)=Zcs&5fVYE@hc-^LwnSj{q$mX~i-al#+w2Mq8co2eUm%%HjUBvVh?c(*?ivv)- z4)+3HVD>*ORYj>Jib{MewNO<5T<+~jgEA^Kp_`zx=If{m9)COQ_vlW-B^ktUcr@p; zV26D~Cnlx~B!zEQbmkxTa>&zPqr;A>mg~{U-JhuQ3v(gAH1Qe3RnP=koRky-L7o)* z`&Nuo7^0bl5oJVF|H5nJ_C~k3B|cv(VO@)^nsO?&p{I(Ns@Cvv(&S1Uw;KLLmTdXnqBMRzM|UN`%|J zirzHlNc1m{K!c&NGUIr#KG+g8!XQLbo_sI$yeBKy9tY@I3E17a8})o(%(uy5m4`X4L zv*I(xdaNrxF(FJXS(k?!O>X@Te(U#J;kOfc$S*FMhbaO+Qa~xbh}dL`-J0)2oGp*< ze)y&0JNXK*<*R1r$ilde0Nv~e)ZP?y{I)^MGiW-dP7nHA4Bl1Kmb$Ca0#Zxzd8#V&Q*(Sb~TUK7{{Qb00_!vwPgkr?(gJd?uZ z__o(1AhMPmE`m!$4tni75V`R&K_s*~5DCi@h}44BlX?L-bTtlJB=v9@k?3aq6-DH$ zhr<^E)@4z!LBn9UEnn1lR7}6p0Bqyll(4@G;rOJ9WE^?>>DA9esa zphzl)hCOpc=(2v;t}*Y+8Q;Ks5;fZ5We)p+vbm?YjVa{WpT4IJsM{ z<*ro&QXK>2lYc49$R_|&9R&nhL|e2;^bGfqXolpG{Sm22E1q-6&)SR4yB(HD%Z#4@ z{eR*0ZW4!9^o|3&7USW|)Nl^lMBllihRvA4qeci;1^5=CUf$%u`ok4qT6e+-nP1(d zl4_OgxmsRcuYO&9@IYtyQEypa&wdl;TP1m$)%x2RkWNgto)qw($y>k_lPyUx9UwpP zk3Rm*>JfveXE(xKu(wSnGSgpxxjt|;LrK`-I%;=_E~l3eWcRpBs5Ro&DBwWPWVKHA zUegDYh~BU4YxZ?=-gLFh8WP&bMP6h2B8>mKjrPD`LL;%+u%qVjSxsK4HsHR ziBNDVizfhu(S~j16S6|WIM|)Yt7AOS#7(L1sdM^a_b?BkvugsF)xhNb!f4t~vFAgC zwg_6R=CrXzKvC00*3~NDc($C|c)FU!qbeO%W)*|{B`jPVuzmlY2YyD!uM(Z&#s3!< zQqPEJFB12U|x@@eb*wF)%SH+~W4SaUU?Ed7$BSvIei^I_WlYb=3Bj!AZ<`4o-J3?ox@6 zdvW0bqR?~L#|`5#qaF&xV|3aQzC^3DX2}#JzkBhbx)t|~PnGaW7C?(E%FLx&yB>GV zY&1gG3u5LA(s8#&-_H62$KtkAs3y7Xob*uaLC%O@IsBVMY-@CD%7mLmrBO{dzO$;6 z<(L$Q9MdeHx`;il|KYih!O6Ws(Mctp+yiUpgxStHmx`npjHEINWW z3gDRP#;vuNQmxii?~E4;2#wYhB<#t9T)m#nA&xvz;s#0NV!;9Ib4OC|VlA=b{$(!7D|xq*O?<|0`&g7hoJG`fs?N(&hPw z5PtR$LP%-AQw5)L+#ZGrrBKj(K6RlaNj?PQ-5iVv8e^^5kzSDEWQ@C1bv_q1K?E9A}2 zKK56Tg4MhR*SGjj*t6i9h!$}io7Wvw`xxFw#mp^0M0sShJMByKvcKwORGqIw=Q2&} zEFEye5e9o3CiG@oImY6Y(ZDoh9N$9>zIn5pos5;nd68X~?`JI5x*?}Ib#$AX*^IS= zXf4fgwRBZJeFC;PqJ29hvGt0$avls_mp_B35{_(6wU(>)t&X-`In7t4wYj;?#py9< z4g}--)Kz^)YkbH_YYF&xHK8nFIzo8`ka+Ptd`>yEyyM&PcD$ z=1{XUw2d}>P0n$x+?Hq>JpP{%}1hMPTd3ba&fYHiSy4VFs3@6^CCqS?7=>Z zPiO$TM|d@tx<~VBVT{+VC?m1lqfIQ5#ZK;A%9A@^P#PhIzwg~1dArc#?c4<3{=k&> z9vuGPwO17FA7o$kPs>8CmW8;!ja6-(nb;O?4?Q)qMD>mT9Lu`(d!)6b)!*yC zs=o_<&||yE7y1%MoX<;zI8T=(AnQNkhfAXPg2T|0XR!s)4wOt6w!kFS>W>p!T}=Ev z_nr7VKib~uUVGYhfP5wPuBU3}Z$lG$_Zr(-#&*2FBg$8Kv_0WO>Z|k#v^Bi$eV45< zyF_q2JQ0eg2!)(h`W^hz1wFNGBJ!5l<5N^yTQ5!M@qa|m!?&k8oFHt^4VAwA;(yUz zl04{fRLL9dpqM=P5?lGNk%^l*YB6>5?dFT3 zRpW6Eqi>4_T18Nb@rJi~+GJC2d!Z@bmiEyW1%P_XgE3ab>37bD5D1ePU*?;{wk*s9 z$02TsM!ya*dpvxgtMi#Ab7GrpKMa}Ch5hh=u**u{N%)xRmfnZ?OVtcS`Q3mSr~C2e zn6)^*%D)p}ZA4H(xsTkHWJL5^KqF#wv+_oKM5J2T2413gRhgO#yASG}o;U=02y-Ip zeu3ol{pu0Pd7hW^j#$p)BU%4_}p*db-0`^2*-EkWBdZ# zh*9(+zwjV-x0?&Qh|7aY!^HH9%rAe(ZYRtysba8evb7dDW6M`I7Ql;EO}r}_HCnL3 zv_3HRZk1(}0V}X=k`sKarnKovFPseST^}lsil5pSHe?AW(Off&n=JaKEmK@*a@t(s zBS6v5Zh1h2de|rE1OwgF{Qv^lnGE#7{5sBfMHiF$hqW*E4>R^LXdCvc$^KQUt|5k@ zU_HV;$M@&v9Ef>9sEAb0egl3$18}$$C~na~xZ$A=af9C)b3O%U8%^C_`cVg$;rLLV@P~+pVCouN6joN$F?Ax! z0nMKqO@ELAUzi1($_mz(?cGv_t4e|c)|jaW;JBM|nQ0A)U-NX2Q$kP~geqfDq|lwB%<|dBG`oCUO^&8{(6~{aXDGXy$fq!%mr;8bEYux-5!Vj+?yG+(}VWq zxn;b7`fFlFG(I|(A1rt)Sn#Gk{IG1mp39vn<*@S2ATPk8E3edK*Y9)~Hog}(~(ZY+1{ zMZ%NMspM&uJg$;QRPyVOz^`}1X_m~7U$V&reW<$L9`Gw@C~{;T32H*r500Lk^AtWA zP0zC^SWOPDXxva+8{;x)|2;;N%?uy{E|c=kk6dr2uEMhOl%e$ZL0r&7U~w?%23jy2 z=ov&A^Bq3Yu>}#V6hQD$B@bW~zs&JW>kGyT5J_;xx)0Djr`Sa74*)DzFVeX!2YkBs z4G}!eR7q$jQ1V$+4;^anh(7wikDo$`S%^lC;zy|{ z4?hY~arjvgkDqaL_#F{HcV8&@xm_irc6=ZFEK&NbhWZTdUH$`r>%ilFMJo|6m54RV#c?U#yIH%aOrQ{hHa?jM zL#u!~*kCmA+!9Ln;9$Xq@~F-#AF!r8wSzA1*-wcUs-^RE5aQ8<0pWjl&+M)cTo+a9 z@Zmyntv8xpks^=?s{%2f_t&eDTA~_(SX4yWR;pT^=ZZc+e?sL=5-7Fz*{;E{s_5%m z-U%{Lq)yiH?7UJ)dUeG+uMa!3HxaAg9FAH5$4_|#fD9~0*m&wDjsQ(L0v_Mh0*i>q zw13=v9tPo}J+)_IRKc;2)J6zcXaOF%&Nfd{wdsT^xEgX*0~M^#o2t~h5=Y z$T6K*`suDOWzQ+Ymc=<*Mc|;A^_47junqunfG&4w4r^U(j(-XJT;iIgG7vO!;i^#^ zI(6YE1?qRhS29I7snbMmFfEJ^SF$!N732~hP*T+B!hWd7lskpo`GbY2f2ESyDrr(l z{fA)jGpQA0e@Wx@@7O}3JpxT+s%}6*c@H9c-VPSWHzVH%2st#&x_}FC(t+&2<_yNfmjt;ovuOL0i0$>g-GcrdAyG<~ATK0fo z?Ik9$

O-I2ot#5dl<^yUFHoJ8+G5s?Y>MhC9Dr;GW`^XIdomA(t{5%+2T2(udh zAS}(C$@_M27_B&E(JGLZc>-#6m&-Z);x<VlD8t()W+L zq%MuKady+$_z{uI#iAedtPdD=5mj*O_e8@~y^86rXlT@g>Q{|0u;9 zbny+Mo_r6h;*m9Rt#eN6-lK~{>J%aev$*e47RQP;;>OW>_L-`9u`GUQI&h-wUXWb8 zOp2%L;@nb+;zLyNN8}h@UHpeEey~dQJ=*#iQv7wW0b6gEK_t7sD*j4*@j@1VIl1`3 z76LzA7r#>#{|qmIx*`9J>$_Z~J~_Ggd?`Lm7nfTot?W6f`0FQ9i)!G{XX_Uy7r#h~ zAFYeOj6CRjp(?(se_ZhkS-kV6q`v=o4uM||Cx1Q{LN_M!i3kq;_DfBU7PTF3SNf?Qh_!=rC-9A-uxnq>Ntmdc09aa<9NAnEtlJ!>{aqb zn*;6+emPNnc{Jh6Dt=kch3=C!L%s{}sH0ziT3VmJJ0Ye|-^BBG>C+L=1+bCM zlI2-c^dra`if#B0q1b)`-f<@bmn(gf@d-;fs3yc!+`4z5 zOnS&&e_G2=u^Yl42`s8HC5 zakIH5Lr=iEIAIQATAoQxXb}lxjrRjifoR5ym!`ZN^2u(lW)9~* z)mn@E0yKclm@Uz>4Q-uM0TYIJOMSH~s^k|E2X8V{8q;tJ|Iyg@lfgR>8V<6m$$tA> z1Uyg4!c5Y7VIH$Z-fwS|2UMOC>A?9Y)rXXXi8#5hDtQb`*3PSrY-=w;F_wWj-Kz!k5uwL_AP{0#hIu{{9}+3NoR7GAifH! zeD>eaRk5hyeX#EnDq-)(95E5>hg8S^N)|Gj+L*Oyx6!nO4^}&Ofxy=jcYVa?;!#^F zwJ;FMVoVENF`Rt!sfte+ROI$lOzyFH(T}RMF@JVN9Y6=c|Eo<0Dtx{r-Tv|QMn%_YE5VVmT zn}UgciB+-`liHQgC(BDP-!57{>1Ata2R^d;LRN3G`oV&Wa4UyK@I2py-{%hj!fFum zTMac*kUSHTb9ncJ%O%r@yt?pN^5lJUPdh_c@g$X;APGk5&o0qZK*zV@AGA(@3)jLF z5sUbrcYtln<3wEsq!|BV?yyS5m%dK>wBb`FtIwz{DvnMOXSR(zcTpOt;rxtQ5zE$! zccKOq(>)~A_Rb%3h9D60L!*hAgLW|-D6NKbs{APP2eJDr2u|LN8p?|{PRfAqHx0MC z{-_LFE<-exah`6^)x~j~2KPnW^uDEPe z-5ecs7Ez9Z@Xq2)w3j7Vwsc@;N%N#U=v{SA4YqybX&$TAIT&6?QHx}kb*?VKUAV)! zyQc;`YRn!EX}r?OIJvB7ANI)M2jI=fDIL7L_GdV07+K4U_SROEfu+Dm!|a!r3J;x$ z1UyuGDUbLaR$lOR(E7M+?|Wr!U*ovqugjf`o|Khf0r*kkoohKw5tk{{Y7ojR zpLi~G%ZYJx6&$R?Fd@0KkE0Co3hrxp(}^vT3vfhSp5GYvPVRtN1{^D2T+z*RxiR##@dQ)+d1o~1Hw zDUr1e#eR&uWu?W|0g9U$ZiL7%leMaN2^viaFAy2>;ymZ))#IhU!5o%E4)}R?A#Gs` zYdc>E{0eLht+8lQ-Y}3<&P?_;_bB&M_#&1A08%BoqVNF>eD4|#3UG?3if_WZA*^Lq zYxr##xJxK+;rnRxEwTA!LdqKg^>&{cUmue36-!F8pSpsK1a<6rUsOF&Lk6W$qfGO` z5`4;ae|}!HTAnwNJZz&zp|e+``vdmtT%f$`_`i%vcN6d&yN9ucIv7WRZ=EpS+H~87 zSN{0pliGISC~}1VS|`A=`$n-wq<68k=eDop^Jm7T)}W@c&ejqOvehxUU%6wZmld^* zJFD&EOvrXHGri;(eAzs9ZREJ9ksp0<`(kSy)a~&q$&y6b{`@!I;3p;ngw)TqM%-M+ zjs18k=2JeMO*t@FkK*=O-r2Qca$jT7xe%E?fx&xg!$dPi7d^=!iekT9pKATvQwd9~ z^+W8HTFQ4Q;k+^cRU`8Q8I>AvJ~0*jPr-i1qKb;f4MyW}EYz@{ylyx{@Ik!41$+qY z&oSoAB~#f6rZ3JZZ%P&I%@Nu&Jw)ZWw}H)x3iOz$K(}j5YvwknM?2fOjRzwEKR^fQoDscl*$RS?z+*okIqm0# z8|3_jj52GVS+JK!BFyF>Y1$z|Y1%en=HRZ3H2Z3xwWo(x$RmLQS~0@7KgDeX--Xuu zejbn3ejZxe>tnP}BsX#V%u6aFp@x&N=M`KpDY$k|9F5gnz$EJ+LT12&i{lBRAJ~9W z5WEr1gWa?eDBMaRApPXv0bw*L?v_e3@}Bzz-b}R4n*5>y>Q!=&O2(?>7b>~69V+au z1l25JnqZGDQTEuK@DRZslQG45Ca;w^hdm}K%zzI3jtQ*YQX{05F}Pv>QDB?NS;iu> zf~NwlgV127-8YzwZx)iN%rxeIME>#|0BXMKjLneM`A=91n|Yf);6wau!_MkqtiElv z=*_TUHFu!WaG3CEFrd0D)rNk-rkW(fJb|F--N`sq-kYlky_{d7Ssb@3+jbT3dE)OSPWV<3lxjoG#z3kuBAVwmemz zI<9l-_~TaAFF+P(m-<$u&{jmqlPqPoER;maD2#;wR9~YZ%0s&~T3VO`%Xo7hMyMhk z4-E$d`Mr!ql@*P+8{%8+y5cbjjbr&>>;7+nft1w$d(eMG9F(vgUbuLnROm$;m;?6M zS$z&cd&742-yYdqjW`vnrpmMzDolJ#Ojz?5((FveLUT2G$j;)!DkgDVZ?ESY{&`h7 zugVk@=4#qNSV`c1td>><&#WhAVg61!Uyn(3z$sALIkmP2j&w;k=JaKtg?cp}ru>>I z2zOvy$$n#2r;iO(paeWyol}j*`#DV53k9msw;9H)U&?T!zhV<2zIrNCQDxy0g6=FK zse;bX)S&89S*Y!spxwe=ly$BtZrk3wG?_vkIL;jVT3c^C#=yfFPdJsFo9-Z1?RlMu;JJz(6+}I11RDNMNDXKel0>F}HCMXHkTx&G_hV&$l-p_}E z56!(Fnr)r9!1JJ;bQBysM|G${L_=2S|fD=J2qoUM*RQ zNdPo)g&bBjHJvwT^%{FK2CWU_(bW(MUjpNygi{af>efn;qh3Y$c^ zo6!6mjWXSdFA`7QLbYU3jYXb{@|tjpX)htK1)X{}8Fa2l4LVnSV|K1BZrjnjBy}Sq zg{JnAP5ssqlBr<@8Vy+eo(umD*bM4fC5CEZplwS624o60Nqa2Zzfb*c4AfK!22Rx& zz{m~+V5@x+0>*%SiGUW30LZ+zHt!)|!V3xkk_A{p7L9;EX}N^$#UoE=m5BT)=`4D4 zYL@;SzJ(0&rfUMg7u{}I11V`}sAwf9BN+bwUruYZZx0~6=O1Tu1tW(bx(R>wIN1Bhy&V>S} z&VoY7qFLuJ+%TFA=`$8JF91n+anQ#QgYa#XNX0ARw?r;D9TaU@3#TMZ+FTiY(P_VX z!#{~7Jv%7m?0YbR!JrtTs#7$!HFFiI4)*|Hs1VOv_z8^bUcSgj#-bL1VngkX;22>( zJ?=Vp!>_u@2)!#NkRIyQpknJmMf2fhshI!u=`2I|*_^k93f#-97%}TX&wj9*6+h~l z<_SMe-!L`j5Nhi&IyPF+*^O=k8<>H(ce$$XU^bZ$dR^9&qneR1j$1t*hOL?$#YT(l zxX~gq?U2@GoDluDFpk$=Ba6|;1Q4jE`o5jOW&)fjYRbgf_kK5uL%Zd#sl+VU5roFoehA&cg)7m~Z=KGIVx@1uH2(y4y!Q%Qp) z=+UY(bdRtQ+u=h?#K9=#Ia#OjzVQ;w^BSBN5VOZ6Uhj{D>`;G+nBR(}TAIm+QH!pH zzp&zSyR7(p9*tDoWWvQsHVr@p9%0GnYeWK*{lNlil>kzzLQoF7tcM{Ivx`{W#zIp~)r{>3OnT^kq3s6mDllDVQzZ-o+kVl{6h1ka} zLwEZpbvN1H^`Yu7WMvHe4d^cv30zaL{wDU$)~hFbCgb+8nhFFw*ZLShEfF>OfUppL z8AR?i2x1c42r`6-8-ZHvXG4iO@uMErjquw_qQ!F~9A>_&8x_&zeD~#Nh!#{F+2rON zCx|#^DGbyw&2ba*Ixx5FmT$(cEU^+A6G>{y$Lc8=ijIeMPx;fJ`I|FrhP%@JIt?nhHFIg ziCDzgvvD&q1|LHd9bl=F22A@U!XLCl3VuYPUj-C!FsVWv5OUm1MB}oCt{2T*Xsd$K zU&UHmUM0mEOaV27m& zJh+yw0@)k&VN$x5D%JurAOsKxq3=1JQ0OXTZI4y(!5tP~MJ@pZU!b674uC}BJN@7M zHm-`qj-sI~FL;&Lr5%&qV*IKKL|%2L#F9@l%W~ z;MEK0BEiTZl^{+Q=VJ;e;6frqHXE@wd~oZ=#o_b_plribR6w~l9u&_;P6lPi2nEVq zx)2gTS@KOhc@t>!&#?*=p^X6VAr^2k5EqEWLTvw^dZ4U(EDkGTiJ?F;DA#IGKBMCx z0hF_k%0QRkE^Umjr=Bn&UnNOkVV6*ERA4$4nMCajU5T8Yq_Gb%Xs*+2P=n`sJlomZ zu4btg&aPST3|%l^YHj9glD!J~Tl8}!p6B7&&VF2#ZN?9lU7M*O@-w5=%-1Yy;`vGa z49RU?$Y-Z{i6kwnkl6jNM@^WZEx?bU)7*-L_ZR;|d@i%{a+%d?=2!Mu_{vfh;HS{m zYGy_Jsw`cp!^BEp1ztBEZD;TM3Hy1i+?pf49BVj+%|><7Cj6+4Q#dOQ?fVv|ZTsXY z)tLUcOq{Y`KOWIfcCQziK*5E6&yG470XbaS!LiO5n09ku+U=f?Fi~~WnD3fX<2Z;8 zd68~DxKG!3%nbbal{CRVBCMumi%nvQf7bQ|1a9%t!c7tgI+rt!WBRj_^#PgaJHE@m zCWj0SK!gg_BLv&`_9<}yfLr1KI70&APq~Vihas3IME#TS?Ob&bss-W^$YSU+-_O>> z!JCM%U*6@3oQE*j08xZ-PU*QAvJGkO0ov~v^nd6Xu!uFUK|lG&SaS-3JYy~wVE-Fl zH<7@0>8bq-Cp>}ZyH(U<3y_goJB9h^#0T35&cp`&*W<*DcQ7YMP_G0n)b;o(ce2nx z--n8LhShGVkft)Nfj{dC_*Dj6$9L}m(v#)y(;rn4)b9AMh<>bP<>D#{VL+SS58S#0 zTnt)d_vj%ko5qAJ8zxV8&9aT}Mp^dv{x}LSf=pPJ5AMD@jzj^)vJcRV#`@2dB)IS< z)xzz9wve!Dd#D;&@B$fp<5wlLhIiEVsR0Pc%p#t!73|Bn!I*NN4v-J*6G4M^ z_r0YakAK$;|dV7^0r9|j&Xdgl7}RH^>>P4R3;%QmgP0Qf2%*LlJfDI z=*LEU44*4)cwBn7dYc9`W*=97Q3AAp+UcR=b<^|QR%!7H@KXFng@ zX>Z`*4On!L<{%6_)I=d=v;YN^GsOT?PdFW4>Pc}tlc*!E`Nj8Es*xb6DoPc^1qtt^ zpY{~!5Uo%T$Ym*_Q1_}wGrW|WrEmt?X7&q?(GE#HDR#x&@Q!{I!o4UZN%FP&qbedF z7eqh)86U$VS-ImorT<~OH}Uqk?tua{G@>f-frK$5OS-4~65l=DW8aCf?)km$K?_Lt zR_X4wN=iPXSNa&;1NBvUu<1*WX+IUa#5;~nKCX^_dG##s3-cSq8*q$&Y5){-_deRSS=))U{Mav%DIgWt3zgq@Ep2 zZ2tyX!f9Q8s^_PXa&BUBsh{!FBKSYt%hP3oQ=*b*|Acu?E{-(xd)D8fqiMA=P=P}A+qBNMv-?Y>vVPC;hCw&@ z?s_^MVVp1odf`<|^wk*5!$RCzgL?wGcPaL%y`H0sKw$@9>cZ@P#Xu0*T5KEAV}l7h z2Vzehmy(j1;!Z|vsZwGN0-mv87yFu);@%Yf+AeEu>?<1d2A{;X=jpaRuVfrFU9R%A z*T;sg`pvpIHkG{c9G~oMEo>lH`7iGa036z+2>KhgGTNP-J=D&3SmMSq5w_>%`6axL+g

6s+g@>vf-gd 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%0AoykR%r6zY3?llv(>K-o|2B} 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⪚qp3Uq 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̵T$1_{Rv=xb+f}2&`HkGDKW&uxnB(XG=?=Nb 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 literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/report/testdata/sample.cpu b/plugin/debug/pkg/internal/report/testdata/sample.cpu new file mode 100644 index 0000000000000000000000000000000000000000..50eea72ea2dd48831c20043b35d53c23ba9eb51e GIT binary patch literal 1836 zcmV+{2h;c;iwFP!00004|Fo8CkXvOL$2~bG$-5`Xo@cX{JWY4o^z_1ZOLO2*%Kg%E zE6~z%bw-APv)R*ZB+1F-BwP1eN-1mW0Hd}r%BZz7fCH@1QYr%5o8-DGU1U+9N6&G|k5=l}fQ=RLdGZl*!2)rw$i&vay1%l5GdwD$b{ z#81vF#MTM%?{FlWWjd!mIm7>G*xExMhxK(YoH_c^>0NJq+-DlhfT(G(7{oU{_0+L9 z;-3?rA8Jki-mrmb_{#Qe5j)B>*lU0`!k7jOS+2{rSOkAJH65`H7J(e_M-ed5%q47# z>G(#hj(&C0}g58nE@$G<+{@;h(PPt?{t}l7SRnm!=gB| zLo|=VpX0*AThc=mEVOcvPJss8sA)ub1+W-y{lz0(JO(pNh{vD@dvag{i{s-*#Irbj zNj{518q?w#!`F9;P8#esKucRB9E-)7lzaz?H@H7L>24>=~-WK1)VTy?&16l`m z^qR3QQxzrfn{omTe#~`e4JWv&#gh1gZM%6;3>FE$40^FQ*JlGu;hVc2<+F6bzcul! z3;MA?H(&$n#vP=4lWWowt1TAe{GO&Y!U{L2C{VS8LSHz9+W9M~4?!)L!JHX{N{ zK$|1q+ou~guzoynK-In;696qmzXS>XV(JDbS%c^?bK!3`ih@trwKSHmRVF#mGni z@%VlP{8j?g0wpjHPraxB<$+qvFK6{(J2WMtD826}Wd=HTb0j;?R2Yl|`np zf&)YBLOjfKG*}WWJIYe9PqU-Ugq`vxB_WI1-24&7QZR^vZ7;zKxdO12_yi59E&#=} zQUZDW8eM?*r3V7?5^(UD4uDc{BybV_i(0%Y6=KkO;-`bAaghWr#)Fi@K?$fUVq7c% z7pFT~kO!9o1MCv~Ay=RrOxg*;F5wukRXD>jo=`{Nt0ZtKexI!FkWOeXFO|S*{8@(r zoycklT!w$>04R;iIAF2M@jcp!rQ&s<_Ex`K?8FuL35}|5J2|+5*AK8O@d$5l)={tI z7_h7GZ#2o5+b6k70$1Y+t}`bKYIL;(uEFOBP&bUyyhZ}o;>qu-?c6HwC@EYkf$Q+O zj`dZu8rN|k!>-3ee0@6>cg|b-dd>k`gKv+p zZuo0l49#B(BaC&!5DtlpLFRAZ6~J!9A5nlEt8k+PZo}@gD+l`7ZTJtlZ3*b5SARN5lzy9T z*cQ7T4@#)>HFdjg*aK`mzRTyB-8eN3wOY?x0o#BdaP0pq)CLY%><&CmZRF-F0sRiK z`5W=uwD}z`nvJ|3*e0BzVbu=}C17llz@50C9CTQ`lLHpJ3y+Wk{`uzT>;vmDqx61W%tNeW+WKhb+7a3B7MfQ|#ZuTMAJ&$tgc&9Ls2gMwFf zia}5;`_6b!@tx4Ce%_mOih&c>3r?}r7;lc|3qggTTCE;zc1qQTU$1&)r|#E+dc$e> zVPni|cuwe5YGpq^TB^FS`zOZ2-~rdXeyf7>ks}FAW!p7=VuImWLrBP*NWicpw)uO|Fsv>9H3&$&7 zO_bz|ft#v$rD}e(8BVSbf||Se(;S*+F9vRxXv_a{lggU>--tAD&KYX;puj~IP-Ps*tLkM_?1d9 z;k)OPxndvmDr2ixiMde@s1f^XK8VGV0aqCBM$?_L54)tCje&`Cn+btl~As z^J_*!ciB1QIOKSvA(u&zj5jvst~f`L;+(M2l$HNm#Nm N3 [label=" 11000" weight=100 penwidth=5 color="#b20000" tooltip="main testdata/source1:2:2 -> tee testdata/source2:2 (11000)" labeltooltip="main testdata/source1:2:2 -> tee testdata/source2:2 (11000)"] +N3 -> N1 [label=" 10000" weight=91 penwidth=5 color="#b20500" tooltip="tee testdata/source2:2 -> tee testdata/source2:8 (10000)" labeltooltip="tee testdata/source2:2 -> tee testdata/source2:8 (10000)"] +N6 -> N4 [label=" 100" color="#b2b0aa" tooltip="bar testdata/source1:10 -> tee testdata/source2:8 (100)" labeltooltip="bar testdata/source1:10 -> tee testdata/source2:8 (100)"] +N2 -> N6 [label=" 100" color="#b2b0aa" tooltip="main testdata/source1:2:2 -> bar testdata/source1:10 (100)" labeltooltip="main testdata/source1:2:2 -> bar testdata/source1:10 (100)"] +N7 -> N5 [label=" 10" color="#b2b2b1" tooltip="foo testdata/source1:4:4 -> bar testdata/source1:10 (10)" labeltooltip="foo testdata/source1:4:4 -> bar testdata/source1:10 (10)"] +N2 -> N7 [label=" 10" color="#b2b2b1" tooltip="main testdata/source1:2:2 -> foo testdata/source1:4:4 (10)" labeltooltip="main testdata/source1:2:2 -> foo testdata/source1:4:4 (10)"] +} diff --git a/plugin/debug/pkg/internal/report/testdata/source.rpt b/plugin/debug/pkg/internal/report/testdata/source.rpt new file mode 100644 index 00000000..9ec7b3b0 --- /dev/null +++ b/plugin/debug/pkg/internal/report/testdata/source.rpt @@ -0,0 +1,49 @@ +Total: 11111 +ROUTINE ======================== bar in testdata/source1 + 10 110 (flat, cum) 0.99% of Total + . . 5:source1 line 5; + . . 6:source1 line 6; + . . 7:source1 line 7; + . . 8:source1 line 8; + . . 9:source1 line 9; + 10 110 10:source1 line 10; + . . 11:source1 line 11; + . . 12:source1 line 12; + . . 13:source1 line 13; + . . 14:source1 line 14; + . . 15:source1 line 15; +ROUTINE ======================== foo in testdata/source1 + 0 10 (flat, cum) 0.09% of Total + . . 1:source1 line 1; + . . 2:source1 line 2; + . . 3:source1 line 3; + . 10 4:source1 line 4; + . . 5:source1 line 5; + . . 6:source1 line 6; + . . 7:source1 line 7; + . . 8:source1 line 8; + . . 9:source1 line 9; +ROUTINE ======================== main in testdata/source1 + 1 11111 (flat, cum) 100% of Total + . . 1:source1 line 1; + 1 11111 2:source1 line 2; + . . 3:source1 line 3; + . . 4:source1 line 4; + . . 5:source1 line 5; + . . 6:source1 line 6; + . . 7:source1 line 7; +ROUTINE ======================== tee in testdata/source2 + 11100 21100 (flat, cum) 189.90% of Total + . . 1:source2 line 1; + 1000 11000 2:source2 line 2; + . . 3:source2 line 3; + . . 4:source2 line 4; + . . 5:source2 line 5; + . . 6:source2 line 6; + . . 7:source2 line 7; + 10100 10100 8:source2 line 8; + . . 9:source2 line 9; + . . 10:source2 line 10; + . . 11:source2 line 11; + . . 12:source2 line 12; + . . 13:source2 line 13; diff --git a/plugin/debug/pkg/internal/report/testdata/source1 b/plugin/debug/pkg/internal/report/testdata/source1 new file mode 100644 index 00000000..70e3fc33 --- /dev/null +++ b/plugin/debug/pkg/internal/report/testdata/source1 @@ -0,0 +1,19 @@ +source1 line 1; +source1 line 2; +source1 line 3; +source1 line 4; +source1 line 5; +source1 line 6; +source1 line 7; +source1 line 8; +source1 line 9; +source1 line 10; +source1 line 11; +source1 line 12; +source1 line 13; +source1 line 14; +source1 line 15; +source1 line 16; +source1 line 17; +source1 line 18; + diff --git a/plugin/debug/pkg/internal/report/testdata/source2 b/plugin/debug/pkg/internal/report/testdata/source2 new file mode 100644 index 00000000..54f99cca --- /dev/null +++ b/plugin/debug/pkg/internal/report/testdata/source2 @@ -0,0 +1,19 @@ +source2 line 1; +source2 line 2; +source2 line 3; +source2 line 4; +source2 line 5; +source2 line 6; +source2 line 7; +source2 line 8; +source2 line 9; +source2 line 10; +source2 line 11; +source2 line 12; +source2 line 13; +source2 line 14; +source2 line 15; +source2 line 16; +source2 line 17; +source2 line 18; + diff --git a/plugin/debug/pkg/internal/symbolizer/symbolizer.go b/plugin/debug/pkg/internal/symbolizer/symbolizer.go new file mode 100644 index 00000000..e70ecc9a --- /dev/null +++ b/plugin/debug/pkg/internal/symbolizer/symbolizer.go @@ -0,0 +1,350 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package symbolizer provides a routine to populate a profile with +// symbol, file and line number information. It relies on the +// addr2liner and demangle packages to do the actual work. +package symbolizer + +import ( + "fmt" + "io" + "net/http" + "net/url" + "path/filepath" + "strings" + + "github.com/ianlancetaylor/demangle" + "m7s.live/v5/plugin/debug/pkg/internal/binutils" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/symbolz" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// Symbolizer implements the plugin.Symbolize interface. +type Symbolizer struct { + Obj plugin.ObjTool + UI plugin.UI + Transport http.RoundTripper +} + +// test taps for dependency injection +var symbolzSymbolize = symbolz.Symbolize +var localSymbolize = doLocalSymbolize +var demangleFunction = Demangle + +// Symbolize attempts to symbolize profile p. First uses binutils on +// local binaries; if the source is a URL it attempts to get any +// missed entries using symbolz. +func (s *Symbolizer) Symbolize(mode string, sources plugin.MappingSources, p *profile.Profile) error { + remote, local, fast, force, demanglerMode := true, true, false, false, "" + for _, o := range strings.Split(strings.ToLower(mode), ":") { + switch o { + case "": + continue + case "none", "no": + return nil + case "local": + remote, local = false, true + case "fastlocal": + remote, local, fast = false, true, true + case "remote": + remote, local = true, false + case "force": + force = true + default: + switch d := strings.TrimPrefix(o, "demangle="); d { + case "full", "none", "templates": + demanglerMode = d + force = true + continue + case "default": + continue + } + s.UI.PrintErr("ignoring unrecognized symbolization option: " + mode) + s.UI.PrintErr("expecting -symbolize=[local|fastlocal|remote|none][:force][:demangle=[none|full|templates|default]") + } + } + + var err error + if local { + // Symbolize locally using binutils. + if err = localSymbolize(p, fast, force, s.Obj, s.UI); err != nil { + s.UI.PrintErr("local symbolization: " + err.Error()) + } + } + if remote { + post := func(source, post string) ([]byte, error) { + return postURL(source, post, s.Transport) + } + if err = symbolzSymbolize(p, force, sources, post, s.UI); err != nil { + return err // Ran out of options. + } + } + + demangleFunction(p, force, demanglerMode) + return nil +} + +// postURL issues a POST to a URL over HTTP. +func postURL(source, post string, tr http.RoundTripper) ([]byte, error) { + client := &http.Client{ + Transport: tr, + } + resp, err := client.Post(source, "application/octet-stream", strings.NewReader(post)) + if err != nil { + return nil, fmt.Errorf("http post %s: %v", source, err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http post %s: %v", source, statusCodeError(resp)) + } + return io.ReadAll(resp.Body) +} + +func statusCodeError(resp *http.Response) error { + if resp.Header.Get("X-Go-Pprof") != "" && strings.Contains(resp.Header.Get("Content-Type"), "text/plain") { + // error is from pprof endpoint + if body, err := io.ReadAll(resp.Body); err == nil { + return fmt.Errorf("server response: %s - %s", resp.Status, body) + } + } + return fmt.Errorf("server response: %s", resp.Status) +} + +// doLocalSymbolize adds symbol and line number information to all locations +// in a profile. mode enables some options to control +// symbolization. +func doLocalSymbolize(prof *profile.Profile, fast, force bool, obj plugin.ObjTool, ui plugin.UI) error { + if fast { + if bu, ok := obj.(*binutils.Binutils); ok { + bu.SetFastSymbolization(true) + } + } + + functions := map[profile.Function]*profile.Function{} + addFunction := func(f *profile.Function) *profile.Function { + if fp := functions[*f]; fp != nil { + return fp + } + functions[*f] = f + f.ID = uint64(len(prof.Function)) + 1 + prof.Function = append(prof.Function, f) + return f + } + + missingBinaries := false + mappingLocs := map[*profile.Mapping][]*profile.Location{} + for _, l := range prof.Location { + mappingLocs[l.Mapping] = append(mappingLocs[l.Mapping], l) + } + for midx, m := range prof.Mapping { + locs := mappingLocs[m] + if len(locs) == 0 { + // The mapping is dangling and has no locations pointing to it. + continue + } + // Do not attempt to re-symbolize a mapping that has already been symbolized. + if !force && (m.HasFunctions || m.HasFilenames || m.HasLineNumbers) { + continue + } + if m.File == "" { + if midx == 0 { + ui.PrintErr("Main binary filename not available.") + continue + } + missingBinaries = true + continue + } + if m.Unsymbolizable() { + // Skip well-known system mappings + continue + } + if m.BuildID == "" { + if u, err := url.Parse(m.File); err == nil && u.IsAbs() && strings.Contains(strings.ToLower(u.Scheme), "http") { + // Skip mappings pointing to a source URL + continue + } + } + + name := filepath.Base(m.File) + if m.BuildID != "" { + name += fmt.Sprintf(" (build ID %s)", m.BuildID) + } + f, err := obj.Open(m.File, m.Start, m.Limit, m.Offset, m.KernelRelocationSymbol) + if err != nil { + ui.PrintErr("Local symbolization failed for ", name, ": ", err) + missingBinaries = true + continue + } + if fid := f.BuildID(); m.BuildID != "" && fid != "" && fid != m.BuildID { + ui.PrintErr("Local symbolization failed for ", name, ": build ID mismatch") + f.Close() + continue + } + symbolizeOneMapping(m, locs, f, addFunction) + f.Close() + } + + if missingBinaries { + ui.PrintErr("Some binary filenames not available. Symbolization may be incomplete.\n" + + "Try setting PPROF_BINARY_PATH to the search path for local binaries.") + } + return nil +} + +func symbolizeOneMapping(m *profile.Mapping, locs []*profile.Location, obj plugin.ObjFile, addFunction func(*profile.Function) *profile.Function) { + for _, l := range locs { + stack, err := obj.SourceLine(l.Address) + if err != nil || len(stack) == 0 { + // No answers from addr2line. + continue + } + + l.Line = make([]profile.Line, len(stack)) + l.IsFolded = false + for i, frame := range stack { + if frame.Func != "" { + m.HasFunctions = true + } + if frame.File != "" { + m.HasFilenames = true + } + if frame.Line != 0 { + m.HasLineNumbers = true + } + f := addFunction(&profile.Function{ + Name: frame.Func, + SystemName: frame.Func, + Filename: frame.File, + StartLine: int64(frame.StartLine), + }) + l.Line[i] = profile.Line{ + Function: f, + Line: int64(frame.Line), + Column: int64(frame.Column), + } + } + + if len(stack) > 0 { + m.HasInlineFrames = true + } + } +} + +// Demangle updates the function names in a profile with demangled C++ +// names, simplified according to demanglerMode. If force is set, +// overwrite any names that appear already demangled. +func Demangle(prof *profile.Profile, force bool, demanglerMode string) { + if force { + // Remove the current demangled names to force demangling + for _, f := range prof.Function { + if f.Name != "" && f.SystemName != "" { + f.Name = f.SystemName + } + } + } + + options := demanglerModeToOptions(demanglerMode) + // Bail out fast to avoid any parsing, if we really don't want any demangling. + if len(options) == 0 { + return + } + for _, fn := range prof.Function { + demangleSingleFunction(fn, options) + } +} + +func demanglerModeToOptions(demanglerMode string) []demangle.Option { + switch demanglerMode { + case "": // demangled, simplified: no parameters, no templates, no return type + return []demangle.Option{demangle.NoParams, demangle.NoEnclosingParams, demangle.NoTemplateParams} + case "templates": // demangled, simplified: no parameters, no return type + return []demangle.Option{demangle.NoParams, demangle.NoEnclosingParams} + case "full": + return []demangle.Option{demangle.NoClones} + case "none": // no demangling + return []demangle.Option{} + } + + panic(fmt.Sprintf("unknown demanglerMode %s", demanglerMode)) +} + +func demangleSingleFunction(fn *profile.Function, options []demangle.Option) { + if fn.Name != "" && fn.SystemName != fn.Name { + return // Already demangled. + } + // Copy the options because they may be updated by the call. + o := make([]demangle.Option, len(options)) + copy(o, options) + if demangled := demangle.Filter(fn.SystemName, o...); demangled != fn.SystemName { + fn.Name = demangled + return + } + // Could not demangle. Apply heuristics in case the name is + // already demangled. + name := fn.SystemName + if looksLikeDemangledCPlusPlus(name) { + for _, o := range options { + switch o { + case demangle.NoParams: + name = removeMatching(name, '(', ')') + case demangle.NoTemplateParams: + name = removeMatching(name, '<', '>') + } + } + } + fn.Name = name +} + +// looksLikeDemangledCPlusPlus is a heuristic to decide if a name is +// the result of demangling C++. If so, further heuristics will be +// applied to simplify the name. +func looksLikeDemangledCPlusPlus(demangled string) bool { + // Skip java names of the form "class.". + if strings.Contains(demangled, ".<") { + return false + } + // Skip Go names of the form "foo.(*Bar[...]).Method". + if strings.Contains(demangled, "]).") { + return false + } + return strings.ContainsAny(demangled, "<>[]") || strings.Contains(demangled, "::") +} + +// removeMatching removes nested instances of start..end from name. +func removeMatching(name string, start, end byte) string { + s := string(start) + string(end) + var nesting, first, current int + for index := strings.IndexAny(name[current:], s); index != -1; index = strings.IndexAny(name[current:], s) { + switch current += index; name[current] { + case start: + nesting++ + if nesting == 1 { + first = current + } + case end: + nesting-- + switch { + case nesting < 0: + return name // Mismatch, abort + case nesting == 0: + name = name[:first] + name[current+1:] + current = first - 1 + } + } + current++ + } + return name +} diff --git a/plugin/debug/pkg/internal/symbolizer/symbolizer_test.go b/plugin/debug/pkg/internal/symbolizer/symbolizer_test.go new file mode 100644 index 00000000..1381713d --- /dev/null +++ b/plugin/debug/pkg/internal/symbolizer/symbolizer_test.go @@ -0,0 +1,489 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package symbolizer + +import ( + "fmt" + "regexp" + "sort" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +const filePath = "mapping" +const buildID = "build-id" + +var testM = []*profile.Mapping{ + { + ID: 1, + Start: 0x1000, + Limit: 0x5000, + File: filePath, + BuildID: buildID, + }, +} + +var testL = []*profile.Location{ + { + ID: 1, + Mapping: testM[0], + Address: 1000, + }, + { + ID: 2, + Mapping: testM[0], + Address: 2000, + }, + { + ID: 3, + Mapping: testM[0], + Address: 3000, + }, + { + ID: 4, + Mapping: testM[0], + Address: 4000, + }, + { + ID: 5, + Mapping: testM[0], + Address: 5000, + }, +} + +var testProfile = profile.Profile{ + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "cpu", Unit: "cycles"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{testL[0]}, + Value: []int64{1}, + }, + { + Location: []*profile.Location{testL[1], testL[0]}, + Value: []int64{10}, + }, + { + Location: []*profile.Location{testL[2], testL[0]}, + Value: []int64{100}, + }, + { + Location: []*profile.Location{testL[3], testL[0]}, + Value: []int64{1}, + }, + { + Location: []*profile.Location{testL[4], testL[3], testL[0]}, + Value: []int64{10000}, + }, + }, + Location: testL, + Mapping: testM, + PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 10, +} + +func TestSymbolization(t *testing.T) { + sSym := symbolzSymbolize + lSym := localSymbolize + defer func() { + symbolzSymbolize = sSym + localSymbolize = lSym + demangleFunction = Demangle + }() + symbolzSymbolize = symbolzMock + localSymbolize = localMock + demangleFunction = demangleMock + + type testcase struct { + mode string + wantComment string + } + + s := Symbolizer{ + Obj: mockObjTool{}, + UI: &proftest.TestUI{T: t}, + } + for i, tc := range []testcase{ + { + "local", + "local=[]", + }, + { + "fastlocal", + "local=[fast]", + }, + { + "remote", + "symbolz=[]", + }, + { + "", + "local=[]:symbolz=[]", + }, + { + "demangle=none", + "demangle=[none]:force:local=[force]:symbolz=[force]", + }, + { + "remote:demangle=full", + "demangle=[full]:force:symbolz=[force]", + }, + { + "local:demangle=templates", + "demangle=[templates]:force:local=[force]", + }, + { + "force:remote", + "force:symbolz=[force]", + }, + } { + prof := testProfile.Copy() + if err := s.Symbolize(tc.mode, nil, prof); err != nil { + t.Errorf("symbolize #%d: %v", i, err) + continue + } + sort.Strings(prof.Comments) + if got, want := strings.Join(prof.Comments, ":"), tc.wantComment; got != want { + t.Errorf("%q: got %s, want %s", tc.mode, got, want) + continue + } + } +} + +func symbolzMock(p *profile.Profile, force bool, sources plugin.MappingSources, syms func(string, string) ([]byte, error), ui plugin.UI) error { + var args []string + if force { + args = append(args, "force") + } + p.Comments = append(p.Comments, "symbolz=["+strings.Join(args, ",")+"]") + return nil +} + +func localMock(p *profile.Profile, fast, force bool, obj plugin.ObjTool, ui plugin.UI) error { + var args []string + if fast { + args = append(args, "fast") + } + if force { + args = append(args, "force") + } + p.Comments = append(p.Comments, "local=["+strings.Join(args, ",")+"]") + return nil +} + +func demangleMock(p *profile.Profile, force bool, mode string) { + if force { + p.Comments = append(p.Comments, "force") + } + if mode != "" { + p.Comments = append(p.Comments, "demangle=["+mode+"]") + } +} + +func TestLocalSymbolization(t *testing.T) { + prof := testProfile.Copy() + + if prof.HasFunctions() { + t.Error("unexpected function names") + } + if prof.HasFileLines() { + t.Error("unexpected filenames or line numbers") + } + + b := mockObjTool{} + if err := localSymbolize(prof, false, false, b, &proftest.TestUI{T: t}); err != nil { + t.Fatalf("localSymbolize(): %v", err) + } + + for _, loc := range prof.Location { + if err := checkSymbolizedLocation(loc.Address, loc.Line); err != nil { + t.Errorf("location %d: %v", loc.Address, err) + } + } + if !prof.HasFunctions() { + t.Error("missing function names") + } + if !prof.HasFileLines() { + t.Error("missing filenames or line numbers") + } +} + +func TestLocalSymbolizationHandlesSpecialCases(t *testing.T) { + for _, tc := range []struct { + desc, file, buildID, allowOutputRx string + wantNumOutputRegexMatches int + }{{ + desc: "Unsymbolizable files are skipped", + file: "[some unsymbolizable file]", + buildID: "", + }, { + desc: "HTTP URL like paths are skipped", + file: "http://original-url-source-of-profile-fetch", + buildID: "", + }, { + desc: "Non-existent files are ignored", + file: "/does-not-exist", + buildID: buildID, + allowOutputRx: "(?s)unknown or non-existent file|Some binary filenames not available.*Try setting PPROF_BINARY_PATH", + wantNumOutputRegexMatches: 2, + }, { + desc: "Missing main binary is detected", + file: "", + buildID: buildID, + allowOutputRx: "Main binary filename not available", + wantNumOutputRegexMatches: 1, + }, { + desc: "Different build ID is detected", + file: filePath, + buildID: "unexpected-build-id", + allowOutputRx: "build ID mismatch", + wantNumOutputRegexMatches: 1, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + prof := testProfile.Copy() + prof.Mapping[0].File = tc.file + prof.Mapping[0].BuildID = tc.buildID + origProf := prof.Copy() + + if prof.HasFunctions() { + t.Error("unexpected function names") + } + if prof.HasFileLines() { + t.Error("unexpected filenames or line numbers") + } + + b := mockObjTool{} + ui := &proftest.TestUI{T: t, AllowRx: tc.allowOutputRx} + if err := localSymbolize(prof, false, false, b, ui); err != nil { + t.Fatalf("localSymbolize(): %v", err) + } + if ui.NumAllowRxMatches != tc.wantNumOutputRegexMatches { + t.Errorf("localSymbolize(): got %d matches for %q UI regexp, want %d", ui.NumAllowRxMatches, tc.allowOutputRx, tc.wantNumOutputRegexMatches) + } + + if diff, err := proftest.Diff([]byte(origProf.String()), []byte(prof.String())); err != nil { + t.Fatalf("Failed to get diff: %v", err) + } else if string(diff) != "" { + t.Errorf("Profile changed unexpectedly, diff(want->got):\n%s", diff) + } + }) + } +} + +func checkSymbolizedLocation(a uint64, got []profile.Line) error { + want, ok := mockAddresses[a] + if !ok { + return fmt.Errorf("unexpected address") + } + if len(want) != len(got) { + return fmt.Errorf("want len %d, got %d", len(want), len(got)) + } + + for i, w := range want { + g := got[i] + if g.Function.Name != w.Func { + return fmt.Errorf("want function: %q, got %q", w.Func, g.Function.Name) + } + if g.Function.Filename != w.File { + return fmt.Errorf("want filename: %q, got %q", w.File, g.Function.Filename) + } + if g.Line != int64(w.Line) { + return fmt.Errorf("want lineno: %d, got %d", w.Line, g.Line) + } + if g.Column != int64(w.Column) { + return fmt.Errorf("want columnno: %d, got %d", w.Column, g.Column) + } + } + return nil +} + +var mockAddresses = map[uint64][]plugin.Frame{ + 1000: {frame("fun11", "file11.src", 10, 1)}, + 2000: {frame("fun21", "file21.src", 20, 2), frame("fun22", "file22.src", 20, 2)}, + 3000: {frame("fun31", "file31.src", 30, 3), frame("fun32", "file32.src", 30, 3), frame("fun33", "file33.src", 30, 3)}, + 4000: {frame("fun41", "file41.src", 40, 4), frame("fun42", "file42.src", 40, 4), frame("fun43", "file43.src", 40, 4), frame("fun44", "file44.src", 40, 4)}, + 5000: {frame("fun51", "file51.src", 50, 5), frame("fun52", "file52.src", 50, 5), frame("fun53", "file53.src", 50, 5), frame("fun54", "file54.src", 50, 5), frame("fun55", "file55.src", 50, 5)}, +} + +func frame(fname, file string, line int, column int) plugin.Frame { + return plugin.Frame{ + Func: fname, + File: file, + Line: line, + Column: column} +} + +func TestDemangleSingleFunction(t *testing.T) { + // All tests with default mode. + demanglerMode := "" + options := demanglerModeToOptions(demanglerMode) + + cases := []struct { + symbol string + want string + }{ + { + // Trivial C symbol. + symbol: "printf", + want: "printf", + }, + { + // foo::bar(int) + symbol: "_ZN3foo3barEi", + want: "foo::bar", + }, + { + // Already demangled. + symbol: "foo::bar(int)", + want: "foo::bar", + }, + { + // int foo::baz(double) + symbol: "_ZN3foo3bazIdEEiT", + want: "foo::baz", + }, + { + // Already demangled. + // + // TODO: The demangled form of this is actually + // 'int foo::baz(double)', but our heuristic + // can't strip the return type. Should it be able to? + symbol: "foo::baz(double)", + want: "foo::baz", + }, + { + // operator delete[](void*) + symbol: "_ZdaPv", + want: "operator delete[]", + }, + { + // Already demangled. + symbol: "operator delete[](void*)", + want: "operator delete[]", + }, + { + // bar(int (*) [5]) + symbol: "_Z3barPA5_i", + want: "bar", + }, + { + // Already demangled. + symbol: "bar(int (*) [5])", + want: "bar", + }, + // Java symbols, do not demangle. + { + symbol: "java.lang.Float.parseFloat", + want: "java.lang.Float.parseFloat", + }, + { + symbol: "java.lang.Float.", + want: "java.lang.Float.", + }, + // Go symbols, do not demangle. + { + symbol: "example.com/foo.Bar", + want: "example.com/foo.Bar", + }, + { + symbol: "example.com/foo.(*Bar).Bat", + want: "example.com/foo.(*Bar).Bat", + }, + { + // Method on type with type parameters, as reported by + // Go pprof profiles (simplified symbol name). + symbol: "example.com/foo.(*Bar[...]).Bat", + want: "example.com/foo.(*Bar[...]).Bat", + }, + { + // Method on type with type parameters, as reported by + // perf profiles (actual symbol name). + symbol: "example.com/foo.(*Bar[go.shape.string_0,go.shape.int_1]).Bat", + want: "example.com/foo.(*Bar[go.shape.string_0,go.shape.int_1]).Bat", + }, + { + // Function with type parameters, as reported by Go + // pprof profiles (simplified symbol name). + symbol: "example.com/foo.Bar[...]", + want: "example.com/foo.Bar[...]", + }, + { + // Function with type parameters, as reported by perf + // profiles (actual symbol name). + symbol: "example.com/foo.Bar[go.shape.string_0,go.shape.int_1]", + want: "example.com/foo.Bar[go.shape.string_0,go.shape.int_1]", + }, + } + for _, tc := range cases { + fn := &profile.Function{ + SystemName: tc.symbol, + } + demangleSingleFunction(fn, options) + if fn.Name != tc.want { + t.Errorf("demangleSingleFunction(%s) got %s want %s", tc.symbol, fn.Name, tc.want) + } + } +} + +type mockObjTool struct{} + +func (mockObjTool) Open(file string, start, limit, offset uint64, relocationSymbol string) (plugin.ObjFile, error) { + if file != filePath { + return nil, fmt.Errorf("unknown or non-existent file %q", file) + } + return mockObjFile{frames: mockAddresses}, nil +} + +func (mockObjTool) Disasm(file string, start, end uint64, intelSyntax bool) ([]plugin.Inst, error) { + if file != filePath { + return nil, fmt.Errorf("unknown or non-existent file %q", file) + } + return nil, fmt.Errorf("disassembly not supported") +} + +type mockObjFile struct { + frames map[uint64][]plugin.Frame +} + +func (mockObjFile) Name() string { + return filePath +} + +func (mockObjFile) ObjAddr(addr uint64) (uint64, error) { + return addr, nil +} + +func (mockObjFile) BuildID() string { + return buildID +} + +func (mf mockObjFile) SourceLine(addr uint64) ([]plugin.Frame, error) { + return mf.frames[addr], nil +} + +func (mockObjFile) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { + return []*plugin.Sym{}, nil +} + +func (mockObjFile) Close() error { + return nil +} diff --git a/plugin/debug/pkg/internal/symbolz/symbolz.go b/plugin/debug/pkg/internal/symbolz/symbolz.go new file mode 100644 index 00000000..bb7f3596 --- /dev/null +++ b/plugin/debug/pkg/internal/symbolz/symbolz.go @@ -0,0 +1,196 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package symbolz symbolizes a profile using the output from the symbolz +// service. +package symbolz + +import ( + "bytes" + "fmt" + "io" + "net/url" + "path" + "regexp" + "strconv" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +var ( + symbolzRE = regexp.MustCompile(`(0x[[:xdigit:]]+)\s+(.*)`) +) + +// Symbolize symbolizes profile p by parsing data returned by a symbolz +// handler. syms receives the symbolz query (hex addresses separated by '+') +// and returns the symbolz output in a string. If force is false, it will only +// symbolize locations from mappings not already marked as HasFunctions. Does +// not skip unsymbolizable files since the symbolz handler can be flexible +// enough to handle some of those cases such as JIT locations in //anon. +func Symbolize(p *profile.Profile, force bool, sources plugin.MappingSources, syms func(string, string) ([]byte, error), ui plugin.UI) error { + for _, m := range p.Mapping { + if !force && m.HasFunctions { + // Only check for HasFunctions as symbolz only populates function names. + continue + } + mappingSources := sources[m.File] + if m.BuildID != "" { + mappingSources = append(mappingSources, sources[m.BuildID]...) + } + for _, source := range mappingSources { + if symz := symbolz(source.Source); symz != "" { + if err := symbolizeMapping(symz, int64(source.Start)-int64(m.Start), syms, m, p); err != nil { + return err + } + m.HasFunctions = true + break + } + } + } + + return nil +} + +// hasGperftoolsSuffix checks whether path ends with one of the suffixes listed in +// pprof_remote_servers.html from the gperftools distribution +func hasGperftoolsSuffix(path string) bool { + suffixes := []string{ + "/pprof/heap", + "/pprof/growth", + "/pprof/profile", + "/pprof/pmuprofile", + "/pprof/contention", + } + for _, s := range suffixes { + if strings.HasSuffix(path, s) { + return true + } + } + return false +} + +// symbolz returns the corresponding symbolz source for a profile URL. +func symbolz(source string) string { + if url, err := url.Parse(source); err == nil && url.Host != "" { + // All paths in the net/http/pprof Go package contain /debug/pprof/ + if strings.Contains(url.Path, "/debug/pprof/") || hasGperftoolsSuffix(url.Path) { + url.Path = path.Clean(url.Path + "/../symbol") + } else { + url.Path = path.Clean(url.Path + "/../symbolz") + } + url.RawQuery = "" + return url.String() + } + + return "" +} + +// symbolizeMapping symbolizes locations belonging to a Mapping by querying +// a symbolz handler. An offset is applied to all addresses to take care of +// normalization occurred for merged Mappings. +func symbolizeMapping(source string, offset int64, syms func(string, string) ([]byte, error), m *profile.Mapping, p *profile.Profile) error { + // Construct query of addresses to symbolize. + var a []string + for _, l := range p.Location { + if l.Mapping == m && l.Address != 0 && len(l.Line) == 0 { + // Compensate for normalization. + addr, overflow := adjust(l.Address, offset) + if overflow { + return fmt.Errorf("cannot adjust address %d by %d, it would overflow (mapping %v)", l.Address, offset, l.Mapping) + } + a = append(a, fmt.Sprintf("%#x", addr)) + } + } + + if len(a) == 0 { + // No addresses to symbolize. + return nil + } + + lines := make(map[uint64]profile.Line) + functions := make(map[string]*profile.Function) + + b, err := syms(source, strings.Join(a, "+")) + if err != nil { + return err + } + + buf := bytes.NewBuffer(b) + for { + l, err := buf.ReadString('\n') + + if err != nil { + if err == io.EOF { + break + } + return err + } + + if symbol := symbolzRE.FindStringSubmatch(l); len(symbol) == 3 { + origAddr, err := strconv.ParseUint(symbol[1], 0, 64) + if err != nil { + return fmt.Errorf("unexpected parse failure %s: %v", symbol[1], err) + } + // Reapply offset expected by the profile. + addr, overflow := adjust(origAddr, -offset) + if overflow { + return fmt.Errorf("cannot adjust symbolz address %d by %d, it would overflow", origAddr, -offset) + } + + name := symbol[2] + fn := functions[name] + if fn == nil { + fn = &profile.Function{ + ID: uint64(len(p.Function) + 1), + Name: name, + SystemName: name, + } + functions[name] = fn + p.Function = append(p.Function, fn) + } + + lines[addr] = profile.Line{Function: fn} + } + } + + for _, l := range p.Location { + if l.Mapping != m { + continue + } + if line, ok := lines[l.Address]; ok { + l.Line = []profile.Line{line} + } + } + + return nil +} + +// adjust shifts the specified address by the signed offset. It returns the +// adjusted address. It signals that the address cannot be adjusted without an +// overflow by returning true in the second return value. +func adjust(addr uint64, offset int64) (uint64, bool) { + adj := uint64(int64(addr) + offset) + if offset < 0 { + if adj >= addr { + return 0, true + } + } else { + if adj < addr { + return 0, true + } + } + return adj, false +} diff --git a/plugin/debug/pkg/internal/symbolz/symbolz_test.go b/plugin/debug/pkg/internal/symbolz/symbolz_test.go new file mode 100644 index 00000000..f1c552b0 --- /dev/null +++ b/plugin/debug/pkg/internal/symbolz/symbolz_test.go @@ -0,0 +1,170 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package symbolz + +import ( + "fmt" + "math" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func TestSymbolzURL(t *testing.T) { + for try, want := range map[string]string{ + "http://host:8000/profilez": "http://host:8000/symbolz", + "http://host:8000/profilez?seconds=5": "http://host:8000/symbolz", + "http://host:8000/profilez?seconds=5&format=proto": "http://host:8000/symbolz", + "http://host:8000/heapz?format=legacy": "http://host:8000/symbolz", + "http://host:8000/some/deeper/path/profilez?seconds=5": "http://host:8000/some/deeper/path/symbolz", + "http://host:8000/debug/pprof/profile": "http://host:8000/debug/pprof/symbol", + "http://host:8000/debug/pprof/profile?seconds=10": "http://host:8000/debug/pprof/symbol", + "http://host:8000/debug/pprof/heap": "http://host:8000/debug/pprof/symbol", + "http://some.host:8080/some/deeper/path/debug/pprof/endpoint?param=value": "http://some.host:8080/some/deeper/path/debug/pprof/symbol", + "http://host:8000/pprof/profile": "http://host:8000/pprof/symbol", + "http://host:8000/pprof/profile?seconds=15": "http://host:8000/pprof/symbol", + "http://host:8000/pprof/heap": "http://host:8000/pprof/symbol", + "http://host:8000/debug/pprof/block": "http://host:8000/debug/pprof/symbol", + "http://host:8000/debug/pprof/trace?seconds=5": "http://host:8000/debug/pprof/symbol", + "http://host:8000/debug/pprof/mutex": "http://host:8000/debug/pprof/symbol", + "http://host/whatever/pprof/heap": "http://host/whatever/pprof/symbol", + "http://host/whatever/pprof/growth": "http://host/whatever/pprof/symbol", + "http://host/whatever/pprof/profile": "http://host/whatever/pprof/symbol", + "http://host/whatever/pprof/pmuprofile": "http://host/whatever/pprof/symbol", + "http://host/whatever/pprof/contention": "http://host/whatever/pprof/symbol", + } { + if got := symbolz(try); got != want { + t.Errorf(`symbolz(%s)=%s, want "%s"`, try, got, want) + } + } +} + +func TestSymbolize(t *testing.T) { + s := plugin.MappingSources{ + "buildid": []struct { + Source string + Start uint64 + }{ + {Source: "http://localhost:80/profilez"}, + }, + } + + for _, hasFunctions := range []bool{false, true} { + for _, force := range []bool{false, true} { + p := testProfile(hasFunctions) + + if err := Symbolize(p, force, s, fetchSymbols, &proftest.TestUI{T: t}); err != nil { + t.Errorf("symbolz: %v", err) + continue + } + var wantSym, wantNoSym []*profile.Location + if force || !hasFunctions { + wantNoSym = p.Location[:1] + wantSym = p.Location[1:] + } else { + wantNoSym = p.Location + } + + if err := checkSymbolized(wantSym, true); err != nil { + t.Errorf("symbolz hasFns=%v force=%v: %v", hasFunctions, force, err) + } + if err := checkSymbolized(wantNoSym, false); err != nil { + t.Errorf("symbolz hasFns=%v force=%v: %v", hasFunctions, force, err) + } + } + } +} + +func testProfile(hasFunctions bool) *profile.Profile { + m := []*profile.Mapping{ + { + ID: 1, + Start: 0x1000, + Limit: 0x5000, + BuildID: "buildid", + HasFunctions: hasFunctions, + }, + } + p := &profile.Profile{ + Location: []*profile.Location{ + {ID: 1, Mapping: m[0], Address: 0x1000}, + {ID: 2, Mapping: m[0], Address: 0x2000}, + {ID: 3, Mapping: m[0], Address: 0x3000}, + {ID: 4, Mapping: m[0], Address: 0x4000}, + }, + Mapping: m, + } + + return p +} + +func checkSymbolized(locs []*profile.Location, wantSymbolized bool) error { + for _, loc := range locs { + if !wantSymbolized && len(loc.Line) != 0 { + return fmt.Errorf("unexpected symbolization for %#x: %v", loc.Address, loc.Line) + } + if wantSymbolized { + if len(loc.Line) != 1 { + return fmt.Errorf("expected symbolization for %#x: %v", loc.Address, loc.Line) + } + address := loc.Address - loc.Mapping.Start + if got, want := loc.Line[0].Function.Name, fmt.Sprintf("%#x", address); got != want { + return fmt.Errorf("symbolz %#x, got %s, want %s", address, got, want) + } + } + } + return nil +} + +func fetchSymbols(source, post string) ([]byte, error) { + var symbolz string + + addresses := strings.Split(post, "+") + // Do not symbolize the first symbol. + for _, address := range addresses[1:] { + symbolz += fmt.Sprintf("%s\t%s\n", address, address) + } + return []byte(symbolz), nil +} + +func TestAdjust(t *testing.T) { + for _, tc := range []struct { + addr uint64 + offset int64 + wantAdj uint64 + wantOverflow bool + }{{math.MaxUint64, 0, math.MaxUint64, false}, + {math.MaxUint64, 1, 0, true}, + {math.MaxUint64 - 1, 1, math.MaxUint64, false}, + {math.MaxUint64 - 1, 2, 0, true}, + {math.MaxInt64 + 1, math.MaxInt64, math.MaxUint64, false}, + {0, 0, 0, false}, + {0, -1, 0, true}, + {1, -1, 0, false}, + {2, -1, 1, false}, + {2, -2, 0, false}, + {2, -3, 0, true}, + {-math.MinInt64, math.MinInt64, 0, false}, + {-math.MinInt64 + 1, math.MinInt64, 1, false}, + {-math.MinInt64 - 1, math.MinInt64, 0, true}, + } { + if adj, overflow := adjust(tc.addr, tc.offset); adj != tc.wantAdj || overflow != tc.wantOverflow { + t.Errorf("adjust(%d, %d) = (%d, %t), want (%d, %t)", tc.addr, tc.offset, adj, overflow, tc.wantAdj, tc.wantOverflow) + } + } +} diff --git a/plugin/debug/pkg/internal/transport/transport.go b/plugin/debug/pkg/internal/transport/transport.go new file mode 100644 index 00000000..a46f4c72 --- /dev/null +++ b/plugin/debug/pkg/internal/transport/transport.go @@ -0,0 +1,131 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package transport provides a mechanism to send requests with https cert, +// key, and CA. +package transport + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "net/http" + "os" + "sync" + + "m7s.live/v5/plugin/debug/pkg/internal/plugin" +) + +type transport struct { + cert *string + key *string + ca *string + caCertPool *x509.CertPool + certs []tls.Certificate + initOnce sync.Once + initErr error +} + +const extraUsage = ` -tls_cert TLS client certificate file for fetching profile and symbols + -tls_key TLS private key file for fetching profile and symbols + -tls_ca TLS CA certs file for fetching profile and symbols` + +// New returns a round tripper for making requests with the +// specified cert, key, and ca. The flags tls_cert, tls_key, and tls_ca are +// added to the flagset to allow a user to specify the cert, key, and ca. If +// the flagset is nil, no flags will be added, and users will not be able to +// use these flags. +func New(flagset plugin.FlagSet) http.RoundTripper { + if flagset == nil { + return &transport{} + } + flagset.AddExtraUsage(extraUsage) + return &transport{ + cert: flagset.String("tls_cert", "", "TLS client certificate file for fetching profile and symbols"), + key: flagset.String("tls_key", "", "TLS private key file for fetching profile and symbols"), + ca: flagset.String("tls_ca", "", "TLS CA certs file for fetching profile and symbols"), + } +} + +// initialize uses the cert, key, and ca to initialize the certs +// to use these when making requests. +func (tr *transport) initialize() error { + var cert, key, ca string + if tr.cert != nil { + cert = *tr.cert + } + if tr.key != nil { + key = *tr.key + } + if tr.ca != nil { + ca = *tr.ca + } + + if cert != "" && key != "" { + tlsCert, err := tls.LoadX509KeyPair(cert, key) + if err != nil { + return fmt.Errorf("could not load certificate/key pair specified by -tls_cert and -tls_key: %v", err) + } + tr.certs = []tls.Certificate{tlsCert} + } else if cert == "" && key != "" { + return fmt.Errorf("-tls_key is specified, so -tls_cert must also be specified") + } else if cert != "" && key == "" { + return fmt.Errorf("-tls_cert is specified, so -tls_key must also be specified") + } + + if ca != "" { + caCertPool := x509.NewCertPool() + caCert, err := os.ReadFile(ca) + if err != nil { + return fmt.Errorf("could not load CA specified by -tls_ca: %v", err) + } + caCertPool.AppendCertsFromPEM(caCert) + tr.caCertPool = caCertPool + } + + return nil +} + +// RoundTrip executes a single HTTP transaction, returning +// a Response for the provided Request. +func (tr *transport) RoundTrip(req *http.Request) (*http.Response, error) { + tr.initOnce.Do(func() { + tr.initErr = tr.initialize() + }) + if tr.initErr != nil { + return nil, tr.initErr + } + + tlsConfig := &tls.Config{ + RootCAs: tr.caCertPool, + Certificates: tr.certs, + } + + if req.URL.Scheme == "https+insecure" { + // Make shallow copy of request, and req.URL, so the request's URL can be + // modified. + r := *req + *r.URL = *req.URL + req = &r + tlsConfig.InsecureSkipVerify = true + req.URL.Scheme = "https" + } + + transport := http.Transport{ + Proxy: http.ProxyFromEnvironment, + TLSClientConfig: tlsConfig, + } + + return transport.RoundTrip(req) +} diff --git a/plugin/debug/pkg/profile/encode.go b/plugin/debug/pkg/profile/encode.go new file mode 100644 index 00000000..8ce9d3cf --- /dev/null +++ b/plugin/debug/pkg/profile/encode.go @@ -0,0 +1,596 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "errors" + "sort" + "strings" +) + +func (p *Profile) decoder() []decoder { + return profileDecoder +} + +// preEncode populates the unexported fields to be used by encode +// (with suffix X) from the corresponding exported fields. The +// exported fields are cleared up to facilitate testing. +func (p *Profile) preEncode() { + strings := make(map[string]int) + addString(strings, "") + + for _, st := range p.SampleType { + st.typeX = addString(strings, st.Type) + st.unitX = addString(strings, st.Unit) + } + + for _, s := range p.Sample { + s.labelX = nil + var keys []string + for k := range s.Label { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + vs := s.Label[k] + for _, v := range vs { + s.labelX = append(s.labelX, + label{ + keyX: addString(strings, k), + strX: addString(strings, v), + }, + ) + } + } + var numKeys []string + for k := range s.NumLabel { + numKeys = append(numKeys, k) + } + sort.Strings(numKeys) + for _, k := range numKeys { + keyX := addString(strings, k) + vs := s.NumLabel[k] + units := s.NumUnit[k] + for i, v := range vs { + var unitX int64 + if len(units) != 0 { + unitX = addString(strings, units[i]) + } + s.labelX = append(s.labelX, + label{ + keyX: keyX, + numX: v, + unitX: unitX, + }, + ) + } + } + s.locationIDX = make([]uint64, len(s.Location)) + for i, loc := range s.Location { + s.locationIDX[i] = loc.ID + } + } + + for _, m := range p.Mapping { + m.fileX = addString(strings, m.File) + m.buildIDX = addString(strings, m.BuildID) + } + + for _, l := range p.Location { + for i, ln := range l.Line { + if ln.Function != nil { + l.Line[i].functionIDX = ln.Function.ID + } else { + l.Line[i].functionIDX = 0 + } + } + if l.Mapping != nil { + l.mappingIDX = l.Mapping.ID + } else { + l.mappingIDX = 0 + } + } + for _, f := range p.Function { + f.nameX = addString(strings, f.Name) + f.systemNameX = addString(strings, f.SystemName) + f.filenameX = addString(strings, f.Filename) + } + + p.dropFramesX = addString(strings, p.DropFrames) + p.keepFramesX = addString(strings, p.KeepFrames) + + if pt := p.PeriodType; pt != nil { + pt.typeX = addString(strings, pt.Type) + pt.unitX = addString(strings, pt.Unit) + } + + p.commentX = nil + for _, c := range p.Comments { + p.commentX = append(p.commentX, addString(strings, c)) + } + + p.defaultSampleTypeX = addString(strings, p.DefaultSampleType) + p.docURLX = addString(strings, p.DocURL) + + p.stringTable = make([]string, len(strings)) + for s, i := range strings { + p.stringTable[i] = s + } +} + +func (p *Profile) encode(b *buffer) { + for _, x := range p.SampleType { + encodeMessage(b, 1, x) + } + for _, x := range p.Sample { + encodeMessage(b, 2, x) + } + for _, x := range p.Mapping { + encodeMessage(b, 3, x) + } + for _, x := range p.Location { + encodeMessage(b, 4, x) + } + for _, x := range p.Function { + encodeMessage(b, 5, x) + } + encodeStrings(b, 6, p.stringTable) + encodeInt64Opt(b, 7, p.dropFramesX) + encodeInt64Opt(b, 8, p.keepFramesX) + encodeInt64Opt(b, 9, p.TimeNanos) + encodeInt64Opt(b, 10, p.DurationNanos) + if pt := p.PeriodType; pt != nil && (pt.typeX != 0 || pt.unitX != 0) { + encodeMessage(b, 11, p.PeriodType) + } + encodeInt64Opt(b, 12, p.Period) + encodeInt64s(b, 13, p.commentX) + encodeInt64(b, 14, p.defaultSampleTypeX) + encodeInt64Opt(b, 15, p.docURLX) +} + +var profileDecoder = []decoder{ + nil, // 0 + // repeated ValueType sample_type = 1 + func(b *buffer, m message) error { + x := new(ValueType) + pp := m.(*Profile) + pp.SampleType = append(pp.SampleType, x) + return decodeMessage(b, x) + }, + // repeated Sample sample = 2 + func(b *buffer, m message) error { + x := new(Sample) + pp := m.(*Profile) + pp.Sample = append(pp.Sample, x) + return decodeMessage(b, x) + }, + // repeated Mapping mapping = 3 + func(b *buffer, m message) error { + x := new(Mapping) + pp := m.(*Profile) + pp.Mapping = append(pp.Mapping, x) + return decodeMessage(b, x) + }, + // repeated Location location = 4 + func(b *buffer, m message) error { + x := new(Location) + x.Line = b.tmpLines[:0] // Use shared space temporarily + pp := m.(*Profile) + pp.Location = append(pp.Location, x) + err := decodeMessage(b, x) + b.tmpLines = x.Line[:0] + // Copy to shrink size and detach from shared space. + x.Line = append([]Line(nil), x.Line...) + return err + }, + // repeated Function function = 5 + func(b *buffer, m message) error { + x := new(Function) + pp := m.(*Profile) + pp.Function = append(pp.Function, x) + return decodeMessage(b, x) + }, + // repeated string string_table = 6 + func(b *buffer, m message) error { + err := decodeStrings(b, &m.(*Profile).stringTable) + if err != nil { + return err + } + if m.(*Profile).stringTable[0] != "" { + return errors.New("string_table[0] must be ''") + } + return nil + }, + // int64 drop_frames = 7 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).dropFramesX) }, + // int64 keep_frames = 8 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).keepFramesX) }, + // int64 time_nanos = 9 + func(b *buffer, m message) error { + if m.(*Profile).TimeNanos != 0 { + return errConcatProfile + } + return decodeInt64(b, &m.(*Profile).TimeNanos) + }, + // int64 duration_nanos = 10 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).DurationNanos) }, + // ValueType period_type = 11 + func(b *buffer, m message) error { + x := new(ValueType) + pp := m.(*Profile) + pp.PeriodType = x + return decodeMessage(b, x) + }, + // int64 period = 12 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).Period) }, + // repeated int64 comment = 13 + func(b *buffer, m message) error { return decodeInt64s(b, &m.(*Profile).commentX) }, + // int64 defaultSampleType = 14 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).defaultSampleTypeX) }, + // string doc_link = 15; + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).docURLX) }, +} + +// postDecode takes the unexported fields populated by decode (with +// suffix X) and populates the corresponding exported fields. +// The unexported fields are cleared up to facilitate testing. +func (p *Profile) postDecode() error { + var err error + mappings := make(map[uint64]*Mapping, len(p.Mapping)) + mappingIds := make([]*Mapping, len(p.Mapping)+1) + for _, m := range p.Mapping { + m.File, err = getString(p.stringTable, &m.fileX, err) + m.BuildID, err = getString(p.stringTable, &m.buildIDX, err) + if m.ID < uint64(len(mappingIds)) { + mappingIds[m.ID] = m + } else { + mappings[m.ID] = m + } + + // If this a main linux kernel mapping with a relocation symbol suffix + // ("[kernel.kallsyms]_text"), extract said suffix. + // It is fairly hacky to handle at this level, but the alternatives appear even worse. + const prefix = "[kernel.kallsyms]" + if strings.HasPrefix(m.File, prefix) { + m.KernelRelocationSymbol = m.File[len(prefix):] + } + } + + functions := make(map[uint64]*Function, len(p.Function)) + functionIds := make([]*Function, len(p.Function)+1) + for _, f := range p.Function { + f.Name, err = getString(p.stringTable, &f.nameX, err) + f.SystemName, err = getString(p.stringTable, &f.systemNameX, err) + f.Filename, err = getString(p.stringTable, &f.filenameX, err) + if f.ID < uint64(len(functionIds)) { + functionIds[f.ID] = f + } else { + functions[f.ID] = f + } + } + + locations := make(map[uint64]*Location, len(p.Location)) + locationIds := make([]*Location, len(p.Location)+1) + for _, l := range p.Location { + if id := l.mappingIDX; id < uint64(len(mappingIds)) { + l.Mapping = mappingIds[id] + } else { + l.Mapping = mappings[id] + } + l.mappingIDX = 0 + for i, ln := range l.Line { + if id := ln.functionIDX; id != 0 { + l.Line[i].functionIDX = 0 + if id < uint64(len(functionIds)) { + l.Line[i].Function = functionIds[id] + } else { + l.Line[i].Function = functions[id] + } + } + } + if l.ID < uint64(len(locationIds)) { + locationIds[l.ID] = l + } else { + locations[l.ID] = l + } + } + + for _, st := range p.SampleType { + st.Type, err = getString(p.stringTable, &st.typeX, err) + st.Unit, err = getString(p.stringTable, &st.unitX, err) + } + + // Pre-allocate space for all locations. + numLocations := 0 + for _, s := range p.Sample { + numLocations += len(s.locationIDX) + } + locBuffer := make([]*Location, numLocations) + + for _, s := range p.Sample { + if len(s.labelX) > 0 { + labels := make(map[string][]string, len(s.labelX)) + numLabels := make(map[string][]int64, len(s.labelX)) + numUnits := make(map[string][]string, len(s.labelX)) + for _, l := range s.labelX { + var key, value string + key, err = getString(p.stringTable, &l.keyX, err) + if l.strX != 0 { + value, err = getString(p.stringTable, &l.strX, err) + labels[key] = append(labels[key], value) + } else if l.numX != 0 || l.unitX != 0 { + numValues := numLabels[key] + units := numUnits[key] + if l.unitX != 0 { + var unit string + unit, err = getString(p.stringTable, &l.unitX, err) + units = padStringArray(units, len(numValues)) + numUnits[key] = append(units, unit) + } + numLabels[key] = append(numLabels[key], l.numX) + } + } + if len(labels) > 0 { + s.Label = labels + } + if len(numLabels) > 0 { + s.NumLabel = numLabels + for key, units := range numUnits { + if len(units) > 0 { + numUnits[key] = padStringArray(units, len(numLabels[key])) + } + } + s.NumUnit = numUnits + } + } + + s.Location = locBuffer[:len(s.locationIDX)] + locBuffer = locBuffer[len(s.locationIDX):] + for i, lid := range s.locationIDX { + if lid < uint64(len(locationIds)) { + s.Location[i] = locationIds[lid] + } else { + s.Location[i] = locations[lid] + } + } + s.locationIDX = nil + } + + p.DropFrames, err = getString(p.stringTable, &p.dropFramesX, err) + p.KeepFrames, err = getString(p.stringTable, &p.keepFramesX, err) + + if pt := p.PeriodType; pt == nil { + p.PeriodType = &ValueType{} + } + + if pt := p.PeriodType; pt != nil { + pt.Type, err = getString(p.stringTable, &pt.typeX, err) + pt.Unit, err = getString(p.stringTable, &pt.unitX, err) + } + + for _, i := range p.commentX { + var c string + c, err = getString(p.stringTable, &i, err) + p.Comments = append(p.Comments, c) + } + + p.commentX = nil + p.DefaultSampleType, err = getString(p.stringTable, &p.defaultSampleTypeX, err) + p.DocURL, err = getString(p.stringTable, &p.docURLX, err) + p.stringTable = nil + return err +} + +// padStringArray pads arr with enough empty strings to make arr +// length l when arr's length is less than l. +func padStringArray(arr []string, l int) []string { + if l <= len(arr) { + return arr + } + return append(arr, make([]string, l-len(arr))...) +} + +func (p *ValueType) decoder() []decoder { + return valueTypeDecoder +} + +func (p *ValueType) encode(b *buffer) { + encodeInt64Opt(b, 1, p.typeX) + encodeInt64Opt(b, 2, p.unitX) +} + +var valueTypeDecoder = []decoder{ + nil, // 0 + // optional int64 type = 1 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*ValueType).typeX) }, + // optional int64 unit = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*ValueType).unitX) }, +} + +func (p *Sample) decoder() []decoder { + return sampleDecoder +} + +func (p *Sample) encode(b *buffer) { + encodeUint64s(b, 1, p.locationIDX) + encodeInt64s(b, 2, p.Value) + for _, x := range p.labelX { + encodeMessage(b, 3, x) + } +} + +var sampleDecoder = []decoder{ + nil, // 0 + // repeated uint64 location = 1 + func(b *buffer, m message) error { return decodeUint64s(b, &m.(*Sample).locationIDX) }, + // repeated int64 value = 2 + func(b *buffer, m message) error { return decodeInt64s(b, &m.(*Sample).Value) }, + // repeated Label label = 3 + func(b *buffer, m message) error { + s := m.(*Sample) + n := len(s.labelX) + s.labelX = append(s.labelX, label{}) + return decodeMessage(b, &s.labelX[n]) + }, +} + +func (p label) decoder() []decoder { + return labelDecoder +} + +func (p label) encode(b *buffer) { + encodeInt64Opt(b, 1, p.keyX) + encodeInt64Opt(b, 2, p.strX) + encodeInt64Opt(b, 3, p.numX) + encodeInt64Opt(b, 4, p.unitX) +} + +var labelDecoder = []decoder{ + nil, // 0 + // optional int64 key = 1 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).keyX) }, + // optional int64 str = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).strX) }, + // optional int64 num = 3 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).numX) }, + // optional int64 num = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).unitX) }, +} + +func (p *Mapping) decoder() []decoder { + return mappingDecoder +} + +func (p *Mapping) encode(b *buffer) { + encodeUint64Opt(b, 1, p.ID) + encodeUint64Opt(b, 2, p.Start) + encodeUint64Opt(b, 3, p.Limit) + encodeUint64Opt(b, 4, p.Offset) + encodeInt64Opt(b, 5, p.fileX) + encodeInt64Opt(b, 6, p.buildIDX) + encodeBoolOpt(b, 7, p.HasFunctions) + encodeBoolOpt(b, 8, p.HasFilenames) + encodeBoolOpt(b, 9, p.HasLineNumbers) + encodeBoolOpt(b, 10, p.HasInlineFrames) +} + +var mappingDecoder = []decoder{ + nil, // 0 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).ID) }, // optional uint64 id = 1 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).Start) }, // optional uint64 memory_offset = 2 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).Limit) }, // optional uint64 memory_limit = 3 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).Offset) }, // optional uint64 file_offset = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Mapping).fileX) }, // optional int64 filename = 5 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Mapping).buildIDX) }, // optional int64 build_id = 6 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasFunctions) }, // optional bool has_functions = 7 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasFilenames) }, // optional bool has_filenames = 8 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasLineNumbers) }, // optional bool has_line_numbers = 9 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasInlineFrames) }, // optional bool has_inline_frames = 10 +} + +func (p *Location) decoder() []decoder { + return locationDecoder +} + +func (p *Location) encode(b *buffer) { + encodeUint64Opt(b, 1, p.ID) + encodeUint64Opt(b, 2, p.mappingIDX) + encodeUint64Opt(b, 3, p.Address) + for i := range p.Line { + encodeMessage(b, 4, &p.Line[i]) + } + encodeBoolOpt(b, 5, p.IsFolded) +} + +var locationDecoder = []decoder{ + nil, // 0 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Location).ID) }, // optional uint64 id = 1; + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Location).mappingIDX) }, // optional uint64 mapping_id = 2; + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Location).Address) }, // optional uint64 address = 3; + func(b *buffer, m message) error { // repeated Line line = 4 + pp := m.(*Location) + n := len(pp.Line) + pp.Line = append(pp.Line, Line{}) + return decodeMessage(b, &pp.Line[n]) + }, + func(b *buffer, m message) error { return decodeBool(b, &m.(*Location).IsFolded) }, // optional bool is_folded = 5; +} + +func (p *Line) decoder() []decoder { + return lineDecoder +} + +func (p *Line) encode(b *buffer) { + encodeUint64Opt(b, 1, p.functionIDX) + encodeInt64Opt(b, 2, p.Line) + encodeInt64Opt(b, 3, p.Column) +} + +var lineDecoder = []decoder{ + nil, // 0 + // optional uint64 function_id = 1 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Line).functionIDX) }, + // optional int64 line = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Line).Line) }, + // optional int64 column = 3 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Line).Column) }, +} + +func (p *Function) decoder() []decoder { + return functionDecoder +} + +func (p *Function) encode(b *buffer) { + encodeUint64Opt(b, 1, p.ID) + encodeInt64Opt(b, 2, p.nameX) + encodeInt64Opt(b, 3, p.systemNameX) + encodeInt64Opt(b, 4, p.filenameX) + encodeInt64Opt(b, 5, p.StartLine) +} + +var functionDecoder = []decoder{ + nil, // 0 + // optional uint64 id = 1 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Function).ID) }, + // optional int64 function_name = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).nameX) }, + // optional int64 function_system_name = 3 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).systemNameX) }, + // repeated int64 filename = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).filenameX) }, + // optional int64 start_line = 5 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).StartLine) }, +} + +func addString(strings map[string]int, s string) int64 { + i, ok := strings[s] + if !ok { + i = len(strings) + strings[s] = i + } + return int64(i) +} + +func getString(strings []string, strng *int64, err error) (string, error) { + if err != nil { + return "", err + } + s := int(*strng) + if s < 0 || s >= len(strings) { + return "", errMalformed + } + *strng = 0 + return strings[s], nil +} diff --git a/plugin/debug/pkg/profile/filter.go b/plugin/debug/pkg/profile/filter.go new file mode 100644 index 00000000..c794b939 --- /dev/null +++ b/plugin/debug/pkg/profile/filter.go @@ -0,0 +1,274 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +// Implements methods to filter samples from profiles. + +import "regexp" + +// FilterSamplesByName filters the samples in a profile and only keeps +// samples where at least one frame matches focus but none match ignore. +// Returns true is the corresponding regexp matched at least one sample. +func (p *Profile) FilterSamplesByName(focus, ignore, hide, show *regexp.Regexp) (fm, im, hm, hnm bool) { + if focus == nil && ignore == nil && hide == nil && show == nil { + fm = true // Missing focus implies a match + return + } + focusOrIgnore := make(map[uint64]bool) + hidden := make(map[uint64]bool) + for _, l := range p.Location { + if ignore != nil && l.matchesName(ignore) { + im = true + focusOrIgnore[l.ID] = false + } else if focus == nil || l.matchesName(focus) { + fm = true + focusOrIgnore[l.ID] = true + } + + if hide != nil && l.matchesName(hide) { + hm = true + l.Line = l.unmatchedLines(hide) + if len(l.Line) == 0 { + hidden[l.ID] = true + } + } + if show != nil { + l.Line = l.matchedLines(show) + if len(l.Line) == 0 { + hidden[l.ID] = true + } else { + hnm = true + } + } + } + + s := make([]*Sample, 0, len(p.Sample)) + for _, sample := range p.Sample { + if focusedAndNotIgnored(sample.Location, focusOrIgnore) { + if len(hidden) > 0 { + var locs []*Location + for _, loc := range sample.Location { + if !hidden[loc.ID] { + locs = append(locs, loc) + } + } + if len(locs) == 0 { + // Remove sample with no locations (by not adding it to s). + continue + } + sample.Location = locs + } + s = append(s, sample) + } + } + p.Sample = s + + return +} + +// ShowFrom drops all stack frames above the highest matching frame and returns +// whether a match was found. If showFrom is nil it returns false and does not +// modify the profile. +// +// Example: consider a sample with frames [A, B, C, B], where A is the root. +// ShowFrom(nil) returns false and has frames [A, B, C, B]. +// ShowFrom(A) returns true and has frames [A, B, C, B]. +// ShowFrom(B) returns true and has frames [B, C, B]. +// ShowFrom(C) returns true and has frames [C, B]. +// ShowFrom(D) returns false and drops the sample because no frames remain. +func (p *Profile) ShowFrom(showFrom *regexp.Regexp) (matched bool) { + if showFrom == nil { + return false + } + // showFromLocs stores location IDs that matched ShowFrom. + showFromLocs := make(map[uint64]bool) + // Apply to locations. + for _, loc := range p.Location { + if filterShowFromLocation(loc, showFrom) { + showFromLocs[loc.ID] = true + matched = true + } + } + // For all samples, strip locations after the highest matching one. + s := make([]*Sample, 0, len(p.Sample)) + for _, sample := range p.Sample { + for i := len(sample.Location) - 1; i >= 0; i-- { + if showFromLocs[sample.Location[i].ID] { + sample.Location = sample.Location[:i+1] + s = append(s, sample) + break + } + } + } + p.Sample = s + return matched +} + +// filterShowFromLocation tests a showFrom regex against a location, removes +// lines after the last match and returns whether a match was found. If the +// mapping is matched, then all lines are kept. +func filterShowFromLocation(loc *Location, showFrom *regexp.Regexp) bool { + if m := loc.Mapping; m != nil && showFrom.MatchString(m.File) { + return true + } + if i := loc.lastMatchedLineIndex(showFrom); i >= 0 { + loc.Line = loc.Line[:i+1] + return true + } + return false +} + +// lastMatchedLineIndex returns the index of the last line that matches a regex, +// or -1 if no match is found. +func (loc *Location) lastMatchedLineIndex(re *regexp.Regexp) int { + for i := len(loc.Line) - 1; i >= 0; i-- { + if fn := loc.Line[i].Function; fn != nil { + if re.MatchString(fn.Name) || re.MatchString(fn.Filename) { + return i + } + } + } + return -1 +} + +// FilterTagsByName filters the tags in a profile and only keeps +// tags that match show and not hide. +func (p *Profile) FilterTagsByName(show, hide *regexp.Regexp) (sm, hm bool) { + matchRemove := func(name string) bool { + matchShow := show == nil || show.MatchString(name) + matchHide := hide != nil && hide.MatchString(name) + + if matchShow { + sm = true + } + if matchHide { + hm = true + } + return !matchShow || matchHide + } + for _, s := range p.Sample { + for lab := range s.Label { + if matchRemove(lab) { + delete(s.Label, lab) + } + } + for lab := range s.NumLabel { + if matchRemove(lab) { + delete(s.NumLabel, lab) + } + } + } + return +} + +// matchesName returns whether the location matches the regular +// expression. It checks any available function names, file names, and +// mapping object filename. +func (loc *Location) matchesName(re *regexp.Regexp) bool { + for _, ln := range loc.Line { + if fn := ln.Function; fn != nil { + if re.MatchString(fn.Name) || re.MatchString(fn.Filename) { + return true + } + } + } + if m := loc.Mapping; m != nil && re.MatchString(m.File) { + return true + } + return false +} + +// unmatchedLines returns the lines in the location that do not match +// the regular expression. +func (loc *Location) unmatchedLines(re *regexp.Regexp) []Line { + if m := loc.Mapping; m != nil && re.MatchString(m.File) { + return nil + } + var lines []Line + for _, ln := range loc.Line { + if fn := ln.Function; fn != nil { + if re.MatchString(fn.Name) || re.MatchString(fn.Filename) { + continue + } + } + lines = append(lines, ln) + } + return lines +} + +// matchedLines returns the lines in the location that match +// the regular expression. +func (loc *Location) matchedLines(re *regexp.Regexp) []Line { + if m := loc.Mapping; m != nil && re.MatchString(m.File) { + return loc.Line + } + var lines []Line + for _, ln := range loc.Line { + if fn := ln.Function; fn != nil { + if !re.MatchString(fn.Name) && !re.MatchString(fn.Filename) { + continue + } + } + lines = append(lines, ln) + } + return lines +} + +// focusedAndNotIgnored looks up a slice of ids against a map of +// focused/ignored locations. The map only contains locations that are +// explicitly focused or ignored. Returns whether there is at least +// one focused location but no ignored locations. +func focusedAndNotIgnored(locs []*Location, m map[uint64]bool) bool { + var f bool + for _, loc := range locs { + if focus, focusOrIgnore := m[loc.ID]; focusOrIgnore { + if focus { + // Found focused location. Must keep searching in case there + // is an ignored one as well. + f = true + } else { + // Found ignored location. Can return false right away. + return false + } + } + } + return f +} + +// TagMatch selects tags for filtering +type TagMatch func(s *Sample) bool + +// FilterSamplesByTag removes all samples from the profile, except +// those that match focus and do not match the ignore regular +// expression. +func (p *Profile) FilterSamplesByTag(focus, ignore TagMatch) (fm, im bool) { + samples := make([]*Sample, 0, len(p.Sample)) + for _, s := range p.Sample { + focused, ignored := true, false + if focus != nil { + focused = focus(s) + } + if ignore != nil { + ignored = ignore(s) + } + fm = fm || focused + im = im || ignored + if focused && !ignored { + samples = append(samples, s) + } + } + p.Sample = samples + return +} diff --git a/plugin/debug/pkg/profile/filter_test.go b/plugin/debug/pkg/profile/filter_test.go new file mode 100644 index 00000000..4aea3793 --- /dev/null +++ b/plugin/debug/pkg/profile/filter_test.go @@ -0,0 +1,600 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "fmt" + "regexp" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/proftest" +) + +var mappings = []*Mapping{ + {ID: 1, Start: 0x10000, Limit: 0x40000, File: "map0", HasFunctions: true, HasFilenames: true, HasLineNumbers: true, HasInlineFrames: true}, + {ID: 2, Start: 0x50000, Limit: 0x70000, File: "map1", HasFunctions: true, HasFilenames: true, HasLineNumbers: true, HasInlineFrames: true}, +} + +var functions = []*Function{ + {ID: 1, Name: "fun0", SystemName: "fun0", Filename: "file0"}, + {ID: 2, Name: "fun1", SystemName: "fun1", Filename: "file1"}, + {ID: 3, Name: "fun2", SystemName: "fun2", Filename: "file2"}, + {ID: 4, Name: "fun3", SystemName: "fun3", Filename: "file3"}, + {ID: 5, Name: "fun4", SystemName: "fun4", Filename: "file4"}, + {ID: 6, Name: "fun5", SystemName: "fun5", Filename: "file5"}, + {ID: 7, Name: "fun6", SystemName: "fun6", Filename: "file6"}, + {ID: 8, Name: "fun7", SystemName: "fun7", Filename: "file7"}, + {ID: 9, Name: "fun8", SystemName: "fun8", Filename: "file8"}, + {ID: 10, Name: "fun9", SystemName: "fun9", Filename: "file9"}, + {ID: 11, Name: "fun10", SystemName: "fun10", Filename: "file10"}, +} + +var noInlinesLocs = []*Location{ + {ID: 1, Mapping: mappings[0], Address: 0x1000, Line: []Line{{Function: functions[0], Line: 1}}}, + {ID: 2, Mapping: mappings[0], Address: 0x2000, Line: []Line{{Function: functions[1], Line: 1}}}, + {ID: 3, Mapping: mappings[0], Address: 0x3000, Line: []Line{{Function: functions[2], Line: 1}}}, + {ID: 4, Mapping: mappings[0], Address: 0x4000, Line: []Line{{Function: functions[3], Line: 1}}}, + {ID: 5, Mapping: mappings[0], Address: 0x5000, Line: []Line{{Function: functions[4], Line: 1}}}, + {ID: 6, Mapping: mappings[0], Address: 0x6000, Line: []Line{{Function: functions[5], Line: 1}}}, + {ID: 7, Mapping: mappings[0], Address: 0x7000, Line: []Line{{Function: functions[6], Line: 1}}}, + {ID: 8, Mapping: mappings[0], Address: 0x8000, Line: []Line{{Function: functions[7], Line: 1}}}, + {ID: 9, Mapping: mappings[0], Address: 0x9000, Line: []Line{{Function: functions[8], Line: 1}}}, + {ID: 10, Mapping: mappings[0], Address: 0x10000, Line: []Line{{Function: functions[9], Line: 1}}}, + {ID: 11, Mapping: mappings[1], Address: 0x11000, Line: []Line{{Function: functions[10], Line: 1}}}, +} + +var noInlinesProfile = &Profile{ + TimeNanos: 10000, + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{{Type: "samples", Unit: "count"}}, + Mapping: mappings, + Function: functions, + Location: noInlinesLocs, + Sample: []*Sample{ + {Value: []int64{1}, Location: []*Location{noInlinesLocs[0], noInlinesLocs[1], noInlinesLocs[2], noInlinesLocs[3]}}, + {Value: []int64{2}, Location: []*Location{noInlinesLocs[4], noInlinesLocs[5], noInlinesLocs[1], noInlinesLocs[6]}}, + {Value: []int64{3}, Location: []*Location{noInlinesLocs[7], noInlinesLocs[8]}}, + {Value: []int64{4}, Location: []*Location{noInlinesLocs[9], noInlinesLocs[4], noInlinesLocs[10], noInlinesLocs[7]}}, + }, +} + +var allNoInlinesSampleFuncs = []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun1 fun6: 2", + "fun7 fun8: 3", + "fun9 fun4 fun10 fun7: 4", +} + +var inlinesLocs = []*Location{ + {ID: 1, Mapping: mappings[0], Address: 0x1000, Line: []Line{{Function: functions[0], Line: 1}, {Function: functions[1], Line: 1}}}, + {ID: 2, Mapping: mappings[0], Address: 0x2000, Line: []Line{{Function: functions[2], Line: 1}, {Function: functions[3], Line: 1}}}, + {ID: 3, Mapping: mappings[0], Address: 0x3000, Line: []Line{{Function: functions[4], Line: 1}, {Function: functions[5], Line: 1}, {Function: functions[6], Line: 1}}}, +} + +var inlinesProfile = &Profile{ + TimeNanos: 10000, + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{{Type: "samples", Unit: "count"}}, + Mapping: mappings, + Function: functions, + Location: inlinesLocs, + Sample: []*Sample{ + {Value: []int64{1}, Location: []*Location{inlinesLocs[0], inlinesLocs[1]}}, + {Value: []int64{2}, Location: []*Location{inlinesLocs[2]}}, + }, +} + +var emptyLinesLocs = []*Location{ + {ID: 1, Mapping: mappings[0], Address: 0x1000, Line: []Line{{Function: functions[0], Line: 1}, {Function: functions[1], Line: 1}}}, + {ID: 2, Mapping: mappings[0], Address: 0x2000, Line: []Line{}}, + {ID: 3, Mapping: mappings[1], Address: 0x2000, Line: []Line{}}, +} + +var emptyLinesProfile = &Profile{ + TimeNanos: 10000, + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{{Type: "samples", Unit: "count"}}, + Mapping: mappings, + Function: functions, + Location: emptyLinesLocs, + Sample: []*Sample{ + {Value: []int64{1}, Location: []*Location{emptyLinesLocs[0], emptyLinesLocs[1]}}, + {Value: []int64{2}, Location: []*Location{emptyLinesLocs[2]}}, + {Value: []int64{3}, Location: []*Location{}}, + }, +} + +func TestFilterSamplesByName(t *testing.T) { + for _, tc := range []struct { + // name is the name of the test case. + name string + // profile is the profile that gets filtered. + profile *Profile + // These are the inputs to FilterSamplesByName(). + focus, ignore, hide, show *regexp.Regexp + // want{F,I,S,H}m are expected return values from FilterSamplesByName. + wantFm, wantIm, wantSm, wantHm bool + // wantSampleFuncs contains expected stack functions and sample value after + // filtering, in the same order as in the profile. The format is as + // returned by sampleFuncs function below, which is "callee caller: ". + wantSampleFuncs []string + }{ + // No Filters + { + name: "empty filters keep all frames", + profile: noInlinesProfile, + wantFm: true, + wantSampleFuncs: allNoInlinesSampleFuncs, + }, + // Focus + { + name: "focus with no matches", + profile: noInlinesProfile, + focus: regexp.MustCompile("unknown"), + }, + { + name: "focus matches function names", + profile: noInlinesProfile, + focus: regexp.MustCompile("fun1"), + wantFm: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun1 fun6: 2", + "fun9 fun4 fun10 fun7: 4", + }, + }, + { + name: "focus matches file names", + profile: noInlinesProfile, + focus: regexp.MustCompile("file1"), + wantFm: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun1 fun6: 2", + "fun9 fun4 fun10 fun7: 4", + }, + }, + { + name: "focus matches mapping names", + profile: noInlinesProfile, + focus: regexp.MustCompile("map1"), + wantFm: true, + wantSampleFuncs: []string{ + "fun9 fun4 fun10 fun7: 4", + }, + }, + { + name: "focus matches inline functions", + profile: inlinesProfile, + focus: regexp.MustCompile("fun5"), + wantFm: true, + wantSampleFuncs: []string{ + "fun4 fun5 fun6: 2", + }, + }, + // Ignore + { + name: "ignore with no matches matches all samples", + profile: noInlinesProfile, + ignore: regexp.MustCompile("unknown"), + wantFm: true, + wantSampleFuncs: allNoInlinesSampleFuncs, + }, + { + name: "ignore matches function names", + profile: noInlinesProfile, + ignore: regexp.MustCompile("fun1"), + wantFm: true, + wantIm: true, + wantSampleFuncs: []string{ + "fun7 fun8: 3", + }, + }, + { + name: "ignore matches file names", + profile: noInlinesProfile, + ignore: regexp.MustCompile("file1"), + wantFm: true, + wantIm: true, + wantSampleFuncs: []string{ + "fun7 fun8: 3", + }, + }, + { + name: "ignore matches mapping names", + profile: noInlinesProfile, + ignore: regexp.MustCompile("map1"), + wantFm: true, + wantIm: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun1 fun6: 2", + "fun7 fun8: 3", + }, + }, + { + name: "ignore matches inline functions", + profile: inlinesProfile, + ignore: regexp.MustCompile("fun5"), + wantFm: true, + wantIm: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + }, + }, + // Show + { + name: "show with no matches", + profile: noInlinesProfile, + show: regexp.MustCompile("unknown"), + wantFm: true, + }, + { + name: "show matches function names", + profile: noInlinesProfile, + show: regexp.MustCompile("fun1|fun2"), + wantFm: true, + wantSm: true, + wantSampleFuncs: []string{ + "fun1 fun2: 1", + "fun1: 2", + "fun10: 4", + }, + }, + { + name: "show matches file names", + profile: noInlinesProfile, + show: regexp.MustCompile("file1|file3"), + wantFm: true, + wantSm: true, + wantSampleFuncs: []string{ + "fun1 fun3: 1", + "fun1: 2", + "fun10: 4", + }, + }, + { + name: "show matches mapping names", + profile: noInlinesProfile, + show: regexp.MustCompile("map1"), + wantFm: true, + wantSm: true, + wantSampleFuncs: []string{ + "fun10: 4", + }, + }, + { + name: "show matches inline functions", + profile: inlinesProfile, + show: regexp.MustCompile("fun[03]"), + wantFm: true, + wantSm: true, + wantSampleFuncs: []string{ + "fun0 fun3: 1", + }, + }, + { + name: "show keeps all lines when matching both mapping and function", + profile: inlinesProfile, + show: regexp.MustCompile("map0|fun5"), + wantFm: true, + wantSm: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun6: 2", + }, + }, + // Hide + { + name: "hide with no matches", + profile: noInlinesProfile, + hide: regexp.MustCompile("unknown"), + wantFm: true, + wantSampleFuncs: allNoInlinesSampleFuncs, + }, + { + name: "hide matches function names", + profile: noInlinesProfile, + hide: regexp.MustCompile("fun1|fun2"), + wantFm: true, + wantHm: true, + wantSampleFuncs: []string{ + "fun0 fun3: 1", + "fun4 fun5 fun6: 2", + "fun7 fun8: 3", + "fun9 fun4 fun7: 4", + }, + }, + { + name: "hide matches file names", + profile: noInlinesProfile, + hide: regexp.MustCompile("file1|file3"), + wantFm: true, + wantHm: true, + wantSampleFuncs: []string{ + "fun0 fun2: 1", + "fun4 fun5 fun6: 2", + "fun7 fun8: 3", + "fun9 fun4 fun7: 4", + }, + }, + { + name: "hide matches mapping names", + profile: noInlinesProfile, + hide: regexp.MustCompile("map1"), + wantFm: true, + wantHm: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun1 fun6: 2", + "fun7 fun8: 3", + "fun9 fun4 fun7: 4", + }, + }, + { + name: "hide matches inline functions", + profile: inlinesProfile, + hide: regexp.MustCompile("fun[125]"), + wantFm: true, + wantHm: true, + wantSampleFuncs: []string{ + "fun0 fun3: 1", + "fun4 fun6: 2", + }, + }, + { + name: "hide drops all lines when matching both mapping and function", + profile: inlinesProfile, + hide: regexp.MustCompile("map0|fun5"), + wantFm: true, + wantHm: true, + }, + // Compound filters + { + name: "hides a stack matched by both focus and ignore", + profile: noInlinesProfile, + focus: regexp.MustCompile("fun1|fun7"), + ignore: regexp.MustCompile("fun1"), + wantFm: true, + wantIm: true, + wantSampleFuncs: []string{ + "fun7 fun8: 3", + }, + }, + { + name: "hides a function if both show and hide match it", + profile: noInlinesProfile, + show: regexp.MustCompile("fun1"), + hide: regexp.MustCompile("fun10"), + wantFm: true, + wantSm: true, + wantHm: true, + wantSampleFuncs: []string{ + "fun1: 1", + "fun1: 2", + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + p := tc.profile.Copy() + fm, im, hm, sm := p.FilterSamplesByName(tc.focus, tc.ignore, tc.hide, tc.show) + + type match struct{ fm, im, hm, sm bool } + if got, want := (match{fm: fm, im: im, hm: hm, sm: sm}), (match{fm: tc.wantFm, im: tc.wantIm, hm: tc.wantHm, sm: tc.wantSm}); got != want { + t.Errorf("match got %+v want %+v", got, want) + } + + if got, want := strings.Join(sampleFuncs(p), "\n")+"\n", strings.Join(tc.wantSampleFuncs, "\n")+"\n"; got != want { + diff, err := proftest.Diff([]byte(want), []byte(got)) + if err != nil { + t.Fatalf("failed to get diff: %v", err) + } + t.Errorf("FilterSamplesByName: got diff(want->got):\n%s", diff) + } + }) + } +} + +func TestShowFrom(t *testing.T) { + for _, tc := range []struct { + name string + profile *Profile + showFrom *regexp.Regexp + // wantMatch is the expected return value. + wantMatch bool + // wantSampleFuncs contains expected stack functions and sample value after + // filtering, in the same order as in the profile. The format is as + // returned by sampleFuncs function below, which is "callee caller: ". + wantSampleFuncs []string + }{ + { + name: "nil showFrom keeps all frames", + profile: noInlinesProfile, + wantMatch: false, + wantSampleFuncs: allNoInlinesSampleFuncs, + }, + { + name: "showFrom with no matches drops all samples", + profile: noInlinesProfile, + showFrom: regexp.MustCompile("unknown"), + wantMatch: false, + }, + { + name: "showFrom matches function names", + profile: noInlinesProfile, + showFrom: regexp.MustCompile("fun1"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun0 fun1: 1", + "fun4 fun5 fun1: 2", + "fun9 fun4 fun10: 4", + }, + }, + { + name: "showFrom matches file names", + profile: noInlinesProfile, + showFrom: regexp.MustCompile("file1"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun0 fun1: 1", + "fun4 fun5 fun1: 2", + "fun9 fun4 fun10: 4", + }, + }, + { + name: "showFrom matches mapping names", + profile: noInlinesProfile, + showFrom: regexp.MustCompile("map1"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun9 fun4 fun10: 4", + }, + }, + { + name: "showFrom drops frames above highest of multiple matches", + profile: noInlinesProfile, + showFrom: regexp.MustCompile("fun[12]"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2: 1", + "fun4 fun5 fun1: 2", + "fun9 fun4 fun10: 4", + }, + }, + { + name: "showFrom matches inline functions", + profile: inlinesProfile, + showFrom: regexp.MustCompile("fun0|fun5"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun0: 1", + "fun4 fun5: 2", + }, + }, + { + name: "showFrom drops frames above highest of multiple inline matches", + profile: inlinesProfile, + showFrom: regexp.MustCompile("fun[1245]"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2: 1", + "fun4 fun5: 2", + }, + }, + { + name: "showFrom keeps all lines when matching mapping and function", + profile: inlinesProfile, + showFrom: regexp.MustCompile("map0|fun5"), + wantMatch: true, + wantSampleFuncs: []string{ + "fun0 fun1 fun2 fun3: 1", + "fun4 fun5 fun6: 2", + }, + }, + { + name: "showFrom matches location with empty lines", + profile: emptyLinesProfile, + showFrom: regexp.MustCompile("map1"), + wantMatch: true, + wantSampleFuncs: []string{ + ": 2", + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + p := tc.profile.Copy() + + if gotMatch := p.ShowFrom(tc.showFrom); gotMatch != tc.wantMatch { + t.Errorf("match got %+v, want %+v", gotMatch, tc.wantMatch) + } + + if got, want := strings.Join(sampleFuncs(p), "\n")+"\n", strings.Join(tc.wantSampleFuncs, "\n")+"\n"; got != want { + diff, err := proftest.Diff([]byte(want), []byte(got)) + if err != nil { + t.Fatalf("failed to get diff: %v", err) + } + t.Errorf("profile samples got diff(want->got):\n%s", diff) + } + }) + } +} + +// sampleFuncs returns a slice of strings where each string represents one +// profile sample in the format " : ". This allows +// the expected values for test cases to be specified in human-readable +// strings. +func sampleFuncs(p *Profile) []string { + var ret []string + for _, s := range p.Sample { + var funcs []string + for _, loc := range s.Location { + for _, line := range loc.Line { + funcs = append(funcs, line.Function.Name) + } + } + ret = append(ret, fmt.Sprintf("%s: %d", strings.Join(funcs, " "), s.Value[0])) + } + return ret +} + +func TestTagFilter(t *testing.T) { + // Perform several forms of tag filtering on the test profile. + + type filterTestcase struct { + include, exclude *regexp.Regexp + im, em bool + count int + } + + countTags := func(p *Profile) map[string]bool { + tags := make(map[string]bool) + + for _, s := range p.Sample { + for l := range s.Label { + tags[l] = true + } + for l := range s.NumLabel { + tags[l] = true + } + } + return tags + } + + for tx, tc := range []filterTestcase{ + {nil, nil, true, false, 3}, + {regexp.MustCompile("notfound"), nil, false, false, 0}, + {regexp.MustCompile("key1"), nil, true, false, 1}, + {nil, regexp.MustCompile("key[12]"), true, true, 1}, + } { + prof := testProfile1.Copy() + gim, gem := prof.FilterTagsByName(tc.include, tc.exclude) + if gim != tc.im { + t.Errorf("Filter #%d, got include match=%v, want %v", tx, gim, tc.im) + } + if gem != tc.em { + t.Errorf("Filter #%d, got exclude match=%v, want %v", tx, gem, tc.em) + } + if tags := countTags(prof); len(tags) != tc.count { + t.Errorf("Filter #%d, got %d tags[%v], want %d", tx, len(tags), tags, tc.count) + } + } +} diff --git a/plugin/debug/pkg/profile/index.go b/plugin/debug/pkg/profile/index.go new file mode 100644 index 00000000..bef1d604 --- /dev/null +++ b/plugin/debug/pkg/profile/index.go @@ -0,0 +1,64 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "fmt" + "strconv" + "strings" +) + +// SampleIndexByName returns the appropriate index for a value of sample index. +// If numeric, it returns the number, otherwise it looks up the text in the +// profile sample types. +func (p *Profile) SampleIndexByName(sampleIndex string) (int, error) { + if sampleIndex == "" { + if dst := p.DefaultSampleType; dst != "" { + for i, t := range sampleTypes(p) { + if t == dst { + return i, nil + } + } + } + // By default select the last sample value + return len(p.SampleType) - 1, nil + } + if i, err := strconv.Atoi(sampleIndex); err == nil { + if i < 0 || i >= len(p.SampleType) { + return 0, fmt.Errorf("sample_index %s is outside the range [0..%d]", sampleIndex, len(p.SampleType)-1) + } + return i, nil + } + + // Remove the inuse_ prefix to support legacy pprof options + // "inuse_space" and "inuse_objects" for profiles containing types + // "space" and "objects". + noInuse := strings.TrimPrefix(sampleIndex, "inuse_") + for i, t := range p.SampleType { + if t.Type == sampleIndex || t.Type == noInuse { + return i, nil + } + } + + return 0, fmt.Errorf("sample_index %q must be one of: %v", sampleIndex, sampleTypes(p)) +} + +func sampleTypes(p *Profile) []string { + types := make([]string, len(p.SampleType)) + for i, t := range p.SampleType { + types[i] = t.Type + } + return types +} diff --git a/plugin/debug/pkg/profile/index_test.go b/plugin/debug/pkg/profile/index_test.go new file mode 100644 index 00000000..f846b592 --- /dev/null +++ b/plugin/debug/pkg/profile/index_test.go @@ -0,0 +1,114 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "testing" +) + +func TestSampleIndexByName(t *testing.T) { + for _, c := range []struct { + desc string + sampleTypes []string + defaultSampleType string + index string + want int + wantError bool + }{ + { + desc: "use last by default", + index: "", + want: 1, + sampleTypes: []string{"zero", "default"}, + }, + { + desc: "honour specified default", + index: "", + want: 1, + defaultSampleType: "default", + sampleTypes: []string{"zero", "default", "two"}, + }, + { + desc: "invalid default is ignored", + index: "", + want: 2, + defaultSampleType: "non-existent", + sampleTypes: []string{"zero", "one", "default"}, + }, + { + desc: "index by int", + index: "0", + want: 0, + sampleTypes: []string{"zero", "one", "two"}, + }, + { + desc: "index by int ignores default", + index: "0", + want: 0, + defaultSampleType: "default", + sampleTypes: []string{"zero", "default", "two"}, + }, + { + desc: "index by name", + index: "two", + want: 2, + sampleTypes: []string{"zero", "one", "two", "three"}, + }, + { + desc: "index by name ignores default", + index: "zero", + want: 0, + defaultSampleType: "default", + sampleTypes: []string{"zero", "default", "two"}, + }, + { + desc: "out of bound int causes error", + index: "100", + wantError: true, + sampleTypes: []string{"zero", "default"}, + }, + { + desc: "unknown name causes error", + index: "does not exist", + wantError: true, + sampleTypes: []string{"zero", "default"}, + }, + { + desc: "'inused_{x}' recognized for legacy '{x}'", + index: "inuse_zero", + want: 0, + sampleTypes: []string{"zero", "default"}, + }, + } { + p := &Profile{ + DefaultSampleType: c.defaultSampleType, + SampleType: []*ValueType{}, + } + for _, st := range c.sampleTypes { + p.SampleType = append(p.SampleType, &ValueType{Type: st, Unit: "milliseconds"}) + } + + got, err := p.SampleIndexByName(c.index) + + switch { + case c.wantError && err == nil: + t.Errorf("%s: error should have been returned not index=%d, err=%v", c.desc, got, err) + case !c.wantError && err != nil: + t.Errorf("%s: unexpected got index=%d, err=%v; wanted index=%d, err=nil", c.desc, got, err, c.want) + case !c.wantError && got != c.want: + t.Errorf("%s: got index=%d, want index=%d", c.desc, got, c.want) + } + } +} diff --git a/plugin/debug/pkg/profile/legacy_java_profile.go b/plugin/debug/pkg/profile/legacy_java_profile.go new file mode 100644 index 00000000..4580bab1 --- /dev/null +++ b/plugin/debug/pkg/profile/legacy_java_profile.go @@ -0,0 +1,315 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file implements parsers to convert java legacy profiles into +// the profile.proto format. + +package profile + +import ( + "bytes" + "fmt" + "io" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +var ( + attributeRx = regexp.MustCompile(`([\w ]+)=([\w ]+)`) + javaSampleRx = regexp.MustCompile(` *(\d+) +(\d+) +@ +([ x0-9a-f]*)`) + javaLocationRx = regexp.MustCompile(`^\s*0x([[:xdigit:]]+)\s+(.*)\s*$`) + javaLocationFileLineRx = regexp.MustCompile(`^(.*)\s+\((.+):(-?[[:digit:]]+)\)$`) + javaLocationPathRx = regexp.MustCompile(`^(.*)\s+\((.*)\)$`) +) + +// javaCPUProfile returns a new Profile from profilez data. +// b is the profile bytes after the header, period is the profiling +// period, and parse is a function to parse 8-byte chunks from the +// profile in its native endianness. +func javaCPUProfile(b []byte, period int64, parse func(b []byte) (uint64, []byte)) (*Profile, error) { + p := &Profile{ + Period: period * 1000, + PeriodType: &ValueType{Type: "cpu", Unit: "nanoseconds"}, + SampleType: []*ValueType{{Type: "samples", Unit: "count"}, {Type: "cpu", Unit: "nanoseconds"}}, + } + var err error + var locs map[uint64]*Location + if b, locs, err = parseCPUSamples(b, parse, false, p); err != nil { + return nil, err + } + + if err = parseJavaLocations(b, locs, p); err != nil { + return nil, err + } + + // Strip out addresses for better merge. + if err = p.Aggregate(true, true, true, true, false, false); err != nil { + return nil, err + } + + return p, nil +} + +// parseJavaProfile returns a new profile from heapz or contentionz +// data. b is the profile bytes after the header. +func parseJavaProfile(b []byte) (*Profile, error) { + h := bytes.SplitAfterN(b, []byte("\n"), 2) + if len(h) < 2 { + return nil, errUnrecognized + } + + p := &Profile{ + PeriodType: &ValueType{}, + } + header := string(bytes.TrimSpace(h[0])) + + var err error + var pType string + switch header { + case "--- heapz 1 ---": + pType = "heap" + case "--- contentionz 1 ---": + pType = "contention" + default: + return nil, errUnrecognized + } + + if b, err = parseJavaHeader(pType, h[1], p); err != nil { + return nil, err + } + var locs map[uint64]*Location + if b, locs, err = parseJavaSamples(pType, b, p); err != nil { + return nil, err + } + if err = parseJavaLocations(b, locs, p); err != nil { + return nil, err + } + + // Strip out addresses for better merge. + if err = p.Aggregate(true, true, true, true, false, false); err != nil { + return nil, err + } + + return p, nil +} + +// parseJavaHeader parses the attribute section on a java profile and +// populates a profile. Returns the remainder of the buffer after all +// attributes. +func parseJavaHeader(pType string, b []byte, p *Profile) ([]byte, error) { + nextNewLine := bytes.IndexByte(b, byte('\n')) + for nextNewLine != -1 { + line := string(bytes.TrimSpace(b[0:nextNewLine])) + if line != "" { + h := attributeRx.FindStringSubmatch(line) + if h == nil { + // Not a valid attribute, exit. + return b, nil + } + + attribute, value := strings.TrimSpace(h[1]), strings.TrimSpace(h[2]) + var err error + switch pType + "/" + attribute { + case "heap/format", "cpu/format", "contention/format": + if value != "java" { + return nil, errUnrecognized + } + case "heap/resolution": + p.SampleType = []*ValueType{ + {Type: "inuse_objects", Unit: "count"}, + {Type: "inuse_space", Unit: value}, + } + case "contention/resolution": + p.SampleType = []*ValueType{ + {Type: "contentions", Unit: "count"}, + {Type: "delay", Unit: value}, + } + case "contention/sampling period": + p.PeriodType = &ValueType{ + Type: "contentions", Unit: "count", + } + if p.Period, err = strconv.ParseInt(value, 0, 64); err != nil { + return nil, fmt.Errorf("failed to parse attribute %s: %v", line, err) + } + case "contention/ms since reset": + millis, err := strconv.ParseInt(value, 0, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse attribute %s: %v", line, err) + } + p.DurationNanos = millis * 1000 * 1000 + default: + return nil, errUnrecognized + } + } + // Grab next line. + b = b[nextNewLine+1:] + nextNewLine = bytes.IndexByte(b, byte('\n')) + } + return b, nil +} + +// parseJavaSamples parses the samples from a java profile and +// populates the Samples in a profile. Returns the remainder of the +// buffer after the samples. +func parseJavaSamples(pType string, b []byte, p *Profile) ([]byte, map[uint64]*Location, error) { + nextNewLine := bytes.IndexByte(b, byte('\n')) + locs := make(map[uint64]*Location) + for nextNewLine != -1 { + line := string(bytes.TrimSpace(b[0:nextNewLine])) + if line != "" { + sample := javaSampleRx.FindStringSubmatch(line) + if sample == nil { + // Not a valid sample, exit. + return b, locs, nil + } + + // Java profiles have data/fields inverted compared to other + // profile types. + var err error + value1, value2, value3 := sample[2], sample[1], sample[3] + addrs, err := parseHexAddresses(value3) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + var sloc []*Location + for _, addr := range addrs { + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + s := &Sample{ + Value: make([]int64, 2), + Location: sloc, + } + + if s.Value[0], err = strconv.ParseInt(value1, 0, 64); err != nil { + return nil, nil, fmt.Errorf("parsing sample %s: %v", line, err) + } + if s.Value[1], err = strconv.ParseInt(value2, 0, 64); err != nil { + return nil, nil, fmt.Errorf("parsing sample %s: %v", line, err) + } + + switch pType { + case "heap": + const javaHeapzSamplingRate = 524288 // 512K + if s.Value[0] == 0 { + return nil, nil, fmt.Errorf("parsing sample %s: second value must be non-zero", line) + } + s.NumLabel = map[string][]int64{"bytes": {s.Value[1] / s.Value[0]}} + s.Value[0], s.Value[1] = scaleHeapSample(s.Value[0], s.Value[1], javaHeapzSamplingRate) + case "contention": + if period := p.Period; period != 0 { + s.Value[0] = s.Value[0] * p.Period + s.Value[1] = s.Value[1] * p.Period + } + } + p.Sample = append(p.Sample, s) + } + // Grab next line. + b = b[nextNewLine+1:] + nextNewLine = bytes.IndexByte(b, byte('\n')) + } + return b, locs, nil +} + +// parseJavaLocations parses the location information in a java +// profile and populates the Locations in a profile. It uses the +// location addresses from the profile as both the ID of each +// location. +func parseJavaLocations(b []byte, locs map[uint64]*Location, p *Profile) error { + r := bytes.NewBuffer(b) + fns := make(map[string]*Function) + for { + line, err := r.ReadString('\n') + if err != nil { + if err != io.EOF { + return err + } + if line == "" { + break + } + } + + if line = strings.TrimSpace(line); line == "" { + continue + } + + jloc := javaLocationRx.FindStringSubmatch(line) + if len(jloc) != 3 { + continue + } + addr, err := strconv.ParseUint(jloc[1], 16, 64) + if err != nil { + return fmt.Errorf("parsing sample %s: %v", line, err) + } + loc := locs[addr] + if loc == nil { + // Unused/unseen + continue + } + var lineFunc, lineFile string + var lineNo int64 + + if fileLine := javaLocationFileLineRx.FindStringSubmatch(jloc[2]); len(fileLine) == 4 { + // Found a line of the form: "function (file:line)" + lineFunc, lineFile = fileLine[1], fileLine[2] + if n, err := strconv.ParseInt(fileLine[3], 10, 64); err == nil && n > 0 { + lineNo = n + } + } else if filePath := javaLocationPathRx.FindStringSubmatch(jloc[2]); len(filePath) == 3 { + // If there's not a file:line, it's a shared library path. + // The path isn't interesting, so just give the .so. + lineFunc, lineFile = filePath[1], filepath.Base(filePath[2]) + } else if strings.Contains(jloc[2], "generated stub/JIT") { + lineFunc = "STUB" + } else { + // Treat whole line as the function name. This is used by the + // java agent for internal states such as "GC" or "VM". + lineFunc = jloc[2] + } + fn := fns[lineFunc] + + if fn == nil { + fn = &Function{ + Name: lineFunc, + SystemName: lineFunc, + Filename: lineFile, + } + fns[lineFunc] = fn + p.Function = append(p.Function, fn) + } + loc.Line = []Line{ + { + Function: fn, + Line: lineNo, + }, + } + loc.Address = 0 + } + + p.remapLocationIDs() + p.remapFunctionIDs() + p.remapMappingIDs() + + return nil +} diff --git a/plugin/debug/pkg/profile/legacy_profile.go b/plugin/debug/pkg/profile/legacy_profile.go new file mode 100644 index 00000000..8d07fd6c --- /dev/null +++ b/plugin/debug/pkg/profile/legacy_profile.go @@ -0,0 +1,1228 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file implements parsers to convert legacy profiles into the +// profile.proto format. + +package profile + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "regexp" + "strconv" + "strings" +) + +var ( + countStartRE = regexp.MustCompile(`\A(\S+) profile: total \d+\z`) + countRE = regexp.MustCompile(`\A(\d+) @(( 0x[0-9a-f]+)+)\z`) + + heapHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] *@ *(heap[_a-z0-9]*)/?(\d*)`) + heapSampleRE = regexp.MustCompile(`(-?\d+): *(-?\d+) *\[ *(\d+): *(\d+) *] @([ x0-9a-f]*)`) + + contentionSampleRE = regexp.MustCompile(`(\d+) *(\d+) @([ x0-9a-f]*)`) + + hexNumberRE = regexp.MustCompile(`0x[0-9a-f]+`) + + growthHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ growthz?`) + + fragmentationHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ fragmentationz?`) + + threadzStartRE = regexp.MustCompile(`--- threadz \d+ ---`) + threadStartRE = regexp.MustCompile(`--- Thread ([[:xdigit:]]+) \(name: (.*)/(\d+)\) stack: ---`) + + // Regular expressions to parse process mappings. Support the format used by Linux /proc/.../maps and other tools. + // Recommended format: + // Start End object file name offset(optional) linker build id + // 0x40000-0x80000 /path/to/binary (@FF00) abc123456 + spaceDigits = `\s+[[:digit:]]+` + hexPair = `\s+[[:xdigit:]]+:[[:xdigit:]]+` + oSpace = `\s*` + // Capturing expressions. + cHex = `(?:0x)?([[:xdigit:]]+)` + cHexRange = `\s*` + cHex + `[\s-]?` + oSpace + cHex + `:?` + cSpaceString = `(?:\s+(\S+))?` + cSpaceHex = `(?:\s+([[:xdigit:]]+))?` + cSpaceAtOffset = `(?:\s+\(@([[:xdigit:]]+)\))?` + cPerm = `(?:\s+([-rwxp]+))?` + + procMapsRE = regexp.MustCompile(`^` + cHexRange + cPerm + cSpaceHex + hexPair + spaceDigits + cSpaceString) + briefMapsRE = regexp.MustCompile(`^` + cHexRange + cPerm + cSpaceString + cSpaceAtOffset + cSpaceHex) + + // Regular expression to parse log data, of the form: + // ... file:line] msg... + logInfoRE = regexp.MustCompile(`^[^\[\]]+:[0-9]+]\s`) +) + +func isSpaceOrComment(line string) bool { + trimmed := strings.TrimSpace(line) + return len(trimmed) == 0 || trimmed[0] == '#' +} + +// parseGoCount parses a Go count profile (e.g., threadcreate or +// goroutine) and returns a new Profile. +func parseGoCount(b []byte) (*Profile, error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + // Skip comments at the beginning of the file. + for s.Scan() && isSpaceOrComment(s.Text()) { + } + if err := s.Err(); err != nil { + return nil, err + } + m := countStartRE.FindStringSubmatch(s.Text()) + if m == nil { + return nil, errUnrecognized + } + profileType := m[1] + p := &Profile{ + PeriodType: &ValueType{Type: profileType, Unit: "count"}, + Period: 1, + SampleType: []*ValueType{{Type: profileType, Unit: "count"}}, + } + locations := make(map[uint64]*Location) + for s.Scan() { + line := s.Text() + if isSpaceOrComment(line) { + continue + } + if strings.HasPrefix(line, "---") { + break + } + m := countRE.FindStringSubmatch(line) + if m == nil { + return nil, errMalformed + } + n, err := strconv.ParseInt(m[1], 0, 64) + if err != nil { + return nil, errMalformed + } + fields := strings.Fields(m[2]) + locs := make([]*Location, 0, len(fields)) + for _, stk := range fields { + addr, err := strconv.ParseUint(stk, 0, 64) + if err != nil { + return nil, errMalformed + } + // Adjust all frames by -1 to land on top of the call instruction. + addr-- + loc := locations[addr] + if loc == nil { + loc = &Location{ + Address: addr, + } + locations[addr] = loc + p.Location = append(p.Location, loc) + } + locs = append(locs, loc) + } + p.Sample = append(p.Sample, &Sample{ + Location: locs, + Value: []int64{n}, + }) + } + if err := s.Err(); err != nil { + return nil, err + } + + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + return p, nil +} + +// remapLocationIDs ensures there is a location for each address +// referenced by a sample, and remaps the samples to point to the new +// location ids. +func (p *Profile) remapLocationIDs() { + seen := make(map[*Location]bool, len(p.Location)) + var locs []*Location + + for _, s := range p.Sample { + for _, l := range s.Location { + if seen[l] { + continue + } + l.ID = uint64(len(locs) + 1) + locs = append(locs, l) + seen[l] = true + } + } + p.Location = locs +} + +func (p *Profile) remapFunctionIDs() { + seen := make(map[*Function]bool, len(p.Function)) + var fns []*Function + + for _, l := range p.Location { + for _, ln := range l.Line { + fn := ln.Function + if fn == nil || seen[fn] { + continue + } + fn.ID = uint64(len(fns) + 1) + fns = append(fns, fn) + seen[fn] = true + } + } + p.Function = fns +} + +// remapMappingIDs matches location addresses with existing mappings +// and updates them appropriately. This is O(N*M), if this ever shows +// up as a bottleneck, evaluate sorting the mappings and doing a +// binary search, which would make it O(N*log(M)). +func (p *Profile) remapMappingIDs() { + // Some profile handlers will incorrectly set regions for the main + // executable if its section is remapped. Fix them through heuristics. + + if len(p.Mapping) > 0 { + // Remove the initial mapping if named '/anon_hugepage' and has a + // consecutive adjacent mapping. + if m := p.Mapping[0]; strings.HasPrefix(m.File, "/anon_hugepage") { + if len(p.Mapping) > 1 && m.Limit == p.Mapping[1].Start { + p.Mapping = p.Mapping[1:] + } + } + } + + // Subtract the offset from the start of the main mapping if it + // ends up at a recognizable start address. + if len(p.Mapping) > 0 { + const expectedStart = 0x400000 + if m := p.Mapping[0]; m.Start-m.Offset == expectedStart { + m.Start = expectedStart + m.Offset = 0 + } + } + + // Associate each location with an address to the corresponding + // mapping. Create fake mapping if a suitable one isn't found. + var fake *Mapping +nextLocation: + for _, l := range p.Location { + a := l.Address + if l.Mapping != nil || a == 0 { + continue + } + for _, m := range p.Mapping { + if m.Start <= a && a < m.Limit { + l.Mapping = m + continue nextLocation + } + } + // Work around legacy handlers failing to encode the first + // part of mappings split into adjacent ranges. + for _, m := range p.Mapping { + if m.Offset != 0 && m.Start-m.Offset <= a && a < m.Start { + m.Start -= m.Offset + m.Offset = 0 + l.Mapping = m + continue nextLocation + } + } + // If there is still no mapping, create a fake one. + // This is important for the Go legacy handler, which produced + // no mappings. + if fake == nil { + fake = &Mapping{ + ID: 1, + Limit: ^uint64(0), + } + p.Mapping = append(p.Mapping, fake) + } + l.Mapping = fake + } + + // Reset all mapping IDs. + for i, m := range p.Mapping { + m.ID = uint64(i + 1) + } +} + +var cpuInts = []func([]byte) (uint64, []byte){ + get32l, + get32b, + get64l, + get64b, +} + +func get32l(b []byte) (uint64, []byte) { + if len(b) < 4 { + return 0, nil + } + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24, b[4:] +} + +func get32b(b []byte) (uint64, []byte) { + if len(b) < 4 { + return 0, nil + } + return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24, b[4:] +} + +func get64l(b []byte) (uint64, []byte) { + if len(b) < 8 { + return 0, nil + } + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56, b[8:] +} + +func get64b(b []byte) (uint64, []byte) { + if len(b) < 8 { + return 0, nil + } + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56, b[8:] +} + +// parseCPU parses a profilez legacy profile and returns a newly +// populated Profile. +// +// The general format for profilez samples is a sequence of words in +// binary format. The first words are a header with the following data: +// +// 1st word -- 0 +// 2nd word -- 3 +// 3rd word -- 0 if a c++ application, 1 if a java application. +// 4th word -- Sampling period (in microseconds). +// 5th word -- Padding. +func parseCPU(b []byte) (*Profile, error) { + var parse func([]byte) (uint64, []byte) + var n1, n2, n3, n4, n5 uint64 + for _, parse = range cpuInts { + var tmp []byte + n1, tmp = parse(b) + n2, tmp = parse(tmp) + n3, tmp = parse(tmp) + n4, tmp = parse(tmp) + n5, tmp = parse(tmp) + + if tmp != nil && n1 == 0 && n2 == 3 && n3 == 0 && n4 > 0 && n5 == 0 { + b = tmp + return cpuProfile(b, int64(n4), parse) + } + if tmp != nil && n1 == 0 && n2 == 3 && n3 == 1 && n4 > 0 && n5 == 0 { + b = tmp + return javaCPUProfile(b, int64(n4), parse) + } + } + return nil, errUnrecognized +} + +// cpuProfile returns a new Profile from C++ profilez data. +// b is the profile bytes after the header, period is the profiling +// period, and parse is a function to parse 8-byte chunks from the +// profile in its native endianness. +func cpuProfile(b []byte, period int64, parse func(b []byte) (uint64, []byte)) (*Profile, error) { + p := &Profile{ + Period: period * 1000, + PeriodType: &ValueType{Type: "cpu", Unit: "nanoseconds"}, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "nanoseconds"}, + }, + } + var err error + if b, _, err = parseCPUSamples(b, parse, true, p); err != nil { + return nil, err + } + + // If *most* samples have the same second-to-the-bottom frame, it + // strongly suggests that it is an uninteresting artifact of + // measurement -- a stack frame pushed by the signal handler. The + // bottom frame is always correct as it is picked up from the signal + // structure, not the stack. Check if this is the case and if so, + // remove. + + // Remove up to two frames. + maxiter := 2 + // Allow one different sample for this many samples with the same + // second-to-last frame. + similarSamples := 32 + margin := len(p.Sample) / similarSamples + + for iter := 0; iter < maxiter; iter++ { + addr1 := make(map[uint64]int) + for _, s := range p.Sample { + if len(s.Location) > 1 { + a := s.Location[1].Address + addr1[a] = addr1[a] + 1 + } + } + + for id1, count := range addr1 { + if count >= len(p.Sample)-margin { + // Found uninteresting frame, strip it out from all samples + for _, s := range p.Sample { + if len(s.Location) > 1 && s.Location[1].Address == id1 { + s.Location = append(s.Location[:1], s.Location[2:]...) + } + } + break + } + } + } + + if err := p.ParseMemoryMap(bytes.NewBuffer(b)); err != nil { + return nil, err + } + + cleanupDuplicateLocations(p) + return p, nil +} + +func cleanupDuplicateLocations(p *Profile) { + // The profile handler may duplicate the leaf frame, because it gets + // its address both from stack unwinding and from the signal + // context. Detect this and delete the duplicate, which has been + // adjusted by -1. The leaf address should not be adjusted as it is + // not a call. + for _, s := range p.Sample { + if len(s.Location) > 1 && s.Location[0].Address == s.Location[1].Address+1 { + s.Location = append(s.Location[:1], s.Location[2:]...) + } + } +} + +// parseCPUSamples parses a collection of profilez samples from a +// profile. +// +// profilez samples are a repeated sequence of stack frames of the +// form: +// +// 1st word -- The number of times this stack was encountered. +// 2nd word -- The size of the stack (StackSize). +// 3rd word -- The first address on the stack. +// ... +// StackSize + 2 -- The last address on the stack +// +// The last stack trace is of the form: +// +// 1st word -- 0 +// 2nd word -- 1 +// 3rd word -- 0 +// +// Addresses from stack traces may point to the next instruction after +// each call. Optionally adjust by -1 to land somewhere on the actual +// call (except for the leaf, which is not a call). +func parseCPUSamples(b []byte, parse func(b []byte) (uint64, []byte), adjust bool, p *Profile) ([]byte, map[uint64]*Location, error) { + locs := make(map[uint64]*Location) + for len(b) > 0 { + var count, nstk uint64 + count, b = parse(b) + nstk, b = parse(b) + if b == nil || nstk > uint64(len(b)/4) { + return nil, nil, errUnrecognized + } + var sloc []*Location + addrs := make([]uint64, nstk) + for i := 0; i < int(nstk); i++ { + addrs[i], b = parse(b) + } + + if count == 0 && nstk == 1 && addrs[0] == 0 { + // End of data marker + break + } + for i, addr := range addrs { + if adjust && i > 0 { + addr-- + } + loc := locs[addr] + if loc == nil { + loc = &Location{ + Address: addr, + } + locs[addr] = loc + p.Location = append(p.Location, loc) + } + sloc = append(sloc, loc) + } + p.Sample = append(p.Sample, + &Sample{ + Value: []int64{int64(count), int64(count) * p.Period}, + Location: sloc, + }) + } + // Reached the end without finding the EOD marker. + return b, locs, nil +} + +// parseHeap parses a heapz legacy or a growthz profile and +// returns a newly populated Profile. +func parseHeap(b []byte) (p *Profile, err error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + if !s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + return nil, errUnrecognized + } + p = &Profile{} + + sampling := "" + hasAlloc := false + + line := s.Text() + p.PeriodType = &ValueType{Type: "space", Unit: "bytes"} + if header := heapHeaderRE.FindStringSubmatch(line); header != nil { + sampling, p.Period, hasAlloc, err = parseHeapHeader(line) + if err != nil { + return nil, err + } + } else if header = growthHeaderRE.FindStringSubmatch(line); header != nil { + p.Period = 1 + } else if header = fragmentationHeaderRE.FindStringSubmatch(line); header != nil { + p.Period = 1 + } else { + return nil, errUnrecognized + } + + if hasAlloc { + // Put alloc before inuse so that default pprof selection + // will prefer inuse_space. + p.SampleType = []*ValueType{ + {Type: "alloc_objects", Unit: "count"}, + {Type: "alloc_space", Unit: "bytes"}, + {Type: "inuse_objects", Unit: "count"}, + {Type: "inuse_space", Unit: "bytes"}, + } + } else { + p.SampleType = []*ValueType{ + {Type: "objects", Unit: "count"}, + {Type: "space", Unit: "bytes"}, + } + } + + locs := make(map[uint64]*Location) + for s.Scan() { + line := strings.TrimSpace(s.Text()) + + if isSpaceOrComment(line) { + continue + } + + if isMemoryMapSentinel(line) { + break + } + + value, blocksize, addrs, err := parseHeapSample(line, p.Period, sampling, hasAlloc) + if err != nil { + return nil, err + } + + var sloc []*Location + for _, addr := range addrs { + // Addresses from stack traces point to the next instruction after + // each call. Adjust by -1 to land somewhere on the actual call. + addr-- + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + + p.Sample = append(p.Sample, &Sample{ + Value: value, + Location: sloc, + NumLabel: map[string][]int64{"bytes": {blocksize}}, + }) + } + if err := s.Err(); err != nil { + return nil, err + } + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + return p, nil +} + +func parseHeapHeader(line string) (sampling string, period int64, hasAlloc bool, err error) { + header := heapHeaderRE.FindStringSubmatch(line) + if header == nil { + return "", 0, false, errUnrecognized + } + + if len(header[6]) > 0 { + if period, err = strconv.ParseInt(header[6], 10, 64); err != nil { + return "", 0, false, errUnrecognized + } + } + + if (header[3] != header[1] && header[3] != "0") || (header[4] != header[2] && header[4] != "0") { + hasAlloc = true + } + + switch header[5] { + case "heapz_v2", "heap_v2": + return "v2", period, hasAlloc, nil + case "heapprofile": + return "", 1, hasAlloc, nil + case "heap": + return "v2", period / 2, hasAlloc, nil + default: + return "", 0, false, errUnrecognized + } +} + +// parseHeapSample parses a single row from a heap profile into a new Sample. +func parseHeapSample(line string, rate int64, sampling string, includeAlloc bool) (value []int64, blocksize int64, addrs []uint64, err error) { + sampleData := heapSampleRE.FindStringSubmatch(line) + if len(sampleData) != 6 { + return nil, 0, nil, fmt.Errorf("unexpected number of sample values: got %d, want 6", len(sampleData)) + } + + // This is a local-scoped helper function to avoid needing to pass + // around rate, sampling and many return parameters. + addValues := func(countString, sizeString string, label string) error { + count, err := strconv.ParseInt(countString, 10, 64) + if err != nil { + return fmt.Errorf("malformed sample: %s: %v", line, err) + } + size, err := strconv.ParseInt(sizeString, 10, 64) + if err != nil { + return fmt.Errorf("malformed sample: %s: %v", line, err) + } + if count == 0 && size != 0 { + return fmt.Errorf("%s count was 0 but %s bytes was %d", label, label, size) + } + if count != 0 { + blocksize = size / count + if sampling == "v2" { + count, size = scaleHeapSample(count, size, rate) + } + } + value = append(value, count, size) + return nil + } + + if includeAlloc { + if err := addValues(sampleData[3], sampleData[4], "allocation"); err != nil { + return nil, 0, nil, err + } + } + + if err := addValues(sampleData[1], sampleData[2], "inuse"); err != nil { + return nil, 0, nil, err + } + + addrs, err = parseHexAddresses(sampleData[5]) + if err != nil { + return nil, 0, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + return value, blocksize, addrs, nil +} + +// parseHexAddresses extracts hex numbers from a string, attempts to convert +// each to an unsigned 64-bit number and returns the resulting numbers as a +// slice, or an error if the string contains hex numbers which are too large to +// handle (which means a malformed profile). +func parseHexAddresses(s string) ([]uint64, error) { + hexStrings := hexNumberRE.FindAllString(s, -1) + var addrs []uint64 + for _, s := range hexStrings { + if addr, err := strconv.ParseUint(s, 0, 64); err == nil { + addrs = append(addrs, addr) + } else { + return nil, fmt.Errorf("failed to parse as hex 64-bit number: %s", s) + } + } + return addrs, nil +} + +// scaleHeapSample adjusts the data from a heapz Sample to +// account for its probability of appearing in the collected +// data. heapz profiles are a sampling of the memory allocations +// requests in a program. We estimate the unsampled value by dividing +// each collected sample by its probability of appearing in the +// profile. heapz v2 profiles rely on a poisson process to determine +// which samples to collect, based on the desired average collection +// rate R. The probability of a sample of size S to appear in that +// profile is 1-exp(-S/R). +func scaleHeapSample(count, size, rate int64) (int64, int64) { + if count == 0 || size == 0 { + return 0, 0 + } + + if rate <= 1 { + // if rate==1 all samples were collected so no adjustment is needed. + // if rate<1 treat as unknown and skip scaling. + return count, size + } + + avgSize := float64(size) / float64(count) + scale := 1 / (1 - math.Exp(-avgSize/float64(rate))) + + return int64(float64(count) * scale), int64(float64(size) * scale) +} + +// parseContention parses a mutex or contention profile. There are 2 cases: +// "--- contentionz " for legacy C++ profiles (and backwards compatibility) +// "--- mutex:" or "--- contention:" for profiles generated by the Go runtime. +func parseContention(b []byte) (*Profile, error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + if !s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + return nil, errUnrecognized + } + + switch l := s.Text(); { + case strings.HasPrefix(l, "--- contentionz "): + case strings.HasPrefix(l, "--- mutex:"): + case strings.HasPrefix(l, "--- contention:"): + default: + return nil, errUnrecognized + } + + p := &Profile{ + PeriodType: &ValueType{Type: "contentions", Unit: "count"}, + Period: 1, + SampleType: []*ValueType{ + {Type: "contentions", Unit: "count"}, + {Type: "delay", Unit: "nanoseconds"}, + }, + } + + var cpuHz int64 + // Parse text of the form "attribute = value" before the samples. + const delimiter = "=" + for s.Scan() { + line := s.Text() + if line = strings.TrimSpace(line); isSpaceOrComment(line) { + continue + } + if strings.HasPrefix(line, "---") { + break + } + attr := strings.SplitN(line, delimiter, 2) + if len(attr) != 2 { + break + } + key, val := strings.TrimSpace(attr[0]), strings.TrimSpace(attr[1]) + var err error + switch key { + case "cycles/second": + if cpuHz, err = strconv.ParseInt(val, 0, 64); err != nil { + return nil, errUnrecognized + } + case "sampling period": + if p.Period, err = strconv.ParseInt(val, 0, 64); err != nil { + return nil, errUnrecognized + } + case "ms since reset": + ms, err := strconv.ParseInt(val, 0, 64) + if err != nil { + return nil, errUnrecognized + } + p.DurationNanos = ms * 1000 * 1000 + case "format": + // CPP contentionz profiles don't have format. + return nil, errUnrecognized + case "resolution": + // CPP contentionz profiles don't have resolution. + return nil, errUnrecognized + case "discarded samples": + default: + return nil, errUnrecognized + } + } + if err := s.Err(); err != nil { + return nil, err + } + + locs := make(map[uint64]*Location) + for { + line := strings.TrimSpace(s.Text()) + if strings.HasPrefix(line, "---") { + break + } + if !isSpaceOrComment(line) { + value, addrs, err := parseContentionSample(line, p.Period, cpuHz) + if err != nil { + return nil, err + } + var sloc []*Location + for _, addr := range addrs { + // Addresses from stack traces point to the next instruction after + // each call. Adjust by -1 to land somewhere on the actual call. + addr-- + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + p.Sample = append(p.Sample, &Sample{ + Value: value, + Location: sloc, + }) + } + if !s.Scan() { + break + } + } + if err := s.Err(); err != nil { + return nil, err + } + + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + + return p, nil +} + +// parseContentionSample parses a single row from a contention profile +// into a new Sample. +func parseContentionSample(line string, period, cpuHz int64) (value []int64, addrs []uint64, err error) { + sampleData := contentionSampleRE.FindStringSubmatch(line) + if sampleData == nil { + return nil, nil, errUnrecognized + } + + v1, err := strconv.ParseInt(sampleData[1], 10, 64) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + v2, err := strconv.ParseInt(sampleData[2], 10, 64) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + // Unsample values if period and cpuHz are available. + // - Delays are scaled to cycles and then to nanoseconds. + // - Contentions are scaled to cycles. + if period > 0 { + if cpuHz > 0 { + cpuGHz := float64(cpuHz) / 1e9 + v1 = int64(float64(v1) * float64(period) / cpuGHz) + } + v2 = v2 * period + } + + value = []int64{v2, v1} + addrs, err = parseHexAddresses(sampleData[3]) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + return value, addrs, nil +} + +// parseThread parses a Threadz profile and returns a new Profile. +func parseThread(b []byte) (*Profile, error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + // Skip past comments and empty lines seeking a real header. + for s.Scan() && isSpaceOrComment(s.Text()) { + } + + line := s.Text() + if m := threadzStartRE.FindStringSubmatch(line); m != nil { + // Advance over initial comments until first stack trace. + for s.Scan() { + if line = s.Text(); isMemoryMapSentinel(line) || strings.HasPrefix(line, "-") { + break + } + } + } else if t := threadStartRE.FindStringSubmatch(line); len(t) != 4 { + return nil, errUnrecognized + } + + p := &Profile{ + SampleType: []*ValueType{{Type: "thread", Unit: "count"}}, + PeriodType: &ValueType{Type: "thread", Unit: "count"}, + Period: 1, + } + + locs := make(map[uint64]*Location) + // Recognize each thread and populate profile samples. + for !isMemoryMapSentinel(line) { + if strings.HasPrefix(line, "---- no stack trace for") { + break + } + if t := threadStartRE.FindStringSubmatch(line); len(t) != 4 { + return nil, errUnrecognized + } + + var addrs []uint64 + var err error + line, addrs, err = parseThreadSample(s) + if err != nil { + return nil, err + } + if len(addrs) == 0 { + // We got a --same as previous threads--. Bump counters. + if len(p.Sample) > 0 { + s := p.Sample[len(p.Sample)-1] + s.Value[0]++ + } + continue + } + + var sloc []*Location + for i, addr := range addrs { + // Addresses from stack traces point to the next instruction after + // each call. Adjust by -1 to land somewhere on the actual call + // (except for the leaf, which is not a call). + if i > 0 { + addr-- + } + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + + p.Sample = append(p.Sample, &Sample{ + Value: []int64{1}, + Location: sloc, + }) + } + + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + + cleanupDuplicateLocations(p) + return p, nil +} + +// parseThreadSample parses a symbolized or unsymbolized stack trace. +// Returns the first line after the traceback, the sample (or nil if +// it hits a 'same-as-previous' marker) and an error. +func parseThreadSample(s *bufio.Scanner) (nextl string, addrs []uint64, err error) { + var line string + sameAsPrevious := false + for s.Scan() { + line = strings.TrimSpace(s.Text()) + if line == "" { + continue + } + + if strings.HasPrefix(line, "---") { + break + } + if strings.Contains(line, "same as previous thread") { + sameAsPrevious = true + continue + } + + curAddrs, err := parseHexAddresses(line) + if err != nil { + return "", nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + addrs = append(addrs, curAddrs...) + } + if err := s.Err(); err != nil { + return "", nil, err + } + if sameAsPrevious { + return line, nil, nil + } + return line, addrs, nil +} + +// parseAdditionalSections parses any additional sections in the +// profile, ignoring any unrecognized sections. +func parseAdditionalSections(s *bufio.Scanner, p *Profile) error { + for !isMemoryMapSentinel(s.Text()) && s.Scan() { + } + if err := s.Err(); err != nil { + return err + } + return p.ParseMemoryMapFromScanner(s) +} + +// ParseProcMaps parses a memory map in the format of /proc/self/maps. +// ParseMemoryMap should be called after setting on a profile to +// associate locations to the corresponding mapping based on their +// address. +func ParseProcMaps(rd io.Reader) ([]*Mapping, error) { + s := bufio.NewScanner(rd) + return parseProcMapsFromScanner(s) +} + +func parseProcMapsFromScanner(s *bufio.Scanner) ([]*Mapping, error) { + var mapping []*Mapping + + var attrs []string + const delimiter = "=" + r := strings.NewReplacer() + for s.Scan() { + line := r.Replace(removeLoggingInfo(s.Text())) + m, err := parseMappingEntry(line) + if err != nil { + if err == errUnrecognized { + // Recognize assignments of the form: attr=value, and replace + // $attr with value on subsequent mappings. + if attr := strings.SplitN(line, delimiter, 2); len(attr) == 2 { + attrs = append(attrs, "$"+strings.TrimSpace(attr[0]), strings.TrimSpace(attr[1])) + r = strings.NewReplacer(attrs...) + } + // Ignore any unrecognized entries + continue + } + return nil, err + } + if m == nil { + continue + } + mapping = append(mapping, m) + } + if err := s.Err(); err != nil { + return nil, err + } + return mapping, nil +} + +// removeLoggingInfo detects and removes log prefix entries generated +// by the glog package. If no logging prefix is detected, the string +// is returned unmodified. +func removeLoggingInfo(line string) string { + if match := logInfoRE.FindStringIndex(line); match != nil { + return line[match[1]:] + } + return line +} + +// ParseMemoryMap parses a memory map in the format of +// /proc/self/maps, and overrides the mappings in the current profile. +// It renumbers the samples and locations in the profile correspondingly. +func (p *Profile) ParseMemoryMap(rd io.Reader) error { + return p.ParseMemoryMapFromScanner(bufio.NewScanner(rd)) +} + +// ParseMemoryMapFromScanner parses a memory map in the format of +// /proc/self/maps or a variety of legacy format, and overrides the +// mappings in the current profile. It renumbers the samples and +// locations in the profile correspondingly. +func (p *Profile) ParseMemoryMapFromScanner(s *bufio.Scanner) error { + mapping, err := parseProcMapsFromScanner(s) + if err != nil { + return err + } + p.Mapping = append(p.Mapping, mapping...) + p.massageMappings() + p.remapLocationIDs() + p.remapFunctionIDs() + p.remapMappingIDs() + return nil +} + +func parseMappingEntry(l string) (*Mapping, error) { + var start, end, perm, file, offset, buildID string + if me := procMapsRE.FindStringSubmatch(l); len(me) == 6 { + start, end, perm, offset, file = me[1], me[2], me[3], me[4], me[5] + } else if me := briefMapsRE.FindStringSubmatch(l); len(me) == 7 { + start, end, perm, file, offset, buildID = me[1], me[2], me[3], me[4], me[5], me[6] + } else { + return nil, errUnrecognized + } + + var err error + mapping := &Mapping{ + File: file, + BuildID: buildID, + } + if perm != "" && !strings.Contains(perm, "x") { + // Skip non-executable entries. + return nil, nil + } + if mapping.Start, err = strconv.ParseUint(start, 16, 64); err != nil { + return nil, errUnrecognized + } + if mapping.Limit, err = strconv.ParseUint(end, 16, 64); err != nil { + return nil, errUnrecognized + } + if offset != "" { + if mapping.Offset, err = strconv.ParseUint(offset, 16, 64); err != nil { + return nil, errUnrecognized + } + } + return mapping, nil +} + +var memoryMapSentinels = []string{ + "--- Memory map: ---", + "MAPPED_LIBRARIES:", +} + +// isMemoryMapSentinel returns true if the string contains one of the +// known sentinels for memory map information. +func isMemoryMapSentinel(line string) bool { + for _, s := range memoryMapSentinels { + if strings.Contains(line, s) { + return true + } + } + return false +} + +func (p *Profile) addLegacyFrameInfo() { + switch { + case isProfileType(p, heapzSampleTypes): + p.DropFrames, p.KeepFrames = allocRxStr, allocSkipRxStr + case isProfileType(p, contentionzSampleTypes): + p.DropFrames, p.KeepFrames = lockRxStr, "" + default: + p.DropFrames, p.KeepFrames = cpuProfilerRxStr, "" + } +} + +var heapzSampleTypes = [][]string{ + {"allocations", "size"}, // early Go pprof profiles + {"objects", "space"}, + {"inuse_objects", "inuse_space"}, + {"alloc_objects", "alloc_space"}, + {"alloc_objects", "alloc_space", "inuse_objects", "inuse_space"}, // Go pprof legacy profiles +} +var contentionzSampleTypes = [][]string{ + {"contentions", "delay"}, +} + +func isProfileType(p *Profile, types [][]string) bool { + st := p.SampleType +nextType: + for _, t := range types { + if len(st) != len(t) { + continue + } + + for i := range st { + if st[i].Type != t[i] { + continue nextType + } + } + return true + } + return false +} + +var allocRxStr = strings.Join([]string{ + // POSIX entry points. + `calloc`, + `cfree`, + `malloc`, + `free`, + `memalign`, + `do_memalign`, + `(__)?posix_memalign`, + `pvalloc`, + `valloc`, + `realloc`, + + // TC malloc. + `tcmalloc::.*`, + `tc_calloc`, + `tc_cfree`, + `tc_malloc`, + `tc_free`, + `tc_memalign`, + `tc_posix_memalign`, + `tc_pvalloc`, + `tc_valloc`, + `tc_realloc`, + `tc_new`, + `tc_delete`, + `tc_newarray`, + `tc_deletearray`, + `tc_new_nothrow`, + `tc_newarray_nothrow`, + + // Memory-allocation routines on OS X. + `malloc_zone_malloc`, + `malloc_zone_calloc`, + `malloc_zone_valloc`, + `malloc_zone_realloc`, + `malloc_zone_memalign`, + `malloc_zone_free`, + + // Go runtime + `runtime\..*`, + + // Other misc. memory allocation routines + `BaseArena::.*`, + `(::)?do_malloc_no_errno`, + `(::)?do_malloc_pages`, + `(::)?do_malloc`, + `DoSampledAllocation`, + `MallocedMemBlock::MallocedMemBlock`, + `_M_allocate`, + `__builtin_(vec_)?delete`, + `__builtin_(vec_)?new`, + `__gnu_cxx::new_allocator::allocate`, + `__libc_malloc`, + `__malloc_alloc_template::allocate`, + `allocate`, + `cpp_alloc`, + `operator new(\[\])?`, + `simple_alloc::allocate`, +}, `|`) + +var allocSkipRxStr = strings.Join([]string{ + // Preserve Go runtime frames that appear in the middle/bottom of + // the stack. + `runtime\.panic`, + `runtime\.reflectcall`, + `runtime\.call[0-9]*`, +}, `|`) + +var cpuProfilerRxStr = strings.Join([]string{ + `ProfileData::Add`, + `ProfileData::prof_handler`, + `CpuProfiler::prof_handler`, + `__pthread_sighandler`, + `__restore`, +}, `|`) + +var lockRxStr = strings.Join([]string{ + `RecordLockProfileData`, + `(base::)?RecordLockProfileData.*`, + `(base::)?SubmitMutexProfileData.*`, + `(base::)?SubmitSpinLockProfileData.*`, + `(base::Mutex::)?AwaitCommon.*`, + `(base::Mutex::)?Unlock.*`, + `(base::Mutex::)?UnlockSlow.*`, + `(base::Mutex::)?ReaderUnlock.*`, + `(base::MutexLock::)?~MutexLock.*`, + `(Mutex::)?AwaitCommon.*`, + `(Mutex::)?Unlock.*`, + `(Mutex::)?UnlockSlow.*`, + `(Mutex::)?ReaderUnlock.*`, + `(MutexLock::)?~MutexLock.*`, + `(SpinLock::)?Unlock.*`, + `(SpinLock::)?SlowUnlock.*`, + `(SpinLockHolder::)?~SpinLockHolder.*`, +}, `|`) diff --git a/plugin/debug/pkg/profile/legacy_profile_test.go b/plugin/debug/pkg/profile/legacy_profile_test.go new file mode 100644 index 00000000..6ba0e338 --- /dev/null +++ b/plugin/debug/pkg/profile/legacy_profile_test.go @@ -0,0 +1,321 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" + "testing" +) + +func TestLegacyProfileType(t *testing.T) { + type testcase struct { + sampleTypes []string + typeSet [][]string + want bool + setName string + } + + heap := heapzSampleTypes + cont := contentionzSampleTypes + testcases := []testcase{ + // True cases + {[]string{"allocations", "size"}, heap, true, "heapzSampleTypes"}, + {[]string{"objects", "space"}, heap, true, "heapzSampleTypes"}, + {[]string{"inuse_objects", "inuse_space"}, heap, true, "heapzSampleTypes"}, + {[]string{"alloc_objects", "alloc_space"}, heap, true, "heapzSampleTypes"}, + {[]string{"alloc_objects", "alloc_space", "inuse_objects", "inuse_space"}, heap, true, "heapzSampleTypes"}, + {[]string{"contentions", "delay"}, cont, true, "contentionzSampleTypes"}, + // False cases + {[]string{"objects"}, heap, false, "heapzSampleTypes"}, + {[]string{"objects", "unknown"}, heap, false, "heapzSampleTypes"}, + {[]string{"inuse_objects", "inuse_space", "alloc_objects", "alloc_space"}, heap, false, "heapzSampleTypes"}, + {[]string{"contentions", "delay"}, heap, false, "heapzSampleTypes"}, + {[]string{"samples", "cpu"}, heap, false, "heapzSampleTypes"}, + {[]string{"samples", "cpu"}, cont, false, "contentionzSampleTypes"}, + } + + for _, tc := range testcases { + p := profileOfType(tc.sampleTypes) + if got := isProfileType(p, tc.typeSet); got != tc.want { + t.Error("isProfileType({"+strings.Join(tc.sampleTypes, ",")+"},", tc.setName, "), got", got, "want", tc.want) + } + } +} + +func TestCpuParse(t *testing.T) { + // profileString is a legacy encoded profile, represnted by words separated by ":" + // Each sample has the form value : N : stack1..stackN + // EOF is represented as "0:1:0" + profileString := "1:3:100:999:100:" // sample with bogus 999 and duplicate leaf + profileString += "1:5:200:999:200:501:502:" // sample with bogus 999 and duplicate leaf + profileString += "1:12:300:999:300:601:602:603:604:605:606:607:608:609:" // sample with bogus 999 and duplicate leaf + profileString += "0:1:0000" // EOF -- must use 4 bytes for the final zero + + p, err := cpuProfile([]byte(profileString), 1, parseString) + if err != nil { + t.Fatal(err) + } + + if err := checkTestSample(p, []uint64{100}); err != nil { + t.Error(err) + } + if err := checkTestSample(p, []uint64{200, 500, 501}); err != nil { + t.Error(err) + } + if err := checkTestSample(p, []uint64{300, 600, 601, 602, 603, 604, 605, 606, 607, 608}); err != nil { + t.Error(err) + } +} + +func parseString(b []byte) (uint64, []byte) { + slices := bytes.SplitN(b, []byte(":"), 2) + var value, remainder []byte + if len(slices) > 0 { + value = slices[0] + } + if len(slices) > 1 { + remainder = slices[1] + } + v, _ := strconv.ParseUint(string(value), 10, 64) + return v, remainder +} + +func checkTestSample(p *Profile, want []uint64) error { + for _, s := range p.Sample { + got := []uint64{} + for _, l := range s.Location { + got = append(got, l.Address) + } + if reflect.DeepEqual(got, want) { + return nil + } + } + return fmt.Errorf("Could not find sample : %v", want) +} + +// profileOfType creates an empty profile with only sample types set, +// for testing purposes only. +func profileOfType(sampleTypes []string) *Profile { + p := new(Profile) + p.SampleType = make([]*ValueType, len(sampleTypes)) + for i, t := range sampleTypes { + p.SampleType[i] = new(ValueType) + p.SampleType[i].Type = t + } + return p +} + +func TestParseMappingEntry(t *testing.T) { + for _, test := range []*struct { + entry string + want *Mapping + }{ + { + entry: "00400000-02e00000 r-xp 00000000 00:00 0", + want: &Mapping{ + Start: 0x400000, + Limit: 0x2e00000, + }, + }, + { + entry: "02e00000-02e8a000 r-xp 02a00000 00:00 15953927 /foo/bin", + want: &Mapping{ + Start: 0x2e00000, + Limit: 0x2e8a000, + Offset: 0x2a00000, + File: "/foo/bin", + }, + }, + { + entry: "02e00000-02e8a000 r-xp 000000 00:00 15953927 [vdso]", + want: &Mapping{ + Start: 0x2e00000, + Limit: 0x2e8a000, + File: "[vdso]", + }, + }, + { + entry: " 02e00000-02e8a000: /foo/bin (@2a00000)", + want: &Mapping{ + Start: 0x2e00000, + Limit: 0x2e8a000, + Offset: 0x2a00000, + File: "/foo/bin", + }, + }, + { + entry: " 02e00000-02e8a000: /foo/bin (deleted)", + want: &Mapping{ + Start: 0x2e00000, + Limit: 0x2e8a000, + File: "/foo/bin", + }, + }, + { + entry: " 02e00000-02e8a000: /foo/bin", + want: &Mapping{ + Start: 0x2e00000, + Limit: 0x2e8a000, + File: "/foo/bin", + }, + }, + { + entry: " 02e00000-02e8a000: [vdso]", + want: &Mapping{ + Start: 0x2e00000, + Limit: 0x2e8a000, + File: "[vdso]", + }, + }, + {entry: "0xff6810563000 0xff6810565000 r-xp abc_exe 87c4d547f895cfd6a370e08dc5c5ee7bd4199d5b", + want: &Mapping{ + Start: 0xff6810563000, + Limit: 0xff6810565000, + File: "abc_exe", + BuildID: "87c4d547f895cfd6a370e08dc5c5ee7bd4199d5b", + }, + }, + {entry: "7f5e5435e000-7f5e5455e000 --xp 00002000 00:00 1531 myprogram", + want: &Mapping{ + Start: 0x7f5e5435e000, + Limit: 0x7f5e5455e000, + Offset: 0x2000, + File: "myprogram", + }, + }, + {entry: "7f7472710000-7f7472722000 r-xp 00000000 fc:00 790190 /usr/lib/libfantastic-1.2.so", + want: &Mapping{ + Start: 0x7f7472710000, + Limit: 0x7f7472722000, + File: "/usr/lib/libfantastic-1.2.so", + }, + }, + {entry: "7f47a542f000-7f47a5447000: /lib/libpthread-2.15.so", + want: &Mapping{ + Start: 0x7f47a542f000, + Limit: 0x7f47a5447000, + File: "/lib/libpthread-2.15.so", + }, + }, + {entry: "0x40000-0x80000 /path/to/binary (@FF00) abc123456", + want: &Mapping{ + Start: 0x40000, + Limit: 0x80000, + File: "/path/to/binary", + Offset: 0xFF00, + BuildID: "abc123456", + }, + }, + {entry: "W1220 15:07:15.201776 8272 logger.cc:12033] --- Memory map: ---\n" + + "0x40000-0x80000 /path/to/binary (@FF00) abc123456", + want: &Mapping{ + Start: 0x40000, + Limit: 0x80000, + File: "/path/to/binary", + Offset: 0xFF00, + BuildID: "abc123456", + }, + }, + {entry: "W1220 15:07:15.201776 8272 logger.cc:12033] --- Memory map: ---\n" + + "W1220 15:07:15.202776 8272 logger.cc:12036] 0x40000-0x80000 /path/to/binary (@FF00) abc123456", + want: &Mapping{ + Start: 0x40000, + Limit: 0x80000, + File: "/path/to/binary", + Offset: 0xFF00, + BuildID: "abc123456", + }, + }, + {entry: "7f5e5435e000-7f5e5455e000 ---p 00002000 00:00 1531 myprogram", + want: nil, + }, + } { + got, err := ParseProcMaps(strings.NewReader(test.entry)) + if err != nil { + t.Errorf("%s: %v", test.entry, err) + continue + } + if test.want == nil { + if got, want := len(got), 0; got != want { + t.Errorf("%s: got %d mappings, want %d", test.entry, got, want) + } + continue + } + if got, want := len(got), 1; got != want { + t.Errorf("%s: got %d mappings, want %d", test.entry, got, want) + continue + } + if !reflect.DeepEqual(test.want, got[0]) { + t.Errorf("%s want=%v got=%v", test.entry, test.want, got[0]) + } + } +} + +func TestParseThreadProfileWithInvalidAddress(t *testing.T) { + profile := ` +--- threadz 1 --- + +--- Thread 7eff063d9940 (name: main/25376) stack: --- + PC: 0x40b688 0x4d5f51 0x40be31 0x473add693e639c6f0 +--- Memory map: --- + 00400000-00fcb000: /home/rsilvera/cppbench/cppbench_server_main.unstripped + ` + wantErr := "failed to parse as hex 64-bit number: 0x473add693e639c6f0" + if _, gotErr := parseThread([]byte(profile)); !strings.Contains(gotErr.Error(), wantErr) { + t.Errorf("parseThread(): got error %q, want error containing %q", gotErr, wantErr) + } +} + +func TestParseGoCount(t *testing.T) { + for _, test := range []struct { + in string + typ string + }{ + { + in: `# ignored comment + +threadcreate profile: total 123 +`, + typ: "threadcreate", + }, + { + in: ` +# ignored comment +goroutine profile: total 123456 +`, + typ: "goroutine", + }, + { + in: ` +sub/dir-ect_o.ry profile: total 999 +`, + typ: "sub/dir-ect_o.ry", + }, + } { + t.Run(test.typ, func(t *testing.T) { + p, err := parseGoCount([]byte(test.in)) + if err != nil { + t.Fatalf("parseGoCount(%q) = %v", test.in, err) + } + if typ := p.PeriodType.Type; typ != test.typ { + t.Fatalf("parseGoCount(%q).PeriodType.Type = %q want %q", test.in, typ, test.typ) + } + }) + } +} diff --git a/plugin/debug/pkg/profile/merge.go b/plugin/debug/pkg/profile/merge.go new file mode 100644 index 00000000..ba4d7464 --- /dev/null +++ b/plugin/debug/pkg/profile/merge.go @@ -0,0 +1,674 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "encoding/binary" + "fmt" + "sort" + "strconv" + "strings" +) + +// Compact performs garbage collection on a profile to remove any +// unreferenced fields. This is useful to reduce the size of a profile +// after samples or locations have been removed. +func (p *Profile) Compact() *Profile { + p, _ = Merge([]*Profile{p}) + return p +} + +// Merge merges all the profiles in profs into a single Profile. +// Returns a new profile independent of the input profiles. The merged +// profile is compacted to eliminate unused samples, locations, +// functions and mappings. Profiles must have identical profile sample +// and period types or the merge will fail. profile.Period of the +// resulting profile will be the maximum of all profiles, and +// profile.TimeNanos will be the earliest nonzero one. Merges are +// associative with the caveat of the first profile having some +// specialization in how headers are combined. There may be other +// subtleties now or in the future regarding associativity. +func Merge(srcs []*Profile) (*Profile, error) { + if len(srcs) == 0 { + return nil, fmt.Errorf("no profiles to merge") + } + p, err := combineHeaders(srcs) + if err != nil { + return nil, err + } + + pm := &profileMerger{ + p: p, + samples: make(map[sampleKey]*Sample, len(srcs[0].Sample)), + locations: make(map[locationKey]*Location, len(srcs[0].Location)), + functions: make(map[functionKey]*Function, len(srcs[0].Function)), + mappings: make(map[mappingKey]*Mapping, len(srcs[0].Mapping)), + } + + for _, src := range srcs { + // Clear the profile-specific hash tables + pm.locationsByID = makeLocationIDMap(len(src.Location)) + pm.functionsByID = make(map[uint64]*Function, len(src.Function)) + pm.mappingsByID = make(map[uint64]mapInfo, len(src.Mapping)) + + if len(pm.mappings) == 0 && len(src.Mapping) > 0 { + // The Mapping list has the property that the first mapping + // represents the main binary. Take the first Mapping we see, + // otherwise the operations below will add mappings in an + // arbitrary order. + pm.mapMapping(src.Mapping[0]) + } + + for _, s := range src.Sample { + if !isZeroSample(s) { + pm.mapSample(s) + } + } + } + + for _, s := range p.Sample { + if isZeroSample(s) { + // If there are any zero samples, re-merge the profile to GC + // them. + return Merge([]*Profile{p}) + } + } + + return p, nil +} + +// Normalize normalizes the source profile by multiplying each value in profile by the +// ratio of the sum of the base profile's values of that sample type to the sum of the +// source profile's value of that sample type. +func (p *Profile) Normalize(pb *Profile) error { + + if err := p.compatible(pb); err != nil { + return err + } + + baseVals := make([]int64, len(p.SampleType)) + for _, s := range pb.Sample { + for i, v := range s.Value { + baseVals[i] += v + } + } + + srcVals := make([]int64, len(p.SampleType)) + for _, s := range p.Sample { + for i, v := range s.Value { + srcVals[i] += v + } + } + + normScale := make([]float64, len(baseVals)) + for i := range baseVals { + if srcVals[i] == 0 { + normScale[i] = 0.0 + } else { + normScale[i] = float64(baseVals[i]) / float64(srcVals[i]) + } + } + p.ScaleN(normScale) + return nil +} + +func isZeroSample(s *Sample) bool { + for _, v := range s.Value { + if v != 0 { + return false + } + } + return true +} + +type profileMerger struct { + p *Profile + + // Memoization tables within a profile. + locationsByID locationIDMap + functionsByID map[uint64]*Function + mappingsByID map[uint64]mapInfo + + // Memoization tables for profile entities. + samples map[sampleKey]*Sample + locations map[locationKey]*Location + functions map[functionKey]*Function + mappings map[mappingKey]*Mapping +} + +type mapInfo struct { + m *Mapping + offset int64 +} + +func (pm *profileMerger) mapSample(src *Sample) *Sample { + // Check memoization table + k := pm.sampleKey(src) + if ss, ok := pm.samples[k]; ok { + for i, v := range src.Value { + ss.Value[i] += v + } + return ss + } + + // Make new sample. + s := &Sample{ + Location: make([]*Location, len(src.Location)), + Value: make([]int64, len(src.Value)), + Label: make(map[string][]string, len(src.Label)), + NumLabel: make(map[string][]int64, len(src.NumLabel)), + NumUnit: make(map[string][]string, len(src.NumLabel)), + } + for i, l := range src.Location { + s.Location[i] = pm.mapLocation(l) + } + for k, v := range src.Label { + vv := make([]string, len(v)) + copy(vv, v) + s.Label[k] = vv + } + for k, v := range src.NumLabel { + u := src.NumUnit[k] + vv := make([]int64, len(v)) + uu := make([]string, len(u)) + copy(vv, v) + copy(uu, u) + s.NumLabel[k] = vv + s.NumUnit[k] = uu + } + copy(s.Value, src.Value) + pm.samples[k] = s + pm.p.Sample = append(pm.p.Sample, s) + return s +} + +func (pm *profileMerger) sampleKey(sample *Sample) sampleKey { + // Accumulate contents into a string. + var buf strings.Builder + buf.Grow(64) // Heuristic to avoid extra allocs + + // encode a number + putNumber := func(v uint64) { + var num [binary.MaxVarintLen64]byte + n := binary.PutUvarint(num[:], v) + buf.Write(num[:n]) + } + + // encode a string prefixed with its length. + putDelimitedString := func(s string) { + putNumber(uint64(len(s))) + buf.WriteString(s) + } + + for _, l := range sample.Location { + // Get the location in the merged profile, which may have a different ID. + if loc := pm.mapLocation(l); loc != nil { + putNumber(loc.ID) + } + } + putNumber(0) // Delimiter + + for _, l := range sortedKeys1(sample.Label) { + putDelimitedString(l) + values := sample.Label[l] + putNumber(uint64(len(values))) + for _, v := range values { + putDelimitedString(v) + } + } + + for _, l := range sortedKeys2(sample.NumLabel) { + putDelimitedString(l) + values := sample.NumLabel[l] + putNumber(uint64(len(values))) + for _, v := range values { + putNumber(uint64(v)) + } + units := sample.NumUnit[l] + putNumber(uint64(len(units))) + for _, v := range units { + putDelimitedString(v) + } + } + + return sampleKey(buf.String()) +} + +type sampleKey string + +// sortedKeys1 returns the sorted keys found in a string->[]string map. +// +// Note: this is currently non-generic since github pprof runs golint, +// which does not support generics. When that issue is fixed, it can +// be merged with sortedKeys2 and made into a generic function. +func sortedKeys1(m map[string][]string) []string { + if len(m) == 0 { + return nil + } + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} + +// sortedKeys2 returns the sorted keys found in a string->[]int64 map. +// +// Note: this is currently non-generic since github pprof runs golint, +// which does not support generics. When that issue is fixed, it can +// be merged with sortedKeys1 and made into a generic function. +func sortedKeys2(m map[string][]int64) []string { + if len(m) == 0 { + return nil + } + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} + +func (pm *profileMerger) mapLocation(src *Location) *Location { + if src == nil { + return nil + } + + if l := pm.locationsByID.get(src.ID); l != nil { + return l + } + + mi := pm.mapMapping(src.Mapping) + l := &Location{ + ID: uint64(len(pm.p.Location) + 1), + Mapping: mi.m, + Address: uint64(int64(src.Address) + mi.offset), + Line: make([]Line, len(src.Line)), + IsFolded: src.IsFolded, + } + for i, ln := range src.Line { + l.Line[i] = pm.mapLine(ln) + } + // Check memoization table. Must be done on the remapped location to + // account for the remapped mapping ID. + k := l.key() + if ll, ok := pm.locations[k]; ok { + pm.locationsByID.set(src.ID, ll) + return ll + } + pm.locationsByID.set(src.ID, l) + pm.locations[k] = l + pm.p.Location = append(pm.p.Location, l) + return l +} + +// key generates locationKey to be used as a key for maps. +func (l *Location) key() locationKey { + key := locationKey{ + addr: l.Address, + isFolded: l.IsFolded, + } + if l.Mapping != nil { + // Normalizes address to handle address space randomization. + key.addr -= l.Mapping.Start + key.mappingID = l.Mapping.ID + } + lines := make([]string, len(l.Line)*3) + for i, line := range l.Line { + if line.Function != nil { + lines[i*2] = strconv.FormatUint(line.Function.ID, 16) + } + lines[i*2+1] = strconv.FormatInt(line.Line, 16) + lines[i*2+2] = strconv.FormatInt(line.Column, 16) + } + key.lines = strings.Join(lines, "|") + return key +} + +type locationKey struct { + addr, mappingID uint64 + lines string + isFolded bool +} + +func (pm *profileMerger) mapMapping(src *Mapping) mapInfo { + if src == nil { + return mapInfo{} + } + + if mi, ok := pm.mappingsByID[src.ID]; ok { + return mi + } + + // Check memoization tables. + mk := src.key() + if m, ok := pm.mappings[mk]; ok { + mi := mapInfo{m, int64(m.Start) - int64(src.Start)} + pm.mappingsByID[src.ID] = mi + return mi + } + m := &Mapping{ + ID: uint64(len(pm.p.Mapping) + 1), + Start: src.Start, + Limit: src.Limit, + Offset: src.Offset, + File: src.File, + KernelRelocationSymbol: src.KernelRelocationSymbol, + BuildID: src.BuildID, + HasFunctions: src.HasFunctions, + HasFilenames: src.HasFilenames, + HasLineNumbers: src.HasLineNumbers, + HasInlineFrames: src.HasInlineFrames, + } + pm.p.Mapping = append(pm.p.Mapping, m) + + // Update memoization tables. + pm.mappings[mk] = m + mi := mapInfo{m, 0} + pm.mappingsByID[src.ID] = mi + return mi +} + +// key generates encoded strings of Mapping to be used as a key for +// maps. +func (m *Mapping) key() mappingKey { + // Normalize addresses to handle address space randomization. + // Round up to next 4K boundary to avoid minor discrepancies. + const mapsizeRounding = 0x1000 + + size := m.Limit - m.Start + size = size + mapsizeRounding - 1 + size = size - (size % mapsizeRounding) + key := mappingKey{ + size: size, + offset: m.Offset, + } + + switch { + case m.BuildID != "": + key.buildIDOrFile = m.BuildID + case m.File != "": + key.buildIDOrFile = m.File + default: + // A mapping containing neither build ID nor file name is a fake mapping. A + // key with empty buildIDOrFile is used for fake mappings so that they are + // treated as the same mapping during merging. + } + return key +} + +type mappingKey struct { + size, offset uint64 + buildIDOrFile string +} + +func (pm *profileMerger) mapLine(src Line) Line { + ln := Line{ + Function: pm.mapFunction(src.Function), + Line: src.Line, + Column: src.Column, + } + return ln +} + +func (pm *profileMerger) mapFunction(src *Function) *Function { + if src == nil { + return nil + } + if f, ok := pm.functionsByID[src.ID]; ok { + return f + } + k := src.key() + if f, ok := pm.functions[k]; ok { + pm.functionsByID[src.ID] = f + return f + } + f := &Function{ + ID: uint64(len(pm.p.Function) + 1), + Name: src.Name, + SystemName: src.SystemName, + Filename: src.Filename, + StartLine: src.StartLine, + } + pm.functions[k] = f + pm.functionsByID[src.ID] = f + pm.p.Function = append(pm.p.Function, f) + return f +} + +// key generates a struct to be used as a key for maps. +func (f *Function) key() functionKey { + return functionKey{ + f.StartLine, + f.Name, + f.SystemName, + f.Filename, + } +} + +type functionKey struct { + startLine int64 + name, systemName, fileName string +} + +// combineHeaders checks that all profiles can be merged and returns +// their combined profile. +func combineHeaders(srcs []*Profile) (*Profile, error) { + for _, s := range srcs[1:] { + if err := srcs[0].compatible(s); err != nil { + return nil, err + } + } + + var timeNanos, durationNanos, period int64 + var comments []string + seenComments := map[string]bool{} + var docURL string + var defaultSampleType string + for _, s := range srcs { + if timeNanos == 0 || s.TimeNanos < timeNanos { + timeNanos = s.TimeNanos + } + durationNanos += s.DurationNanos + if period == 0 || period < s.Period { + period = s.Period + } + for _, c := range s.Comments { + if seen := seenComments[c]; !seen { + comments = append(comments, c) + seenComments[c] = true + } + } + if defaultSampleType == "" { + defaultSampleType = s.DefaultSampleType + } + if docURL == "" { + docURL = s.DocURL + } + } + + p := &Profile{ + SampleType: make([]*ValueType, len(srcs[0].SampleType)), + + DropFrames: srcs[0].DropFrames, + KeepFrames: srcs[0].KeepFrames, + + TimeNanos: timeNanos, + DurationNanos: durationNanos, + PeriodType: srcs[0].PeriodType, + Period: period, + + Comments: comments, + DefaultSampleType: defaultSampleType, + DocURL: docURL, + } + copy(p.SampleType, srcs[0].SampleType) + return p, nil +} + +// compatible determines if two profiles can be compared/merged. +// returns nil if the profiles are compatible; otherwise an error with +// details on the incompatibility. +func (p *Profile) compatible(pb *Profile) error { + if !equalValueType(p.PeriodType, pb.PeriodType) { + return fmt.Errorf("incompatible period types %v and %v", p.PeriodType, pb.PeriodType) + } + + if len(p.SampleType) != len(pb.SampleType) { + return fmt.Errorf("incompatible sample types %v and %v", p.SampleType, pb.SampleType) + } + + for i := range p.SampleType { + if !equalValueType(p.SampleType[i], pb.SampleType[i]) { + return fmt.Errorf("incompatible sample types %v and %v", p.SampleType, pb.SampleType) + } + } + return nil +} + +// equalValueType returns true if the two value types are semantically +// equal. It ignores the internal fields used during encode/decode. +func equalValueType(st1, st2 *ValueType) bool { + return st1.Type == st2.Type && st1.Unit == st2.Unit +} + +// locationIDMap is like a map[uint64]*Location, but provides efficiency for +// ids that are densely numbered, which is often the case. +type locationIDMap struct { + dense []*Location // indexed by id for id < len(dense) + sparse map[uint64]*Location // indexed by id for id >= len(dense) +} + +func makeLocationIDMap(n int) locationIDMap { + return locationIDMap{ + dense: make([]*Location, n), + sparse: map[uint64]*Location{}, + } +} + +func (lm locationIDMap) get(id uint64) *Location { + if id < uint64(len(lm.dense)) { + return lm.dense[int(id)] + } + return lm.sparse[id] +} + +func (lm locationIDMap) set(id uint64, loc *Location) { + if id < uint64(len(lm.dense)) { + lm.dense[id] = loc + return + } + lm.sparse[id] = loc +} + +// CompatibilizeSampleTypes makes profiles compatible to be compared/merged. It +// keeps sample types that appear in all profiles only and drops/reorders the +// sample types as necessary. +// +// In the case of sample types order is not the same for given profiles the +// order is derived from the first profile. +// +// Profiles are modified in-place. +// +// It returns an error if the sample type's intersection is empty. +func CompatibilizeSampleTypes(ps []*Profile) error { + sTypes := commonSampleTypes(ps) + if len(sTypes) == 0 { + return fmt.Errorf("profiles have empty common sample type list") + } + for _, p := range ps { + if err := compatibilizeSampleTypes(p, sTypes); err != nil { + return err + } + } + return nil +} + +// commonSampleTypes returns sample types that appear in all profiles in the +// order how they ordered in the first profile. +func commonSampleTypes(ps []*Profile) []string { + if len(ps) == 0 { + return nil + } + sTypes := map[string]int{} + for _, p := range ps { + for _, st := range p.SampleType { + sTypes[st.Type]++ + } + } + var res []string + for _, st := range ps[0].SampleType { + if sTypes[st.Type] == len(ps) { + res = append(res, st.Type) + } + } + return res +} + +// compatibilizeSampleTypes drops sample types that are not present in sTypes +// list and reorder them if needed. +// +// It sets DefaultSampleType to sType[0] if it is not in sType list. +// +// It assumes that all sample types from the sTypes list are present in the +// given profile otherwise it returns an error. +func compatibilizeSampleTypes(p *Profile, sTypes []string) error { + if len(sTypes) == 0 { + return fmt.Errorf("sample type list is empty") + } + defaultSampleType := sTypes[0] + reMap, needToModify := make([]int, len(sTypes)), false + for i, st := range sTypes { + if st == p.DefaultSampleType { + defaultSampleType = p.DefaultSampleType + } + idx := searchValueType(p.SampleType, st) + if idx < 0 { + return fmt.Errorf("%q sample type is not found in profile", st) + } + reMap[i] = idx + if idx != i { + needToModify = true + } + } + if !needToModify && len(sTypes) == len(p.SampleType) { + return nil + } + p.DefaultSampleType = defaultSampleType + oldSampleTypes := p.SampleType + p.SampleType = make([]*ValueType, len(sTypes)) + for i, idx := range reMap { + p.SampleType[i] = oldSampleTypes[idx] + } + values := make([]int64, len(sTypes)) + for _, s := range p.Sample { + for i, idx := range reMap { + values[i] = s.Value[idx] + } + s.Value = s.Value[:len(values)] + copy(s.Value, values) + } + return nil +} + +func searchValueType(vts []*ValueType, s string) int { + for i, vt := range vts { + if vt.Type == s { + return i + } + } + return -1 +} diff --git a/plugin/debug/pkg/profile/merge_test.go b/plugin/debug/pkg/profile/merge_test.go new file mode 100644 index 00000000..5dff13df --- /dev/null +++ b/plugin/debug/pkg/profile/merge_test.go @@ -0,0 +1,506 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "bytes" + "fmt" + "reflect" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/proftest" +) + +func TestMapMapping(t *testing.T) { + pm := &profileMerger{ + p: &Profile{}, + mappings: make(map[mappingKey]*Mapping), + mappingsByID: make(map[uint64]mapInfo), + } + for _, tc := range []struct { + desc string + m1 Mapping + m2 Mapping + wantMerged bool + }{ + { + desc: "same file name", + m1: Mapping{ + ID: 1, + File: "test-file-1", + }, + m2: Mapping{ + ID: 2, + File: "test-file-1", + }, + wantMerged: true, + }, + { + desc: "same build ID", + m1: Mapping{ + ID: 3, + BuildID: "test-build-id-1", + }, + m2: Mapping{ + ID: 4, + BuildID: "test-build-id-1", + }, + wantMerged: true, + }, + { + desc: "same fake mapping", + m1: Mapping{ + ID: 5, + }, + m2: Mapping{ + ID: 6, + }, + wantMerged: true, + }, + { + desc: "different start", + m1: Mapping{ + ID: 7, + Start: 0x1000, + Limit: 0x2000, + BuildID: "test-build-id-2", + }, + m2: Mapping{ + ID: 8, + Start: 0x3000, + Limit: 0x4000, + BuildID: "test-build-id-2", + }, + wantMerged: true, + }, + { + desc: "different file name", + m1: Mapping{ + ID: 9, + File: "test-file-2", + }, + m2: Mapping{ + ID: 10, + File: "test-file-3", + }, + }, + { + desc: "different build id", + m1: Mapping{ + ID: 11, + BuildID: "test-build-id-3", + }, + m2: Mapping{ + ID: 12, + BuildID: "test-build-id-4", + }, + }, + { + desc: "different size", + m1: Mapping{ + ID: 13, + Start: 0x1000, + Limit: 0x3000, + BuildID: "test-build-id-5", + }, + m2: Mapping{ + ID: 14, + Start: 0x1000, + Limit: 0x5000, + BuildID: "test-build-id-5", + }, + }, + { + desc: "different offset", + m1: Mapping{ + ID: 15, + Offset: 1, + BuildID: "test-build-id-6", + }, + m2: Mapping{ + ID: 16, + Offset: 2, + BuildID: "test-build-id-6", + }, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + info1 := pm.mapMapping(&tc.m1) + info2 := pm.mapMapping(&tc.m2) + gotM1, gotM2 := *info1.m, *info2.m + + wantM1 := tc.m1 + wantM1.ID = gotM1.ID + if gotM1 != wantM1 { + t.Errorf("first mapping got %v, want %v", gotM1, wantM1) + } + + if tc.wantMerged { + if gotM1 != gotM2 { + t.Errorf("first mapping got %v, second mapping got %v, want equal", gotM1, gotM2) + } + if info1.offset != 0 { + t.Errorf("first mapping info got offset %d, want 0", info1.offset) + } + if wantOffset := int64(tc.m1.Start) - int64(tc.m2.Start); wantOffset != info2.offset { + t.Errorf("second mapping info got offset %d, want %d", info2.offset, wantOffset) + } + } else { + if gotM1.ID == gotM2.ID { + t.Errorf("first mapping got %v, second mapping got %v, want different IDs", gotM1, gotM2) + } + wantM2 := tc.m2 + wantM2.ID = gotM2.ID + if gotM2 != wantM2 { + t.Errorf("second mapping got %v, want %v", gotM2, wantM2) + } + } + }) + } +} + +func TestLocationIDMap(t *testing.T) { + ids := []uint64{1, 2, 5, 9, 10, 11, 100, 1000, 1000000} + missing := []uint64{3, 4, 200} + + // Populate the map,. + idmap := makeLocationIDMap(10) + for _, id := range ids { + loc := &Location{ID: id} + idmap.set(id, loc) + } + + // Check ids that should be present in the map. + for _, id := range ids { + loc := idmap.get(id) + if loc == nil { + t.Errorf("No location found for %d", id) + } else if loc.ID != id { + t.Errorf("Wrong location %d found for %d", loc.ID, id) + } + } + + // Check ids that should not be present in the map. + for _, id := range missing { + loc := idmap.get(id) + if loc != nil { + t.Errorf("Unexpected location %d found for %d", loc.ID, id) + } + } +} + +func BenchmarkMerge(b *testing.B) { + data := proftest.LargeProfile(b) + for n := 1; n <= 2; n++ { // Merge either 1 or 2 instances. + b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { + list := make([]*Profile, n) + for i := 0; i < n; i++ { + prof, err := Parse(bytes.NewBuffer(data)) + if err != nil { + b.Fatal(err) + } + list[i] = prof + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := Merge(list) + if err != nil { + b.Fatal(err) + } + } + }) + } +} + +func TestCompatibilizeSampleTypes(t *testing.T) { + for _, tc := range []struct { + desc string + ps []*Profile + want []*Profile + wantError bool + }{ + { + desc: "drop first sample types", + ps: []*Profile{ + { + DefaultSampleType: "delete1", + SampleType: []*ValueType{ + {Type: "delete1", Unit: "Unit1"}, + {Type: "delete2", Unit: "Unit2"}, + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3, 4, 5}}, + {Value: []int64{10, 20, 30, 40, 50}}, + }, + }, + { + DefaultSampleType: "keep1", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3}}, + {Value: []int64{10, 20, 30}}, + }, + }, + }, + want: []*Profile{ + { + DefaultSampleType: "keep1", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{3, 4, 5}}, + {Value: []int64{30, 40, 50}}, + }, + }, + { + DefaultSampleType: "keep1", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3}}, + {Value: []int64{10, 20, 30}}, + }, + }, + }, + }, + { + desc: "drop last sample types", + ps: []*Profile{ + { + DefaultSampleType: "delete2", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + {Type: "delete1", Unit: "Unit1"}, + {Type: "delete2", Unit: "Unit2"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3, 4, 5}}, + {Value: []int64{10, 20, 30, 40, 50}}, + }, + }, + { + DefaultSampleType: "keep2", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3}}, + {Value: []int64{10, 20, 30}}, + }, + }, + }, + want: []*Profile{ + { + DefaultSampleType: "keep1", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3}}, + {Value: []int64{10, 20, 30}}, + }, + }, + { + DefaultSampleType: "keep2", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3}}, + {Value: []int64{10, 20, 30}}, + }, + }, + }, + }, + { + desc: "drop sample types and reorder", + ps: []*Profile{ + { + DefaultSampleType: "keep3", + SampleType: []*ValueType{ + {Type: "delete1", Unit: "Unit1"}, + {Type: "keep1", Unit: "Unit3"}, + {Type: "delete2", Unit: "Unit2"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3, 4, 5}}, + {Value: []int64{10, 20, 30, 40, 50}}, + }, + }, + { + DefaultSampleType: "keep2", + SampleType: []*ValueType{ + {Type: "keep3", Unit: "Unit5"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep1", Unit: "Unit3"}, + }, + Sample: []*Sample{ + {Value: []int64{1, 2, 3}}, + {Value: []int64{10, 20, 30}}, + }, + }, + }, + want: []*Profile{ + { + DefaultSampleType: "keep3", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{2, 4, 5}}, + {Value: []int64{20, 40, 50}}, + }, + }, + { + DefaultSampleType: "keep2", + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit3"}, + {Type: "keep2", Unit: "Unit4"}, + {Type: "keep3", Unit: "Unit5"}, + }, + Sample: []*Sample{ + {Value: []int64{3, 2, 1}}, + {Value: []int64{30, 20, 10}}, + }, + }, + }, + }, + { + desc: "empty common types", + ps: []*Profile{ + { + SampleType: []*ValueType{ + {Type: "keep1", Unit: "Unit1"}, + {Type: "keep2", Unit: "Unit2"}, + {Type: "keep3", Unit: "Unit3"}, + }, + }, + { + SampleType: []*ValueType{ + {Type: "keep4", Unit: "Unit4"}, + {Type: "keep5", Unit: "Unit5"}, + }, + }, + }, + wantError: true, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + err := CompatibilizeSampleTypes(tc.ps) + if (err != nil) != tc.wantError { + t.Fatalf("CompatibilizeSampleTypes() returned error: %v, want any error=%t", err, tc.wantError) + } + if err != nil { + return + } + for i := 0; i < len(tc.want); i++ { + gotStr := tc.ps[i].String() + wantStr := tc.want[i].String() + if gotStr != wantStr { + d, err := proftest.Diff([]byte(wantStr), []byte(gotStr)) + if err != nil { + t.Fatalf("failed to get diff: %v", err) + } + t.Errorf("CompatibilizeSampleTypes(): profile[%d] got diff (-want +got)\n%s", i, string(d)) + } + } + }) + } +} + +func TestDocURLMerge(t *testing.T) { + const url1 = "http://example.com/url1" + const url2 = "http://example.com/url2" + type testCase struct { + name string + profiles []*Profile + want string + } + profile := func(url string) *Profile { + return &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "seconds"}, + DocURL: url, + } + } + for _, test := range []testCase{ + { + name: "nolinks", + profiles: []*Profile{ + profile(""), + profile(""), + }, + want: "", + }, + { + name: "single", + profiles: []*Profile{ + profile(url1), + }, + want: url1, + }, + { + name: "mix", + profiles: []*Profile{ + profile(""), + profile(url1), + }, + want: url1, + }, + { + name: "different", + profiles: []*Profile{ + profile(url1), + profile(url2), + }, + want: url1, + }, + } { + t.Run(test.name, func(t *testing.T) { + merged, err := combineHeaders(test.profiles) + if err != nil { + t.Fatal(err) + } + got := merged.DocURL + if !reflect.DeepEqual(test.want, got) { + t.Errorf("unexpected links; want: %#v, got: %#v", test.want, got) + } + }) + } +} diff --git a/plugin/debug/pkg/profile/profile.go b/plugin/debug/pkg/profile/profile.go new file mode 100644 index 00000000..f47a2439 --- /dev/null +++ b/plugin/debug/pkg/profile/profile.go @@ -0,0 +1,869 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package profile provides a representation of profile.proto and +// methods to encode/decode profiles in this format. +package profile + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "math" + "path/filepath" + "regexp" + "sort" + "strings" + "sync" + "time" +) + +// Profile is an in-memory representation of profile.proto. +type Profile struct { + SampleType []*ValueType + DefaultSampleType string + Sample []*Sample + Mapping []*Mapping + Location []*Location + Function []*Function + Comments []string + DocURL string + + DropFrames string + KeepFrames string + + TimeNanos int64 + DurationNanos int64 + PeriodType *ValueType + Period int64 + + // The following fields are modified during encoding and copying, + // so are protected by a Mutex. + encodeMu sync.Mutex + + commentX []int64 + docURLX int64 + dropFramesX int64 + keepFramesX int64 + stringTable []string + defaultSampleTypeX int64 +} + +// ValueType corresponds to Profile.ValueType +type ValueType struct { + Type string // cpu, wall, inuse_space, etc + Unit string // seconds, nanoseconds, bytes, etc + + typeX int64 + unitX int64 +} + +// Sample corresponds to Profile.Sample +type Sample struct { + Location []*Location + Value []int64 + // Label is a per-label-key map to values for string labels. + // + // In general, having multiple values for the given label key is strongly + // discouraged - see docs for the sample label field in profile.proto. The + // main reason this unlikely state is tracked here is to make the + // decoding->encoding roundtrip not lossy. But we expect that the value + // slices present in this map are always of length 1. + Label map[string][]string + // NumLabel is a per-label-key map to values for numeric labels. See a note + // above on handling multiple values for a label. + NumLabel map[string][]int64 + // NumUnit is a per-label-key map to the unit names of corresponding numeric + // label values. The unit info may be missing even if the label is in + // NumLabel, see the docs in profile.proto for details. When the value is + // slice is present and not nil, its length must be equal to the length of + // the corresponding value slice in NumLabel. + NumUnit map[string][]string + + locationIDX []uint64 + labelX []label +} + +// label corresponds to Profile.Label +type label struct { + keyX int64 + // Exactly one of the two following values must be set + strX int64 + numX int64 // Integer value for this label + // can be set if numX has value + unitX int64 +} + +// Mapping corresponds to Profile.Mapping +type Mapping struct { + ID uint64 + Start uint64 + Limit uint64 + Offset uint64 + File string + BuildID string + HasFunctions bool + HasFilenames bool + HasLineNumbers bool + HasInlineFrames bool + + fileX int64 + buildIDX int64 + + // Name of the kernel relocation symbol ("_text" or "_stext"), extracted from File. + // For linux kernel mappings generated by some tools, correct symbolization depends + // on knowing which of the two possible relocation symbols was used for `Start`. + // This is given to us as a suffix in `File` (e.g. "[kernel.kallsyms]_stext"). + // + // Note, this public field is not persisted in the proto. For the purposes of + // copying / merging / hashing profiles, it is considered subsumed by `File`. + KernelRelocationSymbol string +} + +// Location corresponds to Profile.Location +type Location struct { + ID uint64 + Mapping *Mapping + Address uint64 + Line []Line + IsFolded bool + + mappingIDX uint64 +} + +// Line corresponds to Profile.Line +type Line struct { + Function *Function + Line int64 + Column int64 + + functionIDX uint64 +} + +// Function corresponds to Profile.Function +type Function struct { + ID uint64 + Name string + SystemName string + Filename string + StartLine int64 + + nameX int64 + systemNameX int64 + filenameX int64 +} + +// Parse parses a profile and checks for its validity. The input +// may be a gzip-compressed encoded protobuf or one of many legacy +// profile formats which may be unsupported in the future. +func Parse(r io.Reader) (*Profile, error) { + data, err := io.ReadAll(r) + if err != nil { + return nil, err + } + return ParseData(data) +} + +// ParseData parses a profile from a buffer and checks for its +// validity. +func ParseData(data []byte) (*Profile, error) { + var p *Profile + var err error + if len(data) >= 2 && data[0] == 0x1f && data[1] == 0x8b { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err == nil { + data, err = io.ReadAll(gz) + } + if err != nil { + return nil, fmt.Errorf("decompressing profile: %v", err) + } + } + if p, err = ParseUncompressed(data); err != nil && err != errNoData && err != errConcatProfile { + p, err = parseLegacy(data) + } + + if err != nil { + return nil, fmt.Errorf("parsing profile: %v", err) + } + + if err := p.CheckValid(); err != nil { + return nil, fmt.Errorf("malformed profile: %v", err) + } + return p, nil +} + +var errUnrecognized = fmt.Errorf("unrecognized profile format") +var errMalformed = fmt.Errorf("malformed profile format") +var errNoData = fmt.Errorf("empty input file") +var errConcatProfile = fmt.Errorf("concatenated profiles detected") + +func parseLegacy(data []byte) (*Profile, error) { + parsers := []func([]byte) (*Profile, error){ + parseCPU, + parseHeap, + parseGoCount, // goroutine, threadcreate + parseThread, + parseContention, + parseJavaProfile, + } + + for _, parser := range parsers { + p, err := parser(data) + if err == nil { + p.addLegacyFrameInfo() + return p, nil + } + if err != errUnrecognized { + return nil, err + } + } + return nil, errUnrecognized +} + +// ParseUncompressed parses an uncompressed protobuf into a profile. +func ParseUncompressed(data []byte) (*Profile, error) { + if len(data) == 0 { + return nil, errNoData + } + p := &Profile{} + if err := unmarshal(data, p); err != nil { + return nil, err + } + + if err := p.postDecode(); err != nil { + return nil, err + } + + return p, nil +} + +var libRx = regexp.MustCompile(`([.]so$|[.]so[._][0-9]+)`) + +// massageMappings applies heuristic-based changes to the profile +// mappings to account for quirks of some environments. +func (p *Profile) massageMappings() { + // Merge adjacent regions with matching names, checking that the offsets match + if len(p.Mapping) > 1 { + mappings := []*Mapping{p.Mapping[0]} + for _, m := range p.Mapping[1:] { + lm := mappings[len(mappings)-1] + if adjacent(lm, m) { + lm.Limit = m.Limit + if m.File != "" { + lm.File = m.File + } + if m.BuildID != "" { + lm.BuildID = m.BuildID + } + p.updateLocationMapping(m, lm) + continue + } + mappings = append(mappings, m) + } + p.Mapping = mappings + } + + // Use heuristics to identify main binary and move it to the top of the list of mappings + for i, m := range p.Mapping { + file := strings.TrimSpace(strings.Replace(m.File, "(deleted)", "", -1)) + if len(file) == 0 { + continue + } + if len(libRx.FindStringSubmatch(file)) > 0 { + continue + } + if file[0] == '[' { + continue + } + // Swap what we guess is main to position 0. + p.Mapping[0], p.Mapping[i] = p.Mapping[i], p.Mapping[0] + break + } + + // Keep the mapping IDs neatly sorted + for i, m := range p.Mapping { + m.ID = uint64(i + 1) + } +} + +// adjacent returns whether two mapping entries represent the same +// mapping that has been split into two. Check that their addresses are adjacent, +// and if the offsets match, if they are available. +func adjacent(m1, m2 *Mapping) bool { + if m1.File != "" && m2.File != "" { + if m1.File != m2.File { + return false + } + } + if m1.BuildID != "" && m2.BuildID != "" { + if m1.BuildID != m2.BuildID { + return false + } + } + if m1.Limit != m2.Start { + return false + } + if m1.Offset != 0 && m2.Offset != 0 { + offset := m1.Offset + (m1.Limit - m1.Start) + if offset != m2.Offset { + return false + } + } + return true +} + +func (p *Profile) updateLocationMapping(from, to *Mapping) { + for _, l := range p.Location { + if l.Mapping == from { + l.Mapping = to + } + } +} + +func serialize(p *Profile) []byte { + p.encodeMu.Lock() + p.preEncode() + b := marshal(p) + p.encodeMu.Unlock() + return b +} + +// Write writes the profile as a gzip-compressed marshaled protobuf. +func (p *Profile) Write(w io.Writer) error { + zw := gzip.NewWriter(w) + defer zw.Close() + _, err := zw.Write(serialize(p)) + return err +} + +// WriteUncompressed writes the profile as a marshaled protobuf. +func (p *Profile) WriteUncompressed(w io.Writer) error { + _, err := w.Write(serialize(p)) + return err +} + +// CheckValid tests whether the profile is valid. Checks include, but are +// not limited to: +// - len(Profile.Sample[n].value) == len(Profile.value_unit) +// - Sample.id has a corresponding Profile.Location +func (p *Profile) CheckValid() error { + // Check that sample values are consistent + sampleLen := len(p.SampleType) + if sampleLen == 0 && len(p.Sample) != 0 { + return fmt.Errorf("missing sample type information") + } + for _, s := range p.Sample { + if s == nil { + return fmt.Errorf("profile has nil sample") + } + if len(s.Value) != sampleLen { + return fmt.Errorf("mismatch: sample has %d values vs. %d types", len(s.Value), len(p.SampleType)) + } + for _, l := range s.Location { + if l == nil { + return fmt.Errorf("sample has nil location") + } + } + } + + // Check that all mappings/locations/functions are in the tables + // Check that there are no duplicate ids + mappings := make(map[uint64]*Mapping, len(p.Mapping)) + for _, m := range p.Mapping { + if m == nil { + return fmt.Errorf("profile has nil mapping") + } + if m.ID == 0 { + return fmt.Errorf("found mapping with reserved ID=0") + } + if mappings[m.ID] != nil { + return fmt.Errorf("multiple mappings with same id: %d", m.ID) + } + mappings[m.ID] = m + } + functions := make(map[uint64]*Function, len(p.Function)) + for _, f := range p.Function { + if f == nil { + return fmt.Errorf("profile has nil function") + } + if f.ID == 0 { + return fmt.Errorf("found function with reserved ID=0") + } + if functions[f.ID] != nil { + return fmt.Errorf("multiple functions with same id: %d", f.ID) + } + functions[f.ID] = f + } + locations := make(map[uint64]*Location, len(p.Location)) + for _, l := range p.Location { + if l == nil { + return fmt.Errorf("profile has nil location") + } + if l.ID == 0 { + return fmt.Errorf("found location with reserved id=0") + } + if locations[l.ID] != nil { + return fmt.Errorf("multiple locations with same id: %d", l.ID) + } + locations[l.ID] = l + if m := l.Mapping; m != nil { + if m.ID == 0 || mappings[m.ID] != m { + return fmt.Errorf("inconsistent mapping %p: %d", m, m.ID) + } + } + for _, ln := range l.Line { + f := ln.Function + if f == nil { + return fmt.Errorf("location id: %d has a line with nil function", l.ID) + } + if f.ID == 0 || functions[f.ID] != f { + return fmt.Errorf("inconsistent function %p: %d", f, f.ID) + } + } + } + return nil +} + +// Aggregate merges the locations in the profile into equivalence +// classes preserving the request attributes. It also updates the +// samples to point to the merged locations. +func (p *Profile) Aggregate(inlineFrame, function, filename, linenumber, columnnumber, address bool) error { + for _, m := range p.Mapping { + m.HasInlineFrames = m.HasInlineFrames && inlineFrame + m.HasFunctions = m.HasFunctions && function + m.HasFilenames = m.HasFilenames && filename + m.HasLineNumbers = m.HasLineNumbers && linenumber + } + + // Aggregate functions + if !function || !filename { + for _, f := range p.Function { + if !function { + f.Name = "" + f.SystemName = "" + } + if !filename { + f.Filename = "" + } + } + } + + // Aggregate locations + if !inlineFrame || !address || !linenumber || !columnnumber { + for _, l := range p.Location { + if !inlineFrame && len(l.Line) > 1 { + l.Line = l.Line[len(l.Line)-1:] + } + if !linenumber { + for i := range l.Line { + l.Line[i].Line = 0 + l.Line[i].Column = 0 + } + } + if !columnnumber { + for i := range l.Line { + l.Line[i].Column = 0 + } + } + if !address { + l.Address = 0 + } + } + } + + return p.CheckValid() +} + +// NumLabelUnits returns a map of numeric label keys to the units +// associated with those keys and a map of those keys to any units +// that were encountered but not used. +// Unit for a given key is the first encountered unit for that key. If multiple +// units are encountered for values paired with a particular key, then the first +// unit encountered is used and all other units are returned in sorted order +// in map of ignored units. +// If no units are encountered for a particular key, the unit is then inferred +// based on the key. +func (p *Profile) NumLabelUnits() (map[string]string, map[string][]string) { + numLabelUnits := map[string]string{} + ignoredUnits := map[string]map[string]bool{} + encounteredKeys := map[string]bool{} + + // Determine units based on numeric tags for each sample. + for _, s := range p.Sample { + for k := range s.NumLabel { + encounteredKeys[k] = true + for _, unit := range s.NumUnit[k] { + if unit == "" { + continue + } + if wantUnit, ok := numLabelUnits[k]; !ok { + numLabelUnits[k] = unit + } else if wantUnit != unit { + if v, ok := ignoredUnits[k]; ok { + v[unit] = true + } else { + ignoredUnits[k] = map[string]bool{unit: true} + } + } + } + } + } + // Infer units for keys without any units associated with + // numeric tag values. + for key := range encounteredKeys { + unit := numLabelUnits[key] + if unit == "" { + switch key { + case "alignment", "request": + numLabelUnits[key] = "bytes" + default: + numLabelUnits[key] = key + } + } + } + + // Copy ignored units into more readable format + unitsIgnored := make(map[string][]string, len(ignoredUnits)) + for key, values := range ignoredUnits { + units := make([]string, len(values)) + i := 0 + for unit := range values { + units[i] = unit + i++ + } + sort.Strings(units) + unitsIgnored[key] = units + } + + return numLabelUnits, unitsIgnored +} + +// String dumps a text representation of a profile. Intended mainly +// for debugging purposes. +func (p *Profile) String() string { + ss := make([]string, 0, len(p.Comments)+len(p.Sample)+len(p.Mapping)+len(p.Location)) + for _, c := range p.Comments { + ss = append(ss, "Comment: "+c) + } + if url := p.DocURL; url != "" { + ss = append(ss, fmt.Sprintf("Doc: %s", url)) + } + if pt := p.PeriodType; pt != nil { + ss = append(ss, fmt.Sprintf("PeriodType: %s %s", pt.Type, pt.Unit)) + } + ss = append(ss, fmt.Sprintf("Period: %d", p.Period)) + if p.TimeNanos != 0 { + ss = append(ss, fmt.Sprintf("Time: %v", time.Unix(0, p.TimeNanos))) + } + if p.DurationNanos != 0 { + ss = append(ss, fmt.Sprintf("Duration: %.4v", time.Duration(p.DurationNanos))) + } + + ss = append(ss, "Samples:") + var sh1 string + for _, s := range p.SampleType { + dflt := "" + if s.Type == p.DefaultSampleType { + dflt = "[dflt]" + } + sh1 = sh1 + fmt.Sprintf("%s/%s%s ", s.Type, s.Unit, dflt) + } + ss = append(ss, strings.TrimSpace(sh1)) + for _, s := range p.Sample { + ss = append(ss, s.string()) + } + + ss = append(ss, "Locations") + for _, l := range p.Location { + ss = append(ss, l.string()) + } + + ss = append(ss, "Mappings") + for _, m := range p.Mapping { + ss = append(ss, m.string()) + } + + return strings.Join(ss, "\n") + "\n" +} + +// string dumps a text representation of a mapping. Intended mainly +// for debugging purposes. +func (m *Mapping) string() string { + bits := "" + if m.HasFunctions { + bits = bits + "[FN]" + } + if m.HasFilenames { + bits = bits + "[FL]" + } + if m.HasLineNumbers { + bits = bits + "[LN]" + } + if m.HasInlineFrames { + bits = bits + "[IN]" + } + return fmt.Sprintf("%d: %#x/%#x/%#x %s %s %s", + m.ID, + m.Start, m.Limit, m.Offset, + m.File, + m.BuildID, + bits) +} + +// string dumps a text representation of a location. Intended mainly +// for debugging purposes. +func (l *Location) string() string { + ss := []string{} + locStr := fmt.Sprintf("%6d: %#x ", l.ID, l.Address) + if m := l.Mapping; m != nil { + locStr = locStr + fmt.Sprintf("M=%d ", m.ID) + } + if l.IsFolded { + locStr = locStr + "[F] " + } + if len(l.Line) == 0 { + ss = append(ss, locStr) + } + for li := range l.Line { + lnStr := "??" + if fn := l.Line[li].Function; fn != nil { + lnStr = fmt.Sprintf("%s %s:%d:%d s=%d", + fn.Name, + fn.Filename, + l.Line[li].Line, + l.Line[li].Column, + fn.StartLine) + if fn.Name != fn.SystemName { + lnStr = lnStr + "(" + fn.SystemName + ")" + } + } + ss = append(ss, locStr+lnStr) + // Do not print location details past the first line + locStr = " " + } + return strings.Join(ss, "\n") +} + +// string dumps a text representation of a sample. Intended mainly +// for debugging purposes. +func (s *Sample) string() string { + ss := []string{} + var sv string + for _, v := range s.Value { + sv = fmt.Sprintf("%s %10d", sv, v) + } + sv = sv + ": " + for _, l := range s.Location { + sv = sv + fmt.Sprintf("%d ", l.ID) + } + ss = append(ss, sv) + const labelHeader = " " + if len(s.Label) > 0 { + ss = append(ss, labelHeader+labelsToString(s.Label)) + } + if len(s.NumLabel) > 0 { + ss = append(ss, labelHeader+numLabelsToString(s.NumLabel, s.NumUnit)) + } + return strings.Join(ss, "\n") +} + +// labelsToString returns a string representation of a +// map representing labels. +func labelsToString(labels map[string][]string) string { + ls := []string{} + for k, v := range labels { + ls = append(ls, fmt.Sprintf("%s:%v", k, v)) + } + sort.Strings(ls) + return strings.Join(ls, " ") +} + +// numLabelsToString returns a string representation of a map +// representing numeric labels. +func numLabelsToString(numLabels map[string][]int64, numUnits map[string][]string) string { + ls := []string{} + for k, v := range numLabels { + units := numUnits[k] + var labelString string + if len(units) == len(v) { + values := make([]string, len(v)) + for i, vv := range v { + values[i] = fmt.Sprintf("%d %s", vv, units[i]) + } + labelString = fmt.Sprintf("%s:%v", k, values) + } else { + labelString = fmt.Sprintf("%s:%v", k, v) + } + ls = append(ls, labelString) + } + sort.Strings(ls) + return strings.Join(ls, " ") +} + +// SetLabel sets the specified key to the specified value for all samples in the +// profile. +func (p *Profile) SetLabel(key string, value []string) { + for _, sample := range p.Sample { + if sample.Label == nil { + sample.Label = map[string][]string{key: value} + } else { + sample.Label[key] = value + } + } +} + +// RemoveLabel removes all labels associated with the specified key for all +// samples in the profile. +func (p *Profile) RemoveLabel(key string) { + for _, sample := range p.Sample { + delete(sample.Label, key) + } +} + +// HasLabel returns true if a sample has a label with indicated key and value. +func (s *Sample) HasLabel(key, value string) bool { + for _, v := range s.Label[key] { + if v == value { + return true + } + } + return false +} + +// SetNumLabel sets the specified key to the specified value for all samples in the +// profile. "unit" is a slice that describes the units that each corresponding member +// of "values" is measured in (e.g. bytes or seconds). If there is no relevant +// unit for a given value, that member of "unit" should be the empty string. +// "unit" must either have the same length as "value", or be nil. +func (p *Profile) SetNumLabel(key string, value []int64, unit []string) { + for _, sample := range p.Sample { + if sample.NumLabel == nil { + sample.NumLabel = map[string][]int64{key: value} + } else { + sample.NumLabel[key] = value + } + if sample.NumUnit == nil { + sample.NumUnit = map[string][]string{key: unit} + } else { + sample.NumUnit[key] = unit + } + } +} + +// RemoveNumLabel removes all numerical labels associated with the specified key for all +// samples in the profile. +func (p *Profile) RemoveNumLabel(key string) { + for _, sample := range p.Sample { + delete(sample.NumLabel, key) + delete(sample.NumUnit, key) + } +} + +// DiffBaseSample returns true if a sample belongs to the diff base and false +// otherwise. +func (s *Sample) DiffBaseSample() bool { + return s.HasLabel("pprof::base", "true") +} + +// Scale multiplies all sample values in a profile by a constant and keeps +// only samples that have at least one non-zero value. +func (p *Profile) Scale(ratio float64) { + if ratio == 1 { + return + } + ratios := make([]float64, len(p.SampleType)) + for i := range p.SampleType { + ratios[i] = ratio + } + p.ScaleN(ratios) +} + +// ScaleN multiplies each sample values in a sample by a different amount +// and keeps only samples that have at least one non-zero value. +func (p *Profile) ScaleN(ratios []float64) error { + if len(p.SampleType) != len(ratios) { + return fmt.Errorf("mismatched scale ratios, got %d, want %d", len(ratios), len(p.SampleType)) + } + allOnes := true + for _, r := range ratios { + if r != 1 { + allOnes = false + break + } + } + if allOnes { + return nil + } + fillIdx := 0 + for _, s := range p.Sample { + keepSample := false + for i, v := range s.Value { + if ratios[i] != 1 { + val := int64(math.Round(float64(v) * ratios[i])) + s.Value[i] = val + keepSample = keepSample || val != 0 + } + } + if keepSample { + p.Sample[fillIdx] = s + fillIdx++ + } + } + p.Sample = p.Sample[:fillIdx] + return nil +} + +// HasFunctions determines if all locations in this profile have +// symbolized function information. +func (p *Profile) HasFunctions() bool { + for _, l := range p.Location { + if l.Mapping != nil && !l.Mapping.HasFunctions { + return false + } + } + return true +} + +// HasFileLines determines if all locations in this profile have +// symbolized file and line number information. +func (p *Profile) HasFileLines() bool { + for _, l := range p.Location { + if l.Mapping != nil && (!l.Mapping.HasFilenames || !l.Mapping.HasLineNumbers) { + return false + } + } + return true +} + +// Unsymbolizable returns true if a mapping points to a binary for which +// locations can't be symbolized in principle, at least now. Examples are +// "[vdso]", "[vsyscall]" and some others, see the code. +func (m *Mapping) Unsymbolizable() bool { + name := filepath.Base(m.File) + return strings.HasPrefix(name, "[") || strings.HasPrefix(name, "linux-vdso") || strings.HasPrefix(m.File, "/dev/dri/") || m.File == "//anon" +} + +// Copy makes a fully independent copy of a profile. +func (p *Profile) Copy() *Profile { + pp := &Profile{} + if err := unmarshal(serialize(p), pp); err != nil { + panic(err) + } + if err := pp.postDecode(); err != nil { + panic(err) + } + + return pp +} diff --git a/plugin/debug/pkg/profile/profile_test.go b/plugin/debug/pkg/profile/profile_test.go new file mode 100644 index 00000000..fd4d2027 --- /dev/null +++ b/plugin/debug/pkg/profile/profile_test.go @@ -0,0 +1,1942 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "bytes" + "flag" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "strings" + "sync" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/proftest" +) + +var update = flag.Bool("update", false, "Update the golden files") + +func TestParse(t *testing.T) { + const path = "testdata/" + + for _, source := range []string{ + "go.crc32.cpu", + "go.godoc.thread", + "gobench.cpu", + "gobench.heap", + "cppbench.cpu", + "cppbench.heap", + "cppbench.contention", + "cppbench.growth", + "cppbench.thread", + "cppbench.thread.all", + "cppbench.thread.none", + "java.cpu", + "java.heap", + "java.contention", + } { + inbytes, err := os.ReadFile(filepath.Join(path, source)) + if err != nil { + t.Fatal(err) + } + p, err := Parse(bytes.NewBuffer(inbytes)) + if err != nil { + t.Fatalf("%s: %s", source, err) + } + + js := p.String() + goldFilename := path + source + ".string" + if *update { + err := os.WriteFile(goldFilename, []byte(js), 0644) + if err != nil { + t.Errorf("failed to update the golden file file %q: %v", goldFilename, err) + } + } + gold, err := os.ReadFile(goldFilename) + if err != nil { + t.Fatalf("%s: %v", source, err) + } + + if js != string(gold) { + t.Errorf("diff %s %s", source, goldFilename) + d, err := proftest.Diff(gold, []byte(js)) + if err != nil { + t.Fatalf("%s: %v", source, err) + } + t.Error(source + "\n" + string(d) + "\n" + "new profile at:\n" + leaveTempfile([]byte(js))) + } + + // Reencode and decode. + var bw bytes.Buffer + if err := p.Write(&bw); err != nil { + t.Fatalf("%s: %v", source, err) + } + if p, err = Parse(&bw); err != nil { + t.Fatalf("%s: %v", source, err) + } + js2 := p.String() + if js2 != string(gold) { + d, err := proftest.Diff(gold, []byte(js2)) + if err != nil { + t.Fatalf("%s: %v", source, err) + } + t.Error(source + "\n" + string(d) + "\n" + "gold:\n" + goldFilename + + "\nnew profile at:\n" + leaveTempfile([]byte(js))) + } + } +} + +func TestParseError(t *testing.T) { + testcases := []string{ + "", + "garbage text", + "\x1f\x8b", // truncated gzip header + "\x1f\x8b\x08\x08\xbe\xe9\x20\x58\x00\x03\x65\x6d\x70\x74\x79\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", // empty gzipped file + } + + for i, input := range testcases { + _, err := Parse(strings.NewReader(input)) + if err == nil { + t.Errorf("got nil, want error for input #%d", i) + } + } +} + +func TestParseConcatentated(t *testing.T) { + prof := testProfile1.Copy() + // Write the profile twice to buffer to create concatented profile. + var buf bytes.Buffer + prof.Write(&buf) + prof.Write(&buf) + _, err := Parse(&buf) + if err == nil { + t.Fatalf("got nil, want error") + } + if got, want := err.Error(), "parsing profile: concatenated profiles detected"; want != got { + t.Fatalf("got error %q, want error %q", got, want) + } +} + +func TestCheckValid(t *testing.T) { + const path = "testdata/java.cpu" + + inbytes, err := os.ReadFile(path) + if err != nil { + t.Fatalf("failed to read profile file %q: %v", path, err) + } + p, err := Parse(bytes.NewBuffer(inbytes)) + if err != nil { + t.Fatalf("failed to parse profile %q: %s", path, err) + } + + for _, tc := range []struct { + mutateFn func(*Profile) + wantErr string + }{ + { + mutateFn: func(p *Profile) { p.SampleType = nil }, + wantErr: "missing sample type information", + }, + { + mutateFn: func(p *Profile) { p.Sample[0] = nil }, + wantErr: "profile has nil sample", + }, + { + mutateFn: func(p *Profile) { p.Sample[0].Value = append(p.Sample[0].Value, 0) }, + wantErr: "sample has 3 values vs. 2 types", + }, + { + mutateFn: func(p *Profile) { p.Sample[0].Location[0] = nil }, + wantErr: "sample has nil location", + }, + { + mutateFn: func(p *Profile) { p.Location[0] = nil }, + wantErr: "profile has nil location", + }, + { + mutateFn: func(p *Profile) { p.Mapping = append(p.Mapping, nil) }, + wantErr: "profile has nil mapping", + }, + { + mutateFn: func(p *Profile) { p.Function[0] = nil }, + wantErr: "profile has nil function", + }, + { + mutateFn: func(p *Profile) { p.Location[0].Line = append(p.Location[0].Line, Line{}) }, + wantErr: "has a line with nil function", + }, + } { + t.Run(tc.wantErr, func(t *testing.T) { + p := p.Copy() + tc.mutateFn(p) + if err := p.CheckValid(); err == nil { + t.Errorf("CheckValid(): got no error, want error %q", tc.wantErr) + } else if !strings.Contains(err.Error(), tc.wantErr) { + t.Errorf("CheckValid(): got error %v, want error %q", err, tc.wantErr) + } + }) + } +} + +// leaveTempfile leaves |b| in a temporary file on disk and returns the +// temp filename. This is useful to recover a profile when the test +// fails. +func leaveTempfile(b []byte) string { + f1, err := os.CreateTemp("", "profile_test") + if err != nil { + panic(err) + } + if _, err := f1.Write(b); err != nil { + panic(err) + } + return f1.Name() +} + +const mainBinary = "/bin/main" + +var cpuM = []*Mapping{ + { + ID: 1, + Start: 0x10000, + Limit: 0x40000, + File: mainBinary, + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + { + ID: 2, + Start: 0x1000, + Limit: 0x4000, + File: "/lib/lib.so", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + { + ID: 3, + Start: 0x4000, + Limit: 0x5000, + File: "/lib/lib2_c.so.6", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + { + ID: 4, + Start: 0x5000, + Limit: 0x9000, + File: "/lib/lib.so_6 (deleted)", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + { + ID: 5, + Start: 0xffff000010080000, + Limit: 0xffffffffffffffff, + File: "[kernel.kallsyms]_text", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, +} + +var cpuF = []*Function{ + {ID: 1, Name: "main", SystemName: "main", Filename: "main.c"}, + {ID: 2, Name: "foo", SystemName: "foo", Filename: "foo.c"}, + {ID: 3, Name: "foo_caller", SystemName: "foo_caller", Filename: "foo.c"}, +} + +var cpuL = []*Location{ + { + ID: 1000, + Mapping: cpuM[1], + Address: 0x1000, + Line: []Line{ + {Function: cpuF[0], Line: 1, Column: 1}, + }, + }, + { + ID: 2000, + Mapping: cpuM[0], + Address: 0x2000, + Line: []Line{ + {Function: cpuF[1], Line: 2, Column: 2}, + {Function: cpuF[2], Line: 1, Column: 1}, + }, + }, + { + ID: 3000, + Mapping: cpuM[0], + Address: 0x3000, + Line: []Line{ + {Function: cpuF[1], Line: 2, Column: 2}, + {Function: cpuF[2], Line: 1, Column: 1}, + }, + }, + { + ID: 3001, + Mapping: cpuM[0], + Address: 0x3001, + Line: []Line{ + {Function: cpuF[2], Line: 2, Column: 2}, + }, + }, + { + ID: 3002, + Mapping: cpuM[0], + Address: 0x3002, + Line: []Line{ + {Function: cpuF[2], Line: 3, Column: 3}, + }, + }, + // Differs from 1000 due to address and column number. + { + ID: 1001, + Mapping: cpuM[1], + Address: 0x1001, + Line: []Line{ + {Function: cpuF[0], Line: 1, Column: 2}, + }, + }, +} + +var testProfile1 = &Profile{ + TimeNanos: 10000, + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000, 1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[1], cpuL[0]}, + Value: []int64{100, 100}, + Label: map[string][]string{ + "key1": {"tag2"}, + "key3": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[2], cpuL[0]}, + Value: []int64{10, 10}, + Label: map[string][]string{ + "key1": {"tag3"}, + "key2": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[3], cpuL[0]}, + Value: []int64{10000, 10000}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[4], cpuL[0]}, + Value: []int64{1, 1}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +var testProfile1NoMapping = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000, 1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[1], cpuL[0]}, + Value: []int64{100, 100}, + Label: map[string][]string{ + "key1": {"tag2"}, + "key3": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[2], cpuL[0]}, + Value: []int64{10, 10}, + Label: map[string][]string{ + "key1": {"tag3"}, + "key2": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[3], cpuL[0]}, + Value: []int64{10000, 10000}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[4], cpuL[0]}, + Value: []int64{1, 1}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, +} + +var testProfile2 = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{70, 1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[1], cpuL[0]}, + Value: []int64{60, 100}, + Label: map[string][]string{ + "key1": {"tag2"}, + "key3": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[2], cpuL[0]}, + Value: []int64{50, 10}, + Label: map[string][]string{ + "key1": {"tag3"}, + "key2": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[3], cpuL[0]}, + Value: []int64{40, 10000}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[4], cpuL[0]}, + Value: []int64{1, 1}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +var testProfile3 = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +var testProfile4 = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {10}, + "key2": {30}, + }, + NumUnit: map[string][]string{ + "key1": {"bytes"}, + "key2": {"bytes"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +var testProfile5 = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {10}, + "key2": {30}, + }, + NumUnit: map[string][]string{ + "key1": {"bytes"}, + "key2": {"bytes"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {10}, + "key2": {30}, + }, + NumUnit: map[string][]string{ + "key1": {"kilobytes"}, + "key2": {"kilobytes"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +var testProfile6 = &Profile{ + TimeNanos: 10000, + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000, 1000}, + Label: map[string][]string{ + "key1": {"tag1"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[1], cpuL[0]}, + Value: []int64{100, 100}, + Label: map[string][]string{ + "key1": {"tag2"}, + "key3": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[2], cpuL[0]}, + Value: []int64{10, 10}, + Label: map[string][]string{ + "key1": {"tag3"}, + "key2": {"tag2"}, + }, + }, + { + Location: []*Location{cpuL[3], cpuL[0]}, + Value: []int64{10000, 10000}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[4], cpuL[0]}, + Value: []int64{1, 1}, + Label: map[string][]string{ + "key1": {"tag4"}, + "key2": {"tag1"}, + }, + }, + { + Location: []*Location{cpuL[5]}, + Value: []int64{1, 1}, + Label: map[string][]string{ + "key1": {"tag5"}, + "key2": {"tag1"}, + }, + }, + }, + Location: cpuL, + Function: cpuF, + Mapping: cpuM, +} + +var aggTests = map[string]aggTest{ + "precise": {true, true, true, true, true, 6}, + "columns": {false, true, true, true, true, 5}, + "fileline": {false, true, true, false, true, 4}, + "inline_function": {false, true, false, false, true, 3}, + "function": {false, true, false, false, false, 2}, +} + +type aggTest struct { + precise, function, fileline, column, inlineFrame bool + rows int +} + +// totalSamples is the sum of sample.Value[0] for testProfile6. +const totalSamples = int64(11112) + +func TestAggregation(t *testing.T) { + prof := testProfile6.Copy() + for _, resolution := range []string{"precise", "columns", "fileline", "inline_function", "function"} { + a := aggTests[resolution] + if !a.precise { + if err := prof.Aggregate(a.inlineFrame, a.function, a.fileline, a.fileline, a.column, false); err != nil { + t.Error("aggregating to " + resolution + ":" + err.Error()) + } + } + if err := checkAggregation(prof, &a); err != nil { + t.Error("failed aggregation to " + resolution + ": " + err.Error()) + } + } +} + +// checkAggregation verifies that the profile remained consistent +// with its aggregation. +func checkAggregation(prof *Profile, a *aggTest) error { + // Check that the total number of samples for the rows was preserved. + total := int64(0) + + samples := make(map[string]bool) + for _, sample := range prof.Sample { + tb := locationHash(sample) + samples[tb] = true + total += sample.Value[0] + } + + if total != totalSamples { + return fmt.Errorf("sample total %d, want %d", total, totalSamples) + } + + // Check the number of unique sample locations + if a.rows != len(samples) { + return fmt.Errorf("number of samples %d, want %d", len(samples), a.rows) + } + + // Check that all mappings have the right detail flags. + for _, m := range prof.Mapping { + if m.HasFunctions != a.function { + return fmt.Errorf("unexpected mapping.HasFunctions %v, want %v", m.HasFunctions, a.function) + } + if m.HasFilenames != a.fileline { + return fmt.Errorf("unexpected mapping.HasFilenames %v, want %v", m.HasFilenames, a.fileline) + } + if m.HasLineNumbers != a.fileline { + return fmt.Errorf("unexpected mapping.HasLineNumbers %v, want %v", m.HasLineNumbers, a.fileline) + } + if m.HasInlineFrames != a.inlineFrame { + return fmt.Errorf("unexpected mapping.HasInlineFrames %v, want %v", m.HasInlineFrames, a.inlineFrame) + } + } + + // Check that aggregation has removed finer resolution data. + for _, l := range prof.Location { + if !a.inlineFrame && len(l.Line) > 1 { + return fmt.Errorf("found %d lines on location %d, want 1", len(l.Line), l.ID) + } + + for _, ln := range l.Line { + if !a.column && ln.Column != 0 { + return fmt.Errorf("found column %d on location %d, want:0", ln.Column, l.ID) + } + if !a.fileline && (ln.Function.Filename != "" || ln.Line != 0) { + return fmt.Errorf("found line %s:%d on location %d, want :0", + ln.Function.Filename, ln.Line, l.ID) + } + if !a.function && (ln.Function.Name != "") { + return fmt.Errorf(`found file %s location %d, want ""`, + ln.Function.Name, l.ID) + } + } + } + + return nil +} + +// TestScale tests that Scale() rounds values and drops samples +// as expected. +func TestScale(t *testing.T) { + for _, tc := range []struct { + desc string + ratio float64 + p *Profile + wantSamples [][]int64 + }{ + { + desc: "scale by 1", + ratio: 1.0, + p: testProfile1.Copy(), + wantSamples: [][]int64{ + {1000, 1000}, + {100, 100}, + {10, 10}, + {10000, 10000}, + {1, 1}, + }, + }, + { + desc: "sample values will be rounded up", + ratio: .66666, + p: testProfile1.Copy(), + wantSamples: [][]int64{ + {667, 667}, + {67, 67}, + {7, 7}, + {6667, 6667}, + {1, 1}, + }, + }, + { + desc: "sample values will be rounded down", + ratio: .33333, + p: testProfile1.Copy(), + wantSamples: [][]int64{ + {333, 333}, + {33, 33}, + {3, 3}, + {3333, 3333}, + }, + }, + { + desc: "all sample values will be dropped", + ratio: 0.00001, + p: testProfile1.Copy(), + wantSamples: [][]int64{}, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + tc.p.Scale(tc.ratio) + if got, want := len(tc.p.Sample), len(tc.wantSamples); got != want { + t.Fatalf("got %d samples, want %d", got, want) + } + for i, s := range tc.p.Sample { + for j, got := range s.Value { + want := tc.wantSamples[i][j] + if want != got { + t.Errorf("For value %d of sample %d, got %d want %d", j, i, got, want) + } + } + } + }) + } +} + +// TestMergeMain tests merge leaves the main binary in place. +func TestMergeMain(t *testing.T) { + prof := testProfile1.Copy() + p1, err := Merge([]*Profile{prof}) + if err != nil { + t.Fatalf("merge error: %v", err) + } + if cpuM[0].File != p1.Mapping[0].File { + t.Errorf("want Mapping[0]=%s got %s", cpuM[0].File, p1.Mapping[0].File) + } +} + +func TestMerge(t *testing.T) { + // Aggregate a profile with itself and once again with a factor of + // -2. Should end up with an empty profile (all samples for a + // location should add up to 0). + + prof := testProfile1.Copy() + prof.Comments = []string{"comment1"} + p1, err := Merge([]*Profile{prof, prof}) + if err != nil { + t.Errorf("merge error: %v", err) + } + prof.Scale(-2) + prof, err = Merge([]*Profile{p1, prof}) + if err != nil { + t.Errorf("merge error: %v", err) + } + if got, want := len(prof.Comments), 1; got != want { + t.Errorf("len(prof.Comments) = %d, want %d", got, want) + } + + // Use aggregation to merge locations at function granularity. + if err := prof.Aggregate(false, true, false, false, false, false); err != nil { + t.Errorf("aggregating after merge: %v", err) + } + + samples := make(map[string]int64) + for _, s := range prof.Sample { + tb := locationHash(s) + samples[tb] = samples[tb] + s.Value[0] + } + for s, v := range samples { + if v != 0 { + t.Errorf("nonzero value for sample %s: %d", s, v) + } + } +} + +func TestMergeAll(t *testing.T) { + // Aggregate 10 copies of the profile. + profs := make([]*Profile, 10) + for i := 0; i < 10; i++ { + profs[i] = testProfile1.Copy() + } + prof, err := Merge(profs) + if err != nil { + t.Errorf("merge error: %v", err) + } + samples := make(map[string]int64) + for _, s := range prof.Sample { + tb := locationHash(s) + samples[tb] = samples[tb] + s.Value[0] + } + for _, s := range testProfile1.Sample { + tb := locationHash(s) + if samples[tb] != s.Value[0]*10 { + t.Errorf("merge got wrong value at %s : %d instead of %d", tb, samples[tb], s.Value[0]*10) + } + } +} + +func TestIsFoldedMerge(t *testing.T) { + testProfile1Folded := testProfile1.Copy() + testProfile1Folded.Location[0].IsFolded = true + testProfile1Folded.Location[1].IsFolded = true + + for _, tc := range []struct { + name string + profs []*Profile + wantLocationLen int + }{ + { + name: "folded and non-folded locations not merged", + profs: []*Profile{testProfile1.Copy(), testProfile1Folded.Copy()}, + wantLocationLen: 7, + }, + { + name: "identical folded locations are merged", + profs: []*Profile{testProfile1Folded.Copy(), testProfile1Folded.Copy()}, + wantLocationLen: 5, + }, + } { + t.Run(tc.name, func(t *testing.T) { + prof, err := Merge(tc.profs) + if err != nil { + t.Fatalf("merge error: %v", err) + } + if got, want := len(prof.Location), tc.wantLocationLen; got != want { + t.Fatalf("got %d locations, want %d locations", got, want) + } + }) + } +} + +func TestNumLabelMerge(t *testing.T) { + for _, tc := range []struct { + name string + profs []*Profile + wantNumLabels []map[string][]int64 + wantNumUnits []map[string][]string + }{ + { + name: "different label units not merged", + profs: []*Profile{testProfile4.Copy(), testProfile5.Copy()}, + wantNumLabels: []map[string][]int64{ + { + "key1": {10}, + "key2": {30}, + }, + { + "key1": {10}, + "key2": {30}, + }, + }, + wantNumUnits: []map[string][]string{ + { + "key1": {"bytes"}, + "key2": {"bytes"}, + }, + { + "key1": {"kilobytes"}, + "key2": {"kilobytes"}, + }, + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + prof, err := Merge(tc.profs) + if err != nil { + t.Errorf("merge error: %v", err) + } + + if want, got := len(tc.wantNumLabels), len(prof.Sample); want != got { + t.Fatalf("got %d samples, want %d samples", got, want) + } + for i, wantLabels := range tc.wantNumLabels { + numLabels := prof.Sample[i].NumLabel + if !reflect.DeepEqual(wantLabels, numLabels) { + t.Errorf("got numeric labels %v, want %v", numLabels, wantLabels) + } + + wantUnits := tc.wantNumUnits[i] + numUnits := prof.Sample[i].NumUnit + if !reflect.DeepEqual(wantUnits, numUnits) { + t.Errorf("got numeric labels %v, want %v", numUnits, wantUnits) + } + } + }) + } +} + +func TestEmptyMappingMerge(t *testing.T) { + // Aggregate a profile with itself and once again with a factor of + // -2. Should end up with an empty profile (all samples for a + // location should add up to 0). + + prof1 := testProfile1.Copy() + prof2 := testProfile1NoMapping.Copy() + p1, err := Merge([]*Profile{prof2, prof1}) + if err != nil { + t.Errorf("merge error: %v", err) + } + prof2.Scale(-2) + prof, err := Merge([]*Profile{p1, prof2}) + if err != nil { + t.Errorf("merge error: %v", err) + } + + // Use aggregation to merge locations at function granularity. + if err := prof.Aggregate(false, true, false, false, false, false); err != nil { + t.Errorf("aggregating after merge: %v", err) + } + + samples := make(map[string]int64) + for _, s := range prof.Sample { + tb := locationHash(s) + samples[tb] = samples[tb] + s.Value[0] + } + for s, v := range samples { + if v != 0 { + t.Errorf("nonzero value for sample %s: %d", s, v) + } + } +} + +func TestNormalizeBySameProfile(t *testing.T) { + pb := testProfile1.Copy() + p := testProfile1.Copy() + + if err := p.Normalize(pb); err != nil { + t.Fatal(err) + } + + for i, s := range p.Sample { + for j, v := range s.Value { + expectedSampleValue := testProfile1.Sample[i].Value[j] + if v != expectedSampleValue { + t.Errorf("For sample %d, value %d want %d got %d", i, j, expectedSampleValue, v) + } + } + } +} + +func TestNormalizeByDifferentProfile(t *testing.T) { + p := testProfile1.Copy() + pb := testProfile2.Copy() + + if err := p.Normalize(pb); err != nil { + t.Fatal(err) + } + + expectedSampleValues := [][]int64{ + {20, 1000}, + {2, 100}, + {199, 10000}, + {0, 1}, + } + + for i, s := range p.Sample { + for j, v := range s.Value { + if v != expectedSampleValues[i][j] { + t.Errorf("For sample %d, value %d want %d got %d", i, j, expectedSampleValues[i][j], v) + } + } + } +} + +func TestNormalizeByMultipleOfSameProfile(t *testing.T) { + pb := testProfile1.Copy() + for i, s := range pb.Sample { + for j, v := range s.Value { + pb.Sample[i].Value[j] = 10 * v + } + } + + p := testProfile1.Copy() + + err := p.Normalize(pb) + if err != nil { + t.Fatal(err) + } + + for i, s := range p.Sample { + for j, v := range s.Value { + expectedSampleValue := 10 * testProfile1.Sample[i].Value[j] + if v != expectedSampleValue { + t.Errorf("For sample %d, value %d, want %d got %d", i, j, expectedSampleValue, v) + } + } + } +} + +func TestNormalizeIncompatibleProfiles(t *testing.T) { + p := testProfile1.Copy() + pb := testProfile3.Copy() + + if err := p.Normalize(pb); err == nil { + t.Errorf("Expected an error") + } +} + +// locationHash constructs a string to use as a hashkey for a sample, based on its locations +func locationHash(s *Sample) string { + var tb string + for _, l := range s.Location { + for _, ln := range l.Line { + tb = tb + fmt.Sprintf("%s:%d:%d@%d ", ln.Function.Name, ln.Line, ln.Column, l.Address) + } + } + return tb +} + +func TestHasLabel(t *testing.T) { + var testcases = []struct { + desc string + labels map[string][]string + key string + value string + wantHasLabel bool + }{ + { + desc: "empty label does not have label", + labels: map[string][]string{}, + key: "key", + value: "value", + wantHasLabel: false, + }, + { + desc: "label with one key and value has label", + labels: map[string][]string{"key": {"value"}}, + key: "key", + value: "value", + wantHasLabel: true, + }, + { + desc: "label with one key and value does not have label", + labels: map[string][]string{"key": {"value"}}, + key: "key1", + value: "value1", + wantHasLabel: false, + }, + { + desc: "label with many keys and values has label", + labels: map[string][]string{ + "key1": {"value2", "value1"}, + "key2": {"value1", "value2", "value2"}, + "key3": {"value1", "value2", "value2"}, + }, + key: "key1", + value: "value1", + wantHasLabel: true, + }, + { + desc: "label with many keys and values does not have label", + labels: map[string][]string{ + "key1": {"value2", "value1"}, + "key2": {"value1", "value2", "value2"}, + "key3": {"value1", "value2", "value2"}, + }, + key: "key5", + value: "value5", + wantHasLabel: false, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + sample := &Sample{ + Label: tc.labels, + } + if gotHasLabel := sample.HasLabel(tc.key, tc.value); gotHasLabel != tc.wantHasLabel { + t.Errorf("sample.HasLabel(%q, %q) got %v, want %v", tc.key, tc.value, gotHasLabel, tc.wantHasLabel) + } + }) + } +} + +func TestDiffBaseSample(t *testing.T) { + var testcases = []struct { + desc string + labels map[string][]string + wantDiffBaseSample bool + }{ + { + desc: "empty label does not have label", + labels: map[string][]string{}, + wantDiffBaseSample: false, + }, + { + desc: "label with one key and value, including diff base label", + labels: map[string][]string{"pprof::base": {"true"}}, + wantDiffBaseSample: true, + }, + { + desc: "label with one key and value, not including diff base label", + labels: map[string][]string{"key": {"value"}}, + wantDiffBaseSample: false, + }, + { + desc: "label with many keys and values, including diff base label", + labels: map[string][]string{ + "pprof::base": {"value2", "true"}, + "key2": {"true", "value2", "value2"}, + "key3": {"true", "value2", "value2"}, + }, + wantDiffBaseSample: true, + }, + { + desc: "label with many keys and values, not including diff base label", + labels: map[string][]string{ + "key1": {"value2", "value1"}, + "key2": {"value1", "value2", "value2"}, + "key3": {"value1", "value2", "value2"}, + }, + wantDiffBaseSample: false, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + sample := &Sample{ + Label: tc.labels, + } + if gotHasLabel := sample.DiffBaseSample(); gotHasLabel != tc.wantDiffBaseSample { + t.Errorf("sample.DiffBaseSample() got %v, want %v", gotHasLabel, tc.wantDiffBaseSample) + } + }) + } +} + +func TestRemove(t *testing.T) { + var testcases = []struct { + desc string + samples []*Sample + removeKey string + wantLabels []map[string][]string + }{ + { + desc: "some samples have label already", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"value1", "value2", "value3"}, + "key2": {"value1"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"value2"}, + }, + }, + }, + removeKey: "key1", + wantLabels: []map[string][]string{ + {}, + {"key2": {"value1"}}, + {}, + }, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + profile := testProfile1.Copy() + profile.Sample = tc.samples + profile.RemoveLabel(tc.removeKey) + if got, want := len(profile.Sample), len(tc.wantLabels); got != want { + t.Fatalf("got %v samples, want %v samples", got, want) + } + for i, sample := range profile.Sample { + wantLabels := tc.wantLabels[i] + if got, want := len(sample.Label), len(wantLabels); got != want { + t.Errorf("got %v label keys for sample %v, want %v", got, i, want) + continue + } + for wantKey, wantValues := range wantLabels { + if gotValues, ok := sample.Label[wantKey]; ok { + if !reflect.DeepEqual(gotValues, wantValues) { + t.Errorf("for key %s, got values %v, want values %v", wantKey, gotValues, wantValues) + } + } else { + t.Errorf("for key %s got no values, want %v", wantKey, wantValues) + } + } + } + }) + } +} + +func TestSetLabel(t *testing.T) { + var testcases = []struct { + desc string + samples []*Sample + setKey string + setVal []string + wantLabels []map[string][]string + }{ + { + desc: "some samples have label already", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"value1", "value2", "value3"}, + "key2": {"value1"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"value2"}, + }, + }, + }, + setKey: "key1", + setVal: []string{"value1"}, + wantLabels: []map[string][]string{ + {"key1": {"value1"}}, + {"key1": {"value1"}, "key2": {"value1"}}, + {"key1": {"value1"}}, + }, + }, + { + desc: "no samples have labels", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + }, + setKey: "key1", + setVal: []string{"value1"}, + wantLabels: []map[string][]string{ + {"key1": {"value1"}}, + }, + }, + { + desc: "all samples have some labels, but not key being added", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key2": {"value2"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key3": {"value3"}, + }, + }, + }, + setKey: "key1", + setVal: []string{"value1"}, + wantLabels: []map[string][]string{ + {"key1": {"value1"}, "key2": {"value2"}}, + {"key1": {"value1"}, "key3": {"value3"}}, + }, + }, + { + desc: "all samples have key being added", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"value1"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + Label: map[string][]string{ + "key1": {"value1"}, + }, + }, + }, + setKey: "key1", + setVal: []string{"value1"}, + wantLabels: []map[string][]string{ + {"key1": {"value1"}}, + {"key1": {"value1"}}, + }, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + profile := testProfile1.Copy() + profile.Sample = tc.samples + profile.SetLabel(tc.setKey, tc.setVal) + if got, want := len(profile.Sample), len(tc.wantLabels); got != want { + t.Fatalf("got %v samples, want %v samples", got, want) + } + for i, sample := range profile.Sample { + wantLabels := tc.wantLabels[i] + if got, want := len(sample.Label), len(wantLabels); got != want { + t.Errorf("got %v label keys for sample %v, want %v", got, i, want) + continue + } + for wantKey, wantValues := range wantLabels { + if gotValues, ok := sample.Label[wantKey]; ok { + if !reflect.DeepEqual(gotValues, wantValues) { + t.Errorf("for key %s, got values %v, want values %v", wantKey, gotValues, wantValues) + } + } else { + t.Errorf("for key %s got no values, want %v", wantKey, wantValues) + } + } + } + }) + } +} + +func TestSetNumLabel(t *testing.T) { + var testcases = []struct { + desc string + samples []*Sample + setKey string + setVal []int64 + setUnit []string + wantValues []map[string][]int64 + wantUnits []map[string][]string + }{ + { + desc: "some samples have label already", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {1, 2, 3}, + "key2": {1}, + }, + NumUnit: map[string][]string{ + "key1": {"bytes", "bytes", "bytes"}, + "key2": {"gallons"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {2}, + }, + NumUnit: map[string][]string{ + "key1": {"volts"}, + }, + }, + }, + setKey: "key1", + setVal: []int64{1}, + setUnit: []string{"bytes"}, + wantValues: []map[string][]int64{ + {"key1": {1}}, + {"key1": {1}, "key2": {1}}, + {"key1": {1}}, + }, + wantUnits: []map[string][]string{ + {"key1": {"bytes"}}, + {"key1": {"bytes"}, "key2": {"gallons"}}, + {"key1": {"bytes"}}, + }, + }, + { + desc: "no samples have labels", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + }, + setKey: "key1", + setVal: []int64{1}, + setUnit: []string{"bytes"}, + wantValues: []map[string][]int64{ + {"key1": {1}}, + }, + wantUnits: []map[string][]string{ + {"key1": {"bytes"}}, + }, + }, + { + desc: "all samples have some labels, but not key being added", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key2": {2}, + }, + NumUnit: map[string][]string{ + "key2": {"joules"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key3": {3}, + }, + NumUnit: map[string][]string{ + "key3": {"meters"}, + }, + }, + }, + setKey: "key1", + setVal: []int64{1}, + setUnit: []string{"seconds"}, + wantValues: []map[string][]int64{ + {"key1": {1}, "key2": {2}}, + {"key1": {1}, "key3": {3}}, + }, + wantUnits: []map[string][]string{ + {"key1": {"seconds"}, "key2": {"joules"}}, + {"key1": {"seconds"}, "key3": {"meters"}}, + }, + }, + { + desc: "all samples have key being added", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {1}, + }, + NumUnit: map[string][]string{ + "key1": {"exabytes"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {1}, + }, + NumUnit: map[string][]string{ + "key1": {"petabytes"}, + }, + }, + }, + setKey: "key1", + setVal: []int64{1, 2}, + setUnit: []string{"daltons", ""}, + wantValues: []map[string][]int64{ + {"key1": {1, 2}}, + {"key1": {1, 2}}, + }, + wantUnits: []map[string][]string{ + {"key1": {"daltons", ""}}, + {"key1": {"daltons", ""}}, + }, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + profile := testProfile1.Copy() + profile.Sample = tc.samples + profile.SetNumLabel(tc.setKey, tc.setVal, tc.setUnit) + if got, want := len(profile.Sample), len(tc.wantValues); got != want { + t.Fatalf("got %v samples, want %v samples", got, want) + } + if got, want := len(profile.Sample), len(tc.wantUnits); got != want { + t.Fatalf("got %v samples, want %v samples", got, want) + } + for i, sample := range profile.Sample { + wantValues := tc.wantValues[i] + if got, want := len(sample.NumLabel), len(wantValues); got != want { + t.Errorf("got %v label values for sample %v, want %v", got, i, want) + continue + } + for key, values := range wantValues { + if gotValues, ok := sample.NumLabel[key]; ok { + if !reflect.DeepEqual(gotValues, values) { + t.Errorf("for key %s, got values %v, want values %v", key, gotValues, values) + } + } else { + t.Errorf("for key %s got no values, want %v", key, values) + } + } + + wantUnits := tc.wantUnits[i] + if got, want := len(sample.NumUnit), len(wantUnits); got != want { + t.Errorf("got %v label units for sample %v, want %v", got, i, want) + continue + } + for key, units := range wantUnits { + if gotUnits, ok := sample.NumUnit[key]; ok { + if !reflect.DeepEqual(gotUnits, units) { + t.Errorf("for key %s, got units %v, want units %v", key, gotUnits, units) + } + } else { + t.Errorf("for key %s got no units, want %v", key, units) + } + } + } + }) + } +} + +func TestRemoveNumLabel(t *testing.T) { + var testcases = []struct { + desc string + samples []*Sample + removeKey string + wantValues []map[string][]int64 + wantUnits []map[string][]string + }{ + { + desc: "some samples have label already", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {1, 2, 3}, + "key2": {1}, + }, + NumUnit: map[string][]string{ + "key1": {"foo", "bar", "baz"}, + "key2": {"seconds"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key1": {2}, + }, + NumUnit: map[string][]string{ + "key1": {"seconds"}, + }, + }, + }, + removeKey: "key1", + wantValues: []map[string][]int64{ + {}, + {"key2": {1}}, + {}, + }, + wantUnits: []map[string][]string{ + {}, + {"key2": {"seconds"}}, + {}, + }, + }, + { + desc: "no samples have label", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + }, + }, + removeKey: "key1", + wantValues: []map[string][]int64{ + {}, + }, + wantUnits: []map[string][]string{ + {}, + }, + }, + { + desc: "all samples have some labels, but not key being removed", + samples: []*Sample{ + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key2": {2}, + }, + NumUnit: map[string][]string{ + "key2": {"terabytes"}, + }, + }, + { + Location: []*Location{cpuL[0]}, + Value: []int64{1000}, + NumLabel: map[string][]int64{ + "key3": {3}, + }, + NumUnit: map[string][]string{ + "key3": {""}, + }, + }, + }, + removeKey: "key1", + wantValues: []map[string][]int64{ + {"key2": {2}}, + {"key3": {3}}, + }, + wantUnits: []map[string][]string{ + {"key2": {"terabytes"}}, + {"key3": {""}}, + }, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + profile := testProfile1.Copy() + profile.Sample = tc.samples + profile.RemoveNumLabel(tc.removeKey) + if got, want := len(profile.Sample), len(tc.wantValues); got != want { + t.Fatalf("got %v samples, want %v values", got, want) + } + if got, want := len(profile.Sample), len(tc.wantUnits); got != want { + t.Fatalf("got %v samples, want %v units", got, want) + } + for i, sample := range profile.Sample { + wantValues := tc.wantValues[i] + if got, want := len(sample.NumLabel), len(wantValues); got != want { + t.Errorf("got %v label values for sample %v, want %v", got, i, want) + continue + } + for key, values := range wantValues { + if gotValues, ok := sample.NumLabel[key]; ok { + if !reflect.DeepEqual(gotValues, values) { + t.Errorf("for key %s, got values %v, want values %v", key, gotValues, values) + } + } else { + t.Errorf("for key %s got no values, want %v", key, values) + } + } + wantUnits := tc.wantUnits[i] + if got, want := len(sample.NumLabel), len(wantUnits); got != want { + t.Errorf("got %v label values for sample %v, want %v", got, i, want) + continue + } + for key, units := range wantUnits { + if gotUnits, ok := sample.NumUnit[key]; ok { + if !reflect.DeepEqual(gotUnits, units) { + t.Errorf("for key %s, got units %v, want units %v", key, gotUnits, units) + } + } else { + t.Errorf("for key %s got no units, want %v", key, units) + } + } + } + }) + } +} + +func TestNumLabelUnits(t *testing.T) { + var tagFilterTests = []struct { + desc string + tagVals []map[string][]int64 + tagUnits []map[string][]string + wantUnits map[string]string + wantIgnoredUnits map[string][]string + }{ + { + "One sample, multiple keys, different specified units", + []map[string][]int64{{"key1": {131072}, "key2": {128}}}, + []map[string][]string{{"key1": {"bytes"}, "key2": {"kilobytes"}}}, + map[string]string{"key1": "bytes", "key2": "kilobytes"}, + map[string][]string{}, + }, + { + "One sample, one key with one value, unit specified", + []map[string][]int64{{"key1": {8}}}, + []map[string][]string{{"key1": {"bytes"}}}, + map[string]string{"key1": "bytes"}, + map[string][]string{}, + }, + { + "One sample, one key with one value, empty unit specified", + []map[string][]int64{{"key1": {8}}}, + []map[string][]string{{"key1": {""}}}, + map[string]string{"key1": "key1"}, + map[string][]string{}, + }, + { + "Key bytes, unit not specified", + []map[string][]int64{{"bytes": {8}}}, + []map[string][]string{nil}, + map[string]string{"bytes": "bytes"}, + map[string][]string{}, + }, + { + "One sample, one key with one value, unit not specified", + []map[string][]int64{{"kilobytes": {8}}}, + []map[string][]string{nil}, + map[string]string{"kilobytes": "kilobytes"}, + map[string][]string{}, + }, + { + "Key request, unit not specified", + []map[string][]int64{{"request": {8}}}, + []map[string][]string{nil}, + map[string]string{"request": "bytes"}, + map[string][]string{}, + }, + { + "Key alignment, unit not specified", + []map[string][]int64{{"alignment": {8}}}, + []map[string][]string{nil}, + map[string]string{"alignment": "bytes"}, + map[string][]string{}, + }, + { + "One sample, one key with multiple values and two different units", + []map[string][]int64{{"key1": {8, 8}}}, + []map[string][]string{{"key1": {"bytes", "kilobytes"}}}, + map[string]string{"key1": "bytes"}, + map[string][]string{"key1": {"kilobytes"}}, + }, + { + "One sample, one key with multiple values and three different units", + []map[string][]int64{{"key1": {8, 8}}}, + []map[string][]string{{"key1": {"bytes", "megabytes", "kilobytes"}}}, + map[string]string{"key1": "bytes"}, + map[string][]string{"key1": {"kilobytes", "megabytes"}}, + }, + { + "Two samples, one key, different units specified", + []map[string][]int64{{"key1": {8}}, {"key1": {8}}}, + []map[string][]string{{"key1": {"bytes"}}, {"key1": {"kilobytes"}}}, + map[string]string{"key1": "bytes"}, + map[string][]string{"key1": {"kilobytes"}}, + }, + { + "Keys alignment, request, and bytes have units specified", + []map[string][]int64{{ + "alignment": {8}, + "request": {8}, + "bytes": {8}, + }}, + []map[string][]string{{ + "alignment": {"seconds"}, + "request": {"minutes"}, + "bytes": {"hours"}, + }}, + map[string]string{ + "alignment": "seconds", + "request": "minutes", + "bytes": "hours", + }, + map[string][]string{}, + }, + } + for _, test := range tagFilterTests { + p := &Profile{Sample: make([]*Sample, len(test.tagVals))} + for i, numLabel := range test.tagVals { + s := Sample{ + NumLabel: numLabel, + NumUnit: test.tagUnits[i], + } + p.Sample[i] = &s + } + units, ignoredUnits := p.NumLabelUnits() + if !reflect.DeepEqual(test.wantUnits, units) { + t.Errorf("%s: got %v units, want %v", test.desc, units, test.wantUnits) + } + if !reflect.DeepEqual(test.wantIgnoredUnits, ignoredUnits) { + t.Errorf("%s: got %v ignored units, want %v", test.desc, ignoredUnits, test.wantIgnoredUnits) + } + } +} + +func TestSetMain(t *testing.T) { + testProfile1.massageMappings() + if testProfile1.Mapping[0].File != mainBinary { + t.Errorf("got %s for main", testProfile1.Mapping[0].File) + } +} + +func TestParseKernelRelocation(t *testing.T) { + src := testProfile1.Copy() + if src.Mapping[len(src.Mapping)-1].KernelRelocationSymbol != "_text" { + t.Errorf("got %s for Mapping.KernelRelocationSymbol", src.Mapping[0].KernelRelocationSymbol) + } +} + +func TestEncodeDecodeDocURL(t *testing.T) { + input := testProfile1.Copy() + input.DocURL = "http://example.comp/url" + + // Encode/decode. + var buf bytes.Buffer + if err := input.Write(&buf); err != nil { + t.Fatal("encode: ", err) + } + output, err := Parse(&buf) + if err != nil { + t.Fatal("decode: ", err) + } + if want, got := input.String(), output.String(); want != got { + d, err := proftest.Diff([]byte(want), []byte(got)) + if err != nil { + t.Fatal(err) + } + t.Errorf("wrong result of encode/decode (-want,+got):\n%s\n", string(d)) + } +} + +// parallel runs n copies of fn in parallel. +func parallel(n int, fn func()) { + var wg sync.WaitGroup + wg.Add(n) + for i := 0; i < n; i++ { + go func() { + fn() + wg.Done() + }() + } + wg.Wait() +} + +func TestThreadSafety(t *testing.T) { + src := testProfile1.Copy() + parallel(4, func() { src.Copy() }) + parallel(4, func() { + var b bytes.Buffer + src.WriteUncompressed(&b) + }) + parallel(4, func() { + var b bytes.Buffer + src.Write(&b) + }) +} + +func BenchmarkParse(b *testing.B) { + data := proftest.LargeProfile(b) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := Parse(bytes.NewBuffer(data)) + if err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkWrite(b *testing.B) { + p, err := Parse(bytes.NewBuffer(proftest.LargeProfile(b))) + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + if err := p.WriteUncompressed(io.Discard); err != nil { + b.Fatal(err) + } + } +} diff --git a/plugin/debug/pkg/profile/proto.go b/plugin/debug/pkg/profile/proto.go new file mode 100644 index 00000000..a15696ba --- /dev/null +++ b/plugin/debug/pkg/profile/proto.go @@ -0,0 +1,367 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file is a simple protocol buffer encoder and decoder. +// The format is described at +// https://developers.google.com/protocol-buffers/docs/encoding +// +// A protocol message must implement the message interface: +// decoder() []decoder +// encode(*buffer) +// +// The decode method returns a slice indexed by field number that gives the +// function to decode that field. +// The encode method encodes its receiver into the given buffer. +// +// The two methods are simple enough to be implemented by hand rather than +// by using a protocol compiler. +// +// See profile.go for examples of messages implementing this interface. +// +// There is no support for groups, message sets, or "has" bits. + +package profile + +import ( + "errors" + "fmt" +) + +type buffer struct { + field int // field tag + typ int // proto wire type code for field + u64 uint64 + data []byte + tmp [16]byte + tmpLines []Line // temporary storage used while decoding "repeated Line". +} + +type decoder func(*buffer, message) error + +type message interface { + decoder() []decoder + encode(*buffer) +} + +func marshal(m message) []byte { + var b buffer + m.encode(&b) + return b.data +} + +func encodeVarint(b *buffer, x uint64) { + for x >= 128 { + b.data = append(b.data, byte(x)|0x80) + x >>= 7 + } + b.data = append(b.data, byte(x)) +} + +func encodeLength(b *buffer, tag int, len int) { + encodeVarint(b, uint64(tag)<<3|2) + encodeVarint(b, uint64(len)) +} + +func encodeUint64(b *buffer, tag int, x uint64) { + // append varint to b.data + encodeVarint(b, uint64(tag)<<3) + encodeVarint(b, x) +} + +func encodeUint64s(b *buffer, tag int, x []uint64) { + if len(x) > 2 { + // Use packed encoding + n1 := len(b.data) + for _, u := range x { + encodeVarint(b, u) + } + n2 := len(b.data) + encodeLength(b, tag, n2-n1) + n3 := len(b.data) + copy(b.tmp[:], b.data[n2:n3]) + copy(b.data[n1+(n3-n2):], b.data[n1:n2]) + copy(b.data[n1:], b.tmp[:n3-n2]) + return + } + for _, u := range x { + encodeUint64(b, tag, u) + } +} + +func encodeUint64Opt(b *buffer, tag int, x uint64) { + if x == 0 { + return + } + encodeUint64(b, tag, x) +} + +func encodeInt64(b *buffer, tag int, x int64) { + u := uint64(x) + encodeUint64(b, tag, u) +} + +func encodeInt64s(b *buffer, tag int, x []int64) { + if len(x) > 2 { + // Use packed encoding + n1 := len(b.data) + for _, u := range x { + encodeVarint(b, uint64(u)) + } + n2 := len(b.data) + encodeLength(b, tag, n2-n1) + n3 := len(b.data) + copy(b.tmp[:], b.data[n2:n3]) + copy(b.data[n1+(n3-n2):], b.data[n1:n2]) + copy(b.data[n1:], b.tmp[:n3-n2]) + return + } + for _, u := range x { + encodeInt64(b, tag, u) + } +} + +func encodeInt64Opt(b *buffer, tag int, x int64) { + if x == 0 { + return + } + encodeInt64(b, tag, x) +} + +func encodeString(b *buffer, tag int, x string) { + encodeLength(b, tag, len(x)) + b.data = append(b.data, x...) +} + +func encodeStrings(b *buffer, tag int, x []string) { + for _, s := range x { + encodeString(b, tag, s) + } +} + +func encodeBool(b *buffer, tag int, x bool) { + if x { + encodeUint64(b, tag, 1) + } else { + encodeUint64(b, tag, 0) + } +} + +func encodeBoolOpt(b *buffer, tag int, x bool) { + if x { + encodeBool(b, tag, x) + } +} + +func encodeMessage(b *buffer, tag int, m message) { + n1 := len(b.data) + m.encode(b) + n2 := len(b.data) + encodeLength(b, tag, n2-n1) + n3 := len(b.data) + copy(b.tmp[:], b.data[n2:n3]) + copy(b.data[n1+(n3-n2):], b.data[n1:n2]) + copy(b.data[n1:], b.tmp[:n3-n2]) +} + +func unmarshal(data []byte, m message) (err error) { + b := buffer{data: data, typ: 2} + return decodeMessage(&b, m) +} + +func le64(p []byte) uint64 { + return uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 | uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56 +} + +func le32(p []byte) uint32 { + return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 +} + +func decodeVarint(data []byte) (uint64, []byte, error) { + var u uint64 + for i := 0; ; i++ { + if i >= 10 || i >= len(data) { + return 0, nil, errors.New("bad varint") + } + u |= uint64(data[i]&0x7F) << uint(7*i) + if data[i]&0x80 == 0 { + return u, data[i+1:], nil + } + } +} + +func decodeField(b *buffer, data []byte) ([]byte, error) { + x, data, err := decodeVarint(data) + if err != nil { + return nil, err + } + b.field = int(x >> 3) + b.typ = int(x & 7) + b.data = nil + b.u64 = 0 + switch b.typ { + case 0: + b.u64, data, err = decodeVarint(data) + if err != nil { + return nil, err + } + case 1: + if len(data) < 8 { + return nil, errors.New("not enough data") + } + b.u64 = le64(data[:8]) + data = data[8:] + case 2: + var n uint64 + n, data, err = decodeVarint(data) + if err != nil { + return nil, err + } + if n > uint64(len(data)) { + return nil, errors.New("too much data") + } + b.data = data[:n] + data = data[n:] + case 5: + if len(data) < 4 { + return nil, errors.New("not enough data") + } + b.u64 = uint64(le32(data[:4])) + data = data[4:] + default: + return nil, fmt.Errorf("unknown wire type: %d", b.typ) + } + + return data, nil +} + +func checkType(b *buffer, typ int) error { + if b.typ != typ { + return errors.New("type mismatch") + } + return nil +} + +func decodeMessage(b *buffer, m message) error { + if err := checkType(b, 2); err != nil { + return err + } + dec := m.decoder() + data := b.data + for len(data) > 0 { + // pull varint field# + type + var err error + data, err = decodeField(b, data) + if err != nil { + return err + } + if b.field >= len(dec) || dec[b.field] == nil { + continue + } + if err := dec[b.field](b, m); err != nil { + return err + } + } + return nil +} + +func decodeInt64(b *buffer, x *int64) error { + if err := checkType(b, 0); err != nil { + return err + } + *x = int64(b.u64) + return nil +} + +func decodeInt64s(b *buffer, x *[]int64) error { + if b.typ == 2 { + // Packed encoding + data := b.data + for len(data) > 0 { + var u uint64 + var err error + + if u, data, err = decodeVarint(data); err != nil { + return err + } + *x = append(*x, int64(u)) + } + return nil + } + var i int64 + if err := decodeInt64(b, &i); err != nil { + return err + } + *x = append(*x, i) + return nil +} + +func decodeUint64(b *buffer, x *uint64) error { + if err := checkType(b, 0); err != nil { + return err + } + *x = b.u64 + return nil +} + +func decodeUint64s(b *buffer, x *[]uint64) error { + if b.typ == 2 { + data := b.data + // Packed encoding + for len(data) > 0 { + var u uint64 + var err error + + if u, data, err = decodeVarint(data); err != nil { + return err + } + *x = append(*x, u) + } + return nil + } + var u uint64 + if err := decodeUint64(b, &u); err != nil { + return err + } + *x = append(*x, u) + return nil +} + +func decodeString(b *buffer, x *string) error { + if err := checkType(b, 2); err != nil { + return err + } + *x = string(b.data) + return nil +} + +func decodeStrings(b *buffer, x *[]string) error { + var s string + if err := decodeString(b, &s); err != nil { + return err + } + *x = append(*x, s) + return nil +} + +func decodeBool(b *buffer, x *bool) error { + if err := checkType(b, 0); err != nil { + return err + } + if int64(b.u64) == 0 { + *x = false + } else { + *x = true + } + return nil +} diff --git a/plugin/debug/pkg/profile/proto_test.go b/plugin/debug/pkg/profile/proto_test.go new file mode 100644 index 00000000..8ab9eef3 --- /dev/null +++ b/plugin/debug/pkg/profile/proto_test.go @@ -0,0 +1,181 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "bytes" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/proftest" +) + +var testM = []*Mapping{ + { + ID: 1, + Start: 1, + Limit: 10, + Offset: 0, + File: "file1", + BuildID: "buildid1", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, + { + ID: 2, + Start: 10, + Limit: 30, + Offset: 9, + File: "file1", + BuildID: "buildid2", + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, +} + +var testF = []*Function{ + {ID: 1, Name: "func1", SystemName: "func1", Filename: "file1"}, + {ID: 2, Name: "func2", SystemName: "func2", Filename: "file1"}, + {ID: 3, Name: "func3", SystemName: "func3", Filename: "file2"}, + {ID: 4, Name: "func4", SystemName: "func4", Filename: "file3"}, + {ID: 5, Name: "func5", SystemName: "func5", Filename: "file4"}, +} + +var testL = []*Location{ + { + ID: 1, + Address: 1, + Mapping: testM[0], + Line: []Line{ + { + Function: testF[0], + Line: 2, + }, + { + Function: testF[1], + Line: 2222222, + }, + }, + }, + { + ID: 2, + Mapping: testM[1], + Address: 11, + Line: []Line{ + { + Function: testF[2], + Line: 2, + }, + }, + }, + { + ID: 3, + Mapping: testM[1], + Address: 12, + }, + { + ID: 4, + Mapping: testM[1], + Address: 12, + Line: []Line{ + { + Function: testF[4], + Line: 6, + }, + { + Function: testF[4], + Line: 6, + }, + }, + IsFolded: true, + }, +} + +var all = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 10, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "cpu", Unit: "cycles"}, + {Type: "object", Unit: "count"}, + }, + Sample: []*Sample{ + { + Location: []*Location{testL[0], testL[1], testL[2], testL[1], testL[1]}, + Label: map[string][]string{ + "key1": {"value1"}, + "key2": {"value2"}, + }, + Value: []int64{10, 20}, + }, + { + Location: []*Location{testL[1], testL[2], testL[0], testL[1]}, + Value: []int64{30, 40}, + Label: map[string][]string{ + "key1": {"value1"}, + "key2": {"value2"}, + }, + NumLabel: map[string][]int64{ + "key1": {1, 2}, + "key2": {3, 4}, + "bytes": {3, 4}, + "requests": {1, 1, 3, 4, 5}, + "alignment": {3, 4}, + }, + NumUnit: map[string][]string{ + "requests": {"", "", "seconds", "", "s"}, + "alignment": {"kilobytes", "kilobytes"}, + }, + }, + { + Location: []*Location{testL[1], testL[2], testL[0], testL[1]}, + Value: []int64{30, 40}, + NumLabel: map[string][]int64{ + "size": {0}, + }, + NumUnit: map[string][]string{ + "size": {"bytes"}, + }, + }, + }, + Function: testF, + Mapping: testM, + Location: testL, + Comments: []string{"Comment 1", "Comment 2"}, +} + +func TestMarshalUnmarshal(t *testing.T) { + // Write the profile, parse it, and ensure they're equal. + var buf bytes.Buffer + all.Write(&buf) + all2, err := Parse(&buf) + if err != nil { + t.Fatal(err) + } + + js1 := proftest.EncodeJSON(&all) + js2 := proftest.EncodeJSON(&all2) + if string(js1) != string(js2) { + t.Errorf("profiles differ") + d, err := proftest.Diff(js1, js2) + if err != nil { + t.Fatal(err) + } + t.Error("\n" + string(d)) + } +} diff --git a/plugin/debug/pkg/profile/prune.go b/plugin/debug/pkg/profile/prune.go new file mode 100644 index 00000000..b2f9fd54 --- /dev/null +++ b/plugin/debug/pkg/profile/prune.go @@ -0,0 +1,194 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements methods to remove frames from profiles. + +package profile + +import ( + "fmt" + "regexp" + "strings" +) + +var ( + reservedNames = []string{"(anonymous namespace)", "operator()"} + bracketRx = func() *regexp.Regexp { + var quotedNames []string + for _, name := range append(reservedNames, "(") { + quotedNames = append(quotedNames, regexp.QuoteMeta(name)) + } + return regexp.MustCompile(strings.Join(quotedNames, "|")) + }() +) + +// simplifyFunc does some primitive simplification of function names. +func simplifyFunc(f string) string { + // Account for leading '.' on the PPC ELF v1 ABI. + funcName := strings.TrimPrefix(f, ".") + // Account for unsimplified names -- try to remove the argument list by trimming + // starting from the first '(', but skipping reserved names that have '('. + for _, ind := range bracketRx.FindAllStringSubmatchIndex(funcName, -1) { + foundReserved := false + for _, res := range reservedNames { + if funcName[ind[0]:ind[1]] == res { + foundReserved = true + break + } + } + if !foundReserved { + funcName = funcName[:ind[0]] + break + } + } + return funcName +} + +// Prune removes all nodes beneath a node matching dropRx, and not +// matching keepRx. If the root node of a Sample matches, the sample +// will have an empty stack. +func (p *Profile) Prune(dropRx, keepRx *regexp.Regexp) { + prune := make(map[uint64]bool) + pruneBeneath := make(map[uint64]bool) + + // simplifyFunc can be expensive, so cache results. + // Note that the same function name can be encountered many times due + // different lines and addresses in the same function. + pruneCache := map[string]bool{} // Map from function to whether or not to prune + pruneFromHere := func(s string) bool { + if r, ok := pruneCache[s]; ok { + return r + } + funcName := simplifyFunc(s) + if dropRx.MatchString(funcName) { + if keepRx == nil || !keepRx.MatchString(funcName) { + pruneCache[s] = true + return true + } + } + pruneCache[s] = false + return false + } + + for _, loc := range p.Location { + var i int + for i = len(loc.Line) - 1; i >= 0; i-- { + if fn := loc.Line[i].Function; fn != nil && fn.Name != "" { + if pruneFromHere(fn.Name) { + break + } + } + } + + if i >= 0 { + // Found matching entry to prune. + pruneBeneath[loc.ID] = true + + // Remove the matching location. + if i == len(loc.Line)-1 { + // Matched the top entry: prune the whole location. + prune[loc.ID] = true + } else { + loc.Line = loc.Line[i+1:] + } + } + } + + // Prune locs from each Sample + for _, sample := range p.Sample { + // Scan from the root to the leaves to find the prune location. + // Do not prune frames before the first user frame, to avoid + // pruning everything. + foundUser := false + for i := len(sample.Location) - 1; i >= 0; i-- { + id := sample.Location[i].ID + if !prune[id] && !pruneBeneath[id] { + foundUser = true + continue + } + if !foundUser { + continue + } + if prune[id] { + sample.Location = sample.Location[i+1:] + break + } + if pruneBeneath[id] { + sample.Location = sample.Location[i:] + break + } + } + } +} + +// RemoveUninteresting prunes and elides profiles using built-in +// tables of uninteresting function names. +func (p *Profile) RemoveUninteresting() error { + var keep, drop *regexp.Regexp + var err error + + if p.DropFrames != "" { + if drop, err = regexp.Compile("^(" + p.DropFrames + ")$"); err != nil { + return fmt.Errorf("failed to compile regexp %s: %v", p.DropFrames, err) + } + if p.KeepFrames != "" { + if keep, err = regexp.Compile("^(" + p.KeepFrames + ")$"); err != nil { + return fmt.Errorf("failed to compile regexp %s: %v", p.KeepFrames, err) + } + } + p.Prune(drop, keep) + } + return nil +} + +// PruneFrom removes all nodes beneath the lowest node matching dropRx, not including itself. +// +// Please see the example below to understand this method as well as +// the difference from Prune method. +// +// A sample contains Location of [A,B,C,B,D] where D is the top frame and there's no inline. +// +// PruneFrom(A) returns [A,B,C,B,D] because there's no node beneath A. +// Prune(A, nil) returns [B,C,B,D] by removing A itself. +// +// PruneFrom(B) returns [B,C,B,D] by removing all nodes beneath the first B when scanning from the bottom. +// Prune(B, nil) returns [D] because a matching node is found by scanning from the root. +func (p *Profile) PruneFrom(dropRx *regexp.Regexp) { + pruneBeneath := make(map[uint64]bool) + + for _, loc := range p.Location { + for i := 0; i < len(loc.Line); i++ { + if fn := loc.Line[i].Function; fn != nil && fn.Name != "" { + funcName := simplifyFunc(fn.Name) + if dropRx.MatchString(funcName) { + // Found matching entry to prune. + pruneBeneath[loc.ID] = true + loc.Line = loc.Line[i:] + break + } + } + } + } + + // Prune locs from each Sample + for _, sample := range p.Sample { + // Scan from the bottom leaf to the root to find the prune location. + for i, loc := range sample.Location { + if pruneBeneath[loc.ID] { + sample.Location = sample.Location[i:] + break + } + } + } +} diff --git a/plugin/debug/pkg/profile/prune_test.go b/plugin/debug/pkg/profile/prune_test.go new file mode 100644 index 00000000..aaf76b99 --- /dev/null +++ b/plugin/debug/pkg/profile/prune_test.go @@ -0,0 +1,230 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "strings" + "testing" +) + +func TestPrune(t *testing.T) { + for _, test := range []struct { + in *Profile + want string + }{ + {in1, out1}, + {in2, out2}, + } { + in := test.in.Copy() + in.RemoveUninteresting() + if err := in.CheckValid(); err != nil { + t.Error(err) + } + w := strings.Split(test.want, "\n") + for i, g := range strings.Split(in.String(), "\n") { + if i >= len(w) { + t.Fatalf("got trailing %s", g) + } + if strings.TrimSpace(g) != strings.TrimSpace(w[i]) { + t.Fatalf(`%d: got: "%s" want:"%s"`, i, g, w[i]) + } + } + } +} + +var funs = []*Function{ + {ID: 1, Name: "main", SystemName: "main", Filename: "main.c"}, + {ID: 2, Name: "fun1", SystemName: "fun1", Filename: "fun.c"}, + {ID: 3, Name: "fun2", SystemName: "fun2", Filename: "fun.c"}, + {ID: 4, Name: "fun3", SystemName: "fun3", Filename: "fun.c"}, + {ID: 5, Name: "fun4", SystemName: "fun4", Filename: "fun.c"}, + {ID: 6, Name: "fun5", SystemName: "fun5", Filename: "fun.c"}, + {ID: 7, Name: "unsimplified_fun(int)", SystemName: "unsimplified_fun(int)", Filename: "fun.c"}, + {ID: 8, Name: "Foo::(anonymous namespace)::Test::Bar", SystemName: "Foo::(anonymous namespace)::Test::Bar", Filename: "fun.c"}, + {ID: 9, Name: "Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar)", SystemName: "Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar)", Filename: "fun.c"}, + {ID: 10, Name: "Foo::operator()(::Bar)", SystemName: "Foo::operator()(::Bar)", Filename: "fun.c"}, +} + +var locs1 = []*Location{ + { + ID: 1, + Line: []Line{ + {Function: funs[0], Line: 1, Column: 7}, + }, + }, + { + ID: 2, + Line: []Line{ + {Function: funs[1], Line: 2}, + {Function: funs[2], Line: 1}, + }, + }, + { + ID: 3, + Line: []Line{ + {Function: funs[3], Line: 2}, + {Function: funs[1], Line: 1, Column: 7}, + }, + }, + { + ID: 4, + Line: []Line{ + {Function: funs[3], Line: 2}, + {Function: funs[1], Line: 2}, + {Function: funs[5], Line: 2}, + }, + }, +} + +var in1 = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*Sample{ + { + Location: []*Location{locs1[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*Location{locs1[1], locs1[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*Location{locs1[2], locs1[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*Location{locs1[3], locs1[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*Location{locs1[3], locs1[2], locs1[1], locs1[0]}, + Value: []int64{1, 1}, + }, + }, + Location: locs1, + Function: funs, + DropFrames: "fu.*[12]|banana", + KeepFrames: ".*[n2][n2]", +} + +const out1 = `PeriodType: cpu milliseconds +Period: 1 +Duration: 10s +Samples: +samples/count cpu/milliseconds + 1 1: 1 + 1 1: 2 1 + 1 1: 1 + 1 1: 4 1 + 1 1: 2 1 +Locations + 1: 0x0 main main.c:1:7 s=0 + 2: 0x0 fun2 fun.c:1:0 s=0 + 3: 0x0 fun3 fun.c:2:0 s=0 + fun1 fun.c:1:7 s=0 + 4: 0x0 fun5 fun.c:2:0 s=0 +Mappings +` + +var locs2 = []*Location{ + { + ID: 1, + Line: []Line{ + {Function: funs[0], Line: 1}, + }, + }, + { + ID: 2, + Line: []Line{ + {Function: funs[6], Line: 1}, + }, + }, + { + ID: 3, + Line: []Line{ + {Function: funs[7], Line: 1}, + }, + }, + { + ID: 4, + Line: []Line{ + {Function: funs[8], Line: 1}, + }, + }, + { + ID: 5, + Line: []Line{ + {Function: funs[9], Line: 1}, + }, + }, +} + +var in2 = &Profile{ + PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, + Period: 1, + DurationNanos: 10e9, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "milliseconds"}, + }, + Sample: []*Sample{ + // Unsimplified name with parameters shouldn't match. + { + Location: []*Location{locs2[1], locs2[0]}, + Value: []int64{1, 1}, + }, + // .*Foo::.*::Bar.* should (and will be dropped) regardless of the anonymous namespace. + { + Location: []*Location{locs2[2], locs2[0]}, + Value: []int64{1, 1}, + }, + // .*Foo::.*::Bar.* shouldn't match inside the parameter list. + { + Location: []*Location{locs2[3], locs2[0]}, + Value: []int64{1, 1}, + }, + // .*operator\(\) should match, regardless of parameters. + { + Location: []*Location{locs2[4], locs2[0]}, + Value: []int64{1, 1}, + }, + }, + Location: locs2, + Function: funs, + DropFrames: `unsimplified_fun\(int\)|.*Foo::.*::Bar.*|.*operator\(\)`, +} + +const out2 = `PeriodType: cpu milliseconds +Period: 1 +Duration: 10s +Samples: +samples/count cpu/milliseconds + 1 1: 2 1 + 1 1: 1 + 1 1: 4 1 + 1 1: 1 +Locations + 1: 0x0 main main.c:1:0 s=0 + 2: 0x0 unsimplified_fun(int) fun.c:1:0 s=0 + 3: 0x0 Foo::(anonymous namespace)::Test::Bar fun.c:1:0 s=0 + 4: 0x0 Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar) fun.c:1:0 s=0 + 5: 0x0 Foo::operator()(::Bar) fun.c:1:0 s=0 +Mappings +` diff --git a/plugin/debug/pkg/profile/testdata/cppbench.contention b/plugin/debug/pkg/profile/testdata/cppbench.contention new file mode 100644 index 00000000..66a64c95 --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/cppbench.contention @@ -0,0 +1,24 @@ +--- contentionz 1 --- +cycles/second = 3201000000 +sampling period = 100 +ms since reset = 16502830 +discarded samples = 0 + 19490304 27 @ 0xbccc97 0xc61202 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e + 768 1 @ 0xbccc97 0xa42dc7 0xa456e4 0x7fcdc2ff214e + 5760 2 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x4e969d 0x4faa17 0x4fc5f6 0x4fd028 0x4fd230 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e + 569088 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87f08 0xb8814c 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e + 2432 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x7aa74c 0x7ab844 0x7ab914 0x79e9e9 0x79e326 0x4d299e 0x4d4b7b 0x4b7be8 0x4b7ff1 0x4d2dae 0x79e80a + 2034816 3 @ 0xbccc97 0xb82f0f 0xb83003 0xb87d50 0xc635f0 0x42ecc3 0x42e14c 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e +--- Memory map: --- + 00400000-00fcb000: cppbench_server_main + 7fcdc231e000-7fcdc2321000: /libnss_cache-2.15.so + 7fcdc2522000-7fcdc252e000: /libnss_files-2.15.so + 7fcdc272f000-7fcdc28dd000: /libc-2.15.so + 7fcdc2ae7000-7fcdc2be2000: /libm-2.15.so + 7fcdc2de3000-7fcdc2dea000: /librt-2.15.so + 7fcdc2feb000-7fcdc3003000: /libpthread-2.15.so + 7fcdc3208000-7fcdc320a000: /libdl-2.15.so + 7fcdc340c000-7fcdc3415000: /libcrypt-2.15.so + 7fcdc3645000-7fcdc3669000: /ld-2.15.so + 7fff86bff000-7fff86c00000: [vdso] + ffffffffff600000-ffffffffff601000: [vsyscall] diff --git a/plugin/debug/pkg/profile/testdata/cppbench.contention.string b/plugin/debug/pkg/profile/testdata/cppbench.contention.string new file mode 100644 index 00000000..441f1cec --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/cppbench.contention.string @@ -0,0 +1,65 @@ +PeriodType: contentions count +Period: 100 +Duration: 4h35 +Samples: +contentions/count delay/nanoseconds + 2700 608881724: 1 2 3 4 5 6 7 8 9 10 11 12 13 + 100 23992: 1 14 12 13 + 200 179943: 1 15 16 17 18 19 20 21 22 23 9 10 11 12 13 + 100 17778444: 1 15 16 24 18 3 4 5 6 7 8 9 10 11 12 13 + 100 75976: 1 15 16 17 18 25 26 27 28 29 30 31 32 33 34 9 + 300 63568134: 1 35 36 37 38 39 40 6 7 8 9 10 11 12 13 +Locations + 1: 0xbccc96 M=1 + 2: 0xc61201 M=1 + 3: 0x42ed5e M=1 + 4: 0x42edc0 M=1 + 5: 0x42e159 M=1 + 6: 0x5261ae M=1 + 7: 0x526ede M=1 + 8: 0x5280aa M=1 + 9: 0x79e809 M=1 + 10: 0x7a251a M=1 + 11: 0x7a296c M=1 + 12: 0xa456e3 M=1 + 13: 0x7fcdc2ff214d M=7 + 14: 0xa42dc6 M=1 + 15: 0xb82b72 M=1 + 16: 0xb82bca M=1 + 17: 0xb87eaa M=1 + 18: 0xb8814b M=1 + 19: 0x4e969c M=1 + 20: 0x4faa16 M=1 + 21: 0x4fc5f5 M=1 + 22: 0x4fd027 M=1 + 23: 0x4fd22f M=1 + 24: 0xb87f07 M=1 + 25: 0x7aa74b M=1 + 26: 0x7ab843 M=1 + 27: 0x7ab913 M=1 + 28: 0x79e9e8 M=1 + 29: 0x79e325 M=1 + 30: 0x4d299d M=1 + 31: 0x4d4b7a M=1 + 32: 0x4b7be7 M=1 + 33: 0x4b7ff0 M=1 + 34: 0x4d2dad M=1 + 35: 0xb82f0e M=1 + 36: 0xb83002 M=1 + 37: 0xb87d4f M=1 + 38: 0xc635ef M=1 + 39: 0x42ecc2 M=1 + 40: 0x42e14b M=1 +Mappings +1: 0x400000/0xfcb000/0x0 cppbench_server_main +2: 0x7fcdc231e000/0x7fcdc2321000/0x0 /libnss_cache-2.15.so +3: 0x7fcdc2522000/0x7fcdc252e000/0x0 /libnss_files-2.15.so +4: 0x7fcdc272f000/0x7fcdc28dd000/0x0 /libc-2.15.so +5: 0x7fcdc2ae7000/0x7fcdc2be2000/0x0 /libm-2.15.so +6: 0x7fcdc2de3000/0x7fcdc2dea000/0x0 /librt-2.15.so +7: 0x7fcdc2feb000/0x7fcdc3003000/0x0 /libpthread-2.15.so +8: 0x7fcdc3208000/0x7fcdc320a000/0x0 /libdl-2.15.so +9: 0x7fcdc340c000/0x7fcdc3415000/0x0 /libcrypt-2.15.so +10: 0x7fcdc3645000/0x7fcdc3669000/0x0 /ld-2.15.so +11: 0x7fff86bff000/0x7fff86c00000/0x0 [vdso] +12: 0xffffffffff600000/0xffffffffff601000/0x0 [vsyscall] diff --git a/plugin/debug/pkg/profile/testdata/cppbench.cpu b/plugin/debug/pkg/profile/testdata/cppbench.cpu new file mode 100644 index 0000000000000000000000000000000000000000..607015ee93f1a7171f17e62cf98cfe4b62dccbc2 GIT binary patch literal 23631 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 H-nIP&GiNxw literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/profile/testdata/gobench.cpu.string b/plugin/debug/pkg/profile/testdata/gobench.cpu.string new file mode 100644 index 00000000..7df1533a --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/gobench.cpu.string @@ -0,0 +1,415 @@ +PeriodType: cpu nanoseconds +Period: 10000000 +Samples: +samples/count cpu/nanoseconds + 1 10000000: 1 2 + 1 10000000: 3 2 + 1 10000000: 4 2 + 1 10000000: 5 2 + 1 10000000: 6 2 + 1 10000000: 7 2 + 1 10000000: 8 2 + 1 10000000: 9 2 + 1 10000000: 10 2 + 1 10000000: 11 2 + 1 10000000: 12 2 + 1 10000000: 13 2 + 1 10000000: 14 2 + 1 10000000: 15 2 + 1 10000000: 16 2 + 1 10000000: 17 2 + 1 10000000: 18 2 + 1 10000000: 16 2 + 1 10000000: 19 2 + 1 10000000: 20 2 + 1 10000000: 21 2 + 1 10000000: 22 2 + 1 10000000: 23 2 + 1 10000000: 24 2 + 1 10000000: 25 2 + 1 10000000: 15 2 + 1 10000000: 26 2 + 1 10000000: 9 2 + 1 10000000: 27 2 + 1 10000000: 28 2 + 1 10000000: 29 2 + 1 10000000: 30 2 + 1 10000000: 31 2 + 1 10000000: 32 2 + 1 10000000: 24 2 + 1 10000000: 30 2 + 1 10000000: 33 2 + 1 10000000: 34 2 + 1 10000000: 35 2 + 1 10000000: 36 2 + 1 10000000: 27 2 + 1 10000000: 37 2 + 1 10000000: 38 2 + 1 10000000: 19 2 + 1 10000000: 39 2 + 1 10000000: 40 2 + 1 10000000: 41 2 + 1 10000000: 16 2 + 1 10000000: 42 2 + 1 10000000: 43 2 + 1 10000000: 44 2 + 1 10000000: 45 2 + 1 10000000: 46 2 + 1 10000000: 47 2 + 1 10000000: 48 2 + 1 10000000: 40 2 + 1 10000000: 10 2 + 1 10000000: 49 2 + 1 10000000: 50 2 + 1 10000000: 51 2 + 1 10000000: 52 2 + 1 10000000: 53 2 + 1 10000000: 30 2 + 1 10000000: 54 2 + 1 10000000: 55 2 + 1 10000000: 36 2 + 1 10000000: 56 2 + 1 10000000: 57 2 + 1 10000000: 58 2 + 1 10000000: 59 2 + 1 10000000: 60 2 + 1 10000000: 61 2 + 1 10000000: 57 2 + 1 10000000: 62 2 + 1 10000000: 63 2 + 1 10000000: 30 2 + 1 10000000: 64 2 + 1 10000000: 16 2 + 1 10000000: 65 2 + 1 10000000: 26 2 + 1 10000000: 40 2 + 1 10000000: 66 2 + 1 10000000: 58 2 + 1 10000000: 67 2 + 1 10000000: 68 2 + 1 10000000: 69 2 + 1 10000000: 70 2 + 1 10000000: 71 2 + 1 10000000: 72 2 + 1 10000000: 51 2 + 1 10000000: 73 2 + 1 10000000: 74 2 + 1 10000000: 75 2 + 1 10000000: 76 2 + 1 10000000: 77 2 + 1 10000000: 78 2 + 1 10000000: 79 2 + 1 10000000: 80 2 + 1 10000000: 81 2 + 1 10000000: 82 2 + 1 10000000: 83 2 + 1 10000000: 84 2 + 1 10000000: 85 2 + 1 10000000: 86 2 + 1 10000000: 10 2 + 1 10000000: 87 2 + 1 10000000: 88 2 + 1 10000000: 89 2 + 1 10000000: 90 2 + 1 10000000: 63 2 + 1 10000000: 91 2 + 1 10000000: 5 2 + 1 10000000: 92 2 + 1 10000000: 93 2 + 1 10000000: 94 2 + 1 10000000: 19 2 + 1 10000000: 95 2 + 1 10000000: 30 2 + 1 10000000: 96 2 + 1 10000000: 10 2 + 1 10000000: 97 2 + 1 10000000: 98 2 + 1 10000000: 99 2 + 1 10000000: 62 2 + 1 10000000: 92 2 + 1 10000000: 100 2 + 1 10000000: 101 2 + 1 10000000: 39 2 + 1 10000000: 102 2 + 1 10000000: 86 2 + 1 10000000: 33 2 + 1 10000000: 103 2 + 1 10000000: 104 2 + 1 10000000: 13 2 + 2 20000000: 105 2 + 1 10000000: 106 2 + 1 10000000: 52 2 + 1 10000000: 24 2 + 1 10000000: 107 2 + 1 10000000: 108 2 + 1 10000000: 52 2 + 1 10000000: 109 2 + 1 10000000: 5 2 + 1 10000000: 82 2 + 1 10000000: 8 2 + 1 10000000: 110 2 + 1 10000000: 111 2 + 1 10000000: 112 2 + 1 10000000: 113 2 + 1 10000000: 114 2 + 1 10000000: 115 2 + 1 10000000: 116 2 + 1 10000000: 19 2 + 1 10000000: 64 2 + 1 10000000: 106 2 + 1 10000000: 117 2 + 1 10000000: 30 2 + 1 10000000: 118 2 + 1 10000000: 86 2 + 1 10000000: 119 2 + 1 10000000: 120 2 + 1 10000000: 121 2 + 1 10000000: 81 2 + 2 20000000: 10 2 + 1 10000000: 19 2 + 1 10000000: 122 2 + 1 10000000: 123 2 + 1 10000000: 105 2 + 1 10000000: 124 2 + 1 10000000: 125 2 + 1 10000000: 46 2 + 1 10000000: 8 2 + 10 100000000: 21 2 + 7 70000000: 126 2 + 3 30000000: 9 2 + 1 10000000: 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 1 10000000: 144 2 + 5 50000000: 145 2 + 25 250000000: 146 2 + 1 10000000: 147 2 + 1 10000000: 148 149 150 134 135 136 137 138 139 140 141 142 143 + 1 10000000: 151 152 153 154 155 135 136 137 138 139 140 141 142 143 + 1 10000000: 156 157 153 154 155 135 136 137 138 139 140 141 142 143 + 1 10000000: 158 159 132 133 134 135 136 137 138 139 140 141 142 143 + 4 40000000: 27 2 + 4 40000000: 160 2 + 1 10000000: 116 2 + 5 50000000: 161 2 + 20 200000000: 162 163 164 135 136 137 138 139 140 141 142 143 + 1 10000000: 165 166 167 164 135 136 137 138 139 140 141 142 143 + 1 10000000: 168 169 167 164 135 136 137 138 139 140 141 142 143 + 2 20000000: 170 171 172 142 143 + 2 20000000: 173 171 172 142 143 + 1 10000000: 105 174 175 154 155 176 177 140 141 142 143 + 1 10000000: 178 179 176 177 140 141 142 143 + 1 10000000: 180 181 182 181 183 184 185 186 187 188 189 190 191 192 193 194 143 + 7 70000000: 195 2 + 2 20000000: 196 2 + 8 80000000: 16 2 + 1 10000000: 197 2 + 1 10000000: 146 198 199 135 136 137 138 139 140 141 142 143 + 1 10000000: 200 199 135 136 137 138 139 140 141 142 143 + 3 30000000: 162 179 135 136 137 138 139 140 141 142 143 + 1 10000000: 201 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 1 10000000: 202 167 152 153 154 155 135 136 137 138 139 140 141 142 143 + 6 60000000: 162 163 152 153 154 155 135 136 137 138 139 140 141 142 143 +Locations + 1: 0x410bc0 M=1 + 2: 0x41a770 M=1 + 3: 0x410b4b M=1 + 4: 0x40f534 M=1 + 5: 0x40f018 M=1 + 6: 0x421f4f M=1 + 7: 0x40e46f M=1 + 8: 0x40f0e3 M=1 + 9: 0x4286c7 M=1 + 10: 0x40f15b M=1 + 11: 0x40efb1 M=1 + 12: 0x41250d M=1 + 13: 0x427854 M=1 + 14: 0x40e688 M=1 + 15: 0x410b61 M=1 + 16: 0x40fa72 M=1 + 17: 0x40e92a M=1 + 18: 0x421ff1 M=1 + 19: 0x42830d M=1 + 20: 0x41cf23 M=1 + 21: 0x40e7cb M=1 + 22: 0x40ea46 M=1 + 23: 0x40f792 M=1 + 24: 0x40f023 M=1 + 25: 0x40ee50 M=1 + 26: 0x40c6ab M=1 + 27: 0x40fa51 M=1 + 28: 0x40f14b M=1 + 29: 0x421fca M=1 + 30: 0x4285d3 M=1 + 31: 0x410ba9 M=1 + 32: 0x40e75f M=1 + 33: 0x4277a1 M=1 + 34: 0x40e89f M=1 + 35: 0x40ea54 M=1 + 36: 0x40f0ab M=1 + 37: 0x40ef9b M=1 + 38: 0x410d6a M=1 + 39: 0x40e455 M=1 + 40: 0x427856 M=1 + 41: 0x40e80b M=1 + 42: 0x40f5ef M=1 + 43: 0x40fb2a M=1 + 44: 0x422786 M=1 + 45: 0x40f031 M=1 + 46: 0x40f49d M=1 + 47: 0x40f331 M=1 + 48: 0x40e927 M=1 + 49: 0x40f558 M=1 + 50: 0x410b56 M=1 + 51: 0x40eac1 M=1 + 52: 0x40e813 M=1 + 53: 0x40e7df M=1 + 54: 0x40f53d M=1 + 55: 0x40f180 M=1 + 56: 0x410b94 M=1 + 57: 0x40fbf6 M=1 + 58: 0x40f026 M=1 + 59: 0x40f0dc M=1 + 60: 0x40e9d3 M=1 + 61: 0x40fa7b M=1 + 62: 0x40e877 M=1 + 63: 0x4048a8 M=1 + 64: 0x40f02e M=1 + 65: 0x4048b8 M=1 + 66: 0x4277d0 M=1 + 67: 0x40f5cb M=1 + 68: 0x40fbae M=1 + 69: 0x40e8c2 M=1 + 70: 0x40f64b M=1 + 71: 0x40e82e M=1 + 72: 0x421f22 M=1 + 73: 0x40fa67 M=1 + 74: 0x40fbb1 M=1 + 75: 0x40f568 M=1 + 76: 0x40e461 M=1 + 77: 0x40ef85 M=1 + 78: 0x40f58b M=1 + 79: 0x40f08d M=1 + 80: 0x40e75c M=1 + 81: 0x410c22 M=1 + 82: 0x40fa59 M=1 + 83: 0x40f091 M=1 + 84: 0x40eb69 M=1 + 85: 0x41075a M=1 + 86: 0x40e7e9 M=1 + 87: 0x40fa97 M=1 + 88: 0x4131eb M=1 + 89: 0x40f769 M=1 + 90: 0x40f54e M=1 + 91: 0x4277d5 M=1 + 92: 0x40f0ca M=1 + 93: 0x40f051 M=1 + 94: 0x40e94f M=1 + 95: 0x40fc11 M=1 + 96: 0x41815b M=1 + 97: 0x40f4b3 M=1 + 98: 0x421fe8 M=1 + 99: 0x40e79e M=1 + 100: 0x413f29 M=1 + 101: 0x427822 M=1 + 102: 0x40ef3d M=1 + 103: 0x40e440 M=1 + 104: 0x40e767 M=1 + 105: 0x42783b M=1 + 106: 0x40fa85 M=1 + 107: 0x40fb36 M=1 + 108: 0x410bae M=1 + 109: 0x40f0d7 M=1 + 110: 0x410ba4 M=1 + 111: 0x40e87b M=1 + 112: 0x40e7c0 M=1 + 113: 0x40eae0 M=1 + 114: 0x410a99 M=1 + 115: 0x40e7bd M=1 + 116: 0x40f09d M=1 + 117: 0x410b70 M=1 + 118: 0x40f32d M=1 + 119: 0x4283ec M=1 + 120: 0x40f010 M=1 + 121: 0x40e97a M=1 + 122: 0x40f19a M=1 + 123: 0x40e779 M=1 + 124: 0x40f61d M=1 + 125: 0x40f4e1 M=1 + 126: 0x40f58f M=1 + 127: 0x41ef43 M=1 + 128: 0x41ef96 M=1 + 129: 0x41f089 M=1 + 130: 0x41f360 M=1 + 131: 0x41fc8e M=1 + 132: 0x4204c7 M=1 + 133: 0x422b03 M=1 + 134: 0x420cee M=1 + 135: 0x422150 M=1 + 136: 0x4221d9 M=1 + 137: 0x41dc0c M=1 + 138: 0x41db47 M=1 + 139: 0x672125 M=1 + 140: 0x4ac6fd M=1 + 141: 0x4abf98 M=1 + 142: 0x491fbd M=1 + 143: 0x41931f M=1 + 144: 0x40e844 M=1 + 145: 0x421ff8 M=1 + 146: 0x4277e4 M=1 + 147: 0x40e990 M=1 + 148: 0x41c53f M=1 + 149: 0x422746 M=1 + 150: 0x422b42 M=1 + 151: 0x412b5f M=1 + 152: 0x40d47b M=1 + 153: 0x40cf5e M=1 + 154: 0x40cceb M=1 + 155: 0x420b5e M=1 + 156: 0x413ab9 M=1 + 157: 0x40d56e M=1 + 158: 0x41f5a6 M=1 + 159: 0x420149 M=1 + 160: 0x40f531 M=1 + 161: 0x410b8d M=1 + 162: 0x427ac9 M=1 + 163: 0x412b91 M=1 + 164: 0x420ee3 M=1 + 165: 0x4134a8 M=1 + 166: 0x412dc7 M=1 + 167: 0x412afa M=1 + 168: 0x413a9d M=1 + 169: 0x412bf6 M=1 + 170: 0x671ed3 M=1 + 171: 0x4ac6ad M=1 + 172: 0x4abdd8 M=1 + 173: 0x671ebe M=1 + 174: 0x40c8ae M=1 + 175: 0x40d00a M=1 + 176: 0x422081 M=1 + 177: 0x672148 M=1 + 178: 0x427ad1 M=1 + 179: 0x420e54 M=1 + 180: 0x5718ff M=1 + 181: 0x575ab6 M=1 + 182: 0x572114 M=1 + 183: 0x571257 M=1 + 184: 0x462494 M=1 + 185: 0x475ea6 M=1 + 186: 0x473682 M=1 + 187: 0x471fd7 M=1 + 188: 0x471ac0 M=1 + 189: 0x46f1b2 M=1 + 190: 0x46ef32 M=1 + 191: 0x4ab9e0 M=1 + 192: 0x4acce1 M=1 + 193: 0x4ac7b6 M=1 + 194: 0x4ace6a M=1 + 195: 0x410b8a M=1 + 196: 0x40f56e M=1 + 197: 0x428176 M=1 + 198: 0x4120f3 M=1 + 199: 0x420be8 M=1 + 200: 0x412100 M=1 + 201: 0x41ef39 M=1 + 202: 0x412e38 M=1 +Mappings +1: 0x0/0xffffffffffffffff/0x0 diff --git a/plugin/debug/pkg/profile/testdata/gobench.heap b/plugin/debug/pkg/profile/testdata/gobench.heap new file mode 100644 index 00000000..ed449034 --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/gobench.heap @@ -0,0 +1,16 @@ +heap profile: 13: 1595680 [47130736: 2584596557304] @ heap/1048576 +1: 524288 [3: 1572864] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x74920f 0x6295ac 0x629855 0x462769 0x419320 +1: 524288 [1: 524288] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x74920f 0x63963f 0x419320 +1: 262144 [1: 262144] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x451a39 0x451ba5 0x450683 0x450077 0x4525a4 0x58e034 0x419320 +1: 262144 [1: 262144] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x451a39 0x451ba5 0x450683 0x450077 0x4524d4 0x401090 0x4011a1 0x416dff 0x419320 +1: 10240 [642: 6574080] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x477637 0x47718b 0x477056 0x4799b2 0x46bfd7 0x419320 +1: 4096 [1: 4096] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x526126 0x5261ea 0x4683d4 0x467e09 0x419320 +1: 4096 [1: 4096] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x53fbf3 0x53f85f 0x545f52 0x545a70 0x419320 +1: 2048 [1: 2048] @ 0x420cef 0x420fa9 0x414b22 0x414d20 0x4901be 0x419320 +1: 1280 [1: 1280] @ 0x420cef 0x422082 0x48dbe3 0x48d15c 0x48cdd0 0x4a9dc0 0x545bfe 0x543ac7 0x419320 +1: 384 [1: 384] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41dd68 0x41dcbd 0x429150 0x429add 0x42e013 0x4307e2 0x4366ff 0x42c1c2 0x653e4d 0x64bdc5 0x64c359 0x65a73d 0x64cdb1 0x64be73 0x64c359 0x64c59a 0x64c205 0x64c359 0x64b778 0x5cd55c 0x45dbc3 0x543e70 0x559166 0x55ba54 0x559691 0x559985 0x5a19ff 0x543e70 +1: 288 [1: 288] @ 0x420cef 0x420fa9 0x419e19 0x41a1a8 0x419f63 0x48f09f 0x48d991 0x48cdd0 0x4a9dc0 0x545bfe 0x543ac7 0x419320 +1: 288 [2: 296] @ +1: 96 [1: 96] @ 0x420cef 0x424f35 0x4255d1 0x6fc293 0x6f9c88 0x6f9944 0x6f96be 0x6f966b 0x59f39a 0x468318 0x467e09 0x419320 +0: 0 [1: 1024] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41dd68 0x41dcbd 0x6d71a3 0x6da87d 0x7b2c3b 0x419320 +0: 0 [1: 16] @ 0x420cef 0x422048 0x40b517 0x40b746 0x6d9ca2 0x4761c5 0x475ea7 0x46fc4f 0x46f180 0x46ef33 0x4ab821 0x4acc32 0x4ac7b7 0x4ace36 0x419320 diff --git a/plugin/debug/pkg/profile/testdata/gobench.heap.string b/plugin/debug/pkg/profile/testdata/gobench.heap.string new file mode 100644 index 00000000..01306ce6 --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/gobench.heap.string @@ -0,0 +1,137 @@ +PeriodType: space bytes +Period: 524288 +Samples: +alloc_objects/count alloc_space/bytes inuse_objects/count inuse_space/bytes + 4 2488234 1 829411: 1 2 3 4 5 6 7 8 9 10 + bytes:[524288] + 1 829411 1 829411: 1 2 3 4 5 6 11 10 + bytes:[524288] + 2 666237 2 666237: 1 2 3 4 5 12 13 14 15 16 17 10 + bytes:[262144] + 2 666237 2 666237: 1 2 3 4 5 12 13 14 15 18 19 20 21 10 + bytes:[262144] + 33192 339890635 51 529424: 1 2 3 4 5 22 23 24 25 26 10 + bytes:[10240] + 128 526338 128 526338: 1 2 3 4 5 27 28 29 30 10 + bytes:[4096] + 128 526338 128 526338: 1 2 3 4 5 31 32 33 34 10 + bytes:[4096] + 256 525312 256 525312: 1 35 36 37 38 10 + bytes:[2048] + 410 524928 410 524928: 1 39 40 41 42 43 44 45 10 + bytes:[1280] + 1365 524480 1365 524480: 1 2 3 4 46 47 48 49 50 51 52 53 54 55 56 57 58 59 56 60 61 56 62 63 64 65 66 67 68 69 70 65 + bytes:[384] + 1820 524432 1820 524432: 1 35 71 72 73 74 75 42 43 44 45 10 + bytes:[288] + 7085 1048724 1820 524432: + bytes:[288] + 5461 524336 5461 524336: 1 76 77 78 79 80 81 82 83 84 30 10 + bytes:[96] + 512 524800 0 0: 1 2 3 4 46 47 85 86 87 10 + bytes:[1024] + 32768 524296 0 0: 1 88 89 90 91 92 93 94 95 96 97 98 99 100 10 + bytes:[16] +Locations + 1: 0x420cee M=1 + 2: 0x422150 M=1 + 3: 0x4221d9 M=1 + 4: 0x41dc0c M=1 + 5: 0x41db47 M=1 + 6: 0x74920e M=1 + 7: 0x6295ab M=1 + 8: 0x629854 M=1 + 9: 0x462768 M=1 + 10: 0x41931f M=1 + 11: 0x63963e M=1 + 12: 0x451a38 M=1 + 13: 0x451ba4 M=1 + 14: 0x450682 M=1 + 15: 0x450076 M=1 + 16: 0x4525a3 M=1 + 17: 0x58e033 M=1 + 18: 0x4524d3 M=1 + 19: 0x40108f M=1 + 20: 0x4011a0 M=1 + 21: 0x416dfe M=1 + 22: 0x477636 M=1 + 23: 0x47718a M=1 + 24: 0x477055 M=1 + 25: 0x4799b1 M=1 + 26: 0x46bfd6 M=1 + 27: 0x526125 M=1 + 28: 0x5261e9 M=1 + 29: 0x4683d3 M=1 + 30: 0x467e08 M=1 + 31: 0x53fbf2 M=1 + 32: 0x53f85e M=1 + 33: 0x545f51 M=1 + 34: 0x545a6f M=1 + 35: 0x420fa8 M=1 + 36: 0x414b21 M=1 + 37: 0x414d1f M=1 + 38: 0x4901bd M=1 + 39: 0x422081 M=1 + 40: 0x48dbe2 M=1 + 41: 0x48d15b M=1 + 42: 0x48cdcf M=1 + 43: 0x4a9dbf M=1 + 44: 0x545bfd M=1 + 45: 0x543ac6 M=1 + 46: 0x41dd67 M=1 + 47: 0x41dcbc M=1 + 48: 0x42914f M=1 + 49: 0x429adc M=1 + 50: 0x42e012 M=1 + 51: 0x4307e1 M=1 + 52: 0x4366fe M=1 + 53: 0x42c1c1 M=1 + 54: 0x653e4c M=1 + 55: 0x64bdc4 M=1 + 56: 0x64c358 M=1 + 57: 0x65a73c M=1 + 58: 0x64cdb0 M=1 + 59: 0x64be72 M=1 + 60: 0x64c599 M=1 + 61: 0x64c204 M=1 + 62: 0x64b777 M=1 + 63: 0x5cd55b M=1 + 64: 0x45dbc2 M=1 + 65: 0x543e6f M=1 + 66: 0x559165 M=1 + 67: 0x55ba53 M=1 + 68: 0x559690 M=1 + 69: 0x559984 M=1 + 70: 0x5a19fe M=1 + 71: 0x419e18 M=1 + 72: 0x41a1a7 M=1 + 73: 0x419f62 M=1 + 74: 0x48f09e M=1 + 75: 0x48d990 M=1 + 76: 0x424f34 M=1 + 77: 0x4255d0 M=1 + 78: 0x6fc292 M=1 + 79: 0x6f9c87 M=1 + 80: 0x6f9943 M=1 + 81: 0x6f96bd M=1 + 82: 0x6f966a M=1 + 83: 0x59f399 M=1 + 84: 0x468317 M=1 + 85: 0x6d71a2 M=1 + 86: 0x6da87c M=1 + 87: 0x7b2c3a M=1 + 88: 0x422047 M=1 + 89: 0x40b516 M=1 + 90: 0x40b745 M=1 + 91: 0x6d9ca1 M=1 + 92: 0x4761c4 M=1 + 93: 0x475ea6 M=1 + 94: 0x46fc4e M=1 + 95: 0x46f17f M=1 + 96: 0x46ef32 M=1 + 97: 0x4ab820 M=1 + 98: 0x4acc31 M=1 + 99: 0x4ac7b6 M=1 + 100: 0x4ace35 M=1 +Mappings +1: 0x0/0xffffffffffffffff/0x0 diff --git a/plugin/debug/pkg/profile/testdata/java.contention b/plugin/debug/pkg/profile/testdata/java.contention new file mode 100644 index 00000000..fb484b70 --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/java.contention @@ -0,0 +1,43 @@ +--- contentionz 1 --- +format = java +resolution = microseconds +sampling period = 100 +ms since reset = 6019923 + 1 1 @ 0x00000003 0x00000004 + 14 1 @ 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000017 0x00000018 0x00000019 0x0000001a 0x0000001b 0x0000001c 0x00000014 0x00000029 0x0000002a 0x0000002b 0x0000002c 0x0000002d 0x0000002e 0x0000002f 0x00000030 0x00000031 0x00000032 0x00000033 0x00000034 0x00000035 + 2 2 @ 0x00000003 0x00000004 + 2 3 @ 0x00000036 0x00000037 0x00000038 + + + 0x0000003 com.example.function03 (source.java:03) + 0x0000004 com.example.function04 (source.java:04) + 0x000000d com.example.function0d (source.java:0) + 0x000000e com.example.function0e (source.java:0) + 0x000000f com.example.function0f (source.java:0) + 0x0000010 com.example.function10 (source.java:10) + 0x0000011 com.example.function11 (source.java:11) + 0x0000012 com.example.function12 (source.java:12) + 0x0000013 com.example.function13 (source.java:13) + 0x0000014 com.example.function14 (source.java:14) + 0x0000017 com.example.function17 (source.java:17) + 0x0000018 com.example.function18 (source.java:18) + 0x0000019 com.example.function19 (source.java:19) + 0x000001a com.example.function1a (source.java:1) + 0x000001b com.example.function1b (source.java:1) + 0x000001c com.example.function1c (source.java:1) + 0x0000029 com.example.function29 (source.java:29) + 0x000002a com.example.function2a (source.java:2) + 0x000002b com.example.function2b (source.java:2) + 0x000002c com.example.function2c (source.java:2) + 0x000002d com.example.function2d (source.java:2) + 0x000002e com.example.function2e (source.java:2) + 0x000002f com.example.function2f (source.java:2) + 0x0000030 com.example.function30 (source.java:30) + 0x0000031 com.example.function31 (source.java:31) + 0x0000032 com.example.function32 (source.java:32) + 0x0000033 com.example.function33 (source.java:33) + 0x0000034 com.example.function34 (source.java:34) + 0x0000035 com.example.function35 (source.java:35) + 0x0000036 com.example.function36 (source.java:36) + 0x0000037 com.example.function37 (source.java:37) + 0x0000038 com.example.function38 (source.java:38) diff --git a/plugin/debug/pkg/profile/testdata/java.contention.string b/plugin/debug/pkg/profile/testdata/java.contention.string new file mode 100644 index 00000000..34b811d0 --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/java.contention.string @@ -0,0 +1,43 @@ +PeriodType: contentions count +Period: 100 +Duration: 1h40 +Samples: +contentions/count delay/microseconds + 100 100: 1 2 + 100 1400: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 10 17 18 19 20 21 22 23 24 25 26 27 28 29 + 200 200: 1 2 + 300 200: 30 31 32 +Locations + 1: 0x0 com.example.function03 source.java:3:0 s=0 + 2: 0x0 com.example.function04 source.java:4:0 s=0 + 3: 0x0 com.example.function0d source.java:0:0 s=0 + 4: 0x0 com.example.function0e source.java:0:0 s=0 + 5: 0x0 com.example.function0f source.java:0:0 s=0 + 6: 0x0 com.example.function10 source.java:10:0 s=0 + 7: 0x0 com.example.function11 source.java:11:0 s=0 + 8: 0x0 com.example.function12 source.java:12:0 s=0 + 9: 0x0 com.example.function13 source.java:13:0 s=0 + 10: 0x0 com.example.function14 source.java:14:0 s=0 + 11: 0x0 com.example.function17 source.java:17:0 s=0 + 12: 0x0 com.example.function18 source.java:18:0 s=0 + 13: 0x0 com.example.function19 source.java:19:0 s=0 + 14: 0x0 com.example.function1a source.java:1:0 s=0 + 15: 0x0 com.example.function1b source.java:1:0 s=0 + 16: 0x0 com.example.function1c source.java:1:0 s=0 + 17: 0x0 com.example.function29 source.java:29:0 s=0 + 18: 0x0 com.example.function2a source.java:2:0 s=0 + 19: 0x0 com.example.function2b source.java:2:0 s=0 + 20: 0x0 com.example.function2c source.java:2:0 s=0 + 21: 0x0 com.example.function2d source.java:2:0 s=0 + 22: 0x0 com.example.function2e source.java:2:0 s=0 + 23: 0x0 com.example.function2f source.java:2:0 s=0 + 24: 0x0 com.example.function30 source.java:30:0 s=0 + 25: 0x0 com.example.function31 source.java:31:0 s=0 + 26: 0x0 com.example.function32 source.java:32:0 s=0 + 27: 0x0 com.example.function33 source.java:33:0 s=0 + 28: 0x0 com.example.function34 source.java:34:0 s=0 + 29: 0x0 com.example.function35 source.java:35:0 s=0 + 30: 0x0 com.example.function36 source.java:36:0 s=0 + 31: 0x0 com.example.function37 source.java:37:0 s=0 + 32: 0x0 com.example.function38 source.java:38:0 s=0 +Mappings diff --git a/plugin/debug/pkg/profile/testdata/java.cpu b/plugin/debug/pkg/profile/testdata/java.cpu new file mode 100644 index 0000000000000000000000000000000000000000..593588b7d6060f3db3be4b2d2b66bfe111ff5a1b GIT binary patch literal 3537 zcmZ{kNpBNT5QNPRW=U8s9Drd>%wlHVd)~s1fdCR$?v68-g5o#=g7WjJ2bNsjshI!wiQF+befuPN&l-@mO6`^9uI@7BkY`Qd)uogE!afA1|0 z%6_r=YjN~*T6cd;{!F&YerKf&v@&qYfRv$DhE5rhGSbS(DI-!QTA4V7j2&(4G#gWG zOq-2eZR|E1wKnQzW2TK+qfwR8Ky2n-m8*wURa&W>Qjrq05}Xo9iCT$HiKHa0B&Q@& z^iV1{6uuQbl*$c-4Ly{~4TX%Lhl1D)CD2fU9tvWs@LBXwf*VSpp#(h?#P%#Sl%R)# z*eW!X(35jSY?a<>jzO<4#8#p874-T-Y!zBxL9Z{wR-yG3^!h?<63VDbY2B4c(OJnnFg>O+jq#JW*4UZVFd4u~n!kNjC+t PRj4URHwCd(I_>sfIkoP8 literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/profile/testdata/java.cpu.string b/plugin/debug/pkg/profile/testdata/java.cpu.string new file mode 100644 index 00000000..e15decbf --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/java.cpu.string @@ -0,0 +1,78 @@ +PeriodType: cpu nanoseconds +Period: 10000000 +Samples: +samples/count cpu/nanoseconds + 0 0: 1 + 0 0: 2 + 2 20000000: 3 + 1 10000000: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + 1 10000000: 19 20 21 22 23 16 17 18 + 1 10000000: 24 25 26 27 28 29 30 31 32 + 1 10000000: 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 29 30 31 32 + 1 10000000: 54 55 56 57 58 59 60 61 62 11 63 64 16 17 18 +Locations + 1: 0x0 GC :0:0 s=0 + 2: 0x0 Compile :0:0 s=0 + 3: 0x0 VM :0:0 s=0 + 4: 0x0 com.example.function06 source.java:6:0 s=0 + 5: 0x0 com.example.function07 source.java:7:0 s=0 + 6: 0x0 com.example.function08 source.java:8:0 s=0 + 7: 0x0 com.example.function09 source.java:9:0 s=0 + 8: 0x0 com.example.function0a source.java:0:0 s=0 + 9: 0x0 com.example.function0b source.java:0:0 s=0 + 10: 0x0 com.example.function0c source.java:0:0 s=0 + 11: 0x0 com.example.function0d source.java:0:0 s=0 + 12: 0x0 com.example.function0e source.java:0:0 s=0 + 13: 0x0 com.example.function0f source.java:0:0 s=0 + 14: 0x0 com.example.function10 source.java:10:0 s=0 + 15: 0x0 com.example.function11 source.java:11:0 s=0 + 16: 0x0 com.example.function12 source.java:12:0 s=0 + 17: 0x0 com.example.function13 source.java:13:0 s=0 + 18: 0x0 com.example.function14 source.java:14:0 s=0 + 19: 0x0 com.example.function1d source.java:1:0 s=0 + 20: 0x0 com.example.function1e source.java:1:0 s=0 + 21: 0x0 com.example.function1f source.java:1:0 s=0 + 22: 0x0 com.example.function20 source.java:20:0 s=0 + 23: 0x0 com.example.function21 source.java:21:0 s=0 + 24: 0x0 com.example.function22 source.java:22:0 s=0 + 25: 0x0 com.example.function23 source.java:23:0 s=0 + 26: 0x0 com.example.function24 source.java:24:0 s=0 + 27: 0x0 com.example.function25 source.java:25:0 s=0 + 28: 0x0 com.example.function26 source.java:26:0 s=0 + 29: 0x0 com.example.function27 source.java:27:0 s=0 + 30: 0x0 com.example.function28 source.java:28:0 s=0 + 31: 0x0 com.example.function29 source.java:29:0 s=0 + 32: 0x0 com.example.function2a source.java:2:0 s=0 + 33: 0x0 com.example.function2b source.java:2:0 s=0 + 34: 0x0 com.example.function2c source.java:2:0 s=0 + 35: 0x0 com.example.function2d source.java:2:0 s=0 + 36: 0x0 com.example.function2e source.java:2:0 s=0 + 37: 0x0 com.example.function2f source.java:2:0 s=0 + 38: 0x0 com.example.function30 source.java:30:0 s=0 + 39: 0x0 com.example.function31 source.java:31:0 s=0 + 40: 0x0 com.example.function32 source.java:32:0 s=0 + 41: 0x0 com.example.function33 source.java:33:0 s=0 + 42: 0x0 com.example.function34 source.java:34:0 s=0 + 43: 0x0 com.example.function35 source.java:35:0 s=0 + 44: 0x0 com.example.function36 source.java:36:0 s=0 + 45: 0x0 com.example.function37 source.java:37:0 s=0 + 46: 0x0 com.example.function38 source.java:38:0 s=0 + 47: 0x0 com.example.function39 source.java:39:0 s=0 + 48: 0x0 com.example.function3a source.java:3:0 s=0 + 49: 0x0 com.example.function3b source.java:3:0 s=0 + 50: 0x0 com.example.function3c source.java:3:0 s=0 + 51: 0x0 com.example.function3d source.java:3:0 s=0 + 52: 0x0 com.example.function3e source.java:3:0 s=0 + 53: 0x0 com.example.function3f source.java:3:0 s=0 + 54: 0x0 com.example.function40 source.java:40:0 s=0 + 55: 0x0 com.example.function41 source.java:41:0 s=0 + 56: 0x0 com.example.function42 source.java:42:0 s=0 + 57: 0x0 com.example.function43 source.java:43:0 s=0 + 58: 0x0 com.example.function44 source.java:44:0 s=0 + 59: 0x0 com.example.function45 source.java:45:0 s=0 + 60: 0x0 com.example.function46 source.java:46:0 s=0 + 61: 0x0 com.example.function47 source.java:47:0 s=0 + 62: 0x0 com.example.function48 source.java:48:0 s=0 + 63: 0x0 com.example.function49 source.java:49:0 s=0 + 64: 0x0 com.example.function4a source.java:4:0 s=0 +Mappings diff --git a/plugin/debug/pkg/profile/testdata/java.heap b/plugin/debug/pkg/profile/testdata/java.heap new file mode 100644 index 00000000..95e4f6e8 --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/java.heap @@ -0,0 +1,133 @@ +--- heapz 1 --- +format = java +resolution = bytes + 7048 1 @ 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000c 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000018 0x00000019 0x0000001a 0x0000001b 0x0000001c 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x00000022 0x00000023 0x00000024 0x00000025 0x00000026 0x00000027 0x00000023 0x00000028 0x00000029 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x00000027 0x00000023 0x00000028 0x00000029 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x0000002a 0x00000027 0x00000023 0x00000028 0x00000029 0x0000001d 0x0000001e 0x0000001f 0x00000020 + 4752 9 @ 0x0000002b 0x0000002c 0x0000002d 0x0000002e + 880 1 @ 0x00000035 0x00000036 0x00000037 0x00000038 0x00000039 0x0000003a 0x0000003b 0x00000011 0x0000003d 0x0000003e 0x0000003f 0x00000040 0x00000041 0x00000042 0x00000011 0x00000049 0x0000004a 0x0000004b 0x0000004c 0x0000004d 0x0000004e 0x0000004b 0x0000004f 0x0000004b 0x00000050 0x00000051 0x00000052 0x00000053 0x00000054 0x00000055 0x00000056 0x00000057 + 560 1 @ 0x00000035 0x00000036 0x00000037 0x00000038 0x00000039 0x0000003a 0x0000003b 0x00000011 0x0000003d 0x0000003e 0x0000003f 0x00000040 0x00000041 0x00000042 0x00000011 0x0000005e 0x0000005f 0x00000060 0x00000061 0x00000062 0x00000063 0x00000064 0x00000065 0x00000066 0x00000067 0x00000068 0x00000069 0x0000006a 0x0000006b 0x0000006c 0x0000006d 0x0000006e 0x0000006f 0x00000070 0x00000071 0x00000072 0x00000073 0x00000074 0x00000075 0x00000067 0x00000068 + 528 1 @ 0x00000076 0x00000077 0x00000078 0x00000079 0x0000007a 0x0000007b 0x00000011 0x00000081 0x00000011 0x00000082 0x0000004e 0x0000004b 0x0000004f 0x0000004b 0x00000050 0x00000051 0x00000052 0x00000053 0x00000054 0x00000055 0x00000056 0x00000057 + 440 1 @ 0x00000083 0x00000084 0x00000085 0x00000086 0x00000087 0x00000088 0x00000089 0x0000008a 0x0000008b 0x0000008c 0x0000008d 0x0000008e 0x0000008f 0x00000090 0x00000091 0x00000092 0x00000093 0x00000094 0x00000095 0x00000096 + 240 5 @ 0x00000097 + + + 0x00000003 com.example.function003 (Source003.java:103) + 0x00000004 com.example.function004 (Source004.java:104) + 0x00000005 com.example.function005 (Source005.java:105) + 0x00000006 com.example.function006 (Source006.java:106) + 0x00000007 com.example.function007 (Source007.java:107) + 0x00000008 com.example.function008 (Source008.java:108) + 0x00000009 com.example.function009 (Source009.java:109) + 0x0000000a com.example.function00a (Source00a.java:10) + 0x0000000b com.example.function00b (Source00b.java:10) + 0x0000000c com.example.function00c (Source00c.java:10) + 0x0000000d com.example.function00d (Source00d.java:10) + 0x0000000e com.example.function00e (Source00e.java:10) + 0x0000000f com.example.function00f (Source00f.java:10) + 0x00000010 com.example.function010 (Source010.java:110) + 0x00000011 com.example.function011 (Source011.java:111) + 0x00000018 com.example.function018 (Source018.java:118) + 0x00000019 com.example.function019 (Source019.java:119) + 0x0000001a com.example.function01a (Source01a.java:11) + 0x0000001b com.example.function01b (Source01b.java:11) + 0x0000001c com.example.function01c (Source01c.java:11) + 0x0000001d com.example.function01d (Source01d.java:11) + 0x0000001e com.example.function01e (Source01e.java:11) + 0x0000001f com.example.function01f (Source01f.java:11) + 0x00000020 com.example.function020 (Source020.java:120) + 0x00000021 com.example.function021 (Source021.java:121) + 0x00000022 com.example.function022 (Source022.java:122) + 0x00000023 com.example.function023 (Source023.java:123) + 0x00000024 com.example.function024 (Source024.java:124) + 0x00000025 com.example.function025 (Source025.java:125) + 0x00000026 com.example.function026 (Source026.java:126) + 0x00000027 com.example.function027 (Source027.java:127) + 0x00000028 com.example.function028 (Source028.java:128) + 0x00000029 com.example.function029 (Source029.java:129) + 0x0000002a com.example.function02a (Source02a.java:12) + 0x0000002b com.example.function02b (Source02b.java:12) + 0x0000002c com.example.function02c (Source02c.java:12) + 0x0000002d com.example.function02d (Source02d.java:12) + 0x0000002e com.example.function02e (Source02e.java:12) + 0x00000035 com.example.function035 (Source035.java:135) + 0x00000036 com.example.function036 (Source036.java:136) + 0x00000037 com.example.function037 (Source037.java:137) + 0x00000038 com.example.function038 (Source038.java:138) + 0x00000039 com.example.function039 (Source039.java:139) + 0x0000003a com.example.function03a (Source03a.java:13) + 0x0000003b com.example.function03b (Source03b.java:13) + 0x0000003d com.example.function03d (Source03d.java:13) + 0x0000003e com.example.function03e (Source03e.java:13) + 0x0000003f com.example.function03f (Source03f.java:13) + 0x00000040 com.example.function040 (Source040.java:140) + 0x00000041 com.example.function041 (Source041.java:141) + 0x00000042 com.example.function042 (Source042.java:142) + 0x00000049 com.example.function049 (Source049.java:149) + 0x0000004a com.example.function04a (Source04a.java:14) + 0x0000004b com.example.function04b (Source04b.java:14) + 0x0000004c com.example.function04c (Source04c.java:14) + 0x0000004d com.example.function04d (Source04d.java:14) + 0x0000004e com.example.function04e (Source04e.java:14) + 0x0000004f com.example.function04f (Source04f.java:14) + 0x00000050 com.example.function050 (Source050.java:150) + 0x00000051 com.example.function051 (Source051.java:151) + 0x00000052 com.example.function052 (Source052.java:152) + 0x00000053 com.example.function053 (Source053.java:153) + 0x00000054 com.example.function054 (Source054.java:154) + 0x00000055 com.example.function055 (Source055.java:155) + 0x00000056 com.example.function056 (Source056.java:156) + 0x00000057 com.example.function057 (Source057.java:157) + 0x0000005a com.example.function05a (Source05a.java:15) + 0x0000005e com.example.function05e (Source05e.java:15) + 0x0000005f com.example.function05f (Source05f.java:15) + 0x00000060 com.example.function060 (Source060.java:160) + 0x00000061 com.example.function061 (Source061.java:161) + 0x00000062 com.example.function062 (Source062.java:162) + 0x00000063 com.example.function063 (Source063.java:163) + 0x00000064 com.example.function064 (Source064.java:164) + 0x00000065 com.example.function065 (Source065.java:165) + 0x00000066 com.example.function066 (Source066.java:166) + 0x00000067 com.example.function067 (Source067.java:167) + 0x00000068 com.example.function068 (Source068.java:168) + 0x00000069 com.example.function069 (Source069.java:169) + 0x0000006a com.example.function06a (Source06a.java:16) + 0x0000006b com.example.function06b (Source06b.java:16) + 0x0000006c com.example.function06c (Source06c.java:16) + 0x0000006d com.example.function06d (Source06d.java:16) + 0x0000006e com.example.function06e (Source06e.java:16) + 0x0000006f com.example.function06f (Source06f.java:16) + 0x00000070 com.example.function070 (Source070.java:170) + 0x00000071 com.example.function071 (Source071.java:171) + 0x00000072 com.example.function072 (Source072.java:172) + 0x00000073 com.example.function073 (Source073.java:173) + 0x00000074 com.example.function074 (Source074.java:174) + 0x00000075 com.example.function075 (Source075.java:175) + 0x00000076 com.example.function076 (Source076.java:176) + 0x00000077 com.example.function077 (Source077.java:177) + 0x00000078 com.example.function078 (Source078.java:178) + 0x00000079 com.example.function079 (Source079.java:179) + 0x0000007a com.example.function07a (Source07a.java:17) + 0x0000007b com.example.function07b (Source07b.java:17) + 0x0000007d com.example.function07d (Source07d.java:17) + 0x00000081 com.example.function081 (Source081.java:181) + 0x00000082 com.example.function082 (Source082.java:182) + 0x00000083 com.example.function083 (Source083.java:183) + 0x00000084 com.example.function084 (Source084.java:184) + 0x00000085 com.example.function085 (Source085.java:185) + 0x00000086 com.example.function086 (Source086.java:186) + 0x00000087 com.example.function087 (Source087.java:187) + 0x00000088 com.example.function088 (Source088.java:188) + 0x00000089 com.example.function089 (Source089.java:189) + 0x0000008a com.example.function08a (Source08a.java:18) + 0x0000008b com.example.function08b (Source08b.java:18) + 0x0000008c com.example.function08c (Source08c.java:18) + 0x0000008d com.example.function08d (Source08d.java:18) + 0x0000008e com.example.function08e (Source08e.java:18) + 0x0000008f com.example.function08f (Source08f.java:18) + 0x00000090 com.example.function090 (Source090.java:190) + 0x00000091 com.example.function091 (Source091.java:191) + 0x00000092 com.example.function092 (Source092.java:192) + 0x00000093 com.example.function093 (Source093.java:193) + 0x00000094 com.example.function094 (Source094.java:194) + 0x00000095 com.example.function095 (Source095.java:195) + 0x00000096 com.example.function096 (Source096.java:196) + 0x00000097 com.example.function097 (Source097.java:197) diff --git a/plugin/debug/pkg/profile/testdata/java.heap.string b/plugin/debug/pkg/profile/testdata/java.heap.string new file mode 100644 index 00000000..5e1b549d --- /dev/null +++ b/plugin/debug/pkg/profile/testdata/java.heap.string @@ -0,0 +1,139 @@ +PeriodType: +Period: 0 +Samples: +inuse_objects/count inuse_space/bytes + 74 527819: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 27 32 33 21 22 23 24 25 31 27 32 33 21 22 23 24 25 34 31 27 32 33 21 22 23 24 + bytes:[7048] + 8941 4720968: 35 36 37 38 + bytes:[528] + 596 524728: 39 40 41 42 43 44 45 15 46 47 48 49 50 51 15 52 53 54 55 56 57 54 58 54 59 60 61 62 63 64 65 66 + bytes:[880] + 936 524568: 39 40 41 42 43 44 45 15 46 47 48 49 50 51 15 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 76 77 + bytes:[560] + 993 524552: 91 92 93 94 95 96 15 97 15 98 57 54 58 54 59 60 61 62 63 64 65 66 + bytes:[528] + 1192 524508: 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + bytes:[440] + 54615 2621560: 119 + bytes:[48] +Locations + 1: 0x0 com.example.function003 Source003.java:103:0 s=0 + 2: 0x0 com.example.function004 Source004.java:104:0 s=0 + 3: 0x0 com.example.function005 Source005.java:105:0 s=0 + 4: 0x0 com.example.function006 Source006.java:106:0 s=0 + 5: 0x0 com.example.function007 Source007.java:107:0 s=0 + 6: 0x0 com.example.function008 Source008.java:108:0 s=0 + 7: 0x0 com.example.function009 Source009.java:109:0 s=0 + 8: 0x0 com.example.function00a Source00a.java:10:0 s=0 + 9: 0x0 com.example.function00b Source00b.java:10:0 s=0 + 10: 0x0 com.example.function00c Source00c.java:10:0 s=0 + 11: 0x0 com.example.function00d Source00d.java:10:0 s=0 + 12: 0x0 com.example.function00e Source00e.java:10:0 s=0 + 13: 0x0 com.example.function00f Source00f.java:10:0 s=0 + 14: 0x0 com.example.function010 Source010.java:110:0 s=0 + 15: 0x0 com.example.function011 Source011.java:111:0 s=0 + 16: 0x0 com.example.function018 Source018.java:118:0 s=0 + 17: 0x0 com.example.function019 Source019.java:119:0 s=0 + 18: 0x0 com.example.function01a Source01a.java:11:0 s=0 + 19: 0x0 com.example.function01b Source01b.java:11:0 s=0 + 20: 0x0 com.example.function01c Source01c.java:11:0 s=0 + 21: 0x0 com.example.function01d Source01d.java:11:0 s=0 + 22: 0x0 com.example.function01e Source01e.java:11:0 s=0 + 23: 0x0 com.example.function01f Source01f.java:11:0 s=0 + 24: 0x0 com.example.function020 Source020.java:120:0 s=0 + 25: 0x0 com.example.function021 Source021.java:121:0 s=0 + 26: 0x0 com.example.function022 Source022.java:122:0 s=0 + 27: 0x0 com.example.function023 Source023.java:123:0 s=0 + 28: 0x0 com.example.function024 Source024.java:124:0 s=0 + 29: 0x0 com.example.function025 Source025.java:125:0 s=0 + 30: 0x0 com.example.function026 Source026.java:126:0 s=0 + 31: 0x0 com.example.function027 Source027.java:127:0 s=0 + 32: 0x0 com.example.function028 Source028.java:128:0 s=0 + 33: 0x0 com.example.function029 Source029.java:129:0 s=0 + 34: 0x0 com.example.function02a Source02a.java:12:0 s=0 + 35: 0x0 com.example.function02b Source02b.java:12:0 s=0 + 36: 0x0 com.example.function02c Source02c.java:12:0 s=0 + 37: 0x0 com.example.function02d Source02d.java:12:0 s=0 + 38: 0x0 com.example.function02e Source02e.java:12:0 s=0 + 39: 0x0 com.example.function035 Source035.java:135:0 s=0 + 40: 0x0 com.example.function036 Source036.java:136:0 s=0 + 41: 0x0 com.example.function037 Source037.java:137:0 s=0 + 42: 0x0 com.example.function038 Source038.java:138:0 s=0 + 43: 0x0 com.example.function039 Source039.java:139:0 s=0 + 44: 0x0 com.example.function03a Source03a.java:13:0 s=0 + 45: 0x0 com.example.function03b Source03b.java:13:0 s=0 + 46: 0x0 com.example.function03d Source03d.java:13:0 s=0 + 47: 0x0 com.example.function03e Source03e.java:13:0 s=0 + 48: 0x0 com.example.function03f Source03f.java:13:0 s=0 + 49: 0x0 com.example.function040 Source040.java:140:0 s=0 + 50: 0x0 com.example.function041 Source041.java:141:0 s=0 + 51: 0x0 com.example.function042 Source042.java:142:0 s=0 + 52: 0x0 com.example.function049 Source049.java:149:0 s=0 + 53: 0x0 com.example.function04a Source04a.java:14:0 s=0 + 54: 0x0 com.example.function04b Source04b.java:14:0 s=0 + 55: 0x0 com.example.function04c Source04c.java:14:0 s=0 + 56: 0x0 com.example.function04d Source04d.java:14:0 s=0 + 57: 0x0 com.example.function04e Source04e.java:14:0 s=0 + 58: 0x0 com.example.function04f Source04f.java:14:0 s=0 + 59: 0x0 com.example.function050 Source050.java:150:0 s=0 + 60: 0x0 com.example.function051 Source051.java:151:0 s=0 + 61: 0x0 com.example.function052 Source052.java:152:0 s=0 + 62: 0x0 com.example.function053 Source053.java:153:0 s=0 + 63: 0x0 com.example.function054 Source054.java:154:0 s=0 + 64: 0x0 com.example.function055 Source055.java:155:0 s=0 + 65: 0x0 com.example.function056 Source056.java:156:0 s=0 + 66: 0x0 com.example.function057 Source057.java:157:0 s=0 + 67: 0x0 com.example.function05e Source05e.java:15:0 s=0 + 68: 0x0 com.example.function05f Source05f.java:15:0 s=0 + 69: 0x0 com.example.function060 Source060.java:160:0 s=0 + 70: 0x0 com.example.function061 Source061.java:161:0 s=0 + 71: 0x0 com.example.function062 Source062.java:162:0 s=0 + 72: 0x0 com.example.function063 Source063.java:163:0 s=0 + 73: 0x0 com.example.function064 Source064.java:164:0 s=0 + 74: 0x0 com.example.function065 Source065.java:165:0 s=0 + 75: 0x0 com.example.function066 Source066.java:166:0 s=0 + 76: 0x0 com.example.function067 Source067.java:167:0 s=0 + 77: 0x0 com.example.function068 Source068.java:168:0 s=0 + 78: 0x0 com.example.function069 Source069.java:169:0 s=0 + 79: 0x0 com.example.function06a Source06a.java:16:0 s=0 + 80: 0x0 com.example.function06b Source06b.java:16:0 s=0 + 81: 0x0 com.example.function06c Source06c.java:16:0 s=0 + 82: 0x0 com.example.function06d Source06d.java:16:0 s=0 + 83: 0x0 com.example.function06e Source06e.java:16:0 s=0 + 84: 0x0 com.example.function06f Source06f.java:16:0 s=0 + 85: 0x0 com.example.function070 Source070.java:170:0 s=0 + 86: 0x0 com.example.function071 Source071.java:171:0 s=0 + 87: 0x0 com.example.function072 Source072.java:172:0 s=0 + 88: 0x0 com.example.function073 Source073.java:173:0 s=0 + 89: 0x0 com.example.function074 Source074.java:174:0 s=0 + 90: 0x0 com.example.function075 Source075.java:175:0 s=0 + 91: 0x0 com.example.function076 Source076.java:176:0 s=0 + 92: 0x0 com.example.function077 Source077.java:177:0 s=0 + 93: 0x0 com.example.function078 Source078.java:178:0 s=0 + 94: 0x0 com.example.function079 Source079.java:179:0 s=0 + 95: 0x0 com.example.function07a Source07a.java:17:0 s=0 + 96: 0x0 com.example.function07b Source07b.java:17:0 s=0 + 97: 0x0 com.example.function081 Source081.java:181:0 s=0 + 98: 0x0 com.example.function082 Source082.java:182:0 s=0 + 99: 0x0 com.example.function083 Source083.java:183:0 s=0 + 100: 0x0 com.example.function084 Source084.java:184:0 s=0 + 101: 0x0 com.example.function085 Source085.java:185:0 s=0 + 102: 0x0 com.example.function086 Source086.java:186:0 s=0 + 103: 0x0 com.example.function087 Source087.java:187:0 s=0 + 104: 0x0 com.example.function088 Source088.java:188:0 s=0 + 105: 0x0 com.example.function089 Source089.java:189:0 s=0 + 106: 0x0 com.example.function08a Source08a.java:18:0 s=0 + 107: 0x0 com.example.function08b Source08b.java:18:0 s=0 + 108: 0x0 com.example.function08c Source08c.java:18:0 s=0 + 109: 0x0 com.example.function08d Source08d.java:18:0 s=0 + 110: 0x0 com.example.function08e Source08e.java:18:0 s=0 + 111: 0x0 com.example.function08f Source08f.java:18:0 s=0 + 112: 0x0 com.example.function090 Source090.java:190:0 s=0 + 113: 0x0 com.example.function091 Source091.java:191:0 s=0 + 114: 0x0 com.example.function092 Source092.java:192:0 s=0 + 115: 0x0 com.example.function093 Source093.java:193:0 s=0 + 116: 0x0 com.example.function094 Source094.java:194:0 s=0 + 117: 0x0 com.example.function095 Source095.java:195:0 s=0 + 118: 0x0 com.example.function096 Source096.java:196:0 s=0 + 119: 0x0 com.example.function097 Source097.java:197:0 s=0 +Mappings diff --git a/plugin/debug/pkg/third_party/svgpan/LICENSE b/plugin/debug/pkg/third_party/svgpan/LICENSE new file mode 100644 index 00000000..35bc1745 --- /dev/null +++ b/plugin/debug/pkg/third_party/svgpan/LICENSE @@ -0,0 +1,27 @@ +Copyright 2009-2017 Andrea Leofreddi . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Andrea Leofreddi. diff --git a/plugin/debug/pkg/third_party/svgpan/svgpan.go b/plugin/debug/pkg/third_party/svgpan/svgpan.go new file mode 100644 index 00000000..afb124d4 --- /dev/null +++ b/plugin/debug/pkg/third_party/svgpan/svgpan.go @@ -0,0 +1,11 @@ +// SVG pan and zoom library. +// See copyright notice in string constant below. + +package svgpan + +import _ "embed" + +// https://github.com/aleofreddi/svgpan + +//go:embed svgpan.js +var JSSource string diff --git a/plugin/debug/pkg/third_party/svgpan/svgpan.js b/plugin/debug/pkg/third_party/svgpan/svgpan.js new file mode 100644 index 00000000..2c4951ec --- /dev/null +++ b/plugin/debug/pkg/third_party/svgpan/svgpan.js @@ -0,0 +1,261 @@ +/** + * SVGPan library 1.2.2 + * ====================== + * + * Given an unique existing element with id "viewport" (or when missing, the + * first g-element), including the the library into any SVG adds the following + * capabilities: + * + * - Mouse panning + * - Mouse zooming (using the wheel) + * - Object dragging + * + * You can configure the behaviour of the pan/zoom/drag with the variables + * listed in the CONFIGURATION section of this file. + * + * This code is licensed under the following BSD license: + * + * Copyright 2009-2019 Andrea Leofreddi . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Andrea Leofreddi. + */ + +"use strict"; + +/// CONFIGURATION +/// ====> + +var enablePan = 1; // 1 or 0: enable or disable panning (default enabled) +var enableZoom = 1; // 1 or 0: enable or disable zooming (default enabled) +var enableDrag = 0; // 1 or 0: enable or disable dragging (default disabled) +var zoomScale = 0.2; // Zoom sensitivity + +/// <==== +/// END OF CONFIGURATION + +var root = document.documentElement; +var state = 'none', svgRoot = null, stateTarget, stateOrigin, stateTf; + +setupHandlers(root); + +/** + * Register handlers + */ +function setupHandlers(root){ + setAttributes(root, { + "onmouseup" : "handleMouseUp(evt)", + "onmousedown" : "handleMouseDown(evt)", + "onmousemove" : "handleMouseMove(evt)", + //"onmouseout" : "handleMouseUp(evt)", // Decomment this to stop the pan functionality when dragging out of the SVG element + }); + + if(navigator.userAgent.toLowerCase().indexOf('webkit') >= 0) + window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + else + window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others +} + +/** + * Retrieves the root element for SVG manipulation. The element is then cached into the svgRoot global variable. + */ +function getRoot(root) { + if(svgRoot == null) { + var r = root.getElementById("viewport") ? root.getElementById("viewport") : root.documentElement, t = r; + + while(t != root) { + if(t.getAttribute("viewBox")) { + setCTM(r, t.getCTM()); + + t.removeAttribute("viewBox"); + } + + t = t.parentNode; + } + + svgRoot = r; + } + + return svgRoot; +} + +/** + * Instance an SVGPoint object with given event coordinates. + */ +function getEventPoint(evt) { + var p = root.createSVGPoint(); + + p.x = evt.clientX; + p.y = evt.clientY; + + return p; +} + +/** + * Sets the current transform matrix of an element. + */ +function setCTM(element, matrix) { + var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; + + element.setAttribute("transform", s); +} + +/** + * Dumps a matrix to a string (useful for debug). + */ +function dumpMatrix(matrix) { + var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]"; + + return s; +} + +/** + * Sets attributes of an element. + */ +function setAttributes(element, attributes){ + for (var i in attributes) + element.setAttributeNS(null, i, attributes[i]); +} + +/** + * Handle mouse wheel event. + */ +function handleMouseWheel(evt) { + if(!enableZoom) + return; + + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + var delta; + + if(evt.wheelDelta) + delta = evt.wheelDelta / 360; // Chrome/Safari + else + delta = evt.detail / -9; // Mozilla + + var z = Math.pow(1 + zoomScale, delta); + + var g = getRoot(svgDoc); + + var p = getEventPoint(evt); + + p = p.matrixTransform(g.getCTM().inverse()); + + // Compute new scale matrix in current mouse position + var k = root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y); + + setCTM(g, g.getCTM().multiply(k)); + + if(typeof(stateTf) == "undefined") + stateTf = g.getCTM().inverse(); + + stateTf = stateTf.multiply(k.inverse()); +} + +/** + * Handle mouse move event. + */ +function handleMouseMove(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + var g = getRoot(svgDoc); + + if(state == 'pan' && enablePan) { + // Pan mode + var p = getEventPoint(evt).matrixTransform(stateTf); + + setCTM(g, stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y)); + } else if(state == 'drag' && enableDrag) { + // Drag mode + var p = getEventPoint(evt).matrixTransform(g.getCTM().inverse()); + + setCTM(stateTarget, root.createSVGMatrix().translate(p.x - stateOrigin.x, p.y - stateOrigin.y).multiply(g.getCTM().inverse()).multiply(stateTarget.getCTM())); + + stateOrigin = p; + } +} + +/** + * Handle click event. + */ +function handleMouseDown(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + var g = getRoot(svgDoc); + + if( + evt.target.tagName == "svg" + || !enableDrag // Pan anyway when drag is disabled and the user clicked on an element + ) { + // Pan mode + state = 'pan'; + + stateTf = g.getCTM().inverse(); + + stateOrigin = getEventPoint(evt).matrixTransform(stateTf); + } else { + // Drag mode + state = 'drag'; + + stateTarget = evt.target; + + stateTf = g.getCTM().inverse(); + + stateOrigin = getEventPoint(evt).matrixTransform(stateTf); + } +} + +/** + * Handle mouse button release event. + */ +function handleMouseUp(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + if(state == 'pan' || state == 'drag') { + // Quit pan mode + state = ''; + } +} diff --git a/plugin/gb28181/api.go b/plugin/gb28181/api.go index 191a7bc6..f7562d11 100644 --- a/plugin/gb28181/api.go +++ b/plugin/gb28181/api.go @@ -3,14 +3,11 @@ package plugin_gb28181 import ( "context" "net/http" - "os" "strings" - "time" "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" - "m7s.live/v5" - "m7s.live/v5/pkg/util" + "m7s.live/v5/pkg/config" "m7s.live/v5/plugin/gb28181/pb" gb28181 "m7s.live/v5/plugin/gb28181/pkg" ) @@ -58,57 +55,21 @@ func (gb *GB28181Plugin) List(context.Context, *emptypb.Empty) (ret *pb.Response return } -func (gb *GB28181Plugin) replayPS(pub *m7s.Publisher, f *os.File) { - defer f.Close() - var t uint16 - puber := gb28181.NewPSPublisher(pub) - go puber.Demux() - defer close(puber.Receiver.FeedChan) - for l := make([]byte, 6); pub.State != m7s.PublisherStateDisposed; time.Sleep(time.Millisecond * time.Duration(t)) { - _, err := f.Read(l) - if err != nil { - return - } - payloadLen := util.ReadBE[int](l[:4]) - payload := make([]byte, payloadLen) - t = util.ReadBE[uint16](l[4:]) - _, err = f.Read(payload) - if err != nil { - return - } - if err = puber.Receiver.ReadRTP(payload); err != nil { - gb.Error("replayPS", "err", err) - } - if pub.IsStopped() { - return - } - } -} - func (gb *GB28181Plugin) api_ps_replay(w http.ResponseWriter, r *http.Request) { dump := r.URL.Query().Get("dump") streamPath := r.PathValue("streamPath") if dump == "" { dump = "dump/ps" } - f, err := os.OpenFile(dump, os.O_RDONLY, 0644) - if err != nil { - util.ReturnError(http.StatusInternalServerError, err.Error(), w, r) - } else { - if streamPath == "" { - if strings.HasPrefix(dump, "/") { - streamPath = "replay" + dump - } else { - streamPath = "replay/" + dump - } - } - var pub *m7s.Publisher - if pub, err = gb.Publish(gb.Context, streamPath); err == nil { - pub.Type = m7s.PublishTypeReplay - go gb.replayPS(pub, f) - util.ReturnOK(w, r) + if streamPath == "" { + if strings.HasPrefix(dump, "/") { + streamPath = "replay" + dump } else { - util.ReturnError(http.StatusInternalServerError, err.Error(), w, r) + streamPath = "replay/" + dump } } + var puller gb28181.DumpPuller + puller.GetPullJob().Init(&puller, &gb.Plugin, streamPath, config.Pull{ + URL: dump, + }, nil) } diff --git a/plugin/gb28181/pkg/transceiver.go b/plugin/gb28181/pkg/transceiver.go index 598c3b9f..02706dda 100644 --- a/plugin/gb28181/pkg/transceiver.go +++ b/plugin/gb28181/pkg/transceiver.go @@ -1,6 +1,7 @@ package gb28181 import ( + "errors" "net" "os" @@ -28,6 +29,8 @@ type PSPublisher struct { Receiver Receiver } +var ErrRTPReceiveLost = errors.New("rtp receive lost") + type Receiver struct { task.Task rtp.Packet @@ -136,9 +139,13 @@ func (dec *PSPublisher) decProgramStreamMap() (err error) { } func (p *Receiver) ReadRTP(rtp util.Buffer) (err error) { + lastSeq := p.SequenceNumber if err = p.Unmarshal(rtp); err != nil { return } + if p.SequenceNumber != lastSeq+1 { + return ErrRTPReceiveLost + } if p.Enabled(p, task.TraceLevel) { p.Trace("rtp", "len", rtp.Len(), "seq", p.SequenceNumber, "payloadType", p.PayloadType, "ssrc", p.SSRC) } diff --git a/server.go b/server.go index c83554ad..4c4624fd 100644 --- a/server.go +++ b/server.go @@ -59,7 +59,7 @@ type ( PulseInterval time.Duration `default:"5s" desc:"心跳事件间隔"` //心跳事件间隔 DisableAll bool `default:"false" desc:"禁用所有插件"` //禁用所有插件 StreamAlias map[config.Regexp]string `desc:"流别名"` - Device []*PullProxy + PullProxy []*PullProxy } WaitStream struct { StreamPath string @@ -328,7 +328,7 @@ func (s *Server) Start() (err error) { if s.DB != nil { s.DB.AutoMigrate(&PullProxy{}) } - for _, d := range s.Device { + for _, d := range s.PullProxy { if d.ID != 0 { d.server = s if d.Type == "" {

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"Y9US`&ow}aGA-n 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 K#jO?oYb5~W`@UTO literal 0 HcmV?d00001 diff --git a/plugin/debug/pkg/internal/report/package.go b/plugin/debug/pkg/internal/report/package.go new file mode 100644 index 00000000..0f6dcf53 --- /dev/null +++ b/plugin/debug/pkg/internal/report/package.go @@ -0,0 +1,17 @@ +package report + +import "regexp" + +// pkgRE extracts package name, It looks for the first "." or "::" that occurs +// after the last "/". (Searching after the last / allows us to correctly handle +// names that look like "some.url.com/foo.bar".) +var pkgRE = regexp.MustCompile(`^((.*/)?[\w\d_]+)(\.|::)([^/]*)$`) + +// packageName returns the package name of the named symbol, or "" if not found. +func packageName(name string) string { + m := pkgRE.FindStringSubmatch(name) + if m == nil { + return "" + } + return m[1] +} diff --git a/plugin/debug/pkg/internal/report/package_test.go b/plugin/debug/pkg/internal/report/package_test.go new file mode 100644 index 00000000..62e5196d --- /dev/null +++ b/plugin/debug/pkg/internal/report/package_test.go @@ -0,0 +1,52 @@ +package report + +import ( + "testing" +) + +func TestPackageName(t *testing.T) { + type testCase struct { + name string + expect string + } + + for _, c := range []testCase{ + // Unrecognized packages: + {``, ``}, + {`name`, ``}, + {`[libjvm.so]`, ``}, + {`prefix/name/suffix`, ``}, + {`prefix(a.b.c,x.y.z)`, ``}, + {`.a.b`, ``}, + {`(a.b)`, ``}, + + // C++ symbols: + {`Math.number`, `Math`}, + {`std::vector`, `std`}, + {`std::internal::vector`, `std`}, + + // Java symbols: + {`pkg.Class.name`, `pkg`}, + {`pkg.pkg.Class.name`, `pkg`}, + {`pkg.Class.name(a.b.c, x.y.z)`, `pkg`}, + {`pkg.pkg.Class.`, `pkg`}, + {`pkg.pkg.Class.(a.b.c, x.y.z)`, `pkg`}, + + // Go symbols: + {`pkg.name`, `pkg`}, + {`pkg.(*type).name`, `pkg`}, + {`path/pkg.name`, `path/pkg`}, + {`path/pkg.(*type).name`, `path/pkg`}, + {`path/path/pkg.name`, `path/path/pkg`}, + {`path/path/pkg.(*type).name`, `path/path/pkg`}, + {`some.url.com/path/pkg.fnID`, `some.url.com/path/pkg`}, + {`parent-dir/dir/google.golang.org/grpc/transport.NewFramer`, `parent-dir/dir/google.golang.org/grpc/transport`}, + {`parent-dir/dir/google.golang.org/grpc.(*Server).handleRawConn`, `parent-dir/dir/google.golang.org/grpc`}, + } { + t.Run(c.name, func(t *testing.T) { + if got := packageName(c.name); got != c.expect { + t.Errorf("packageName(%q) = %#v, expecting %#v", c.name, got, c.expect) + } + }) + } +} diff --git a/plugin/debug/pkg/internal/report/report.go b/plugin/debug/pkg/internal/report/report.go new file mode 100644 index 00000000..ac2f1e7f --- /dev/null +++ b/plugin/debug/pkg/internal/report/report.go @@ -0,0 +1,1359 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package report summarizes a performance profile into a +// human-readable report. +package report + +import ( + "fmt" + "io" + "net/url" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + "text/tabwriter" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/graph" + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// Output formats. +const ( + Callgrind = iota + Comments + Dis + Dot + List + Proto + Raw + Tags + Text + TopProto + Traces + Tree + WebList +) + +// Options are the formatting and filtering options used to generate a +// profile. +type Options struct { + OutputFormat int + + CumSort bool + CallTree bool + DropNegative bool + CompactLabels bool + Ratio float64 + Title string + ProfileLabels []string + ActiveFilters []string + NumLabelUnits map[string]string + + NodeCount int + NodeFraction float64 + EdgeFraction float64 + + SampleValue func(s []int64) int64 + SampleMeanDivisor func(s []int64) int64 + SampleType string + SampleUnit string // Unit for the sample data from the profile. + + OutputUnit string // Units for data formatting in report. + + Symbol *regexp.Regexp // Symbols to include on disassembly report. + SourcePath string // Search path for source files. + TrimPath string // Paths to trim from source file paths. + + IntelSyntax bool // Whether or not to print assembly in Intel syntax. +} + +// Generate generates a report as directed by the Report. +func Generate(w io.Writer, rpt *Report, obj plugin.ObjTool) error { + o := rpt.options + + switch o.OutputFormat { + case Comments: + return printComments(w, rpt) + case Dot: + return printDOT(w, rpt) + case Tree: + return printTree(w, rpt) + case Text: + return printText(w, rpt) + case Traces: + return printTraces(w, rpt) + case Raw: + fmt.Fprint(w, rpt.prof.String()) + return nil + case Tags: + return printTags(w, rpt) + case Proto: + return printProto(w, rpt) + case TopProto: + return printTopProto(w, rpt) + case Dis: + return printAssembly(w, rpt, obj) + case List: + return printSource(w, rpt) + case Callgrind: + return printCallgrind(w, rpt) + } + // Note: WebList handling is in driver package. + return fmt.Errorf("unexpected output format %v", o.OutputFormat) +} + +// newTrimmedGraph creates a graph for this report, trimmed according +// to the report options. +func (rpt *Report) newTrimmedGraph() (g *graph.Graph, origCount, droppedNodes, droppedEdges int) { + o := rpt.options + + // Build a graph and refine it. On each refinement step we must rebuild the graph from the samples, + // as the graph itself doesn't contain enough information to preserve full precision. + visualMode := o.OutputFormat == Dot + cumSort := o.CumSort + + // The call_tree option is only honored when generating visual representations of the callgraph. + callTree := o.CallTree && (o.OutputFormat == Dot || o.OutputFormat == Callgrind) + + // First step: Build complete graph to identify low frequency nodes, based on their cum weight. + g = rpt.newGraph(nil) + totalValue, _ := g.Nodes.Sum() + nodeCutoff := abs64(int64(float64(totalValue) * o.NodeFraction)) + edgeCutoff := abs64(int64(float64(totalValue) * o.EdgeFraction)) + + // Filter out nodes with cum value below nodeCutoff. + if nodeCutoff > 0 { + if callTree { + if nodesKept := g.DiscardLowFrequencyNodePtrs(nodeCutoff); len(g.Nodes) != len(nodesKept) { + droppedNodes = len(g.Nodes) - len(nodesKept) + g.TrimTree(nodesKept) + } + } else { + if nodesKept := g.DiscardLowFrequencyNodes(nodeCutoff); len(g.Nodes) != len(nodesKept) { + droppedNodes = len(g.Nodes) - len(nodesKept) + g = rpt.newGraph(nodesKept) + } + } + } + origCount = len(g.Nodes) + + // Second step: Limit the total number of nodes. Apply specialized heuristics to improve + // visualization when generating dot output. + g.SortNodes(cumSort, visualMode) + if nodeCount := o.NodeCount; nodeCount > 0 { + // Remove low frequency tags and edges as they affect selection. + g.TrimLowFrequencyTags(nodeCutoff) + g.TrimLowFrequencyEdges(edgeCutoff) + if callTree { + if nodesKept := g.SelectTopNodePtrs(nodeCount, visualMode); len(g.Nodes) != len(nodesKept) { + g.TrimTree(nodesKept) + g.SortNodes(cumSort, visualMode) + } + } else { + if nodesKept := g.SelectTopNodes(nodeCount, visualMode); len(g.Nodes) != len(nodesKept) { + g = rpt.newGraph(nodesKept) + g.SortNodes(cumSort, visualMode) + } + } + } + + // Final step: Filter out low frequency tags and edges, and remove redundant edges that clutter + // the graph. + g.TrimLowFrequencyTags(nodeCutoff) + droppedEdges = g.TrimLowFrequencyEdges(edgeCutoff) + if visualMode { + g.RemoveRedundantEdges() + } + return +} + +func (rpt *Report) selectOutputUnit(g *graph.Graph) { + o := rpt.options + + // Select best unit for profile output. + // Find the appropriate units for the smallest non-zero sample + if o.OutputUnit != "minimum" || len(g.Nodes) == 0 { + return + } + var minValue int64 + + for _, n := range g.Nodes { + nodeMin := abs64(n.FlatValue()) + if nodeMin == 0 { + nodeMin = abs64(n.CumValue()) + } + if nodeMin > 0 && (minValue == 0 || nodeMin < minValue) { + minValue = nodeMin + } + } + maxValue := rpt.total + if minValue == 0 { + minValue = maxValue + } + + if r := o.Ratio; r > 0 && r != 1 { + minValue = int64(float64(minValue) * r) + maxValue = int64(float64(maxValue) * r) + } + + _, minUnit := measurement.Scale(minValue, o.SampleUnit, "minimum") + _, maxUnit := measurement.Scale(maxValue, o.SampleUnit, "minimum") + + unit := minUnit + if minUnit != maxUnit && minValue*100 < maxValue && o.OutputFormat != Callgrind { + // Minimum and maximum values have different units. Scale + // minimum by 100 to use larger units, allowing minimum value to + // be scaled down to 0.01, except for callgrind reports since + // they can only represent integer values. + _, unit = measurement.Scale(100*minValue, o.SampleUnit, "minimum") + } + + if unit != "" { + o.OutputUnit = unit + } else { + o.OutputUnit = o.SampleUnit + } +} + +// newGraph creates a new graph for this report. If nodes is non-nil, +// only nodes whose info matches are included. Otherwise, all nodes +// are included, without trimming. +func (rpt *Report) newGraph(nodes graph.NodeSet) *graph.Graph { + o := rpt.options + + // Clean up file paths using heuristics. + prof := rpt.prof + for _, f := range prof.Function { + f.Filename = trimPath(f.Filename, o.TrimPath, o.SourcePath) + } + // Removes all numeric tags except for the bytes tag prior + // to making graph. + // TODO: modify to select first numeric tag if no bytes tag + for _, s := range prof.Sample { + numLabels := make(map[string][]int64, len(s.NumLabel)) + numUnits := make(map[string][]string, len(s.NumLabel)) + for k, vs := range s.NumLabel { + if k == "bytes" { + unit := o.NumLabelUnits[k] + numValues := make([]int64, len(vs)) + numUnit := make([]string, len(vs)) + for i, v := range vs { + numValues[i] = v + numUnit[i] = unit + } + numLabels[k] = append(numLabels[k], numValues...) + numUnits[k] = append(numUnits[k], numUnit...) + } + } + s.NumLabel = numLabels + s.NumUnit = numUnits + } + + // Remove label marking samples from the base profiles, so it does not appear + // as a nodelet in the graph view. + prof.RemoveLabel("pprof::base") + + formatTag := func(v int64, key string) string { + return measurement.ScaledLabel(v, key, o.OutputUnit) + } + + gopt := &graph.Options{ + SampleValue: o.SampleValue, + SampleMeanDivisor: o.SampleMeanDivisor, + FormatTag: formatTag, + CallTree: o.CallTree && (o.OutputFormat == Dot || o.OutputFormat == Callgrind), + DropNegative: o.DropNegative, + KeptNodes: nodes, + } + + // Only keep binary names for disassembly-based reports, otherwise + // remove it to allow merging of functions across binaries. + switch o.OutputFormat { + case Raw, List, WebList, Dis, Callgrind: + gopt.ObjNames = true + } + + return graph.New(rpt.prof, gopt) +} + +// printProto writes the incoming proto via the writer w. +// If the divide_by option has been specified, samples are scaled appropriately. +func printProto(w io.Writer, rpt *Report) error { + p, o := rpt.prof, rpt.options + + // Apply the sample ratio to all samples before saving the profile. + if r := o.Ratio; r > 0 && r != 1 { + for _, sample := range p.Sample { + for i, v := range sample.Value { + sample.Value[i] = int64(float64(v) * r) + } + } + } + return p.Write(w) +} + +// printTopProto writes a list of the hottest routines in a profile as a profile.proto. +func printTopProto(w io.Writer, rpt *Report) error { + p := rpt.prof + o := rpt.options + g, _, _, _ := rpt.newTrimmedGraph() + rpt.selectOutputUnit(g) + + out := profile.Profile{ + SampleType: []*profile.ValueType{ + {Type: "cum", Unit: o.OutputUnit}, + {Type: "flat", Unit: o.OutputUnit}, + }, + TimeNanos: p.TimeNanos, + DurationNanos: p.DurationNanos, + PeriodType: p.PeriodType, + Period: p.Period, + } + functionMap := make(functionMap) + for i, n := range g.Nodes { + f, added := functionMap.findOrAdd(n.Info) + if added { + out.Function = append(out.Function, f) + } + flat, cum := n.FlatValue(), n.CumValue() + l := &profile.Location{ + ID: uint64(i + 1), + Address: n.Info.Address, + Line: []profile.Line{ + { + Line: int64(n.Info.Lineno), + Column: int64(n.Info.Columnno), + Function: f, + }, + }, + } + + fv, _ := measurement.Scale(flat, o.SampleUnit, o.OutputUnit) + cv, _ := measurement.Scale(cum, o.SampleUnit, o.OutputUnit) + s := &profile.Sample{ + Location: []*profile.Location{l}, + Value: []int64{int64(cv), int64(fv)}, + } + out.Location = append(out.Location, l) + out.Sample = append(out.Sample, s) + } + + return out.Write(w) +} + +type functionMap map[string]*profile.Function + +// findOrAdd takes a node representing a function, adds the function +// represented by the node to the map if the function is not already present, +// and returns the function the node represents. This also returns a boolean, +// which is true if the function was added and false otherwise. +func (fm functionMap) findOrAdd(ni graph.NodeInfo) (*profile.Function, bool) { + fName := fmt.Sprintf("%q%q%q%d", ni.Name, ni.OrigName, ni.File, ni.StartLine) + + if f := fm[fName]; f != nil { + return f, false + } + + f := &profile.Function{ + ID: uint64(len(fm) + 1), + Name: ni.Name, + SystemName: ni.OrigName, + Filename: ni.File, + StartLine: int64(ni.StartLine), + } + fm[fName] = f + return f, true +} + +// printAssembly prints an annotated assembly listing. +func printAssembly(w io.Writer, rpt *Report, obj plugin.ObjTool) error { + return PrintAssembly(w, rpt, obj, -1) +} + +// PrintAssembly prints annotated disassembly of rpt to w. +func PrintAssembly(w io.Writer, rpt *Report, obj plugin.ObjTool, maxFuncs int) error { + o := rpt.options + prof := rpt.prof + + g := rpt.newGraph(nil) + + // If the regexp source can be parsed as an address, also match + // functions that land on that address. + var address *uint64 + if hex, err := strconv.ParseUint(o.Symbol.String(), 0, 64); err == nil { + address = &hex + } + + fmt.Fprintln(w, "Total:", rpt.formatValue(rpt.total)) + symbols := symbolsFromBinaries(prof, g, o.Symbol, address, obj) + symNodes := nodesPerSymbol(g.Nodes, symbols) + + // Sort for printing. + var syms []*objSymbol + for s := range symNodes { + syms = append(syms, s) + } + byName := func(a, b *objSymbol) bool { + if na, nb := a.sym.Name[0], b.sym.Name[0]; na != nb { + return na < nb + } + return a.sym.Start < b.sym.Start + } + if maxFuncs < 0 { + sort.Sort(orderSyms{syms, byName}) + } else { + byFlatSum := func(a, b *objSymbol) bool { + suma, _ := symNodes[a].Sum() + sumb, _ := symNodes[b].Sum() + if suma != sumb { + return suma > sumb + } + return byName(a, b) + } + sort.Sort(orderSyms{syms, byFlatSum}) + if len(syms) > maxFuncs { + syms = syms[:maxFuncs] + } + } + + if len(syms) == 0 { + // The symbol regexp case + if address == nil { + return fmt.Errorf("no matches found for regexp %s", o.Symbol) + } + + // The address case + if len(symbols) == 0 { + return fmt.Errorf("no matches found for address 0x%x", *address) + } + return fmt.Errorf("address 0x%x found in binary, but the corresponding symbols do not have samples in the profile", *address) + } + + // Correlate the symbols from the binary with the profile samples. + for _, s := range syms { + sns := symNodes[s] + + // Gather samples for this symbol. + flatSum, cumSum := sns.Sum() + + // Get the function assembly. + insts, err := obj.Disasm(s.sym.File, s.sym.Start, s.sym.End, o.IntelSyntax) + if err != nil { + return err + } + + ns := annotateAssembly(insts, sns, s.file) + + fmt.Fprintf(w, "ROUTINE ======================== %s\n", s.sym.Name[0]) + for _, name := range s.sym.Name[1:] { + fmt.Fprintf(w, " AKA ======================== %s\n", name) + } + fmt.Fprintf(w, "%10s %10s (flat, cum) %s of Total\n", + rpt.formatValue(flatSum), rpt.formatValue(cumSum), + measurement.Percentage(cumSum, rpt.total)) + + function, file, line := "", "", 0 + for _, n := range ns { + locStr := "" + // Skip loc information if it hasn't changed from previous instruction. + if n.function != function || n.file != file || n.line != line { + function, file, line = n.function, n.file, n.line + if n.function != "" { + locStr = n.function + " " + } + if n.file != "" { + locStr += n.file + if n.line != 0 { + locStr += fmt.Sprintf(":%d", n.line) + } + } + } + switch { + case locStr == "": + // No location info, just print the instruction. + fmt.Fprintf(w, "%10s %10s %10x: %s\n", + valueOrDot(n.flatValue(), rpt), + valueOrDot(n.cumValue(), rpt), + n.address, n.instruction, + ) + case len(n.instruction) < 40: + // Short instruction, print loc on the same line. + fmt.Fprintf(w, "%10s %10s %10x: %-40s;%s\n", + valueOrDot(n.flatValue(), rpt), + valueOrDot(n.cumValue(), rpt), + n.address, n.instruction, + locStr, + ) + default: + // Long instruction, print loc on a separate line. + fmt.Fprintf(w, "%74s;%s\n", "", locStr) + fmt.Fprintf(w, "%10s %10s %10x: %s\n", + valueOrDot(n.flatValue(), rpt), + valueOrDot(n.cumValue(), rpt), + n.address, n.instruction, + ) + } + } + } + return nil +} + +// symbolsFromBinaries examines the binaries listed on the profile that have +// associated samples, and returns the identified symbols matching rx. +func symbolsFromBinaries(prof *profile.Profile, g *graph.Graph, rx *regexp.Regexp, address *uint64, obj plugin.ObjTool) []*objSymbol { + // fileHasSamplesAndMatched is for optimization to speed up pprof: when later + // walking through the profile mappings, it will only examine the ones that have + // samples and are matched to the regexp. + fileHasSamplesAndMatched := make(map[string]bool) + for _, n := range g.Nodes { + if name := n.Info.PrintableName(); rx.MatchString(name) && n.Info.Objfile != "" { + fileHasSamplesAndMatched[n.Info.Objfile] = true + } + } + + // Walk all mappings looking for matching functions with samples. + var objSyms []*objSymbol + for _, m := range prof.Mapping { + // Skip the mapping if its file does not have samples or is not matched to + // the regexp (unless the regexp is an address and the mapping's range covers + // the address) + if !fileHasSamplesAndMatched[m.File] { + if address == nil || !(m.Start <= *address && *address <= m.Limit) { + continue + } + } + + f, err := obj.Open(m.File, m.Start, m.Limit, m.Offset, m.KernelRelocationSymbol) + if err != nil { + fmt.Printf("%v\n", err) + continue + } + + // Find symbols in this binary matching the user regexp. + var addr uint64 + if address != nil { + addr = *address + } + msyms, err := f.Symbols(rx, addr) + f.Close() + if err != nil { + continue + } + for _, ms := range msyms { + objSyms = append(objSyms, + &objSymbol{ + sym: ms, + file: f, + }, + ) + } + } + + return objSyms +} + +// objSym represents a symbol identified from a binary. It includes +// the SymbolInfo from the disasm package and the base that must be +// added to correspond to sample addresses +type objSymbol struct { + sym *plugin.Sym + file plugin.ObjFile +} + +// orderSyms is a wrapper type to sort []*objSymbol by a supplied comparator. +type orderSyms struct { + v []*objSymbol + less func(a, b *objSymbol) bool +} + +func (o orderSyms) Len() int { return len(o.v) } +func (o orderSyms) Less(i, j int) bool { return o.less(o.v[i], o.v[j]) } +func (o orderSyms) Swap(i, j int) { o.v[i], o.v[j] = o.v[j], o.v[i] } + +// nodesPerSymbol classifies nodes into a group of symbols. +func nodesPerSymbol(ns graph.Nodes, symbols []*objSymbol) map[*objSymbol]graph.Nodes { + symNodes := make(map[*objSymbol]graph.Nodes) + for _, s := range symbols { + // Gather samples for this symbol. + for _, n := range ns { + if address, err := s.file.ObjAddr(n.Info.Address); err == nil && address >= s.sym.Start && address < s.sym.End { + symNodes[s] = append(symNodes[s], n) + } + } + } + return symNodes +} + +type assemblyInstruction struct { + address uint64 + instruction string + function string + file string + line int + flat, cum int64 + flatDiv, cumDiv int64 + startsBlock bool + inlineCalls []callID +} + +type callID struct { + file string + line int +} + +func (a *assemblyInstruction) flatValue() int64 { + if a.flatDiv != 0 { + return a.flat / a.flatDiv + } + return a.flat +} + +func (a *assemblyInstruction) cumValue() int64 { + if a.cumDiv != 0 { + return a.cum / a.cumDiv + } + return a.cum +} + +// annotateAssembly annotates a set of assembly instructions with a +// set of samples. It returns a set of nodes to display. base is an +// offset to adjust the sample addresses. +func annotateAssembly(insts []plugin.Inst, samples graph.Nodes, file plugin.ObjFile) []assemblyInstruction { + // Add end marker to simplify printing loop. + insts = append(insts, plugin.Inst{ + Addr: ^uint64(0), + }) + + // Ensure samples are sorted by address. + samples.Sort(graph.AddressOrder) + + s := 0 + asm := make([]assemblyInstruction, 0, len(insts)) + for ix, in := range insts[:len(insts)-1] { + n := assemblyInstruction{ + address: in.Addr, + instruction: in.Text, + function: in.Function, + line: in.Line, + } + if in.File != "" { + n.file = filepath.Base(in.File) + } + + // Sum all the samples until the next instruction (to account + // for samples attributed to the middle of an instruction). + for next := insts[ix+1].Addr; s < len(samples); s++ { + if addr, err := file.ObjAddr(samples[s].Info.Address); err != nil || addr >= next { + break + } + sample := samples[s] + n.flatDiv += sample.FlatDiv + n.flat += sample.Flat + n.cumDiv += sample.CumDiv + n.cum += sample.Cum + if f := sample.Info.File; f != "" && n.file == "" { + n.file = filepath.Base(f) + } + if ln := sample.Info.Lineno; ln != 0 && n.line == 0 { + n.line = ln + } + if f := sample.Info.Name; f != "" && n.function == "" { + n.function = f + } + } + asm = append(asm, n) + } + + return asm +} + +// valueOrDot formats a value according to a report, intercepting zero +// values. +func valueOrDot(value int64, rpt *Report) string { + if value == 0 { + return "." + } + return rpt.formatValue(value) +} + +// printTags collects all tags referenced in the profile and prints +// them in a sorted table. +func printTags(w io.Writer, rpt *Report) error { + p := rpt.prof + + o := rpt.options + formatTag := func(v int64, key string) string { + return measurement.ScaledLabel(v, key, o.OutputUnit) + } + + // Hashtable to keep accumulate tags as key,value,count. + tagMap := make(map[string]map[string]int64) + for _, s := range p.Sample { + for key, vals := range s.Label { + for _, val := range vals { + valueMap, ok := tagMap[key] + if !ok { + valueMap = make(map[string]int64) + tagMap[key] = valueMap + } + valueMap[val] += o.SampleValue(s.Value) + } + } + for key, vals := range s.NumLabel { + unit := o.NumLabelUnits[key] + for _, nval := range vals { + val := formatTag(nval, unit) + valueMap, ok := tagMap[key] + if !ok { + valueMap = make(map[string]int64) + tagMap[key] = valueMap + } + valueMap[val] += o.SampleValue(s.Value) + } + } + } + + tagKeys := make([]*graph.Tag, 0, len(tagMap)) + for key := range tagMap { + tagKeys = append(tagKeys, &graph.Tag{Name: key}) + } + tabw := tabwriter.NewWriter(w, 0, 0, 1, ' ', tabwriter.AlignRight) + for _, tagKey := range graph.SortTags(tagKeys, true) { + var total int64 + key := tagKey.Name + tags := make([]*graph.Tag, 0, len(tagMap[key])) + for t, c := range tagMap[key] { + total += c + tags = append(tags, &graph.Tag{Name: t, Flat: c}) + } + + f, u := measurement.Scale(total, o.SampleUnit, o.OutputUnit) + fmt.Fprintf(tabw, "%s:\t Total %.1f%s\n", key, f, u) + for _, t := range graph.SortTags(tags, true) { + f, u := measurement.Scale(t.FlatValue(), o.SampleUnit, o.OutputUnit) + if total > 0 { + fmt.Fprintf(tabw, " \t%.1f%s (%s):\t %s\n", f, u, measurement.Percentage(t.FlatValue(), total), t.Name) + } else { + fmt.Fprintf(tabw, " \t%.1f%s:\t %s\n", f, u, t.Name) + } + } + fmt.Fprintln(tabw) + } + return tabw.Flush() +} + +// printComments prints all freeform comments in the profile. +func printComments(w io.Writer, rpt *Report) error { + p := rpt.prof + + for _, c := range p.Comments { + fmt.Fprintln(w, c) + } + return nil +} + +// TextItem holds a single text report entry. +type TextItem struct { + Name string + InlineLabel string // Not empty if inlined + Flat, Cum int64 // Raw values + FlatFormat, CumFormat string // Formatted values +} + +// TextItems returns a list of text items from the report and a list +// of labels that describe the report. +func TextItems(rpt *Report) ([]TextItem, []string) { + g, origCount, droppedNodes, _ := rpt.newTrimmedGraph() + rpt.selectOutputUnit(g) + labels := reportLabels(rpt, graphTotal(g), len(g.Nodes), origCount, droppedNodes, 0, false) + + var items []TextItem + var flatSum int64 + for _, n := range g.Nodes { + name, flat, cum := n.Info.PrintableName(), n.FlatValue(), n.CumValue() + + var inline, noinline bool + for _, e := range n.In { + if e.Inline { + inline = true + } else { + noinline = true + } + } + + var inl string + if inline { + if noinline { + inl = "(partial-inline)" + } else { + inl = "(inline)" + } + } + + flatSum += flat + items = append(items, TextItem{ + Name: name, + InlineLabel: inl, + Flat: flat, + Cum: cum, + FlatFormat: rpt.formatValue(flat), + CumFormat: rpt.formatValue(cum), + }) + } + return items, labels +} + +// printText prints a flat text report for a profile. +func printText(w io.Writer, rpt *Report) error { + items, labels := TextItems(rpt) + fmt.Fprintln(w, strings.Join(labels, "\n")) + fmt.Fprintf(w, "%10s %5s%% %5s%% %10s %5s%%\n", + "flat", "flat", "sum", "cum", "cum") + var flatSum int64 + for _, item := range items { + inl := item.InlineLabel + if inl != "" { + inl = " " + inl + } + flatSum += item.Flat + fmt.Fprintf(w, "%10s %s %s %10s %s %s%s\n", + item.FlatFormat, measurement.Percentage(item.Flat, rpt.total), + measurement.Percentage(flatSum, rpt.total), + item.CumFormat, measurement.Percentage(item.Cum, rpt.total), + item.Name, inl) + } + return nil +} + +// printTraces prints all traces from a profile. +func printTraces(w io.Writer, rpt *Report) error { + fmt.Fprintln(w, strings.Join(ProfileLabels(rpt), "\n")) + + prof := rpt.prof + o := rpt.options + + const separator = "-----------+-------------------------------------------------------" + + _, locations := graph.CreateNodes(prof, &graph.Options{}) + for _, sample := range prof.Sample { + type stk struct { + *graph.NodeInfo + inline bool + } + var stack []stk + for _, loc := range sample.Location { + nodes := locations[loc.ID] + for i, n := range nodes { + // The inline flag may be inaccurate if 'show' or 'hide' filter is + // used. See https://m7s.live/v5/plugin/debug/pkg/issues/511. + inline := i != len(nodes)-1 + stack = append(stack, stk{&n.Info, inline}) + } + } + + if len(stack) == 0 { + continue + } + + fmt.Fprintln(w, separator) + // Print any text labels for the sample. + var labels []string + for s, vs := range sample.Label { + labels = append(labels, fmt.Sprintf("%10s: %s\n", s, strings.Join(vs, " "))) + } + sort.Strings(labels) + fmt.Fprint(w, strings.Join(labels, "")) + + // Print any numeric labels for the sample + var numLabels []string + for key, vals := range sample.NumLabel { + unit := o.NumLabelUnits[key] + numValues := make([]string, len(vals)) + for i, vv := range vals { + numValues[i] = measurement.Label(vv, unit) + } + numLabels = append(numLabels, fmt.Sprintf("%10s: %s\n", key, strings.Join(numValues, " "))) + } + sort.Strings(numLabels) + fmt.Fprint(w, strings.Join(numLabels, "")) + + var d, v int64 + v = o.SampleValue(sample.Value) + if o.SampleMeanDivisor != nil { + d = o.SampleMeanDivisor(sample.Value) + } + // Print call stack. + if d != 0 { + v = v / d + } + for i, s := range stack { + var vs, inline string + if i == 0 { + vs = rpt.formatValue(v) + } + if s.inline { + inline = " (inline)" + } + fmt.Fprintf(w, "%10s %s%s\n", vs, s.PrintableName(), inline) + } + } + fmt.Fprintln(w, separator) + return nil +} + +// printCallgrind prints a graph for a profile on callgrind format. +func printCallgrind(w io.Writer, rpt *Report) error { + o := rpt.options + rpt.options.NodeFraction = 0 + rpt.options.EdgeFraction = 0 + rpt.options.NodeCount = 0 + + g, _, _, _ := rpt.newTrimmedGraph() + rpt.selectOutputUnit(g) + + nodeNames := getDisambiguatedNames(g) + + fmt.Fprintln(w, "positions: instr line") + fmt.Fprintln(w, "events:", o.SampleType+"("+o.OutputUnit+")") + + objfiles := make(map[string]int) + files := make(map[string]int) + names := make(map[string]int) + + // prevInfo points to the previous NodeInfo. + // It is used to group cost lines together as much as possible. + var prevInfo *graph.NodeInfo + for _, n := range g.Nodes { + if prevInfo == nil || n.Info.Objfile != prevInfo.Objfile || n.Info.File != prevInfo.File || n.Info.Name != prevInfo.Name { + fmt.Fprintln(w) + fmt.Fprintln(w, "ob="+callgrindName(objfiles, n.Info.Objfile)) + fmt.Fprintln(w, "fl="+callgrindName(files, n.Info.File)) + fmt.Fprintln(w, "fn="+callgrindName(names, n.Info.Name)) + } + + addr := callgrindAddress(prevInfo, n.Info.Address) + sv, _ := measurement.Scale(n.FlatValue(), o.SampleUnit, o.OutputUnit) + fmt.Fprintf(w, "%s %d %d\n", addr, n.Info.Lineno, int64(sv)) + + // Print outgoing edges. + for _, out := range n.Out.Sort() { + c, _ := measurement.Scale(out.Weight, o.SampleUnit, o.OutputUnit) + callee := out.Dest + fmt.Fprintln(w, "cfl="+callgrindName(files, callee.Info.File)) + fmt.Fprintln(w, "cfn="+callgrindName(names, nodeNames[callee])) + // pprof doesn't have a flat weight for a call, leave as 0. + fmt.Fprintf(w, "calls=0 %s %d\n", callgrindAddress(prevInfo, callee.Info.Address), callee.Info.Lineno) + // TODO: This address may be in the middle of a call + // instruction. It would be best to find the beginning + // of the instruction, but the tools seem to handle + // this OK. + fmt.Fprintf(w, "* * %d\n", int64(c)) + } + + prevInfo = &n.Info + } + + return nil +} + +// getDisambiguatedNames returns a map from each node in the graph to +// the name to use in the callgrind output. Callgrind merges all +// functions with the same [file name, function name]. Add a [%d/n] +// suffix to disambiguate nodes with different values of +// node.Function, which we want to keep separate. In particular, this +// affects graphs created with --call_tree, where nodes from different +// contexts are associated to different Functions. +func getDisambiguatedNames(g *graph.Graph) map[*graph.Node]string { + nodeName := make(map[*graph.Node]string, len(g.Nodes)) + + type names struct { + file, function string + } + + // nameFunctionIndex maps the callgrind names (filename, function) + // to the node.Function values found for that name, and each + // node.Function value to a sequential index to be used on the + // disambiguated name. + nameFunctionIndex := make(map[names]map[*graph.Node]int) + for _, n := range g.Nodes { + nm := names{n.Info.File, n.Info.Name} + p, ok := nameFunctionIndex[nm] + if !ok { + p = make(map[*graph.Node]int) + nameFunctionIndex[nm] = p + } + if _, ok := p[n.Function]; !ok { + p[n.Function] = len(p) + } + } + + for _, n := range g.Nodes { + nm := names{n.Info.File, n.Info.Name} + nodeName[n] = n.Info.Name + if p := nameFunctionIndex[nm]; len(p) > 1 { + // If there is more than one function, add suffix to disambiguate. + nodeName[n] += fmt.Sprintf(" [%d/%d]", p[n.Function]+1, len(p)) + } + } + return nodeName +} + +// callgrindName implements the callgrind naming compression scheme. +// For names not previously seen returns "(N) name", where N is a +// unique index. For names previously seen returns "(N)" where N is +// the index returned the first time. +func callgrindName(names map[string]int, name string) string { + if name == "" { + return "" + } + if id, ok := names[name]; ok { + return fmt.Sprintf("(%d)", id) + } + id := len(names) + 1 + names[name] = id + return fmt.Sprintf("(%d) %s", id, name) +} + +// callgrindAddress implements the callgrind subposition compression scheme if +// possible. If prevInfo != nil, it contains the previous address. The current +// address can be given relative to the previous address, with an explicit +/- +// to indicate it is relative, or * for the same address. +func callgrindAddress(prevInfo *graph.NodeInfo, curr uint64) string { + abs := fmt.Sprintf("%#x", curr) + if prevInfo == nil { + return abs + } + + prev := prevInfo.Address + if prev == curr { + return "*" + } + + diff := int64(curr - prev) + relative := fmt.Sprintf("%+d", diff) + + // Only bother to use the relative address if it is actually shorter. + if len(relative) < len(abs) { + return relative + } + + return abs +} + +// printTree prints a tree-based report in text form. +func printTree(w io.Writer, rpt *Report) error { + const separator = "----------------------------------------------------------+-------------" + const legend = " flat flat% sum% cum cum% calls calls% + context " + + g, origCount, droppedNodes, _ := rpt.newTrimmedGraph() + rpt.selectOutputUnit(g) + + fmt.Fprintln(w, strings.Join(reportLabels(rpt, graphTotal(g), len(g.Nodes), origCount, droppedNodes, 0, false), "\n")) + + fmt.Fprintln(w, separator) + fmt.Fprintln(w, legend) + var flatSum int64 + + rx := rpt.options.Symbol + matched := 0 + for _, n := range g.Nodes { + name, flat, cum := n.Info.PrintableName(), n.FlatValue(), n.CumValue() + + // Skip any entries that do not match the regexp (for the "peek" command). + if rx != nil && !rx.MatchString(name) { + continue + } + matched++ + + fmt.Fprintln(w, separator) + // Print incoming edges. + inEdges := n.In.Sort() + for _, in := range inEdges { + var inline string + if in.Inline { + inline = " (inline)" + } + fmt.Fprintf(w, "%50s %s | %s%s\n", rpt.formatValue(in.Weight), + measurement.Percentage(in.Weight, cum), in.Src.Info.PrintableName(), inline) + } + + // Print current node. + flatSum += flat + fmt.Fprintf(w, "%10s %s %s %10s %s | %s\n", + rpt.formatValue(flat), + measurement.Percentage(flat, rpt.total), + measurement.Percentage(flatSum, rpt.total), + rpt.formatValue(cum), + measurement.Percentage(cum, rpt.total), + name) + + // Print outgoing edges. + outEdges := n.Out.Sort() + for _, out := range outEdges { + var inline string + if out.Inline { + inline = " (inline)" + } + fmt.Fprintf(w, "%50s %s | %s%s\n", rpt.formatValue(out.Weight), + measurement.Percentage(out.Weight, cum), out.Dest.Info.PrintableName(), inline) + } + } + if len(g.Nodes) > 0 { + fmt.Fprintln(w, separator) + } + if rx != nil && matched == 0 { + return fmt.Errorf("no matches found for regexp: %s", rx) + } + return nil +} + +// GetDOT returns a graph suitable for dot processing along with some +// configuration information. +func GetDOT(rpt *Report) (*graph.Graph, *graph.DotConfig) { + g, origCount, droppedNodes, droppedEdges := rpt.newTrimmedGraph() + rpt.selectOutputUnit(g) + labels := reportLabels(rpt, graphTotal(g), len(g.Nodes), origCount, droppedNodes, droppedEdges, true) + + c := &graph.DotConfig{ + Title: rpt.options.Title, + Labels: labels, + FormatValue: rpt.formatValue, + Total: rpt.total, + } + return g, c +} + +// printDOT prints an annotated callgraph in DOT format. +func printDOT(w io.Writer, rpt *Report) error { + g, c := GetDOT(rpt) + graph.ComposeDot(w, g, &graph.DotAttributes{}, c) + return nil +} + +// ProfileLabels returns printable labels for a profile. +func ProfileLabels(rpt *Report) []string { + label := []string{} + prof := rpt.prof + o := rpt.options + if len(prof.Mapping) > 0 { + if prof.Mapping[0].File != "" { + label = append(label, "File: "+filepath.Base(prof.Mapping[0].File)) + } + if prof.Mapping[0].BuildID != "" { + label = append(label, "Build ID: "+prof.Mapping[0].BuildID) + } + } + // Only include comments that do not start with '#'. + for _, c := range prof.Comments { + if !strings.HasPrefix(c, "#") { + label = append(label, c) + } + } + if o.SampleType != "" { + label = append(label, "Type: "+o.SampleType) + } + if url := prof.DocURL; url != "" { + label = append(label, "Doc: "+url) + } + if prof.TimeNanos != 0 { + const layout = "2006-01-02 15:04:05 MST" + label = append(label, "Time: "+time.Unix(0, prof.TimeNanos).Format(layout)) + } + if prof.DurationNanos != 0 { + duration := measurement.Label(prof.DurationNanos, "nanoseconds") + totalNanos, totalUnit := measurement.Scale(rpt.total, o.SampleUnit, "nanoseconds") + var ratio string + if totalUnit == "ns" && totalNanos != 0 { + ratio = "(" + measurement.Percentage(int64(totalNanos), prof.DurationNanos) + ")" + } + label = append(label, fmt.Sprintf("Duration: %s, Total samples = %s %s", duration, rpt.formatValue(rpt.total), ratio)) + } + return label +} + +func graphTotal(g *graph.Graph) int64 { + var total int64 + for _, n := range g.Nodes { + total += n.FlatValue() + } + return total +} + +// reportLabels returns printable labels for a report. Includes +// profileLabels. +func reportLabels(rpt *Report, shownTotal int64, nodeCount, origCount, droppedNodes, droppedEdges int, fullHeaders bool) []string { + nodeFraction := rpt.options.NodeFraction + edgeFraction := rpt.options.EdgeFraction + + var label []string + if len(rpt.options.ProfileLabels) > 0 { + label = append(label, rpt.options.ProfileLabels...) + } else if fullHeaders || !rpt.options.CompactLabels { + label = ProfileLabels(rpt) + } + + if len(rpt.options.ActiveFilters) > 0 { + activeFilters := legendActiveFilters(rpt.options.ActiveFilters) + label = append(label, activeFilters...) + } + + label = append(label, fmt.Sprintf("Showing nodes accounting for %s, %s of %s total", rpt.formatValue(shownTotal), strings.TrimSpace(measurement.Percentage(shownTotal, rpt.total)), rpt.formatValue(rpt.total))) + + if rpt.total != 0 { + if droppedNodes > 0 { + label = append(label, genLabel(droppedNodes, "node", "cum", + rpt.formatValue(abs64(int64(float64(rpt.total)*nodeFraction))))) + } + if droppedEdges > 0 { + label = append(label, genLabel(droppedEdges, "edge", "freq", + rpt.formatValue(abs64(int64(float64(rpt.total)*edgeFraction))))) + } + if nodeCount > 0 && nodeCount < origCount { + label = append(label, fmt.Sprintf("Showing top %d nodes out of %d", + nodeCount, origCount)) + } + } + + // Help new users understand the graph. + // A new line is intentionally added here to better show this message. + if fullHeaders { + label = append(label, "\nSee https://git.io/JfYMW for how to read the graph") + } + + return label +} + +func legendActiveFilters(activeFilters []string) []string { + legendActiveFilters := make([]string, len(activeFilters)+1) + legendActiveFilters[0] = "Active filters:" + for i, s := range activeFilters { + if len(s) > 80 { + s = s[:80] + "…" + } + legendActiveFilters[i+1] = " " + s + } + return legendActiveFilters +} + +func genLabel(d int, n, l, f string) string { + if d > 1 { + n = n + "s" + } + return fmt.Sprintf("Dropped %d %s (%s <= %s)", d, n, l, f) +} + +// New builds a new report indexing the sample values interpreting the +// samples with the provided function. +func New(prof *profile.Profile, o *Options) *Report { + format := func(v int64) string { + if r := o.Ratio; r > 0 && r != 1 { + fv := float64(v) * r + v = int64(fv) + } + return measurement.ScaledLabel(v, o.SampleUnit, o.OutputUnit) + } + return &Report{prof, computeTotal(prof, o.SampleValue, o.SampleMeanDivisor), + o, format} +} + +// NewDefault builds a new report indexing the last sample value +// available. +func NewDefault(prof *profile.Profile, options Options) *Report { + index := len(prof.SampleType) - 1 + o := &options + if o.Title == "" && len(prof.Mapping) > 0 && prof.Mapping[0].File != "" { + o.Title = filepath.Base(prof.Mapping[0].File) + } + o.SampleType = prof.SampleType[index].Type + o.SampleUnit = strings.ToLower(prof.SampleType[index].Unit) + o.SampleValue = func(v []int64) int64 { + return v[index] + } + return New(prof, o) +} + +// computeTotal computes the sum of the absolute value of all sample values. +// If any samples have label indicating they belong to the diff base, then the +// total will only include samples with that label. +func computeTotal(prof *profile.Profile, value, meanDiv func(v []int64) int64) int64 { + var div, total, diffDiv, diffTotal int64 + for _, sample := range prof.Sample { + var d, v int64 + v = value(sample.Value) + if meanDiv != nil { + d = meanDiv(sample.Value) + } + if v < 0 { + v = -v + } + total += v + div += d + if sample.DiffBaseSample() { + diffTotal += v + diffDiv += d + } + } + if diffTotal > 0 { + total = diffTotal + div = diffDiv + } + if div != 0 { + return total / div + } + return total +} + +// Report contains the data and associated routines to extract a +// report from a profile. +type Report struct { + prof *profile.Profile + total int64 + options *Options + formatValue func(int64) string +} + +// Total returns the total number of samples in a report. +func (rpt *Report) Total() int64 { return rpt.total } + +// OutputFormat returns the output format for the report. +func (rpt *Report) OutputFormat() int { return rpt.options.OutputFormat } + +// DocURL returns the documentation URL for Report, or "" if not available. +func (rpt *Report) DocURL() string { + u := rpt.prof.DocURL + if u == "" || !absoluteURL(u) { + return "" + } + return u +} + +func absoluteURL(str string) bool { + // Avoid returning relative URLs to prevent unwanted local navigation + // within pprof server. + u, err := url.Parse(str) + return err == nil && (u.Scheme == "https" || u.Scheme == "http") +} + +func abs64(i int64) int64 { + if i < 0 { + return -i + } + return i +} diff --git a/plugin/debug/pkg/internal/report/report_test.go b/plugin/debug/pkg/internal/report/report_test.go new file mode 100644 index 00000000..69dab84e --- /dev/null +++ b/plugin/debug/pkg/internal/report/report_test.go @@ -0,0 +1,617 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "regexp" + "runtime" + "slices" + "strings" + "testing" + "time" + + "m7s.live/v5/plugin/debug/pkg/internal/binutils" + "m7s.live/v5/plugin/debug/pkg/internal/graph" + "m7s.live/v5/plugin/debug/pkg/internal/proftest" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +type testcase struct { + rpt *Report + want string +} + +func TestSource(t *testing.T) { + const path = "testdata/" + + sampleValue1 := func(v []int64) int64 { + return v[1] + } + + for _, tc := range []testcase{ + { + rpt: New( + testProfile.Copy(), + &Options{ + OutputFormat: List, + Symbol: regexp.MustCompile(`.`), + TrimPath: "/some/path", + + SampleValue: sampleValue1, + SampleUnit: testProfile.SampleType[1].Unit, + }, + ), + want: path + "source.rpt", + }, + { + rpt: New( + testProfile.Copy(), + &Options{ + OutputFormat: Dot, + CallTree: true, + Symbol: regexp.MustCompile(`.`), + TrimPath: "/some/path", + + SampleValue: sampleValue1, + SampleUnit: testProfile.SampleType[1].Unit, + }, + ), + want: path + "source.dot", + }, + } { + var b bytes.Buffer + if err := Generate(&b, tc.rpt, &binutils.Binutils{}); err != nil { + t.Fatalf("%s: %v", tc.want, err) + } + + gold, err := os.ReadFile(tc.want) + if err != nil { + t.Fatalf("%s: %v", tc.want, err) + } + if runtime.GOOS == "windows" { + if tc.rpt.options.OutputFormat == Dot { + // The .dot test has the paths inside strings, so \ must be escaped. + gold = bytes.Replace(gold, []byte("testdata/"), []byte(`testdata\\`), -1) + } else { + gold = bytes.Replace(gold, []byte("testdata/"), []byte(`testdata\`), -1) + } + } + if string(b.String()) != string(gold) { + d, err := proftest.Diff(gold, b.Bytes()) + if err != nil { + t.Fatalf("%s: %v", "source", err) + } + t.Error("source" + "\n" + string(d) + "\n" + "gold:\n" + tc.want) + } + } +} + +// TestFilter ensures that commands with a regexp filter argument return an +// error if there are no results. +func TestFilter(t *testing.T) { + const filter = "doesNotExist" + + tests := []struct { + name string + format int + }{ + { + name: "list", + format: List, + }, + { + name: "disasm", + format: Dis, + }, + { + // N.B. Tree with a Symbol is "peek". + name: "peek", + format: Tree, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + rpt := New(testProfile.Copy(), &Options{ + OutputFormat: tc.format, + Symbol: regexp.MustCompile(filter), + SampleValue: func(v []int64) int64 { return v[1] }, + SampleUnit: testProfile.SampleType[1].Unit, + }) + + var buf bytes.Buffer + err := Generate(&buf, rpt, &binutils.Binutils{}) + if err == nil { + t.Fatalf("Generate got nil, want error; buf = %s", buf.String()) + } + if !strings.Contains(err.Error(), filter) { + t.Errorf("Error got %v, want it to contain %q", err, filter) + } + }) + } +} + +// testM contains mappings for fake profiles used in tests. +var testM = []*profile.Mapping{ + { + ID: 1, + HasFunctions: true, + HasFilenames: true, + HasLineNumbers: true, + HasInlineFrames: true, + }, +} + +// testF contains functions for fake profiles used in tests. +var testF = []*profile.Function{ + { + ID: 1, + Name: "main", + Filename: "testdata/source1", + }, + { + ID: 2, + Name: "foo", + Filename: "testdata/source1", + }, + { + ID: 3, + Name: "bar", + Filename: "testdata/source1", + }, + { + ID: 4, + Name: "tee", + Filename: "/some/path/testdata/source2", + }, +} + +// testL contains locations for fake profiles used in tests. +var testL = []*profile.Location{ + { + ID: 1, + Mapping: testM[0], + Line: []profile.Line{ + { + Function: testF[0], + Line: 2, + Column: 2, + }, + }, + }, + { + ID: 2, + Mapping: testM[0], + Line: []profile.Line{ + { + Function: testF[1], + Line: 4, + Column: 4, + }, + }, + }, + { + ID: 3, + Mapping: testM[0], + Line: []profile.Line{ + { + Function: testF[2], + Line: 10, + }, + }, + }, + { + ID: 4, + Mapping: testM[0], + Line: []profile.Line{ + { + Function: testF[3], + Line: 2, + }, + }, + }, + { + ID: 5, + Mapping: testM[0], + Line: []profile.Line{ + { + Function: testF[3], + Line: 8, + }, + }, + }, + { + ID: 6, + Mapping: testM[0], + Line: []profile.Line{ + { + Function: testF[3], + Line: 7, + }, + { + Function: testF[2], + Line: 6, + }, + }, + }, +} + +// testSample returns a profile sample with specified value and stack. +// Note: callees come first in sample stacks. +func testSample(value int64, locs ...*profile.Location) *profile.Sample { + return &profile.Sample{ + Value: []int64{value}, + Location: locs, + } +} + +// makeTestProfile returns a profile with specified samples that uses testL/testF/testM +// (defined in report_test.go). +func makeTestProfile(samples ...*profile.Sample) *profile.Profile { + return &profile.Profile{ + SampleType: []*profile.ValueType{{Type: "samples", Unit: "count"}}, + Sample: samples, + Location: testL, + Function: testF, + Mapping: testM, + } +} + +// testProfile contains a fake profile used in tests. +// Various report methods modify profiles so tests should operate on testProfile.Copy(). +var testProfile = &profile.Profile{ + PeriodType: &profile.ValueType{Type: "cpu", Unit: "millisecond"}, + Period: 10, + DurationNanos: 10e9, + SampleType: []*profile.ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "cycles"}, + }, + Sample: []*profile.Sample{ + { + Location: []*profile.Location{testL[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{1, 10}, + }, + { + Location: []*profile.Location{testL[4], testL[2], testL[0]}, + Value: []int64{1, 100}, + }, + { + Location: []*profile.Location{testL[3], testL[0]}, + Value: []int64{1, 1000}, + }, + { + Location: []*profile.Location{testL[4], testL[3], testL[0]}, + Value: []int64{1, 10000}, + }, + }, + Location: testL, + Function: testF, + Mapping: testM, +} + +func TestDisambiguation(t *testing.T) { + parent1 := &graph.Node{Info: graph.NodeInfo{Name: "parent1"}} + parent2 := &graph.Node{Info: graph.NodeInfo{Name: "parent2"}} + child1 := &graph.Node{Info: graph.NodeInfo{Name: "child"}, Function: parent1} + child2 := &graph.Node{Info: graph.NodeInfo{Name: "child"}, Function: parent2} + child3 := &graph.Node{Info: graph.NodeInfo{Name: "child"}, Function: parent1} + sibling := &graph.Node{Info: graph.NodeInfo{Name: "sibling"}, Function: parent1} + + n := []*graph.Node{parent1, parent2, child1, child2, child3, sibling} + + wanted := map[*graph.Node]string{ + parent1: "parent1", + parent2: "parent2", + child1: "child [1/2]", + child2: "child [2/2]", + child3: "child [1/2]", + sibling: "sibling", + } + + g := &graph.Graph{Nodes: n} + + names := getDisambiguatedNames(g) + + for node, want := range wanted { + if got := names[node]; got != want { + t.Errorf("name %s, got %s, want %s", node.Info.Name, got, want) + } + } +} + +func TestFunctionMap(t *testing.T) { + + fm := make(functionMap) + nodes := []graph.NodeInfo{ + {Name: "fun1"}, + {Name: "fun2", File: "filename"}, + {Name: "fun1"}, + {Name: "fun2", File: "filename2"}, + } + + want := []struct { + wantFunction profile.Function + wantAdded bool + }{ + {profile.Function{ID: 1, Name: "fun1"}, true}, + {profile.Function{ID: 2, Name: "fun2", Filename: "filename"}, true}, + {profile.Function{ID: 1, Name: "fun1"}, false}, + {profile.Function{ID: 3, Name: "fun2", Filename: "filename2"}, true}, + } + + for i, tc := range nodes { + gotFunc, gotAdded := fm.findOrAdd(tc) + if got, want := gotFunc, want[i].wantFunction; *got != want { + t.Errorf("%d: got %v, want %v", i, got, want) + } + if got, want := gotAdded, want[i].wantAdded; got != want { + t.Errorf("%d: got %v, want %v", i, got, want) + } + } +} + +func TestLegendActiveFilters(t *testing.T) { + activeFilterInput := []string{ + "focus=123|456|789|101112|131415|161718|192021|222324|252627|282930|313233|343536|363738|acbdefghijklmnop", + "show=short filter", + } + expectedLegendActiveFilter := []string{ + "Active filters:", + " focus=123|456|789|101112|131415|161718|192021|222324|252627|282930|313233|343536…", + " show=short filter", + } + legendActiveFilter := legendActiveFilters(activeFilterInput) + if len(legendActiveFilter) != len(expectedLegendActiveFilter) { + t.Errorf("wanted length %v got length %v", len(expectedLegendActiveFilter), len(legendActiveFilter)) + } + for i := range legendActiveFilter { + if legendActiveFilter[i] != expectedLegendActiveFilter[i] { + t.Errorf("%d: want \"%v\", got \"%v\"", i, expectedLegendActiveFilter[i], legendActiveFilter[i]) + } + } +} + +func TestComputeTotal(t *testing.T) { + p1 := testProfile.Copy() + p1.Sample = []*profile.Sample{ + { + Location: []*profile.Location{testL[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{1, 10}, + }, + { + Location: []*profile.Location{testL[4], testL[2], testL[0]}, + Value: []int64{1, 100}, + }, + } + + p2 := testProfile.Copy() + p2.Sample = []*profile.Sample{ + { + Location: []*profile.Location{testL[0]}, + Value: []int64{1, 1}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{1, -10}, + }, + { + Location: []*profile.Location{testL[4], testL[2], testL[0]}, + Value: []int64{1, 100}, + }, + } + + p3 := testProfile.Copy() + p3.Sample = []*profile.Sample{ + { + Location: []*profile.Location{testL[0]}, + Value: []int64{10000, 1}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{-10, 3}, + Label: map[string][]string{"pprof::base": {"true"}}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{1000, -10}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{-9000, 3}, + Label: map[string][]string{"pprof::base": {"true"}}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{-1, 3}, + Label: map[string][]string{"pprof::base": {"true"}}, + }, + { + Location: []*profile.Location{testL[4], testL[2], testL[0]}, + Value: []int64{100, 100}, + }, + { + Location: []*profile.Location{testL[2], testL[1], testL[0]}, + Value: []int64{100, 3}, + Label: map[string][]string{"pprof::base": {"true"}}, + }, + } + + testcases := []struct { + desc string + prof *profile.Profile + value, meanDiv func(v []int64) int64 + wantTotal int64 + }{ + { + desc: "no diff base, all positive values, index 1", + prof: p1, + value: func(v []int64) int64 { + return v[0] + }, + wantTotal: 3, + }, + { + desc: "no diff base, all positive values, index 2", + prof: p1, + value: func(v []int64) int64 { + return v[1] + }, + wantTotal: 111, + }, + { + desc: "no diff base, some negative values", + prof: p2, + value: func(v []int64) int64 { + return v[1] + }, + wantTotal: 111, + }, + { + desc: "diff base, some negative values", + prof: p3, + value: func(v []int64) int64 { + return v[0] + }, + wantTotal: 9111, + }, + } + + for _, tc := range testcases { + t.Run(tc.desc, func(t *testing.T) { + if gotTotal := computeTotal(tc.prof, tc.value, tc.meanDiv); gotTotal != tc.wantTotal { + t.Errorf("got total %d, want %v", gotTotal, tc.wantTotal) + } + }) + } +} + +func TestPrintAssemblyErrorMessage(t *testing.T) { + profile := readProfile(filepath.Join("testdata", "sample.cpu"), t) + + for _, tc := range []struct { + desc string + symbol string + want string + }{ + { + desc: "no matched symbol in binary", + symbol: "symbol-not-exist", + want: "no matches found for regexp symbol-not-exist", + }, + { + desc: "no matched address in binary", + symbol: "0xffffaaaa", + want: "no matches found for address 0xffffaaaa", + }, + { + desc: "matched address in binary but not in the profile", + symbol: "0x400000", + want: "address 0x400000 found in binary, but the corresponding symbols do not have samples in the profile", + }, + } { + rpt := New( + profile.Copy(), + &Options{ + OutputFormat: List, + Symbol: regexp.MustCompile(tc.symbol), + SampleValue: func(v []int64) int64 { + return v[1] + }, + SampleUnit: profile.SampleType[1].Unit, + }, + ) + + if err := PrintAssembly(os.Stdout, rpt, &binutils.Binutils{}, -1); err == nil || err.Error() != tc.want { + t.Errorf(`Got "%v", want %q`, err, tc.want) + } + } +} + +func TestDocURL(t *testing.T) { + type testCase struct { + input string + want string + } + for name, c := range map[string]testCase{ + "empty": {"", ""}, + "http": {"http://example.com/pprof-help", "http://example.com/pprof-help"}, + "https": {"https://example.com/pprof-help", "https://example.com/pprof-help"}, + "relative": {"/foo", ""}, + "nonhttp": {"mailto:nobody@example.com", ""}, + } { + t.Run(name, func(t *testing.T) { + profile := testProfile.Copy() + profile.DocURL = c.input + rpt := New(profile, &Options{ + OutputFormat: Dot, + Symbol: regexp.MustCompile(`.`), + TrimPath: "/some/path", + SampleValue: func(v []int64) int64 { return v[1] }, + SampleUnit: testProfile.SampleType[1].Unit, + }) + if got := rpt.DocURL(); got != c.want { + t.Errorf("bad doc URL %q, expecting %q", got, c.want) + } + }) + } +} + +func TestDocURLInLabels(t *testing.T) { + const url = "http://example.com/pprof-help" + profile := testProfile.Copy() + profile.DocURL = url + rpt := New(profile, &Options{ + OutputFormat: Text, + Symbol: regexp.MustCompile(`.`), + TrimPath: "/some/path", + SampleValue: func(v []int64) int64 { return v[1] }, + SampleUnit: testProfile.SampleType[1].Unit, + }) + + labels := fmt.Sprintf("%v", ProfileLabels(rpt)) + if !strings.Contains(labels, url) { + t.Errorf("expected URL %q not found in %s", url, labels) + } +} + +func TestProfileLabels(t *testing.T) { + // Force the local timezone to UTC for the duration of this function to get a + // predictable result out of timezone printing. + defer func(prev *time.Location) { time.Local = prev }(time.Local) + time.Local = time.UTC + + profile := testProfile.Copy() + profile.TimeNanos = time.Unix(131, 0).UnixNano() + rpt := New(profile, &Options{ + SampleValue: func(v []int64) int64 { return v[1] }, + }) + + const want = "Time: 1970-01-01 00:02:11 UTC" + if labels := ProfileLabels(rpt); !slices.Contains(labels, want) { + t.Errorf("wanted to find a label containing %q, but found none in %v", want, labels) + } +} diff --git a/plugin/debug/pkg/internal/report/shortnames.go b/plugin/debug/pkg/internal/report/shortnames.go new file mode 100644 index 00000000..7ea67a0b --- /dev/null +++ b/plugin/debug/pkg/internal/report/shortnames.go @@ -0,0 +1,59 @@ +// Copyright 2022 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import ( + "path/filepath" + "regexp" + + "m7s.live/v5/plugin/debug/pkg/internal/graph" +) + +var ( + sepRE = regexp.MustCompile(`::|\.`) + fileSepRE = regexp.MustCompile(`/`) +) + +// fileNameSuffixes returns a non-empty sequence of shortened file names +// (in decreasing preference) that can be used to represent name. +func fileNameSuffixes(name string) []string { + if name == "" { + // Avoid returning "." when symbol info is missing + return []string{""} + } + return allSuffixes(filepath.ToSlash(filepath.Clean(name)), fileSepRE) +} + +// shortNameList returns a non-empty sequence of shortened names +// (in decreasing preference) that can be used to represent name. +func shortNameList(name string) []string { + name = graph.ShortenFunctionName(name) + return allSuffixes(name, sepRE) +} + +// allSuffixes returns a list of suffixes (in order of decreasing length) +// found by splitting at re. +func allSuffixes(name string, re *regexp.Regexp) []string { + seps := re.FindAllStringIndex(name, -1) + result := make([]string, 0, len(seps)+1) + result = append(result, name) + for _, sep := range seps { + // Suffix starting just after sep + if sep[1] < len(name) { + result = append(result, name[sep[1]:]) + } + } + return result +} diff --git a/plugin/debug/pkg/internal/report/shortnames_test.go b/plugin/debug/pkg/internal/report/shortnames_test.go new file mode 100644 index 00000000..820cd4d4 --- /dev/null +++ b/plugin/debug/pkg/internal/report/shortnames_test.go @@ -0,0 +1,60 @@ +package report + +import ( + "reflect" + "testing" +) + +func TestShortNames(t *testing.T) { + type testCase struct { + name string + in string + out []string + } + test := func(name, in string, out ...string) testCase { + return testCase{name, in, out} + } + + for _, c := range []testCase{ + test("empty", "", ""), + test("simple", "foo", "foo"), + test("trailingsep", "foo.bar.", "foo.bar.", "bar."), + test("cplusplus", "a::b::c", "a::b::c", "b::c", "c"), + test("dotted", "a.b.c", "a.b.c", "b.c", "c"), + test("mixed_separators", "a::b.c::d", "a::b.c::d", "b.c::d", "c::d", "d"), + test("call_operator", "foo::operator()", "foo::operator()", "operator()"), + } { + t.Run(c.name, func(t *testing.T) { + got := shortNameList(c.in) + if !reflect.DeepEqual(c.out, got) { + t.Errorf("shortNameList(%q) = %#v, expecting %#v", c.in, got, c.out) + } + }) + } +} + +func TestFileNameSuffixes(t *testing.T) { + type testCase struct { + name string + in string + out []string + } + test := func(name, in string, out ...string) testCase { + return testCase{name, in, out} + } + + for _, c := range []testCase{ + test("empty", "", ""), + test("simple", "foo", "foo"), + test("manypaths", "a/b/c", "a/b/c", "b/c", "c"), + test("leading", "/a/b", "/a/b", "a/b", "b"), + test("trailing", "a/b", "a/b", "b"), + } { + t.Run(c.name, func(t *testing.T) { + got := fileNameSuffixes(c.in) + if !reflect.DeepEqual(c.out, got) { + t.Errorf("fileNameSuffixes(%q) = %#v, expecting %#v", c.in, got, c.out) + } + }) + } +} diff --git a/plugin/debug/pkg/internal/report/source.go b/plugin/debug/pkg/internal/report/source.go new file mode 100644 index 00000000..5c8a85bb --- /dev/null +++ b/plugin/debug/pkg/internal/report/source.go @@ -0,0 +1,1117 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +// This file contains routines related to the generation of annotated +// source listings. + +import ( + "bufio" + "fmt" + "html/template" + "io" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + + "m7s.live/v5/plugin/debug/pkg/internal/graph" + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/internal/plugin" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// printSource prints an annotated source listing, include all +// functions with samples that match the regexp rpt.options.symbol. +// The sources are sorted by function name and then by filename to +// eliminate potential nondeterminism. +func printSource(w io.Writer, rpt *Report) error { + o := rpt.options + g := rpt.newGraph(nil) + + // Identify all the functions that match the regexp provided. + // Group nodes for each matching function. + var functions graph.Nodes + functionNodes := make(map[string]graph.Nodes) + for _, n := range g.Nodes { + if !o.Symbol.MatchString(n.Info.Name) { + continue + } + if functionNodes[n.Info.Name] == nil { + functions = append(functions, n) + } + functionNodes[n.Info.Name] = append(functionNodes[n.Info.Name], n) + } + functions.Sort(graph.NameOrder) + + if len(functionNodes) == 0 { + return fmt.Errorf("no matches found for regexp: %s", o.Symbol) + } + + sourcePath := o.SourcePath + if sourcePath == "" { + wd, err := os.Getwd() + if err != nil { + return fmt.Errorf("could not stat current dir: %v", err) + } + sourcePath = wd + } + reader := newSourceReader(sourcePath, o.TrimPath) + + fmt.Fprintf(w, "Total: %s\n", rpt.formatValue(rpt.total)) + for _, fn := range functions { + name := fn.Info.Name + + // Identify all the source files associated to this function. + // Group nodes for each source file. + var sourceFiles graph.Nodes + fileNodes := make(map[string]graph.Nodes) + for _, n := range functionNodes[name] { + if n.Info.File == "" { + continue + } + if fileNodes[n.Info.File] == nil { + sourceFiles = append(sourceFiles, n) + } + fileNodes[n.Info.File] = append(fileNodes[n.Info.File], n) + } + + if len(sourceFiles) == 0 { + fmt.Fprintf(w, "No source information for %s\n", name) + continue + } + + sourceFiles.Sort(graph.FileOrder) + + // Print each file associated with this function. + for _, fl := range sourceFiles { + filename := fl.Info.File + fns := fileNodes[filename] + flatSum, cumSum := fns.Sum() + + fnodes, _, err := getSourceFromFile(filename, reader, fns, 0, 0) + fmt.Fprintf(w, "ROUTINE ======================== %s in %s\n", name, filename) + fmt.Fprintf(w, "%10s %10s (flat, cum) %s of Total\n", + rpt.formatValue(flatSum), rpt.formatValue(cumSum), + measurement.Percentage(cumSum, rpt.total)) + + if err != nil { + fmt.Fprintf(w, " Error: %v\n", err) + continue + } + + for _, fn := range fnodes { + fmt.Fprintf(w, "%10s %10s %6d:%s\n", valueOrDot(fn.Flat, rpt), valueOrDot(fn.Cum, rpt), fn.Info.Lineno, fn.Info.Name) + } + } + } + return nil +} + +// sourcePrinter holds state needed for generating source+asm HTML listing. +type sourcePrinter struct { + reader *sourceReader + synth *synthCode + objectTool plugin.ObjTool + objects map[string]plugin.ObjFile // Opened object files + sym *regexp.Regexp // May be nil + files map[string]*sourceFile // Set of files to print. + insts map[uint64]instructionInfo // Instructions of interest (keyed by address). + + // Set of function names that we are interested in (because they had + // a sample and match sym). + interest map[string]bool + + // Mapping from system function names to printable names. + prettyNames map[string]string +} + +// addrInfo holds information for an address we are interested in. +type addrInfo struct { + loc *profile.Location // Always non-nil + obj plugin.ObjFile // May be nil +} + +// instructionInfo holds collected information for an instruction. +type instructionInfo struct { + objAddr uint64 // Address in object file (with base subtracted out) + length int // Instruction length in bytes + disasm string // Disassembly of instruction + file string // For top-level function in which instruction occurs + line int // For top-level function in which instruction occurs + flat, cum int64 // Samples to report (divisor already applied) +} + +// sourceFile contains collected information for files we will print. +type sourceFile struct { + fname string + cum int64 + flat int64 + lines map[int][]sourceInst // Instructions to show per line + funcName map[int]string // Function name per line +} + +// sourceInst holds information for an instruction to be displayed. +type sourceInst struct { + addr uint64 + stack []callID // Inlined call-stack +} + +// sourceFunction contains information for a contiguous range of lines per function we +// will print. +type sourceFunction struct { + name string + begin, end int // Line numbers (end is not included in the range) + flat, cum int64 +} + +// addressRange is a range of addresses plus the object file that contains it. +type addressRange struct { + begin, end uint64 + obj plugin.ObjFile + mapping *profile.Mapping + score int64 // Used to order ranges for processing +} + +// WebListData holds the data needed to generate HTML source code listing. +type WebListData struct { + Total string + Files []WebListFile +} + +// WebListFile holds the per-file information for HTML source code listing. +type WebListFile struct { + Funcs []WebListFunc +} + +// WebListFunc holds the per-function information for HTML source code listing. +type WebListFunc struct { + Name string + File string + Flat string + Cumulative string + Percent string + Lines []WebListLine +} + +// WebListLine holds the per-source-line information for HTML source code listing. +type WebListLine struct { + SrcLine string + HTMLClass string + Line int + Flat string + Cumulative string + Instructions []WebListInstruction +} + +// WebListInstruction holds the per-instruction information for HTML source code listing. +type WebListInstruction struct { + NewBlock bool // Insert marker that indicates separation from previous block + Flat string + Cumulative string + Synthetic bool + Address uint64 + Disasm string + FileLine string + InlinedCalls []WebListCall +} + +// WebListCall holds the per-inlined-call information for HTML source code listing. +type WebListCall struct { + SrcLine string + FileBase string + Line int +} + +// MakeWebList returns an annotated source listing of rpt. +// rpt.prof should contain inlined call info. +func MakeWebList(rpt *Report, obj plugin.ObjTool, maxFiles int) (WebListData, error) { + sourcePath := rpt.options.SourcePath + if sourcePath == "" { + wd, err := os.Getwd() + if err != nil { + return WebListData{}, fmt.Errorf("could not stat current dir: %v", err) + } + sourcePath = wd + } + sp := newSourcePrinter(rpt, obj, sourcePath) + if len(sp.interest) == 0 { + return WebListData{}, fmt.Errorf("no matches found for regexp: %s", rpt.options.Symbol) + } + defer sp.close() + return sp.generate(maxFiles, rpt), nil +} + +func newSourcePrinter(rpt *Report, obj plugin.ObjTool, sourcePath string) *sourcePrinter { + sp := &sourcePrinter{ + reader: newSourceReader(sourcePath, rpt.options.TrimPath), + synth: newSynthCode(rpt.prof.Mapping), + objectTool: obj, + objects: map[string]plugin.ObjFile{}, + sym: rpt.options.Symbol, + files: map[string]*sourceFile{}, + insts: map[uint64]instructionInfo{}, + prettyNames: map[string]string{}, + interest: map[string]bool{}, + } + + // If the regexp source can be parsed as an address, also match + // functions that land on that address. + var address *uint64 + if sp.sym != nil { + if hex, err := strconv.ParseUint(sp.sym.String(), 0, 64); err == nil { + address = &hex + } + } + + addrs := map[uint64]addrInfo{} + flat := map[uint64]int64{} + cum := map[uint64]int64{} + + // Record an interest in the function corresponding to lines[index]. + markInterest := func(addr uint64, loc *profile.Location, index int) { + fn := loc.Line[index] + if fn.Function == nil { + return + } + sp.interest[fn.Function.Name] = true + sp.interest[fn.Function.SystemName] = true + if _, ok := addrs[addr]; !ok { + addrs[addr] = addrInfo{loc, sp.objectFile(loc.Mapping)} + } + } + + // See if sp.sym matches line. + matches := func(line profile.Line) bool { + if line.Function == nil { + return false + } + return sp.sym.MatchString(line.Function.Name) || + sp.sym.MatchString(line.Function.SystemName) || + sp.sym.MatchString(line.Function.Filename) + } + + // Extract sample counts and compute set of interesting functions. + for _, sample := range rpt.prof.Sample { + value := rpt.options.SampleValue(sample.Value) + if rpt.options.SampleMeanDivisor != nil { + div := rpt.options.SampleMeanDivisor(sample.Value) + if div != 0 { + value /= div + } + } + + // Find call-sites matching sym. + for i := len(sample.Location) - 1; i >= 0; i-- { + loc := sample.Location[i] + for _, line := range loc.Line { + if line.Function == nil { + continue + } + sp.prettyNames[line.Function.SystemName] = line.Function.Name + } + + addr := loc.Address + if addr == 0 { + // Some profiles are missing valid addresses. + addr = sp.synth.address(loc) + } + + cum[addr] += value + if i == 0 { + flat[addr] += value + } + + if sp.sym == nil || (address != nil && addr == *address) { + // Interested in top-level entry of stack. + if len(loc.Line) > 0 { + markInterest(addr, loc, len(loc.Line)-1) + } + continue + } + + // Search in inlined stack for a match. + matchFile := (loc.Mapping != nil && sp.sym.MatchString(loc.Mapping.File)) + for j, line := range loc.Line { + if (j == 0 && matchFile) || matches(line) { + markInterest(addr, loc, j) + } + } + } + } + + sp.expandAddresses(rpt, addrs, flat) + sp.initSamples(flat, cum) + return sp +} + +func (sp *sourcePrinter) close() { + for _, objFile := range sp.objects { + if objFile != nil { + objFile.Close() + } + } +} + +func (sp *sourcePrinter) expandAddresses(rpt *Report, addrs map[uint64]addrInfo, flat map[uint64]int64) { + // We found interesting addresses (ones with non-zero samples) above. + // Get covering address ranges and disassemble the ranges. + ranges, unprocessed := sp.splitIntoRanges(rpt.prof, addrs, flat) + sp.handleUnprocessed(addrs, unprocessed) + + // Trim ranges if there are too many. + const maxRanges = 25 + sort.Slice(ranges, func(i, j int) bool { + return ranges[i].score > ranges[j].score + }) + if len(ranges) > maxRanges { + ranges = ranges[:maxRanges] + } + + for _, r := range ranges { + objBegin, err := r.obj.ObjAddr(r.begin) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to compute objdump address for range start %x: %v\n", r.begin, err) + continue + } + objEnd, err := r.obj.ObjAddr(r.end) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to compute objdump address for range end %x: %v\n", r.end, err) + continue + } + base := r.begin - objBegin + insts, err := sp.objectTool.Disasm(r.mapping.File, objBegin, objEnd, rpt.options.IntelSyntax) + if err != nil { + // TODO(sanjay): Report that the covered addresses are missing. + continue + } + + var lastFrames []plugin.Frame + var lastAddr, maxAddr uint64 + for i, inst := range insts { + addr := inst.Addr + base + + // Guard against duplicate output from Disasm. + if addr <= maxAddr { + continue + } + maxAddr = addr + + length := 1 + if i+1 < len(insts) && insts[i+1].Addr > inst.Addr { + // Extend to next instruction. + length = int(insts[i+1].Addr - inst.Addr) + } + + // Get inlined-call-stack for address. + frames, err := r.obj.SourceLine(addr) + if err != nil { + // Construct a frame from disassembler output. + frames = []plugin.Frame{{Func: inst.Function, File: inst.File, Line: inst.Line}} + } + + x := instructionInfo{objAddr: inst.Addr, length: length, disasm: inst.Text} + if len(frames) > 0 { + // We could consider using the outer-most caller's source + // location so we give the some hint as to where the + // inlining happened that led to this instruction. So for + // example, suppose we have the following (inlined) call + // chains for this instruction: + // F1->G->H + // F2->G->H + // We could tag the instructions from the first call with + // F1 and instructions from the second call with F2. But + // that leads to a somewhat confusing display. So for now, + // we stick with just the inner-most location (i.e., H). + // In the future we will consider changing the display to + // make caller info more visible. + index := 0 // Inner-most frame + x.file = frames[index].File + x.line = frames[index].Line + } + sp.insts[addr] = x + + // We sometimes get instructions with a zero reported line number. + // Make such instructions have the same line info as the preceding + // instruction, if an earlier instruction is found close enough. + const neighborhood = 32 + if len(frames) > 0 && frames[0].Line != 0 { + lastFrames = frames + lastAddr = addr + } else if (addr-lastAddr <= neighborhood) && lastFrames != nil { + frames = lastFrames + } + + sp.addStack(addr, frames) + } + } +} + +func (sp *sourcePrinter) addStack(addr uint64, frames []plugin.Frame) { + // See if the stack contains a function we are interested in. + for i, f := range frames { + if !sp.interest[f.Func] { + continue + } + + // Record sub-stack under frame's file/line. + fname := canonicalizeFileName(f.File) + file := sp.files[fname] + if file == nil { + file = &sourceFile{ + fname: fname, + lines: map[int][]sourceInst{}, + funcName: map[int]string{}, + } + sp.files[fname] = file + } + callees := frames[:i] + stack := make([]callID, 0, len(callees)) + for j := len(callees) - 1; j >= 0; j-- { // Reverse so caller is first + stack = append(stack, callID{ + file: callees[j].File, + line: callees[j].Line, + }) + } + file.lines[f.Line] = append(file.lines[f.Line], sourceInst{addr, stack}) + + // Remember the first function name encountered per source line + // and assume that that line belongs to that function. + if _, ok := file.funcName[f.Line]; !ok { + file.funcName[f.Line] = f.Func + } + } +} + +// synthAsm is the special disassembler value used for instructions without an object file. +const synthAsm = "" + +// handleUnprocessed handles addresses that were skipped by splitIntoRanges because they +// did not belong to a known object file. +func (sp *sourcePrinter) handleUnprocessed(addrs map[uint64]addrInfo, unprocessed []uint64) { + // makeFrames synthesizes a []plugin.Frame list for the specified address. + // The result will typically have length 1, but may be longer if address corresponds + // to inlined calls. + makeFrames := func(addr uint64) []plugin.Frame { + loc := addrs[addr].loc + stack := make([]plugin.Frame, 0, len(loc.Line)) + for _, line := range loc.Line { + fn := line.Function + if fn == nil { + continue + } + stack = append(stack, plugin.Frame{ + Func: fn.Name, + File: fn.Filename, + Line: int(line.Line), + }) + } + return stack + } + + for _, addr := range unprocessed { + frames := makeFrames(addr) + x := instructionInfo{ + objAddr: addr, + length: 1, + disasm: synthAsm, + } + if len(frames) > 0 { + x.file = frames[0].File + x.line = frames[0].Line + } + sp.insts[addr] = x + + sp.addStack(addr, frames) + } +} + +// splitIntoRanges converts the set of addresses we are interested in into a set of address +// ranges to disassemble. It also returns the set of addresses found that did not have an +// associated object file and were therefore not added to an address range. +func (sp *sourcePrinter) splitIntoRanges(prof *profile.Profile, addrMap map[uint64]addrInfo, flat map[uint64]int64) ([]addressRange, []uint64) { + // Partition addresses into two sets: ones with a known object file, and ones without. + var addrs, unprocessed []uint64 + for addr, info := range addrMap { + if info.obj != nil { + addrs = append(addrs, addr) + } else { + unprocessed = append(unprocessed, addr) + } + } + sort.Slice(addrs, func(i, j int) bool { return addrs[i] < addrs[j] }) + + const expand = 500 // How much to expand range to pick up nearby addresses. + var result []addressRange + for i, n := 0, len(addrs); i < n; { + begin, end := addrs[i], addrs[i] + sum := flat[begin] + i++ + + info := addrMap[begin] + m := info.loc.Mapping + obj := info.obj // Non-nil because of the partitioning done above. + + // Find following addresses that are close enough to addrs[i]. + for i < n && addrs[i] <= end+2*expand && addrs[i] < m.Limit { + // When we expand ranges by "expand" on either side, the ranges + // for addrs[i] and addrs[i-1] will merge. + end = addrs[i] + sum += flat[end] + i++ + } + if m.Start-begin >= expand { + begin -= expand + } else { + begin = m.Start + } + if m.Limit-end >= expand { + end += expand + } else { + end = m.Limit + } + + result = append(result, addressRange{begin, end, obj, m, sum}) + } + return result, unprocessed +} + +func (sp *sourcePrinter) initSamples(flat, cum map[uint64]int64) { + for addr, inst := range sp.insts { + // Move all samples that were assigned to the middle of an instruction to the + // beginning of that instruction. This takes care of samples that were recorded + // against pc+1. + instEnd := addr + uint64(inst.length) + for p := addr; p < instEnd; p++ { + inst.flat += flat[p] + inst.cum += cum[p] + } + sp.insts[addr] = inst + } +} + +func (sp *sourcePrinter) generate(maxFiles int, rpt *Report) WebListData { + // Finalize per-file counts. + for _, file := range sp.files { + seen := map[uint64]bool{} + for _, line := range file.lines { + for _, x := range line { + if seen[x.addr] { + // Same address can be displayed multiple times in a file + // (e.g., if we show multiple inlined functions). + // Avoid double-counting samples in this case. + continue + } + seen[x.addr] = true + inst := sp.insts[x.addr] + file.cum += inst.cum + file.flat += inst.flat + } + } + } + + // Get sorted list of files to print. + var files []*sourceFile + for _, f := range sp.files { + files = append(files, f) + } + order := func(i, j int) bool { return files[i].flat > files[j].flat } + if maxFiles < 0 { + // Order by name for compatibility with old code. + order = func(i, j int) bool { return files[i].fname < files[j].fname } + maxFiles = len(files) + } + sort.Slice(files, order) + result := WebListData{ + Total: rpt.formatValue(rpt.total), + } + for i, f := range files { + if i < maxFiles { + result.Files = append(result.Files, sp.generateFile(f, rpt)) + } + } + return result +} + +func (sp *sourcePrinter) generateFile(f *sourceFile, rpt *Report) WebListFile { + var result WebListFile + for _, fn := range sp.functions(f) { + if fn.cum == 0 { + continue + } + + listfn := WebListFunc{ + Name: fn.name, + File: f.fname, + Flat: rpt.formatValue(fn.flat), + Cumulative: rpt.formatValue(fn.cum), + Percent: measurement.Percentage(fn.cum, rpt.total), + } + var asm []assemblyInstruction + for l := fn.begin; l < fn.end; l++ { + lineContents, ok := sp.reader.line(f.fname, l) + if !ok { + if len(f.lines[l]) == 0 { + // Outside of range of valid lines and nothing to print. + continue + } + if l == 0 { + // Line number 0 shows up if line number is not known. + lineContents = "" + } else { + // Past end of file, but have data to print. + lineContents = "???" + } + } + + // Make list of assembly instructions. + asm = asm[:0] + var flatSum, cumSum int64 + var lastAddr uint64 + for _, inst := range f.lines[l] { + addr := inst.addr + x := sp.insts[addr] + flatSum += x.flat + cumSum += x.cum + startsBlock := (addr != lastAddr+uint64(sp.insts[lastAddr].length)) + lastAddr = addr + + // divisors already applied, so leave flatDiv,cumDiv as 0 + asm = append(asm, assemblyInstruction{ + address: x.objAddr, + instruction: x.disasm, + function: fn.name, + file: x.file, + line: x.line, + flat: x.flat, + cum: x.cum, + startsBlock: startsBlock, + inlineCalls: inst.stack, + }) + } + + listfn.Lines = append(listfn.Lines, makeWebListLine(l, flatSum, cumSum, lineContents, asm, sp.reader, rpt)) + } + + result.Funcs = append(result.Funcs, listfn) + } + return result +} + +// functions splits apart the lines to show in a file into a list of per-function ranges. +func (sp *sourcePrinter) functions(f *sourceFile) []sourceFunction { + var funcs []sourceFunction + + // Get interesting lines in sorted order. + lines := make([]int, 0, len(f.lines)) + for l := range f.lines { + lines = append(lines, l) + } + sort.Ints(lines) + + // Merge adjacent lines that are in same function and not too far apart. + const mergeLimit = 20 + for _, l := range lines { + name := f.funcName[l] + if pretty, ok := sp.prettyNames[name]; ok { + // Use demangled name if available. + name = pretty + } + + fn := sourceFunction{name: name, begin: l, end: l + 1} + for _, x := range f.lines[l] { + inst := sp.insts[x.addr] + fn.flat += inst.flat + fn.cum += inst.cum + } + + // See if we should merge into preceding function. + if len(funcs) > 0 { + last := funcs[len(funcs)-1] + if l-last.end < mergeLimit && last.name == name { + last.end = l + 1 + last.flat += fn.flat + last.cum += fn.cum + funcs[len(funcs)-1] = last + continue + } + } + + // Add new function. + funcs = append(funcs, fn) + } + + // Expand function boundaries to show neighborhood. + const expand = 5 + for i, f := range funcs { + if i == 0 { + // Extend backwards, stopping at line number 1, but do not disturb 0 + // since that is a special line number that can show up when addr2line + // cannot determine the real line number. + if f.begin > expand { + f.begin -= expand + } else if f.begin > 1 { + f.begin = 1 + } + } else { + // Find gap from predecessor and divide between predecessor and f. + halfGap := (f.begin - funcs[i-1].end) / 2 + if halfGap > expand { + halfGap = expand + } + funcs[i-1].end += halfGap + f.begin -= halfGap + } + funcs[i] = f + } + + // Also extend the ending point of the last function. + if len(funcs) > 0 { + funcs[len(funcs)-1].end += expand + } + + return funcs +} + +// objectFile return the object for the specified mapping, opening it if necessary. +// It returns nil on error. +func (sp *sourcePrinter) objectFile(m *profile.Mapping) plugin.ObjFile { + if m == nil { + return nil + } + if object, ok := sp.objects[m.File]; ok { + return object // May be nil if we detected an error earlier. + } + object, err := sp.objectTool.Open(m.File, m.Start, m.Limit, m.Offset, m.KernelRelocationSymbol) + if err != nil { + object = nil + } + sp.objects[m.File] = object // Cache even on error. + return object +} + +// makeWebListLine returns the contents of a single line in a web listing. This includes +// the source line and the corresponding assembly. +func makeWebListLine(lineNo int, flat, cum int64, lineContents string, + assembly []assemblyInstruction, reader *sourceReader, rpt *Report) WebListLine { + line := WebListLine{ + SrcLine: lineContents, + Line: lineNo, + Flat: valueOrDot(flat, rpt), + Cumulative: valueOrDot(cum, rpt), + } + + if len(assembly) == 0 { + line.HTMLClass = "nop" + return line + } + + nestedInfo := false + line.HTMLClass = "deadsrc" + for _, an := range assembly { + if len(an.inlineCalls) > 0 || an.instruction != synthAsm { + nestedInfo = true + line.HTMLClass = "livesrc" + } + } + + if nestedInfo { + srcIndent := indentation(lineContents) + line.Instructions = makeWebListInstructions(srcIndent, assembly, reader, rpt) + } + return line +} + +func makeWebListInstructions(srcIndent int, assembly []assemblyInstruction, reader *sourceReader, rpt *Report) []WebListInstruction { + var result []WebListInstruction + var curCalls []callID + for i, an := range assembly { + var fileline string + if an.file != "" { + fileline = fmt.Sprintf("%s:%d", template.HTMLEscapeString(filepath.Base(an.file)), an.line) + } + text := strings.Repeat(" ", srcIndent+4+4*len(an.inlineCalls)) + an.instruction + inst := WebListInstruction{ + NewBlock: (an.startsBlock && i != 0), + Flat: valueOrDot(an.flat, rpt), + Cumulative: valueOrDot(an.cum, rpt), + Synthetic: (an.instruction == synthAsm), + Address: an.address, + Disasm: rightPad(text, 80), + FileLine: fileline, + } + + // Add inlined call context. + for j, c := range an.inlineCalls { + if j < len(curCalls) && curCalls[j] == c { + // Skip if same as previous instruction. + continue + } + curCalls = nil + fline, ok := reader.line(c.file, c.line) + if !ok { + fline = "" + } + srcCode := strings.Repeat(" ", srcIndent+4+4*j) + strings.TrimSpace(fline) + inst.InlinedCalls = append(inst.InlinedCalls, WebListCall{ + SrcLine: rightPad(srcCode, 80), + FileBase: filepath.Base(c.file), + Line: c.line, + }) + } + curCalls = an.inlineCalls + + result = append(result, inst) + } + return result +} + +// getSourceFromFile collects the sources of a function from a source +// file and annotates it with the samples in fns. Returns the sources +// as nodes, using the info.name field to hold the source code. +func getSourceFromFile(file string, reader *sourceReader, fns graph.Nodes, start, end int) (graph.Nodes, string, error) { + lineNodes := make(map[int]graph.Nodes) + + // Collect source coordinates from profile. + const margin = 5 // Lines before first/after last sample. + if start == 0 { + if fns[0].Info.StartLine != 0 { + start = fns[0].Info.StartLine + } else { + start = fns[0].Info.Lineno - margin + } + } else { + start -= margin + } + if end == 0 { + end = fns[0].Info.Lineno + } + end += margin + for _, n := range fns { + lineno := n.Info.Lineno + nodeStart := n.Info.StartLine + if nodeStart == 0 { + nodeStart = lineno - margin + } + nodeEnd := lineno + margin + if nodeStart < start { + start = nodeStart + } else if nodeEnd > end { + end = nodeEnd + } + lineNodes[lineno] = append(lineNodes[lineno], n) + } + if start < 1 { + start = 1 + } + + var src graph.Nodes + for lineno := start; lineno <= end; lineno++ { + line, ok := reader.line(file, lineno) + if !ok { + break + } + flat, cum := lineNodes[lineno].Sum() + src = append(src, &graph.Node{ + Info: graph.NodeInfo{ + Name: strings.TrimRight(line, "\n"), + Lineno: lineno, + }, + Flat: flat, + Cum: cum, + }) + } + if err := reader.fileError(file); err != nil { + return nil, file, err + } + return src, file, nil +} + +// sourceReader provides access to source code with caching of file contents. +type sourceReader struct { + // searchPath is a filepath.ListSeparator-separated list of directories where + // source files should be searched. + searchPath string + + // trimPath is a filepath.ListSeparator-separated list of paths to trim. + trimPath string + + // files maps from path name to a list of lines. + // files[*][0] is unused since line numbering starts at 1. + files map[string][]string + + // errors collects errors encountered per file. These errors are + // consulted before returning out of these module. + errors map[string]error +} + +func newSourceReader(searchPath, trimPath string) *sourceReader { + return &sourceReader{ + searchPath, + trimPath, + make(map[string][]string), + make(map[string]error), + } +} + +func (reader *sourceReader) fileError(path string) error { + return reader.errors[path] +} + +// line returns the line numbered "lineno" in path, or _,false if lineno is out of range. +func (reader *sourceReader) line(path string, lineno int) (string, bool) { + lines, ok := reader.files[path] + if !ok { + // Read and cache file contents. + lines = []string{""} // Skip 0th line + f, err := openSourceFile(path, reader.searchPath, reader.trimPath) + if err != nil { + reader.errors[path] = err + } else { + s := bufio.NewScanner(f) + for s.Scan() { + lines = append(lines, s.Text()) + } + f.Close() + if s.Err() != nil { + reader.errors[path] = err + } + } + reader.files[path] = lines + } + if lineno <= 0 || lineno >= len(lines) { + return "", false + } + return lines[lineno], true +} + +// openSourceFile opens a source file from a name encoded in a profile. File +// names in a profile after can be relative paths, so search them in each of +// the paths in searchPath and their parents. In case the profile contains +// absolute paths, additional paths may be configured to trim from the source +// paths in the profile. This effectively turns the path into a relative path +// searching it using searchPath as usual). +func openSourceFile(path, searchPath, trim string) (*os.File, error) { + path = trimPath(path, trim, searchPath) + // If file is still absolute, require file to exist. + if filepath.IsAbs(path) { + f, err := os.Open(path) + return f, err + } + // Scan each component of the path. + for _, dir := range filepath.SplitList(searchPath) { + // Search up for every parent of each possible path. + for { + filename := filepath.Join(dir, path) + if f, err := os.Open(filename); err == nil { + return f, nil + } + parent := filepath.Dir(dir) + if parent == dir { + break + } + dir = parent + } + } + + return nil, fmt.Errorf("could not find file %s on path %s", path, searchPath) +} + +// trimPath cleans up a path by removing prefixes that are commonly +// found on profiles plus configured prefixes. +// TODO(aalexand): Consider optimizing out the redundant work done in this +// function if it proves to matter. +func trimPath(path, trimPath, searchPath string) string { + // Keep path variable intact as it's used below to form the return value. + sPath, searchPath := filepath.ToSlash(path), filepath.ToSlash(searchPath) + if trimPath == "" { + // If the trim path is not configured, try to guess it heuristically: + // search for basename of each search path in the original path and, if + // found, strip everything up to and including the basename. So, for + // example, given original path "/some/remote/path/my-project/foo/bar.c" + // and search path "/my/local/path/my-project" the heuristic will return + // "/my/local/path/my-project/foo/bar.c". + for _, dir := range filepath.SplitList(searchPath) { + want := "/" + filepath.Base(dir) + "/" + if found := strings.Index(sPath, want); found != -1 { + return path[found+len(want):] + } + } + } + // Trim configured trim prefixes. + trimPaths := append(filepath.SplitList(filepath.ToSlash(trimPath)), "/proc/self/cwd/./", "/proc/self/cwd/") + for _, trimPath := range trimPaths { + if !strings.HasSuffix(trimPath, "/") { + trimPath += "/" + } + if strings.HasPrefix(sPath, trimPath) { + return path[len(trimPath):] + } + } + return path +} + +func indentation(line string) int { + column := 0 + for _, c := range line { + if c == ' ' { + column++ + } else if c == '\t' { + column++ + for column%8 != 0 { + column++ + } + } else { + break + } + } + return column +} + +// rightPad pads the input with spaces on the right-hand-side to make it have +// at least width n. It treats tabs as enough spaces that lead to the next +// 8-aligned tab-stop. +func rightPad(s string, n int) string { + var str strings.Builder + + // Convert tabs to spaces as we go so padding works regardless of what prefix + // is placed before the result. + column := 0 + for _, c := range s { + column++ + if c == '\t' { + str.WriteRune(' ') + for column%8 != 0 { + column++ + str.WriteRune(' ') + } + } else { + str.WriteRune(c) + } + } + for column < n { + column++ + str.WriteRune(' ') + } + return str.String() +} + +func canonicalizeFileName(fname string) string { + fname = strings.TrimPrefix(fname, "/proc/self/cwd/") + fname = strings.TrimPrefix(fname, "./") + return filepath.Clean(fname) +} diff --git a/plugin/debug/pkg/internal/report/source_html.go b/plugin/debug/pkg/internal/report/source_html.go new file mode 100644 index 00000000..614a5ee2 --- /dev/null +++ b/plugin/debug/pkg/internal/report/source_html.go @@ -0,0 +1,71 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import ( + "html/template" +) + +// AddSourceTemplates adds templates used by PrintWebList to t. +func AddSourceTemplates(t *template.Template) { + template.Must(t.Parse(`{{define "weblistcss"}}` + weblistPageCSS + `{{end}}`)) + template.Must(t.Parse(`{{define "weblistjs"}}` + weblistPageScript + `{{end}}`)) +} + +const weblistPageCSS = `` + +const weblistPageScript = `` diff --git a/plugin/debug/pkg/internal/report/source_test.go b/plugin/debug/pkg/internal/report/source_test.go new file mode 100644 index 00000000..14014f1f --- /dev/null +++ b/plugin/debug/pkg/internal/report/source_test.go @@ -0,0 +1,288 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import ( + "fmt" + "os" + "path/filepath" + "regexp" + "runtime" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/internal/binutils" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func TestWebList(t *testing.T) { + if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { + t.Skip("weblist only tested on x86-64 linux") + } + + cpu := readProfile(filepath.Join("testdata", "sample.cpu"), t) + rpt := New(cpu, &Options{ + OutputFormat: WebList, + Symbol: regexp.MustCompile("busyLoop"), + SampleValue: func(v []int64) int64 { return v[1] }, + SampleUnit: cpu.SampleType[1].Unit, + }) + result, err := MakeWebList(rpt, &binutils.Binutils{}, -1) + if err != nil { + t.Fatalf("could not generate weblist: %v", err) + } + output := fmt.Sprint(result) + + for _, expect := range []string{"func busyLoop", "call.*mapassign"} { + if match, _ := regexp.MatchString(expect, output); !match { + t.Errorf("weblist output does not contain '%s':\n%s", expect, output) + } + } +} + +func TestSourceSyntheticAddress(t *testing.T) { + testSourceMapping(t, true) +} + +func TestSourceMissingMapping(t *testing.T) { + testSourceMapping(t, false) +} + +// testSourceMapping checks that source info is found even when no applicable +// Mapping/objectFile exists. The locations used in the test are either zero +// (if zeroAddress is true), or non-zero (otherwise). +func testSourceMapping(t *testing.T, zeroAddress bool) { + nextAddr := uint64(0) + + makeLoc := func(name, fname string, line int64) *profile.Location { + if !zeroAddress { + nextAddr++ + } + return &profile.Location{ + Address: nextAddr, + Line: []profile.Line{ + { + Function: &profile.Function{Name: name, Filename: fname}, + Line: line, + }, + }, + } + } + + // Create profile that will need synthetic addresses since it has no mappings. + foo100 := makeLoc("foo", "foo.go", 100) + bar50 := makeLoc("bar", "bar.go", 50) + prof := &profile.Profile{ + Sample: []*profile.Sample{ + { + Value: []int64{9}, + Location: []*profile.Location{foo100, bar50}, + }, + { + Value: []int64{17}, + Location: []*profile.Location{bar50}, + }, + }, + } + rpt := &Report{ + prof: prof, + options: &Options{ + Symbol: regexp.MustCompile("foo|bar"), + SampleValue: func(s []int64) int64 { return s[0] }, + }, + formatValue: func(v int64) string { return fmt.Sprint(v) }, + } + + result, err := MakeWebList(rpt, nil, -1) + if err != nil { + t.Fatalf("MakeWebList returned unexpected error: %v", err) + } + got := fmt.Sprint(result) + + expect := regexp.MustCompile( + `(?s)` + // Allow "." to match newline + `bar\.go.* 50\b.* 17 +26 .*` + + `foo\.go.* 100\b.* 9 +9 `) + if !expect.MatchString(got) { + t.Errorf("expected regular expression %v does not match output:\n%s\n", expect, got) + } +} + +func TestOpenSourceFile(t *testing.T) { + tempdir, err := os.MkdirTemp("", "") + if err != nil { + t.Fatalf("failed to create temp dir: %v", err) + } + const lsep = string(filepath.ListSeparator) + for _, tc := range []struct { + desc string + searchPath string + trimPath string + fs []string + path string + wantPath string // If empty, error is wanted. + }{ + { + desc: "exact absolute path is found", + fs: []string{"foo/bar.cc"}, + path: "$dir/foo/bar.cc", + wantPath: "$dir/foo/bar.cc", + }, + { + desc: "exact relative path is found", + searchPath: "$dir", + fs: []string{"foo/bar.cc"}, + path: "foo/bar.cc", + wantPath: "$dir/foo/bar.cc", + }, + { + desc: "multiple search path", + searchPath: "some/path" + lsep + "$dir", + fs: []string{"foo/bar.cc"}, + path: "foo/bar.cc", + wantPath: "$dir/foo/bar.cc", + }, + { + desc: "relative path is found in parent dir", + searchPath: "$dir/foo/bar", + fs: []string{"bar.cc", "foo/bar/baz.cc"}, + path: "bar.cc", + wantPath: "$dir/bar.cc", + }, + { + desc: "trims configured prefix", + searchPath: "$dir", + trimPath: "some-path" + lsep + "/some/remote/path", + fs: []string{"my-project/foo/bar.cc"}, + path: "/some/remote/path/my-project/foo/bar.cc", + wantPath: "$dir/my-project/foo/bar.cc", + }, + { + desc: "trims heuristically", + searchPath: "$dir/my-project", + fs: []string{"my-project/foo/bar.cc"}, + path: "/some/remote/path/my-project/foo/bar.cc", + wantPath: "$dir/my-project/foo/bar.cc", + }, + { + desc: "error when not found", + path: "foo.cc", + }, + } { + t.Run(tc.desc, func(t *testing.T) { + defer func() { + if err := os.RemoveAll(tempdir); err != nil { + t.Fatalf("failed to remove dir %q: %v", tempdir, err) + } + }() + for _, f := range tc.fs { + path := filepath.Join(tempdir, filepath.FromSlash(f)) + dir := filepath.Dir(path) + if err := os.MkdirAll(dir, 0755); err != nil { + t.Fatalf("failed to create dir %q: %v", dir, err) + } + if err := os.WriteFile(path, nil, 0644); err != nil { + t.Fatalf("failed to create file %q: %v", path, err) + } + } + tc.searchPath = filepath.FromSlash(strings.Replace(tc.searchPath, "$dir", tempdir, -1)) + tc.path = filepath.FromSlash(strings.Replace(tc.path, "$dir", tempdir, 1)) + tc.wantPath = filepath.FromSlash(strings.Replace(tc.wantPath, "$dir", tempdir, 1)) + if file, err := openSourceFile(tc.path, tc.searchPath, tc.trimPath); err != nil && tc.wantPath != "" { + t.Errorf("openSourceFile(%q, %q, %q) = err %v, want path %q", tc.path, tc.searchPath, tc.trimPath, err, tc.wantPath) + } else if err == nil { + defer file.Close() + gotPath := file.Name() + if tc.wantPath == "" { + t.Errorf("openSourceFile(%q, %q, %q) = %q, want error", tc.path, tc.searchPath, tc.trimPath, gotPath) + } else if gotPath != tc.wantPath { + t.Errorf("openSourceFile(%q, %q, %q) = %q, want path %q", tc.path, tc.searchPath, tc.trimPath, gotPath, tc.wantPath) + } + } + }) + } +} + +func TestIndentation(t *testing.T) { + for _, c := range []struct { + str string + wantIndent int + }{ + {"", 0}, + {"foobar", 0}, + {" foo", 2}, + {"\tfoo", 8}, + {"\t foo", 9}, + {" \tfoo", 8}, + {" \tfoo", 8}, + {" \tfoo", 16}, + } { + if n := indentation(c.str); n != c.wantIndent { + t.Errorf("indentation(%v): got %d, want %d", c.str, n, c.wantIndent) + } + } +} + +func TestRightPad(t *testing.T) { + for _, c := range []struct { + pad int + in string + expect string + }{ + {0, "", ""}, + {4, "", " "}, + {4, "x", "x "}, + {4, "abcd", "abcd"}, // No padding because of overflow + {4, "abcde", "abcde"}, // No padding because of overflow + {10, "\tx", " x "}, + {10, "w\txy\tz", "w xy z"}, + {20, "w\txy\tz", "w xy z "}, + } { + out := rightPad(c.in, c.pad) + if out != c.expect { + t.Errorf("rightPad(%q, %d): got %q, want %q", c.in, c.pad, out, c.expect) + } + } +} + +func readProfile(fname string, t *testing.T) *profile.Profile { + file, err := os.Open(fname) + if err != nil { + t.Fatalf("%s: could not open profile: %v", fname, err) + } + defer file.Close() + p, err := profile.Parse(file) + if err != nil { + t.Fatalf("%s: could not parse profile: %v", fname, err) + } + + // Fix file names so they do not include absolute path names. + fix := func(s string) string { + const testdir = "/internal/report/" + pos := strings.Index(s, testdir) + if pos == -1 { + return s + } + return s[pos+len(testdir):] + } + for _, m := range p.Mapping { + m.File = fix(m.File) + } + for _, f := range p.Function { + f.Filename = fix(f.Filename) + } + + return p +} diff --git a/plugin/debug/pkg/internal/report/stacks.go b/plugin/debug/pkg/internal/report/stacks.go new file mode 100644 index 00000000..07465235 --- /dev/null +++ b/plugin/debug/pkg/internal/report/stacks.go @@ -0,0 +1,220 @@ +// Copyright 2022 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package report + +import ( + "crypto/sha256" + "encoding/binary" + "fmt" + "path/filepath" + + "m7s.live/v5/plugin/debug/pkg/internal/measurement" + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// StackSet holds a set of stacks corresponding to a profile. +// +// Slices in StackSet and the types it contains are always non-nil, +// which makes Javascript code that uses the JSON encoding less error-prone. +type StackSet struct { + Total int64 // Total value of the profile. + Scale float64 // Multiplier to generate displayed value + Type string // Profile type. E.g., "cpu". + Unit string // One of "B", "s", "GCU", or "" (if unknown) + Stacks []Stack // List of stored stacks + Sources []StackSource // Mapping from source index to info + report *Report +} + +// Stack holds a single stack instance. +type Stack struct { + Value int64 // Total value for all samples of this stack. + Sources []int // Indices in StackSet.Sources (callers before callees). +} + +// StackSource holds function/location info for a stack entry. +type StackSource struct { + FullName string + FileName string + UniqueName string // Disambiguates functions with same names + Inlined bool // If true this source was inlined into its caller + + // Alternative names to display (with decreasing lengths) to make text fit. + // Guaranteed to be non-empty. + Display []string + + // Places holds the list of stack slots where this source occurs. + // In particular, if [a,b] is an element in Places, + // StackSet.Stacks[a].Sources[b] points to this source. + // + // No stack will be referenced twice in the Places slice for a given + // StackSource. In case of recursion, Places will contain the outer-most + // entry in the recursive stack. E.g., if stack S has source X at positions + // 4,6,9,10, the Places entry for X will contain [S,4]. + Places []StackSlot + + // Combined count of stacks where this source is the leaf. + Self int64 + + // Color number to use for this source. + // Colors with high numbers than supported may be treated as zero. + Color int +} + +// StackSlot identifies a particular StackSlot. +type StackSlot struct { + Stack int // Index in StackSet.Stacks + Pos int // Index in Stack.Sources +} + +// Stacks returns a StackSet for the profile in rpt. +func (rpt *Report) Stacks() StackSet { + // Get scale for converting to default unit of the right type. + scale, unit := measurement.Scale(1, rpt.options.SampleUnit, "default") + if unit == "default" { + unit = "" + } + if rpt.options.Ratio > 0 { + scale *= rpt.options.Ratio + } + s := &StackSet{ + Total: rpt.total, + Scale: scale, + Type: rpt.options.SampleType, + Unit: unit, + Stacks: []Stack{}, // Ensure non-nil + Sources: []StackSource{}, // Ensure non-nil + report: rpt, + } + s.makeInitialStacks(rpt) + s.fillPlaces() + return *s +} + +func (s *StackSet) makeInitialStacks(rpt *Report) { + type key struct { + funcName string + fileName string + line int64 + column int64 + inlined bool + } + srcs := map[key]int{} // Sources identified so far. + seenFunctions := map[string]bool{} + unknownIndex := 1 + + getSrc := func(line profile.Line, inlined bool) int { + fn := line.Function + if fn == nil { + fn = &profile.Function{Name: fmt.Sprintf("?%d?", unknownIndex)} + unknownIndex++ + } + + k := key{fn.Name, fn.Filename, line.Line, line.Column, inlined} + if i, ok := srcs[k]; ok { + return i + } + + fileName := trimPath(fn.Filename, rpt.options.TrimPath, rpt.options.SourcePath) + x := StackSource{ + FileName: fileName, + Inlined: inlined, + Places: []StackSlot{}, // Ensure Places is non-nil + } + if fn.Name != "" { + x.FullName = addLineInfo(fn.Name, line) + x.Display = shortNameList(x.FullName) + x.Color = pickColor(packageName(fn.Name)) + } else { // Use file name, e.g., for file granularity display. + x.FullName = addLineInfo(fileName, line) + x.Display = fileNameSuffixes(x.FullName) + x.Color = pickColor(filepath.Dir(fileName)) + } + + if !seenFunctions[x.FullName] { + x.UniqueName = x.FullName + seenFunctions[x.FullName] = true + } else { + // Assign a different name so pivoting picks this function. + x.UniqueName = fmt.Sprint(x.FullName, "#", fn.ID) + } + + s.Sources = append(s.Sources, x) + srcs[k] = len(s.Sources) - 1 + return len(s.Sources) - 1 + } + + // Synthesized root location that will be placed at the beginning of each stack. + s.Sources = []StackSource{{ + FullName: "root", + Display: []string{"root"}, + Places: []StackSlot{}, + }} + + for _, sample := range rpt.prof.Sample { + value := rpt.options.SampleValue(sample.Value) + stack := Stack{Value: value, Sources: []int{0}} // Start with the root + + // Note: we need to reverse the order in the produced stack. + for i := len(sample.Location) - 1; i >= 0; i-- { + loc := sample.Location[i] + for j := len(loc.Line) - 1; j >= 0; j-- { + line := loc.Line[j] + inlined := (j != len(loc.Line)-1) + stack.Sources = append(stack.Sources, getSrc(line, inlined)) + } + } + + leaf := stack.Sources[len(stack.Sources)-1] + s.Sources[leaf].Self += value + s.Stacks = append(s.Stacks, stack) + } +} + +func (s *StackSet) fillPlaces() { + for i, stack := range s.Stacks { + seenSrcs := map[int]bool{} + for j, src := range stack.Sources { + if seenSrcs[src] { + continue + } + seenSrcs[src] = true + s.Sources[src].Places = append(s.Sources[src].Places, StackSlot{i, j}) + } + } +} + +// pickColor picks a color for key. +func pickColor(key string) int { + const numColors = 1048576 + h := sha256.Sum256([]byte(key)) + index := binary.LittleEndian.Uint32(h[:]) + return int(index % numColors) +} + +// Legend returns the list of lines to display as the legend. +func (s *StackSet) Legend() []string { + return reportLabels(s.report, s.report.total, len(s.Sources), len(s.Sources), 0, 0, false) +} + +func addLineInfo(str string, line profile.Line) string { + if line.Column != 0 { + return fmt.Sprint(str, ":", line.Line, ":", line.Column) + } + if line.Line != 0 { + return fmt.Sprint(str, ":", line.Line) + } + return str +} diff --git a/plugin/debug/pkg/internal/report/stacks_test.go b/plugin/debug/pkg/internal/report/stacks_test.go new file mode 100644 index 00000000..c158e8c3 --- /dev/null +++ b/plugin/debug/pkg/internal/report/stacks_test.go @@ -0,0 +1,240 @@ +package report + +import ( + "fmt" + "reflect" + "slices" + "strings" + "testing" + + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// makeTestStacks generates a StackSet from a supplied list of samples. +func makeTestStacks(samples ...*profile.Sample) StackSet { + prof := makeTestProfile(samples...) + rpt := NewDefault(prof, Options{OutputFormat: Tree, CallTree: true}) + return rpt.Stacks() +} + +func TestStacks(t *testing.T) { + // See report_test.go for the functions available to use in tests. + locs := clearLineAndColumn(testL) + main, foo, bar, tee := locs[0], locs[1], locs[2], locs[3] + + // Also make some file-only locations to test file granularity. + fileMain := makeFileLocation(main) + fileFoo := makeFileLocation(foo) + fileBar := makeFileLocation(bar) + + // stack holds an expected stack value found in StackSet. + type stack struct { + value int64 + names []string + } + makeStack := func(value int64, names ...string) stack { + return stack{value, names} + } + + for _, c := range []struct { + name string + stacks StackSet + expect []stack + }{ + { + "simple", + makeTestStacks( + testSample(100, bar, foo, main), + testSample(200, tee, foo, main), + ), + []stack{ + makeStack(100, "0:root", "1:main", "2:foo", "3:bar"), + makeStack(200, "0:root", "1:main", "2:foo", "4:tee"), + }, + }, + { + "recursion", + makeTestStacks( + testSample(100, bar, foo, foo, foo, main), + testSample(200, bar, foo, foo, main), + ), + []stack{ + // Note: Recursive calls to foo have different source indices. + makeStack(100, "0:root", "1:main", "2:foo", "2:foo", "2:foo", "3:bar"), + makeStack(200, "0:root", "1:main", "2:foo", "2:foo", "3:bar"), + }, + }, + { + "files", + makeTestStacks( + testSample(100, fileFoo, fileMain), + testSample(200, fileBar, fileMain), + ), + []stack{ + makeStack(100, "0:root", "1:dir/main", "2:dir/foo"), + makeStack(200, "0:root", "1:dir/main", "3:dir/bar"), + }, + }, + } { + t.Run(c.name, func(t *testing.T) { + var got []stack + for _, s := range c.stacks.Stacks { + stk := stack{ + value: s.Value, + names: make([]string, len(s.Sources)), + } + for i, src := range s.Sources { + stk.names[i] = fmt.Sprint(src, ":", c.stacks.Sources[src].FullName) + } + got = append(got, stk) + } + if !reflect.DeepEqual(c.expect, got) { + t.Errorf("expecting source %+v, got %+v", c.expect, got) + } + }) + } +} + +func TestStackSources(t *testing.T) { + // See report_test.go for the functions available to use in tests. + locs := clearLineAndColumn(testL) + main, foo, bar, tee, inl := locs[0], locs[1], locs[2], locs[3], locs[5] + + type srcInfo struct { + name string + self int64 + inlined bool + } + + source := func(stacks StackSet, name string) srcInfo { + src := findSource(stacks, name) + return srcInfo{src.FullName, src.Self, src.Inlined} + } + + for _, c := range []struct { + name string + stacks StackSet + srcs []srcInfo + }{ + { + "empty", + makeTestStacks(), + []srcInfo{}, + }, + { + "two-leaves", + makeTestStacks( + testSample(100, bar, foo, main), + testSample(200, tee, bar, foo, main), + testSample(1000, tee, main), + ), + []srcInfo{ + {"main", 0, false}, + {"bar", 100, false}, + {"foo", 0, false}, + {"tee", 1200, false}, + }, + }, + { + "inlined", + makeTestStacks( + testSample(100, inl), + testSample(200, inl), + ), + []srcInfo{ + // inl has bar->tee + {"tee", 300, true}, + }, + }, + { + "recursion", + makeTestStacks( + testSample(100, foo, foo, foo, main), + testSample(100, foo, foo, main), + ), + []srcInfo{ + {"main", 0, false}, + {"foo", 200, false}, + }, + }, + { + "flat", + makeTestStacks( + testSample(100, main), + testSample(100, foo), + testSample(100, bar), + testSample(100, tee), + ), + []srcInfo{ + {"main", 100, false}, + {"bar", 100, false}, + {"foo", 100, false}, + {"tee", 100, false}, + }, + }, + } { + t.Run(c.name, func(t *testing.T) { + for _, expect := range c.srcs { + got := source(c.stacks, expect.name) + if !reflect.DeepEqual(expect, got) { + t.Errorf("expecting source %+v, got %+v", expect, got) + } + } + }) + } +} + +func TestLegend(t *testing.T) { + // See report_test.go for the functions available to use in tests. + main, foo, bar, tee := testL[0], testL[1], testL[2], testL[3] + stacks := makeTestStacks( + testSample(100, bar, foo, main), + testSample(200, tee, foo, main), + ) + got := strings.Join(stacks.Legend(), "\n") + expectStrings := []string{"Type: samples", "Showing nodes", "100% of 300 total"} + for _, expect := range expectStrings { + if !strings.Contains(got, expect) { + t.Errorf("missing expected string %q in legend %q", expect, got) + } + } +} + +func findSource(stacks StackSet, name string) StackSource { + for _, src := range stacks.Sources { + if src.FullName == name { + return src + } + } + return StackSource{} +} + +// clearLineAndColumn drops line and column numbers to simplify tests that +// do not care about line and column numbers. +func clearLineAndColumn(locs []*profile.Location) []*profile.Location { + result := make([]*profile.Location, len(locs)) + for i, loc := range locs { + newLoc := *loc + newLoc.Line = slices.Clone(loc.Line) + for j := range newLoc.Line { + newLoc.Line[j].Line = 0 + newLoc.Line[j].Column = 0 + } + result[i] = &newLoc + } + return result +} + +// makeFileLocation switches loc from function to file-granularity. +func makeFileLocation(loc *profile.Location) *profile.Location { + result := *loc + result.ID += 1000 + result.Line = slices.Clone(loc.Line) + for i := range result.Line { + fn := *result.Line[i].Function + fn.Filename = "dir/" + fn.Name + fn.Name = "" + result.Line[i].Function = &fn + } + return &result +} diff --git a/plugin/debug/pkg/internal/report/synth.go b/plugin/debug/pkg/internal/report/synth.go new file mode 100644 index 00000000..261e8a92 --- /dev/null +++ b/plugin/debug/pkg/internal/report/synth.go @@ -0,0 +1,39 @@ +package report + +import ( + "m7s.live/v5/plugin/debug/pkg/profile" +) + +// synthCode assigns addresses to locations without an address. +type synthCode struct { + next uint64 + addr map[*profile.Location]uint64 // Synthesized address assigned to a location +} + +func newSynthCode(mappings []*profile.Mapping) *synthCode { + // Find a larger address than any mapping. + s := &synthCode{next: 1} + for _, m := range mappings { + if s.next < m.Limit { + s.next = m.Limit + } + } + return s +} + +// address returns the synthetic address for loc, creating one if needed. +func (s *synthCode) address(loc *profile.Location) uint64 { + if loc.Address != 0 { + panic("can only synthesize addresses for locations without an address") + } + if addr, ok := s.addr[loc]; ok { + return addr + } + if s.addr == nil { + s.addr = map[*profile.Location]uint64{} + } + addr := s.next + s.next++ + s.addr[loc] = addr + return addr +} diff --git a/plugin/debug/pkg/internal/report/synth_test.go b/plugin/debug/pkg/internal/report/synth_test.go new file mode 100644 index 00000000..7eb584da --- /dev/null +++ b/plugin/debug/pkg/internal/report/synth_test.go @@ -0,0 +1,36 @@ +package report + +import ( + "testing" + + "m7s.live/v5/plugin/debug/pkg/profile" +) + +func TestSynthAddresses(t *testing.T) { + s := newSynthCode(nil) + l1 := &profile.Location{} + addr1 := s.address(l1) + if s.address(l1) != addr1 { + t.Errorf("different calls with same location returned different addresses") + } + + l2 := &profile.Location{} + addr2 := s.address(l2) + if addr2 == addr1 { + t.Errorf("same address assigned to different locations") + } + +} + +func TestSynthAvoidsMapping(t *testing.T) { + mappings := []*profile.Mapping{ + {Start: 100, Limit: 200}, + {Start: 300, Limit: 400}, + } + s := newSynthCode(mappings) + loc := &profile.Location{} + addr := s.address(loc) + if addr >= 100 && addr < 200 || addr >= 300 && addr < 400 { + t.Errorf("synthetic location %d overlaps mapping %v", addr, mappings) + } +} diff --git a/plugin/debug/pkg/internal/report/testdata/README.md b/plugin/debug/pkg/internal/report/testdata/README.md new file mode 100644 index 00000000..2b60fcca --- /dev/null +++ b/plugin/debug/pkg/internal/report/testdata/README.md @@ -0,0 +1,10 @@ +sample/ contains a sample program that can be profiled. +sample.bin is its x86-64 binary. +sample.cpu is a profile generated by sample.bin. + +To update the binary and profile: + +```shell +go build -o sample.bin ./sample +./sample.bin -cpuprofile sample.cpu +``` diff --git a/plugin/debug/pkg/internal/report/testdata/sample.bin b/plugin/debug/pkg/internal/report/testdata/sample.bin new file mode 100755 index 0000000000000000000000000000000000000000..25929e64601bc73834a7e2244803cc9d595bb32b GIT binary patch literal 2342380 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 _AlMq#unl40pfX208=LnXzU%Iw_Z-= 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

lu#oCQ01R{i5Pr0~tP{uOxXS*D+sNI4wkld1lj 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