From b49dd2451031e23addcb50d29534eb28bb610f58 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Thu, 7 Oct 2021 17:41:31 -0400 Subject: [PATCH 001/107] alloc profiler --- base/gcutils.jl | 8 + src/Makefile | 4 +- src/gc-alloc-profiler.cpp | 482 ++++++++++++++++++++++++++++++++++++++ src/gc-alloc-profiler.h | 37 +++ src/gc.c | 2 + src/gc.h | 1 + src/julia_internal.h | 4 + 7 files changed, 536 insertions(+), 2 deletions(-) create mode 100644 src/gc-alloc-profiler.cpp create mode 100644 src/gc-alloc-profiler.h diff --git a/base/gcutils.jl b/base/gcutils.jl index d17301a1be9b0..fccdec0f9eb75 100644 --- a/base/gcutils.jl +++ b/base/gcutils.jl @@ -105,6 +105,14 @@ Control whether garbage collection is enabled using a boolean argument (`true` f """ enable(on::Bool) = ccall(:jl_gc_enable, Int32, (Int32,), on) != 0 +function start_alloc_profile(skip_every::Int=0) + ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) +end + +function stop_and_write_alloc_profile(io) + ccall(:jl_stop_and_write_alloc_profile, Cvoid, (Ptr{Cvoid},), io.handle) +end + """ GC.enable_finalizers(on::Bool) diff --git a/src/Makefile b/src/Makefile index cda08995f5538..b93415a63e763 100644 --- a/src/Makefile +++ b/src/Makefile @@ -45,7 +45,7 @@ RUNTIME_SRCS := \ jltypes gf typemap smallintset ast builtins module interpreter symbol \ dlload sys init task array dump staticdata toplevel jl_uv datatype \ simplevector runtime_intrinsics precompile \ - threading partr stackwalk gc gc-debug gc-pages gc-stacks method \ + threading partr stackwalk gc gc-debug gc-pages gc-stacks gc-alloc-profiler method \ jlapi signal-handling safepoint timing subtype \ crc32c APInt-C processor ircode opaque_closure codegen-stubs coverage SRCS := jloptions runtime_ccall rtutils @@ -288,7 +288,7 @@ $(BUILDDIR)/disasm.o $(BUILDDIR)/disasm.dbg.obj: $(SRCDIR)/debuginfo.h $(SRCDIR) $(BUILDDIR)/dump.o $(BUILDDIR)/dump.dbg.obj: $(addprefix $(SRCDIR)/,common_symbols1.inc common_symbols2.inc builtin_proto.h serialize.h) $(BUILDDIR)/gc-debug.o $(BUILDDIR)/gc-debug.dbg.obj: $(SRCDIR)/gc.h $(BUILDDIR)/gc-pages.o $(BUILDDIR)/gc-pages.dbg.obj: $(SRCDIR)/gc.h -$(BUILDDIR)/gc.o $(BUILDDIR)/gc.dbg.obj: $(SRCDIR)/gc.h +$(BUILDDIR)/gc.o $(BUILDDIR)/gc.dbg.obj: $(SRCDIR)/gc.h $(SRCDIR)/gc-alloc-profiler.h $(BUILDDIR)/init.o $(BUILDDIR)/init.dbg.obj: $(SRCDIR)/builtin_proto.h $(BUILDDIR)/interpreter.o $(BUILDDIR)/interpreter.dbg.obj: $(SRCDIR)/builtin_proto.h $(BUILDDIR)/jitlayers.o $(BUILDDIR)/jitlayers.dbg.obj: $(SRCDIR)/jitlayers.h $(SRCDIR)/codegen_shared.h diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp new file mode 100644 index 0000000000000..d8bb5af7cdd47 --- /dev/null +++ b/src/gc-alloc-profiler.cpp @@ -0,0 +1,482 @@ +// This file is a part of Julia. License is MIT: https://julialang.org/license + +#include "gc-alloc-profiler.h" + +#include "julia_internal.h" +#include "gc.h" + +#include +#include +#include + +using std::unordered_map; +using std::string; +using std::vector; + +struct StackFrame { + string func_name; + string file_name; + intptr_t line_no; + + string total; // cache of the above fields concatenated +}; + +struct RawBacktrace { + jl_bt_element_t *data; + size_t size; +}; + +struct Alloc { + size_t type_address; + RawBacktrace backtrace; + size_t size; +}; + +struct AllocProfile { + int skip_every; + + vector allocs; + unordered_map type_name_by_address; + + size_t alloc_counter; + size_t last_recorded_alloc; +}; + +struct Serializer { + AllocProfile *profile; + unordered_map> frames_cache; + size_t cache_hits; + size_t cache_misses; +}; + +// == utility functions == + +// https://stackoverflow.com/a/33799784/751061 +// TODO: dedup with heap snapshot, or rebase off of that branch +void print_str_escape_json_(ios_t *stream, const string &s) { + ios_printf(stream, "\""); + for (auto c = s.cbegin(); c != s.cend(); c++) { + switch (*c) { + case '"': ios_printf(stream, "\\\""); break; + case '\\': ios_printf(stream, "\\\\"); break; + case '\b': ios_printf(stream, "\\b"); break; + case '\f': ios_printf(stream, "\\f"); break; + case '\n': ios_printf(stream, "\\n"); break; + case '\r': ios_printf(stream, "\\r"); break; + case '\t': ios_printf(stream, "\\t"); break; + default: + if ('\x00' <= *c && *c <= '\x1f') { + ios_printf(stream, "\\u%04x", (int)*c); + } else { + ios_printf(stream, "%c", *c); + } + } + } + ios_printf(stream, "\""); +} + +struct StringTable { + typedef unordered_map MapType; + + MapType map; + vector strings; + + StringTable() {} + StringTable(std::initializer_list strs) : strings(strs) { + for (const auto& str : strs) { + map.insert({str, map.size()}); + } + } + + size_t find_or_create_string_id(string key) { + auto val = map.find(key); + if (val == map.end()) { + val = map.insert(val, {key, map.size()}); + strings.push_back(key); + } + return val->second; + } + + void print_json_array(ios_t *stream, string key, bool newlines) { + ios_printf(stream, "["); + bool first = true; + size_t id = 0; + for (const auto &str : strings) { + if (first) { + first = false; + } else { + ios_printf(stream, newlines ? ",\n" : ","); + } + ios_printf(stream, "{\"id\":%zu", id); + id++; + ios_printf(stream, ",\"%s\":", key.c_str()); + print_str_escape_json_(stream, str); + ios_printf(stream, "}"); + } + ios_printf(stream, "]"); + } +}; + +string frame_as_string(jl_bt_element_t *entry, size_t entry_size) { + auto size_in_bytes = entry_size * sizeof(jl_bt_element_t); + char *buf = (char*)malloc(size_in_bytes); + for (int i=0; i < size_in_bytes; i++) { + buf[i] = ((char*)entry)[i]; + } + return string(buf, size_in_bytes); +} + +// https://stackoverflow.com/questions/874134/find-out-if-string-ends-with-another-string-in-c +bool ends_with(string const &full_string, string const &ending) { + if (full_string.length() >= ending.length()) { + return (0 == full_string.compare(full_string.length() - ending.length(), ending.length(), ending)); + } else { + return false; + } +} + +bool starts_with(string const &full_string, string const &beginning) { + if (full_string.length() >= beginning.length()) { + return (0 == full_string.compare(0, beginning.length(), beginning)); + } else { + return false; + } +} + +string _type_as_string(jl_datatype_t *type) { + if ((uintptr_t)type < 4096U) { + return ""; + } else if (type == (jl_datatype_t*)jl_buff_tag) { + return ""; + } else if (type == (jl_datatype_t*)jl_malloc_tag) { + return ""; + } else if (type == jl_string_type) { + return ""; + } else if (type == jl_symbol_type) { + return ""; + } else if (jl_is_datatype(type)) { + ios_t str_; + ios_mem(&str_, 10024); + JL_STREAM* str = (JL_STREAM*)&str_; + + jl_static_show(str, (jl_value_t*)type); + + string type_str = string((const char*)str_.buf, str_.size); + ios_close(&str_); + + return type_str; + } else { + return ""; + } +} + +// === stack stuff === + +vector get_julia_frames(jl_bt_element_t *bt_entry) { + vector ret; + + size_t ip = jl_bt_entry_header(bt_entry); + jl_value_t *code = jl_bt_entry_jlvalue(bt_entry, 0); + if (jl_is_method_instance(code)) { + // When interpreting a method instance, need to unwrap to find the code info + code = ((jl_method_instance_t*)code)->uninferred; + } + if (jl_is_code_info(code)) { + jl_code_info_t *src = (jl_code_info_t*)code; + // See also the debug info handling in codegen.cpp. + // NB: debuginfoloc is 1-based! + intptr_t debuginfoloc = ((int32_t*)jl_array_data(src->codelocs))[ip]; + while (debuginfoloc != 0) { + jl_line_info_node_t *locinfo = (jl_line_info_node_t*) + jl_array_ptr_ref(src->linetable, debuginfoloc - 1); + assert(jl_typeis(locinfo, jl_lineinfonode_type)); + const char *func_name = "Unknown"; + jl_value_t *method = locinfo->method; + if (jl_is_method_instance(method)) + method = ((jl_method_instance_t*)method)->def.value; + if (jl_is_method(method)) + method = (jl_value_t*)((jl_method_t*)method)->name; + if (jl_is_symbol(method)) + func_name = jl_symbol_name((jl_sym_t*)method); + + ret.push_back(StackFrame{ + func_name, + jl_symbol_name(locinfo->file), + locinfo->line, + }); + + debuginfoloc = locinfo->inlined_at; + } + } + else { + // If we're using this function something bad has already happened; + // be a bit defensive to avoid crashing while reporting the crash. + jl_safe_printf("No code info - unknown interpreter state!\n"); + } + return ret; +} + +vector get_native_frames(uintptr_t ip) JL_NOTSAFEPOINT { + vector out_frames; + + // This function is not allowed to reference any TLS variables since + // it can be called from an unmanaged thread on OSX. + // it means calling getFunctionInfo with noInline = 1 + jl_frame_t *frames = NULL; + int n = jl_getFunctionInfo(&frames, ip, 0, 0); + int i; + + for (i = 0; i < n; i++) { + jl_frame_t frame = frames[i]; + if (!frame.func_name) { + // TODO: record these somewhere + // jl_safe_printf("unknown function (ip: %p)\n", (void*)ip); + } + else { + out_frames.push_back(StackFrame{ + frame.func_name, + frame.file_name, + frame.line, + }); + + free(frame.func_name); + free(frame.file_name); + } + } + free(frames); + + return out_frames; +} + +vector get_frames( + Serializer *serializer, + jl_bt_element_t *entry, + size_t entry_size, + bool is_native +) { + string entry_str = frame_as_string(entry, entry_size); + + auto maybe_frames = serializer->frames_cache.find(entry_str); + if (maybe_frames == serializer->frames_cache.end()) { + serializer->cache_misses++; + auto frames = is_native + ? get_native_frames(entry[0].uintptr) + : get_julia_frames(entry); + serializer->frames_cache[entry_str] = frames; + return frames; + } else { + serializer->cache_hits++; + return maybe_frames->second; + } +} + +RawBacktrace get_raw_backtrace() { + // TODO: don't allocate this every time + jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(JL_MAX_BT_SIZE); + + // TODO: tune the number of frames that are skipped + size_t bt_size = rec_backtrace(bt_data, JL_MAX_BT_SIZE, 1); + + return RawBacktrace{ + bt_data, + bt_size + }; +} + +vector expand_stack(Serializer *serializer, RawBacktrace backtrace) { + vector out; + + int i = 0; + while (i < backtrace.size) { + jl_bt_element_t *entry = backtrace.data + i; + auto entry_size = jl_bt_entry_size(entry); + i += entry_size; + auto is_native = jl_bt_is_native(entry);; + + // TODO: cache frames by bt_element as string? + auto frames = get_frames(serializer, entry, entry_size, is_native); + + for (auto frame : frames) { + auto frame_label = frame.func_name; + auto is_julia = ends_with(frame.file_name, ".jl") || frame.file_name == "top-level scope"; + auto actual_is_native = !is_julia; + auto is_stdlib = is_julia && starts_with(frame.file_name, "./"); + + if (actual_is_native || is_stdlib) { + continue; + } + + out.push_back(frame); + } + } + + return out; +} + +string stack_frame_to_string(StackFrame frame) { + if (frame.total != "") { + return frame.total; + } + + ios_t str; + ios_mem(&str, 1024); + + ios_printf( + &str, "%s at %s:%d", + frame.func_name.c_str(), frame.file_name.c_str(), frame.line_no + ); + + string type_str = string((const char*)str.buf, str.size); + frame.total = type_str; + ios_close(&str); + + return frame.total; +} + +// === trie stuff === + +void profile_serialize(ios_t *out, Serializer *serializer) { + StringTable locations; + + ios_printf(out, "{\n"); + ios_printf(out, " \"allocs\":[\n"); + bool first_alloc = true; + for (auto alloc : serializer->profile->allocs) { + if (first_alloc) { + first_alloc = false; + } else { + ios_printf(out, ",\n"); + } + + auto frames = expand_stack(serializer, alloc.backtrace); + // print out stack and type + + ios_printf(out, " {\"stack\":["); + bool first_frame = true; + for (auto frame : frames) { + if (first_frame) { + first_frame = false; + } else { + ios_printf(out, ","); + } + + size_t frame_id = locations.find_or_create_string_id(stack_frame_to_string(frame)); + ios_printf(out, "%zu", frame_id); + } + ios_printf(out, "]"); // end stack + + ios_printf(out, ",\"type\":\"%zu\"", alloc.type_address); + ios_printf(out, ",\"size\":%zu", alloc.size); + ios_printf(out, "}"); // end alloc + } + ios_printf(out, "\n ],\n"); // end allocs + + // print locations + ios_printf(out, " \"locations\":"); + locations.print_json_array(out, "key", true); + ios_printf(out, ",\n"); // end locations + + // print types + ios_printf(out, " \"types\":[\n"); + auto first_type = true; + for (auto type : serializer->profile->type_name_by_address) { + if (first_type) { + first_type = false; + } else { + ios_printf(out, ",\n"); + } + + ios_printf(out, " {"); + ios_printf(out, "\"id\":\"%zu\",", type.first); + ios_printf(out, "\"name\":"); + print_str_escape_json_(out, type.second); + ios_printf(out, "}"); + } + ios_printf(out, "\n ]\n"); + + ios_printf(out, "}\n"); +} + +void alloc_profile_serialize(ios_t *out, AllocProfile *profile) { + jl_printf(JL_STDERR, "serializing trie from %d allocs\n", profile->allocs.size()); + + auto serializer = Serializer{profile}; + profile_serialize(out, &serializer); + + jl_printf(JL_STDERR, " frame cache hits: %d\n", serializer.cache_hits); + jl_printf(JL_STDERR, " frame cache misses: %d\n", serializer.cache_misses); +} + +// == global variables manipulated by callbacks == + +AllocProfile *g_alloc_profile = nullptr; +int g_alloc_profile_enabled = false; + +// == exported interface == + +JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { + g_alloc_profile_enabled = true; + g_alloc_profile = new AllocProfile{skip_every}; +} + +JL_DLLEXPORT void jl_stop_and_write_alloc_profile(ios_t *stream) { + alloc_profile_serialize(stream, g_alloc_profile); + ios_flush(stream); + + // TODO: free everything in the profile + // especially all those malloc'd backtraces + + g_alloc_profile_enabled = false; + + // TODO: something to free the alloc profile? + // I don't know how to C++ + g_alloc_profile = nullptr; +} + +// == callbacks called into by the outside == + +void register_type_string(jl_datatype_t *type) { + auto id = g_alloc_profile->type_name_by_address.find((size_t)type); + if (id != g_alloc_profile->type_name_by_address.end()) { + return; + } + + string type_str = _type_as_string(type); + g_alloc_profile->type_name_by_address[(size_t)type] = type_str; +} + +void _record_allocated_value(jl_value_t *val, size_t size) { + auto profile = g_alloc_profile; + profile->alloc_counter++; + auto diff = profile->alloc_counter - profile->last_recorded_alloc; + if (diff < profile->skip_every) { + return; + } + profile->last_recorded_alloc = profile->alloc_counter; + + auto type = (jl_datatype_t*)jl_typeof(val); + register_type_string(type); + + // TODO: get stack, push into vector + auto backtrace = get_raw_backtrace(); + + profile->allocs.push_back(Alloc{ + (size_t) type, + backtrace, + size + }); +} + +void _report_gc_started() { + // ... +} + +// TODO: figure out how to pass all of these in as a struct +void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) { + // TODO: figure out how to put in commas + jl_printf( + JL_STDERR, + "GC: pause %fms. collected %fMB. %lld allocs total\n", + pause/1e6, freed/1e6, allocd + ); +} diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h new file mode 100644 index 0000000000000..b77c2335e3e35 --- /dev/null +++ b/src/gc-alloc-profiler.h @@ -0,0 +1,37 @@ +// This file is a part of Julia. License is MIT: https://julialang.org/license + +#ifndef JL_GC_ALLOC_PROFILER_H +#define JL_GC_ALLOC_PROFILER_H + +#include "julia.h" +#include "ios.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void _report_gc_started(void); +void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd); +JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); +JL_DLLEXPORT void jl_stop_and_write_alloc_profile(ios_t *stream); + +void _record_allocated_value(jl_value_t *val, size_t size); + +// --------------------------------------------------------------------- +// functions to call from GC when alloc profiling is enabled +// --------------------------------------------------------------------- + +extern int g_alloc_profile_enabled; + +static inline void record_allocated_value(jl_value_t *val, size_t size) { + if (__unlikely(g_alloc_profile_enabled)) { + _record_allocated_value(val, size); + } +} + +#ifdef __cplusplus +} +#endif + + +#endif // JL_GC_ALLOC_PROFILER_H diff --git a/src/gc.c b/src/gc.c index 56b2c31cbe7f1..b3bb8d9e05ac0 100644 --- a/src/gc.c +++ b/src/gc.c @@ -3009,6 +3009,8 @@ size_t jl_maxrss(void); // Only one thread should be running in this function static int _jl_gc_collect(jl_ptls_t ptls, jl_gc_collection_t collection) { + _report_gc_started(); + combine_thread_gc_counts(&gc_num); jl_gc_mark_cache_t *gc_cache = &ptls->gc_cache; diff --git a/src/gc.h b/src/gc.h index f34ddaee5ee64..544486d933e10 100644 --- a/src/gc.h +++ b/src/gc.h @@ -24,6 +24,7 @@ #endif #endif #include "julia_assert.h" +#include "gc-alloc-profiler.h" #ifdef __cplusplus extern "C" { diff --git a/src/julia_internal.h b/src/julia_internal.h index a8c289f14a145..14cc3416e72aa 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -9,6 +9,7 @@ #include "support/hashing.h" #include "support/ptrhash.h" #include "support/strtod.h" +#include "gc-alloc-profiler.h" #include #if !defined(_WIN32) #include @@ -364,6 +365,9 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty) v = jl_gc_big_alloc(ptls, allocsz); } jl_set_typeof(v, ty); + + record_allocated_value(v, sz); + return v; } From 2fe16781543b39db747db67d8affe9cf1bcfc0a1 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Fri, 22 Oct 2021 16:43:55 -0400 Subject: [PATCH 002/107] fix key --- src/gc-alloc-profiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index d8bb5af7cdd47..ff19f70fc8f92 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -373,7 +373,7 @@ void profile_serialize(ios_t *out, Serializer *serializer) { // print locations ios_printf(out, " \"locations\":"); - locations.print_json_array(out, "key", true); + locations.print_json_array(out, "loc", true); ios_printf(out, ",\n"); // end locations // print types From c370f5a634d22df23a48c43ec5f0b5af919e3b67 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Fri, 22 Oct 2021 17:34:40 -0400 Subject: [PATCH 003/107] don't skip stdlib --- src/gc-alloc-profiler.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index ff19f70fc8f92..2d8cbdca1f7be 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -300,9 +300,8 @@ vector expand_stack(Serializer *serializer, RawBacktrace backtrace) auto frame_label = frame.func_name; auto is_julia = ends_with(frame.file_name, ".jl") || frame.file_name == "top-level scope"; auto actual_is_native = !is_julia; - auto is_stdlib = is_julia && starts_with(frame.file_name, "./"); - if (actual_is_native || is_stdlib) { + if (actual_is_native) { continue; } From b8cffd38fd0ec4c97e5080ce7f541f1c2648b384 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Sat, 23 Oct 2021 11:26:36 -0400 Subject: [PATCH 004/107] rename --- src/gc-alloc-profiler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 2d8cbdca1f7be..72fbe4653133d 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -53,7 +53,7 @@ struct Serializer { // https://stackoverflow.com/a/33799784/751061 // TODO: dedup with heap snapshot, or rebase off of that branch -void print_str_escape_json_(ios_t *stream, const string &s) { +void print_str_escape_json(ios_t *stream, const string &s) { ios_printf(stream, "\""); for (auto c = s.cbegin(); c != s.cend(); c++) { switch (*c) { @@ -110,7 +110,7 @@ struct StringTable { ios_printf(stream, "{\"id\":%zu", id); id++; ios_printf(stream, ",\"%s\":", key.c_str()); - print_str_escape_json_(stream, str); + print_str_escape_json(stream, str); ios_printf(stream, "}"); } ios_printf(stream, "]"); @@ -388,7 +388,7 @@ void profile_serialize(ios_t *out, Serializer *serializer) { ios_printf(out, " {"); ios_printf(out, "\"id\":\"%zu\",", type.first); ios_printf(out, "\"name\":"); - print_str_escape_json_(out, type.second); + print_str_escape_json(out, type.second); ios_printf(out, "}"); } ios_printf(out, "\n ]\n"); From c733cd6f16a7ff59a9ae93ea08a4f7f8d88565b5 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Sat, 23 Oct 2021 11:36:24 -0400 Subject: [PATCH 005/107] record freed values --- src/gc-alloc-profiler.cpp | 19 +++++++++++++++++++ src/gc-alloc-profiler.h | 7 +++++++ src/gc.c | 1 + 3 files changed, 27 insertions(+) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 72fbe4653133d..1cc3815d452a4 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -37,6 +37,8 @@ struct AllocProfile { vector allocs; unordered_map type_name_by_address; + unordered_map type_address_by_value_address; + unordered_map frees_by_type_address; size_t alloc_counter; size_t last_recorded_alloc; @@ -466,6 +468,23 @@ void _record_allocated_value(jl_value_t *val, size_t size) { }); } +void _record_freed_value(jl_taggedvalue_t *tagged_val) { + jl_value_t *val = jl_valueof(tagged_val); + + auto value_address = (size_t)val; + auto type_address = g_alloc_profile->type_address_by_value_address.find(value_address); + if (type_address == g_alloc_profile->type_address_by_value_address.end()) { + return; // TODO: warn + } + auto frees = g_alloc_profile->frees_by_type_address.find(type_address->second); + + if (frees == g_alloc_profile->frees_by_type_address.end()) { + g_alloc_profile->frees_by_type_address[type_address->second] = 1; + } else { + g_alloc_profile->frees_by_type_address[type_address->second] = frees->second + 1; + } +} + void _report_gc_started() { // ... } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index b77c2335e3e35..14aeecda936d5 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -16,6 +16,7 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); JL_DLLEXPORT void jl_stop_and_write_alloc_profile(ios_t *stream); void _record_allocated_value(jl_value_t *val, size_t size); +void _record_freed_value(jl_taggedvalue_t *tagged_val); // --------------------------------------------------------------------- // functions to call from GC when alloc profiling is enabled @@ -29,6 +30,12 @@ static inline void record_allocated_value(jl_value_t *val, size_t size) { } } +static inline void record_freed_value(jl_taggedvalue_t *tagged_val) { + if (__unlikely(g_alloc_profile_enabled != 0)) { + _record_freed_value(tagged_val); + } +} + #ifdef __cplusplus } #endif diff --git a/src/gc.c b/src/gc.c index b3bb8d9e05ac0..e92dc498622d1 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1325,6 +1325,7 @@ static jl_taggedvalue_t **sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t *pg, jl_t while ((char*)v <= lim) { int bits = v->bits.gc; if (!gc_marked(bits)) { + record_freed_value(v); *pfl = v; pfl = &v->next; pfl_begin = pfl_begin ? pfl_begin : pfl; From 964a8a496639b99cdf45b4ae8bf6b7f474eaece0 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Sat, 23 Oct 2021 11:40:21 -0400 Subject: [PATCH 006/107] print frees by type strangely empty --- src/gc-alloc-profiler.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 1cc3815d452a4..0a5ecb8b79eec 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -334,8 +334,6 @@ string stack_frame_to_string(StackFrame frame) { return frame.total; } -// === trie stuff === - void profile_serialize(ios_t *out, Serializer *serializer) { StringTable locations; @@ -393,7 +391,24 @@ void profile_serialize(ios_t *out, Serializer *serializer) { print_str_escape_json(out, type.second); ios_printf(out, "}"); } - ios_printf(out, "\n ]\n"); + ios_printf(out, "\n ],\n"); + + // print frees + ios_printf(out, " \"frees_by_type\":[\n"); + auto first_free = true; + for (auto free : serializer->profile->frees_by_type_address) { + if (first_free) { + first_free = false; + } else { + ios_printf(out, ",\n"); + } + + ios_printf(out, " {"); + ios_printf(out, "\"type_id\":\"%zu\"", free.first); + ios_printf(out, "\"count\":%zu", free.second); + ios_printf(out, "}"); + } + ios_printf(out, "\n ]\n"); // end frees by type ios_printf(out, "}\n"); } From aed5f5d409a20bd416678cce7356957b109514d4 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Sat, 23 Oct 2021 11:42:44 -0400 Subject: [PATCH 007/107] fix recording & printing of frees --- src/gc-alloc-profiler.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 0a5ecb8b79eec..aee46dce85555 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -404,7 +404,7 @@ void profile_serialize(ios_t *out, Serializer *serializer) { } ios_printf(out, " {"); - ios_printf(out, "\"type_id\":\"%zu\"", free.first); + ios_printf(out, "\"type_id\":\"%zu\",", free.first); ios_printf(out, "\"count\":%zu", free.second); ios_printf(out, "}"); } @@ -473,6 +473,8 @@ void _record_allocated_value(jl_value_t *val, size_t size) { auto type = (jl_datatype_t*)jl_typeof(val); register_type_string(type); + profile->type_address_by_value_address[(size_t)val] = (size_t)type; + // TODO: get stack, push into vector auto backtrace = get_raw_backtrace(); From 665cacda81a9a99cf6c4c84e52820e981b943bf6 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Mon, 6 Dec 2021 18:14:54 -0500 Subject: [PATCH 008/107] Return the raw data from the C++ allocations vector into julia!! :) --- src/gc-alloc-profiler.cpp | 307 +++++++++----------------------------- src/gc-alloc-profiler.h | 7 +- 2 files changed, 76 insertions(+), 238 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index aee46dce85555..01d7558614db9 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -24,6 +24,28 @@ struct StackFrame { struct RawBacktrace { jl_bt_element_t *data; size_t size; + + RawBacktrace( + jl_bt_element_t *_data, + size_t _size + ) : data(_data), size(_size) {} + + ~RawBacktrace() { + if (data != nullptr) { + free(data); + } + } + // Move constructor (X a = X{...}) + RawBacktrace(RawBacktrace&& rhs) : + data(rhs.data), size(rhs.size) + { + rhs.data = nullptr; + rhs.size = 0; + } + private: + // Disallow copy and copy-assignment + RawBacktrace(const RawBacktrace&) = delete; // X b(a); + RawBacktrace& operator=(const RawBacktrace& other) = delete; // b = a; }; struct Alloc { @@ -33,6 +55,10 @@ struct Alloc { }; struct AllocProfile { + AllocProfile(int _skip_every) { + reset(_skip_every); + } + int skip_every; vector allocs; @@ -42,15 +68,24 @@ struct AllocProfile { size_t alloc_counter; size_t last_recorded_alloc; -}; -struct Serializer { - AllocProfile *profile; - unordered_map> frames_cache; - size_t cache_hits; - size_t cache_misses; + void reset(int _skip_every) { + skip_every = _skip_every; + alloc_counter = 0; + last_recorded_alloc = 0; + } + + private: + AllocProfile(const AllocProfile&) = delete; // X b(a); + AllocProfile& operator=(const AllocProfile& other) = delete; // b = a; }; +// == global variables manipulated by callbacks == + +AllocProfile g_alloc_profile(0); +int g_alloc_profile_enabled = false; + + // == utility functions == // https://stackoverflow.com/a/33799784/751061 @@ -206,7 +241,7 @@ vector get_julia_frames(jl_bt_element_t *bt_entry) { jl_symbol_name(locinfo->file), locinfo->line, }); - + debuginfoloc = locinfo->inlined_at; } } @@ -218,63 +253,8 @@ vector get_julia_frames(jl_bt_element_t *bt_entry) { return ret; } -vector get_native_frames(uintptr_t ip) JL_NOTSAFEPOINT { - vector out_frames; - - // This function is not allowed to reference any TLS variables since - // it can be called from an unmanaged thread on OSX. - // it means calling getFunctionInfo with noInline = 1 - jl_frame_t *frames = NULL; - int n = jl_getFunctionInfo(&frames, ip, 0, 0); - int i; - - for (i = 0; i < n; i++) { - jl_frame_t frame = frames[i]; - if (!frame.func_name) { - // TODO: record these somewhere - // jl_safe_printf("unknown function (ip: %p)\n", (void*)ip); - } - else { - out_frames.push_back(StackFrame{ - frame.func_name, - frame.file_name, - frame.line, - }); - - free(frame.func_name); - free(frame.file_name); - } - } - free(frames); - - return out_frames; -} - -vector get_frames( - Serializer *serializer, - jl_bt_element_t *entry, - size_t entry_size, - bool is_native -) { - string entry_str = frame_as_string(entry, entry_size); - - auto maybe_frames = serializer->frames_cache.find(entry_str); - if (maybe_frames == serializer->frames_cache.end()) { - serializer->cache_misses++; - auto frames = is_native - ? get_native_frames(entry[0].uintptr) - : get_julia_frames(entry); - serializer->frames_cache[entry_str] = frames; - return frames; - } else { - serializer->cache_hits++; - return maybe_frames->second; - } -} - RawBacktrace get_raw_backtrace() { - // TODO: don't allocate this every time - jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(JL_MAX_BT_SIZE); + static jl_bt_element_t bt_data[JL_MAX_BT_SIZE]; // TODO: tune the number of frames that are skipped size_t bt_size = rec_backtrace(bt_data, JL_MAX_BT_SIZE, 1); @@ -285,220 +265,73 @@ RawBacktrace get_raw_backtrace() { }; } -vector expand_stack(Serializer *serializer, RawBacktrace backtrace) { - vector out; - - int i = 0; - while (i < backtrace.size) { - jl_bt_element_t *entry = backtrace.data + i; - auto entry_size = jl_bt_entry_size(entry); - i += entry_size; - auto is_native = jl_bt_is_native(entry);; - - // TODO: cache frames by bt_element as string? - auto frames = get_frames(serializer, entry, entry_size, is_native); - - for (auto frame : frames) { - auto frame_label = frame.func_name; - auto is_julia = ends_with(frame.file_name, ".jl") || frame.file_name == "top-level scope"; - auto actual_is_native = !is_julia; - - if (actual_is_native) { - continue; - } - - out.push_back(frame); - } - } - - return out; -} - -string stack_frame_to_string(StackFrame frame) { - if (frame.total != "") { - return frame.total; - } - - ios_t str; - ios_mem(&str, 1024); - - ios_printf( - &str, "%s at %s:%d", - frame.func_name.c_str(), frame.file_name.c_str(), frame.line_no - ); - - string type_str = string((const char*)str.buf, str.size); - frame.total = type_str; - ios_close(&str); - - return frame.total; -} - -void profile_serialize(ios_t *out, Serializer *serializer) { - StringTable locations; - - ios_printf(out, "{\n"); - ios_printf(out, " \"allocs\":[\n"); - bool first_alloc = true; - for (auto alloc : serializer->profile->allocs) { - if (first_alloc) { - first_alloc = false; - } else { - ios_printf(out, ",\n"); - } - - auto frames = expand_stack(serializer, alloc.backtrace); - // print out stack and type - - ios_printf(out, " {\"stack\":["); - bool first_frame = true; - for (auto frame : frames) { - if (first_frame) { - first_frame = false; - } else { - ios_printf(out, ","); - } - - size_t frame_id = locations.find_or_create_string_id(stack_frame_to_string(frame)); - ios_printf(out, "%zu", frame_id); - } - ios_printf(out, "]"); // end stack - - ios_printf(out, ",\"type\":\"%zu\"", alloc.type_address); - ios_printf(out, ",\"size\":%zu", alloc.size); - ios_printf(out, "}"); // end alloc - } - ios_printf(out, "\n ],\n"); // end allocs - - // print locations - ios_printf(out, " \"locations\":"); - locations.print_json_array(out, "loc", true); - ios_printf(out, ",\n"); // end locations - - // print types - ios_printf(out, " \"types\":[\n"); - auto first_type = true; - for (auto type : serializer->profile->type_name_by_address) { - if (first_type) { - first_type = false; - } else { - ios_printf(out, ",\n"); - } - - ios_printf(out, " {"); - ios_printf(out, "\"id\":\"%zu\",", type.first); - ios_printf(out, "\"name\":"); - print_str_escape_json(out, type.second); - ios_printf(out, "}"); - } - ios_printf(out, "\n ],\n"); - - // print frees - ios_printf(out, " \"frees_by_type\":[\n"); - auto first_free = true; - for (auto free : serializer->profile->frees_by_type_address) { - if (first_free) { - first_free = false; - } else { - ios_printf(out, ",\n"); - } - - ios_printf(out, " {"); - ios_printf(out, "\"type_id\":\"%zu\",", free.first); - ios_printf(out, "\"count\":%zu", free.second); - ios_printf(out, "}"); - } - ios_printf(out, "\n ]\n"); // end frees by type - - ios_printf(out, "}\n"); -} - -void alloc_profile_serialize(ios_t *out, AllocProfile *profile) { - jl_printf(JL_STDERR, "serializing trie from %d allocs\n", profile->allocs.size()); - - auto serializer = Serializer{profile}; - profile_serialize(out, &serializer); - - jl_printf(JL_STDERR, " frame cache hits: %d\n", serializer.cache_hits); - jl_printf(JL_STDERR, " frame cache misses: %d\n", serializer.cache_misses); -} - -// == global variables manipulated by callbacks == - -AllocProfile *g_alloc_profile = nullptr; -int g_alloc_profile_enabled = false; - // == exported interface == JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { + jl_printf(JL_STDERR, "g_alloc_profile se:%d allocs:%d \n", g_alloc_profile.skip_every, g_alloc_profile.allocs.size()); g_alloc_profile_enabled = true; - g_alloc_profile = new AllocProfile{skip_every}; + g_alloc_profile.reset(skip_every); } -JL_DLLEXPORT void jl_stop_and_write_alloc_profile(ios_t *stream) { - alloc_profile_serialize(stream, g_alloc_profile); - ios_flush(stream); +extern "C" { // Needed since the function doesn't take any arguments. - // TODO: free everything in the profile - // especially all those malloc'd backtraces - +JL_DLLEXPORT struct AllocResults jl_stop_and_write_alloc_profile() { g_alloc_profile_enabled = false; - - // TODO: something to free the alloc profile? - // I don't know how to C++ - g_alloc_profile = nullptr; + + return AllocResults{g_alloc_profile.allocs.size(), + g_alloc_profile.allocs.data()}; +} + } // == callbacks called into by the outside == void register_type_string(jl_datatype_t *type) { - auto id = g_alloc_profile->type_name_by_address.find((size_t)type); - if (id != g_alloc_profile->type_name_by_address.end()) { + auto id = g_alloc_profile.type_name_by_address.find((size_t)type); + if (id != g_alloc_profile.type_name_by_address.end()) { return; } string type_str = _type_as_string(type); - g_alloc_profile->type_name_by_address[(size_t)type] = type_str; + g_alloc_profile.type_name_by_address[(size_t)type] = type_str; } void _record_allocated_value(jl_value_t *val, size_t size) { - auto profile = g_alloc_profile; - profile->alloc_counter++; - auto diff = profile->alloc_counter - profile->last_recorded_alloc; - if (diff < profile->skip_every) { + auto& profile = g_alloc_profile; + profile.alloc_counter++; + auto diff = profile.alloc_counter - profile.last_recorded_alloc; + if (diff < profile.skip_every) { return; } - profile->last_recorded_alloc = profile->alloc_counter; + profile.last_recorded_alloc = profile.alloc_counter; auto type = (jl_datatype_t*)jl_typeof(val); register_type_string(type); - profile->type_address_by_value_address[(size_t)val] = (size_t)type; + profile.type_address_by_value_address[(size_t)val] = (size_t)type; // TODO: get stack, push into vector - auto backtrace = get_raw_backtrace(); - - profile->allocs.push_back(Alloc{ + profile.allocs.emplace_back(Alloc{ (size_t) type, - backtrace, + get_raw_backtrace(), size }); } void _record_freed_value(jl_taggedvalue_t *tagged_val) { jl_value_t *val = jl_valueof(tagged_val); - + auto value_address = (size_t)val; - auto type_address = g_alloc_profile->type_address_by_value_address.find(value_address); - if (type_address == g_alloc_profile->type_address_by_value_address.end()) { + auto type_address = g_alloc_profile.type_address_by_value_address.find(value_address); + if (type_address == g_alloc_profile.type_address_by_value_address.end()) { return; // TODO: warn } - auto frees = g_alloc_profile->frees_by_type_address.find(type_address->second); + auto frees = g_alloc_profile.frees_by_type_address.find(type_address->second); - if (frees == g_alloc_profile->frees_by_type_address.end()) { - g_alloc_profile->frees_by_type_address[type_address->second] = 1; + if (frees == g_alloc_profile.frees_by_type_address.end()) { + g_alloc_profile.frees_by_type_address[type_address->second] = 1; } else { - g_alloc_profile->frees_by_type_address[type_address->second] = frees->second + 1; + g_alloc_profile.frees_by_type_address[type_address->second] = frees->second + 1; } } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 14aeecda936d5..03846ba74f792 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -10,10 +10,15 @@ extern "C" { #endif +struct AllocResults { + size_t num_allocs; + void* allocs; // Alloc* (see gc-alloc-profiler.cpp) +}; + void _report_gc_started(void); void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd); JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); -JL_DLLEXPORT void jl_stop_and_write_alloc_profile(ios_t *stream); +JL_DLLEXPORT struct AllocResults jl_stop_and_write_alloc_profile(void); void _record_allocated_value(jl_value_t *val, size_t size); void _record_freed_value(jl_taggedvalue_t *tagged_val); From 7ed832efefc84af688112659a9cf253144af51b2 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 6 Dec 2021 23:40:39 -0500 Subject: [PATCH 009/107] get started on decoding on Julia side --- base/gcutils.jl | 25 +++++++++++++++++++++++-- src/gc-alloc-profiler.cpp | 2 +- src/gc-alloc-profiler.h | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/base/gcutils.jl b/base/gcutils.jl index fccdec0f9eb75..6693f114555b8 100644 --- a/base/gcutils.jl +++ b/base/gcutils.jl @@ -105,12 +105,33 @@ Control whether garbage collection is enabled using a boolean argument (`true` f """ enable(on::Bool) = ccall(:jl_gc_enable, Int32, (Int32,), on) != 0 +struct RawBacktrace + data::Ptr{Nothing} # jl_bt_element_t + size::Csize_t +end + +struct Alloc + type_address::Csize_t + backtrace::RawBacktrace + size::Csize_t +end + +struct AllocResults + num_allocs::Csize_t + allocs::Ptr{Alloc} +end + function start_alloc_profile(skip_every::Int=0) ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) end -function stop_and_write_alloc_profile(io) - ccall(:jl_stop_and_write_alloc_profile, Cvoid, (Ptr{Cvoid},), io.handle) +""" + GC.stop_alloc_profile() +""" +function stop_alloc_profile() + raw_results = ccall(:jl_stop_alloc_profile, Ptr{Nothing}, ()) + # TODO: reinterpret as AllocResults, decode stack traces + return raw_results end """ diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 01d7558614db9..00ad65cc3154f 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -275,7 +275,7 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { extern "C" { // Needed since the function doesn't take any arguments. -JL_DLLEXPORT struct AllocResults jl_stop_and_write_alloc_profile() { +JL_DLLEXPORT struct AllocResults jl_stop_alloc_profile() { g_alloc_profile_enabled = false; return AllocResults{g_alloc_profile.allocs.size(), diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 03846ba74f792..6aee06d78280a 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -18,7 +18,7 @@ struct AllocResults { void _report_gc_started(void); void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd); JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); -JL_DLLEXPORT struct AllocResults jl_stop_and_write_alloc_profile(void); +JL_DLLEXPORT struct AllocResults jl_stop_alloc_profile(void); void _record_allocated_value(jl_value_t *val, size_t size); void _record_freed_value(jl_taggedvalue_t *tagged_val); From 371bb9669c8b826a0d885dd31a70827c457b2c77 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 6 Dec 2021 23:42:39 -0500 Subject: [PATCH 010/107] delete more serialization code --- src/gc-alloc-profiler.cpp | 136 -------------------------------------- 1 file changed, 136 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 00ad65cc3154f..d2a2098eac240 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -88,98 +88,6 @@ int g_alloc_profile_enabled = false; // == utility functions == -// https://stackoverflow.com/a/33799784/751061 -// TODO: dedup with heap snapshot, or rebase off of that branch -void print_str_escape_json(ios_t *stream, const string &s) { - ios_printf(stream, "\""); - for (auto c = s.cbegin(); c != s.cend(); c++) { - switch (*c) { - case '"': ios_printf(stream, "\\\""); break; - case '\\': ios_printf(stream, "\\\\"); break; - case '\b': ios_printf(stream, "\\b"); break; - case '\f': ios_printf(stream, "\\f"); break; - case '\n': ios_printf(stream, "\\n"); break; - case '\r': ios_printf(stream, "\\r"); break; - case '\t': ios_printf(stream, "\\t"); break; - default: - if ('\x00' <= *c && *c <= '\x1f') { - ios_printf(stream, "\\u%04x", (int)*c); - } else { - ios_printf(stream, "%c", *c); - } - } - } - ios_printf(stream, "\""); -} - -struct StringTable { - typedef unordered_map MapType; - - MapType map; - vector strings; - - StringTable() {} - StringTable(std::initializer_list strs) : strings(strs) { - for (const auto& str : strs) { - map.insert({str, map.size()}); - } - } - - size_t find_or_create_string_id(string key) { - auto val = map.find(key); - if (val == map.end()) { - val = map.insert(val, {key, map.size()}); - strings.push_back(key); - } - return val->second; - } - - void print_json_array(ios_t *stream, string key, bool newlines) { - ios_printf(stream, "["); - bool first = true; - size_t id = 0; - for (const auto &str : strings) { - if (first) { - first = false; - } else { - ios_printf(stream, newlines ? ",\n" : ","); - } - ios_printf(stream, "{\"id\":%zu", id); - id++; - ios_printf(stream, ",\"%s\":", key.c_str()); - print_str_escape_json(stream, str); - ios_printf(stream, "}"); - } - ios_printf(stream, "]"); - } -}; - -string frame_as_string(jl_bt_element_t *entry, size_t entry_size) { - auto size_in_bytes = entry_size * sizeof(jl_bt_element_t); - char *buf = (char*)malloc(size_in_bytes); - for (int i=0; i < size_in_bytes; i++) { - buf[i] = ((char*)entry)[i]; - } - return string(buf, size_in_bytes); -} - -// https://stackoverflow.com/questions/874134/find-out-if-string-ends-with-another-string-in-c -bool ends_with(string const &full_string, string const &ending) { - if (full_string.length() >= ending.length()) { - return (0 == full_string.compare(full_string.length() - ending.length(), ending.length(), ending)); - } else { - return false; - } -} - -bool starts_with(string const &full_string, string const &beginning) { - if (full_string.length() >= beginning.length()) { - return (0 == full_string.compare(0, beginning.length(), beginning)); - } else { - return false; - } -} - string _type_as_string(jl_datatype_t *type) { if ((uintptr_t)type < 4096U) { return ""; @@ -209,50 +117,6 @@ string _type_as_string(jl_datatype_t *type) { // === stack stuff === -vector get_julia_frames(jl_bt_element_t *bt_entry) { - vector ret; - - size_t ip = jl_bt_entry_header(bt_entry); - jl_value_t *code = jl_bt_entry_jlvalue(bt_entry, 0); - if (jl_is_method_instance(code)) { - // When interpreting a method instance, need to unwrap to find the code info - code = ((jl_method_instance_t*)code)->uninferred; - } - if (jl_is_code_info(code)) { - jl_code_info_t *src = (jl_code_info_t*)code; - // See also the debug info handling in codegen.cpp. - // NB: debuginfoloc is 1-based! - intptr_t debuginfoloc = ((int32_t*)jl_array_data(src->codelocs))[ip]; - while (debuginfoloc != 0) { - jl_line_info_node_t *locinfo = (jl_line_info_node_t*) - jl_array_ptr_ref(src->linetable, debuginfoloc - 1); - assert(jl_typeis(locinfo, jl_lineinfonode_type)); - const char *func_name = "Unknown"; - jl_value_t *method = locinfo->method; - if (jl_is_method_instance(method)) - method = ((jl_method_instance_t*)method)->def.value; - if (jl_is_method(method)) - method = (jl_value_t*)((jl_method_t*)method)->name; - if (jl_is_symbol(method)) - func_name = jl_symbol_name((jl_sym_t*)method); - - ret.push_back(StackFrame{ - func_name, - jl_symbol_name(locinfo->file), - locinfo->line, - }); - - debuginfoloc = locinfo->inlined_at; - } - } - else { - // If we're using this function something bad has already happened; - // be a bit defensive to avoid crashing while reporting the crash. - jl_safe_printf("No code info - unknown interpreter state!\n"); - } - return ret; -} - RawBacktrace get_raw_backtrace() { static jl_bt_element_t bt_data[JL_MAX_BT_SIZE]; From c8452ce14f7018d624805dd7c605d77aa3aff20c Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 6 Dec 2021 23:46:50 -0500 Subject: [PATCH 011/107] delete destructors and constructors gonna try unique_ptr --- src/gc-alloc-profiler.cpp | 56 +++++---------------------------------- 1 file changed, 6 insertions(+), 50 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index d2a2098eac240..10b850478d8b8 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -13,39 +13,9 @@ using std::unordered_map; using std::string; using std::vector; -struct StackFrame { - string func_name; - string file_name; - intptr_t line_no; - - string total; // cache of the above fields concatenated -}; - struct RawBacktrace { jl_bt_element_t *data; size_t size; - - RawBacktrace( - jl_bt_element_t *_data, - size_t _size - ) : data(_data), size(_size) {} - - ~RawBacktrace() { - if (data != nullptr) { - free(data); - } - } - // Move constructor (X a = X{...}) - RawBacktrace(RawBacktrace&& rhs) : - data(rhs.data), size(rhs.size) - { - rhs.data = nullptr; - rhs.size = 0; - } - private: - // Disallow copy and copy-assignment - RawBacktrace(const RawBacktrace&) = delete; // X b(a); - RawBacktrace& operator=(const RawBacktrace& other) = delete; // b = a; }; struct Alloc { @@ -55,10 +25,6 @@ struct Alloc { }; struct AllocProfile { - AllocProfile(int _skip_every) { - reset(_skip_every); - } - int skip_every; vector allocs; @@ -68,24 +34,13 @@ struct AllocProfile { size_t alloc_counter; size_t last_recorded_alloc; - - void reset(int _skip_every) { - skip_every = _skip_every; - alloc_counter = 0; - last_recorded_alloc = 0; - } - - private: - AllocProfile(const AllocProfile&) = delete; // X b(a); - AllocProfile& operator=(const AllocProfile& other) = delete; // b = a; }; // == global variables manipulated by callbacks == -AllocProfile g_alloc_profile(0); +AllocProfile g_alloc_profile; int g_alloc_profile_enabled = false; - // == utility functions == string _type_as_string(jl_datatype_t *type) { @@ -132,9 +87,8 @@ RawBacktrace get_raw_backtrace() { // == exported interface == JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { - jl_printf(JL_STDERR, "g_alloc_profile se:%d allocs:%d \n", g_alloc_profile.skip_every, g_alloc_profile.allocs.size()); g_alloc_profile_enabled = true; - g_alloc_profile.reset(skip_every); + g_alloc_profile = AllocProfile{skip_every}; } extern "C" { // Needed since the function doesn't take any arguments. @@ -142,8 +96,10 @@ extern "C" { // Needed since the function doesn't take any arguments. JL_DLLEXPORT struct AllocResults jl_stop_alloc_profile() { g_alloc_profile_enabled = false; - return AllocResults{g_alloc_profile.allocs.size(), - g_alloc_profile.allocs.data()}; + return AllocResults{ + g_alloc_profile.allocs.size(), + g_alloc_profile.allocs.data() + }; } } From 2d9ec5b595ebe5bbc36756f7fe56089bf1fc14c8 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 00:06:49 -0500 Subject: [PATCH 012/107] use unique_ptr not sure it's actually freeing, but at least it doesn't crash --- src/gc-alloc-profiler.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 10b850478d8b8..8e1d34c8b89a0 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -12,9 +12,10 @@ using std::unordered_map; using std::string; using std::vector; +using std::unique_ptr; struct RawBacktrace { - jl_bt_element_t *data; + unique_ptr data; size_t size; }; @@ -79,7 +80,7 @@ RawBacktrace get_raw_backtrace() { size_t bt_size = rec_backtrace(bt_data, JL_MAX_BT_SIZE, 1); return RawBacktrace{ - bt_data, + std::make_unique(bt_data), bt_size }; } From 5cd096a148fd8e799d46b9a3773db649cdd42cba Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 09:20:10 -0500 Subject: [PATCH 013/107] separate free function; move Julia decoding to stdlib --- base/gcutils.jl | 16 +++++++++++----- src/gc-alloc-profiler.cpp | 22 ++++++++++++++++------ src/gc-alloc-profiler.h | 5 +++-- stdlib/AllocProfile/Project.toml | 2 ++ stdlib/AllocProfile/src/AllocProfile.jl | 25 +++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 stdlib/AllocProfile/Project.toml create mode 100644 stdlib/AllocProfile/src/AllocProfile.jl diff --git a/base/gcutils.jl b/base/gcutils.jl index 6693f114555b8..643f0b97cd5c9 100644 --- a/base/gcutils.jl +++ b/base/gcutils.jl @@ -105,20 +105,23 @@ Control whether garbage collection is enabled using a boolean argument (`true` f """ enable(on::Bool) = ccall(:jl_gc_enable, Int32, (Int32,), on) != 0 +# raw results + struct RawBacktrace data::Ptr{Nothing} # jl_bt_element_t size::Csize_t end -struct Alloc +struct RawAlloc type_address::Csize_t backtrace::RawBacktrace size::Csize_t end -struct AllocResults +# matches RawAllocResults on the C side +struct RawAllocResults num_allocs::Csize_t - allocs::Ptr{Alloc} + allocs::Ptr{RawAlloc} end function start_alloc_profile(skip_every::Int=0) @@ -129,11 +132,14 @@ end GC.stop_alloc_profile() """ function stop_alloc_profile() - raw_results = ccall(:jl_stop_alloc_profile, Ptr{Nothing}, ()) - # TODO: reinterpret as AllocResults, decode stack traces + raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) return raw_results end +function free_alloc_profile() + ccall(:jl_free_alloc_profile, Cvoid, ()) +end + """ GC.enable_finalizers(on::Bool) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 8e1d34c8b89a0..6ec4924ca60e2 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -12,10 +12,9 @@ using std::unordered_map; using std::string; using std::vector; -using std::unique_ptr; struct RawBacktrace { - unique_ptr data; + jl_bt_element_t *data; size_t size; }; @@ -74,13 +73,13 @@ string _type_as_string(jl_datatype_t *type) { // === stack stuff === RawBacktrace get_raw_backtrace() { - static jl_bt_element_t bt_data[JL_MAX_BT_SIZE]; + jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(JL_MAX_BT_SIZE); // TODO: tune the number of frames that are skipped size_t bt_size = rec_backtrace(bt_data, JL_MAX_BT_SIZE, 1); return RawBacktrace{ - std::make_unique(bt_data), + bt_data, bt_size }; } @@ -94,15 +93,26 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { extern "C" { // Needed since the function doesn't take any arguments. -JL_DLLEXPORT struct AllocResults jl_stop_alloc_profile() { +JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { g_alloc_profile_enabled = false; - return AllocResults{ + return RawAllocResults{ g_alloc_profile.allocs.size(), g_alloc_profile.allocs.data() }; } +JL_DLLEXPORT void jl_free_alloc_profile() { + g_alloc_profile.frees_by_type_address.clear(); + g_alloc_profile.type_address_by_value_address.clear(); + g_alloc_profile.type_name_by_address.clear(); + g_alloc_profile.alloc_counter = 0; + for (auto alloc : g_alloc_profile.allocs) { + free(alloc.backtrace.data); + } + g_alloc_profile.allocs.clear(); +} + } // == callbacks called into by the outside == diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 6aee06d78280a..b9bb6a6a5fa66 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -10,7 +10,7 @@ extern "C" { #endif -struct AllocResults { +struct RawAllocResults { size_t num_allocs; void* allocs; // Alloc* (see gc-alloc-profiler.cpp) }; @@ -18,7 +18,8 @@ struct AllocResults { void _report_gc_started(void); void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd); JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); -JL_DLLEXPORT struct AllocResults jl_stop_alloc_profile(void); +JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); +JL_DLLEXPORT void jl_free_alloc_profile(); void _record_allocated_value(jl_value_t *val, size_t size); void _record_freed_value(jl_taggedvalue_t *tagged_val); diff --git a/stdlib/AllocProfile/Project.toml b/stdlib/AllocProfile/Project.toml new file mode 100644 index 0000000000000..358fdf9475bff --- /dev/null +++ b/stdlib/AllocProfile/Project.toml @@ -0,0 +1,2 @@ +name = "AllocProfile" +uuid = "0009037c-06ea-4b9e-a52e-4b728900de75" diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl new file mode 100644 index 0000000000000..2270dd8cf50ab --- /dev/null +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -0,0 +1,25 @@ +module AllocProfile + +using Base.StackTraces +using GC: RawAllocResults, RawAlloc, RawBacktrace + +struct Alloc + type::Type + stacktrace::Vector{StackTraces.StackFrame} + size::Int +end + +function decode_alloc_results(raw_results::RawAllocResults)::Vector{Alloc} + out = Vector{Alloc}() + for i in 1:raw_results.num_allocs + raw_alloc = reinterpret(RawAlloc, unsafe_load(raw_results.allocs, i)) + push!(out, Alloc( + Int, + Vector{StackTraces.StackFrame}(), + 5 + )) + end + return out +end + +end From 04e2b173c6803651965e805b2c4d929b8f0107e2 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 09:24:18 -0500 Subject: [PATCH 014/107] move more to the stdlib --- base/gcutils.jl | 35 ------------------------- src/gc-alloc-profiler.cpp | 7 +++-- stdlib/AllocProfile/src/AllocProfile.jl | 34 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 39 deletions(-) diff --git a/base/gcutils.jl b/base/gcutils.jl index 643f0b97cd5c9..d17301a1be9b0 100644 --- a/base/gcutils.jl +++ b/base/gcutils.jl @@ -105,41 +105,6 @@ Control whether garbage collection is enabled using a boolean argument (`true` f """ enable(on::Bool) = ccall(:jl_gc_enable, Int32, (Int32,), on) != 0 -# raw results - -struct RawBacktrace - data::Ptr{Nothing} # jl_bt_element_t - size::Csize_t -end - -struct RawAlloc - type_address::Csize_t - backtrace::RawBacktrace - size::Csize_t -end - -# matches RawAllocResults on the C side -struct RawAllocResults - num_allocs::Csize_t - allocs::Ptr{RawAlloc} -end - -function start_alloc_profile(skip_every::Int=0) - ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) -end - -""" - GC.stop_alloc_profile() -""" -function stop_alloc_profile() - raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - return raw_results -end - -function free_alloc_profile() - ccall(:jl_free_alloc_profile, Cvoid, ()) -end - """ GC.enable_finalizers(on::Bool) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 6ec4924ca60e2..96359f17be336 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -18,7 +18,7 @@ struct RawBacktrace { size_t size; }; -struct Alloc { +struct RawAlloc { size_t type_address; RawBacktrace backtrace; size_t size; @@ -27,7 +27,7 @@ struct Alloc { struct AllocProfile { int skip_every; - vector allocs; + vector allocs; unordered_map type_name_by_address; unordered_map type_address_by_value_address; unordered_map frees_by_type_address; @@ -141,8 +141,7 @@ void _record_allocated_value(jl_value_t *val, size_t size) { profile.type_address_by_value_address[(size_t)val] = (size_t)type; - // TODO: get stack, push into vector - profile.allocs.emplace_back(Alloc{ + profile.allocs.emplace_back(RawAlloc{ (size_t) type, get_raw_backtrace(), size diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 2270dd8cf50ab..deaecebf0a936 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -3,6 +3,40 @@ module AllocProfile using Base.StackTraces using GC: RawAllocResults, RawAlloc, RawBacktrace +# raw results + +# matches RawBacktrace on the C side +struct RawBacktrace + data::Ptr{Nothing} # jl_bt_element_t + size::Csize_t +end + +# matches RawAlloc on the C side +struct RawAlloc + type_address::Csize_t + backtrace::RawBacktrace + size::Csize_t +end + +# matches RawAllocResults on the C side +struct RawAllocResults + num_allocs::Csize_t + allocs::Ptr{RawAlloc} +end + +function start_alloc_profile(skip_every::Int=0) + ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) +end + +function stop_alloc_profile() + raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) + decoded_results = decode_alloc_results(raw_results) + ccall(:jl_free_alloc_profile, Cvoid, ()) + return decoded_results +end + +# decoded results + struct Alloc type::Type stacktrace::Vector{StackTraces.StackFrame} From 77ce036d7ecb445bfcf9552bbc5a3d99ac5c8358 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 10:08:12 -0500 Subject: [PATCH 015/107] start hacking on _reformat_bt adapted from Tim's PR --- stdlib/AllocProfile/src/AllocProfile.jl | 65 +++++++++++++++++++++--- stdlib/AllocProfile/test/runtests.jl | 8 +++ stdlib/AllocProfile/test/runtests_raw.jl | 10 ++++ 3 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 stdlib/AllocProfile/test/runtests.jl create mode 100644 stdlib/AllocProfile/test/runtests_raw.jl diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index deaecebf0a936..f7ef5b197332a 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -1,13 +1,18 @@ module AllocProfile using Base.StackTraces -using GC: RawAllocResults, RawAlloc, RawBacktrace +using Base: InterpreterIP # raw results +# modeled on jl_bt_element_t +struct RawBacktraceElement + content::Csize_t +end + # matches RawBacktrace on the C side struct RawBacktrace - data::Ptr{Nothing} # jl_bt_element_t + data::Ptr{RawBacktraceElement} size::Csize_t end @@ -24,13 +29,13 @@ struct RawAllocResults allocs::Ptr{RawAlloc} end -function start_alloc_profile(skip_every::Int=0) +function start(skip_every::Int=0) ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) end -function stop_alloc_profile() +function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - decoded_results = decode_alloc_results(raw_results) + decoded_results = decode(raw_results) ccall(:jl_free_alloc_profile, Cvoid, ()) return decoded_results end @@ -43,17 +48,61 @@ struct Alloc size::Int end -function decode_alloc_results(raw_results::RawAllocResults)::Vector{Alloc} +function decode(raw_results::RawAllocResults)::Vector{Alloc} out = Vector{Alloc}() for i in 1:raw_results.num_allocs - raw_alloc = reinterpret(RawAlloc, unsafe_load(raw_results.allocs, i)) + raw_alloc = unsafe_load(raw_results.allocs, i) push!(out, Alloc( Int, - Vector{StackTraces.StackFrame}(), + stacktrace(_reformat_bt(raw_alloc.backtrace)), 5 )) end return out end +# convert an array of raw backtrace entries to array of usable objects +# (either native pointers, InterpreterIP objects, or AllocationInfo objects) +function _reformat_bt(bt::RawBacktrace)::Vector{Union{Ptr{Cvoid}, InterpreterIP}} + # NOTE: Ptr{Cvoid} is always part of the output container type, + # as end-of-block markers are encoded as a NULL pointer + # TODO: use Nothing/nothing for that? + ret = Vector{Union{Ptr{Cvoid}, InterpreterIP}}() + i = 1 + while i <= bt.size + ip = unsafe_load(bt.data, i).content + + # native frame + if UInt(ip) != (-1 % UInt) + # See also jl_bt_is_native + push!(ret, convert(Ptr{Cvoid}, ip)) + i += 1 + continue + end + + # Extended backtrace entry + entry_metadata = reinterpret(UInt, unsafe_load(bt, i+1)) + njlvalues = entry_metadata & 0x7 + nuintvals = (entry_metadata >> 3) & 0x7 + tag = (entry_metadata >> 6) & 0xf + header = entry_metadata >> 10 + + if tag == 1 # JL_BT_INTERP_FRAME_TAG + code = unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt, i+2))) + mod = if njlvalues == 2 + unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt, i+3))) + else + nothing + end + push!(ret, InterpreterIP(code, header, mod)) + else + # Tags we don't know about are an error + throw(ArgumentError("Unexpected extended backtrace entry tag $tag at bt[$i]")) + end + # See jl_bt_entry_size + i += Int(2 + njlvalues + nuintvals) + end + return ret +end + end diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl new file mode 100644 index 0000000000000..be0d0dd677687 --- /dev/null +++ b/stdlib/AllocProfile/test/runtests.jl @@ -0,0 +1,8 @@ +using AllocProfile + +AllocProfile.start() + +using Base64 + +raw_results = AllocProfile.stop() + diff --git a/stdlib/AllocProfile/test/runtests_raw.jl b/stdlib/AllocProfile/test/runtests_raw.jl new file mode 100644 index 0000000000000..b586800330a60 --- /dev/null +++ b/stdlib/AllocProfile/test/runtests_raw.jl @@ -0,0 +1,10 @@ +include("stdlib/AllocProfile/src/AllocProfile.jl") + +ccall(:jl_start_alloc_profile, Cvoid, (Cint,), 0) + +using Base64 + +raw_results = ccall(:jl_stop_alloc_profile, AllocProfile.RawAllocResults, ()) +raw_alloc = unsafe_load(raw_results.allocs, 3) +AllocProfile._reformat_bt(raw_alloc.backtrace) + From 33dde11b1c969e63ad3aa8c0187195d635621d00 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 10:36:34 -0500 Subject: [PATCH 016/107] fix decoding --- stdlib/AllocProfile/src/AllocProfile.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index f7ef5b197332a..de52caacdb0c5 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -35,6 +35,7 @@ end function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) + println("allocs: $(raw_results.num_allocs)") decoded_results = decode(raw_results) ccall(:jl_free_alloc_profile, Cvoid, ()) return decoded_results @@ -81,16 +82,16 @@ function _reformat_bt(bt::RawBacktrace)::Vector{Union{Ptr{Cvoid}, InterpreterIP} end # Extended backtrace entry - entry_metadata = reinterpret(UInt, unsafe_load(bt, i+1)) + entry_metadata = reinterpret(UInt, unsafe_load(bt.data, i+1).content) njlvalues = entry_metadata & 0x7 nuintvals = (entry_metadata >> 3) & 0x7 tag = (entry_metadata >> 6) & 0xf header = entry_metadata >> 10 if tag == 1 # JL_BT_INTERP_FRAME_TAG - code = unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt, i+2))) + code = unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+2).content)) mod = if njlvalues == 2 - unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt, i+3))) + unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+3).content)) else nothing end From 07d10093c7e8c074c74aa78f4e6bd6f32cbf96f7 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 10:52:55 -0500 Subject: [PATCH 017/107] get alloc size and type address next up: load actual type --- src/gc-alloc-profiler.cpp | 4 ++-- stdlib/AllocProfile/src/AllocProfile.jl | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 96359f17be336..1f55a24bc464d 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -19,7 +19,7 @@ struct RawBacktrace { }; struct RawAlloc { - size_t type_address; + jl_datatype_t *type_address; RawBacktrace backtrace; size_t size; }; @@ -142,7 +142,7 @@ void _record_allocated_value(jl_value_t *val, size_t size) { profile.type_address_by_value_address[(size_t)val] = (size_t)type; profile.allocs.emplace_back(RawAlloc{ - (size_t) type, + type, get_raw_backtrace(), size }); diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index de52caacdb0c5..779da87714394 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -18,7 +18,7 @@ end # matches RawAlloc on the C side struct RawAlloc - type_address::Csize_t + type::Ptr{Cvoid} backtrace::RawBacktrace size::Csize_t end @@ -35,7 +35,6 @@ end function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - println("allocs: $(raw_results.num_allocs)") decoded_results = decode(raw_results) ccall(:jl_free_alloc_profile, Cvoid, ()) return decoded_results @@ -44,7 +43,8 @@ end # decoded results struct Alloc - type::Type + # type::Type + type_addr::UInt stacktrace::Vector{StackTraces.StackFrame} size::Int end @@ -54,9 +54,10 @@ function decode(raw_results::RawAllocResults)::Vector{Alloc} for i in 1:raw_results.num_allocs raw_alloc = unsafe_load(raw_results.allocs, i) push!(out, Alloc( - Int, + # unsafe_pointer_to_objref(raw_alloc.type), + convert(UInt, raw_alloc.type), stacktrace(_reformat_bt(raw_alloc.backtrace)), - 5 + UInt(raw_alloc.size) )) end return out From 6ec2fd0ee1582aaf56aefc7a5fd8174a7df43a9e Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 7 Dec 2021 11:07:22 -0500 Subject: [PATCH 018/107] just keep type type address for now --- stdlib/AllocProfile/src/AllocProfile.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 779da87714394..3f0fef2a38a83 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -18,7 +18,7 @@ end # matches RawAlloc on the C side struct RawAlloc - type::Ptr{Cvoid} + type::Ptr{Type} backtrace::RawBacktrace size::Csize_t end @@ -44,7 +44,7 @@ end struct Alloc # type::Type - type_addr::UInt + type_addr::Ptr{Type} # TODO: fix segfault when loading this stacktrace::Vector{StackTraces.StackFrame} size::Int end @@ -54,8 +54,8 @@ function decode(raw_results::RawAllocResults)::Vector{Alloc} for i in 1:raw_results.num_allocs raw_alloc = unsafe_load(raw_results.allocs, i) push!(out, Alloc( - # unsafe_pointer_to_objref(raw_alloc.type), - convert(UInt, raw_alloc.type), + # unsafe_pointer_to_objref(convert(Ptr{Any}, raw_alloc.type)), + raw_alloc.type, stacktrace(_reformat_bt(raw_alloc.backtrace)), UInt(raw_alloc.size) )) From f5f1be2ec418d196152305ee6c6180b7d7ad00fd Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 00:49:59 -0500 Subject: [PATCH 019/107] send type names over to the Julia side kind of annoying, but it doesn't seem we can reliably load them from the addresses without segfaulting --- src/gc-alloc-profiler.cpp | 19 ++++++++-- src/gc-alloc-profiler.h | 12 +++++- stdlib/AllocProfile/src/AllocProfile.jl | 50 +++++++++++++++++++------ 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 1f55a24bc464d..2dbecd6a9ac37 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -96,10 +96,23 @@ extern "C" { // Needed since the function doesn't take any arguments. JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { g_alloc_profile_enabled = false; - return RawAllocResults{ - g_alloc_profile.allocs.size(), - g_alloc_profile.allocs.data() + auto results = RawAllocResults{ + g_alloc_profile.allocs.data(), + g_alloc_profile.allocs.size() }; + results.num_type_names = g_alloc_profile.type_name_by_address.size(); + results.type_names = (TypeNamePair*) malloc(sizeof(TypeNamePair) * results.num_type_names); + int i = 0; + for (auto type_addr_name : g_alloc_profile.type_name_by_address) { + auto str = jl_cstr_to_string(type_addr_name.second.c_str()); + results.type_names[i++] = TypeNamePair{ + type_addr_name.first, + str, + }; + } + + // TODO: package up the frees as well + return results; } JL_DLLEXPORT void jl_free_alloc_profile() { diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index b9bb6a6a5fa66..f87022f017a08 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -10,16 +10,24 @@ extern "C" { #endif +struct TypeNamePair { + size_t addr; + jl_value_t *name; +}; + struct RawAllocResults { + void *allocs; // Alloc* (see gc-alloc-profiler.cpp) size_t num_allocs; - void* allocs; // Alloc* (see gc-alloc-profiler.cpp) + + struct TypeNamePair *type_names; // an array + size_t num_type_names; }; void _report_gc_started(void); void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd); JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); -JL_DLLEXPORT void jl_free_alloc_profile(); +JL_DLLEXPORT void jl_free_alloc_profile(void); void _record_allocated_value(jl_value_t *val, size_t size); void _record_freed_value(jl_taggedvalue_t *tagged_val); diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 3f0fef2a38a83..7ede9fec9c513 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -23,10 +23,18 @@ struct RawAlloc size::Csize_t end +struct TypeNamePair + addr::UInt + name::String +end + # matches RawAllocResults on the C side struct RawAllocResults - num_allocs::Csize_t allocs::Ptr{RawAlloc} + num_allocs::Csize_t + + type_names::Ptr{TypeNamePair} + num_type_names::Csize_t end function start(skip_every::Int=0) @@ -49,18 +57,36 @@ struct Alloc size::Int end -function decode(raw_results::RawAllocResults)::Vector{Alloc} - out = Vector{Alloc}() - for i in 1:raw_results.num_allocs - raw_alloc = unsafe_load(raw_results.allocs, i) - push!(out, Alloc( - # unsafe_pointer_to_objref(convert(Ptr{Any}, raw_alloc.type)), - raw_alloc.type, - stacktrace(_reformat_bt(raw_alloc.backtrace)), - UInt(raw_alloc.size) - )) +struct AllocResults + allocs::Vector{Alloc} + frees::Dict{UInt,UInt} # type name => string + type_names::Dict{UInt,String} +end + +function decode_alloc(raw_alloc::RawAlloc)::Alloc + Alloc( + # unsafe_pointer_to_objref(convert(Ptr{Any}, raw_alloc.type)), + raw_alloc.type, + stacktrace(_reformat_bt(raw_alloc.backtrace)), + UInt(raw_alloc.size) + ) +end + +function decode(raw_results::RawAllocResults)::AllocResults + allocs = [ + decode_alloc(unsafe_load(raw_results.allocs, i)) + for i in 1:raw_results.num_allocs + ] + type_names = Dict{UInt,String} + for i in 1:raw_results.num_type_names + pair = reinterpret(TypeNamePair, unsafe_load(raw_results.type_names, i)) + type_names[XXXX] end - return out + return AllocResults( + allocs, + frees, + type_names + ) end # convert an array of raw backtrace entries to array of usable objects From 9fe1ad23d0de48e480a434cc659b6cab94e6bd8b Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 01:06:46 -0500 Subject: [PATCH 020/107] package up frees as well --- src/gc-alloc-profiler.cpp | 15 ++++++++++++++- src/gc-alloc-profiler.h | 8 ++++++++ stdlib/AllocProfile/src/AllocProfile.jl | 21 +++++++++++++++++---- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 2dbecd6a9ac37..1ad42a2ef23a5 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -100,7 +100,10 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { g_alloc_profile.allocs.data(), g_alloc_profile.allocs.size() }; + + // package up type names results.num_type_names = g_alloc_profile.type_name_by_address.size(); + // TODO: free this malloc results.type_names = (TypeNamePair*) malloc(sizeof(TypeNamePair) * results.num_type_names); int i = 0; for (auto type_addr_name : g_alloc_profile.type_name_by_address) { @@ -111,7 +114,17 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { }; } - // TODO: package up the frees as well + // package up frees + results.num_frees = g_alloc_profile.frees_by_type_address.size(); + results.frees = (FreeInfo*) malloc(sizeof(FreeInfo) * results.num_frees); + int j = 0; + for (auto type_addr_free_count : g_alloc_profile.frees_by_type_address) { + results.frees[j++] = FreeInfo{ + type_addr_free_count.first, + type_addr_free_count.second + }; + } + return results; } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index f87022f017a08..6b0d46c2c496f 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -15,12 +15,20 @@ struct TypeNamePair { jl_value_t *name; }; +struct FreeInfo { + size_t type_addr; + size_t count; +}; + struct RawAllocResults { void *allocs; // Alloc* (see gc-alloc-profiler.cpp) size_t num_allocs; struct TypeNamePair *type_names; // an array size_t num_type_names; + + struct FreeInfo *frees; + size_t num_frees; }; void _report_gc_started(void); diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 7ede9fec9c513..c639cddd92f76 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -28,6 +28,11 @@ struct TypeNamePair name::String end +struct FreeInfo + type_addr::UInt + count::UInt +end + # matches RawAllocResults on the C side struct RawAllocResults allocs::Ptr{RawAlloc} @@ -35,6 +40,9 @@ struct RawAllocResults type_names::Ptr{TypeNamePair} num_type_names::Csize_t + + frees::Ptr{FreeInfo} + num_frees::Csize_t end function start(skip_every::Int=0) @@ -59,8 +67,8 @@ end struct AllocResults allocs::Vector{Alloc} - frees::Dict{UInt,UInt} # type name => string - type_names::Dict{UInt,String} + frees::Dict{String,UInt} # type name => string + type_names::Dict{UInt,String} # type addr => type name end function decode_alloc(raw_alloc::RawAlloc)::Alloc @@ -79,8 +87,13 @@ function decode(raw_results::RawAllocResults)::AllocResults ] type_names = Dict{UInt,String} for i in 1:raw_results.num_type_names - pair = reinterpret(TypeNamePair, unsafe_load(raw_results.type_names, i)) - type_names[XXXX] + pair = unsafe_load(raw_results.type_names, i) + type_names[convert(UInt, pair.addr)] = pair.name + end + frees = Dict{String,UInt}() + for i in 1:raw_results.num_frees + free = unsafe_load(raw_results.frees, i) + frees[type_names[free.type_addr]] = free.count end return AllocResults( allocs, From f768234b1a47a8ba91151c59761cf79c8877ae22 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 01:37:11 -0500 Subject: [PATCH 021/107] try to fix but I think the problem is that the strings are being GC'd cuz they're not rooted --- src/gc-alloc-profiler.cpp | 2 +- stdlib/AllocProfile/src/AllocProfile.jl | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 1ad42a2ef23a5..d38a57d4e2249 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -107,7 +107,7 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { results.type_names = (TypeNamePair*) malloc(sizeof(TypeNamePair) * results.num_type_names); int i = 0; for (auto type_addr_name : g_alloc_profile.type_name_by_address) { - auto str = jl_cstr_to_string(type_addr_name.second.c_str()); + auto str = jl_pchar_to_string(type_addr_name.second.data(), type_addr_name.second.length()); results.type_names[i++] = TypeNamePair{ type_addr_name.first, str, diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index c639cddd92f76..fb3684ae64ce0 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -51,9 +51,10 @@ end function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - decoded_results = decode(raw_results) - ccall(:jl_free_alloc_profile, Cvoid, ()) - return decoded_results + # decoded_results = decode(raw_results) + # ccall(:jl_free_alloc_profile, Cvoid, ()) + # return decoded_results + return raw_results end # decoded results @@ -88,12 +89,17 @@ function decode(raw_results::RawAllocResults)::AllocResults type_names = Dict{UInt,String} for i in 1:raw_results.num_type_names pair = unsafe_load(raw_results.type_names, i) - type_names[convert(UInt, pair.addr)] = pair.name + # println("pair=$pair") + # type_names[convert(UInt, pair.addr)] = pair.name + type_addr = convert(UInt, pair.addr) + println("type_addr=$type_addr") + type_names[type_addr] = "MyType" end frees = Dict{String,UInt}() for i in 1:raw_results.num_frees free = unsafe_load(raw_results.frees, i) - frees[type_names[free.type_addr]] = free.count + type_name = type_names[free.type_addr] + frees[type_name] = free.count end return AllocResults( allocs, From b11a0feda324d4840dd15f726d42a718c3233e7d Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 02:04:30 -0500 Subject: [PATCH 022/107] malloc strings so they're not junk by the time we look at them this works, but all the strings leak ugh C is hard --- src/gc-alloc-profiler.cpp | 7 +++++-- src/gc-alloc-profiler.h | 2 +- stdlib/AllocProfile/src/AllocProfile.jl | 22 +++++++++++----------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index d38a57d4e2249..34d54a455fe1d 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -107,10 +107,13 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { results.type_names = (TypeNamePair*) malloc(sizeof(TypeNamePair) * results.num_type_names); int i = 0; for (auto type_addr_name : g_alloc_profile.type_name_by_address) { - auto str = jl_pchar_to_string(type_addr_name.second.data(), type_addr_name.second.length()); + jl_printf(JL_STDERR, "type name: %s\n", type_addr_name.second.c_str()); + // TODO: free this malloc + char *name = (char *) malloc(type_addr_name.second.length() + 1); + memcpy(name, type_addr_name.second.c_str(), type_addr_name.second.length() + 1); results.type_names[i++] = TypeNamePair{ type_addr_name.first, - str, + name, }; } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 6b0d46c2c496f..c0c7f601f82cf 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -12,7 +12,7 @@ extern "C" { struct TypeNamePair { size_t addr; - jl_value_t *name; + const char *name; }; struct FreeInfo { diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index fb3684ae64ce0..065fe3ae41b9f 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -24,8 +24,8 @@ struct RawAlloc end struct TypeNamePair - addr::UInt - name::String + addr::Csize_t + name::Ptr{UInt8} end struct FreeInfo @@ -82,25 +82,25 @@ function decode_alloc(raw_alloc::RawAlloc)::Alloc end function decode(raw_results::RawAllocResults)::AllocResults - allocs = [ - decode_alloc(unsafe_load(raw_results.allocs, i)) - for i in 1:raw_results.num_allocs - ] - type_names = Dict{UInt,String} + type_names = Dict{UInt,String}() for i in 1:raw_results.num_type_names pair = unsafe_load(raw_results.type_names, i) - # println("pair=$pair") - # type_names[convert(UInt, pair.addr)] = pair.name type_addr = convert(UInt, pair.addr) - println("type_addr=$type_addr") - type_names[type_addr] = "MyType" + type_names[type_addr] = unsafe_string(pair.name) end + + allocs = [ + decode_alloc(unsafe_load(raw_results.allocs, i)) + for i in 1:raw_results.num_allocs + ] + frees = Dict{String,UInt}() for i in 1:raw_results.num_frees free = unsafe_load(raw_results.frees, i) type_name = type_names[free.type_addr] frees[type_name] = free.count end + return AllocResults( allocs, frees, From c1faa44dcb46da1c7644fe02759b410f6ae99efb Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 15:31:14 -0500 Subject: [PATCH 023/107] implement caching of stack trace lookups like the Profile does, and the C++ side did before wonder if we can move this into stacktraces.jl or something to dedup with Profile --- src/gc-alloc-profiler.cpp | 1 - stdlib/AllocProfile/src/AllocProfile.jl | 41 ++++++++++++++++++++----- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 34d54a455fe1d..3ccb28270250c 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -107,7 +107,6 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { results.type_names = (TypeNamePair*) malloc(sizeof(TypeNamePair) * results.num_type_names); int i = 0; for (auto type_addr_name : g_alloc_profile.type_name_by_address) { - jl_printf(JL_STDERR, "type name: %s\n", type_addr_name.second.c_str()); // TODO: free this malloc char *name = (char *) malloc(type_addr_name.second.length() + 1); memcpy(name, type_addr_name.second.c_str(), type_addr_name.second.length() + 1); diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 065fe3ae41b9f..6dfc8e7027b74 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -1,6 +1,6 @@ module AllocProfile -using Base.StackTraces +using Base.StackTraces: StackTrace, StackFrame, lookup using Base: InterpreterIP # raw results @@ -62,7 +62,7 @@ end struct Alloc # type::Type type_addr::Ptr{Type} # TODO: fix segfault when loading this - stacktrace::Vector{StackTraces.StackFrame} + stacktrace::StackTrace size::Int end @@ -72,11 +72,15 @@ struct AllocResults type_names::Dict{UInt,String} # type addr => type name end -function decode_alloc(raw_alloc::RawAlloc)::Alloc +const BacktraceEntry = Union{Ptr{Cvoid}, InterpreterIP} +const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} + +function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc Alloc( # unsafe_pointer_to_objref(convert(Ptr{Any}, raw_alloc.type)), raw_alloc.type, - stacktrace(_reformat_bt(raw_alloc.backtrace)), + # TODO: add caching to stacktrace + stacktrace_memoized(cache, _reformat_bt(raw_alloc.backtrace)), UInt(raw_alloc.size) ) end @@ -89,8 +93,9 @@ function decode(raw_results::RawAllocResults)::AllocResults type_names[type_addr] = unsafe_string(pair.name) end + cache = BacktraceCache() allocs = [ - decode_alloc(unsafe_load(raw_results.allocs, i)) + decode_alloc(cache, unsafe_load(raw_results.allocs, i)) for i in 1:raw_results.num_allocs ] @@ -108,13 +113,35 @@ function decode(raw_results::RawAllocResults)::AllocResults ) end +function stacktrace_memoized( + cache::BacktraceCache, + trace::Vector{BacktraceEntry}, + c_funcs=true +)::StackTrace + stack = StackTrace() + for ip in trace + frames = get(cache, ip) do + res = lookup(ip) + cache[ip] = res + return res + end + for frame in frames + # Skip frames that come from C calls. + if c_funcs || !frame.from_c + push!(stack, frame) + end + end + end + return stack +end + # convert an array of raw backtrace entries to array of usable objects # (either native pointers, InterpreterIP objects, or AllocationInfo objects) -function _reformat_bt(bt::RawBacktrace)::Vector{Union{Ptr{Cvoid}, InterpreterIP}} +function _reformat_bt(bt::RawBacktrace)::Vector{BacktraceEntry} # NOTE: Ptr{Cvoid} is always part of the output container type, # as end-of-block markers are encoded as a NULL pointer # TODO: use Nothing/nothing for that? - ret = Vector{Union{Ptr{Cvoid}, InterpreterIP}}() + ret = Vector{BacktraceEntry}() i = 1 while i <= bt.size ip = unsafe_load(bt.data, i).content From 671b88ecebf1b1fb8b2b1ad8b3152ac96e2ff858 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 22:27:55 -0500 Subject: [PATCH 024/107] add GC.@preserve, magically fixing segfaults (???) also change Julia representation of raw backtrace elements, thogh I'm not sure it was breaking anything --- stdlib/AllocProfile/src/AllocProfile.jl | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 6dfc8e7027b74..1038c6b2f40e9 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -5,14 +5,9 @@ using Base: InterpreterIP # raw results -# modeled on jl_bt_element_t -struct RawBacktraceElement - content::Csize_t -end - # matches RawBacktrace on the C side struct RawBacktrace - data::Ptr{RawBacktraceElement} + data::Ptr{Csize_t} # in C: *jl_bt_element_t size::Csize_t end @@ -51,10 +46,9 @@ end function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - # decoded_results = decode(raw_results) - # ccall(:jl_free_alloc_profile, Cvoid, ()) - # return decoded_results - return raw_results + decoded_results = GC.@preserve raw_results decode(raw_results) + ccall(:jl_free_alloc_profile, Cvoid, ()) + return decoded_results end # decoded results @@ -79,7 +73,6 @@ function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc Alloc( # unsafe_pointer_to_objref(convert(Ptr{Any}, raw_alloc.type)), raw_alloc.type, - # TODO: add caching to stacktrace stacktrace_memoized(cache, _reformat_bt(raw_alloc.backtrace)), UInt(raw_alloc.size) ) @@ -116,7 +109,7 @@ end function stacktrace_memoized( cache::BacktraceCache, trace::Vector{BacktraceEntry}, - c_funcs=true + c_funcs::Bool=true )::StackTrace stack = StackTrace() for ip in trace @@ -144,7 +137,7 @@ function _reformat_bt(bt::RawBacktrace)::Vector{BacktraceEntry} ret = Vector{BacktraceEntry}() i = 1 while i <= bt.size - ip = unsafe_load(bt.data, i).content + ip = unsafe_load(bt.data, i) # native frame if UInt(ip) != (-1 % UInt) @@ -155,16 +148,16 @@ function _reformat_bt(bt::RawBacktrace)::Vector{BacktraceEntry} end # Extended backtrace entry - entry_metadata = reinterpret(UInt, unsafe_load(bt.data, i+1).content) + entry_metadata = reinterpret(UInt, unsafe_load(bt.data, i+1)) njlvalues = entry_metadata & 0x7 nuintvals = (entry_metadata >> 3) & 0x7 tag = (entry_metadata >> 6) & 0xf header = entry_metadata >> 10 if tag == 1 # JL_BT_INTERP_FRAME_TAG - code = unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+2).content)) + code = unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+2))) mod = if njlvalues == 2 - unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+3).content)) + unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+3))) else nothing end From 6932831ec33cf36f52811ca5e891e7279c98f2a1 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 8 Dec 2021 22:42:18 -0500 Subject: [PATCH 025/107] delete code to stringify type names on C++ side thanks to GC.@preserve <3 --- src/gc-alloc-profiler.cpp | 59 +------------------------ src/gc-alloc-profiler.h | 3 -- stdlib/AllocProfile/src/AllocProfile.jl | 41 ++++++++--------- 3 files changed, 21 insertions(+), 82 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 3ccb28270250c..862e42cae7819 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -28,7 +28,6 @@ struct AllocProfile { int skip_every; vector allocs; - unordered_map type_name_by_address; unordered_map type_address_by_value_address; unordered_map frees_by_type_address; @@ -41,35 +40,6 @@ struct AllocProfile { AllocProfile g_alloc_profile; int g_alloc_profile_enabled = false; -// == utility functions == - -string _type_as_string(jl_datatype_t *type) { - if ((uintptr_t)type < 4096U) { - return ""; - } else if (type == (jl_datatype_t*)jl_buff_tag) { - return ""; - } else if (type == (jl_datatype_t*)jl_malloc_tag) { - return ""; - } else if (type == jl_string_type) { - return ""; - } else if (type == jl_symbol_type) { - return ""; - } else if (jl_is_datatype(type)) { - ios_t str_; - ios_mem(&str_, 10024); - JL_STREAM* str = (JL_STREAM*)&str_; - - jl_static_show(str, (jl_value_t*)type); - - string type_str = string((const char*)str_.buf, str_.size); - ios_close(&str_); - - return type_str; - } else { - return ""; - } -} - // === stack stuff === RawBacktrace get_raw_backtrace() { @@ -101,21 +71,6 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { g_alloc_profile.allocs.size() }; - // package up type names - results.num_type_names = g_alloc_profile.type_name_by_address.size(); - // TODO: free this malloc - results.type_names = (TypeNamePair*) malloc(sizeof(TypeNamePair) * results.num_type_names); - int i = 0; - for (auto type_addr_name : g_alloc_profile.type_name_by_address) { - // TODO: free this malloc - char *name = (char *) malloc(type_addr_name.second.length() + 1); - memcpy(name, type_addr_name.second.c_str(), type_addr_name.second.length() + 1); - results.type_names[i++] = TypeNamePair{ - type_addr_name.first, - name, - }; - } - // package up frees results.num_frees = g_alloc_profile.frees_by_type_address.size(); results.frees = (FreeInfo*) malloc(sizeof(FreeInfo) * results.num_frees); @@ -133,7 +88,6 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { JL_DLLEXPORT void jl_free_alloc_profile() { g_alloc_profile.frees_by_type_address.clear(); g_alloc_profile.type_address_by_value_address.clear(); - g_alloc_profile.type_name_by_address.clear(); g_alloc_profile.alloc_counter = 0; for (auto alloc : g_alloc_profile.allocs) { free(alloc.backtrace.data); @@ -145,16 +99,6 @@ JL_DLLEXPORT void jl_free_alloc_profile() { // == callbacks called into by the outside == -void register_type_string(jl_datatype_t *type) { - auto id = g_alloc_profile.type_name_by_address.find((size_t)type); - if (id != g_alloc_profile.type_name_by_address.end()) { - return; - } - - string type_str = _type_as_string(type); - g_alloc_profile.type_name_by_address[(size_t)type] = type_str; -} - void _record_allocated_value(jl_value_t *val, size_t size) { auto& profile = g_alloc_profile; profile.alloc_counter++; @@ -165,7 +109,6 @@ void _record_allocated_value(jl_value_t *val, size_t size) { profile.last_recorded_alloc = profile.alloc_counter; auto type = (jl_datatype_t*)jl_typeof(val); - register_type_string(type); profile.type_address_by_value_address[(size_t)val] = (size_t)type; @@ -193,6 +136,8 @@ void _record_freed_value(jl_taggedvalue_t *tagged_val) { } } +// TODO: remove these or make them toggle-able. + void _report_gc_started() { // ... } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index c0c7f601f82cf..ac904d7f02ce7 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -24,9 +24,6 @@ struct RawAllocResults { void *allocs; // Alloc* (see gc-alloc-profiler.cpp) size_t num_allocs; - struct TypeNamePair *type_names; // an array - size_t num_type_names; - struct FreeInfo *frees; size_t num_frees; }; diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 1038c6b2f40e9..d0c3f8835defb 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -24,7 +24,7 @@ struct TypeNamePair end struct FreeInfo - type_addr::UInt + type::Ptr{Type} count::UInt end @@ -33,9 +33,6 @@ struct RawAllocResults allocs::Ptr{RawAlloc} num_allocs::Csize_t - type_names::Ptr{TypeNamePair} - num_type_names::Csize_t - frees::Ptr{FreeInfo} num_frees::Csize_t end @@ -54,55 +51,55 @@ end # decoded results struct Alloc - # type::Type - type_addr::Ptr{Type} # TODO: fix segfault when loading this + type::Type stacktrace::StackTrace size::Int end struct AllocResults allocs::Vector{Alloc} - frees::Dict{String,UInt} # type name => string - type_names::Dict{UInt,String} # type addr => type name + frees::Dict{Type,UInt} end const BacktraceEntry = Union{Ptr{Cvoid}, InterpreterIP} const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} +# loading anything below this seems to segfault +# TODO: find out what's going on +TYPE_PTR_THRESHOLD = 0x0000000100000000 + +function load_type(ptr::Ptr{Type})::Type + if UInt(ptr) < TYPE_PTR_THRESHOLD + return Missing + end + return unsafe_pointer_to_objref(ptr) +end + function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc Alloc( - # unsafe_pointer_to_objref(convert(Ptr{Any}, raw_alloc.type)), - raw_alloc.type, + load_type(raw_alloc.type), stacktrace_memoized(cache, _reformat_bt(raw_alloc.backtrace)), UInt(raw_alloc.size) ) end function decode(raw_results::RawAllocResults)::AllocResults - type_names = Dict{UInt,String}() - for i in 1:raw_results.num_type_names - pair = unsafe_load(raw_results.type_names, i) - type_addr = convert(UInt, pair.addr) - type_names[type_addr] = unsafe_string(pair.name) - end - cache = BacktraceCache() allocs = [ decode_alloc(cache, unsafe_load(raw_results.allocs, i)) for i in 1:raw_results.num_allocs ] - frees = Dict{String,UInt}() + frees = Dict{Type,UInt}() for i in 1:raw_results.num_frees free = unsafe_load(raw_results.frees, i) - type_name = type_names[free.type_addr] - frees[type_name] = free.count + type = load_type(free.type) + frees[type] = free.count end return AllocResults( allocs, - frees, - type_names + frees ) end From e164cc832d4d3be01843c3b58510a004205ba88a Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Fri, 10 Dec 2021 17:44:18 -0500 Subject: [PATCH 026/107] Fix hang in GC: use `jl_safe_printf` not `jl_printf` --- src/gc-alloc-profiler.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 862e42cae7819..97b0759020540 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -70,7 +70,7 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { g_alloc_profile.allocs.data(), g_alloc_profile.allocs.size() }; - + // package up frees results.num_frees = g_alloc_profile.frees_by_type_address.size(); results.frees = (FreeInfo*) malloc(sizeof(FreeInfo) * results.num_frees); @@ -145,9 +145,7 @@ void _report_gc_started() { // TODO: figure out how to pass all of these in as a struct void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) { // TODO: figure out how to put in commas - jl_printf( - JL_STDERR, - "GC: pause %fms. collected %fMB. %lld allocs total\n", + jl_safe_printf("GC: pause %fms. collected %fMB. %lld allocs total\n", pause/1e6, freed/1e6, allocd ); } From c736dbc6a71c76876b794c68f3f2a8d4dc6d9f0d Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Fri, 10 Dec 2021 17:44:54 -0500 Subject: [PATCH 027/107] Mark the AllocProfile C code as `JL_NOTSAFEPOINT` TODO: is this correct!? --- src/gc-alloc-profiler.cpp | 8 ++++---- src/gc-alloc-profiler.h | 13 +++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 97b0759020540..e4801c773d8a0 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -99,7 +99,7 @@ JL_DLLEXPORT void jl_free_alloc_profile() { // == callbacks called into by the outside == -void _record_allocated_value(jl_value_t *val, size_t size) { +void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { auto& profile = g_alloc_profile; profile.alloc_counter++; auto diff = profile.alloc_counter - profile.last_recorded_alloc; @@ -119,7 +119,7 @@ void _record_allocated_value(jl_value_t *val, size_t size) { }); } -void _record_freed_value(jl_taggedvalue_t *tagged_val) { +void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { jl_value_t *val = jl_valueof(tagged_val); auto value_address = (size_t)val; @@ -138,12 +138,12 @@ void _record_freed_value(jl_taggedvalue_t *tagged_val) { // TODO: remove these or make them toggle-able. -void _report_gc_started() { +void _report_gc_started() JL_NOTSAFEPOINT { // ... } // TODO: figure out how to pass all of these in as a struct -void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) { +void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) JL_NOTSAFEPOINT { // TODO: figure out how to put in commas jl_safe_printf("GC: pause %fms. collected %fMB. %lld allocs total\n", pause/1e6, freed/1e6, allocd diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index ac904d7f02ce7..861e49f923a54 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -28,14 +28,15 @@ struct RawAllocResults { size_t num_frees; }; -void _report_gc_started(void); -void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd); +// TODO(PR): Is this correct? Are these JL_NOTSAFEPOINT? +void _report_gc_started(void) JL_NOTSAFEPOINT; +void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) JL_NOTSAFEPOINT; JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); -void _record_allocated_value(jl_value_t *val, size_t size); -void _record_freed_value(jl_taggedvalue_t *tagged_val); +void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; +void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT; // --------------------------------------------------------------------- // functions to call from GC when alloc profiling is enabled @@ -43,13 +44,13 @@ void _record_freed_value(jl_taggedvalue_t *tagged_val); extern int g_alloc_profile_enabled; -static inline void record_allocated_value(jl_value_t *val, size_t size) { +static inline void record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { if (__unlikely(g_alloc_profile_enabled)) { _record_allocated_value(val, size); } } -static inline void record_freed_value(jl_taggedvalue_t *tagged_val) { +static inline void record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { if (__unlikely(g_alloc_profile_enabled != 0)) { _record_freed_value(tagged_val); } From 9407a91a2d8f3151c5855cafa3a381baaaf35b5d Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 13 Dec 2021 21:11:21 -0500 Subject: [PATCH 028/107] print incr. vs full --- src/gc-alloc-profiler.cpp | 9 ++++++--- src/gc-alloc-profiler.h | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index e4801c773d8a0..ee3f11d20b06f 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -143,9 +143,12 @@ void _report_gc_started() JL_NOTSAFEPOINT { } // TODO: figure out how to pass all of these in as a struct -void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) JL_NOTSAFEPOINT { +void _report_gc_finished( + uint64_t pause, uint64_t freed, uint64_t allocd, int full, int recollect +) JL_NOTSAFEPOINT { // TODO: figure out how to put in commas - jl_safe_printf("GC: pause %fms. collected %fMB. %lld allocs total\n", - pause/1e6, freed/1e6, allocd + jl_safe_printf("GC: pause %fms. collected %fMB. %lld allocs total. %s %s\n", + pause/1e6, freed/1e6, allocd, + full ? "full" : "incr", recollect ? "recollect" : "" ); } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 861e49f923a54..dab52c1ecd753 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -30,7 +30,9 @@ struct RawAllocResults { // TODO(PR): Is this correct? Are these JL_NOTSAFEPOINT? void _report_gc_started(void) JL_NOTSAFEPOINT; -void _report_gc_finished(uint64_t pause, uint64_t freed, uint64_t allocd) JL_NOTSAFEPOINT; +void _report_gc_finished( + uint64_t pause, uint64_t freed, uint64_t allocd, int full, int recollect +) JL_NOTSAFEPOINT; JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); From f297d94f3e672ca2320faddd3ed7a68a033ad45e Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 17 Dec 2021 21:37:08 -0500 Subject: [PATCH 029/107] put test back in; get it passing --- stdlib/AllocProfile/src/AllocProfile.jl | 61 ++++++------------------- stdlib/AllocProfile/test/runtests.jl | 19 ++++++-- 2 files changed, 30 insertions(+), 50 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index d0c3f8835defb..2ccfd880a9076 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -44,10 +44,13 @@ end function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) decoded_results = GC.@preserve raw_results decode(raw_results) - ccall(:jl_free_alloc_profile, Cvoid, ()) return decoded_results end +function clear() + ccall(:jl_free_alloc_profile, Cvoid, ()) +end + # decoded results struct Alloc @@ -78,7 +81,7 @@ end function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc Alloc( load_type(raw_alloc.type), - stacktrace_memoized(cache, _reformat_bt(raw_alloc.backtrace)), + stacktrace_memoized(cache, load_backtrace(raw_alloc.backtrace)), UInt(raw_alloc.size) ) end @@ -103,9 +106,17 @@ function decode(raw_results::RawAllocResults)::AllocResults ) end +function load_backtrace(trace::RawBacktrace)::Vector{Ptr{Cvoid}} + out = Vector{Ptr{Cvoid}}() + for i in 1:trace.size + push!(out, unsafe_load(trace.data, i)) + end + return out +end + function stacktrace_memoized( cache::BacktraceCache, - trace::Vector{BacktraceEntry}, + trace::Vector{Ptr{Cvoid}}, c_funcs::Bool=true )::StackTrace stack = StackTrace() @@ -125,48 +136,4 @@ function stacktrace_memoized( return stack end -# convert an array of raw backtrace entries to array of usable objects -# (either native pointers, InterpreterIP objects, or AllocationInfo objects) -function _reformat_bt(bt::RawBacktrace)::Vector{BacktraceEntry} - # NOTE: Ptr{Cvoid} is always part of the output container type, - # as end-of-block markers are encoded as a NULL pointer - # TODO: use Nothing/nothing for that? - ret = Vector{BacktraceEntry}() - i = 1 - while i <= bt.size - ip = unsafe_load(bt.data, i) - - # native frame - if UInt(ip) != (-1 % UInt) - # See also jl_bt_is_native - push!(ret, convert(Ptr{Cvoid}, ip)) - i += 1 - continue - end - - # Extended backtrace entry - entry_metadata = reinterpret(UInt, unsafe_load(bt.data, i+1)) - njlvalues = entry_metadata & 0x7 - nuintvals = (entry_metadata >> 3) & 0x7 - tag = (entry_metadata >> 6) & 0xf - header = entry_metadata >> 10 - - if tag == 1 # JL_BT_INTERP_FRAME_TAG - code = unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+2))) - mod = if njlvalues == 2 - unsafe_pointer_to_objref(convert(Ptr{Any}, unsafe_load(bt.data, i+3))) - else - nothing - end - push!(ret, InterpreterIP(code, header, mod)) - else - # Tags we don't know about are an error - throw(ArgumentError("Unexpected extended backtrace entry tag $tag at bt[$i]")) - end - # See jl_bt_entry_size - i += Int(2 + njlvalues + nuintvals) - end - return ret -end - end diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index be0d0dd677687..0285a131a6858 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -1,8 +1,21 @@ +# TODO: register AllocProfile in the stdlib +using Pkg; Pkg.activate("stdlib/AllocProfile") + +using Test + using AllocProfile -AllocProfile.start() +@testset "alloc profiler doesn't segfault" begin + AllocProfile.start() -using Base64 + # test the allocations during compilation + using Base64 -raw_results = AllocProfile.stop() + results = AllocProfile.stop() + @test length(results.allocs) > 0 + first_alloc = results.allocs[1] + @test first_alloc.size > 0 + @test length(first_alloc.stacktrace) > 0 + @test length(string(first_alloc.type)) > 0 +end From 50dcb6341dbbbd9406bf7db028e61c4259816971 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 13 Dec 2021 21:11:43 -0500 Subject: [PATCH 030/107] simpler Base.show for AllocResults --- stdlib/AllocProfile/src/AllocProfile.jl | 4 + stdlib/AllocProfile/src/test.json | 5488 +++++++++++++++++++++++ 2 files changed, 5492 insertions(+) create mode 100644 stdlib/AllocProfile/src/test.json diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 2ccfd880a9076..4c1c943629225 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -64,6 +64,10 @@ struct AllocResults frees::Dict{Type,UInt} end +function Base.show(io::IO, ::AllocResults) + print(io, "AllocResults") +end + const BacktraceEntry = Union{Ptr{Cvoid}, InterpreterIP} const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} diff --git a/stdlib/AllocProfile/src/test.json b/stdlib/AllocProfile/src/test.json new file mode 100644 index 0000000000000..8a32e15b0098d --- /dev/null +++ b/stdlib/AllocProfile/src/test.json @@ -0,0 +1,5488 @@ +{ + "allocs": [ + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 0 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 56, 57, 58, 59, 60, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, + 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 56, 57, 58, 59, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 84, 58, 59, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 87, 59, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 87, 59, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, + 87, 59, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 87, 59, + 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 87, 59, + 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 109, 87, 59, 60, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 110, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 111, 112, 113, 60, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 114, 115, 116, 117, 118, 119, 112, 113, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 120, 121, 112, 113, 60, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 111, 112, 122, 60, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 114, 115, 116, 117, 118, 119, 112, 122, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 120, 121, 112, 122, 60, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 123, 60, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, + 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 56, 124, 125, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 56, 124, 125, 60, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 56, 124, 125, 60, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, + 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 56, 124, 125, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 126, 60, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 56, 124, 125, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 56, 124, 125, 60, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 56, 124, 125, 60, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, + 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 56, 124, 125, 60, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 126, 60, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 126, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, + 126, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 126, 60, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 126, 60, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 109, 126, 60, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 127, 128, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 127, 128, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 127, 128, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 129, 130, 131, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, + 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 129, 130, 131, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 129, 130, 131, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 9 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 132, 133, 134, 135, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, + 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 132, 133, 134, 135, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 0 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 132, 133, 134, 135, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 10 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 136, 137, 134, 135, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, + 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 136, 137, 134, 135, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 0 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 136, 137, 134, 135, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 11 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 138, 139, 134, 135, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, + 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 138, 139, 134, 135, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 0 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 138, 139, 134, 135, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 12 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 140, 130, 141, 142, 135, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 140, 130, 141, 142, 135, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 0 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 140, 130, 141, 142, 135, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, + 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 9 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 143, 13, 144, 145, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 150, + 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 150, + 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 150, 13, 144, 145, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, + 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 109, 150, 13, 144, 145, 146, 147, 148, 149, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 151, 152, 153, 154, 155, + 156, 157, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 143, 13, 144, 145, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 150, + 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 150, + 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 150, 13, 144, 145, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, + 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 150, 13, + 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 109, 150, 13, 144, 145, 146, 147, 148, 149, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 151, 152, 153, 154, 155, + 156, 157, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 143, 13, 144, 145, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 158, 13, 144, 145, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 158, 13, 144, 145, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 159, 160, 161, 146, 147, + 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 159, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 159, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 159, 160, 161, 146, 147, 148, 149, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 159, 160, 161, 146, 147, + 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 162, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 163, 164, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 163, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 163, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 163, 164, 160, 161, 146, 147, 148, 149, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 163, 164, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 165, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 165, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, + 165, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 165, + 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 165, + 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 109, 165, 164, 160, 161, 146, 147, 148, 149, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 166, 164, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 166, 164, 160, 161, 146, 147, 148, 149, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 166, 164, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 167, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 166, 164, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 1 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 68, 69, 70, 71, 166, 164, 160, 161, 146, 147, 148, 149, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 3 + }, + { + "stack": [ + 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 166, 164, 160, 161, 146, + 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, + 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 167, 164, 160, 161, + 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, + 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 167, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 5 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, + 167, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 167, + 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 167, + 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 7 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 109, 167, 164, 160, 161, 146, 147, 148, 149, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 168, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 13 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 151, 152, 153, 154, 155, + 169, 170, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, + 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 61, 171, 172, 173, 174, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 175, 176, 177, 178, 179, 180, 181, 182, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 14 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 186, 187, 188, 177, 178, 179, 180, 181, 182, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 189, 190, 191, 192, 193, 179, 180, 181, 182, 18, 183, 184, 23, + 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, + 50 + ], + "size": 42, + "type_id": 15 + }, + { + "stack": [ + 0, 1, 2, 3, 194, 195, 192, 193, 179, 180, 181, 182, 18, 183, 184, 23, + 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, + 50 + ], + "size": 42, + "type_id": 16 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 196, 197, 198, 199, 192, 193, 179, 180, 181, 182, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 196, 197, 200, 199, 192, 193, 179, 180, 181, 182, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 201, 202, 193, 179, 180, 181, 182, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 17 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 186, 187, 203, 204, 205, 193, 179, 180, 181, 182, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 206, 207, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 18 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 211, 212, 213, 214, 16, 17, 18, 215, 208, + 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, + 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 19 + }, + { + "stack": [ + 0, 1, 2, 3, 67, 216, 217, 16, 17, 18, 218, 219, 220, 221, 16, 17, 222, + 223, 223, 224, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 20 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 226, 217, 16, 17, 18, 218, 219, 220, 221, 16, + 17, 222, 223, 223, 224, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, + 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 227, 220, 221, 16, 17, 222, 223, 223, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 228, 229, 230, 231, 232, 223, 223, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 233, 234, 235, 236, 224, 225, 213, 214, 16, 17, 18, 215, 208, + 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, + 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 22 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 237, 235, 236, 224, 225, 213, 214, 16, 17, 18, 215, + 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 238, 239, 240, 235, 236, 224, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 186, 187, 241, 242, 243, 244, 240, 235, 236, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 245, 242, 243, 244, 240, 235, 236, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 23 + }, + { + "stack": [ + 0, 1, 2, 3, 246, 247, 244, 240, 235, 236, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 24 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 238, 239, 240, 235, 236, 224, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 238, 239, 240, 235, 236, 224, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 246, 248, 244, 240, 235, 236, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 25 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 249, 250, 235, 236, 224, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 26 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 251, 235, 236, 224, 225, 213, 214, 16, 17, 18, 215, + 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 252, 253, 52, 254, 255, 256, 224, 225, 213, 214, + 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 257, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 258, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 259, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 28 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 260, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 29 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 261, 256, 224, 225, 213, 214, 16, 17, 18, 215, + 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 30 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 262, 256, 224, 225, 213, 214, 16, 17, 18, 215, + 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, + 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 263, 264, 256, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 31 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 263, 264, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 263, 264, 256, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 263, 264, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 263, 264, 256, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 269, 256, 224, 225, 213, 214, + 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 269, 256, 224, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 272, 273, 256, 224, 225, 213, 214, + 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 274, 275, 276, 256, 224, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 274, 275, 276, 256, 224, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 278, 279, 256, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 278, 279, 256, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 279, 256, 224, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 32 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 279, 256, 224, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 33 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 280, 279, 256, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 281, 256, 224, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 282, 283, 284, 285, 286, 287, 288, 289, 225, 213, 214, + 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, + 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, + 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 30 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 290, 288, 289, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 291, 292, 293, 288, 289, 225, 213, 214, 16, + 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 294, 295, 293, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 34 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 296, 295, 293, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 297, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 35 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 298, 299, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 298, 303, 304, 298, 299, + 300, 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, + 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 305, 300, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 306, 307, 300, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 308, 309, 310, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 308, 309, 310, 300, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 311, 312, 313, 314, 315, 316, 310, 300, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 317, 310, 300, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 36 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 318, 310, 300, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 319, 320, 310, 300, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 319, 320, 310, 300, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 306, 321, 300, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 253, 52, 322, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 37 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 326, 327, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 326, 327, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 326, 327, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 326, 327, 300, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 326, 327, 300, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 326, 327, 300, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 333, 334, 335, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 332, 333, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 333, 334, 335, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 332, 333, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 333, 334, 335, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 333, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 39 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 333, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 333, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 40 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 332, 337, 338, 334, 335, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 332, 337, 338, 334, 335, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 341, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 342, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 343, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 344, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 345, 337, 338, 334, 335, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 346, 347, 338, 334, 335, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 41 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 348, 349, 334, 335, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 282, 283, 350, 349, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 282, 283, 351, 349, 334, 335, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 352, 349, 334, 335, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 353, 354, 334, 335, 336, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 40 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 355, 353, 354, 334, 335, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 356, 353, 354, 334, 335, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 346, 357, 358, 354, 334, 335, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 42 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 359, 360, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 43 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 361, 359, 360, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 361, 359, 360, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 362, 363, 364, 365, 360, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 43 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 366, 360, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 367, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 42 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 369, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 370, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 44 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 370, 368, 336, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 371, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 45 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 371, 368, 336, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 46 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 372, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 47 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 373, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 374, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 346, 375, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 48 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 376, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 376, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 377, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 377, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 378, 379, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 378, 379, 368, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 380, 381, 382, 379, 368, 336, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 21 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 380, 381, 382, 379, 368, + 336, 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, + 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, + 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 383, 368, 336, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 384, 368, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 47 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 385, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 339, 386, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 387, 388, 368, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 389, 388, 368, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 61, 62, 63, 64, 65, 390, 388, 368, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 2 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 391, 392, 388, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 393, 388, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 36 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 394, 388, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 394, 388, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 394, 388, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 394, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 394, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 395, 388, 368, 336, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 47 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 396, 388, 368, 336, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 42 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 397, 52, 398, 388, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 399, 52, 400, 388, 368, 336, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 362, 363, 364, 401, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 36 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 401, 388, 368, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 402, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 402, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 402, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 402, 388, 368, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 402, 388, 368, 336, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 402, 388, 368, 336, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 404, 405, 406, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 404, 405, 406, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 404, 405, 406, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 404, 405, 406, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 404, 405, 406, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 404, 405, 406, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 404, 405, 406, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 404, 405, 406, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 404, 405, 406, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 404, 405, 406, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 404, 405, 406, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 404, 405, 406, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 404, 405, 406, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 404, 405, 406, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 404, 405, 406, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 419, 420, 405, 406, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 422, 420, 405, 406, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 423, 424, 425, 16, 17, 426, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 49 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 404, 405, 427, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 404, 405, 427, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 404, 405, 427, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 404, 405, 427, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 404, 405, 427, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 404, 405, 427, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 404, 405, 427, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 404, 405, 427, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 404, 405, 427, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 404, 405, 427, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 404, 405, 427, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 404, 405, 427, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 404, 405, 427, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 404, 405, 427, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 404, 405, 427, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 419, 420, 405, 427, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 422, 420, 405, 427, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 428, 429, 430, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 428, 429, 430, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 428, 429, 430, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 428, 429, 430, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 428, 429, 430, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 428, 429, 430, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 428, 429, 430, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 428, 429, 430, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 428, 429, 430, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 428, 429, 430, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 428, 429, 430, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 428, 429, 430, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 428, 429, 430, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 428, 429, 430, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 428, 429, 430, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 431, 430, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 432, 430, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 306, 433, 430, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 434, 430, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 435, 430, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 436, 437, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 438, 437, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 428, 439, 437, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 428, 439, 437, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 428, 439, 437, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 428, 439, 437, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 428, 439, 437, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 428, 439, 437, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 428, 439, 437, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 428, 439, 437, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 428, 439, 437, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 428, 439, 437, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 428, 439, 437, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 428, 439, 437, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 428, 439, 437, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 428, 439, 437, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 428, 439, 437, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 440, 437, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 278, 441, 437, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 442, 437, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 277, 443, 444, 301, 302, 288, 289, 225, 213, + 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, + 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, + 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 404, 405, 445, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 404, 405, 445, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 404, 405, 445, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 404, 405, 445, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 404, 405, 445, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 404, 405, 445, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 404, 405, 445, 301, 302, 288, + 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, + 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, + 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 404, 405, 445, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 404, 405, 445, 301, 302, 288, 289, 225, + 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, + 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, + 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 404, 405, 445, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 404, 405, 445, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 8 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 404, 405, 445, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 27 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 404, 405, 445, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 404, 405, 445, 301, + 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, + 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, + 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 38 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 404, 405, 445, 301, 302, 288, 289, + 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, + 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, + 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 419, 420, 405, 445, 301, 302, + 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, + 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, + 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 422, 420, 405, 445, + 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, + 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, + 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 6 + }, + { + "stack": [ + 0, 1, 2, 3, 100, 101, 102, 103, 446, 288, 289, 225, 213, 214, 16, 17, + 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, + 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, + 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 50 + }, + { + "stack": [ + 0, 1, 2, 447, 448, 449, 450, 451, 452, 453, 288, 289, 225, 213, 214, 16, + 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, + 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, + 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 4 + }, + { + "stack": [ + 0, 1, 2, 454, 455, 456, 457, 453, 288, 289, 225, 213, 214, 16, 17, 18, + 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, + 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, + 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 + ], + "size": 42, + "type_id": 51 + } + ], + "frees": [], + "locations": [ + { "loc": "getindex at array.jl:423 [inlined]", "id": 306 }, + { "loc": "IdSet at idset.jl:7 [inlined]", "id": 278 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:87", + "id": 260 + }, + { "loc": "getindex at array.jl:411 [inlined]", "id": 9 }, + { + "loc": "active_project(search_load_path::Bool) at initdefs.jl:298", + "id": 87 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:614", + "id": 372 + }, + { + "loc": "assemble_inline_todo!(ir::Core.Compiler.IRCode, state::Core.Compiler.InliningState{Core.Compiler.EdgeTracker, Core.Compiler.WorldView{Core.Compiler.InternalCodeCache}, Core.Compiler.NativeInterpreter}) at inlining.jl:1277", + "id": 423 + }, + { + "loc": "run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool) at REPL.jl:367", + "id": 37 + }, + { "loc": "array_resize_buffer at array.c:714", "id": 62 }, + { "loc": "abspath(a::String) at path.jl:430", "id": 56 }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:816", + "id": 385 + }, + { "loc": "jl_decode_value_array at ircode.c:442", "id": 244 }, + { "loc": "copy(e::Expr) at expr.jl:37", "id": 303 }, + { "loc": "copymutable at bitset.jl:47 [inlined]", "id": 381 }, + { "loc": "jl_gc_alloc_buf at julia_internal.h:397 [inlined]", "id": 61 }, + { + "loc": "string(::String, ::SubString{String}) at substring.jl:227", + "id": 108 + }, + { "loc": "do_apply at builtins.c:713", "id": 218 }, + { + "loc": "finish(compact::Core.Compiler.IncrementalCompact) at ir.jl:1437", + "id": 419 + }, + { "loc": "jl_toplevel_eval_flex at toplevel.c:888", "id": 29 }, + { + "loc": "getindex(#unused#::Type{Any}, vals::Any) at array.jl:416", + "id": 216 + }, + { + "loc": "find_throw_blocks(code::Vector{Any}, handler_at::Vector{Int64}) at utilities.jl:308", + "id": 274 + }, + { "loc": "StringVector at iobuffer.jl:31 [inlined]", "id": 74 }, + { "loc": "project_deps_get at loading.jl:418 [inlined]", "id": 145 }, + { + "loc": "IOBuffer(; read::Bool, write::Bool, append::Nothing, truncate::Bool, maxsize::Int64, sizehint::Int64) at iobuffer.jl:114", + "id": 75 + }, + { + "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:87", + "id": 317 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:897", + "id": 386 + }, + { "loc": "load_path_expand(env::String) at initdefs.jl:255", "id": 113 }, + { + "loc": "mark_throw_blocks!(src::Core.CodeInfo, handler_at::Vector{Int64}) at utilities.jl:301", + "id": 275 + }, + { "loc": "normpath(path::String) at path.jl:395", "id": 71 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:508", + "id": 401 + }, + { "loc": "import_module at toplevel.c:563", "id": 173 }, + { "loc": "push! at array.jl:1055 [inlined]", "id": 65 }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:495", + "id": 310 + }, + { + "loc": "typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:209", + "id": 288 + }, + { "loc": "iterate at tuple.jl:68 [inlined]", "id": 105 }, + { "loc": "update_domtree! at domtree.jl:210 [inlined]", "id": 338 }, + { "loc": "basename at path.jl:186 [inlined]", "id": 97 }, + { + "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:91", + "id": 320 + }, + { "loc": "similar at array.jl:378 [inlined]", "id": 362 }, + { "loc": "_array_for at array.jl:676 [inlined]", "id": 91 }, + { + "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:332", + "id": 351 + }, + { "loc": "IdDict at iddict.jl:30 [inlined]", "id": 277 }, + { "loc": "ijl_alloc_vec_any at array.c:540", "id": 187 }, + { "loc": "load_path() at initdefs.jl:342", "id": 60 }, + { + "loc": "find_ssavalue_uses(body::Vector{Any}, nvals::Int64) at utilities.jl:245", + "id": 263 + }, + { "loc": "sizehint! at array.jl:1264 [inlined]", "id": 268 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:388", + "id": 390 + }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:424", + "id": 392 + }, + { + "loc": "_collect(#unused#::Type{SubString{String}}, itr::Base.SplitIterator{String, Regex}, isz::Base.SizeUnknown) at array.jl:651", + "id": 66 + }, + { "loc": "ijl_box_uint64 at datatype.c:1169", "id": 206 }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:239", + "id": 293 + }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:269", + "id": 446 + }, + { "loc": "load_path_expand(env::String) at initdefs.jl:264", "id": 125 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:94", + "id": 262 + }, + { + "loc": "Dict{String, Union{Nothing, String}}(kv::Dict{Any, Any}) at dict.jl:101", + "id": 139 + }, + { + "loc": "cache_result!(interp::Core.Compiler.NativeInterpreter, result::Core.Compiler.InferenceResult) at typeinfer.jl:394", + "id": 457 + }, + { + "loc": "typeinf_ext_toplevel(mi::Core.MethodInstance, world::UInt64) at sys.dylib:?", + "id": 214 + }, + { "loc": "jl_toplevel_eval_flex at toplevel.c:708", "id": 174 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:430", + "id": 430 + }, + { "loc": "NativeInterpreter at types.jl:162 [inlined]", "id": 212 }, + { "loc": "ijl_array_copy at array.c:1207", "id": 282 }, + { "loc": "Dict at dict.jl:118 [inlined]", "id": 128 }, + { "loc": "new_binding at module.c:145 [inlined]", "id": 171 }, + { "loc": "optimize at optimize.jl:418 [inlined]", "id": 301 }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:229", + "id": 290 + }, + { "loc": "_record_allocated_value at gc-alloc-profiler.cpp:80", "id": 0 }, + { + "loc": "type_annotate!(sv::Core.Compiler.InferenceState, run_optimizer::Bool) at typeinfer.jl:646", + "id": 296 + }, + { + "loc": "transform_result_for_cache at typeinfer.jl:367 [inlined]", + "id": 451 + }, + { "loc": "ijl_uncompress_argnames at ircode.c:941", "id": 249 }, + { "loc": "ip:0xffffffffffffffff", "id": 25 }, + { "loc": "macro expansion at loading.jl:991 [inlined]", "id": 149 }, + { "loc": "ijl_array_sizehint at array.c:1193", "id": 267 }, + { + "loc": "get_updated_dict(p::Base.TOML.Parser, f::Base.CachedTOMLDict) at loading.jl:204", + "id": 151 + }, + { "loc": "load_path_expand(env::String) at initdefs.jl:273", "id": 84 }, + { "loc": "parsed_toml at loading.jl:242 [inlined]", "id": 155 }, + { + "loc": "scan_slot_def_use(nargs::Int64, ci::Core.CodeInfo, code::Vector{Any}) at slot2ssa.jl:41", + "id": 366 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:616", + "id": 416 + }, + { + "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:817", + "id": 434 + }, + { "loc": "jl_f_tuple at builtins.c:793", "id": 67 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:106", + "id": 273 + }, + { "loc": "print at show.jl:1061 [inlined]", "id": 117 }, + { "loc": "jl_compile_method_internal at gf.c:1988", "id": 209 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:102", + "id": 264 + }, + { "loc": "jl_toplevel_eval_flex at toplevel.c:832", "id": 30 }, + { "loc": "Set at set.jl:9 [inlined]", "id": 130 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:105", + "id": 269 + }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:500", + "id": 398 + }, + { "loc": "ijl_ptr_to_array_1d at array.c:335", "id": 447 }, + { "loc": "replace at util.jl:675 [inlined]", "id": 112 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:429", + "id": 427 + }, + { "loc": "#invokelatest#2 at essentials.jl:731 [inlined]", "id": 43 }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:499", + "id": 322 + }, + { + "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool) at sys.dylib:?", + "id": 221 + }, + { "loc": "_collect at array.jl:715 [inlined]", "id": 314 }, + { "loc": "getindex at array.jl:929 [inlined]", "id": 364 }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:226", + "id": 287 + }, + { + "loc": "Dict{String, Base.UUID}(kv::Dict{Any, Any}) at dict.jl:101", + "id": 133 + }, + { "loc": "_gf_invoke_lookup at gf.c:2462 [inlined]", "id": 179 }, + { "loc": "jl_decode_value at ircode.c:677", "id": 248 }, + { "loc": "SlotInfo at slot2ssa.jl:8 [inlined]", "id": 361 }, + { + "loc": "string(::String, ::SubString{String}) at substring.jl:222", + "id": 106 + }, + { "loc": "match at regex.jl:383 [inlined]", "id": 93 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:433", + "id": 395 + }, + { + "loc": "Core.Compiler.NativeInterpreter(world::UInt64; inf_params::Core.Compiler.InferenceParams, opt_params::Core.Compiler.OptimizationParams) at types.jl:171", + "id": 211 + }, + { "loc": "compact! at ir.jl:1448 [inlined]", "id": 405 }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:681", + "id": 375 + }, + { "loc": "copy! at domtree.jl:106 [inlined]", "id": 345 }, + { "loc": "ijl_alloc_array_1d at array.c:441 [inlined]", "id": 186 }, + { + "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:264", + "id": 348 + }, + { + "loc": "identify_package(where::Base.PkgId, name::String) at loading.jl:283", + "id": 147 + }, + { "loc": "Dict{Any, Any}() at dict.jl:90", "id": 127 }, + { + "loc": "entry_point_and_project_file_inside at loading.jl:521 [inlined]", + "id": 167 + }, + { "loc": "fill at array.jl:531 [inlined]", "id": 271 }, + { + "loc": "finish(me::Core.Compiler.InferenceState, interp::Core.Compiler.NativeInterpreter) at typeinfer.jl:471", + "id": 295 + }, + { "loc": "copy(s1::Core.Compiler.BitSet) at bitset.jl:46", "id": 380 }, + { "loc": "BitArray at bitarray.jl:37 [inlined]", "id": 228 }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:255", + "id": 302 + }, + { "loc": "isfile_casesensitive(path::String) at loading.jl:47", "id": 86 }, + { + "loc": "compute_trycatch(code::Vector{Any}, ip::Core.Compiler.BitSet) at inferencestate.jl:149", + "id": 272 + }, + { "loc": "true_main at jlapi.c:562", "id": 49 }, + { + "loc": "compute_domtree_nodes!(domtree::Core.Compiler.DomTree) at domtree.jl:224", + "id": 353 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:802", + "id": 379 + }, + { "loc": "join at io.jl:353 [inlined]", "id": 70 }, + { + "loc": "complete(compact::Core.Compiler.IncrementalCompact) at ir.jl:1443", + "id": 421 + }, + { + "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool, withfirst::Bool) at inferenceresult.jl:104", + "id": 227 + }, + { + "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:195", + "id": 330 + }, + { "loc": "Array at boot.jl:452 [inlined]", "id": 7 }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:500", + "id": 327 + }, + { + "loc": "Core.CodeInstance(result::Core.Compiler.InferenceResult, inferred_result::Any, valid_worlds::Core.Compiler.WorldRange) at typeinfer.jl:318", + "id": 456 + }, + { + "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:530", + "id": 159 + }, + { "loc": "_start() at client.jl:506", "id": 47 }, + { "loc": "_jl_invoke at gf.c:0 [inlined]", "id": 16 }, + { + "loc": "typeinf_ext_toplevel(interp::Core.Compiler.NativeInterpreter, linfo::Core.MethodInstance) at typeinfer.jl:945", + "id": 225 + }, + { "loc": "Array at boot.jl:471 [inlined]", "id": 8 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:426", + "id": 406 + }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:447", + "id": 305 + }, + { "loc": "ijl_array_grow_end at array.c:975 [inlined]", "id": 266 }, + { "loc": "jl_apply at julia.h:1773 [inlined]", "id": 18 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:431", + "id": 437 + }, + { "loc": "copy at array.jl:369 [inlined]", "id": 283 }, + { "loc": "_jl_invoke at gf.c:2261 [inlined]", "id": 210 }, + { + "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:88", + "id": 318 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:609", + "id": 411 + }, + { + "loc": "typeinf_ext(interp::Core.Compiler.NativeInterpreter, mi::Core.MethodInstance) at typeinfer.jl:910", + "id": 224 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:683", + "id": 377 + }, + { "loc": "split at util.jl:592 [inlined]", "id": 54 }, + { + "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:290", + "id": 350 + }, + { "loc": "slot2reg at optimize.jl:522 [inlined]", "id": 335 }, + { "loc": "jl_gc_alloc_ at julia_internal.h:369 [inlined]", "id": 2 }, + { "loc": "ijl_apply_generic at gf.c:2451", "id": 17 }, + { "loc": "cache_method at gf.c:1039", "id": 192 }, + { + "loc": "run_repl(repl::REPL.AbstractREPL, consumer::Any) at sys.dylib:?", + "id": 39 + }, + { "loc": "ijl_new_code_info_uninit at method.c:430", "id": 233 }, + { "loc": "identify_package at loading.jl:277 [inlined]", "id": 148 }, + { + "loc": "explicit_project_deps_get(project_file::String, name::String) at loading.jl:554", + "id": 156 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:574", + "id": 409 + }, + { "loc": "jl_smallintset_insert at smallintset.c:158", "id": 200 }, + { "loc": "eval at boot.jl:368 [inlined]", "id": 33 }, + { "loc": "jl_exprn at builtins.c:1283", "id": 245 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:509", + "id": 402 + }, + { + "loc": "Core.Compiler.IdDict{Int64, Int64}(itr::Core.Compiler.Generator{Core.Compiler.Iterators.Filter{Core.Compiler.var\"#359#366\", Core.Compiler.Pairs{Int64, Int64, Core.Compiler.LinearIndices{1, Tuple{Core.Compiler.OneTo{Int64}}}, Vector{Int64}}}, Core.Compiler.var\"#358#365\"}) at iddict.jl:33", + "id": 391 + }, + { "loc": "macro expansion at lock.jl:221 [inlined]", "id": 13 }, + { "loc": "cache_method at gf.c:1166", "id": 205 }, + { "loc": "DomTreeNode at domtree.jl:184 [inlined]", "id": 355 }, + { "loc": "vect at array.jl:125 [inlined]", "id": 291 }, + { + "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:83", + "id": 309 + }, + { + "loc": "Base.LoadingCache(load_path::Vector{String}, dummy_uuid::Dict{Any, Any}, env_project_file::Dict{Any, Any}, project_file_manifest_path::Dict{Any, Any}, require_parsed::Set{Any}) at loading.jl:226", + "id": 135 + }, + { "loc": "load_path() at initdefs.jl:343", "id": 110 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:425", + "id": 393 + }, + { "loc": "ijl_get_binding_wr at module.c:177", "id": 172 }, + { "loc": "ml_matches_visitor at gf.c:2682", "id": 188 }, + { "loc": "ijl_new_codeinst at gf.c:373", "id": 454 }, + { "loc": "jl_smallintset_insert at smallintset.c:139", "id": 198 }, + { "loc": "parsed_toml at loading.jl:244 [inlined]", "id": 154 }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:614", + "id": 414 + }, + { + "loc": "record_allocated_value at gc-alloc-profiler.h:47 [inlined]", + "id": 1 + }, + { "loc": "collect at array.jl:644 [inlined]", "id": 52 }, + { + "loc": "compact!(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:1448", + "id": 404 + }, + { "loc": "Base.LoadingCache() at loading.jl:233", "id": 11 }, + { "loc": "copy! at domtree.jl:105 [inlined]", "id": 344 }, + { "loc": "ml_matches_visitor at gf.c:2677", "id": 176 }, + { "loc": "load_path() at initdefs.jl:340", "id": 10 }, + { "loc": "cache_method at gf.c:1148", "id": 202 }, + { "loc": "ip:0x1136e5090", "id": 27 }, + { + "loc": "DFS!(D::Core.Compiler.DFSTree, blocks::Vector{Core.Compiler.BasicBlock}) at domtree.jl:113", + "id": 337 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:575", + "id": 410 + }, + { "loc": "zeros at array.jl:581 [inlined]", "id": 81 }, + { + "loc": "_splitdir_nodrive(a::String, b::String) at path.jl:138", + "id": 95 + }, + { "loc": "eval_body at interpreter.c:522", "id": 23 }, + { "loc": "InferenceResult at types.jl:40 [inlined]", "id": 223 }, + { + "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:667", + "id": 432 + }, + { "loc": "basic_blocks_starts(stmts::Vector{Any}) at ir.jl:37", "id": 308 }, + { "loc": "ijl_alloc_svec_uninit at simplevector.c:60", "id": 194 }, + { "loc": "Dict{String, Base.UUID}() at dict.jl:90", "id": 132 }, + { "loc": "Dict{String, Nothing}() at dict.jl:90", "id": 140 }, + { "loc": "ijl_uncompress_ir at ircode.c:819", "id": 251 }, + { "loc": "_array_for at array.jl:672 [inlined]", "id": 252 }, + { "loc": "jl_gc_alloc at gc.c:3321", "id": 3 }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:615", + "id": 415 + }, + { + "loc": "_collect(#unused#::Type{Int64}, itr::Core.Compiler.Generator{Core.Compiler.Iterators.Filter{Core.Compiler.var\"#363#370\"{Core.Compiler.IdDict{Int64, Int64}}, Vector{Int64}}, Core.Compiler.var\"#362#369\"{Int64, Core.Compiler.IdDict{Int64, Int64}, Vector{Int64}}}, isz::Core.Compiler.SizeUnknown) at array.jl:649", + "id": 399 + }, + { "loc": "macro expansion at loading.jl:405 [inlined]", "id": 150 }, + { + "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:531", + "id": 162 + }, + { "loc": "abspath at path.jl:439 [inlined]", "id": 124 }, + { + "loc": "compact!(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:1451", + "id": 420 + }, + { "loc": "project_deps_get at loading.jl:423 [inlined]", "id": 161 }, + { + "loc": "ssa_inlining_pass!(ir::Core.Compiler.IRCode, linetable::Vector{Core.LineInfoNode}, state::Core.Compiler.InliningState{Core.Compiler.EdgeTracker, Core.Compiler.WorldView{Core.Compiler.InternalCodeCache}, Core.Compiler.NativeInterpreter}, propagate_inbounds::Bool) at inlining.jl:77", + "id": 424 + }, + { "loc": "jl_toplevel_eval_flex at toplevel.c:691", "id": 21 }, + { "loc": "jl_generate_fptr_impl at jitlayers.cpp:325", "id": 208 }, + { "loc": "jl_decode_value at ircode.c:611", "id": 243 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:93", + "id": 261 + }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:441", + "id": 396 + }, + { + "loc": "repl_backend_loop(backend::REPL.REPLBackend) at REPL.jl:245", + "id": 35 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:571", + "id": 408 + }, + { + "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool, withfirst::Bool) at inferenceresult.jl:98", + "id": 219 + }, + { "loc": "BasicBlock at basicblock.jl:25 [inlined]", "id": 319 }, + { + "loc": "run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool) at client.jl:388", + "id": 45 + }, + { + "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:643", + "id": 429 + }, + { "loc": "jl_mt_assoc_by_type at gf.c:1197", "id": 180 }, + { + "loc": "sprint(::Function, ::Vector{SubString{String}}, ::Vararg{Any}; context::Nothing, sizehint::Int64) at io.jl:108", + "id": 77 + }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:132", + "id": 281 + }, + { + "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:193", + "id": 329 + }, + { "loc": "similar at abstractarray.jl:789 [inlined]", "id": 363 }, + { + "loc": "matching_cache_argtypes(linfo::Core.MethodInstance, #unused#::Nothing, va_override::Bool) at inferenceresult.jl:199", + "id": 232 + }, + { + "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1047", + "id": 439 + }, + { "loc": "_array_for at array.jl:673 [inlined]", "id": 90 }, + { "loc": "env_project_file(env::String) at loading.jl:390", "id": 144 }, + { "loc": "ijl_eqtable_put at iddict.c:147", "id": 204 }, + { "loc": "IRCode at ir.jl:288 [inlined]", "id": 326 }, + { "loc": "similar at abstractarray.jl:800 [inlined]", "id": 311 }, + { "loc": "_replace at util.jl:662 [inlined]", "id": 118 }, + { "loc": "copy_exprargs(x::Vector{Any}) at expr.jl:64", "id": 298 }, + { "loc": "Set at set.jl:11 [inlined]", "id": 141 }, + { + "loc": "typeinf_ext_toplevel(mi::Core.MethodInstance, world::UInt64) at typeinfer.jl:941", + "id": 213 + }, + { "loc": "ijl_uncompress_ir at ircode.c:810", "id": 240 }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:613", + "id": 371 + }, + { + "loc": "scan_slot_def_use(nargs::Int64, ci::Core.CodeInfo, code::Vector{Any}) at slot2ssa.jl:40", + "id": 365 + }, + { + "loc": "match(re::Regex, str::String, idx::Int64, add_opts::UInt32) at regex.jl:396", + "id": 99 + }, + { "loc": "splitdir at path.jl:132 [inlined]", "id": 96 }, + { "loc": "copy! at domtree.jl:104 [inlined]", "id": 343 }, + { + "loc": "sptypes_from_meth_instance(linfo::Core.MethodInstance) at inferencestate.jl:265", + "id": 254 + }, + { "loc": "ijl_specializations_get_linfo at gf.c:176", "id": 199 }, + { "loc": "stupdate! at typelattice.jl:396 [inlined]", "id": 284 }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:682", + "id": 376 + }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:79", + "id": 255 + }, + { "loc": "jl_table_assign_bp at iddict.c:41", "id": 203 }, + { "loc": "ijl_toplevel_eval at toplevel.c:897 [inlined]", "id": 31 }, + { "loc": "ijl_get_nth_field at datatype.c:1427", "id": 101 }, + { + "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:196", + "id": 331 + }, + { "loc": "_start() at sys.dylib:?", "id": 48 }, + { + "loc": "run_repl(repl::REPL.AbstractREPL, consumer::Any) at REPL.jl:354", + "id": 38 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:612", + "id": 412 + }, + { "loc": "_new_array_ at array.c:127", "id": 4 }, + { "loc": "isfile_casesensitive(path::String) at loading.jl:51", "id": 109 }, + { "loc": "stat(path::String) at stat.jl:149", "id": 82 }, + { "loc": "ijl_string_to_array at array.c:288", "id": 72 }, + { "loc": "identify_package(name::String) at loading.jl:297", "id": 146 }, + { "loc": "update_domtree! at domtree.jl:218 [inlined]", "id": 354 }, + { "loc": "jl_typemap_alloc at typemap.c:1276", "id": 201 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:110", + "id": 276 + }, + { + "loc": "finish(compact::Core.Compiler.IncrementalCompact) at ir.jl:1438", + "id": 422 + }, + { "loc": "string at intfuncs.jl:787 [inlined]", "id": 116 }, + { + "loc": "typeinf_nocycle(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at abstractinterpretation.jl:2128", + "id": 286 + }, + { + "loc": "type_annotate!(sv::Core.Compiler.InferenceState, run_optimizer::Bool) at typeinfer.jl:630", + "id": 294 + }, + { + "loc": "match(re::Regex, str::String, idx::Int64, add_opts::UInt32) at regex.jl:393", + "id": 92 + }, + { + "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1095", + "id": 442 + }, + { "loc": "eval_body at interpreter.c:560", "id": 22 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:248", + "id": 236 + }, + { + "loc": "(::Base.var\"#933#935\"{Bool, Bool, Bool})(REPL::Module) at client.jl:403", + "id": 40 + }, + { + "loc": "project_file_name_uuid(project_file::String, name::String) at loading.jl:468", + "id": 169 + }, + { + "loc": "getindex(#unused#::Type{Any}, vals::Any) at array.jl:417", + "id": 226 + }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:496", + "id": 321 + }, + { + "loc": "replace(str::String, pat_repl::Pair{Char, UInt32}; count::Int64) at util.jl:704", + "id": 119 + }, + { "loc": "call_require at toplevel.c:428 [inlined]", "id": 19 }, + { "loc": "ijl_new_struct_uninit at datatype.c:1348", "id": 246 }, + { + "loc": "construct_domtree(blocks::Vector{Core.Compiler.BasicBlock}) at domtree.jl:204", + "id": 334 + }, + { "loc": "DomTree at domtree.jl:200 [inlined]", "id": 333 }, + { + "loc": "dec(x::UInt32, pad::Int64, neg::Bool) at intfuncs.jl:703", + "id": 114 + }, + { + "loc": "implicit_project_deps_get(dir::String, name::String) at loading.jl:682", + "id": 160 + }, + { + "loc": "update_level!(nodes::Vector{Core.Compiler.DomTreeNode}, node::Int64, level::Int64) at domtree.jl:236", + "id": 357 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:612", + "id": 370 + }, + { "loc": "require(into::Module, mod::Symbol) at sys.dylib:?", "id": 15 }, + { "loc": "jl_repl_entrypoint at jlapi.c:706", "id": 50 }, + { + "loc": "_splitdir_nodrive(a::String, b::String) at path.jl:143", + "id": 107 + }, + { "loc": "eval_body at interpreter.c:0", "id": 184 }, + { "loc": "ijl_toplevel_eval_in at toplevel.c:947", "id": 32 }, + { + "loc": "scan_slot_def_use(nargs::Int64, ci::Core.CodeInfo, code::Vector{Any}) at slot2ssa.jl:38", + "id": 359 + }, + { "loc": "_collect at array.jl:646 [inlined]", "id": 253 }, + { "loc": "getindex at tuple.jl:29 [inlined]", "id": 104 }, + { "loc": "jl_decode_value_expr at ircode.c:496 [inlined]", "id": 242 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:432", + "id": 444 + }, + { "loc": "jl_exprn at builtins.c:1281", "id": 241 }, + { "loc": "resize! at array.jl:1233 [inlined]", "id": 339 }, + { + "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:533", + "id": 164 + }, + { "loc": "invokelatest at essentials.jl:729 [inlined]", "id": 44 }, + { "loc": "getindex at array.jl:412 [inlined]", "id": 346 }, + { + "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:818", + "id": 435 + }, + { "loc": "ijl_alloc_array_1d at array.c:441", "id": 6 }, + { "loc": "Type at iobuffer.jl:112 [inlined]", "id": 76 }, + { "loc": "jl_new_array_for_deserialization at array.c:199", "id": 238 }, + { "loc": "eval_import_path at toplevel.c:465", "id": 20 }, + { "loc": "_similar_for at array.jl:665 [inlined]", "id": 313 }, + { + "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:191", + "id": 324 + }, + { "loc": "update_domtree! at domtree.jl:217 [inlined]", "id": 349 }, + { + "loc": "typeinf_local(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at abstractinterpretation.jl:2070", + "id": 285 + }, + { + "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1064", + "id": 440 + }, + { + "loc": "finish(me::Core.Compiler.InferenceState, interp::Core.Compiler.NativeInterpreter) at typeinfer.jl:428", + "id": 292 + }, + { "loc": "macro expansion at loading.jl:399 [inlined]", "id": 158 }, + { "loc": "jl_alloc_int_1d at smallintset.c:80 [inlined]", "id": 196 }, + { + "loc": "Core.Compiler.BitSet(itr::Core.Compiler.UnitRange{Int64}) at bitset.jl:29", + "id": 378 + }, + { "loc": "load_path_expand(env::String) at initdefs.jl:262", "id": 123 }, + { "loc": "unsafe_wrap at string.jl:85 [inlined]", "id": 73 }, + { "loc": "copy! at domtree.jl:102 [inlined]", "id": 341 }, + { + "loc": "copy!(dst::Vector{Core.Compiler.DomTreeNode}, src::Vector{Core.Compiler.DomTreeNode}) at abstractarray.jl:877", + "id": 356 + }, + { + "loc": "cache_result!(interp::Core.Compiler.NativeInterpreter, result::Core.Compiler.InferenceResult) at typeinfer.jl:393", + "id": 452 + }, + { "loc": "BitSet at bitset.jl:18 [inlined]", "id": 265 }, + { + "loc": "ssa_inlining_pass!(ir::Core.Compiler.IRCode, linetable::Vector{Core.LineInfoNode}, state::Core.Compiler.InliningState{Core.Compiler.EdgeTracker, Core.Compiler.WorldView{Core.Compiler.InternalCodeCache}, Core.Compiler.NativeInterpreter}, propagate_inbounds::Bool) at sys.dylib:?", + "id": 425 + }, + { + "loc": "string(n::UInt32; base::Int64, pad::Int64) at intfuncs.jl:796", + "id": 115 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:672", + "id": 374 + }, + { + "loc": "DFS!(D::Core.Compiler.DFSTree, blocks::Vector{Core.Compiler.BasicBlock}) at domtree.jl:114", + "id": 347 + }, + { "loc": "ijl_take_buffer at sys.c:484", "id": 448 }, + { + "loc": "entry_point_and_project_file_inside at loading.jl:517 [inlined]", + "id": 163 + }, + { "loc": "jl_type_infer at gf.c:295", "id": 215 }, + { "loc": "Array at baseext.jl:36 [inlined]", "id": 79 }, + { "loc": "smallintset_rehash at smallintset.c:173", "id": 197 }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:570", + "id": 403 + }, + { "loc": "isfile at stat.jl:456 [inlined]", "id": 85 }, + { "loc": "ijl_specializations_get_linfo at gf.c:151", "id": 191 }, + { "loc": "take!(io::IOBuffer) at iobuffer.jl:396", "id": 120 }, + { + "loc": "replace(str::String, pat_repl::Pair{Char, UInt32}; count::Int64) at util.jl:694", + "id": 111 + }, + { + "loc": "entry_point_and_project_file_inside at loading.jl:518 [inlined]", + "id": 165 + }, + { + "loc": "_collect(#unused#::Type{SubString{String}}, itr::Base.SplitIterator{String, Regex}, isz::Base.SizeUnknown) at array.jl:649", + "id": 51 + }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:424", + "id": 336 + }, + { "loc": "load_path_expand(env::String) at initdefs.jl:256", "id": 122 }, + { "loc": "load_path_expand(env::String) at initdefs.jl:265", "id": 126 }, + { "loc": "slot2reg at optimize.jl:523 [inlined]", "id": 360 }, + { "loc": "zeros at array.jl:585 [inlined]", "id": 80 }, + { "loc": "_new_array at array.c:193", "id": 5 }, + { "loc": "collect at array.jl:709 [inlined]", "id": 315 }, + { "loc": "ml_matches at gf.c:3154", "id": 193 }, + { + "loc": "entry_point_and_project_file_inside at loading.jl:520 [inlined]", + "id": 166 + }, + { + "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:192", + "id": 328 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:615", + "id": 373 + }, + { "loc": "similar at abstractarray.jl:835 [inlined]", "id": 88 }, + { "loc": "project_deps_get at loading.jl:420 [inlined]", "id": 157 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:382", + "id": 387 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:815", + "id": 384 + }, + { + "loc": "simple_dce!(compact::Core.Compiler.IncrementalCompact, callback::Function) at ir.jl:1411", + "id": 417 + }, + { + "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:668", + "id": 433 + }, + { + "loc": "implicit_project_deps_get(dir::String, name::String) at loading.jl:687", + "id": 170 + }, + { "loc": "match at regex.jl:402 [inlined]", "id": 94 }, + { "loc": "jl_lookup_generic_ at gf.c:2422 [inlined]", "id": 181 }, + { "loc": "Dict{Any, Nothing}() at dict.jl:90", "id": 129 }, + { "loc": "similar at abstractarray.jl:791 [inlined]", "id": 312 }, + { + "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:343", + "id": 352 + }, + { "loc": "load_path_expand(env::String) at initdefs.jl:252", "id": 59 }, + { "loc": "simple_dce! at ir.jl:1411 [inlined]", "id": 418 }, + { + "loc": "(::Base.var\"#861#862\"{String, Base.TOMLCache})() at loading.jl:257", + "id": 152 + }, + { + "loc": "start_repl_backend(backend::REPL.REPLBackend, consumer::Any) at REPL.jl:230", + "id": 36 + }, + { "loc": "ijl_apply_generic at gf.c:2447", "id": 182 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:433", + "id": 445 + }, + { "loc": "ijl_new_bits at datatype.c:808", "id": 100 }, + { + "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1045", + "id": 436 + }, + { + "loc": "type_lift_pass!(ir::Core.Compiler.IRCode) at passes.jl:1099", + "id": 443 + }, + { + "loc": "compute_domtree_nodes!(domtree::Core.Compiler.DomTree) at domtree.jl:231", + "id": 358 + }, + { "loc": "my_sortperm(v::Vector{Int64}) at ir.jl:533", "id": 407 }, + { "loc": "jl_system_image_data at sys.dylib:?", "id": 28 }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:280", + "id": 453 + }, + { "loc": "exec_options(opts::Base.JLOptions) at client.jl:318", "id": 46 }, + { + "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:534", + "id": 168 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:814", + "id": 383 + }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:427", + "id": 426 + }, + { "loc": "setdiff at abstractset.jl:209 [inlined]", "id": 382 }, + { "loc": "load_path_expand(env::String) at initdefs.jl:272", "id": 57 }, + { + "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:86", + "id": 316 + }, + { "loc": "ijl_uncompress_ir at ircode.c:802", "id": 237 }, + { "loc": "Array at boot.jl:466 [inlined]", "id": 323 }, + { "loc": "Dict{String, Union{Bool, String}}() at dict.jl:90", "id": 136 }, + { "loc": "jl_f_getfield at builtins.c:890", "id": 103 }, + { "loc": "ijl_uncompress_ir at ircode.c:792", "id": 234 }, + { + "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:423", + "id": 300 + }, + { "loc": "ip:0xbc42", "id": 26 }, + { "loc": "do_call at interpreter.c:126", "id": 183 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:117", + "id": 279 + }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:501", + "id": 400 + }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:83", + "id": 258 + }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:441", + "id": 299 + }, + { + "loc": "_collect(#unused#::Type{Int64}, itr::Core.Compiler.Generator{Core.Compiler.Iterators.Filter{Core.Compiler.var\"#361#368\"{Core.Compiler.IdDict{Int64, Int64}}, Vector{Int64}}, Core.Compiler.var\"#360#367\"{Int64, Core.Compiler.IdDict{Int64, Int64}, Vector{Int64}}}, isz::Core.Compiler.SizeUnknown) at array.jl:649", + "id": 397 + }, + { + "loc": "eval_user_input(ast::Any, backend::REPL.REPLBackend) at REPL.jl:151", + "id": 34 + }, + { "loc": "CodeInstance at boot.jl:421 [inlined]", "id": 455 }, + { "loc": "convert at set.jl:442 [inlined]", "id": 142 }, + { "loc": "sprint at io.jl:108 [inlined]", "id": 69 }, + { "loc": "falses at bitarray.jl:403 [inlined]", "id": 231 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:86", + "id": 259 + }, + { "loc": "make_method_match at gf.c:2639 [inlined]", "id": 175 }, + { + "loc": "lock(f::Base.var\"#861#862\"{String, Base.TOMLCache}, l::ReentrantLock) at lock.jl:183", + "id": 153 + }, + { + "loc": "replace(str::String, pat_repl::Pair{Char, UInt32}; count::Int64) at util.jl:730", + "id": 121 + }, + { + "loc": "matching_cache_argtypes(linfo::Core.MethodInstance, #unused#::Nothing, va_override::Bool) at inferenceresult.jl:197", + "id": 222 + }, + { "loc": "ip:0xc442", "id": 185 }, + { "loc": "macro expansion at loading.jl:989 [inlined]", "id": 12 }, + { "loc": "jl_array_grow_at_end at array.c:911", "id": 63 }, + { "loc": "BitArray at bitarray.jl:71 [inlined]", "id": 229 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:82", + "id": 257 + }, + { "loc": "similar at abstractarray.jl:834 [inlined]", "id": 89 }, + { + "loc": "Dict{String, Union{Bool, String}}(kv::Dict{Any, Any}) at dict.jl:101", + "id": 137 + }, + { + "loc": "copy!(dst::Vector{Int64}, src::Vector{Int64}) at abstractarray.jl:877", + "id": 340 + }, + { "loc": "convert at abstractdict.jl:559 [inlined]", "id": 134 }, + { "loc": "jl_typemap_intersection_node_visitor at typemap.c:0", "id": 177 }, + { "loc": "ijl_uncompress_ir at ircode.c:816", "id": 250 }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:383", + "id": 389 + }, + { "loc": "require(into::Module, mod::Symbol) at loading.jl:988", "id": 14 }, + { + "loc": "Dict{String, Union{Nothing, String}}() at dict.jl:90", + "id": 138 + }, + { + "loc": "(::Base.var\"#933#935\"{Bool, Bool, Bool})(REPL::Module) at sys.dylib:?", + "id": 41 + }, + { "loc": "jl_get_specialized at method.c:609", "id": 190 }, + { "loc": "copy! at domtree.jl:103 [inlined]", "id": 342 }, + { "loc": "normpath(path::String) at path.jl:375", "id": 55 }, + { "loc": "jl_decode_value_array at ircode.c:434", "id": 239 }, + { + "loc": "getindex(#unused#::Type{Any}, vals::Any) at sys.dylib:?", + "id": 217 + }, + { "loc": "ijl_get_nth_field_checked at datatype.c:1443", "id": 102 }, + { + "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:645", + "id": 431 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:907", + "id": 388 + }, + { + "loc": "Core.Compiler.DFSTree(n_blocks::Int64) at domtree.jl:88", + "id": 332 + }, + { "loc": "fill at array.jl:533 [inlined]", "id": 270 }, + { "loc": "_growend! at array.jl:1008 [inlined]", "id": 64 }, + { "loc": "jl_type_infer at gf.c:277", "id": 207 }, + { "loc": "jl_decode_value at ircode.c:0", "id": 247 }, + { "loc": "falses(dims::Tuple{Int64}) at bitarray.jl:405", "id": 230 }, + { + "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:251", + "id": 256 + }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:602", + "id": 369 + }, + { "loc": "isdir at stat.jl:456 [inlined]", "id": 83 }, + { + "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1077", + "id": 441 + }, + { "loc": "Set at set.jl:12 [inlined]", "id": 131 }, + { + "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool) at inferenceresult.jl:97", + "id": 220 + }, + { "loc": "jl_f__call_latest at builtins.c:757", "id": 42 }, + { "loc": "ml_matches at gf.c:2784", "id": 178 }, + { "loc": "#split#422 at util.jl:593 [inlined]", "id": 53 }, + { "loc": "CachedMethodTable at methodtable.jl:52 [inlined]", "id": 280 }, + { "loc": "NewNodeStream at ir.jl:269 [inlined]", "id": 325 }, + { + "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:594", + "id": 367 + }, + { "loc": "ijl_compress_ir at ircode.c:760", "id": 449 }, + { + "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:244", + "id": 297 + }, + { "loc": "IncrementalCompact at ir.jl:570 [inlined]", "id": 428 }, + { "loc": "jl_interpret_toplevel_thunk at interpreter.c:739", "id": 24 }, + { + "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1046", + "id": 438 + }, + { "loc": "macro expansion at loading.jl:396 [inlined]", "id": 143 }, + { "loc": "retrieve_code_info at utilities.jl:128 [inlined]", "id": 235 }, + { + "loc": "ijl_new_method_instance_uninit at method.c:413 [inlined]", + "id": 189 + }, + { + "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:432", + "id": 394 + }, + { + "loc": "maybe_compress_codeinfo(interp::Core.Compiler.NativeInterpreter, linfo::Core.MethodInstance, ci::Core.CodeInfo) at typeinfer.jl:348", + "id": 450 + }, + { + "loc": "active_project(search_load_path::Bool) at initdefs.jl:293", + "id": 58 + }, + { + "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:613", + "id": 413 + }, + { "loc": "slot2reg at optimize.jl:524 [inlined]", "id": 368 }, + { + "loc": "sprint(::Function, ::Vector{SubString{String}}, ::Vararg{Any}; context::Nothing, sizehint::Int64) at io.jl:107", + "id": 68 + }, + { + "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:490", + "id": 307 + }, + { + "loc": "typeinf_ext(interp::Core.Compiler.NativeInterpreter, mi::Core.MethodInstance) at typeinfer.jl:912", + "id": 289 + }, + { "loc": "copy_exprs(x::Any) at expr.jl:42", "id": 304 }, + { "loc": "Array at boot.jl:461 [inlined]", "id": 78 }, + { "loc": "ijl_specializations_get_linfo at gf.c:155", "id": 195 }, + { "loc": "isfile_casesensitive(path::String) at loading.jl:48", "id": 98 } + ], + "types": [ + { "name": "Vector{Union{Nothing, Vector{Any}}}", "id": 29 }, + { "name": "Vector{Tuple{Int64, Int64, Bool}}", "id": 41 }, + { "name": "Vector{Union{Nothing, String}}", "id": 12 }, + { "name": "Tuple{Vector{SubString{String}}, String}", "id": 3 }, + { "name": "Core.Compiler.EdgeTracker", "id": 50 }, + { "name": "Core.ReturnNode", "id": 24 }, + { "name": "Vector{Core.Compiler.DomTreeNode}", "id": 40 }, + { "name": "Vector{UInt64}", "id": 21 }, + { "name": "Core.MethodInstance", "id": 15 }, + { "name": "Vector{Core.Compiler.InferenceResult}", "id": 19 }, + { "name": "Vector{Core.Compiler.InferenceState}", "id": 33 }, + { "name": "Vector{Core.Compiler.SNCAData}", "id": 39 }, + { "name": "Vector{Vector{Int64}}", "id": 44 }, + { "name": "Vector{Bool}", "id": 34 }, + { "name": "Vector{Base.UUID}", "id": 10 }, + { "name": "Vector{Core.Compiler.NewNodeInfo}", "id": 38 }, + { + "name": "Vector{Pair{Core.Compiler.NewSSAValue, Core.PhiNode}}", + "id": 46 + }, + { + "name": "Vector{Union{Nothing, Vector{Core.Compiler.VarState}}}", + "id": 28 + }, + { "name": "Vector{Core.SSAValue}", "id": 47 }, + { "name": "Vector{Union{Nothing, SubString{String}}}", "id": 5 }, + { "name": "Core.TypeMapEntry", "id": 17 }, + { "name": "Vector{Union{Bool, String}}", "id": 11 }, + { "name": "Core.SimpleVector", "id": 16 }, + { "name": "Vector{Core.Compiler.BasicBlock}", "id": 36 }, + { + "name": "Vector{Vector{Pair{Core.Compiler.NewSSAValue, Core.PhiNode}}}", + "id": 45 + }, + { "name": "Core.LineInfoNode", "id": 25 }, + { "name": "Vector{Tuple{Int64, Int64}}", "id": 42 }, + { "name": "Core.CodeInfo", "id": 22 }, + { "name": "Vector{Pair{Int64, Any}}", "id": 49 }, + { "name": "Vector{Symbol}", "id": 26 }, + { "name": "Vector{Tuple{Core.Compiler.InferenceState, Int64}}", "id": 32 }, + { "name": "Vector{SubString{String}}", "id": 1 }, + { "name": "UInt64", "id": 18 }, + { "name": "Tuple{String, String}", "id": 13 }, + { "name": "Vector{Core.Compiler.VarState}", "id": 30 }, + { "name": "Vector{Tuple{Int64, Int64, Vector{Any}}}", "id": 48 }, + { "name": "Vector{Core.Compiler.BitSet}", "id": 31 }, + { "name": "Vector{String}", "id": 0 }, + { "name": "Core.CodeInstance", "id": 51 }, + { "name": "Vector{Nothing}", "id": 9 }, + { "name": "SubString{String}", "id": 7 }, + { "name": "Vector{UInt8}", "id": 4 }, + { "name": "Expr", "id": 23 }, + { "name": "Core.MethodMatch", "id": 14 }, + { "name": "Vector{Any}", "id": 8 }, + { "name": "Nothing", "id": 2 }, + { "name": "Tuple{DataType}", "id": 20 }, + { "name": "Vector{Core.LineInfoNode}", "id": 37 }, + { "name": "Vector{Core.Compiler.SlotInfo}", "id": 43 }, + { "name": "Vector{Int64}", "id": 6 }, + { "name": "Vector{Int32}", "id": 27 }, + { + "name": "Vector{Tuple{Core.Compiler.InferenceResult, Vector{Any}, Bool}}", + "id": 35 + } + ] +} From 976d2bc512f540d4ca3f3a71005a7a542777202a Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 17 Dec 2021 21:48:28 -0500 Subject: [PATCH 031/107] remove gc.preserve --- stdlib/AllocProfile/src/AllocProfile.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 4c1c943629225..a0545255b4add 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -43,7 +43,7 @@ end function stop() raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - decoded_results = GC.@preserve raw_results decode(raw_results) + decoded_results = decode(raw_results) return decoded_results end From e1b22217738410aa30dec5d7d67a2a232062ce97 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 17 Dec 2021 21:54:24 -0500 Subject: [PATCH 032/107] add top level `profile` function --- stdlib/AllocProfile/src/AllocProfile.jl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index a0545255b4add..b41c7bc3211aa 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -51,6 +51,16 @@ function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) end +# top-level entry point +# TODO: should probably be a macro instead of a +# higher-order function +function profile(f::Function, skip_every::Int=0) + start(skip_every) + res = f() + profile = stop() + return res, profile +end + # decoded results struct Alloc From 03a01023aabb91bd66e8b09b7e27129d951f2bd1 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 17 Dec 2021 22:02:56 -0500 Subject: [PATCH 033/107] clear after decoding --- stdlib/AllocProfile/src/AllocProfile.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index b41c7bc3211aa..11eaa57424ef8 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -58,6 +58,7 @@ function profile(f::Function, skip_every::Int=0) start(skip_every) res = f() profile = stop() + clear() return res, profile end From 7975c77beaf67aed49ab0edc85d00ea0a462a28c Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 17 Dec 2021 22:50:48 -0500 Subject: [PATCH 034/107] free memory allocated for results --- src/gc-alloc-profiler.cpp | 19 ++++++++++++++----- src/gc-alloc-profiler.h | 2 +- stdlib/AllocProfile/src/AllocProfile.jl | 3 ++- stdlib/AllocProfile/test/runtests.jl | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index ee3f11d20b06f..eff7a2144595f 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -38,6 +38,7 @@ struct AllocProfile { // == global variables manipulated by callbacks == AllocProfile g_alloc_profile; +RawAllocResults *g_alloc_profile_results = nullptr; int g_alloc_profile_enabled = false; // === stack stuff === @@ -63,25 +64,27 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { extern "C" { // Needed since the function doesn't take any arguments. -JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { +JL_DLLEXPORT struct RawAllocResults* jl_stop_alloc_profile() { g_alloc_profile_enabled = false; - auto results = RawAllocResults{ + auto results = new RawAllocResults{ g_alloc_profile.allocs.data(), g_alloc_profile.allocs.size() }; // package up frees - results.num_frees = g_alloc_profile.frees_by_type_address.size(); - results.frees = (FreeInfo*) malloc(sizeof(FreeInfo) * results.num_frees); + results->num_frees = g_alloc_profile.frees_by_type_address.size(); + results->frees = (FreeInfo*) malloc(sizeof(FreeInfo) * results->num_frees); int j = 0; for (auto type_addr_free_count : g_alloc_profile.frees_by_type_address) { - results.frees[j++] = FreeInfo{ + results->frees[j++] = FreeInfo{ type_addr_free_count.first, type_addr_free_count.second }; } + g_alloc_profile_results = results; + return results; } @@ -93,6 +96,12 @@ JL_DLLEXPORT void jl_free_alloc_profile() { free(alloc.backtrace.data); } g_alloc_profile.allocs.clear(); + + if (g_alloc_profile_results != nullptr) { + free(g_alloc_profile_results->frees); + // free the results? + g_alloc_profile_results = nullptr; + } } } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index dab52c1ecd753..52d932226596b 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -34,7 +34,7 @@ void _report_gc_finished( uint64_t pause, uint64_t freed, uint64_t allocd, int full, int recollect ) JL_NOTSAFEPOINT; JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); -JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); +JL_DLLEXPORT struct RawAllocResults *jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 11eaa57424ef8..0bedd30f31aa7 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -42,7 +42,8 @@ function start(skip_every::Int=0) end function stop() - raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) + raw_results_ptr = ccall(:jl_stop_alloc_profile, Ptr{RawAllocResults}, ()) + raw_results = unsafe_load(raw_results_ptr) decoded_results = decode(raw_results) return decoded_results end diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index 0285a131a6858..c916df2edb9ab 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -12,6 +12,7 @@ using AllocProfile using Base64 results = AllocProfile.stop() + AllocProfile.clear() @test length(results.allocs) > 0 first_alloc = results.allocs[1] From 2c84bb9dd862e68a0d7e7866bfb051381d8f7619 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Sat, 18 Dec 2021 11:58:31 -0500 Subject: [PATCH 035/107] first hack at multithreaded profiler --- src/gc-alloc-profiler.cpp | 89 +++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 32 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index eff7a2144595f..8b5f43d0136c1 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -24,9 +24,7 @@ struct RawAlloc { size_t size; }; -struct AllocProfile { - int skip_every; - +struct PerThreadAllocProfile { vector allocs; unordered_map type_address_by_value_address; unordered_map frees_by_type_address; @@ -35,6 +33,12 @@ struct AllocProfile { size_t last_recorded_alloc; }; +struct AllocProfile { + int skip_every; + + vector per_thread_profiles; +}; + // == global variables manipulated by callbacks == AllocProfile g_alloc_profile; @@ -58,8 +62,13 @@ RawBacktrace get_raw_backtrace() { // == exported interface == JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { - g_alloc_profile_enabled = true; g_alloc_profile = AllocProfile{skip_every}; + + for (int i = 0; i < jl_n_threads; i++) { + g_alloc_profile.per_thread_profiles.push_back(PerThreadAllocProfile{}); + } + + g_alloc_profile_enabled = true; } extern "C" { // Needed since the function doesn't take any arguments. @@ -67,39 +76,50 @@ extern "C" { // Needed since the function doesn't take any arguments. JL_DLLEXPORT struct RawAllocResults* jl_stop_alloc_profile() { g_alloc_profile_enabled = false; - auto results = new RawAllocResults{ - g_alloc_profile.allocs.data(), - g_alloc_profile.allocs.size() - }; + // combine allocs + vector combined_allocs; + for (auto profile : g_alloc_profile.per_thread_profiles) { + for (auto alloc : profile.allocs) { + combined_allocs.push_back(alloc); + } + } // package up frees - results->num_frees = g_alloc_profile.frees_by_type_address.size(); - results->frees = (FreeInfo*) malloc(sizeof(FreeInfo) * results->num_frees); - int j = 0; - for (auto type_addr_free_count : g_alloc_profile.frees_by_type_address) { - results->frees[j++] = FreeInfo{ - type_addr_free_count.first, - type_addr_free_count.second - }; + vector combined_frees; + for (auto profile : g_alloc_profile.per_thread_profiles) { + for (auto free_info : profile.frees_by_type_address) { + combined_frees.push_back(FreeInfo{ + free_info.first, + free_info.second + }); + } } + auto results = new RawAllocResults{ + combined_allocs.data(), + combined_allocs.size(), + combined_frees.data(), + combined_frees.size() + }; + g_alloc_profile_results = results; return results; } JL_DLLEXPORT void jl_free_alloc_profile() { - g_alloc_profile.frees_by_type_address.clear(); - g_alloc_profile.type_address_by_value_address.clear(); - g_alloc_profile.alloc_counter = 0; - for (auto alloc : g_alloc_profile.allocs) { - free(alloc.backtrace.data); + for (auto profile : g_alloc_profile.per_thread_profiles) { + profile.frees_by_type_address.clear(); + profile.type_address_by_value_address.clear(); + profile.alloc_counter = 0; + for (auto alloc : profile.allocs) { + free(alloc.backtrace.data); + } + profile.allocs.clear(); } - g_alloc_profile.allocs.clear(); if (g_alloc_profile_results != nullptr) { - free(g_alloc_profile_results->frees); - // free the results? + // TODO: does this call its destructors? g_alloc_profile_results = nullptr; } } @@ -109,10 +129,13 @@ JL_DLLEXPORT void jl_free_alloc_profile() { // == callbacks called into by the outside == void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { - auto& profile = g_alloc_profile; + auto& global_profile = g_alloc_profile; + + auto profile = global_profile.per_thread_profiles[jl_threadid()]; + profile.alloc_counter++; auto diff = profile.alloc_counter - profile.last_recorded_alloc; - if (diff < profile.skip_every) { + if (diff < g_alloc_profile.skip_every) { return; } profile.last_recorded_alloc = profile.alloc_counter; @@ -131,17 +154,19 @@ void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { jl_value_t *val = jl_valueof(tagged_val); + auto profile = g_alloc_profile.per_thread_profiles[jl_threadid()]; + auto value_address = (size_t)val; - auto type_address = g_alloc_profile.type_address_by_value_address.find(value_address); - if (type_address == g_alloc_profile.type_address_by_value_address.end()) { + auto type_address = profile.type_address_by_value_address.find(value_address); + if (type_address == profile.type_address_by_value_address.end()) { return; // TODO: warn } - auto frees = g_alloc_profile.frees_by_type_address.find(type_address->second); + auto frees = profile.frees_by_type_address.find(type_address->second); - if (frees == g_alloc_profile.frees_by_type_address.end()) { - g_alloc_profile.frees_by_type_address[type_address->second] = 1; + if (frees == profile.frees_by_type_address.end()) { + profile.frees_by_type_address[type_address->second] = 1; } else { - g_alloc_profile.frees_by_type_address[type_address->second] = frees->second + 1; + profile.frees_by_type_address[type_address->second] = frees->second + 1; } } From b49606d6cd9fcce9ba83a30bc2bb552b772c225d Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Sat, 18 Dec 2021 12:21:35 -0500 Subject: [PATCH 036/107] tweaks --- src/gc-alloc-profiler.cpp | 9 +++------ stdlib/AllocProfile/src/AllocProfile.jl | 14 ++++++++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 8b5f43d0136c1..cb8103e7a2ebe 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -109,14 +109,11 @@ JL_DLLEXPORT struct RawAllocResults* jl_stop_alloc_profile() { JL_DLLEXPORT void jl_free_alloc_profile() { for (auto profile : g_alloc_profile.per_thread_profiles) { - profile.frees_by_type_address.clear(); - profile.type_address_by_value_address.clear(); - profile.alloc_counter = 0; for (auto alloc : profile.allocs) { free(alloc.backtrace.data); } - profile.allocs.clear(); } + g_alloc_profile.per_thread_profiles.clear(); if (g_alloc_profile_results != nullptr) { // TODO: does this call its destructors? @@ -131,7 +128,7 @@ JL_DLLEXPORT void jl_free_alloc_profile() { void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { auto& global_profile = g_alloc_profile; - auto profile = global_profile.per_thread_profiles[jl_threadid()]; + auto& profile = global_profile.per_thread_profiles[jl_threadid()]; profile.alloc_counter++; auto diff = profile.alloc_counter - profile.last_recorded_alloc; @@ -154,7 +151,7 @@ void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { jl_value_t *val = jl_valueof(tagged_val); - auto profile = g_alloc_profile.per_thread_profiles[jl_threadid()]; + auto& profile = g_alloc_profile.per_thread_profiles[jl_threadid()]; auto value_address = (size_t)val; auto type_address = profile.type_address_by_value_address.find(value_address); diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 0bedd30f31aa7..dff9aa0441f68 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -66,7 +66,7 @@ end # decoded results struct Alloc - type::Type + type::Any stacktrace::StackTrace size::Int end @@ -85,13 +85,15 @@ const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} # loading anything below this seems to segfault # TODO: find out what's going on -TYPE_PTR_THRESHOLD = 0x0000000100000000 +TYPE_PTR_LOW_THRESHOLD = 0x0000000100000000 +TYPE_PTR_HIGH_THRESHOLD = 100000000000000 -function load_type(ptr::Ptr{Type})::Type - if UInt(ptr) < TYPE_PTR_THRESHOLD - return Missing +function load_type(ptr::Ptr{Type}) + # println("type: $(UInt(ptr))") + if TYPE_PTR_LOW_THRESHOLD < UInt(ptr) < TYPE_PTR_HIGH_THRESHOLD + return unsafe_pointer_to_objref(ptr) end - return unsafe_pointer_to_objref(ptr) + return Missing end function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc From 84745bf7f542ca3ec9ef5d46d3e41b6dd71ee3d2 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 20 Dec 2021 18:27:33 -0500 Subject: [PATCH 037/107] hold onto vectors d'oh --- src/gc-alloc-profiler.cpp | 36 ++++++++++++------------- stdlib/AllocProfile/src/AllocProfile.jl | 15 +++++++---- stdlib/AllocProfile/test/runtests.jl | 2 +- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index cb8103e7a2ebe..3d86acffd2f21 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -39,11 +39,16 @@ struct AllocProfile { vector per_thread_profiles; }; +struct CombinedResults { + vector combined_allocs; + vector combined_frees; +}; + // == global variables manipulated by callbacks == AllocProfile g_alloc_profile; -RawAllocResults *g_alloc_profile_results = nullptr; int g_alloc_profile_enabled = false; +CombinedResults g_combined_results; // will live forever // === stack stuff === @@ -73,38 +78,33 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { extern "C" { // Needed since the function doesn't take any arguments. -JL_DLLEXPORT struct RawAllocResults* jl_stop_alloc_profile() { +JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { g_alloc_profile_enabled = false; // combine allocs - vector combined_allocs; - for (auto profile : g_alloc_profile.per_thread_profiles) { - for (auto alloc : profile.allocs) { - combined_allocs.push_back(alloc); + // TODO: interleave to preserve ordering + for (const auto& profile : g_alloc_profile.per_thread_profiles) { + for (const auto& alloc : profile.allocs) { + g_combined_results.combined_allocs.push_back(alloc); } } // package up frees - vector combined_frees; - for (auto profile : g_alloc_profile.per_thread_profiles) { - for (auto free_info : profile.frees_by_type_address) { - combined_frees.push_back(FreeInfo{ + for (const auto& profile : g_alloc_profile.per_thread_profiles) { + for (const auto& free_info : profile.frees_by_type_address) { + g_combined_results.combined_frees.push_back(FreeInfo{ free_info.first, free_info.second }); } } - auto results = new RawAllocResults{ + return RawAllocResults{ combined_allocs.data(), combined_allocs.size(), combined_frees.data(), combined_frees.size() }; - - g_alloc_profile_results = results; - - return results; } JL_DLLEXPORT void jl_free_alloc_profile() { @@ -115,10 +115,8 @@ JL_DLLEXPORT void jl_free_alloc_profile() { } g_alloc_profile.per_thread_profiles.clear(); - if (g_alloc_profile_results != nullptr) { - // TODO: does this call its destructors? - g_alloc_profile_results = nullptr; - } + g_combined_results.combined_allocs.clear(); + g_combined_results.combined_frees.clear(); } } diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index dff9aa0441f68..2a6bb20a2116e 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -18,11 +18,6 @@ struct RawAlloc size::Csize_t end -struct TypeNamePair - addr::Csize_t - name::Ptr{UInt8} -end - struct FreeInfo type::Ptr{Type} count::UInt @@ -124,11 +119,21 @@ function decode(raw_results::RawAllocResults)::AllocResults ) end +const f = Ref{IOStream}() + +function __init__() + f[] = open("debug.log", "w") +end + function load_backtrace(trace::RawBacktrace)::Vector{Ptr{Cvoid}} + println(f[], "load_backtrace: trace.data: $(trace.data)") + println(f[], "load_backtrace: trace.size: $(trace.size)") out = Vector{Ptr{Cvoid}}() for i in 1:trace.size + println(f[], " $i") push!(out, unsafe_load(trace.data, i)) end + return out end diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index c916df2edb9ab..21140f5cb7b17 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -12,7 +12,7 @@ using AllocProfile using Base64 results = AllocProfile.stop() - AllocProfile.clear() + # AllocProfile.clear() @test length(results.allocs) > 0 first_alloc = results.allocs[1] From a03cfe32b147887b1f526e26a3c71d93d15bf93a Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 20 Dec 2021 18:33:54 -0500 Subject: [PATCH 038/107] fix some compile errors --- src/gc-alloc-profiler.cpp | 8 ++++---- src/gc-alloc-profiler.h | 2 +- stdlib/AllocProfile/src/AllocProfile.jl | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 3d86acffd2f21..1497bc7ff3ed5 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -100,10 +100,10 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { } return RawAllocResults{ - combined_allocs.data(), - combined_allocs.size(), - combined_frees.data(), - combined_frees.size() + g_combined_results.combined_allocs.data(), + g_combined_results.combined_allocs.size(), + g_combined_results.combined_frees.data(), + g_combined_results.combined_frees.size() }; } diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 52d932226596b..dab52c1ecd753 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -34,7 +34,7 @@ void _report_gc_finished( uint64_t pause, uint64_t freed, uint64_t allocd, int full, int recollect ) JL_NOTSAFEPOINT; JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); -JL_DLLEXPORT struct RawAllocResults *jl_stop_alloc_profile(void); +JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 2a6bb20a2116e..3a5e74eca8f8f 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -37,8 +37,7 @@ function start(skip_every::Int=0) end function stop() - raw_results_ptr = ccall(:jl_stop_alloc_profile, Ptr{RawAllocResults}, ()) - raw_results = unsafe_load(raw_results_ptr) + raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) return decoded_results end From 79427cab8716e6ec2f1075a00c8594a1049e4a59 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Mon, 20 Dec 2021 23:13:24 -0500 Subject: [PATCH 039/107] Remove file println debugging --- stdlib/AllocProfile/src/AllocProfile.jl | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 3a5e74eca8f8f..7ec6c3d700a89 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -100,36 +100,29 @@ end function decode(raw_results::RawAllocResults)::AllocResults cache = BacktraceCache() + @info "ALLOCS" allocs = [ decode_alloc(cache, unsafe_load(raw_results.allocs, i)) for i in 1:raw_results.num_allocs ] + @info "FREES" frees = Dict{Type,UInt}() for i in 1:raw_results.num_frees free = unsafe_load(raw_results.frees, i) type = load_type(free.type) frees[type] = free.count end - + return AllocResults( allocs, frees ) end -const f = Ref{IOStream}() - -function __init__() - f[] = open("debug.log", "w") -end - function load_backtrace(trace::RawBacktrace)::Vector{Ptr{Cvoid}} - println(f[], "load_backtrace: trace.data: $(trace.data)") - println(f[], "load_backtrace: trace.size: $(trace.size)") out = Vector{Ptr{Cvoid}}() for i in 1:trace.size - println(f[], " $i") push!(out, unsafe_load(trace.data, i)) end From 9f63529f07350f3138db4ded41eec572c57b83af Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Mon, 20 Dec 2021 23:15:57 -0500 Subject: [PATCH 040/107] Add precompile statements to AllocProfile package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This _drastically_ speeds up the tests, for reasons I don't exactly understand.. I wonder if it was messing up some heuristics and deciding to interpret the code instead of compiling it, and had some weird corneer cases in the interpreted code or something? I dunno! But anyway, this drastically speeds it up, so 🤷 sounds like not our problem 😊 --- stdlib/AllocProfile/src/AllocProfile.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 7ec6c3d700a89..cfd0b45dcdf96 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -151,4 +151,12 @@ function stacktrace_memoized( return stack end +precompile(start, ()) +precompile(stop, ()) + +function __init__() + precompile(start, ()) + precompile(stop, ()) +end + end From 7d12971cc1732569d5e9e862fb4797cb668a2acc Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Mon, 20 Dec 2021 23:21:11 -0500 Subject: [PATCH 041/107] add comment about precompilation --- stdlib/AllocProfile/src/AllocProfile.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index cfd0b45dcdf96..da31d99ee28d6 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -151,10 +151,16 @@ function stacktrace_memoized( return stack end +# Precompile once for the package cache, precompile(start, ()) precompile(stop, ()) function __init__() + # And once when loading the package, to get the full machine code precompiled. + # TOOD: Although actually, we probably don't need this since this package will be + # precompiled into the sysimg, so the top-level statements will be enough to get the + # machine code codegen precompiled as well. :) + # We can delete this function once we make this package a stdlib. precompile(start, ()) precompile(stop, ()) end From a26f3756931ab95f95c3dba56bcf5b2bec3d607c Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Tue, 21 Dec 2021 10:33:24 -0500 Subject: [PATCH 042/107] Malloc right-sized buffers for backtraces. Instead of allocating a maximum-sized buffer for each backtrace, we keep a single max-sized buffer as a scratch space, write the backtrace to it, and then once we know the size, we allocate a right-sized buffer for the backtrace and copy it over. Benchmark results (measured time for profiling allocations on internal Arroyo benchmark, with `skip_every=0`): This only slightly improves the time to record an alloctions profile: - Before: 275.082525 seconds - After: 245.891006 seconds But it drastically improves the memory usage once the profiling is completed, according to System Activity Monitor: - Before: 17.35 GB - After: 6.92 GB - (Compared to 350 MB for the same task without profiling) We could probably slightly improve the time overhead still furthur by using a single big vector instead of a bunch of individual allocated buffers, but this is probably about the best we could do in terms of space usage. This would allow us to eliminate the redundant copying, and would also amortize away the allocations of the buffers, both of which should reduce the performance impact. But I'm guessing the time is mostly dominated by just how long the stack traces are, and there's no getting around that. At best, we could expect maybe like a 2x-3x improvement from those changes, I think. --- src/gc-alloc-profiler.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 1497bc7ff3ed5..8d60124adcf9f 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -53,10 +53,14 @@ CombinedResults g_combined_results; // will live forever // === stack stuff === RawBacktrace get_raw_backtrace() { - jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(JL_MAX_BT_SIZE); + static jl_bt_element_t static_bt_data[JL_MAX_BT_SIZE]; // TODO: tune the number of frames that are skipped - size_t bt_size = rec_backtrace(bt_data, JL_MAX_BT_SIZE, 1); + size_t bt_size = rec_backtrace(static_bt_data, JL_MAX_BT_SIZE, 1); + + size_t bt_bytes = bt_size * sizeof(jl_bt_element_t); + jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(bt_bytes); + memcpy(bt_data, static_bt_data, bt_bytes); return RawBacktrace{ bt_data, From b5ab61185a450f01d082c1a8785d95a7802f72c1 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 21 Dec 2021 11:31:09 -0500 Subject: [PATCH 043/107] test that we get a free --- stdlib/AllocProfile/test/runtests.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index 21140f5cb7b17..0067ff47a2578 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -10,13 +10,17 @@ using AllocProfile # test the allocations during compilation using Base64 + # make sure some frees show up in the profile + GC.gc() results = AllocProfile.stop() - # AllocProfile.clear() + AllocProfile.clear() @test length(results.allocs) > 0 first_alloc = results.allocs[1] @test first_alloc.size > 0 @test length(first_alloc.stacktrace) > 0 @test length(string(first_alloc.type)) > 0 + + @test length(results.frees) > 0 end From d53afa2ae4c7f926f1354b29f749a1f04fdbce51 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 21 Dec 2021 14:53:49 -0500 Subject: [PATCH 044/107] remove GC logging. splitting off into another PR --- src/gc-alloc-profiler.cpp | 17 ----------------- src/gc-alloc-profiler.h | 5 ----- src/gc.c | 2 -- 3 files changed, 24 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 8d60124adcf9f..d23cd5b589032 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -168,20 +168,3 @@ void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { profile.frees_by_type_address[type_address->second] = frees->second + 1; } } - -// TODO: remove these or make them toggle-able. - -void _report_gc_started() JL_NOTSAFEPOINT { - // ... -} - -// TODO: figure out how to pass all of these in as a struct -void _report_gc_finished( - uint64_t pause, uint64_t freed, uint64_t allocd, int full, int recollect -) JL_NOTSAFEPOINT { - // TODO: figure out how to put in commas - jl_safe_printf("GC: pause %fms. collected %fMB. %lld allocs total. %s %s\n", - pause/1e6, freed/1e6, allocd, - full ? "full" : "incr", recollect ? "recollect" : "" - ); -} diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index dab52c1ecd753..cf19712f92079 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -28,11 +28,6 @@ struct RawAllocResults { size_t num_frees; }; -// TODO(PR): Is this correct? Are these JL_NOTSAFEPOINT? -void _report_gc_started(void) JL_NOTSAFEPOINT; -void _report_gc_finished( - uint64_t pause, uint64_t freed, uint64_t allocd, int full, int recollect -) JL_NOTSAFEPOINT; JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); diff --git a/src/gc.c b/src/gc.c index e92dc498622d1..bf81f1eabc94c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -3010,8 +3010,6 @@ size_t jl_maxrss(void); // Only one thread should be running in this function static int _jl_gc_collect(jl_ptls_t ptls, jl_gc_collection_t collection) { - _report_gc_started(); - combine_thread_gc_counts(&gc_num); jl_gc_mark_cache_t *gc_cache = &ptls->gc_cache; From 9de01c67b2d925dcd7227e164dd7d074e670c0d9 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 21 Dec 2021 15:42:28 -0500 Subject: [PATCH 045/107] remove a couple debugging things --- stdlib/AllocProfile/src/AllocProfile.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index da31d99ee28d6..4f291bf3fa656 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -80,11 +80,9 @@ const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} # loading anything below this seems to segfault # TODO: find out what's going on TYPE_PTR_LOW_THRESHOLD = 0x0000000100000000 -TYPE_PTR_HIGH_THRESHOLD = 100000000000000 function load_type(ptr::Ptr{Type}) - # println("type: $(UInt(ptr))") - if TYPE_PTR_LOW_THRESHOLD < UInt(ptr) < TYPE_PTR_HIGH_THRESHOLD + if TYPE_PTR_LOW_THRESHOLD < UInt(ptr) return unsafe_pointer_to_objref(ptr) end return Missing From cdabd0ebd244995adc63a66c38c4a646f64c9129 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 21 Dec 2021 15:47:59 -0500 Subject: [PATCH 046/107] add macro interface; use in test --- stdlib/AllocProfile/src/AllocProfile.jl | 16 ++++++++++++++++ stdlib/AllocProfile/test/runtests.jl | 21 +++++++++------------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 4f291bf3fa656..26c60d04d1289 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -32,6 +32,22 @@ struct RawAllocResults num_frees::Csize_t end +""" + AllocProfile.@profile(skip_every::Int, ex) + +Profile allocations that happen during `my_function`, returning +both the result and and AllocResults struct. +""" +macro profile(skip_every, ex) + quote + $start($skip_every) + local res = $(esc(ex)) + local profile = $stop() + $clear() + (res, profile) + end +end + function start(skip_every::Int=0) ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) end diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index 0067ff47a2578..34269b4b6a612 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -6,21 +6,18 @@ using Test using AllocProfile @testset "alloc profiler doesn't segfault" begin - AllocProfile.start() + res, profile = AllocProfile.@profile 0 begin + # test the allocations during compilation + using Base64 + # make sure some frees show up in the profile + GC.gc() + end - # test the allocations during compilation - using Base64 - # make sure some frees show up in the profile - GC.gc() - - results = AllocProfile.stop() - AllocProfile.clear() - - @test length(results.allocs) > 0 - first_alloc = results.allocs[1] + @test length(profile.allocs) > 0 + first_alloc = profile.allocs[1] @test first_alloc.size > 0 @test length(first_alloc.stacktrace) > 0 @test length(string(first_alloc.type)) > 0 - @test length(results.frees) > 0 + @test length(profile.frees) > 0 end From ba3c0c866aee09d3d8180d3c5d16de97dce25c43 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 21 Dec 2021 23:56:06 -0500 Subject: [PATCH 047/107] fix whitespace --- stdlib/AllocProfile/test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index 34269b4b6a612..b44f579b1657a 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -18,6 +18,6 @@ using AllocProfile @test first_alloc.size > 0 @test length(first_alloc.stacktrace) > 0 @test length(string(first_alloc.type)) > 0 - + @test length(profile.frees) > 0 end From ddf945cfcc73d7f01019127c22d1a612652a3079 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 22 Dec 2021 12:27:12 -0500 Subject: [PATCH 048/107] make skip_every a named optional argument to the macro --- stdlib/AllocProfile/src/AllocProfile.jl | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 26c60d04d1289..9590df8adc2aa 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -33,22 +33,29 @@ struct RawAllocResults end """ - AllocProfile.@profile(skip_every::Int, ex) + AllocProfile.@profile [skip_every=10_000] ex Profile allocations that happen during `my_function`, returning both the result and and AllocResults struct. """ -macro profile(skip_every, ex) +macro profile(opts, ex) + _prof_expr(ex, opts) +end +macro profile(ex) + _prof_expr(ex, :(skip_every=1000)) +end + +function _prof_expr(expr, opts) quote - $start($skip_every) - local res = $(esc(ex)) + $start(; $(esc(opts))) + local res = $(esc(expr)) local profile = $stop() $clear() (res, profile) end end -function start(skip_every::Int=0) +function start(; skip_every::Int) ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) end From e2a8ba33e5a48a86b5df48223228abadc4008449 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 22 Dec 2021 15:31:35 -0500 Subject: [PATCH 049/107] remove debug logs I think these were added to find why it was slow, which was fixed by the __precompile__, so we don't need them anymore? --- stdlib/AllocProfile/src/AllocProfile.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/AllocProfile/src/AllocProfile.jl index 9590df8adc2aa..748da82d14bcf 100644 --- a/stdlib/AllocProfile/src/AllocProfile.jl +++ b/stdlib/AllocProfile/src/AllocProfile.jl @@ -121,13 +121,11 @@ end function decode(raw_results::RawAllocResults)::AllocResults cache = BacktraceCache() - @info "ALLOCS" allocs = [ decode_alloc(cache, unsafe_load(raw_results.allocs, i)) for i in 1:raw_results.num_allocs ] - @info "FREES" frees = Dict{Type,UInt}() for i in 1:raw_results.num_frees free = unsafe_load(raw_results.frees, i) From ad1b0e0234464106ae4b73aaed20bc839b45e1a8 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 22 Dec 2021 15:33:51 -0500 Subject: [PATCH 050/107] add multithreaded test --- stdlib/AllocProfile/test/runtests.jl | 48 +++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl index b44f579b1657a..d7a8166a79e50 100644 --- a/stdlib/AllocProfile/test/runtests.jl +++ b/stdlib/AllocProfile/test/runtests.jl @@ -6,7 +6,7 @@ using Test using AllocProfile @testset "alloc profiler doesn't segfault" begin - res, profile = AllocProfile.@profile 0 begin + res, profile = AllocProfile.@profile skip_every=0 begin # test the allocations during compilation using Base64 # make sure some frees show up in the profile @@ -21,3 +21,49 @@ using AllocProfile @test length(profile.frees) > 0 end + +@testset "works when there are multiple tasks on multiple threads" begin + NUM_TASKS = 1000 + + # TODO: is this always true in CI? + @test Threads.nthreads() > 1 + + function do_work() + ch = Channel{Vector{Int}}(Inf) + @sync for i in 1:NUM_TASKS + Threads.@spawn begin + # generate garbage + put!(ch, zeros(100)) + end + end + close(ch) + # for obj in ch + # # ... + # end + GC.gc() + end + + # call once to make sure it's compiled + do_work() + + res, profile = AllocProfile.@profile skip_every=0 begin + do_work() + end + + # expecting at least 3 allocations per task: + # 1. the task + # 2. the vector + # 3. the buffer inside the vector + @test length(profile.allocs) >= 3*NUM_TASKS + println(length(profile.allocs)) + first_alloc = profile.allocs[1] + @test first_alloc.size > 0 + @test length(first_alloc.stacktrace) > 0 + @test length(string(first_alloc.type)) > 0 + + @test length(profile.frees) > 0 + + # TODO: it would be nice to assert that these tasks + # were actually scheduled onto multiple threads, + # and we see allocs from all threads in the profile +end From a7122670ce699beb0e3789d72cd238a5899630d0 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 4 Jan 2022 14:35:45 -0500 Subject: [PATCH 051/107] skip another frame to avoid record_allocated_value --- src/gc-alloc-profiler.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index d23cd5b589032..3cb7600443d67 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -55,8 +55,7 @@ CombinedResults g_combined_results; // will live forever RawBacktrace get_raw_backtrace() { static jl_bt_element_t static_bt_data[JL_MAX_BT_SIZE]; - // TODO: tune the number of frames that are skipped - size_t bt_size = rec_backtrace(static_bt_data, JL_MAX_BT_SIZE, 1); + size_t bt_size = rec_backtrace(static_bt_data, JL_MAX_BT_SIZE, 2); size_t bt_bytes = bt_size * sizeof(jl_bt_element_t); jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(bt_bytes); From ec6cc6fe4dc2a6ab5f548dbd8e3c41f37f7d2ceb Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 22 Dec 2021 15:46:54 -0500 Subject: [PATCH 052/107] move AllocProfile into Profile package --- stdlib/AllocProfile/Project.toml | 2 - stdlib/AllocProfile/src/test.json | 5488 ----------------- stdlib/AllocProfile/test/runtests.jl | 69 - stdlib/AllocProfile/test/runtests_raw.jl | 10 - .../src/AllocProfile.jl | 0 stdlib/Profile/src/Profile.jl | 2 + stdlib/Profile/test/runtests.jl | 64 + 7 files changed, 66 insertions(+), 5569 deletions(-) delete mode 100644 stdlib/AllocProfile/Project.toml delete mode 100644 stdlib/AllocProfile/src/test.json delete mode 100644 stdlib/AllocProfile/test/runtests.jl delete mode 100644 stdlib/AllocProfile/test/runtests_raw.jl rename stdlib/{AllocProfile => Profile}/src/AllocProfile.jl (100%) diff --git a/stdlib/AllocProfile/Project.toml b/stdlib/AllocProfile/Project.toml deleted file mode 100644 index 358fdf9475bff..0000000000000 --- a/stdlib/AllocProfile/Project.toml +++ /dev/null @@ -1,2 +0,0 @@ -name = "AllocProfile" -uuid = "0009037c-06ea-4b9e-a52e-4b728900de75" diff --git a/stdlib/AllocProfile/src/test.json b/stdlib/AllocProfile/src/test.json deleted file mode 100644 index 8a32e15b0098d..0000000000000 --- a/stdlib/AllocProfile/src/test.json +++ /dev/null @@ -1,5488 +0,0 @@ -{ - "allocs": [ - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 0 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 56, 57, 58, 59, 60, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, - 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 56, 57, 58, 59, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 84, 58, 59, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 87, 59, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 87, 59, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, - 87, 59, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 87, 59, - 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 87, 59, - 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 109, 87, 59, 60, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 110, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 111, 112, 113, 60, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 114, 115, 116, 117, 118, 119, 112, 113, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 120, 121, 112, 113, 60, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 111, 112, 122, 60, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 114, 115, 116, 117, 118, 119, 112, 122, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 120, 121, 112, 122, 60, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 123, 60, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, - 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 56, 124, 125, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 56, 124, 125, 60, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 56, 124, 125, 60, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, - 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 56, 124, 125, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 126, 60, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 56, 124, 125, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 56, 124, 125, 60, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 56, 124, 125, 60, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, - 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 56, 124, 125, 60, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 126, 60, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 126, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, - 126, 60, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 126, 60, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 126, 60, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 109, 126, 60, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 127, 128, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 127, 128, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 127, 128, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 127, 128, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 129, 130, 131, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, - 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 129, 130, 131, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 129, 130, 131, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 9 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 132, 133, 134, 135, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, - 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 132, 133, 134, 135, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 0 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 132, 133, 134, 135, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 10 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 136, 137, 134, 135, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, - 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 136, 137, 134, 135, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 0 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 136, 137, 134, 135, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 11 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 138, 139, 134, 135, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, - 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 138, 139, 134, 135, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 0 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 138, 139, 134, 135, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 12 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 140, 130, 141, 142, 135, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 140, 130, 141, 142, 135, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 0 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 140, 130, 141, 142, 135, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, - 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 9 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 143, 13, 144, 145, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 150, - 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 150, - 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 150, 13, 144, 145, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, - 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 109, 150, 13, 144, 145, 146, 147, 148, 149, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 151, 152, 153, 154, 155, - 156, 157, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 143, 13, 144, 145, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 150, - 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 150, - 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 150, 13, 144, 145, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, - 150, 13, 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 150, 13, - 144, 145, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 109, 150, 13, 144, 145, 146, 147, 148, 149, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 151, 152, 153, 154, 155, - 156, 157, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 83, 143, 13, 144, 145, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 158, 13, 144, 145, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 158, 13, 144, 145, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 159, 160, 161, 146, 147, - 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 159, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 159, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 159, 160, 161, 146, 147, 148, 149, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 159, 160, 161, 146, 147, - 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 162, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 163, 164, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 163, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 163, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 163, 164, 160, 161, 146, 147, 148, 149, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 163, 164, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 165, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 165, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, - 165, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 165, - 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 165, - 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 109, 165, 164, 160, 161, 146, 147, 148, 149, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 166, 164, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 166, 164, 160, 161, 146, 147, 148, 149, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 166, 164, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 167, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 51, 52, 53, 54, 55, 166, 164, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 1 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 66, 52, 53, 54, 55, 166, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 68, 69, 70, 71, 166, 164, 160, 161, 146, 147, 148, 149, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 3 - }, - { - "stack": [ - 0, 1, 2, 72, 73, 74, 75, 76, 77, 69, 70, 71, 166, 164, 160, 161, 146, - 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, - 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 85, 86, 167, 164, 160, 161, - 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, - 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 167, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 5 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 99, 93, 94, 95, 96, 97, 98, - 167, 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 106, 107, 96, 97, 98, 167, - 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 104, 105, 108, 107, 96, 97, 98, 167, - 164, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 7 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 109, 167, 164, 160, 161, 146, 147, 148, 149, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 168, 160, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 13 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 79, 80, 81, 82, 151, 152, 153, 154, 155, - 169, 170, 161, 146, 147, 148, 149, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, - 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 61, 171, 172, 173, 174, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 175, 176, 177, 178, 179, 180, 181, 182, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 14 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 186, 187, 188, 177, 178, 179, 180, 181, 182, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 189, 190, 191, 192, 193, 179, 180, 181, 182, 18, 183, 184, 23, - 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, - 50 - ], - "size": 42, - "type_id": 15 - }, - { - "stack": [ - 0, 1, 2, 3, 194, 195, 192, 193, 179, 180, 181, 182, 18, 183, 184, 23, - 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, - 50 - ], - "size": 42, - "type_id": 16 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 196, 197, 198, 199, 192, 193, 179, 180, 181, 182, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 196, 197, 200, 199, 192, 193, 179, 180, 181, 182, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 201, 202, 193, 179, 180, 181, 182, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 17 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 186, 187, 203, 204, 205, 193, 179, 180, 181, 182, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 206, 207, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 18 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 211, 212, 213, 214, 16, 17, 18, 215, 208, - 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, - 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 19 - }, - { - "stack": [ - 0, 1, 2, 3, 67, 216, 217, 16, 17, 18, 218, 219, 220, 221, 16, 17, 222, - 223, 223, 224, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 20 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 226, 217, 16, 17, 18, 218, 219, 220, 221, 16, - 17, 222, 223, 223, 224, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, - 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 227, 220, 221, 16, 17, 222, 223, 223, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 228, 229, 230, 231, 232, 223, 223, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 233, 234, 235, 236, 224, 225, 213, 214, 16, 17, 18, 215, 208, - 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, - 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 22 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 237, 235, 236, 224, 225, 213, 214, 16, 17, 18, 215, - 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 238, 239, 240, 235, 236, 224, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 186, 187, 241, 242, 243, 244, 240, 235, 236, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 245, 242, 243, 244, 240, 235, 236, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 23 - }, - { - "stack": [ - 0, 1, 2, 3, 246, 247, 244, 240, 235, 236, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 24 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 238, 239, 240, 235, 236, 224, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 238, 239, 240, 235, 236, 224, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 246, 248, 244, 240, 235, 236, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 25 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 249, 250, 235, 236, 224, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 26 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 251, 235, 236, 224, 225, 213, 214, 16, 17, 18, 215, - 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 252, 253, 52, 254, 255, 256, 224, 225, 213, 214, - 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 257, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 258, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 259, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 28 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 260, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 29 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 261, 256, 224, 225, 213, 214, 16, 17, 18, 215, - 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 30 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 262, 256, 224, 225, 213, 214, 16, 17, 18, 215, - 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, - 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 263, 264, 256, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 31 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 263, 264, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 263, 264, 256, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 263, 264, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 263, 264, 256, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 269, 256, 224, 225, 213, 214, - 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 269, 256, 224, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 272, 273, 256, 224, 225, 213, 214, - 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 274, 275, 276, 256, 224, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 274, 275, 276, 256, 224, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 278, 279, 256, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 278, 279, 256, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 279, 256, 224, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 32 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 279, 256, 224, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 33 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 280, 279, 256, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 281, 256, 224, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 282, 283, 284, 285, 286, 287, 288, 289, 225, 213, 214, - 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, - 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, - 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 30 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 290, 288, 289, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 291, 292, 293, 288, 289, 225, 213, 214, 16, - 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 294, 295, 293, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 34 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 296, 295, 293, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 297, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 35 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 298, 299, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 298, 303, 304, 298, 299, - 300, 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, - 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 305, 300, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 306, 307, 300, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 308, 309, 310, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 308, 309, 310, 300, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 311, 312, 313, 314, 315, 316, 310, 300, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 317, 310, 300, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 36 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 318, 310, 300, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 319, 320, 310, 300, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 319, 320, 310, 300, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 306, 321, 300, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 253, 52, 322, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 37 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 326, 327, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 326, 327, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 326, 327, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 326, 327, 300, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 326, 327, 300, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 326, 327, 300, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 333, 334, 335, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 332, 333, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 333, 334, 335, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 332, 333, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 333, 334, 335, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 333, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 39 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 333, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 333, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 40 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 332, 337, 338, 334, 335, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 332, 337, 338, 334, 335, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 332, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 341, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 342, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 343, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 344, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 340, 345, 337, 338, 334, 335, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 346, 347, 338, 334, 335, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 41 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 348, 349, 334, 335, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 282, 283, 350, 349, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 282, 283, 351, 349, 334, 335, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 352, 349, 334, 335, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 353, 354, 334, 335, 336, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 40 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 355, 353, 354, 334, 335, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 356, 353, 354, 334, 335, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 346, 357, 358, 354, 334, 335, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 42 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 359, 360, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 43 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 361, 359, 360, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 361, 359, 360, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 362, 363, 364, 365, 360, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 43 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 366, 360, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 367, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 42 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 369, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 370, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 44 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 370, 368, 336, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 371, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 45 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 371, 368, 336, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 46 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 372, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 47 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 373, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 374, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 346, 375, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 48 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 376, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 376, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 377, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 377, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 378, 379, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 378, 379, 368, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 80, 81, 265, 380, 381, 382, 379, 368, 336, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 21 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 266, 267, 268, 265, 380, 381, 382, 379, 368, - 336, 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, - 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, - 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 383, 368, 336, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 384, 368, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 47 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 385, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 339, 386, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 387, 388, 368, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 389, 388, 368, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 61, 62, 63, 64, 65, 390, 388, 368, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 2 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 391, 392, 388, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 393, 388, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 36 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 394, 388, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 394, 388, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 394, 388, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 394, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 394, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 395, 388, 368, 336, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 47 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 396, 388, 368, 336, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 42 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 397, 52, 398, 388, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 399, 52, 400, 388, 368, 336, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 362, 363, 364, 401, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 36 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 401, 388, 368, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 402, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 402, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 402, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 402, 388, 368, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 402, 388, 368, 336, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 402, 388, 368, 336, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 404, 405, 406, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 404, 405, 406, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 404, 405, 406, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 404, 405, 406, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 404, 405, 406, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 404, 405, 406, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 404, 405, 406, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 404, 405, 406, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 404, 405, 406, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 404, 405, 406, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 404, 405, 406, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 404, 405, 406, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 404, 405, 406, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 404, 405, 406, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 404, 405, 406, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 419, 420, 405, 406, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 422, 420, 405, 406, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 423, 424, 425, 16, 17, 426, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 49 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 404, 405, 427, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 404, 405, 427, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 404, 405, 427, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 404, 405, 427, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 404, 405, 427, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 404, 405, 427, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 404, 405, 427, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 404, 405, 427, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 404, 405, 427, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 404, 405, 427, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 404, 405, 427, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 404, 405, 427, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 404, 405, 427, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 404, 405, 427, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 404, 405, 427, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 419, 420, 405, 427, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 422, 420, 405, 427, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 428, 429, 430, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 428, 429, 430, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 428, 429, 430, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 428, 429, 430, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 428, 429, 430, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 428, 429, 430, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 428, 429, 430, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 428, 429, 430, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 428, 429, 430, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 428, 429, 430, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 428, 429, 430, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 428, 429, 430, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 428, 429, 430, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 428, 429, 430, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 428, 429, 430, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 431, 430, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 432, 430, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 306, 433, 430, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 434, 430, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 435, 430, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 436, 437, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 438, 437, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 428, 439, 437, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 428, 439, 437, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 428, 439, 437, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 428, 439, 437, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 428, 439, 437, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 428, 439, 437, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 428, 439, 437, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 428, 439, 437, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 428, 439, 437, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 428, 439, 437, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 428, 439, 437, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 428, 439, 437, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 428, 439, 437, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 428, 439, 437, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 428, 439, 437, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 440, 437, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 278, 441, 437, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 442, 437, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 277, 443, 444, 301, 302, 288, 289, 225, 213, - 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, - 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, - 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 403, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 407, 408, 404, 405, 445, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 409, 404, 405, 445, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 409, 404, 405, 445, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 409, 404, 405, 445, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 409, 404, 405, 445, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 409, 404, 405, 445, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 410, 404, 405, 445, 301, 302, 288, - 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, - 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, - 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 411, 404, 405, 445, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 412, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 413, 404, 405, 445, 301, 302, 288, 289, 225, - 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, - 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, - 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 414, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 414, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 414, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 414, 404, 405, 445, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 414, 404, 405, 445, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 414, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 324, 325, 325, 415, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 328, 325, 325, 415, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 323, 329, 325, 325, 415, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 8 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 330, 325, 325, 415, 404, 405, 445, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 27 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 331, 325, 325, 415, 404, 405, 445, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 270, 271, 325, 325, 415, 404, 405, 445, 301, - 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, - 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, - 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 38 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 416, 404, 405, 445, 301, 302, 288, 289, - 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, - 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, - 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 417, 418, 419, 420, 405, 445, 301, 302, - 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, 18, 183, - 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, - 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 4, 5, 6, 7, 78, 88, 89, 90, 91, 421, 422, 420, 405, 445, - 301, 302, 288, 289, 225, 213, 214, 16, 17, 18, 215, 208, 209, 210, 17, - 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, 30, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, 42, 43, 44, 45, 46, 47, - 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 6 - }, - { - "stack": [ - 0, 1, 2, 3, 100, 101, 102, 103, 446, 288, 289, 225, 213, 214, 16, 17, - 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, - 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, - 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 50 - }, - { - "stack": [ - 0, 1, 2, 447, 448, 449, 450, 451, 452, 453, 288, 289, 225, 213, 214, 16, - 17, 18, 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, - 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, - 17, 18, 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 4 - }, - { - "stack": [ - 0, 1, 2, 454, 455, 456, 457, 453, 288, 289, 225, 213, 214, 16, 17, 18, - 215, 208, 209, 210, 17, 18, 183, 184, 23, 23, 24, 25, 185, 27, 28, 29, - 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 16, 17, 40, 41, 16, 17, 18, - 42, 43, 44, 45, 46, 47, 48, 16, 17, 18, 49, 50 - ], - "size": 42, - "type_id": 51 - } - ], - "frees": [], - "locations": [ - { "loc": "getindex at array.jl:423 [inlined]", "id": 306 }, - { "loc": "IdSet at idset.jl:7 [inlined]", "id": 278 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:87", - "id": 260 - }, - { "loc": "getindex at array.jl:411 [inlined]", "id": 9 }, - { - "loc": "active_project(search_load_path::Bool) at initdefs.jl:298", - "id": 87 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:614", - "id": 372 - }, - { - "loc": "assemble_inline_todo!(ir::Core.Compiler.IRCode, state::Core.Compiler.InliningState{Core.Compiler.EdgeTracker, Core.Compiler.WorldView{Core.Compiler.InternalCodeCache}, Core.Compiler.NativeInterpreter}) at inlining.jl:1277", - "id": 423 - }, - { - "loc": "run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool) at REPL.jl:367", - "id": 37 - }, - { "loc": "array_resize_buffer at array.c:714", "id": 62 }, - { "loc": "abspath(a::String) at path.jl:430", "id": 56 }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:816", - "id": 385 - }, - { "loc": "jl_decode_value_array at ircode.c:442", "id": 244 }, - { "loc": "copy(e::Expr) at expr.jl:37", "id": 303 }, - { "loc": "copymutable at bitset.jl:47 [inlined]", "id": 381 }, - { "loc": "jl_gc_alloc_buf at julia_internal.h:397 [inlined]", "id": 61 }, - { - "loc": "string(::String, ::SubString{String}) at substring.jl:227", - "id": 108 - }, - { "loc": "do_apply at builtins.c:713", "id": 218 }, - { - "loc": "finish(compact::Core.Compiler.IncrementalCompact) at ir.jl:1437", - "id": 419 - }, - { "loc": "jl_toplevel_eval_flex at toplevel.c:888", "id": 29 }, - { - "loc": "getindex(#unused#::Type{Any}, vals::Any) at array.jl:416", - "id": 216 - }, - { - "loc": "find_throw_blocks(code::Vector{Any}, handler_at::Vector{Int64}) at utilities.jl:308", - "id": 274 - }, - { "loc": "StringVector at iobuffer.jl:31 [inlined]", "id": 74 }, - { "loc": "project_deps_get at loading.jl:418 [inlined]", "id": 145 }, - { - "loc": "IOBuffer(; read::Bool, write::Bool, append::Nothing, truncate::Bool, maxsize::Int64, sizehint::Int64) at iobuffer.jl:114", - "id": 75 - }, - { - "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:87", - "id": 317 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:897", - "id": 386 - }, - { "loc": "load_path_expand(env::String) at initdefs.jl:255", "id": 113 }, - { - "loc": "mark_throw_blocks!(src::Core.CodeInfo, handler_at::Vector{Int64}) at utilities.jl:301", - "id": 275 - }, - { "loc": "normpath(path::String) at path.jl:395", "id": 71 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:508", - "id": 401 - }, - { "loc": "import_module at toplevel.c:563", "id": 173 }, - { "loc": "push! at array.jl:1055 [inlined]", "id": 65 }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:495", - "id": 310 - }, - { - "loc": "typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:209", - "id": 288 - }, - { "loc": "iterate at tuple.jl:68 [inlined]", "id": 105 }, - { "loc": "update_domtree! at domtree.jl:210 [inlined]", "id": 338 }, - { "loc": "basename at path.jl:186 [inlined]", "id": 97 }, - { - "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:91", - "id": 320 - }, - { "loc": "similar at array.jl:378 [inlined]", "id": 362 }, - { "loc": "_array_for at array.jl:676 [inlined]", "id": 91 }, - { - "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:332", - "id": 351 - }, - { "loc": "IdDict at iddict.jl:30 [inlined]", "id": 277 }, - { "loc": "ijl_alloc_vec_any at array.c:540", "id": 187 }, - { "loc": "load_path() at initdefs.jl:342", "id": 60 }, - { - "loc": "find_ssavalue_uses(body::Vector{Any}, nvals::Int64) at utilities.jl:245", - "id": 263 - }, - { "loc": "sizehint! at array.jl:1264 [inlined]", "id": 268 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:388", - "id": 390 - }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:424", - "id": 392 - }, - { - "loc": "_collect(#unused#::Type{SubString{String}}, itr::Base.SplitIterator{String, Regex}, isz::Base.SizeUnknown) at array.jl:651", - "id": 66 - }, - { "loc": "ijl_box_uint64 at datatype.c:1169", "id": 206 }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:239", - "id": 293 - }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:269", - "id": 446 - }, - { "loc": "load_path_expand(env::String) at initdefs.jl:264", "id": 125 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:94", - "id": 262 - }, - { - "loc": "Dict{String, Union{Nothing, String}}(kv::Dict{Any, Any}) at dict.jl:101", - "id": 139 - }, - { - "loc": "cache_result!(interp::Core.Compiler.NativeInterpreter, result::Core.Compiler.InferenceResult) at typeinfer.jl:394", - "id": 457 - }, - { - "loc": "typeinf_ext_toplevel(mi::Core.MethodInstance, world::UInt64) at sys.dylib:?", - "id": 214 - }, - { "loc": "jl_toplevel_eval_flex at toplevel.c:708", "id": 174 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:430", - "id": 430 - }, - { "loc": "NativeInterpreter at types.jl:162 [inlined]", "id": 212 }, - { "loc": "ijl_array_copy at array.c:1207", "id": 282 }, - { "loc": "Dict at dict.jl:118 [inlined]", "id": 128 }, - { "loc": "new_binding at module.c:145 [inlined]", "id": 171 }, - { "loc": "optimize at optimize.jl:418 [inlined]", "id": 301 }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:229", - "id": 290 - }, - { "loc": "_record_allocated_value at gc-alloc-profiler.cpp:80", "id": 0 }, - { - "loc": "type_annotate!(sv::Core.Compiler.InferenceState, run_optimizer::Bool) at typeinfer.jl:646", - "id": 296 - }, - { - "loc": "transform_result_for_cache at typeinfer.jl:367 [inlined]", - "id": 451 - }, - { "loc": "ijl_uncompress_argnames at ircode.c:941", "id": 249 }, - { "loc": "ip:0xffffffffffffffff", "id": 25 }, - { "loc": "macro expansion at loading.jl:991 [inlined]", "id": 149 }, - { "loc": "ijl_array_sizehint at array.c:1193", "id": 267 }, - { - "loc": "get_updated_dict(p::Base.TOML.Parser, f::Base.CachedTOMLDict) at loading.jl:204", - "id": 151 - }, - { "loc": "load_path_expand(env::String) at initdefs.jl:273", "id": 84 }, - { "loc": "parsed_toml at loading.jl:242 [inlined]", "id": 155 }, - { - "loc": "scan_slot_def_use(nargs::Int64, ci::Core.CodeInfo, code::Vector{Any}) at slot2ssa.jl:41", - "id": 366 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:616", - "id": 416 - }, - { - "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:817", - "id": 434 - }, - { "loc": "jl_f_tuple at builtins.c:793", "id": 67 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:106", - "id": 273 - }, - { "loc": "print at show.jl:1061 [inlined]", "id": 117 }, - { "loc": "jl_compile_method_internal at gf.c:1988", "id": 209 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:102", - "id": 264 - }, - { "loc": "jl_toplevel_eval_flex at toplevel.c:832", "id": 30 }, - { "loc": "Set at set.jl:9 [inlined]", "id": 130 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:105", - "id": 269 - }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:500", - "id": 398 - }, - { "loc": "ijl_ptr_to_array_1d at array.c:335", "id": 447 }, - { "loc": "replace at util.jl:675 [inlined]", "id": 112 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:429", - "id": 427 - }, - { "loc": "#invokelatest#2 at essentials.jl:731 [inlined]", "id": 43 }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:499", - "id": 322 - }, - { - "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool) at sys.dylib:?", - "id": 221 - }, - { "loc": "_collect at array.jl:715 [inlined]", "id": 314 }, - { "loc": "getindex at array.jl:929 [inlined]", "id": 364 }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:226", - "id": 287 - }, - { - "loc": "Dict{String, Base.UUID}(kv::Dict{Any, Any}) at dict.jl:101", - "id": 133 - }, - { "loc": "_gf_invoke_lookup at gf.c:2462 [inlined]", "id": 179 }, - { "loc": "jl_decode_value at ircode.c:677", "id": 248 }, - { "loc": "SlotInfo at slot2ssa.jl:8 [inlined]", "id": 361 }, - { - "loc": "string(::String, ::SubString{String}) at substring.jl:222", - "id": 106 - }, - { "loc": "match at regex.jl:383 [inlined]", "id": 93 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:433", - "id": 395 - }, - { - "loc": "Core.Compiler.NativeInterpreter(world::UInt64; inf_params::Core.Compiler.InferenceParams, opt_params::Core.Compiler.OptimizationParams) at types.jl:171", - "id": 211 - }, - { "loc": "compact! at ir.jl:1448 [inlined]", "id": 405 }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:681", - "id": 375 - }, - { "loc": "copy! at domtree.jl:106 [inlined]", "id": 345 }, - { "loc": "ijl_alloc_array_1d at array.c:441 [inlined]", "id": 186 }, - { - "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:264", - "id": 348 - }, - { - "loc": "identify_package(where::Base.PkgId, name::String) at loading.jl:283", - "id": 147 - }, - { "loc": "Dict{Any, Any}() at dict.jl:90", "id": 127 }, - { - "loc": "entry_point_and_project_file_inside at loading.jl:521 [inlined]", - "id": 167 - }, - { "loc": "fill at array.jl:531 [inlined]", "id": 271 }, - { - "loc": "finish(me::Core.Compiler.InferenceState, interp::Core.Compiler.NativeInterpreter) at typeinfer.jl:471", - "id": 295 - }, - { "loc": "copy(s1::Core.Compiler.BitSet) at bitset.jl:46", "id": 380 }, - { "loc": "BitArray at bitarray.jl:37 [inlined]", "id": 228 }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:255", - "id": 302 - }, - { "loc": "isfile_casesensitive(path::String) at loading.jl:47", "id": 86 }, - { - "loc": "compute_trycatch(code::Vector{Any}, ip::Core.Compiler.BitSet) at inferencestate.jl:149", - "id": 272 - }, - { "loc": "true_main at jlapi.c:562", "id": 49 }, - { - "loc": "compute_domtree_nodes!(domtree::Core.Compiler.DomTree) at domtree.jl:224", - "id": 353 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:802", - "id": 379 - }, - { "loc": "join at io.jl:353 [inlined]", "id": 70 }, - { - "loc": "complete(compact::Core.Compiler.IncrementalCompact) at ir.jl:1443", - "id": 421 - }, - { - "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool, withfirst::Bool) at inferenceresult.jl:104", - "id": 227 - }, - { - "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:195", - "id": 330 - }, - { "loc": "Array at boot.jl:452 [inlined]", "id": 7 }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:500", - "id": 327 - }, - { - "loc": "Core.CodeInstance(result::Core.Compiler.InferenceResult, inferred_result::Any, valid_worlds::Core.Compiler.WorldRange) at typeinfer.jl:318", - "id": 456 - }, - { - "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:530", - "id": 159 - }, - { "loc": "_start() at client.jl:506", "id": 47 }, - { "loc": "_jl_invoke at gf.c:0 [inlined]", "id": 16 }, - { - "loc": "typeinf_ext_toplevel(interp::Core.Compiler.NativeInterpreter, linfo::Core.MethodInstance) at typeinfer.jl:945", - "id": 225 - }, - { "loc": "Array at boot.jl:471 [inlined]", "id": 8 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:426", - "id": 406 - }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:447", - "id": 305 - }, - { "loc": "ijl_array_grow_end at array.c:975 [inlined]", "id": 266 }, - { "loc": "jl_apply at julia.h:1773 [inlined]", "id": 18 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:431", - "id": 437 - }, - { "loc": "copy at array.jl:369 [inlined]", "id": 283 }, - { "loc": "_jl_invoke at gf.c:2261 [inlined]", "id": 210 }, - { - "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:88", - "id": 318 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:609", - "id": 411 - }, - { - "loc": "typeinf_ext(interp::Core.Compiler.NativeInterpreter, mi::Core.MethodInstance) at typeinfer.jl:910", - "id": 224 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:683", - "id": 377 - }, - { "loc": "split at util.jl:592 [inlined]", "id": 54 }, - { - "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:290", - "id": 350 - }, - { "loc": "slot2reg at optimize.jl:522 [inlined]", "id": 335 }, - { "loc": "jl_gc_alloc_ at julia_internal.h:369 [inlined]", "id": 2 }, - { "loc": "ijl_apply_generic at gf.c:2451", "id": 17 }, - { "loc": "cache_method at gf.c:1039", "id": 192 }, - { - "loc": "run_repl(repl::REPL.AbstractREPL, consumer::Any) at sys.dylib:?", - "id": 39 - }, - { "loc": "ijl_new_code_info_uninit at method.c:430", "id": 233 }, - { "loc": "identify_package at loading.jl:277 [inlined]", "id": 148 }, - { - "loc": "explicit_project_deps_get(project_file::String, name::String) at loading.jl:554", - "id": 156 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:574", - "id": 409 - }, - { "loc": "jl_smallintset_insert at smallintset.c:158", "id": 200 }, - { "loc": "eval at boot.jl:368 [inlined]", "id": 33 }, - { "loc": "jl_exprn at builtins.c:1283", "id": 245 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:509", - "id": 402 - }, - { - "loc": "Core.Compiler.IdDict{Int64, Int64}(itr::Core.Compiler.Generator{Core.Compiler.Iterators.Filter{Core.Compiler.var\"#359#366\", Core.Compiler.Pairs{Int64, Int64, Core.Compiler.LinearIndices{1, Tuple{Core.Compiler.OneTo{Int64}}}, Vector{Int64}}}, Core.Compiler.var\"#358#365\"}) at iddict.jl:33", - "id": 391 - }, - { "loc": "macro expansion at lock.jl:221 [inlined]", "id": 13 }, - { "loc": "cache_method at gf.c:1166", "id": 205 }, - { "loc": "DomTreeNode at domtree.jl:184 [inlined]", "id": 355 }, - { "loc": "vect at array.jl:125 [inlined]", "id": 291 }, - { - "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:83", - "id": 309 - }, - { - "loc": "Base.LoadingCache(load_path::Vector{String}, dummy_uuid::Dict{Any, Any}, env_project_file::Dict{Any, Any}, project_file_manifest_path::Dict{Any, Any}, require_parsed::Set{Any}) at loading.jl:226", - "id": 135 - }, - { "loc": "load_path() at initdefs.jl:343", "id": 110 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:425", - "id": 393 - }, - { "loc": "ijl_get_binding_wr at module.c:177", "id": 172 }, - { "loc": "ml_matches_visitor at gf.c:2682", "id": 188 }, - { "loc": "ijl_new_codeinst at gf.c:373", "id": 454 }, - { "loc": "jl_smallintset_insert at smallintset.c:139", "id": 198 }, - { "loc": "parsed_toml at loading.jl:244 [inlined]", "id": 154 }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:614", - "id": 414 - }, - { - "loc": "record_allocated_value at gc-alloc-profiler.h:47 [inlined]", - "id": 1 - }, - { "loc": "collect at array.jl:644 [inlined]", "id": 52 }, - { - "loc": "compact!(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:1448", - "id": 404 - }, - { "loc": "Base.LoadingCache() at loading.jl:233", "id": 11 }, - { "loc": "copy! at domtree.jl:105 [inlined]", "id": 344 }, - { "loc": "ml_matches_visitor at gf.c:2677", "id": 176 }, - { "loc": "load_path() at initdefs.jl:340", "id": 10 }, - { "loc": "cache_method at gf.c:1148", "id": 202 }, - { "loc": "ip:0x1136e5090", "id": 27 }, - { - "loc": "DFS!(D::Core.Compiler.DFSTree, blocks::Vector{Core.Compiler.BasicBlock}) at domtree.jl:113", - "id": 337 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:575", - "id": 410 - }, - { "loc": "zeros at array.jl:581 [inlined]", "id": 81 }, - { - "loc": "_splitdir_nodrive(a::String, b::String) at path.jl:138", - "id": 95 - }, - { "loc": "eval_body at interpreter.c:522", "id": 23 }, - { "loc": "InferenceResult at types.jl:40 [inlined]", "id": 223 }, - { - "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:667", - "id": 432 - }, - { "loc": "basic_blocks_starts(stmts::Vector{Any}) at ir.jl:37", "id": 308 }, - { "loc": "ijl_alloc_svec_uninit at simplevector.c:60", "id": 194 }, - { "loc": "Dict{String, Base.UUID}() at dict.jl:90", "id": 132 }, - { "loc": "Dict{String, Nothing}() at dict.jl:90", "id": 140 }, - { "loc": "ijl_uncompress_ir at ircode.c:819", "id": 251 }, - { "loc": "_array_for at array.jl:672 [inlined]", "id": 252 }, - { "loc": "jl_gc_alloc at gc.c:3321", "id": 3 }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:615", - "id": 415 - }, - { - "loc": "_collect(#unused#::Type{Int64}, itr::Core.Compiler.Generator{Core.Compiler.Iterators.Filter{Core.Compiler.var\"#363#370\"{Core.Compiler.IdDict{Int64, Int64}}, Vector{Int64}}, Core.Compiler.var\"#362#369\"{Int64, Core.Compiler.IdDict{Int64, Int64}, Vector{Int64}}}, isz::Core.Compiler.SizeUnknown) at array.jl:649", - "id": 399 - }, - { "loc": "macro expansion at loading.jl:405 [inlined]", "id": 150 }, - { - "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:531", - "id": 162 - }, - { "loc": "abspath at path.jl:439 [inlined]", "id": 124 }, - { - "loc": "compact!(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:1451", - "id": 420 - }, - { "loc": "project_deps_get at loading.jl:423 [inlined]", "id": 161 }, - { - "loc": "ssa_inlining_pass!(ir::Core.Compiler.IRCode, linetable::Vector{Core.LineInfoNode}, state::Core.Compiler.InliningState{Core.Compiler.EdgeTracker, Core.Compiler.WorldView{Core.Compiler.InternalCodeCache}, Core.Compiler.NativeInterpreter}, propagate_inbounds::Bool) at inlining.jl:77", - "id": 424 - }, - { "loc": "jl_toplevel_eval_flex at toplevel.c:691", "id": 21 }, - { "loc": "jl_generate_fptr_impl at jitlayers.cpp:325", "id": 208 }, - { "loc": "jl_decode_value at ircode.c:611", "id": 243 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:93", - "id": 261 - }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:441", - "id": 396 - }, - { - "loc": "repl_backend_loop(backend::REPL.REPLBackend) at REPL.jl:245", - "id": 35 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:571", - "id": 408 - }, - { - "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool, withfirst::Bool) at inferenceresult.jl:98", - "id": 219 - }, - { "loc": "BasicBlock at basicblock.jl:25 [inlined]", "id": 319 }, - { - "loc": "run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool) at client.jl:388", - "id": 45 - }, - { - "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:643", - "id": 429 - }, - { "loc": "jl_mt_assoc_by_type at gf.c:1197", "id": 180 }, - { - "loc": "sprint(::Function, ::Vector{SubString{String}}, ::Vararg{Any}; context::Nothing, sizehint::Int64) at io.jl:108", - "id": 77 - }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:132", - "id": 281 - }, - { - "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:193", - "id": 329 - }, - { "loc": "similar at abstractarray.jl:789 [inlined]", "id": 363 }, - { - "loc": "matching_cache_argtypes(linfo::Core.MethodInstance, #unused#::Nothing, va_override::Bool) at inferenceresult.jl:199", - "id": 232 - }, - { - "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1047", - "id": 439 - }, - { "loc": "_array_for at array.jl:673 [inlined]", "id": 90 }, - { "loc": "env_project_file(env::String) at loading.jl:390", "id": 144 }, - { "loc": "ijl_eqtable_put at iddict.c:147", "id": 204 }, - { "loc": "IRCode at ir.jl:288 [inlined]", "id": 326 }, - { "loc": "similar at abstractarray.jl:800 [inlined]", "id": 311 }, - { "loc": "_replace at util.jl:662 [inlined]", "id": 118 }, - { "loc": "copy_exprargs(x::Vector{Any}) at expr.jl:64", "id": 298 }, - { "loc": "Set at set.jl:11 [inlined]", "id": 141 }, - { - "loc": "typeinf_ext_toplevel(mi::Core.MethodInstance, world::UInt64) at typeinfer.jl:941", - "id": 213 - }, - { "loc": "ijl_uncompress_ir at ircode.c:810", "id": 240 }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:613", - "id": 371 - }, - { - "loc": "scan_slot_def_use(nargs::Int64, ci::Core.CodeInfo, code::Vector{Any}) at slot2ssa.jl:40", - "id": 365 - }, - { - "loc": "match(re::Regex, str::String, idx::Int64, add_opts::UInt32) at regex.jl:396", - "id": 99 - }, - { "loc": "splitdir at path.jl:132 [inlined]", "id": 96 }, - { "loc": "copy! at domtree.jl:104 [inlined]", "id": 343 }, - { - "loc": "sptypes_from_meth_instance(linfo::Core.MethodInstance) at inferencestate.jl:265", - "id": 254 - }, - { "loc": "ijl_specializations_get_linfo at gf.c:176", "id": 199 }, - { "loc": "stupdate! at typelattice.jl:396 [inlined]", "id": 284 }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:682", - "id": 376 - }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:79", - "id": 255 - }, - { "loc": "jl_table_assign_bp at iddict.c:41", "id": 203 }, - { "loc": "ijl_toplevel_eval at toplevel.c:897 [inlined]", "id": 31 }, - { "loc": "ijl_get_nth_field at datatype.c:1427", "id": 101 }, - { - "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:196", - "id": 331 - }, - { "loc": "_start() at sys.dylib:?", "id": 48 }, - { - "loc": "run_repl(repl::REPL.AbstractREPL, consumer::Any) at REPL.jl:354", - "id": 38 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:612", - "id": 412 - }, - { "loc": "_new_array_ at array.c:127", "id": 4 }, - { "loc": "isfile_casesensitive(path::String) at loading.jl:51", "id": 109 }, - { "loc": "stat(path::String) at stat.jl:149", "id": 82 }, - { "loc": "ijl_string_to_array at array.c:288", "id": 72 }, - { "loc": "identify_package(name::String) at loading.jl:297", "id": 146 }, - { "loc": "update_domtree! at domtree.jl:218 [inlined]", "id": 354 }, - { "loc": "jl_typemap_alloc at typemap.c:1276", "id": 201 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:110", - "id": 276 - }, - { - "loc": "finish(compact::Core.Compiler.IncrementalCompact) at ir.jl:1438", - "id": 422 - }, - { "loc": "string at intfuncs.jl:787 [inlined]", "id": 116 }, - { - "loc": "typeinf_nocycle(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at abstractinterpretation.jl:2128", - "id": 286 - }, - { - "loc": "type_annotate!(sv::Core.Compiler.InferenceState, run_optimizer::Bool) at typeinfer.jl:630", - "id": 294 - }, - { - "loc": "match(re::Regex, str::String, idx::Int64, add_opts::UInt32) at regex.jl:393", - "id": 92 - }, - { - "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1095", - "id": 442 - }, - { "loc": "eval_body at interpreter.c:560", "id": 22 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:248", - "id": 236 - }, - { - "loc": "(::Base.var\"#933#935\"{Bool, Bool, Bool})(REPL::Module) at client.jl:403", - "id": 40 - }, - { - "loc": "project_file_name_uuid(project_file::String, name::String) at loading.jl:468", - "id": 169 - }, - { - "loc": "getindex(#unused#::Type{Any}, vals::Any) at array.jl:417", - "id": 226 - }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:496", - "id": 321 - }, - { - "loc": "replace(str::String, pat_repl::Pair{Char, UInt32}; count::Int64) at util.jl:704", - "id": 119 - }, - { "loc": "call_require at toplevel.c:428 [inlined]", "id": 19 }, - { "loc": "ijl_new_struct_uninit at datatype.c:1348", "id": 246 }, - { - "loc": "construct_domtree(blocks::Vector{Core.Compiler.BasicBlock}) at domtree.jl:204", - "id": 334 - }, - { "loc": "DomTree at domtree.jl:200 [inlined]", "id": 333 }, - { - "loc": "dec(x::UInt32, pad::Int64, neg::Bool) at intfuncs.jl:703", - "id": 114 - }, - { - "loc": "implicit_project_deps_get(dir::String, name::String) at loading.jl:682", - "id": 160 - }, - { - "loc": "update_level!(nodes::Vector{Core.Compiler.DomTreeNode}, node::Int64, level::Int64) at domtree.jl:236", - "id": 357 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:612", - "id": 370 - }, - { "loc": "require(into::Module, mod::Symbol) at sys.dylib:?", "id": 15 }, - { "loc": "jl_repl_entrypoint at jlapi.c:706", "id": 50 }, - { - "loc": "_splitdir_nodrive(a::String, b::String) at path.jl:143", - "id": 107 - }, - { "loc": "eval_body at interpreter.c:0", "id": 184 }, - { "loc": "ijl_toplevel_eval_in at toplevel.c:947", "id": 32 }, - { - "loc": "scan_slot_def_use(nargs::Int64, ci::Core.CodeInfo, code::Vector{Any}) at slot2ssa.jl:38", - "id": 359 - }, - { "loc": "_collect at array.jl:646 [inlined]", "id": 253 }, - { "loc": "getindex at tuple.jl:29 [inlined]", "id": 104 }, - { "loc": "jl_decode_value_expr at ircode.c:496 [inlined]", "id": 242 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:432", - "id": 444 - }, - { "loc": "jl_exprn at builtins.c:1281", "id": 241 }, - { "loc": "resize! at array.jl:1233 [inlined]", "id": 339 }, - { - "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:533", - "id": 164 - }, - { "loc": "invokelatest at essentials.jl:729 [inlined]", "id": 44 }, - { "loc": "getindex at array.jl:412 [inlined]", "id": 346 }, - { - "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:818", - "id": 435 - }, - { "loc": "ijl_alloc_array_1d at array.c:441", "id": 6 }, - { "loc": "Type at iobuffer.jl:112 [inlined]", "id": 76 }, - { "loc": "jl_new_array_for_deserialization at array.c:199", "id": 238 }, - { "loc": "eval_import_path at toplevel.c:465", "id": 20 }, - { "loc": "_similar_for at array.jl:665 [inlined]", "id": 313 }, - { - "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:191", - "id": 324 - }, - { "loc": "update_domtree! at domtree.jl:217 [inlined]", "id": 349 }, - { - "loc": "typeinf_local(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at abstractinterpretation.jl:2070", - "id": 285 - }, - { - "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1064", - "id": 440 - }, - { - "loc": "finish(me::Core.Compiler.InferenceState, interp::Core.Compiler.NativeInterpreter) at typeinfer.jl:428", - "id": 292 - }, - { "loc": "macro expansion at loading.jl:399 [inlined]", "id": 158 }, - { "loc": "jl_alloc_int_1d at smallintset.c:80 [inlined]", "id": 196 }, - { - "loc": "Core.Compiler.BitSet(itr::Core.Compiler.UnitRange{Int64}) at bitset.jl:29", - "id": 378 - }, - { "loc": "load_path_expand(env::String) at initdefs.jl:262", "id": 123 }, - { "loc": "unsafe_wrap at string.jl:85 [inlined]", "id": 73 }, - { "loc": "copy! at domtree.jl:102 [inlined]", "id": 341 }, - { - "loc": "copy!(dst::Vector{Core.Compiler.DomTreeNode}, src::Vector{Core.Compiler.DomTreeNode}) at abstractarray.jl:877", - "id": 356 - }, - { - "loc": "cache_result!(interp::Core.Compiler.NativeInterpreter, result::Core.Compiler.InferenceResult) at typeinfer.jl:393", - "id": 452 - }, - { "loc": "BitSet at bitset.jl:18 [inlined]", "id": 265 }, - { - "loc": "ssa_inlining_pass!(ir::Core.Compiler.IRCode, linetable::Vector{Core.LineInfoNode}, state::Core.Compiler.InliningState{Core.Compiler.EdgeTracker, Core.Compiler.WorldView{Core.Compiler.InternalCodeCache}, Core.Compiler.NativeInterpreter}, propagate_inbounds::Bool) at sys.dylib:?", - "id": 425 - }, - { - "loc": "string(n::UInt32; base::Int64, pad::Int64) at intfuncs.jl:796", - "id": 115 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:672", - "id": 374 - }, - { - "loc": "DFS!(D::Core.Compiler.DFSTree, blocks::Vector{Core.Compiler.BasicBlock}) at domtree.jl:114", - "id": 347 - }, - { "loc": "ijl_take_buffer at sys.c:484", "id": 448 }, - { - "loc": "entry_point_and_project_file_inside at loading.jl:517 [inlined]", - "id": 163 - }, - { "loc": "jl_type_infer at gf.c:295", "id": 215 }, - { "loc": "Array at baseext.jl:36 [inlined]", "id": 79 }, - { "loc": "smallintset_rehash at smallintset.c:173", "id": 197 }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:570", - "id": 403 - }, - { "loc": "isfile at stat.jl:456 [inlined]", "id": 85 }, - { "loc": "ijl_specializations_get_linfo at gf.c:151", "id": 191 }, - { "loc": "take!(io::IOBuffer) at iobuffer.jl:396", "id": 120 }, - { - "loc": "replace(str::String, pat_repl::Pair{Char, UInt32}; count::Int64) at util.jl:694", - "id": 111 - }, - { - "loc": "entry_point_and_project_file_inside at loading.jl:518 [inlined]", - "id": 165 - }, - { - "loc": "_collect(#unused#::Type{SubString{String}}, itr::Base.SplitIterator{String, Regex}, isz::Base.SizeUnknown) at array.jl:649", - "id": 51 - }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:424", - "id": 336 - }, - { "loc": "load_path_expand(env::String) at initdefs.jl:256", "id": 122 }, - { "loc": "load_path_expand(env::String) at initdefs.jl:265", "id": 126 }, - { "loc": "slot2reg at optimize.jl:523 [inlined]", "id": 360 }, - { "loc": "zeros at array.jl:585 [inlined]", "id": 80 }, - { "loc": "_new_array at array.c:193", "id": 5 }, - { "loc": "collect at array.jl:709 [inlined]", "id": 315 }, - { "loc": "ml_matches at gf.c:3154", "id": 193 }, - { - "loc": "entry_point_and_project_file_inside at loading.jl:520 [inlined]", - "id": 166 - }, - { - "loc": "Core.Compiler.InstructionStream(len::Int64) at ir.jl:192", - "id": 328 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:615", - "id": 373 - }, - { "loc": "similar at abstractarray.jl:835 [inlined]", "id": 88 }, - { "loc": "project_deps_get at loading.jl:420 [inlined]", "id": 157 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:382", - "id": 387 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:815", - "id": 384 - }, - { - "loc": "simple_dce!(compact::Core.Compiler.IncrementalCompact, callback::Function) at ir.jl:1411", - "id": 417 - }, - { - "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:668", - "id": 433 - }, - { - "loc": "implicit_project_deps_get(dir::String, name::String) at loading.jl:687", - "id": 170 - }, - { "loc": "match at regex.jl:402 [inlined]", "id": 94 }, - { "loc": "jl_lookup_generic_ at gf.c:2422 [inlined]", "id": 181 }, - { "loc": "Dict{Any, Nothing}() at dict.jl:90", "id": 129 }, - { "loc": "similar at abstractarray.jl:791 [inlined]", "id": 312 }, - { - "loc": "SNCA!(domtree::Core.Compiler.DomTree, blocks::Vector{Core.Compiler.BasicBlock}, max_pre::Int64) at domtree.jl:343", - "id": 352 - }, - { "loc": "load_path_expand(env::String) at initdefs.jl:252", "id": 59 }, - { "loc": "simple_dce! at ir.jl:1411 [inlined]", "id": 418 }, - { - "loc": "(::Base.var\"#861#862\"{String, Base.TOMLCache})() at loading.jl:257", - "id": 152 - }, - { - "loc": "start_repl_backend(backend::REPL.REPLBackend, consumer::Any) at REPL.jl:230", - "id": 36 - }, - { "loc": "ijl_apply_generic at gf.c:2447", "id": 182 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:433", - "id": 445 - }, - { "loc": "ijl_new_bits at datatype.c:808", "id": 100 }, - { - "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1045", - "id": 436 - }, - { - "loc": "type_lift_pass!(ir::Core.Compiler.IRCode) at passes.jl:1099", - "id": 443 - }, - { - "loc": "compute_domtree_nodes!(domtree::Core.Compiler.DomTree) at domtree.jl:231", - "id": 358 - }, - { "loc": "my_sortperm(v::Vector{Int64}) at ir.jl:533", "id": 407 }, - { "loc": "jl_system_image_data at sys.dylib:?", "id": 28 }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:280", - "id": 453 - }, - { "loc": "exec_options(opts::Base.JLOptions) at client.jl:318", "id": 46 }, - { - "loc": "entry_point_and_project_file(dir::String, name::String) at loading.jl:534", - "id": 168 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:814", - "id": 383 - }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:427", - "id": 426 - }, - { "loc": "setdiff at abstractset.jl:209 [inlined]", "id": 382 }, - { "loc": "load_path_expand(env::String) at initdefs.jl:272", "id": 57 }, - { - "loc": "compute_basic_blocks(stmts::Vector{Any}) at ir.jl:86", - "id": 316 - }, - { "loc": "ijl_uncompress_ir at ircode.c:802", "id": 237 }, - { "loc": "Array at boot.jl:466 [inlined]", "id": 323 }, - { "loc": "Dict{String, Union{Bool, String}}() at dict.jl:90", "id": 136 }, - { "loc": "jl_f_getfield at builtins.c:890", "id": 103 }, - { "loc": "ijl_uncompress_ir at ircode.c:792", "id": 234 }, - { - "loc": "run_passes(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:423", - "id": 300 - }, - { "loc": "ip:0xbc42", "id": 26 }, - { "loc": "do_call at interpreter.c:126", "id": 183 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:117", - "id": 279 - }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:501", - "id": 400 - }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:83", - "id": 258 - }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:441", - "id": 299 - }, - { - "loc": "_collect(#unused#::Type{Int64}, itr::Core.Compiler.Generator{Core.Compiler.Iterators.Filter{Core.Compiler.var\"#361#368\"{Core.Compiler.IdDict{Int64, Int64}}, Vector{Int64}}, Core.Compiler.var\"#360#367\"{Int64, Core.Compiler.IdDict{Int64, Int64}, Vector{Int64}}}, isz::Core.Compiler.SizeUnknown) at array.jl:649", - "id": 397 - }, - { - "loc": "eval_user_input(ast::Any, backend::REPL.REPLBackend) at REPL.jl:151", - "id": 34 - }, - { "loc": "CodeInstance at boot.jl:421 [inlined]", "id": 455 }, - { "loc": "convert at set.jl:442 [inlined]", "id": 142 }, - { "loc": "sprint at io.jl:108 [inlined]", "id": 69 }, - { "loc": "falses at bitarray.jl:403 [inlined]", "id": 231 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:86", - "id": 259 - }, - { "loc": "make_method_match at gf.c:2639 [inlined]", "id": 175 }, - { - "loc": "lock(f::Base.var\"#861#862\"{String, Base.TOMLCache}, l::ReentrantLock) at lock.jl:183", - "id": 153 - }, - { - "loc": "replace(str::String, pat_repl::Pair{Char, UInt32}; count::Int64) at util.jl:730", - "id": 121 - }, - { - "loc": "matching_cache_argtypes(linfo::Core.MethodInstance, #unused#::Nothing, va_override::Bool) at inferenceresult.jl:197", - "id": 222 - }, - { "loc": "ip:0xc442", "id": 185 }, - { "loc": "macro expansion at loading.jl:989 [inlined]", "id": 12 }, - { "loc": "jl_array_grow_at_end at array.c:911", "id": 63 }, - { "loc": "BitArray at bitarray.jl:71 [inlined]", "id": 229 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, src::Core.CodeInfo, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:82", - "id": 257 - }, - { "loc": "similar at abstractarray.jl:834 [inlined]", "id": 89 }, - { - "loc": "Dict{String, Union{Bool, String}}(kv::Dict{Any, Any}) at dict.jl:101", - "id": 137 - }, - { - "loc": "copy!(dst::Vector{Int64}, src::Vector{Int64}) at abstractarray.jl:877", - "id": 340 - }, - { "loc": "convert at abstractdict.jl:559 [inlined]", "id": 134 }, - { "loc": "jl_typemap_intersection_node_visitor at typemap.c:0", "id": 177 }, - { "loc": "ijl_uncompress_ir at ircode.c:816", "id": 250 }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:383", - "id": 389 - }, - { "loc": "require(into::Module, mod::Symbol) at loading.jl:988", "id": 14 }, - { - "loc": "Dict{String, Union{Nothing, String}}() at dict.jl:90", - "id": 138 - }, - { - "loc": "(::Base.var\"#933#935\"{Bool, Bool, Bool})(REPL::Module) at sys.dylib:?", - "id": 41 - }, - { "loc": "jl_get_specialized at method.c:609", "id": 190 }, - { "loc": "copy! at domtree.jl:103 [inlined]", "id": 342 }, - { "loc": "normpath(path::String) at path.jl:375", "id": 55 }, - { "loc": "jl_decode_value_array at ircode.c:434", "id": 239 }, - { - "loc": "getindex(#unused#::Type{Any}, vals::Any) at sys.dylib:?", - "id": 217 - }, - { "loc": "ijl_get_nth_field_checked at datatype.c:1443", "id": 102 }, - { - "loc": "sroa_pass!(ir::Core.Compiler.IRCode) at passes.jl:645", - "id": 431 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:907", - "id": 388 - }, - { - "loc": "Core.Compiler.DFSTree(n_blocks::Int64) at domtree.jl:88", - "id": 332 - }, - { "loc": "fill at array.jl:533 [inlined]", "id": 270 }, - { "loc": "_growend! at array.jl:1008 [inlined]", "id": 64 }, - { "loc": "jl_type_infer at gf.c:277", "id": 207 }, - { "loc": "jl_decode_value at ircode.c:0", "id": 247 }, - { "loc": "falses(dims::Tuple{Int64}) at bitarray.jl:405", "id": 230 }, - { - "loc": "Core.Compiler.InferenceState(result::Core.Compiler.InferenceResult, cache::Symbol, interp::Core.Compiler.NativeInterpreter) at inferencestate.jl:251", - "id": 256 - }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:602", - "id": 369 - }, - { "loc": "isdir at stat.jl:456 [inlined]", "id": 83 }, - { - "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1077", - "id": 441 - }, - { "loc": "Set at set.jl:12 [inlined]", "id": 131 }, - { - "loc": "most_general_argtypes(method::Method, specTypes::Any, isva::Bool) at inferenceresult.jl:97", - "id": 220 - }, - { "loc": "jl_f__call_latest at builtins.c:757", "id": 42 }, - { "loc": "ml_matches at gf.c:2784", "id": 178 }, - { "loc": "#split#422 at util.jl:593 [inlined]", "id": 53 }, - { "loc": "CachedMethodTable at methodtable.jl:52 [inlined]", "id": 280 }, - { "loc": "NewNodeStream at ir.jl:269 [inlined]", "id": 325 }, - { - "loc": "construct_ssa!(ci::Core.CodeInfo, ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree, defuses::Vector{Core.Compiler.SlotInfo}, slottypes::Vector{Any}) at slot2ssa.jl:594", - "id": 367 - }, - { "loc": "ijl_compress_ir at ircode.c:760", "id": 449 }, - { - "loc": "_typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState) at typeinfer.jl:244", - "id": 297 - }, - { "loc": "IncrementalCompact at ir.jl:570 [inlined]", "id": 428 }, - { "loc": "jl_interpret_toplevel_thunk at interpreter.c:739", "id": 24 }, - { - "loc": "adce_pass!(ir::Core.Compiler.IRCode) at passes.jl:1046", - "id": 438 - }, - { "loc": "macro expansion at loading.jl:396 [inlined]", "id": 143 }, - { "loc": "retrieve_code_info at utilities.jl:128 [inlined]", "id": 235 }, - { - "loc": "ijl_new_method_instance_uninit at method.c:413 [inlined]", - "id": 189 - }, - { - "loc": "domsort_ssa!(ir::Core.Compiler.IRCode, domtree::Core.Compiler.DomTree) at slot2ssa.jl:432", - "id": 394 - }, - { - "loc": "maybe_compress_codeinfo(interp::Core.Compiler.NativeInterpreter, linfo::Core.MethodInstance, ci::Core.CodeInfo) at typeinfer.jl:348", - "id": 450 - }, - { - "loc": "active_project(search_load_path::Bool) at initdefs.jl:293", - "id": 58 - }, - { - "loc": "Core.Compiler.IncrementalCompact(code::Core.Compiler.IRCode, allow_cfg_transforms::Bool) at ir.jl:613", - "id": 413 - }, - { "loc": "slot2reg at optimize.jl:524 [inlined]", "id": 368 }, - { - "loc": "sprint(::Function, ::Vector{SubString{String}}, ::Vararg{Any}; context::Nothing, sizehint::Int64) at io.jl:107", - "id": 68 - }, - { - "loc": "convert_to_ircode(ci::Core.CodeInfo, sv::Core.Compiler.OptimizationState) at optimize.jl:490", - "id": 307 - }, - { - "loc": "typeinf_ext(interp::Core.Compiler.NativeInterpreter, mi::Core.MethodInstance) at typeinfer.jl:912", - "id": 289 - }, - { "loc": "copy_exprs(x::Any) at expr.jl:42", "id": 304 }, - { "loc": "Array at boot.jl:461 [inlined]", "id": 78 }, - { "loc": "ijl_specializations_get_linfo at gf.c:155", "id": 195 }, - { "loc": "isfile_casesensitive(path::String) at loading.jl:48", "id": 98 } - ], - "types": [ - { "name": "Vector{Union{Nothing, Vector{Any}}}", "id": 29 }, - { "name": "Vector{Tuple{Int64, Int64, Bool}}", "id": 41 }, - { "name": "Vector{Union{Nothing, String}}", "id": 12 }, - { "name": "Tuple{Vector{SubString{String}}, String}", "id": 3 }, - { "name": "Core.Compiler.EdgeTracker", "id": 50 }, - { "name": "Core.ReturnNode", "id": 24 }, - { "name": "Vector{Core.Compiler.DomTreeNode}", "id": 40 }, - { "name": "Vector{UInt64}", "id": 21 }, - { "name": "Core.MethodInstance", "id": 15 }, - { "name": "Vector{Core.Compiler.InferenceResult}", "id": 19 }, - { "name": "Vector{Core.Compiler.InferenceState}", "id": 33 }, - { "name": "Vector{Core.Compiler.SNCAData}", "id": 39 }, - { "name": "Vector{Vector{Int64}}", "id": 44 }, - { "name": "Vector{Bool}", "id": 34 }, - { "name": "Vector{Base.UUID}", "id": 10 }, - { "name": "Vector{Core.Compiler.NewNodeInfo}", "id": 38 }, - { - "name": "Vector{Pair{Core.Compiler.NewSSAValue, Core.PhiNode}}", - "id": 46 - }, - { - "name": "Vector{Union{Nothing, Vector{Core.Compiler.VarState}}}", - "id": 28 - }, - { "name": "Vector{Core.SSAValue}", "id": 47 }, - { "name": "Vector{Union{Nothing, SubString{String}}}", "id": 5 }, - { "name": "Core.TypeMapEntry", "id": 17 }, - { "name": "Vector{Union{Bool, String}}", "id": 11 }, - { "name": "Core.SimpleVector", "id": 16 }, - { "name": "Vector{Core.Compiler.BasicBlock}", "id": 36 }, - { - "name": "Vector{Vector{Pair{Core.Compiler.NewSSAValue, Core.PhiNode}}}", - "id": 45 - }, - { "name": "Core.LineInfoNode", "id": 25 }, - { "name": "Vector{Tuple{Int64, Int64}}", "id": 42 }, - { "name": "Core.CodeInfo", "id": 22 }, - { "name": "Vector{Pair{Int64, Any}}", "id": 49 }, - { "name": "Vector{Symbol}", "id": 26 }, - { "name": "Vector{Tuple{Core.Compiler.InferenceState, Int64}}", "id": 32 }, - { "name": "Vector{SubString{String}}", "id": 1 }, - { "name": "UInt64", "id": 18 }, - { "name": "Tuple{String, String}", "id": 13 }, - { "name": "Vector{Core.Compiler.VarState}", "id": 30 }, - { "name": "Vector{Tuple{Int64, Int64, Vector{Any}}}", "id": 48 }, - { "name": "Vector{Core.Compiler.BitSet}", "id": 31 }, - { "name": "Vector{String}", "id": 0 }, - { "name": "Core.CodeInstance", "id": 51 }, - { "name": "Vector{Nothing}", "id": 9 }, - { "name": "SubString{String}", "id": 7 }, - { "name": "Vector{UInt8}", "id": 4 }, - { "name": "Expr", "id": 23 }, - { "name": "Core.MethodMatch", "id": 14 }, - { "name": "Vector{Any}", "id": 8 }, - { "name": "Nothing", "id": 2 }, - { "name": "Tuple{DataType}", "id": 20 }, - { "name": "Vector{Core.LineInfoNode}", "id": 37 }, - { "name": "Vector{Core.Compiler.SlotInfo}", "id": 43 }, - { "name": "Vector{Int64}", "id": 6 }, - { "name": "Vector{Int32}", "id": 27 }, - { - "name": "Vector{Tuple{Core.Compiler.InferenceResult, Vector{Any}, Bool}}", - "id": 35 - } - ] -} diff --git a/stdlib/AllocProfile/test/runtests.jl b/stdlib/AllocProfile/test/runtests.jl deleted file mode 100644 index d7a8166a79e50..0000000000000 --- a/stdlib/AllocProfile/test/runtests.jl +++ /dev/null @@ -1,69 +0,0 @@ -# TODO: register AllocProfile in the stdlib -using Pkg; Pkg.activate("stdlib/AllocProfile") - -using Test - -using AllocProfile - -@testset "alloc profiler doesn't segfault" begin - res, profile = AllocProfile.@profile skip_every=0 begin - # test the allocations during compilation - using Base64 - # make sure some frees show up in the profile - GC.gc() - end - - @test length(profile.allocs) > 0 - first_alloc = profile.allocs[1] - @test first_alloc.size > 0 - @test length(first_alloc.stacktrace) > 0 - @test length(string(first_alloc.type)) > 0 - - @test length(profile.frees) > 0 -end - -@testset "works when there are multiple tasks on multiple threads" begin - NUM_TASKS = 1000 - - # TODO: is this always true in CI? - @test Threads.nthreads() > 1 - - function do_work() - ch = Channel{Vector{Int}}(Inf) - @sync for i in 1:NUM_TASKS - Threads.@spawn begin - # generate garbage - put!(ch, zeros(100)) - end - end - close(ch) - # for obj in ch - # # ... - # end - GC.gc() - end - - # call once to make sure it's compiled - do_work() - - res, profile = AllocProfile.@profile skip_every=0 begin - do_work() - end - - # expecting at least 3 allocations per task: - # 1. the task - # 2. the vector - # 3. the buffer inside the vector - @test length(profile.allocs) >= 3*NUM_TASKS - println(length(profile.allocs)) - first_alloc = profile.allocs[1] - @test first_alloc.size > 0 - @test length(first_alloc.stacktrace) > 0 - @test length(string(first_alloc.type)) > 0 - - @test length(profile.frees) > 0 - - # TODO: it would be nice to assert that these tasks - # were actually scheduled onto multiple threads, - # and we see allocs from all threads in the profile -end diff --git a/stdlib/AllocProfile/test/runtests_raw.jl b/stdlib/AllocProfile/test/runtests_raw.jl deleted file mode 100644 index b586800330a60..0000000000000 --- a/stdlib/AllocProfile/test/runtests_raw.jl +++ /dev/null @@ -1,10 +0,0 @@ -include("stdlib/AllocProfile/src/AllocProfile.jl") - -ccall(:jl_start_alloc_profile, Cvoid, (Cint,), 0) - -using Base64 - -raw_results = ccall(:jl_stop_alloc_profile, AllocProfile.RawAllocResults, ()) -raw_alloc = unsafe_load(raw_results.allocs, 3) -AllocProfile._reformat_bt(raw_alloc.backtrace) - diff --git a/stdlib/AllocProfile/src/AllocProfile.jl b/stdlib/Profile/src/AllocProfile.jl similarity index 100% rename from stdlib/AllocProfile/src/AllocProfile.jl rename to stdlib/Profile/src/AllocProfile.jl diff --git a/stdlib/Profile/src/Profile.jl b/stdlib/Profile/src/Profile.jl index 3409e79bdb128..b369df05aea24 100644 --- a/stdlib/Profile/src/Profile.jl +++ b/stdlib/Profile/src/Profile.jl @@ -1139,4 +1139,6 @@ function warning_empty(;summary = false) end end +include("AllocProfile.jl") + end # module diff --git a/stdlib/Profile/test/runtests.jl b/stdlib/Profile/test/runtests.jl index ac7c8baefe09e..e48975bc9562f 100644 --- a/stdlib/Profile/test/runtests.jl +++ b/stdlib/Profile/test/runtests.jl @@ -219,3 +219,67 @@ end node = root.down[stackframe(:f1, :file1, 2)] @test only(node.down).first == lidict[8] end + +@testset "alloc profiler doesn't segfault" begin + res, profile = AllocProfile.@profile skip_every=0 begin + # test the allocations during compilation + using Base64 + # make sure some frees show up in the profile + GC.gc() + end + + @test length(profile.allocs) > 0 + first_alloc = profile.allocs[1] + @test first_alloc.size > 0 + @test length(first_alloc.stacktrace) > 0 + @test length(string(first_alloc.type)) > 0 + + @test length(profile.frees) > 0 +end + +@testset "alloc profiler works when there are multiple tasks on multiple threads" begin + NUM_TASKS = 1000 + + # TODO: is this always true in CI? + @test Threads.nthreads() > 1 + + function do_work() + ch = Channel{Vector{Int}}(Inf) + @sync for i in 1:NUM_TASKS + Threads.@spawn begin + # generate garbage + put!(ch, zeros(100)) + end + end + close(ch) + # for obj in ch + # # ... + # end + GC.gc() + end + + # call once to make sure it's compiled + do_work() + + res, profile = AllocProfile.@profile skip_every=0 begin + do_work() + end + + # expecting at least 3 allocations per task: + # 1. the task + # 2. the vector + # 3. the buffer inside the vector + @test length(profile.allocs) >= 3*NUM_TASKS + println(length(profile.allocs)) + first_alloc = profile.allocs[1] + @test first_alloc.size > 0 + @test length(first_alloc.stacktrace) > 0 + @test length(string(first_alloc.type)) > 0 + + @test length(profile.frees) > 0 + + # TODO: it would be nice to assert that these tasks + # were actually scheduled onto multiple threads, + # and we see allocs from all threads in the profile +end + From 83ef9eaf251f0e922c6d11ec95b8025037c06fe3 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 22 Dec 2021 15:49:42 -0500 Subject: [PATCH 053/107] rename AllocProfile => Profile.Allocs --- stdlib/Profile/src/{AllocProfile.jl => Allocs.jl} | 2 +- stdlib/Profile/src/Profile.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename stdlib/Profile/src/{AllocProfile.jl => Allocs.jl} (99%) diff --git a/stdlib/Profile/src/AllocProfile.jl b/stdlib/Profile/src/Allocs.jl similarity index 99% rename from stdlib/Profile/src/AllocProfile.jl rename to stdlib/Profile/src/Allocs.jl index 748da82d14bcf..4182380182c6f 100644 --- a/stdlib/Profile/src/AllocProfile.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -1,4 +1,4 @@ -module AllocProfile +module Allocs using Base.StackTraces: StackTrace, StackFrame, lookup using Base: InterpreterIP diff --git a/stdlib/Profile/src/Profile.jl b/stdlib/Profile/src/Profile.jl index b369df05aea24..f969df5ed040e 100644 --- a/stdlib/Profile/src/Profile.jl +++ b/stdlib/Profile/src/Profile.jl @@ -1139,6 +1139,6 @@ function warning_empty(;summary = false) end end -include("AllocProfile.jl") +include("Allocs.jl") end # module From 44073ef86fea13757a5a6d89f945443ecda1c141 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 5 Jan 2022 21:07:19 -0500 Subject: [PATCH 054/107] load types: stop using threshold hack; just check for jl_buff_tag --- stdlib/Profile/src/Allocs.jl | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 4182380182c6f..787883fa23dee 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -100,15 +100,19 @@ end const BacktraceEntry = Union{Ptr{Cvoid}, InterpreterIP} const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} -# loading anything below this seems to segfault -# TODO: find out what's going on -TYPE_PTR_LOW_THRESHOLD = 0x0000000100000000 +# copied from julia_internal.h +const JL_BUFF_TAG = UInt(0x4eadc000) + +struct CorruptType end +struct BufferType end function load_type(ptr::Ptr{Type}) - if TYPE_PTR_LOW_THRESHOLD < UInt(ptr) - return unsafe_pointer_to_objref(ptr) + if UInt(ptr) < UInt(4096) + return CorruptType + elseif UInt(ptr) == JL_BUFF_TAG + return BufferType end - return Missing + return unsafe_pointer_to_objref(ptr) end function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc From b3e5102550d599683620fe1f6778178b7991e430 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 5 Jan 2022 23:07:48 -0500 Subject: [PATCH 055/107] remove unused struct --- src/gc-alloc-profiler.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index cf19712f92079..faadb3c4c4d86 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -10,11 +10,6 @@ extern "C" { #endif -struct TypeNamePair { - size_t addr; - const char *name; -}; - struct FreeInfo { size_t type_addr; size_t count; From 0fd988b852d1ab529803961238f6152f3aed073f Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 5 Jan 2022 23:51:19 -0500 Subject: [PATCH 056/107] remove unused `profile` function the macro is preferred --- stdlib/Profile/src/Allocs.jl | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 787883fa23dee..ef04ece4e817c 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -69,17 +69,6 @@ function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) end -# top-level entry point -# TODO: should probably be a macro instead of a -# higher-order function -function profile(f::Function, skip_every::Int=0) - start(skip_every) - res = f() - profile = stop() - clear() - return res, profile -end - # decoded results struct Alloc From 0119ce3759ba4d472d65debb167a4a3b649c9d7b Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 5 Jan 2022 23:50:57 -0500 Subject: [PATCH 057/107] first hack at fetch API --- src/gc-alloc-profiler.cpp | 19 +++++++++++-------- src/gc-alloc-profiler.h | 3 ++- stdlib/Profile/src/Allocs.jl | 15 +++++++++------ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 3cb7600443d67..6b5e607a6aaa2 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -81,7 +81,17 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { extern "C" { // Needed since the function doesn't take any arguments. -JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { +JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { + // TODO: check that the results exist + return RawAllocResults{ + g_combined_results.combined_allocs.data(), + g_combined_results.combined_allocs.size(), + g_combined_results.combined_frees.data(), + g_combined_results.combined_frees.size() + }; +} + +JL_DLLEXPORT void jl_stop_alloc_profile() { g_alloc_profile_enabled = false; // combine allocs @@ -101,13 +111,6 @@ JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile() { }); } } - - return RawAllocResults{ - g_combined_results.combined_allocs.data(), - g_combined_results.combined_allocs.size(), - g_combined_results.combined_frees.data(), - g_combined_results.combined_frees.size() - }; } JL_DLLEXPORT void jl_free_alloc_profile() { diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index faadb3c4c4d86..b90a7101e1fd3 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -24,7 +24,8 @@ struct RawAllocResults { }; JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); -JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile(void); +JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile(void); +JL_DLLEXPORT void jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index ef04ece4e817c..bfba3f0ca3d51 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -49,9 +49,8 @@ function _prof_expr(expr, opts) quote $start(; $(esc(opts))) local res = $(esc(expr)) - local profile = $stop() - $clear() - (res, profile) + $stop() + res end end @@ -60,15 +59,19 @@ function start(; skip_every::Int) end function stop() - raw_results = ccall(:jl_stop_alloc_profile, RawAllocResults, ()) - decoded_results = decode(raw_results) - return decoded_results + ccall(:jl_stop_alloc_profile, RawAllocResults, ()) end function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) end +function fetch() + raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) + decoded_results = decode(raw_results) + return decoded_results +end + # decoded results struct Alloc From 9d06356086bd3d3c924727df7372390dfdfbc426 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 5 Jan 2022 21:56:41 -0500 Subject: [PATCH 058/107] switch to uniform sampling with rand() instead of recording any N allocs --- src/gc-alloc-profiler.cpp | 21 ++++++++------------- src/gc-alloc-profiler.h | 2 +- stdlib/Profile/src/Allocs.jl | 6 +++--- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 6b5e607a6aaa2..117a266eddff9 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -28,13 +28,10 @@ struct PerThreadAllocProfile { vector allocs; unordered_map type_address_by_value_address; unordered_map frees_by_type_address; - - size_t alloc_counter; - size_t last_recorded_alloc; }; struct AllocProfile { - int skip_every; + double sample_rate; vector per_thread_profiles; }; @@ -69,8 +66,8 @@ RawBacktrace get_raw_backtrace() { // == exported interface == -JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) { - g_alloc_profile = AllocProfile{skip_every}; +JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { + g_alloc_profile = AllocProfile{sample_rate}; for (int i = 0; i < jl_n_threads; i++) { g_alloc_profile.per_thread_profiles.push_back(PerThreadAllocProfile{}); @@ -131,20 +128,18 @@ JL_DLLEXPORT void jl_free_alloc_profile() { void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { auto& global_profile = g_alloc_profile; - auto& profile = global_profile.per_thread_profiles[jl_threadid()]; - profile.alloc_counter++; - auto diff = profile.alloc_counter - profile.last_recorded_alloc; - if (diff < g_alloc_profile.skip_every) { + auto sample_val = double(rand()) / double(RAND_MAX); + auto should_record = sample_val <= global_profile.sample_rate; + if (!should_record) { return; } - profile.last_recorded_alloc = profile.alloc_counter; auto type = (jl_datatype_t*)jl_typeof(val); - + // TODO: this info is later used when counting frees, but is that + // necessary? profile.type_address_by_value_address[(size_t)val] = (size_t)type; - profile.allocs.emplace_back(RawAlloc{ type, get_raw_backtrace(), diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index b90a7101e1fd3..be54e9cca0bfb 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -23,7 +23,7 @@ struct RawAllocResults { size_t num_frees; }; -JL_DLLEXPORT void jl_start_alloc_profile(int skip_every); +JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate); JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile(void); JL_DLLEXPORT void jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index bfba3f0ca3d51..c7f71cf04d1ad 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -42,7 +42,7 @@ macro profile(opts, ex) _prof_expr(ex, opts) end macro profile(ex) - _prof_expr(ex, :(skip_every=1000)) + _prof_expr(ex, :(sample_rate=1.0)) end function _prof_expr(expr, opts) @@ -54,8 +54,8 @@ function _prof_expr(expr, opts) end end -function start(; skip_every::Int) - ccall(:jl_start_alloc_profile, Cvoid, (Cint,), skip_every) +function start(; sample_rate::Float64) + ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), sample_rate) end function stop() From f0d7da448b8d00745dbb7a67a5c9c641d79cd395 Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Thu, 6 Jan 2022 12:27:33 -0500 Subject: [PATCH 059/107] small default sample rate Co-authored-by: Nathan Daly --- stdlib/Profile/src/Allocs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index c7f71cf04d1ad..12f3c3174cf05 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -42,7 +42,7 @@ macro profile(opts, ex) _prof_expr(ex, opts) end macro profile(ex) - _prof_expr(ex, :(sample_rate=1.0)) + _prof_expr(ex, :(sample_rate=0.0001)) end function _prof_expr(expr, opts) From cecf3a139499d6f5341e80dd05d93a3bcdfc8896 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 12:31:19 -0500 Subject: [PATCH 060/107] update comment --- src/gc-alloc-profiler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 117a266eddff9..5b09dfdbd45c4 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -137,8 +137,8 @@ void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { } auto type = (jl_datatype_t*)jl_typeof(val); - // TODO: this info is later used when counting frees, but is that - // necessary? + // Used when counting frees. We can't get type type info then, + // because it gets corrupted during garbage collection. profile.type_address_by_value_address[(size_t)val] = (size_t)type; profile.allocs.emplace_back(RawAlloc{ type, From 545d06cd23b2e1eaf20a7a3acdefae46e7236b58 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 13:36:20 -0500 Subject: [PATCH 061/107] Comments + formatting cleanup for C files --- src/gc-alloc-profiler.cpp | 10 +++++++--- src/gc-alloc-profiler.h | 12 ++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 5b09dfdbd45c4..8a36f5aec9f2d 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -9,8 +9,8 @@ #include #include -using std::unordered_map; using std::string; +using std::unordered_map; using std::vector; struct RawBacktrace { @@ -24,6 +24,8 @@ struct RawAlloc { size_t size; }; +// == These structs define the global singleton profile buffer that will be used by +// callbacks to store profile results. == struct PerThreadAllocProfile { vector allocs; unordered_map type_address_by_value_address; @@ -41,19 +43,21 @@ struct CombinedResults { vector combined_frees; }; -// == global variables manipulated by callbacks == +// == Global variables manipulated by callbacks == AllocProfile g_alloc_profile; int g_alloc_profile_enabled = false; -CombinedResults g_combined_results; // will live forever +CombinedResults g_combined_results; // Will live forever. // === stack stuff === RawBacktrace get_raw_backtrace() { + // A single large buffer to record backtraces onto static jl_bt_element_t static_bt_data[JL_MAX_BT_SIZE]; size_t bt_size = rec_backtrace(static_bt_data, JL_MAX_BT_SIZE, 2); + // Then we copy only the needed bytes out of the buffer into our profile. size_t bt_bytes = bt_size * sizeof(jl_bt_element_t); jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(bt_bytes); memcpy(bt_data, static_bt_data, bt_bytes); diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index be54e9cca0bfb..f6ae01120e2b8 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -10,6 +10,10 @@ extern "C" { #endif +// --------------------------------------------------------------------- +// The public interface to call from Julia for allocations profiling +// --------------------------------------------------------------------- + struct FreeInfo { size_t type_addr; size_t count; @@ -28,13 +32,13 @@ JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile(void); JL_DLLEXPORT void jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); -void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; -void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT; - // --------------------------------------------------------------------- -// functions to call from GC when alloc profiling is enabled +// Functions to call from GC when alloc profiling is enabled // --------------------------------------------------------------------- +void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; +void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT; + extern int g_alloc_profile_enabled; static inline void record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { From e1f8684afca3654d34c23fb185d0885bd54ddd94 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 13:38:17 -0500 Subject: [PATCH 062/107] Cleanups & comments & docstring --- stdlib/Profile/src/Allocs.jl | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 12f3c3174cf05..d4b5d71a086e9 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -3,7 +3,7 @@ module Allocs using Base.StackTraces: StackTrace, StackFrame, lookup using Base: InterpreterIP -# raw results +# --- Raw results structs, originally defined in C --- # matches RawBacktrace on the C side struct RawBacktrace @@ -20,7 +20,7 @@ end struct FreeInfo type::Ptr{Type} - count::UInt + count::Csize_t end # matches RawAllocResults on the C side @@ -33,10 +33,14 @@ struct RawAllocResults end """ - AllocProfile.@profile [skip_every=10_000] ex + Profile.Allocs.@profile [sample_rate=0.0001] ex Profile allocations that happen during `my_function`, returning both the result and and AllocResults struct. + +```julia +# TODO: Add example +``` """ macro profile(opts, ex) _prof_expr(ex, opts) @@ -54,8 +58,9 @@ function _prof_expr(expr, opts) end end -function start(; sample_rate::Float64) - ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), sample_rate) +function start(; sample_rate::Number) + println(typeof(sample_rate)) + ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) end function stop() @@ -85,8 +90,10 @@ struct AllocResults frees::Dict{Type,UInt} end -function Base.show(io::IO, ::AllocResults) - print(io, "AllocResults") +# Without this, the +function Base.show(io::IO, a::Alloc) + stacktrace_sample = length(a.stacktrace) >= 1 ? "$(a.stacktrace[1]), ..." : "" + print(io, "$Alloc($(a.type), $StackFrame[$stacktrace_sample], $(a.size))") end const BacktraceEntry = Union{Ptr{Cvoid}, InterpreterIP} @@ -167,17 +174,8 @@ function stacktrace_memoized( end # Precompile once for the package cache, -precompile(start, ()) -precompile(stop, ()) - -function __init__() - # And once when loading the package, to get the full machine code precompiled. - # TOOD: Although actually, we probably don't need this since this package will be - # precompiled into the sysimg, so the top-level statements will be enough to get the - # machine code codegen precompiled as well. :) - # We can delete this function once we make this package a stdlib. - precompile(start, ()) - precompile(stop, ()) -end +@assert precompile(start, ()) +@assert precompile(stop, ()) +@assert precompile(fetch, ()) end From 7de1d5f63b767841e4fef999bc3d7ff97536af60 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 13:38:27 -0500 Subject: [PATCH 063/107] Split out and update Profile.Allocs tests --- stdlib/Profile/test/allocs.jl | 67 +++++++++++++++++++++++++++++++++ stdlib/Profile/test/runtests.jl | 64 +------------------------------ 2 files changed, 68 insertions(+), 63 deletions(-) create mode 100644 stdlib/Profile/test/allocs.jl diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl new file mode 100644 index 0000000000000..1c4d0f00eed9c --- /dev/null +++ b/stdlib/Profile/test/allocs.jl @@ -0,0 +1,67 @@ +using Test +using Profile: Allocs + +@testset "alloc profiler doesn't segfault" begin + res = Allocs.@profile sample_rate=1 begin + # test the allocations during compilation + using Base64 + # make sure some frees show up in the profile + GC.gc() + end + profile = Allocs.fetch() + + @test length(profile.allocs) > 0 + first_alloc = profile.allocs[1] + @test first_alloc.size > 0 + @test length(first_alloc.stacktrace) > 0 + @test length(string(first_alloc.type)) > 0 + + @test length(profile.frees) > 0 +end + +@testset "alloc profiler works when there are multiple tasks on multiple threads" begin + NUM_TASKS = 1000 + + # TODO: is this always true in CI? + @test Threads.nthreads() > 1 + + function do_work() + ch = Channel{Vector{Int}}(Inf) + @sync for i in 1:NUM_TASKS + Threads.@spawn begin + # generate garbage + put!(ch, zeros(100)) + end + end + close(ch) + # for obj in ch + # # ... + # end + GC.gc() + end + + # call once to make sure it's compiled + do_work() + + res = Allocs.@profile sample_rate=1 begin + do_work() + end + profile = Allocs.fetch() + + # expecting at least 3 allocations per task: + # 1. the task + # 2. the vector + # 3. the buffer inside the vector + @test length(profile.allocs) >= 3*NUM_TASKS + println(length(profile.allocs)) + first_alloc = profile.allocs[1] + @test first_alloc.size > 0 + @test length(first_alloc.stacktrace) > 0 + @test length(string(first_alloc.type)) > 0 + + @test length(profile.frees) > 0 + + # TODO: it would be nice to assert that these tasks + # were actually scheduled onto multiple threads, + # and we see allocs from all threads in the profile +end diff --git a/stdlib/Profile/test/runtests.jl b/stdlib/Profile/test/runtests.jl index e48975bc9562f..ddddac55fcd93 100644 --- a/stdlib/Profile/test/runtests.jl +++ b/stdlib/Profile/test/runtests.jl @@ -220,66 +220,4 @@ end @test only(node.down).first == lidict[8] end -@testset "alloc profiler doesn't segfault" begin - res, profile = AllocProfile.@profile skip_every=0 begin - # test the allocations during compilation - using Base64 - # make sure some frees show up in the profile - GC.gc() - end - - @test length(profile.allocs) > 0 - first_alloc = profile.allocs[1] - @test first_alloc.size > 0 - @test length(first_alloc.stacktrace) > 0 - @test length(string(first_alloc.type)) > 0 - - @test length(profile.frees) > 0 -end - -@testset "alloc profiler works when there are multiple tasks on multiple threads" begin - NUM_TASKS = 1000 - - # TODO: is this always true in CI? - @test Threads.nthreads() > 1 - - function do_work() - ch = Channel{Vector{Int}}(Inf) - @sync for i in 1:NUM_TASKS - Threads.@spawn begin - # generate garbage - put!(ch, zeros(100)) - end - end - close(ch) - # for obj in ch - # # ... - # end - GC.gc() - end - - # call once to make sure it's compiled - do_work() - - res, profile = AllocProfile.@profile skip_every=0 begin - do_work() - end - - # expecting at least 3 allocations per task: - # 1. the task - # 2. the vector - # 3. the buffer inside the vector - @test length(profile.allocs) >= 3*NUM_TASKS - println(length(profile.allocs)) - first_alloc = profile.allocs[1] - @test first_alloc.size > 0 - @test length(first_alloc.stacktrace) > 0 - @test length(string(first_alloc.type)) > 0 - - @test length(profile.frees) > 0 - - # TODO: it would be nice to assert that these tasks - # were actually scheduled onto multiple threads, - # and we see allocs from all threads in the profile -end - +include("allocs.jl") From 7c862da1d51df93864533398ef8007d5e1cdc506 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 13:40:04 -0500 Subject: [PATCH 064/107] Move the extern "C" around the impl of external funcs for Allocs profiler --- src/gc-alloc-profiler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 8a36f5aec9f2d..acc2998b92252 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -70,6 +70,8 @@ RawBacktrace get_raw_backtrace() { // == exported interface == +extern "C" { // Needed since the function doesn't take any arguments. + JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { g_alloc_profile = AllocProfile{sample_rate}; @@ -80,8 +82,6 @@ JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { g_alloc_profile_enabled = true; } -extern "C" { // Needed since the function doesn't take any arguments. - JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { // TODO: check that the results exist return RawAllocResults{ @@ -126,8 +126,6 @@ JL_DLLEXPORT void jl_free_alloc_profile() { g_combined_results.combined_frees.clear(); } -} - // == callbacks called into by the outside == void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { @@ -169,3 +167,5 @@ void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { profile.frees_by_type_address[type_address->second] = frees->second + 1; } } + +} // extern "C" From 2c271abfc5385a3a15bf31675dd4913fa3eb7858 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 13:44:13 -0500 Subject: [PATCH 065/107] remove pritnln --- stdlib/Profile/src/Allocs.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index d4b5d71a086e9..9a9ee9b1be81a 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -59,7 +59,6 @@ function _prof_expr(expr, opts) end function start(; sample_rate::Number) - println(typeof(sample_rate)) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) end From 2cb0a5994f7c1da503734f4973c0fc69f1fc57a3 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 14:03:33 -0500 Subject: [PATCH 066/107] move structs to header --- src/gc-alloc-profiler.cpp | 11 ----------- src/gc-alloc-profiler.h | 13 ++++++++++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index acc2998b92252..a47cdb8f5bcff 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -13,17 +13,6 @@ using std::string; using std::unordered_map; using std::vector; -struct RawBacktrace { - jl_bt_element_t *data; - size_t size; -}; - -struct RawAlloc { - jl_datatype_t *type_address; - RawBacktrace backtrace; - size_t size; -}; - // == These structs define the global singleton profile buffer that will be used by // callbacks to store profile results. == struct PerThreadAllocProfile { diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index f6ae01120e2b8..77f33dffdf77f 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -19,8 +19,19 @@ struct FreeInfo { size_t count; }; +struct RawBacktrace { + jl_bt_element_t *data; + size_t size; +}; + +struct RawAlloc { + jl_datatype_t *type_address; + struct RawBacktrace backtrace; + size_t size; +}; + struct RawAllocResults { - void *allocs; // Alloc* (see gc-alloc-profiler.cpp) + struct RawAlloc *allocs; size_t num_allocs; struct FreeInfo *frees; From 535c2fc9cd1af8bb21fcd2344b3661af0ac0a60a Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 14:15:52 -0500 Subject: [PATCH 067/107] Tried to fix compile error still failed... --- src/gc-alloc-profiler.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 77f33dffdf77f..85d9401e6d259 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -4,8 +4,12 @@ #define JL_GC_ALLOC_PROFILER_H #include "julia.h" +#include "julia_internal.h" #include "ios.h" +// struct _jl_bt_element_t; // Forward-declaration, defined in gc.h. +// typedef struct _jl_bt_element_t jl_bt_element_t; + #ifdef __cplusplus extern "C" { #endif From af8931c9e38e2d5df00f5b1971153f65b9e32b41 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 14:16:20 -0500 Subject: [PATCH 068/107] Revert move struct defs - use forward decl instead --- src/gc-alloc-profiler.cpp | 11 +++++++++++ src/gc-alloc-profiler.h | 18 +++--------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index a47cdb8f5bcff..acc2998b92252 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -13,6 +13,17 @@ using std::string; using std::unordered_map; using std::vector; +struct RawBacktrace { + jl_bt_element_t *data; + size_t size; +}; + +struct RawAlloc { + jl_datatype_t *type_address; + RawBacktrace backtrace; + size_t size; +}; + // == These structs define the global singleton profile buffer that will be used by // callbacks to store profile results. == struct PerThreadAllocProfile { diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 85d9401e6d259..d027eb001d35e 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -4,12 +4,8 @@ #define JL_GC_ALLOC_PROFILER_H #include "julia.h" -#include "julia_internal.h" #include "ios.h" -// struct _jl_bt_element_t; // Forward-declaration, defined in gc.h. -// typedef struct _jl_bt_element_t jl_bt_element_t; - #ifdef __cplusplus extern "C" { #endif @@ -18,22 +14,14 @@ extern "C" { // The public interface to call from Julia for allocations profiling // --------------------------------------------------------------------- +// Forward-declaration to avoid depenency in header file. +struct RawAlloc; // Defined in gc-alloc-profiler.cpp + struct FreeInfo { size_t type_addr; size_t count; }; -struct RawBacktrace { - jl_bt_element_t *data; - size_t size; -}; - -struct RawAlloc { - jl_datatype_t *type_address; - struct RawBacktrace backtrace; - size_t size; -}; - struct RawAllocResults { struct RawAlloc *allocs; size_t num_allocs; From f47253c7e10b82dac39feccc2e01beaa3ed4bb86 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 14:18:15 -0500 Subject: [PATCH 069/107] Rename BTElementT and add docstring example --- stdlib/Profile/src/Allocs.jl | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 9a9ee9b1be81a..b9921058fdbac 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -5,9 +5,12 @@ using Base: InterpreterIP # --- Raw results structs, originally defined in C --- +# The C jl_bt_element_t object contains either an IP pointer (size_t) or a void*. +const BTElement = Csize_t; + # matches RawBacktrace on the C side struct RawBacktrace - data::Ptr{Csize_t} # in C: *jl_bt_element_t + data::Ptr{BTElement} # in C: *jl_bt_element_t size::Csize_t end @@ -33,13 +36,19 @@ struct RawAllocResults end """ - Profile.Allocs.@profile [sample_rate=0.0001] ex + Profile.Allocs.@profile [sample_rate=0.0001] expr -Profile allocations that happen during `my_function`, returning +Profile allocations that happen during `expr`, returning both the result and and AllocResults struct. ```julia -# TODO: Add example +julia> Profile.Allocs.@profile sample_rate=0.01 peakflops() +1.03733270279065e11 + +julia> results = Profile.Allocs.fetch(); + +julia> last(sort(results.allocs, by=x->x.size)) +Profile.Allocs.Alloc(Vector{Any}, Base.StackTraces.StackFrame[_new_array_ at array.c:127, ...], 5576) ``` """ macro profile(opts, ex) @@ -95,8 +104,7 @@ function Base.show(io::IO, a::Alloc) print(io, "$Alloc($(a.type), $StackFrame[$stacktrace_sample], $(a.size))") end -const BacktraceEntry = Union{Ptr{Cvoid}, InterpreterIP} -const BacktraceCache = Dict{BacktraceEntry,Vector{StackFrame}} +const BacktraceCache = Dict{BTElement,Vector{StackFrame}} # copied from julia_internal.h const JL_BUFF_TAG = UInt(0x4eadc000) @@ -141,8 +149,8 @@ function decode(raw_results::RawAllocResults)::AllocResults ) end -function load_backtrace(trace::RawBacktrace)::Vector{Ptr{Cvoid}} - out = Vector{Ptr{Cvoid}}() +function load_backtrace(trace::RawBacktrace)::Vector{BTElement} + out = Vector{BTElement}() for i in 1:trace.size push!(out, unsafe_load(trace.data, i)) end @@ -152,7 +160,7 @@ end function stacktrace_memoized( cache::BacktraceCache, - trace::Vector{Ptr{Cvoid}}, + trace::Vector{BTElement}, c_funcs::Bool=true )::StackTrace stack = StackTrace() From 423830d753a9b45f06f10eecc1bf3eadc93149a9 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 5 Jan 2022 23:00:53 -0500 Subject: [PATCH 070/107] remove garbage profile stuff the big dict is not worth the overhead for now --- src/gc-alloc-profiler.cpp | 36 ------------------------------------ src/gc-alloc-profiler.h | 14 -------------- src/gc.c | 1 - stdlib/Profile/src/Allocs.jl | 22 +--------------------- 4 files changed, 1 insertion(+), 72 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index acc2998b92252..f90b8a7f0b166 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -28,8 +28,6 @@ struct RawAlloc { // callbacks to store profile results. == struct PerThreadAllocProfile { vector allocs; - unordered_map type_address_by_value_address; - unordered_map frees_by_type_address; }; struct AllocProfile { @@ -40,7 +38,6 @@ struct AllocProfile { struct CombinedResults { vector combined_allocs; - vector combined_frees; }; // == Global variables manipulated by callbacks == @@ -102,16 +99,6 @@ JL_DLLEXPORT void jl_stop_alloc_profile() { g_combined_results.combined_allocs.push_back(alloc); } } - - // package up frees - for (const auto& profile : g_alloc_profile.per_thread_profiles) { - for (const auto& free_info : profile.frees_by_type_address) { - g_combined_results.combined_frees.push_back(FreeInfo{ - free_info.first, - free_info.second - }); - } - } } JL_DLLEXPORT void jl_free_alloc_profile() { @@ -123,7 +110,6 @@ JL_DLLEXPORT void jl_free_alloc_profile() { g_alloc_profile.per_thread_profiles.clear(); g_combined_results.combined_allocs.clear(); - g_combined_results.combined_frees.clear(); } // == callbacks called into by the outside == @@ -139,9 +125,6 @@ void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { } auto type = (jl_datatype_t*)jl_typeof(val); - // Used when counting frees. We can't get type type info then, - // because it gets corrupted during garbage collection. - profile.type_address_by_value_address[(size_t)val] = (size_t)type; profile.allocs.emplace_back(RawAlloc{ type, get_raw_backtrace(), @@ -149,23 +132,4 @@ void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { }); } -void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { - jl_value_t *val = jl_valueof(tagged_val); - - auto& profile = g_alloc_profile.per_thread_profiles[jl_threadid()]; - - auto value_address = (size_t)val; - auto type_address = profile.type_address_by_value_address.find(value_address); - if (type_address == profile.type_address_by_value_address.end()) { - return; // TODO: warn - } - auto frees = profile.frees_by_type_address.find(type_address->second); - - if (frees == profile.frees_by_type_address.end()) { - profile.frees_by_type_address[type_address->second] = 1; - } else { - profile.frees_by_type_address[type_address->second] = frees->second + 1; - } -} - } // extern "C" diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index d027eb001d35e..94a2737b35c45 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -17,17 +17,9 @@ extern "C" { // Forward-declaration to avoid depenency in header file. struct RawAlloc; // Defined in gc-alloc-profiler.cpp -struct FreeInfo { - size_t type_addr; - size_t count; -}; - struct RawAllocResults { struct RawAlloc *allocs; size_t num_allocs; - - struct FreeInfo *frees; - size_t num_frees; }; JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate); @@ -50,12 +42,6 @@ static inline void record_allocated_value(jl_value_t *val, size_t size) JL_NOTSA } } -static inline void record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT { - if (__unlikely(g_alloc_profile_enabled != 0)) { - _record_freed_value(tagged_val); - } -} - #ifdef __cplusplus } #endif diff --git a/src/gc.c b/src/gc.c index bf81f1eabc94c..56b2c31cbe7f1 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1325,7 +1325,6 @@ static jl_taggedvalue_t **sweep_page(jl_gc_pool_t *p, jl_gc_pagemeta_t *pg, jl_t while ((char*)v <= lim) { int bits = v->bits.gc; if (!gc_marked(bits)) { - record_freed_value(v); *pfl = v; pfl = &v->next; pfl_begin = pfl_begin ? pfl_begin : pfl; diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index b9921058fdbac..aeac31d10fe52 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -21,18 +21,10 @@ struct RawAlloc size::Csize_t end -struct FreeInfo - type::Ptr{Type} - count::Csize_t -end - # matches RawAllocResults on the C side struct RawAllocResults allocs::Ptr{RawAlloc} num_allocs::Csize_t - - frees::Ptr{FreeInfo} - num_frees::Csize_t end """ @@ -95,7 +87,6 @@ end struct AllocResults allocs::Vector{Alloc} - frees::Dict{Type,UInt} end # Without this, the @@ -135,18 +126,7 @@ function decode(raw_results::RawAllocResults)::AllocResults decode_alloc(cache, unsafe_load(raw_results.allocs, i)) for i in 1:raw_results.num_allocs ] - - frees = Dict{Type,UInt}() - for i in 1:raw_results.num_frees - free = unsafe_load(raw_results.frees, i) - type = load_type(free.type) - frees[type] = free.count - end - - return AllocResults( - allocs, - frees - ) + return AllocResults(allocs) end function load_backtrace(trace::RawBacktrace)::Vector{BTElement} From 4a86866a7559a8d82535ef573e496afcb67f6e37 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 14:57:11 -0500 Subject: [PATCH 071/107] remove unordered_map --- src/gc-alloc-profiler.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index f90b8a7f0b166..28ca20c5bed3b 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -6,7 +6,6 @@ #include "gc.h" #include -#include #include using std::string; From d02a5b637c7bee0f394a791d910f483feab98afb Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 15:02:07 -0500 Subject: [PATCH 072/107] Fix typo after merge --- src/gc-alloc-profiler.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 28ca20c5bed3b..fa3b8c3b2e8bc 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -83,8 +83,6 @@ JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { return RawAllocResults{ g_combined_results.combined_allocs.data(), g_combined_results.combined_allocs.size(), - g_combined_results.combined_frees.data(), - g_combined_results.combined_frees.size() }; } From bfd6210eef59f5ff679143a40bdcb836581d667e Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 15:03:42 -0500 Subject: [PATCH 073/107] Finish comment --- stdlib/Profile/src/Allocs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index aeac31d10fe52..22ec33683e763 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -89,7 +89,7 @@ struct AllocResults allocs::Vector{Alloc} end -# Without this, the +# Without this, the Alloc's stacktrace prints for lines and lines and lines.. function Base.show(io::IO, a::Alloc) stacktrace_sample = length(a.stacktrace) >= 1 ? "$(a.stacktrace[1]), ..." : "" print(io, "$Alloc($(a.type), $StackFrame[$stacktrace_sample], $(a.size))") From ff003175dc510d0996149bbffd4b0c9686bd08e2 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 15:18:13 -0500 Subject: [PATCH 074/107] fix typo --- stdlib/Profile/src/Allocs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 22ec33683e763..e6cf2cf7f473d 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -64,7 +64,7 @@ function start(; sample_rate::Number) end function stop() - ccall(:jl_stop_alloc_profile, RawAllocResults, ()) + ccall(:jl_stop_alloc_profile, Cvoid, ()) end function clear() From e07e67d739156c19b389eb2c07dc646f1cf0ec49 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 15:44:33 -0500 Subject: [PATCH 075/107] Stop clearing the profiled Allocations on `start()` --- src/gc-alloc-profiler.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index fa3b8c3b2e8bc..55fb63ae74c6f 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -69,12 +69,13 @@ RawBacktrace get_raw_backtrace() { extern "C" { // Needed since the function doesn't take any arguments. JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { - g_alloc_profile = AllocProfile{sample_rate}; - - for (int i = 0; i < jl_n_threads; i++) { + // We only need to do this once, the first time this is called. + while (g_alloc_profile.per_thread_profiles.size() < jl_n_threads) { g_alloc_profile.per_thread_profiles.push_back(PerThreadAllocProfile{}); } + g_alloc_profile.sample_rate = sample_rate; + g_alloc_profile_enabled = true; } @@ -103,8 +104,8 @@ JL_DLLEXPORT void jl_free_alloc_profile() { for (auto alloc : profile.allocs) { free(alloc.backtrace.data); } + profile.allocs.clear(); } - g_alloc_profile.per_thread_profiles.clear(); g_combined_results.combined_allocs.clear(); } From ed4cb44588a4ead2bcab9ef7dd584005e77448b6 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 15:44:58 -0500 Subject: [PATCH 076/107] Fix tests after remove Garbage Profiler (frees) --- stdlib/Profile/test/allocs.jl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index 1c4d0f00eed9c..1e6158c1a29e0 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -5,8 +5,6 @@ using Profile: Allocs res = Allocs.@profile sample_rate=1 begin # test the allocations during compilation using Base64 - # make sure some frees show up in the profile - GC.gc() end profile = Allocs.fetch() @@ -15,8 +13,6 @@ using Profile: Allocs @test first_alloc.size > 0 @test length(first_alloc.stacktrace) > 0 @test length(string(first_alloc.type)) > 0 - - @test length(profile.frees) > 0 end @testset "alloc profiler works when there are multiple tasks on multiple threads" begin @@ -59,8 +55,6 @@ end @test length(first_alloc.stacktrace) > 0 @test length(string(first_alloc.type)) > 0 - @test length(profile.frees) > 0 - # TODO: it would be nice to assert that these tasks # were actually scheduled onto multiple threads, # and we see allocs from all threads in the profile From c27971be54854db3a203b283a5eeb9c764a5ffac Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 16:28:57 -0500 Subject: [PATCH 077/107] rename to to `maybe_record_alloc_to_profile` --- src/gc-alloc-profiler.cpp | 2 +- src/gc-alloc-profiler.h | 7 +++---- src/julia_internal.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 55fb63ae74c6f..90dcdb9725222 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -112,7 +112,7 @@ JL_DLLEXPORT void jl_free_alloc_profile() { // == callbacks called into by the outside == -void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { +void _maybe_record_alloc_to_profile(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { auto& global_profile = g_alloc_profile; auto& profile = global_profile.per_thread_profiles[jl_threadid()]; diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 94a2737b35c45..7413ac4d019d5 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -31,14 +31,13 @@ JL_DLLEXPORT void jl_free_alloc_profile(void); // Functions to call from GC when alloc profiling is enabled // --------------------------------------------------------------------- -void _record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; -void _record_freed_value(jl_taggedvalue_t *tagged_val) JL_NOTSAFEPOINT; +void _maybe_record_alloc_to_profile(jl_value_t *val, size_t size) JL_NOTSAFEPOINT; extern int g_alloc_profile_enabled; -static inline void record_allocated_value(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { +static inline void maybe_record_alloc_to_profile(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { if (__unlikely(g_alloc_profile_enabled)) { - _record_allocated_value(val, size); + _maybe_record_alloc_to_profile(val, size); } } diff --git a/src/julia_internal.h b/src/julia_internal.h index 14cc3416e72aa..0f42333272f52 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -366,7 +366,7 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty) } jl_set_typeof(v, ty); - record_allocated_value(v, sz); + maybe_record_alloc_to_profile(v, sz); return v; } From 48261b5a804323d4713e742853adf5a0a923a0ab Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 16:29:14 -0500 Subject: [PATCH 078/107] small test cleanups --- stdlib/Profile/test/allocs.jl | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index 1e6158c1a29e0..eaaf886eeec9a 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -2,7 +2,7 @@ using Test using Profile: Allocs @testset "alloc profiler doesn't segfault" begin - res = Allocs.@profile sample_rate=1 begin + res = Allocs.@profile sample_rate=1.0 begin # test the allocations during compilation using Base64 end @@ -30,10 +30,6 @@ end end end close(ch) - # for obj in ch - # # ... - # end - GC.gc() end # call once to make sure it's compiled From 43276f4f4d7864b9bc25a1aa5d7466166ac6a3e8 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 19:46:13 -0500 Subject: [PATCH 079/107] Fix double-free in the stop,fetch,clear logic --- src/gc-alloc-profiler.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 90dcdb9725222..8941ffbb7531c 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -80,7 +80,16 @@ JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { } JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { - // TODO: check that the results exist + // combine allocs + // TODO: interleave to preserve ordering + for (auto& profile : g_alloc_profile.per_thread_profiles) { + for (const auto& alloc : profile.allocs) { + g_combined_results.combined_allocs.push_back(alloc); + } + + profile.allocs.clear(); + } + return RawAllocResults{ g_combined_results.combined_allocs.data(), g_combined_results.combined_allocs.size(), @@ -89,14 +98,6 @@ JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { JL_DLLEXPORT void jl_stop_alloc_profile() { g_alloc_profile_enabled = false; - - // combine allocs - // TODO: interleave to preserve ordering - for (const auto& profile : g_alloc_profile.per_thread_profiles) { - for (const auto& alloc : profile.allocs) { - g_combined_results.combined_allocs.push_back(alloc); - } - } } JL_DLLEXPORT void jl_free_alloc_profile() { @@ -107,6 +108,10 @@ JL_DLLEXPORT void jl_free_alloc_profile() { profile.allocs.clear(); } + for (auto alloc : g_combined_results.combined_allocs) { + free(alloc.backtrace.data); + } + g_combined_results.combined_allocs.clear(); } From 8062b7298db6466be0b08c8474e276627f7f54ec Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 19:52:59 -0500 Subject: [PATCH 080/107] Add test for start stop fetch clear --- stdlib/Profile/test/allocs.jl | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index eaaf886eeec9a..dd7cd6756eb80 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -55,3 +55,34 @@ end # were actually scheduled onto multiple threads, # and we see allocs from all threads in the profile end + +@testset "alloc profiler start stop fetch clear" begin + function do_work() + # Compiling allocates a lot + for f in (gensym() for _ in 1:10) + @eval begin + $f() = 10 + $f() + end + end + end + + Allocs.@profile sample_rate=1 do_work() + @test length(Allocs.fetch().allocs) > 10 + + Allocs.clear() + @test length(Allocs.fetch().allocs) == 0 + Allocs.clear() + @test length(Allocs.fetch().allocs) == 0 + + Allocs.@profile sample_rate=1 do_work() + curr_allocs = length(Allocs.fetch().allocs) + @test curr_allocs > 10 + + # Do _more_ work, adding into the same profile + Allocs.@profile sample_rate=1 do_work() + @test length(Allocs.fetch().allocs) > curr_allocs + + Allocs.clear() + @test length(Allocs.fetch().allocs) == 0 +end From aeec3b6a3a3a904f303580a60ca875804cc39836 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 20:09:34 -0500 Subject: [PATCH 081/107] Ah, fix tricky C++ism: missing a `&` caused accidental double-free --- src/gc-alloc-profiler.cpp | 5 ++++- stdlib/Profile/test/allocs.jl | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 8941ffbb7531c..a06a4631a1be3 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -101,13 +101,16 @@ JL_DLLEXPORT void jl_stop_alloc_profile() { } JL_DLLEXPORT void jl_free_alloc_profile() { - for (auto profile : g_alloc_profile.per_thread_profiles) { + // Free any allocs that remain in the per-thread profiles, that haven't + // been combined yet (which happens in fetch_alloc_profiles()). + for (auto& profile : g_alloc_profile.per_thread_profiles) { for (auto alloc : profile.allocs) { free(alloc.backtrace.data); } profile.allocs.clear(); } + // Free the allocs that have been already combined into the combined results object. for (auto alloc : g_combined_results.combined_allocs) { free(alloc.backtrace.data); } diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index dd7cd6756eb80..35fe4c24619fd 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -85,4 +85,24 @@ end Allocs.clear() @test length(Allocs.fetch().allocs) == 0 + + # Clear without fetching + + Allocs.@profile sample_rate=1 do_work() + Allocs.clear() + @test length(Allocs.fetch().allocs) == 0 + + # And things still work like normal afterwards + + Allocs.@profile sample_rate=1 do_work() + Allocs.@profile sample_rate=1 do_work() + Allocs.@profile sample_rate=1 do_work() + @test length(Allocs.fetch().allocs) > 10 + + Allocs.@profile sample_rate=1 do_work() + Allocs.@profile sample_rate=1 do_work() + @test length(Allocs.fetch().allocs) > 10 + + Allocs.clear() + end From 00bb947133e0ab63613529a3a58575bf410147e3 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 16:02:16 -0500 Subject: [PATCH 082/107] print warning message --- stdlib/Profile/src/Allocs.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index e6cf2cf7f473d..b1dd861f6602b 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -74,6 +74,8 @@ end function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) + @warn("this allocation profiler currently misses some allocations. " * + "For more info see https://github.com/JuliaLang/julia/issues/43688") return decoded_results end From d3d868f98423c6b5b0a6dcadd73b0df6674ff12a Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Thu, 6 Jan 2022 20:14:50 -0500 Subject: [PATCH 083/107] Update stdlib/Profile/src/Allocs.jl Capitalization. --- stdlib/Profile/src/Allocs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index b1dd861f6602b..8336c27d0ac34 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -74,7 +74,7 @@ end function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) - @warn("this allocation profiler currently misses some allocations. " * + @warn("This allocation profiler currently misses some allocations. " * "For more info see https://github.com/JuliaLang/julia/issues/43688") return decoded_results end From d352a800c8629a2270f0defe25917e8e6ee87eaf Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 23:08:03 -0500 Subject: [PATCH 084/107] a couple cleanups; remove multithread assertion --- src/gc-alloc-profiler.cpp | 5 ++--- stdlib/Profile/test/allocs.jl | 6 ++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index a06a4631a1be3..9691da0e17b55 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -66,7 +66,7 @@ RawBacktrace get_raw_backtrace() { // == exported interface == -extern "C" { // Needed since the function doesn't take any arguments. +extern "C" { // Needed since these functions doesn't take any arguments. JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { // We only need to do this once, the first time this is called. @@ -75,7 +75,6 @@ JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { } g_alloc_profile.sample_rate = sample_rate; - g_alloc_profile_enabled = true; } @@ -118,7 +117,7 @@ JL_DLLEXPORT void jl_free_alloc_profile() { g_combined_results.combined_allocs.clear(); } -// == callbacks called into by the outside == +// == callback called into by the outside == void _maybe_record_alloc_to_profile(jl_value_t *val, size_t size) JL_NOTSAFEPOINT { auto& global_profile = g_alloc_profile; diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index 35fe4c24619fd..6dae7d6dcd2be 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -18,8 +18,10 @@ end @testset "alloc profiler works when there are multiple tasks on multiple threads" begin NUM_TASKS = 1000 - # TODO: is this always true in CI? - @test Threads.nthreads() > 1 + # This test is only really meaningful if we're running on + # multiple threads, but this isn't true on the windows tests, + # causing them to fail. So, commenting this assertion out. + # @test Threads.nthreads() > 1 function do_work() ch = Channel{Vector{Int}}(Inf) From 3aaa9d95e3ce56ccf27ee32b3d6c605619958d35 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 23:30:32 -0500 Subject: [PATCH 085/107] remove unordered_map import --- src/gc-alloc-profiler.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 9691da0e17b55..ca5b8f1e445ec 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -9,7 +9,6 @@ #include using std::string; -using std::unordered_map; using std::vector; struct RawBacktrace { From db64f63c5bde5e37a27dc60a4e89d30621edafc5 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Thu, 6 Jan 2022 23:52:57 -0500 Subject: [PATCH 086/107] first crack at docs --- doc/src/manual/profile.md | 17 +++++++++++++++++ stdlib/Profile/docs/src/index.md | 17 +++++++++++++++++ stdlib/Profile/src/Allocs.jl | 24 ++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/doc/src/manual/profile.md b/doc/src/manual/profile.md index 5596ebae512aa..3dbd861b6cb46 100644 --- a/doc/src/manual/profile.md +++ b/doc/src/manual/profile.md @@ -336,6 +336,23 @@ and how much garbage it collects each time. This can be enabled with [`GC.enable_logging(true)`](@ref), which causes Julia to log to stderr every time a garbage collection happens. +### Allocation Profiler + +The allocation profiler records the stack trace, type, and size of each + allocation while it is running. It can be invoked with + [`Profile.Allocs.@profile`](@ref). + +This information about the allocations is returned as an array of `Alloc` +objects, wrapped in an `AllocResults` object. The best way to visualize +these is currently with the [PProf.jl](https://github.com/JuliaPerf/PProf.jl) +library, which can visualize the call stacks which are making the most +allocations. + +The allocation profiler does have significant overhead, so a `sample_interval` +argument can be passed to speed it up by making it skip some allocations. +Passing `sample_interval=1.0` will make it record everything (which is slow); +`sample_interval=0.1` will record only 10% of the allocations (faster), etc. + ## External Profiling Currently Julia supports `Intel VTune`, `OProfile` and `perf` as external profiling tools. diff --git a/stdlib/Profile/docs/src/index.md b/stdlib/Profile/docs/src/index.md index ac60bb92cb5ed..12f0e29c608a4 100644 --- a/stdlib/Profile/docs/src/index.md +++ b/stdlib/Profile/docs/src/index.md @@ -1,5 +1,7 @@ # [Profiling](@id lib-profiling) +## CPU Profiling + ```@docs Profile.@profile ``` @@ -15,3 +17,18 @@ Profile.retrieve Profile.callers Profile.clear_malloc_data ``` + +## Memory profiling + +```@docs +Profile.Allocs.@profile +``` + +The methods in `Profile.Allocs` are not exported and need to be called e.g. as `Profile.Allocs.fetch()`. + +```@docs +Profile.Allocs.start +Profile.Allocs.stop +Profile.Allocs.clear +Profile.Allocs.fetch +``` diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 8336c27d0ac34..2f32ece41f79f 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -33,6 +33,8 @@ end Profile allocations that happen during `expr`, returning both the result and and AllocResults struct. +A sample rate of 1 will record everything; 0 will record nothing. + ```julia julia> Profile.Allocs.@profile sample_rate=0.01 peakflops() 1.03733270279065e11 @@ -59,18 +61,40 @@ function _prof_expr(expr, opts) end end +""" + Profile.Allocs.start(sample_rate::Number) + +Begin recording allocations with the given sample rate +A sample rate of 1 will record everything; 0 will record nothing. +""" function start(; sample_rate::Number) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) end +""" + Profile.Allocs.stop() + +Stop recording allocations. +""" function stop() ccall(:jl_stop_alloc_profile, Cvoid, ()) end +""" + Profile.Allocs.stop() + +Clear allocation information from memory. +""" function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) end +""" + Profile.Allocs.fetch() + +Retrieve the recorded allocations, and decode them into Julia +objects which can be analyzed. +""" function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) From 5c25bcd51aefd889efe821c3c78173fa9663500c Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 7 Jan 2022 00:27:42 -0500 Subject: [PATCH 087/107] add news --- NEWS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS.md b/NEWS.md index 7ccab87d92019..9e0f2dd1f18ec 100644 --- a/NEWS.md +++ b/NEWS.md @@ -135,6 +135,9 @@ Standard library changes Further, percent utilization is now reported as a total or per-thread, based on whether the thread is idle or not at each sample. `Profile.fetch()` by default strips out the new metadata to ensure backwards compatibility with external profiling data consumers, but can be included with the `include_meta` kwarg. ([#41742]) +* The new `Profile.Allocs` module allows memory allocations to be profiled. The stack trace, type, and size of each + allocation is recorded, and a `sample_rate` argument allows a tunable amount of allocations to be skipped, + reducing performance overhead. ([#42768]) #### Random From 4fec8ddbc3a33332e42ebfec753949e895f68036 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Fri, 7 Jan 2022 09:53:35 -0500 Subject: [PATCH 088/107] Apply suggestions from code review Fixup some small typos and formatting changes --- doc/src/manual/profile.md | 10 +++++----- stdlib/Profile/src/Allocs.jl | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/src/manual/profile.md b/doc/src/manual/profile.md index 3dbd861b6cb46..64b6b8b0e1209 100644 --- a/doc/src/manual/profile.md +++ b/doc/src/manual/profile.md @@ -339,8 +339,8 @@ a garbage collection happens. ### Allocation Profiler The allocation profiler records the stack trace, type, and size of each - allocation while it is running. It can be invoked with - [`Profile.Allocs.@profile`](@ref). +allocation while it is running. It can be invoked with +[`Profile.Allocs.@profile`](@ref). This information about the allocations is returned as an array of `Alloc` objects, wrapped in an `AllocResults` object. The best way to visualize @@ -348,10 +348,10 @@ these is currently with the [PProf.jl](https://github.com/JuliaPerf/PProf.jl) library, which can visualize the call stacks which are making the most allocations. -The allocation profiler does have significant overhead, so a `sample_interval` +The allocation profiler does have significant overhead, so a `sample_rate` argument can be passed to speed it up by making it skip some allocations. -Passing `sample_interval=1.0` will make it record everything (which is slow); -`sample_interval=0.1` will record only 10% of the allocations (faster), etc. +Passing `sample_rate=1.0` will make it record everything (which is slow); +`sample_rate=0.1` will record only 10% of the allocations (faster), etc. ## External Profiling diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 2f32ece41f79f..9bbd305c2b5d5 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -81,7 +81,7 @@ function stop() end """ - Profile.Allocs.stop() + Profile.Allocs.clear() Clear allocation information from memory. """ From 9a4b7fb2a1564f63e87244b65c6123ba0934fae4 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Fri, 7 Jan 2022 15:08:01 -0500 Subject: [PATCH 089/107] PR feedback --- stdlib/Profile/docs/src/index.md | 4 ++-- stdlib/Profile/src/Allocs.jl | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/stdlib/Profile/docs/src/index.md b/stdlib/Profile/docs/src/index.md index 12f0e29c608a4..89894723b1116 100644 --- a/stdlib/Profile/docs/src/index.md +++ b/stdlib/Profile/docs/src/index.md @@ -27,8 +27,8 @@ Profile.Allocs.@profile The methods in `Profile.Allocs` are not exported and need to be called e.g. as `Profile.Allocs.fetch()`. ```@docs -Profile.Allocs.start -Profile.Allocs.stop Profile.Allocs.clear Profile.Allocs.fetch +Profile.Allocs.start +Profile.Allocs.stop ``` diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 2f32ece41f79f..2a3030dc5f384 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -33,7 +33,7 @@ end Profile allocations that happen during `expr`, returning both the result and and AllocResults struct. -A sample rate of 1 will record everything; 0 will record nothing. +A sample rate of 1.0 will record everything; 0.0 will record nothing. ```julia julia> Profile.Allocs.@profile sample_rate=0.01 peakflops() @@ -62,12 +62,12 @@ function _prof_expr(expr, opts) end """ - Profile.Allocs.start(sample_rate::Number) + Profile.Allocs.start(sample_rate::Real) Begin recording allocations with the given sample rate -A sample rate of 1 will record everything; 0 will record nothing. +A sample rate of 1.0 will record everything; 0.0 will record nothing. """ -function start(; sample_rate::Number) +function start(; sample_rate::Real) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) end @@ -83,7 +83,7 @@ end """ Profile.Allocs.stop() -Clear allocation information from memory. +Clear all previously profiled allocation information from memory. """ function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) From cd143578fd6d35f45f98dc8b3539f9a92e35fc2c Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 10 Jan 2022 20:24:59 -0500 Subject: [PATCH 090/107] rename structs to match Julia style --- src/gc-alloc-profiler.cpp | 34 +++++++++++++++++----------------- src/gc-alloc-profiler.h | 10 +++++----- stdlib/Profile/src/Allocs.jl | 8 ++++---- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index ca5b8f1e445ec..57337a20772a3 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -11,42 +11,42 @@ using std::string; using std::vector; -struct RawBacktrace { +struct jl_raw_backtrace_t { jl_bt_element_t *data; size_t size; }; -struct RawAlloc { +struct jl_raw_alloc_t { jl_datatype_t *type_address; - RawBacktrace backtrace; + jl_raw_backtrace_t backtrace; size_t size; }; // == These structs define the global singleton profile buffer that will be used by // callbacks to store profile results. == -struct PerThreadAllocProfile { - vector allocs; +struct jl_per_thread_alloc_profile_t { + vector allocs; }; -struct AllocProfile { +struct jl_alloc_profile_t { double sample_rate; - vector per_thread_profiles; + vector per_thread_profiles; }; -struct CombinedResults { - vector combined_allocs; +struct jl_combined_results { + vector combined_allocs; }; // == Global variables manipulated by callbacks == -AllocProfile g_alloc_profile; +jl_alloc_profile_t g_alloc_profile; int g_alloc_profile_enabled = false; -CombinedResults g_combined_results; // Will live forever. +jl_combined_results g_combined_results; // Will live forever. // === stack stuff === -RawBacktrace get_raw_backtrace() { +jl_raw_backtrace_t get_raw_backtrace() { // A single large buffer to record backtraces onto static jl_bt_element_t static_bt_data[JL_MAX_BT_SIZE]; @@ -57,7 +57,7 @@ RawBacktrace get_raw_backtrace() { jl_bt_element_t *bt_data = (jl_bt_element_t*) malloc(bt_bytes); memcpy(bt_data, static_bt_data, bt_bytes); - return RawBacktrace{ + return jl_raw_backtrace_t{ bt_data, bt_size }; @@ -70,14 +70,14 @@ extern "C" { // Needed since these functions doesn't take any arguments. JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { // We only need to do this once, the first time this is called. while (g_alloc_profile.per_thread_profiles.size() < jl_n_threads) { - g_alloc_profile.per_thread_profiles.push_back(PerThreadAllocProfile{}); + g_alloc_profile.per_thread_profiles.push_back(jl_per_thread_alloc_profile_t{}); } g_alloc_profile.sample_rate = sample_rate; g_alloc_profile_enabled = true; } -JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { +JL_DLLEXPORT jl_raw_alloc_results_t jl_fetch_alloc_profile() { // combine allocs // TODO: interleave to preserve ordering for (auto& profile : g_alloc_profile.per_thread_profiles) { @@ -88,7 +88,7 @@ JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile() { profile.allocs.clear(); } - return RawAllocResults{ + return jl_raw_alloc_results_t{ g_combined_results.combined_allocs.data(), g_combined_results.combined_allocs.size(), }; @@ -129,7 +129,7 @@ void _maybe_record_alloc_to_profile(jl_value_t *val, size_t size) JL_NOTSAFEPOIN } auto type = (jl_datatype_t*)jl_typeof(val); - profile.allocs.emplace_back(RawAlloc{ + profile.allocs.emplace_back(jl_raw_alloc_t{ type, get_raw_backtrace(), size diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index 7413ac4d019d5..cf363c3543fcd 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -15,15 +15,15 @@ extern "C" { // --------------------------------------------------------------------- // Forward-declaration to avoid depenency in header file. -struct RawAlloc; // Defined in gc-alloc-profiler.cpp +struct jl_raw_alloc_t; // Defined in gc-alloc-profiler.cpp -struct RawAllocResults { - struct RawAlloc *allocs; +typedef struct { + struct jl_raw_alloc_t *allocs; size_t num_allocs; -}; +} jl_raw_alloc_results_t; JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate); -JL_DLLEXPORT struct RawAllocResults jl_fetch_alloc_profile(void); +JL_DLLEXPORT jl_raw_alloc_results_t jl_fetch_alloc_profile(void); JL_DLLEXPORT void jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index b8e3e7e7b09a0..bb75ef3e40da2 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -8,20 +8,20 @@ using Base: InterpreterIP # The C jl_bt_element_t object contains either an IP pointer (size_t) or a void*. const BTElement = Csize_t; -# matches RawBacktrace on the C side +# matches jl_raw_backtrace_t on the C side struct RawBacktrace data::Ptr{BTElement} # in C: *jl_bt_element_t size::Csize_t end -# matches RawAlloc on the C side +# matches jl_raw_alloc_t on the C side struct RawAlloc type::Ptr{Type} backtrace::RawBacktrace size::Csize_t end -# matches RawAllocResults on the C side +# matches jl_raw_alloc_results_t on the C side struct RawAllocResults allocs::Ptr{RawAlloc} num_allocs::Csize_t @@ -115,7 +115,7 @@ struct AllocResults allocs::Vector{Alloc} end -# Without this, the Alloc's stacktrace prints for lines and lines and lines.. +# Without this, the Alloc's stacktrace prints for lines and lines and lines... function Base.show(io::IO, a::Alloc) stacktrace_sample = length(a.stacktrace) >= 1 ? "$(a.stacktrace[1]), ..." : "" print(io, "$Alloc($(a.type), $StackFrame[$stacktrace_sample], $(a.size))") From e98589b40b59203950da1dfeadbba239e952fed3 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 10 Jan 2022 15:01:25 -0500 Subject: [PATCH 091/107] print out percentage of allocs missed --- stdlib/Profile/src/Allocs.jl | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index bb75ef3e40da2..7ee6d85229868 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -52,6 +52,13 @@ macro profile(ex) _prof_expr(ex, :(sample_rate=0.0001)) end +# globals used for tracking how many allocs we're missing +# vs the alloc counters used by @time +const g_gc_num = Ref{Base.GC_Num}() +const g_total_allocs = Ref{Int}(0) +const g_sample_rate = Ref{Real}(0) +const g_estimated_total_allocs = Ref{Int}(0) + function _prof_expr(expr, opts) quote $start(; $(esc(opts))) @@ -69,6 +76,9 @@ A sample rate of 1.0 will record everything; 0.0 will record nothing. """ function start(; sample_rate::Real) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) + + g_sample_rate[] = sample_rate + g_gc_num[] = Base.gc_num() end """ @@ -78,6 +88,22 @@ Stop recording allocations. """ function stop() ccall(:jl_stop_alloc_profile, Cvoid, ()) + + gc_num_after = Base.gc_num() + gc_diff = Base.GC_Diff(gc_num_after, g_gc_num[]) + println("gc_diff: $gc_diff") + alloc_count = Base.gc_alloc_count(gc_diff) + println("adding alloc_count: $alloc_count") + g_total_allocs[] = g_total_allocs[] + alloc_count + + # TODO: ugh, fetch has side effects + raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) + num_sampled = raw_results.num_allocs + println("num sampled $num_sampled; sample_rate: $(g_sample_rate[])") + estimated_total = round(Int, Float64(num_sampled) / g_sample_rate[]) + println("adding estimated_total: $estimated_total") + + g_estimated_total_allocs[] = g_estimated_total_allocs[] + estimated_total end """ @@ -87,6 +113,9 @@ Clear all previously profiled allocation information from memory. """ function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) + + g_estimated_total_allocs[] = 0 + g_total_allocs[] = 0 end """ @@ -98,7 +127,14 @@ objects which can be analyzed. function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) - @warn("This allocation profiler currently misses some allocations. " * + + println("total: $(g_total_allocs[])") + println("estimated total: $(g_estimated_total_allocs[])") + + missed_allocs = g_total_allocs[] - g_estimated_total_allocs[] + missed_percentage = round(Int, Float64(missed_allocs) / Float64(g_total_allocs[]) * 100) + + @warn("This allocation profiler missed $(missed_percentage)% of allocs in the last run. " * "For more info see https://github.com/JuliaLang/julia/issues/43688") return decoded_results end From 107ece00fc43453d74f1403df1f9a78237d9312a Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 10 Jan 2022 16:02:37 -0500 Subject: [PATCH 092/107] remove some debug printlns --- stdlib/Profile/src/Allocs.jl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 7ee6d85229868..09a38e8e988f3 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -91,17 +91,13 @@ function stop() gc_num_after = Base.gc_num() gc_diff = Base.GC_Diff(gc_num_after, g_gc_num[]) - println("gc_diff: $gc_diff") alloc_count = Base.gc_alloc_count(gc_diff) - println("adding alloc_count: $alloc_count") g_total_allocs[] = g_total_allocs[] + alloc_count # TODO: ugh, fetch has side effects raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) num_sampled = raw_results.num_allocs - println("num sampled $num_sampled; sample_rate: $(g_sample_rate[])") estimated_total = round(Int, Float64(num_sampled) / g_sample_rate[]) - println("adding estimated_total: $estimated_total") g_estimated_total_allocs[] = g_estimated_total_allocs[] + estimated_total end From c4bebea45319ab3e93d4a10f55b605553b152175 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 10 Jan 2022 19:53:16 -0500 Subject: [PATCH 093/107] PR feedback Co-Authored-By: NHDaly@gmail.com --- stdlib/Profile/src/Allocs.jl | 44 ++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 09a38e8e988f3..fe5cb42f12312 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -39,7 +39,7 @@ A sample rate of 1.0 will record everything; 0.0 will record nothing. julia> Profile.Allocs.@profile sample_rate=0.01 peakflops() 1.03733270279065e11 -julia> results = Profile.Allocs.fetch(); +julia> results = Profile.Allocs.fetch() julia> last(sort(results.allocs, by=x->x.size)) Profile.Allocs.Alloc(Vector{Any}, Base.StackTraces.StackFrame[_new_array_ at array.c:127, ...], 5576) @@ -54,10 +54,9 @@ end # globals used for tracking how many allocs we're missing # vs the alloc counters used by @time -const g_gc_num = Ref{Base.GC_Num}() -const g_total_allocs = Ref{Int}(0) -const g_sample_rate = Ref{Real}(0) -const g_estimated_total_allocs = Ref{Int}(0) +const g_gc_num_before = Ref{Base.GC_Num}() +const g_sample_rate = Ref{Real}() +const g_expected_sampled_allocs = Ref{Float64}(0) function _prof_expr(expr, opts) quote @@ -78,7 +77,7 @@ function start(; sample_rate::Real) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) g_sample_rate[] = sample_rate - g_gc_num[] = Base.gc_num() + g_gc_num_before[] = Base.gc_num() end """ @@ -89,17 +88,14 @@ Stop recording allocations. function stop() ccall(:jl_stop_alloc_profile, Cvoid, ()) + # increment a counter of how many allocs we would expect + # the memory profiler to see, based on how many allocs + # actually happened. gc_num_after = Base.gc_num() - gc_diff = Base.GC_Diff(gc_num_after, g_gc_num[]) + gc_diff = Base.GC_Diff(gc_num_after, g_gc_num_before[]) alloc_count = Base.gc_alloc_count(gc_diff) - g_total_allocs[] = g_total_allocs[] + alloc_count - - # TODO: ugh, fetch has side effects - raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) - num_sampled = raw_results.num_allocs - estimated_total = round(Int, Float64(num_sampled) / g_sample_rate[]) - - g_estimated_total_allocs[] = g_estimated_total_allocs[] + estimated_total + expected_samples = alloc_count * g_sample_rate[] + g_expected_sampled_allocs[] += expected_samples end """ @@ -110,8 +106,7 @@ Clear all previously profiled allocation information from memory. function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) - g_estimated_total_allocs[] = 0 - g_total_allocs[] = 0 + g_expected_sampled_allocs[] = 0 end """ @@ -124,14 +119,15 @@ function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) - println("total: $(g_total_allocs[])") - println("estimated total: $(g_estimated_total_allocs[])") - - missed_allocs = g_total_allocs[] - g_estimated_total_allocs[] - missed_percentage = round(Int, Float64(missed_allocs) / Float64(g_total_allocs[]) * 100) + @show(length(decoded_results.allocs)) + @show(g_expected_sampled_allocs[]) - @warn("This allocation profiler missed $(missed_percentage)% of allocs in the last run. " * - "For more info see https://github.com/JuliaLang/julia/issues/43688") + missed_allocs = g_expected_sampled_allocs[] - length(decoded_results.allocs) + missed_percentage = round(Int, missed_allocs / g_expected_sampled_allocs[] * 100) + @warn("The allocation profiler is not fully implemented, and missed $(missed_percentage)% " * + "($(round(Int, missed_allocs)) / $(round(Int, g_expected_sampled_allocs[]))) " * + "of allocs in the last run. " * + "For more info see https://github.com/JuliaLang/julia/issues/43688") return decoded_results end From f4f1a62323ce409894d8301e6b1d042039e98fb7 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 10 Jan 2022 20:09:42 -0500 Subject: [PATCH 094/107] more PR feedback: `_` before global names --- stdlib/Profile/src/Allocs.jl | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index fe5cb42f12312..77fe7c1a7abeb 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -54,9 +54,9 @@ end # globals used for tracking how many allocs we're missing # vs the alloc counters used by @time -const g_gc_num_before = Ref{Base.GC_Num}() -const g_sample_rate = Ref{Real}() -const g_expected_sampled_allocs = Ref{Float64}(0) +const _g_gc_num_before = Ref{Base.GC_Num}() +const _g_sample_rate = Ref{Real}() +const _g_expected_sampled_allocs = Ref{Float64}(0) function _prof_expr(expr, opts) quote @@ -76,8 +76,8 @@ A sample rate of 1.0 will record everything; 0.0 will record nothing. function start(; sample_rate::Real) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) - g_sample_rate[] = sample_rate - g_gc_num_before[] = Base.gc_num() + _g_sample_rate[] = sample_rate + _g_gc_num_before[] = Base.gc_num() end """ @@ -92,10 +92,10 @@ function stop() # the memory profiler to see, based on how many allocs # actually happened. gc_num_after = Base.gc_num() - gc_diff = Base.GC_Diff(gc_num_after, g_gc_num_before[]) + gc_diff = Base.GC_Diff(gc_num_after, _g_gc_num_before[]) alloc_count = Base.gc_alloc_count(gc_diff) - expected_samples = alloc_count * g_sample_rate[] - g_expected_sampled_allocs[] += expected_samples + expected_samples = alloc_count * _g_sample_rate[] + _g_expected_sampled_allocs[] += expected_samples end """ @@ -106,7 +106,7 @@ Clear all previously profiled allocation information from memory. function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) - g_expected_sampled_allocs[] = 0 + _g_expected_sampled_allocs[] = 0 end """ @@ -120,12 +120,12 @@ function fetch() decoded_results = decode(raw_results) @show(length(decoded_results.allocs)) - @show(g_expected_sampled_allocs[]) + @show(_g_expected_sampled_allocs[]) - missed_allocs = g_expected_sampled_allocs[] - length(decoded_results.allocs) - missed_percentage = round(Int, missed_allocs / g_expected_sampled_allocs[] * 100) + missed_allocs = _g_expected_sampled_allocs[] - length(decoded_results.allocs) + missed_percentage = round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100) @warn("The allocation profiler is not fully implemented, and missed $(missed_percentage)% " * - "($(round(Int, missed_allocs)) / $(round(Int, g_expected_sampled_allocs[]))) " * + "($(round(Int, missed_allocs)) / $(round(Int, _g_expected_sampled_allocs[]))) " * "of allocs in the last run. " * "For more info see https://github.com/JuliaLang/julia/issues/43688") return decoded_results From 452c7cd52d9f3878c758c74fc36c2326faab8171 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 11 Jan 2022 14:05:51 -0500 Subject: [PATCH 095/107] rename jl_raw_alloc_results_t => jl_profile_allocs_raw_results_t --- src/gc-alloc-profiler.cpp | 4 ++-- src/gc-alloc-profiler.h | 4 ++-- stdlib/Profile/src/Allocs.jl | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gc-alloc-profiler.cpp b/src/gc-alloc-profiler.cpp index 57337a20772a3..d00b2117e2c04 100644 --- a/src/gc-alloc-profiler.cpp +++ b/src/gc-alloc-profiler.cpp @@ -77,7 +77,7 @@ JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate) { g_alloc_profile_enabled = true; } -JL_DLLEXPORT jl_raw_alloc_results_t jl_fetch_alloc_profile() { +JL_DLLEXPORT jl_profile_allocs_raw_results_t jl_fetch_alloc_profile() { // combine allocs // TODO: interleave to preserve ordering for (auto& profile : g_alloc_profile.per_thread_profiles) { @@ -88,7 +88,7 @@ JL_DLLEXPORT jl_raw_alloc_results_t jl_fetch_alloc_profile() { profile.allocs.clear(); } - return jl_raw_alloc_results_t{ + return jl_profile_allocs_raw_results_t{ g_combined_results.combined_allocs.data(), g_combined_results.combined_allocs.size(), }; diff --git a/src/gc-alloc-profiler.h b/src/gc-alloc-profiler.h index cf363c3543fcd..3509b77daa1fc 100644 --- a/src/gc-alloc-profiler.h +++ b/src/gc-alloc-profiler.h @@ -20,10 +20,10 @@ struct jl_raw_alloc_t; // Defined in gc-alloc-profiler.cpp typedef struct { struct jl_raw_alloc_t *allocs; size_t num_allocs; -} jl_raw_alloc_results_t; +} jl_profile_allocs_raw_results_t; JL_DLLEXPORT void jl_start_alloc_profile(double sample_rate); -JL_DLLEXPORT jl_raw_alloc_results_t jl_fetch_alloc_profile(void); +JL_DLLEXPORT jl_profile_allocs_raw_results_t jl_fetch_alloc_profile(void); JL_DLLEXPORT void jl_stop_alloc_profile(void); JL_DLLEXPORT void jl_free_alloc_profile(void); diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index bb75ef3e40da2..a5976d92646dd 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -21,8 +21,8 @@ struct RawAlloc size::Csize_t end -# matches jl_raw_alloc_results_t on the C side -struct RawAllocResults +# matches jl_profile_allocs_raw_results_t on the C side +struct RawResults allocs::Ptr{RawAlloc} num_allocs::Csize_t end @@ -96,7 +96,7 @@ Retrieve the recorded allocations, and decode them into Julia objects which can be analyzed. """ function fetch() - raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) + raw_results = ccall(:jl_fetch_alloc_profile, RawResults, ()) decoded_results = decode(raw_results) @warn("This allocation profiler currently misses some allocations. " * "For more info see https://github.com/JuliaLang/julia/issues/43688") @@ -146,7 +146,7 @@ function decode_alloc(cache::BacktraceCache, raw_alloc::RawAlloc)::Alloc ) end -function decode(raw_results::RawAllocResults)::AllocResults +function decode(raw_results::RawResults)::AllocResults cache = BacktraceCache() allocs = [ decode_alloc(cache, unsafe_load(raw_results.allocs, i)) @@ -186,7 +186,7 @@ function stacktrace_memoized( return stack end -# Precompile once for the package cache, +# Precompile once for the package cache. @assert precompile(start, ()) @assert precompile(stop, ()) @assert precompile(fetch, ()) From 3f219c7952b284727dceafeeffb3d6e5b7830a90 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 11 Jan 2022 14:08:57 -0500 Subject: [PATCH 096/107] remove `@show`s --- stdlib/Profile/src/Allocs.jl | 3 --- 1 file changed, 3 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 77fe7c1a7abeb..f4203f55e9b4d 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -119,9 +119,6 @@ function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawAllocResults, ()) decoded_results = decode(raw_results) - @show(length(decoded_results.allocs)) - @show(_g_expected_sampled_allocs[]) - missed_allocs = _g_expected_sampled_allocs[] - length(decoded_results.allocs) missed_percentage = round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100) @warn("The allocation profiler is not fully implemented, and missed $(missed_percentage)% " * From bf08801aaef522c14a07b81ff3c0dbddb0bac374 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 12 Jan 2022 01:06:09 -0500 Subject: [PATCH 097/107] record string allocs --- src/array.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/array.c b/src/array.c index 104052644428a..d620278e34b14 100644 --- a/src/array.c +++ b/src/array.c @@ -508,6 +508,7 @@ JL_DLLEXPORT jl_value_t *jl_alloc_string(size_t len) s = jl_gc_big_alloc(ptls, allocsz); } jl_set_typeof(s, jl_string_type); + maybe_record_alloc_to_profile(s, len); *(size_t*)s = len; jl_string_data(s)[len] = 0; return s; From 8ec194b582e8f22ef66d7c3f5d1a35fd3e5cebb5 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Wed, 12 Jan 2022 10:39:05 -0500 Subject: [PATCH 098/107] add string test --- stdlib/Profile/src/Allocs.jl | 1 + stdlib/Profile/test/allocs.jl | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 7f2e1382422f7..3c28d6ae53a20 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -107,6 +107,7 @@ function clear() ccall(:jl_free_alloc_profile, Cvoid, ()) _g_expected_sampled_allocs[] = 0 + return nothing end """ diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index 6dae7d6dcd2be..a773835dd43af 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -106,5 +106,14 @@ end @test length(Allocs.fetch().allocs) > 10 Allocs.clear() +end + +@testset "alloc profiler catches strings" begin + Allocs.@profile sample_rate=1 "$(rand())" + + prof = Allocs.fetch() + Allocs.clear() + @test length(prof.allocs) >= 1 + @test length([a for a in prof.allocs if a.type == String]) >= 1 end From 3fc80ac3dc5e39576580e7f459681cd22ffdd5af Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Wed, 12 Jan 2022 10:53:01 -0500 Subject: [PATCH 099/107] alloc profiler: avoid divide-by-zero errors (#19) * avoid divide-by-zero errors when printing error message --- stdlib/Profile/src/Allocs.jl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 3c28d6ae53a20..620bd0a5cc060 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -75,7 +75,7 @@ A sample rate of 1.0 will record everything; 0.0 will record nothing. """ function start(; sample_rate::Real) ccall(:jl_start_alloc_profile, Cvoid, (Cdouble,), Float64(sample_rate)) - + _g_sample_rate[] = sample_rate _g_gc_num_before[] = Base.gc_num() end @@ -120,12 +120,15 @@ function fetch() raw_results = ccall(:jl_fetch_alloc_profile, RawResults, ()) decoded_results = decode(raw_results) - missed_allocs = _g_expected_sampled_allocs[] - length(decoded_results.allocs) - missed_percentage = round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100) - @warn("The allocation profiler is not fully implemented, and missed $(missed_percentage)% " * - "($(round(Int, missed_allocs)) / $(round(Int, _g_expected_sampled_allocs[]))) " * - "of allocs in the last run. " * - "For more info see https://github.com/JuliaLang/julia/issues/43688") + # avoid divide-by-0 errors + if _g_expected_sampled_allocs[] > 0 + missed_allocs = _g_expected_sampled_allocs[] - length(decoded_results.allocs) + missed_percentage = round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100) + @warn("The allocation profiler is not fully implemented, and missed $(missed_percentage)% " * + "($(round(Int, missed_allocs)) / $(round(Int, _g_expected_sampled_allocs[]))) " * + "of allocs in the last run. " * + "For more info see https://github.com/JuliaLang/julia/issues/43688") + end return decoded_results end From 9465507826046add5b4bf8d9a6728e2fd8681cde Mon Sep 17 00:00:00 2001 From: Pete Vilter <7341+vilterp@users.noreply.github.com> Date: Thu, 13 Jan 2022 09:47:06 -0500 Subject: [PATCH 100/107] add paragraph about missed allocations Co-authored-by: Nathan Daly --- doc/src/manual/profile.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/src/manual/profile.md b/doc/src/manual/profile.md index 64b6b8b0e1209..9173994bb3449 100644 --- a/doc/src/manual/profile.md +++ b/doc/src/manual/profile.md @@ -353,6 +353,11 @@ argument can be passed to speed it up by making it skip some allocations. Passing `sample_rate=1.0` will make it record everything (which is slow); `sample_rate=0.1` will record only 10% of the allocations (faster), etc. +NOTE: the current implementation of the Allocations Profiler _does not +capture all allocations._ You can read more about the missing allocations +and the plan to improve this, here: https://github.com/JuliaLang/julia/issues/43688. +Calling `Profile.Allocs.fetch()` will print a log line reporting the percentage +of missed allocations, so you can understand the accuracy of your profile. ## External Profiling Currently Julia supports `Intel VTune`, `OProfile` and `perf` as external profiling tools. From 76ad6f0447a76c9fcf0dbf59e92e546641d4f4a2 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 17 Jan 2022 22:53:01 -0500 Subject: [PATCH 101/107] use !!! note style in comment --- doc/src/manual/profile.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/doc/src/manual/profile.md b/doc/src/manual/profile.md index 9173994bb3449..91b3c34a4fb20 100644 --- a/doc/src/manual/profile.md +++ b/doc/src/manual/profile.md @@ -353,11 +353,14 @@ argument can be passed to speed it up by making it skip some allocations. Passing `sample_rate=1.0` will make it record everything (which is slow); `sample_rate=0.1` will record only 10% of the allocations (faster), etc. -NOTE: the current implementation of the Allocations Profiler _does not -capture all allocations._ You can read more about the missing allocations -and the plan to improve this, here: https://github.com/JuliaLang/julia/issues/43688. -Calling `Profile.Allocs.fetch()` will print a log line reporting the percentage -of missed allocations, so you can understand the accuracy of your profile. +!!! note + + The current implementation of the Allocations Profiler _does not + capture all allocations._ You can read more about the missing allocations + and the plan to improve this, here: https://github.com/JuliaLang/julia/issues/43688. + Calling `Profile.Allocs.fetch()` will print a log line reporting the percentage + of missed allocations, so you can understand the accuracy of your profile. + ## External Profiling Currently Julia supports `Intel VTune`, `OProfile` and `perf` as external profiling tools. From dd693ccfcd0795adcd4787b32d11e167ba87f623 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Mon, 17 Jan 2022 23:12:23 -0500 Subject: [PATCH 102/107] only print warning when missed_percentage > 0 --- stdlib/Profile/src/Allocs.jl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 620bd0a5cc060..85348870943a7 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -124,10 +124,15 @@ function fetch() if _g_expected_sampled_allocs[] > 0 missed_allocs = _g_expected_sampled_allocs[] - length(decoded_results.allocs) missed_percentage = round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100) - @warn("The allocation profiler is not fully implemented, and missed $(missed_percentage)% " * + if missed_percentage > 0 + @warn( + "The allocation profiler is not fully implemented, and missed " * + "$(missed_percentage)% " * "($(round(Int, missed_allocs)) / $(round(Int, _g_expected_sampled_allocs[]))) " * "of allocs in the last run. " * - "For more info see https://github.com/JuliaLang/julia/issues/43688") + "For more info see https://github.com/JuliaLang/julia/issues/43688" + ) + end end return decoded_results end From 4deaf6cdfe99112febcdb7fa8908e006c4980e2e Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Tue, 18 Jan 2022 12:39:26 -0500 Subject: [PATCH 103/107] Attempt to test the warning logs, but struggling to capture stderr correctly --- stdlib/Profile/src/Allocs.jl | 20 ++++++++------- stdlib/Profile/test/allocs.jl | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 85348870943a7..309f40885dd8a 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -122,16 +122,18 @@ function fetch() # avoid divide-by-0 errors if _g_expected_sampled_allocs[] > 0 - missed_allocs = _g_expected_sampled_allocs[] - length(decoded_results.allocs) - missed_percentage = round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100) + missed_allocs = max(0, _g_expected_sampled_allocs[] - length(decoded_results.allocs)) + missed_percentage = max(0, round(Int, missed_allocs / _g_expected_sampled_allocs[] * 100)) if missed_percentage > 0 - @warn( - "The allocation profiler is not fully implemented, and missed " * - "$(missed_percentage)% " * - "($(round(Int, missed_allocs)) / $(round(Int, _g_expected_sampled_allocs[]))) " * - "of allocs in the last run. " * - "For more info see https://github.com/JuliaLang/julia/issues/43688" - ) + @warn("The allocation profiler is not fully implemented, and missed approximately" * + " $(missed_percentage)% (estimated $(round(Int, missed_allocs)) / $(round(Int, + _g_expected_sampled_allocs[]))) " * + "of allocs in the last run. " * + "For more info see https://github.com/JuliaLang/julia/issues/43688") + else + @warn("The allocation profiler is not fully implemented, and may have missed" * + " some of the allocs in the last run. " * + "For more info see https://github.com/JuliaLang/julia/issues/43688") end end return decoded_results diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index a773835dd43af..8c7e9e157aecd 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -108,6 +108,54 @@ end Allocs.clear() end +function capture_stderr(f::Function) + new = Base.redirect_stderr() + try + f() + finally + Base.redirect_stderr(stderr) + flush(new) + close(new) + return read(new, String) + end +end + +@testset "alloc profiler warning message" begin + @testset "no allocs" begin + Profile.Allocs.clear() + Profile.Allocs.fetch() + end + io = IOBuffer() + @testset "catches all allocations" begin + foo() = [] + precompile(foo, ()) + Profile.Allocs.clear() + Profile.Allocs.@profile sample_rate=1 foo() + # Fake that we expected exactly 1 alloc, since we should have recorded >= 1 + Profile.Allocs._g_expected_sampled_allocs[] = 1 + Base.redirect_stderr(io) do + @assert length(Profile.Allocs.fetch().allocs) >= 1 + end + warning = String(take!(io)) + @test occursin("may have missed some of the allocs", warning) + @test occursin("https://github.com/JuliaLang/julia/issues/43688", warning) + end + @testset "misses some allocations" begin + foo() = [] + precompile(foo, ()) + Profile.Allocs.clear() + Profile.Allocs.@profile sample_rate=1 foo() + # Fake some allocs that we missed, to force the print statement + Profile.Allocs._g_expected_sampled_allocs[] += 10 + Base.redirect_stderr(io) do + @assert 1 <= length(Profile.Allocs.fetch().allocs) < 10 + end + warning = String(take!(io)) + @test occursin(r"missed approximately [0-9]+%", warning) + @test occursin("https://github.com/JuliaLang/julia/issues/43688", warning) + end +end + @testset "alloc profiler catches strings" begin Allocs.@profile sample_rate=1 "$(rand())" From 13a85de1681296bde4945623fb80603233b10d25 Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Tue, 18 Jan 2022 12:40:34 -0500 Subject: [PATCH 104/107] Remove the tests, but at least exercise both cases... --- stdlib/Profile/test/allocs.jl | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index 8c7e9e157aecd..27a797ace8d37 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -108,24 +108,11 @@ end Allocs.clear() end -function capture_stderr(f::Function) - new = Base.redirect_stderr() - try - f() - finally - Base.redirect_stderr(stderr) - flush(new) - close(new) - return read(new, String) - end -end - @testset "alloc profiler warning message" begin @testset "no allocs" begin Profile.Allocs.clear() Profile.Allocs.fetch() end - io = IOBuffer() @testset "catches all allocations" begin foo() = [] precompile(foo, ()) @@ -133,12 +120,7 @@ end Profile.Allocs.@profile sample_rate=1 foo() # Fake that we expected exactly 1 alloc, since we should have recorded >= 1 Profile.Allocs._g_expected_sampled_allocs[] = 1 - Base.redirect_stderr(io) do - @assert length(Profile.Allocs.fetch().allocs) >= 1 - end - warning = String(take!(io)) - @test occursin("may have missed some of the allocs", warning) - @test occursin("https://github.com/JuliaLang/julia/issues/43688", warning) + @assert length(Profile.Allocs.fetch().allocs) >= 1 end @testset "misses some allocations" begin foo() = [] @@ -147,12 +129,7 @@ end Profile.Allocs.@profile sample_rate=1 foo() # Fake some allocs that we missed, to force the print statement Profile.Allocs._g_expected_sampled_allocs[] += 10 - Base.redirect_stderr(io) do - @assert 1 <= length(Profile.Allocs.fetch().allocs) < 10 - end - warning = String(take!(io)) - @test occursin(r"missed approximately [0-9]+%", warning) - @test occursin("https://github.com/JuliaLang/julia/issues/43688", warning) + @assert 1 <= length(Profile.Allocs.fetch().allocs) < 10 end end From 68e1a153f84bc9b619fe086dc0e52c6cc5ecdbdd Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Tue, 18 Jan 2022 12:43:15 -0500 Subject: [PATCH 105/107] improve warning wording to indicate sampling --- stdlib/Profile/src/Allocs.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/Profile/src/Allocs.jl b/stdlib/Profile/src/Allocs.jl index 309f40885dd8a..922b31932cb0f 100644 --- a/stdlib/Profile/src/Allocs.jl +++ b/stdlib/Profile/src/Allocs.jl @@ -128,11 +128,11 @@ function fetch() @warn("The allocation profiler is not fully implemented, and missed approximately" * " $(missed_percentage)% (estimated $(round(Int, missed_allocs)) / $(round(Int, _g_expected_sampled_allocs[]))) " * - "of allocs in the last run. " * + "of sampled allocs in the last run. " * "For more info see https://github.com/JuliaLang/julia/issues/43688") else @warn("The allocation profiler is not fully implemented, and may have missed" * - " some of the allocs in the last run. " * + " some of the allocs. " * "For more info see https://github.com/JuliaLang/julia/issues/43688") end end From b5f636aec5d6a936dc96acc29bee635a79bfb34c Mon Sep 17 00:00:00 2001 From: Nathan Daly Date: Tue, 18 Jan 2022 14:29:34 -0500 Subject: [PATCH 106/107] Add type assertion for alloc profiler unit tests --- stdlib/Profile/test/allocs.jl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/stdlib/Profile/test/allocs.jl b/stdlib/Profile/test/allocs.jl index 27a797ace8d37..4eae5b0cf68c1 100644 --- a/stdlib/Profile/test/allocs.jl +++ b/stdlib/Profile/test/allocs.jl @@ -24,7 +24,7 @@ end # @test Threads.nthreads() > 1 function do_work() - ch = Channel{Vector{Int}}(Inf) + ch = Channel{Vector{Float64}}(Inf) @sync for i in 1:NUM_TASKS Threads.@spawn begin # generate garbage @@ -35,6 +35,7 @@ end end # call once to make sure it's compiled + precompile(do_work, ()) do_work() res = Allocs.@profile sample_rate=1 begin @@ -42,17 +43,19 @@ end end profile = Allocs.fetch() - # expecting at least 3 allocations per task: + # expecting at least 2 allocations per task: # 1. the task # 2. the vector - # 3. the buffer inside the vector - @test length(profile.allocs) >= 3*NUM_TASKS - println(length(profile.allocs)) + @test length(profile.allocs) >= 2*NUM_TASKS first_alloc = profile.allocs[1] @test first_alloc.size > 0 @test length(first_alloc.stacktrace) > 0 @test length(string(first_alloc.type)) > 0 + @testset for type in (Task, Vector{Float64},) + @test length(filter(a->a.type <: type, profile.allocs)) >= NUM_TASKS + end + # TODO: it would be nice to assert that these tasks # were actually scheduled onto multiple threads, # and we see allocs from all threads in the profile From b16b610ba918240f4011b8562310431a88ec1737 Mon Sep 17 00:00:00 2001 From: Pete Vilter Date: Tue, 18 Jan 2022 20:02:34 -0500 Subject: [PATCH 107/107] remove superfluous whitespace --- src/julia_internal.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/julia_internal.h b/src/julia_internal.h index 0f42333272f52..e13b0853ec3af 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -365,9 +365,7 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty) v = jl_gc_big_alloc(ptls, allocsz); } jl_set_typeof(v, ty); - maybe_record_alloc_to_profile(v, sz); - return v; }