summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Ferris2017-12-11 19:44:33 -0600
committerChristopher Ferris2018-01-29 12:41:11 -0600
commitc8bec5aa91b20b0173bf6bf5f73f9e6daa40519d (patch)
treecada46a2ee86c8c6c22d563b605a5120caff0426 /libbacktrace
parent8abe4e2638587957f621450b4e4c3ff7af310b08 (diff)
downloadplatform-system-core-c8bec5aa91b20b0173bf6bf5f73f9e6daa40519d.tar.gz
platform-system-core-c8bec5aa91b20b0173bf6bf5f73f9e6daa40519d.tar.xz
platform-system-core-c8bec5aa91b20b0173bf6bf5f73f9e6daa40519d.zip
Use new unwinder for offline in libbacktrace.
libbbacktrace changes: - Completely rewrite the BacktraceOffline class to use the new unwinder. - Modify the test data to save ucontext_t data instead of unw_context data. - Convert the previous tests from unw_context data to ucontext_t data. Bug: 65682279 Test: New unit tests pass in libunwindstack. Test: All offline tests continue to pass. Change-Id: I540345c304b20199d46deeb0349a0638a0f3ab2f
Diffstat (limited to 'libbacktrace')
-rw-r--r--libbacktrace/Android.bp55
-rw-r--r--libbacktrace/Backtrace.cpp4
-rw-r--r--libbacktrace/BacktraceCurrent.cpp2
-rw-r--r--libbacktrace/BacktraceCurrent.h5
-rw-r--r--libbacktrace/BacktraceMap.cpp10
-rw-r--r--libbacktrace/BacktraceOffline.cpp1145
-rw-r--r--libbacktrace/BacktraceOffline.h90
-rw-r--r--libbacktrace/UnwindStack.cpp113
-rw-r--r--libbacktrace/UnwindStack.h22
-rw-r--r--libbacktrace/UnwindStackMap.cpp50
-rw-r--r--libbacktrace/UnwindStackMap.h12
-rw-r--r--libbacktrace/backtrace_offline_test.cpp203
-rw-r--r--libbacktrace/backtrace_test.cpp84
-rw-r--r--libbacktrace/backtrace_testlib.cpp67
-rw-r--r--libbacktrace/backtrace_testlib.h4
-rw-r--r--libbacktrace/include/backtrace/Backtrace.h39
-rw-r--r--libbacktrace/include/backtrace/BacktraceMap.h6
-rw-r--r--libbacktrace/testdata/arm/offline_testdata2
-rw-r--r--libbacktrace/testdata/arm/offline_testdata_for_libGLESv2_adreno4
-rw-r--r--libbacktrace/testdata/arm/offline_testdata_for_libandroid_runtime4
-rw-r--r--libbacktrace/testdata/arm/offline_testdata_for_libart2
-rw-r--r--libbacktrace/testdata/arm64/offline_testdata2
-rw-r--r--libbacktrace/testdata/arm64/offline_testdata_for_eglSubDriverAndroid4
-rw-r--r--libbacktrace/testdata/arm64/offline_testdata_for_libskia4
-rw-r--r--libbacktrace/testdata/x86/offline_testdata2
-rw-r--r--libbacktrace/testdata/x86_64/offline_testdata2
26 files changed, 424 insertions, 1513 deletions
diff --git a/libbacktrace/Android.bp b/libbacktrace/Android.bp
index 94b193594..14ae44564 100644
--- a/libbacktrace/Android.bp
+++ b/libbacktrace/Android.bp
@@ -128,39 +128,8 @@ cc_library_shared {
128 cflags: ["-O0"], 128 cflags: ["-O0"],
129 srcs: ["backtrace_testlib.cpp"], 129 srcs: ["backtrace_testlib.cpp"],
130 130
131 target: { 131 shared_libs: [
132 linux: { 132 "libunwindstack",
133 shared_libs: [
134 "libunwind",
135 "libunwindstack",
136 ],
137 },
138 }
139}
140
141//-------------------------------------------------------------------------
142// The libbacktrace_offline static library.
143//-------------------------------------------------------------------------
144cc_library_static {
145 name: "libbacktrace_offline",
146 defaults: ["libbacktrace_common"],
147 host_supported: true,
148 srcs: ["BacktraceOffline.cpp"],
149
150 cflags: [
151 "-D__STDC_CONSTANT_MACROS",
152 "-D__STDC_LIMIT_MACROS",
153 "-D__STDC_FORMAT_MACROS",
154 ],
155
156 header_libs: ["llvm-headers"],
157
158 // Use shared libraries so their headers get included during build.
159 shared_libs = [
160 "libbase",
161 "libunwind",
162 "libunwindstack",
163 "libziparchive",
164 ], 133 ],
165} 134}
166 135
@@ -193,28 +162,11 @@ cc_test {
193 "libbase", 162 "libbase",
194 "libcutils", 163 "libcutils",
195 "liblog", 164 "liblog",
196 "libunwind",
197 "libunwindstack", 165 "libunwindstack",
198 ], 166 ],
199 167
200 group_static_libs: true, 168 group_static_libs: true,
201 169
202 // Statically link LLVMlibraries to remove dependency on llvm shared library.
203 static_libs = [
204 "libbacktrace_offline",
205 "libLLVMObject",
206 "libLLVMBitReader",
207 "libLLVMMC",
208 "libLLVMMCParser",
209 "libLLVMCore",
210 "libLLVMSupport",
211
212 "libziparchive",
213 "libz",
214 ],
215
216 header_libs: ["llvm-headers"],
217
218 target: { 170 target: {
219 android: { 171 android: {
220 cflags: ["-DENABLE_PSS_TESTS"], 172 cflags: ["-DENABLE_PSS_TESTS"],
@@ -223,9 +175,6 @@ cc_test {
223 ], 175 ],
224 }, 176 },
225 linux_glibc: { 177 linux_glibc: {
226 host_ldlibs: [
227 "-lncurses",
228 ],
229 static_libs: ["libutils"], 178 static_libs: ["libutils"],
230 }, 179 },
231 }, 180 },
diff --git a/libbacktrace/Backtrace.cpp b/libbacktrace/Backtrace.cpp
index 1195e5f26..dec241c3c 100644
--- a/libbacktrace/Backtrace.cpp
+++ b/libbacktrace/Backtrace.cpp
@@ -168,5 +168,9 @@ std::string Backtrace::GetErrorString(BacktraceUnwindError error) {
168 return "Failed to find a function in debug sections"; 168 return "Failed to find a function in debug sections";
169 case BACKTRACE_UNWIND_ERROR_EXECUTE_DWARF_INSTRUCTION_FAILED: 169 case BACKTRACE_UNWIND_ERROR_EXECUTE_DWARF_INSTRUCTION_FAILED:
170 return "Failed to execute dwarf instructions in debug sections"; 170 return "Failed to execute dwarf instructions in debug sections";
171 case BACKTRACE_UNWIND_ERROR_UNWIND_INFO:
172 return "Failed to unwind due to invalid unwind information";
173 case BACKTRACE_UNWIND_ERROR_REPEATED_FRAME:
174 return "Failed to unwind due to same sp/pc repeating";
171 } 175 }
172} 176}
diff --git a/libbacktrace/BacktraceCurrent.cpp b/libbacktrace/BacktraceCurrent.cpp
index d61b28147..f6f4423a1 100644
--- a/libbacktrace/BacktraceCurrent.cpp
+++ b/libbacktrace/BacktraceCurrent.cpp
@@ -64,7 +64,7 @@ size_t BacktraceCurrent::Read(uint64_t addr, uint8_t* buffer, size_t bytes) {
64 return bytes; 64 return bytes;
65} 65}
66 66
67bool BacktraceCurrent::Unwind(size_t num_ignore_frames, ucontext_t* ucontext) { 67bool BacktraceCurrent::Unwind(size_t num_ignore_frames, void* ucontext) {
68 if (GetMap() == nullptr) { 68 if (GetMap() == nullptr) {
69 // Without a map object, we can't do anything. 69 // Without a map object, we can't do anything.
70 error_.error_code = BACKTRACE_UNWIND_ERROR_MAP_MISSING; 70 error_.error_code = BACKTRACE_UNWIND_ERROR_MAP_MISSING;
diff --git a/libbacktrace/BacktraceCurrent.h b/libbacktrace/BacktraceCurrent.h
index 60a9117a9..48c14eaf3 100644
--- a/libbacktrace/BacktraceCurrent.h
+++ b/libbacktrace/BacktraceCurrent.h
@@ -19,7 +19,6 @@
19 19
20#include <stdint.h> 20#include <stdint.h>
21#include <sys/types.h> 21#include <sys/types.h>
22#include <ucontext.h>
23 22
24#include <backtrace/Backtrace.h> 23#include <backtrace/Backtrace.h>
25 24
@@ -44,7 +43,7 @@ class BacktraceCurrent : public Backtrace {
44 43
45 bool ReadWord(uint64_t ptr, word_t* out_value) override; 44 bool ReadWord(uint64_t ptr, word_t* out_value) override;
46 45
47 bool Unwind(size_t num_ignore_frames, ucontext_t* ucontext) override; 46 bool Unwind(size_t num_ignore_frames, void* ucontext) override;
48 47
49 protected: 48 protected:
50 bool DiscardFrame(const backtrace_frame_data_t& frame); 49 bool DiscardFrame(const backtrace_frame_data_t& frame);
@@ -52,7 +51,7 @@ class BacktraceCurrent : public Backtrace {
52 private: 51 private:
53 bool UnwindThread(size_t num_ignore_frames); 52 bool UnwindThread(size_t num_ignore_frames);
54 53
55 virtual bool UnwindFromContext(size_t num_ignore_frames, ucontext_t* ucontext) = 0; 54 virtual bool UnwindFromContext(size_t num_ignore_frames, void* ucontext) = 0;
56}; 55};
57 56
58#endif // _LIBBACKTRACE_BACKTRACE_CURRENT_H 57#endif // _LIBBACKTRACE_BACKTRACE_CURRENT_H
diff --git a/libbacktrace/BacktraceMap.cpp b/libbacktrace/BacktraceMap.cpp
index 2a657b85e..c8a500cee 100644
--- a/libbacktrace/BacktraceMap.cpp
+++ b/libbacktrace/BacktraceMap.cpp
@@ -146,13 +146,3 @@ BacktraceMap* BacktraceMap::Create(pid_t pid, bool /*uncached*/) {
146 return map; 146 return map;
147} 147}
148#endif 148#endif
149
150BacktraceMap* BacktraceMap::Create(pid_t pid, const std::vector<backtrace_map_t>& maps) {
151 BacktraceMap* backtrace_map = new BacktraceMap(pid);
152 backtrace_map->maps_.insert(backtrace_map->maps_.begin(), maps.begin(), maps.end());
153 std::sort(backtrace_map->maps_.begin(), backtrace_map->maps_.end(),
154 [](const backtrace_map_t& map1, const backtrace_map_t& map2) {
155 return map1.start < map2.start;
156 });
157 return backtrace_map;
158}
diff --git a/libbacktrace/BacktraceOffline.cpp b/libbacktrace/BacktraceOffline.cpp
deleted file mode 100644
index a05671651..000000000
--- a/libbacktrace/BacktraceOffline.cpp
+++ /dev/null
@@ -1,1145 +0,0 @@
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "BacktraceOffline.h"
18
19extern "C" {
20#define UNW_REMOTE_ONLY
21#include <dwarf.h>
22}
23
24#include <pthread.h>
25#include <stdint.h>
26#include <stdio.h>
27#include <string.h>
28#include <sys/stat.h>
29#include <sys/types.h>
30#include <ucontext.h>
31#include <unistd.h>
32
33#include <memory>
34#include <mutex>
35#include <string>
36#include <vector>
37
38#include <android-base/file.h>
39#include <android-base/macros.h>
40#include <backtrace/Backtrace.h>
41#include <backtrace/BacktraceMap.h>
42#include <ziparchive/zip_archive.h>
43
44#pragma clang diagnostic push
45#pragma clang diagnostic ignored "-Wunused-parameter"
46
47#include <llvm/ADT/StringRef.h>
48#include <llvm/Object/Binary.h>
49#include <llvm/Object/ELFObjectFile.h>
50#include <llvm/Object/ObjectFile.h>
51
52#pragma clang diagnostic pop
53
54#include "BacktraceLog.h"
55
56struct EhFrame {
57 uint64_t hdr_vaddr;
58 uint64_t vaddr;
59 uint64_t fde_table_offset;
60 uint64_t min_func_vaddr;
61 std::vector<uint8_t> hdr_data;
62 std::vector<uint8_t> data;
63};
64
65struct ArmIdxEntry {
66 uint32_t func_offset;
67 uint32_t value;
68};
69
70struct ArmExidx {
71 uint64_t exidx_vaddr;
72 uint64_t extab_vaddr;
73 std::vector<ArmIdxEntry> exidx_data;
74 std::vector<uint8_t> extab_data;
75 // There is a one-to-one map from exidx_data.func_offset to func_vaddr_array.
76 std::vector<uint32_t> func_vaddr_array;
77};
78
79struct DebugFrameInfo {
80 bool has_arm_exidx;
81 bool has_eh_frame;
82 bool has_debug_frame;
83 bool has_gnu_debugdata;
84
85 EhFrame eh_frame;
86 ArmExidx arm_exidx;
87
88 uint64_t min_vaddr;
89 uint64_t text_end_vaddr;
90
91 DebugFrameInfo() : has_arm_exidx(false), has_eh_frame(false),
92 has_debug_frame(false), has_gnu_debugdata(false) { }
93};
94
95void Space::Clear() {
96 start = 0;
97 end = 0;
98 data = nullptr;
99}
100
101size_t Space::Read(uint64_t addr, uint8_t* buffer, size_t size) {
102 if (addr >= start && addr < end) {
103 size_t read_size = std::min(size, static_cast<size_t>(end - addr));
104 memcpy(buffer, data + (addr - start), read_size);
105 return read_size;
106 }
107 return 0;
108}
109
110static int FindProcInfo(unw_addr_space_t addr_space, unw_word_t ip, unw_proc_info* proc_info,
111 int need_unwind_info, void* arg) {
112 BacktraceOffline* backtrace = reinterpret_cast<BacktraceOffline*>(arg);
113 bool result = backtrace->FindProcInfo(addr_space, ip, proc_info, need_unwind_info);
114 return result ? 0 : -UNW_EINVAL;
115}
116
117static void PutUnwindInfo(unw_addr_space_t, unw_proc_info_t*, void*) {
118}
119
120static int GetDynInfoListAddr(unw_addr_space_t, unw_word_t*, void*) {
121 return -UNW_ENOINFO;
122}
123
124static int AccessMem(unw_addr_space_t, unw_word_t addr, unw_word_t* value, int write, void* arg) {
125 if (write == 1) {
126 return -UNW_EINVAL;
127 }
128 BacktraceOffline* backtrace = reinterpret_cast<BacktraceOffline*>(arg);
129 *value = 0;
130 size_t read_size = backtrace->Read(addr, reinterpret_cast<uint8_t*>(value), sizeof(unw_word_t));
131 // Strictly we should check if read_size matches sizeof(unw_word_t), but it is possible in
132 // .eh_frame_hdr that the section can end at a position not aligned in sizeof(unw_word_t), and
133 // we should permit the read at the end of the section.
134 return (read_size > 0u ? 0 : -UNW_EINVAL);
135}
136
137static int AccessReg(unw_addr_space_t, unw_regnum_t unwind_reg, unw_word_t* value, int write,
138 void* arg) {
139 if (write == 1) {
140 return -UNW_EINVAL;
141 }
142 BacktraceOffline* backtrace = reinterpret_cast<BacktraceOffline*>(arg);
143 uint64_t reg_value;
144 bool result = backtrace->ReadReg(unwind_reg, &reg_value);
145 if (result) {
146 *value = static_cast<unw_word_t>(reg_value);
147 }
148 return result ? 0 : -UNW_EINVAL;
149}
150
151static int AccessFpReg(unw_addr_space_t, unw_regnum_t, unw_fpreg_t*, int, void*) {
152 return -UNW_EINVAL;
153}
154
155static int Resume(unw_addr_space_t, unw_cursor_t*, void*) {
156 return -UNW_EINVAL;
157}
158
159static int GetProcName(unw_addr_space_t, unw_word_t, char*, size_t, unw_word_t*, void*) {
160 return -UNW_EINVAL;
161}
162
163static unw_accessors_t accessors = {
164 .find_proc_info = FindProcInfo,
165 .put_unwind_info = PutUnwindInfo,
166 .get_dyn_info_list_addr = GetDynInfoListAddr,
167 .access_mem = AccessMem,
168 .access_reg = AccessReg,
169 .access_fpreg = AccessFpReg,
170 .resume = Resume,
171 .get_proc_name = GetProcName,
172};
173
174bool BacktraceOffline::Unwind(size_t num_ignore_frames, ucontext_t* context) {
175 if (context == nullptr) {
176 BACK_LOGW("The context is needed for offline backtracing.");
177 error_.error_code = BACKTRACE_UNWIND_ERROR_NO_CONTEXT;
178 return false;
179 }
180 context_ = context;
181 error_.error_code = BACKTRACE_UNWIND_NO_ERROR;
182
183 unw_addr_space_t addr_space = unw_create_addr_space(&accessors, 0);
184 unw_cursor_t cursor;
185 int ret = unw_init_remote(&cursor, addr_space, this);
186 if (ret != 0) {
187 BACK_LOGW("unw_init_remote failed %d", ret);
188 unw_destroy_addr_space(addr_space);
189 error_.error_code = BACKTRACE_UNWIND_ERROR_SETUP_FAILED;
190 return false;
191 }
192 size_t num_frames = 0;
193 while (true) {
194 unw_word_t pc;
195 ret = unw_get_reg(&cursor, UNW_REG_IP, &pc);
196 if (ret < 0) {
197 BACK_LOGW("Failed to read IP %d", ret);
198 error_.error_code = BACKTRACE_UNWIND_ERROR_ACCESS_REG_FAILED;
199 error_.error_info.regno = UNW_REG_IP;
200 break;
201 }
202 unw_word_t sp;
203 ret = unw_get_reg(&cursor, UNW_REG_SP, &sp);
204 if (ret < 0) {
205 BACK_LOGW("Failed to read SP %d", ret);
206 error_.error_code = BACKTRACE_UNWIND_ERROR_ACCESS_REG_FAILED;
207 error_.error_info.regno = UNW_REG_SP;
208 break;
209 }
210
211 if (num_ignore_frames == 0) {
212 backtrace_map_t map;
213 FillInMap(pc, &map);
214 if (map.start == 0 || (map.flags & PROT_EXEC) == 0) {
215 // .eh_frame and .ARM.exidx doesn't know how to unwind from instructions setting up or
216 // destroying stack frames. It can lead to wrong callchains, which may contain pcs outside
217 // executable mapping areas. Stop unwinding once this is detected.
218 error_.error_code = BACKTRACE_UNWIND_ERROR_MAP_MISSING;
219 break;
220 }
221 frames_.resize(num_frames + 1);
222 backtrace_frame_data_t* frame = &frames_[num_frames];
223 frame->num = num_frames;
224 frame->pc = static_cast<uint64_t>(pc);
225 frame->sp = static_cast<uint64_t>(sp);
226 frame->stack_size = 0;
227
228 if (num_frames > 0) {
229 backtrace_frame_data_t* prev = &frames_[num_frames - 1];
230 prev->stack_size = frame->sp - prev->sp;
231 }
232 frame->func_name = GetFunctionName(frame->pc, &frame->func_offset);
233 frame->map = map;
234 num_frames++;
235 } else {
236 num_ignore_frames--;
237 }
238 is_debug_frame_used_ = false;
239 ret = unw_step(&cursor);
240 if (ret <= 0) {
241 if (error_.error_code == BACKTRACE_UNWIND_NO_ERROR) {
242 error_.error_code = BACKTRACE_UNWIND_ERROR_EXECUTE_DWARF_INSTRUCTION_FAILED;
243 }
244 break;
245 }
246 if (num_frames == MAX_BACKTRACE_FRAMES) {
247 error_.error_code = BACKTRACE_UNWIND_ERROR_EXCEED_MAX_FRAMES_LIMIT;
248 break;
249 }
250 }
251 unw_destroy_addr_space(addr_space);
252 context_ = nullptr;
253 return true;
254}
255
256bool BacktraceOffline::ReadWord(uint64_t ptr, word_t* out_value) {
257 size_t bytes_read = Read(ptr, reinterpret_cast<uint8_t*>(out_value), sizeof(word_t));
258 return bytes_read == sizeof(word_t);
259}
260
261size_t BacktraceOffline::Read(uint64_t addr, uint8_t* buffer, size_t bytes) {
262 // Normally, libunwind needs stack information and call frame information to do remote unwinding.
263 // If call frame information is stored in .debug_frame, libunwind can read it from file
264 // by itself. If call frame information is stored in .eh_frame, we need to provide data in
265 // .eh_frame/.eh_frame_hdr sections.
266 // The order of readings below doesn't matter, as the spaces don't overlap with each other.
267 size_t read_size = eh_frame_hdr_space_.Read(addr, buffer, bytes);
268 if (read_size != 0) {
269 return read_size;
270 }
271 read_size = eh_frame_space_.Read(addr, buffer, bytes);
272 if (read_size != 0) {
273 return read_size;
274 }
275 read_size = arm_exidx_space_.Read(addr, buffer, bytes);
276 if (read_size != 0) {
277 return read_size;
278 }
279 read_size = arm_extab_space_.Read(addr, buffer, bytes);
280 if (read_size != 0) {
281 return read_size;
282 }
283 read_size = stack_space_.Read(addr, buffer, bytes);
284 if (read_size != 0) {
285 return read_size;
286 }
287 // In some libraries (like /system/lib64/libskia.so), some CIE entries in .eh_frame use
288 // augmentation "P", which makes libunwind/libunwindstack try to read personality routine in
289 // memory. However, that is not available in offline unwinding. Work around this by returning
290 // all zero data.
291 error_.error_code = BACKTRACE_UNWIND_ERROR_ACCESS_MEM_FAILED;
292 error_.error_info.addr = addr;
293 memset(buffer, 0, bytes);
294 return bytes;
295}
296
297bool BacktraceOffline::FindProcInfo(unw_addr_space_t addr_space, uint64_t ip,
298 unw_proc_info_t* proc_info, int need_unwind_info) {
299 backtrace_map_t map;
300 FillInMap(ip, &map);
301 if (!BacktraceMap::IsValid(map)) {
302 error_.error_code = BACKTRACE_UNWIND_ERROR_FIND_PROC_INFO_FAILED;
303 return false;
304 }
305 const std::string& filename = map.name;
306 DebugFrameInfo* debug_frame = GetDebugFrameInFile(filename);
307 if (debug_frame == nullptr) {
308 error_.error_code = BACKTRACE_UNWIND_ERROR_FIND_PROC_INFO_FAILED;
309 return false;
310 }
311 // Each FindProcInfo() is a new attempt to unwind, so reset the reason.
312 error_.error_code = BACKTRACE_UNWIND_NO_ERROR;
313
314 eh_frame_hdr_space_.Clear();
315 eh_frame_space_.Clear();
316 arm_exidx_space_.Clear();
317 arm_extab_space_.Clear();
318
319 // vaddr in the elf file.
320 uint64_t ip_vaddr = ip - map.start + debug_frame->min_vaddr;
321
322 // The unwind info can come from .ARM.exidx or .eh_frame, or .debug_frame/.gnu_debugdata.
323 // First check .eh_frame/.debug_frame, then check .ARM.exidx. Because .eh_frame/.debug_frame has
324 // function range for each entry, by matching ip address with the function range, we know exactly
325 // whether the ip address hits an entry. But .ARM.exidx doesn't have function range for each
326 // entry, it thinks that an ip address hits an entry when (entry.addr <= ip < next_entry.addr).
327 // To prevent ip addresses hit in .eh_frame/.debug_frame being regarded as addresses hit in
328 // .ARM.exidx, we need to check .eh_frame/.debug_frame first.
329
330 // Check .debug_frame/.gnu_debugdata before .eh_frame, because .debug_frame can unwind from
331 // instructions setting up or destroying stack frames, while .eh_frame can't.
332 if (!is_debug_frame_used_ && (debug_frame->has_debug_frame || debug_frame->has_gnu_debugdata)) {
333 is_debug_frame_used_ = true;
334 unw_dyn_info_t di;
335 unw_word_t segbase = map.start - debug_frame->min_vaddr;
336 // TODO: http://b/32916571
337 // TODO: Do it ourselves is more efficient than calling libunwind functions.
338 int found = dwarf_find_debug_frame(0, &di, ip, segbase, filename.c_str(), map.start, map.end);
339 if (found == 1) {
340 int ret = dwarf_search_unwind_table(addr_space, ip, &di, proc_info, need_unwind_info, this);
341 if (ret == 0) {
342 return true;
343 }
344 }
345 }
346 if (debug_frame->has_eh_frame) {
347 if (ip_vaddr >= debug_frame->eh_frame.min_func_vaddr &&
348 ip_vaddr < debug_frame->text_end_vaddr) {
349 // Prepare eh_frame_hdr space and eh_frame space.
350 eh_frame_hdr_space_.start = ip - ip_vaddr + debug_frame->eh_frame.hdr_vaddr;
351 eh_frame_hdr_space_.end =
352 eh_frame_hdr_space_.start + debug_frame->eh_frame.hdr_data.size();
353 eh_frame_hdr_space_.data = debug_frame->eh_frame.hdr_data.data();
354 eh_frame_space_.start = ip - ip_vaddr + debug_frame->eh_frame.vaddr;
355 eh_frame_space_.end = eh_frame_space_.start + debug_frame->eh_frame.data.size();
356 eh_frame_space_.data = debug_frame->eh_frame.data.data();
357
358 unw_dyn_info di;
359 memset(&di, '\0', sizeof(di));
360 di.start_ip = map.start;
361 di.end_ip = map.end;
362 di.format = UNW_INFO_FORMAT_REMOTE_TABLE;
363 di.u.rti.name_ptr = 0;
364 di.u.rti.segbase = eh_frame_hdr_space_.start;
365 di.u.rti.table_data =
366 eh_frame_hdr_space_.start + debug_frame->eh_frame.fde_table_offset;
367 di.u.rti.table_len = (eh_frame_hdr_space_.end - di.u.rti.table_data) / sizeof(unw_word_t);
368 // TODO: Do it ourselves is more efficient than calling this function.
369 int ret = dwarf_search_unwind_table(addr_space, ip, &di, proc_info, need_unwind_info, this);
370 if (ret == 0) {
371 return true;
372 }
373 }
374 }
375
376 if (debug_frame->has_arm_exidx) {
377 auto& func_vaddrs = debug_frame->arm_exidx.func_vaddr_array;
378 if (ip_vaddr >= func_vaddrs[0] && ip_vaddr < debug_frame->text_end_vaddr) {
379 // Use binary search to find the correct function.
380 auto it = std::upper_bound(func_vaddrs.begin(), func_vaddrs.end(),
381 static_cast<uint32_t>(ip_vaddr));
382 if (it != func_vaddrs.begin()) {
383 --it;
384 // Found the exidx entry.
385 size_t index = it - func_vaddrs.begin();
386 proc_info->start_ip = *it;
387 proc_info->format = UNW_INFO_FORMAT_ARM_EXIDX;
388 proc_info->unwind_info = reinterpret_cast<void*>(
389 static_cast<uint64_t>(index * sizeof(ArmIdxEntry) + debug_frame->arm_exidx.exidx_vaddr +
390 debug_frame->min_vaddr));
391 eh_frame_hdr_space_.Clear();
392 eh_frame_space_.Clear();
393 // Prepare arm_exidx space and arm_extab space.
394 arm_exidx_space_.start = debug_frame->min_vaddr + debug_frame->arm_exidx.exidx_vaddr;
395 arm_exidx_space_.end = arm_exidx_space_.start +
396 debug_frame->arm_exidx.exidx_data.size() * sizeof(ArmIdxEntry);
397 arm_exidx_space_.data = reinterpret_cast<const uint8_t*>(
398 debug_frame->arm_exidx.exidx_data.data());
399
400 arm_extab_space_.start = debug_frame->min_vaddr + debug_frame->arm_exidx.extab_vaddr;
401 arm_extab_space_.end = arm_extab_space_.start +
402 debug_frame->arm_exidx.extab_data.size();
403 arm_extab_space_.data = debug_frame->arm_exidx.extab_data.data();
404 return true;
405 }
406 }
407 }
408 error_.error_code = BACKTRACE_UNWIND_ERROR_FIND_PROC_INFO_FAILED;
409 return false;
410}
411
412bool BacktraceOffline::ReadReg(size_t reg, uint64_t* value) {
413 bool result = true;
414#if defined(__arm__)
415 switch (reg) {
416 case UNW_ARM_R0:
417 *value = context_->uc_mcontext.arm_r0;
418 break;
419 case UNW_ARM_R1:
420 *value = context_->uc_mcontext.arm_r1;
421 break;
422 case UNW_ARM_R2:
423 *value = context_->uc_mcontext.arm_r2;
424 break;
425 case UNW_ARM_R3:
426 *value = context_->uc_mcontext.arm_r3;
427 break;
428 case UNW_ARM_R4:
429 *value = context_->uc_mcontext.arm_r4;
430 break;
431 case UNW_ARM_R5:
432 *value = context_->uc_mcontext.arm_r5;
433 break;
434 case UNW_ARM_R6:
435 *value = context_->uc_mcontext.arm_r6;
436 break;
437 case UNW_ARM_R7:
438 *value = context_->uc_mcontext.arm_r7;
439 break;
440 case UNW_ARM_R8:
441 *value = context_->uc_mcontext.arm_r8;
442 break;
443 case UNW_ARM_R9:
444 *value = context_->uc_mcontext.arm_r9;
445 break;
446 case UNW_ARM_R10:
447 *value = context_->uc_mcontext.arm_r10;
448 break;
449 case UNW_ARM_R11:
450 *value = context_->uc_mcontext.arm_fp;
451 break;
452 case UNW_ARM_R12:
453 *value = context_->uc_mcontext.arm_ip;
454 break;
455 case UNW_ARM_R13:
456 *value = context_->uc_mcontext.arm_sp;
457 break;
458 case UNW_ARM_R14:
459 *value = context_->uc_mcontext.arm_lr;
460 break;
461 case UNW_ARM_R15:
462 *value = context_->uc_mcontext.arm_pc;
463 break;
464 default:
465 result = false;
466 }
467#elif defined(__aarch64__)
468 if (reg <= UNW_AARCH64_PC) {
469 *value = context_->uc_mcontext.regs[reg];
470 } else {
471 result = false;
472 }
473#elif defined(__x86_64__)
474 switch (reg) {
475 case UNW_X86_64_R8:
476 *value = context_->uc_mcontext.gregs[REG_R8];
477 break;
478 case UNW_X86_64_R9:
479 *value = context_->uc_mcontext.gregs[REG_R9];
480 break;
481 case UNW_X86_64_R10:
482 *value = context_->uc_mcontext.gregs[REG_R10];
483 break;
484 case UNW_X86_64_R11:
485 *value = context_->uc_mcontext.gregs[REG_R11];
486 break;
487 case UNW_X86_64_R12:
488 *value = context_->uc_mcontext.gregs[REG_R12];
489 break;
490 case UNW_X86_64_R13:
491 *value = context_->uc_mcontext.gregs[REG_R13];
492 break;
493 case UNW_X86_64_R14:
494 *value = context_->uc_mcontext.gregs[REG_R14];
495 break;
496 case UNW_X86_64_R15:
497 *value = context_->uc_mcontext.gregs[REG_R15];
498 break;
499 case UNW_X86_64_RDI:
500 *value = context_->uc_mcontext.gregs[REG_RDI];
501 break;
502 case UNW_X86_64_RSI:
503 *value = context_->uc_mcontext.gregs[REG_RSI];
504 break;
505 case UNW_X86_64_RBP:
506 *value = context_->uc_mcontext.gregs[REG_RBP];
507 break;
508 case UNW_X86_64_RBX:
509 *value = context_->uc_mcontext.gregs[REG_RBX];
510 break;
511 case UNW_X86_64_RDX:
512 *value = context_->uc_mcontext.gregs[REG_RDX];
513 break;
514 case UNW_X86_64_RAX:
515 *value = context_->uc_mcontext.gregs[REG_RAX];
516 break;
517 case UNW_X86_64_RCX:
518 *value = context_->uc_mcontext.gregs[REG_RCX];
519 break;
520 case UNW_X86_64_RSP:
521 *value = context_->uc_mcontext.gregs[REG_RSP];
522 break;
523 case UNW_X86_64_RIP:
524 *value = context_->uc_mcontext.gregs[REG_RIP];
525 break;
526 default:
527 result = false;
528 }
529#elif defined(__i386__)
530 switch (reg) {
531 case UNW_X86_GS:
532 *value = context_->uc_mcontext.gregs[REG_GS];
533 break;
534 case UNW_X86_FS:
535 *value = context_->uc_mcontext.gregs[REG_FS];
536 break;
537 case UNW_X86_ES:
538 *value = context_->uc_mcontext.gregs[REG_ES];
539 break;
540 case UNW_X86_DS:
541 *value = context_->uc_mcontext.gregs[REG_DS];
542 break;
543 case UNW_X86_EAX:
544 *value = context_->uc_mcontext.gregs[REG_EAX];
545 break;
546 case UNW_X86_EBX:
547 *value = context_->uc_mcontext.gregs[REG_EBX];
548 break;
549 case UNW_X86_ECX:
550 *value = context_->uc_mcontext.gregs[REG_ECX];
551 break;
552 case UNW_X86_EDX:
553 *value = context_->uc_mcontext.gregs[REG_EDX];
554 break;
555 case UNW_X86_ESI:
556 *value = context_->uc_mcontext.gregs[REG_ESI];
557 break;
558 case UNW_X86_EDI:
559 *value = context_->uc_mcontext.gregs[REG_EDI];
560 break;
561 case UNW_X86_EBP:
562 *value = context_->uc_mcontext.gregs[REG_EBP];
563 break;
564 case UNW_X86_EIP:
565 *value = context_->uc_mcontext.gregs[REG_EIP];
566 break;
567 case UNW_X86_ESP:
568 *value = context_->uc_mcontext.gregs[REG_ESP];
569 break;
570 case UNW_X86_TRAPNO:
571 *value = context_->uc_mcontext.gregs[REG_TRAPNO];
572 break;
573 case UNW_X86_CS:
574 *value = context_->uc_mcontext.gregs[REG_CS];
575 break;
576 case UNW_X86_EFLAGS:
577 *value = context_->uc_mcontext.gregs[REG_EFL];
578 break;
579 case UNW_X86_SS:
580 *value = context_->uc_mcontext.gregs[REG_SS];
581 break;
582 default:
583 result = false;
584 }
585#else
586 UNUSED(reg);
587 UNUSED(value);
588 result = false;
589#endif
590 if (!result) {
591 error_.error_code = BACKTRACE_UNWIND_ERROR_ACCESS_REG_FAILED;
592 error_.error_info.regno = reg;
593 }
594 return result;
595}
596
597std::string BacktraceOffline::GetFunctionNameRaw(uint64_t, uint64_t* offset) {
598 // We don't have enough information to support this. And it is expensive.
599 *offset = 0;
600 return "";
601}
602
603static std::mutex g_lock;
604static std::unordered_map<std::string, std::unique_ptr<DebugFrameInfo>>* g_debug_frames = nullptr;
605
606static DebugFrameInfo* ReadDebugFrameFromFile(const std::string& filename);
607
608DebugFrameInfo* BacktraceOffline::GetDebugFrameInFile(const std::string& filename) {
609 if (cache_file_) {
610 std::lock_guard<std::mutex> lock(g_lock);
611 if (g_debug_frames != nullptr) {
612 auto it = g_debug_frames->find(filename);
613 if (it != g_debug_frames->end()) {
614 return it->second.get();
615 }
616 }
617 }
618 DebugFrameInfo* debug_frame = ReadDebugFrameFromFile(filename);
619 if (cache_file_) {
620 std::lock_guard<std::mutex> lock(g_lock);
621 if (g_debug_frames == nullptr) {
622 g_debug_frames = new std::unordered_map<std::string, std::unique_ptr<DebugFrameInfo>>;
623 }
624 auto pair = g_debug_frames->emplace(filename, std::unique_ptr<DebugFrameInfo>(debug_frame));
625 if (!pair.second) {
626 debug_frame = pair.first->second.get();
627 }
628 }
629 return debug_frame;
630}
631
632static bool OmitEncodedValue(uint8_t encode, const uint8_t*& p, bool is_elf64) {
633 if (encode == DW_EH_PE_omit) {
634 return 0;
635 }
636 uint8_t format = encode & 0x0f;
637 switch (format) {
638 case DW_EH_PE_ptr:
639 p += is_elf64 ? 8 : 4;
640 break;
641 case DW_EH_PE_uleb128:
642 case DW_EH_PE_sleb128:
643 while ((*p & 0x80) != 0) {
644 ++p;
645 }
646 ++p;
647 break;
648 case DW_EH_PE_udata2:
649 case DW_EH_PE_sdata2:
650 p += 2;
651 break;
652 case DW_EH_PE_udata4:
653 case DW_EH_PE_sdata4:
654 p += 4;
655 break;
656 case DW_EH_PE_udata8:
657 case DW_EH_PE_sdata8:
658 p += 8;
659 break;
660 default:
661 return false;
662 }
663 return true;
664}
665
666static bool GetFdeTableOffsetInEhFrameHdr(const std::vector<uint8_t>& data,
667 uint64_t* table_offset_in_eh_frame_hdr, bool is_elf64) {
668 const uint8_t* p = data.data();
669 const uint8_t* end = p + data.size();
670 if (p + 4 > end) {
671 return false;
672 }
673 uint8_t version = *p++;
674 if (version != 1) {
675 return false;
676 }
677 uint8_t eh_frame_ptr_encode = *p++;
678 uint8_t fde_count_encode = *p++;
679 uint8_t fde_table_encode = *p++;
680
681 if (fde_table_encode != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) {
682 return false;
683 }
684
685 if (!OmitEncodedValue(eh_frame_ptr_encode, p, is_elf64) ||
686 !OmitEncodedValue(fde_count_encode, p, is_elf64)) {
687 return false;
688 }
689 if (p >= end) {
690 return false;
691 }
692 *table_offset_in_eh_frame_hdr = p - data.data();
693 return true;
694}
695
696static uint64_t ReadFromBuffer(const uint8_t*& p, size_t size) {
697 uint64_t result = 0;
698 int shift = 0;
699 while (size-- > 0) {
700 uint64_t tmp = *p++;
701 result |= tmp << shift;
702 shift += 8;
703 }
704 return result;
705}
706
707static uint64_t ReadSignValueFromBuffer(const uint8_t*& p, size_t size) {
708 uint64_t result = 0;
709 int shift = 0;
710 for (size_t i = 0; i < size; ++i) {
711 uint64_t tmp = *p++;
712 result |= tmp << shift;
713 shift += 8;
714 }
715 if (*(p - 1) & 0x80) {
716 result |= (-1ULL) << (size * 8);
717 }
718 return result;
719}
720
721static const char* ReadStrFromBuffer(const uint8_t*& p) {
722 const char* result = reinterpret_cast<const char*>(p);
723 p += strlen(result) + 1;
724 return result;
725}
726
727static int64_t ReadLEB128FromBuffer(const uint8_t*& p) {
728 int64_t result = 0;
729 int64_t tmp;
730 int shift = 0;
731 while (*p & 0x80) {
732 tmp = *p & 0x7f;
733 result |= tmp << shift;
734 shift += 7;
735 p++;
736 }
737 tmp = *p;
738 result |= tmp << shift;
739 if (*p & 0x40) {
740 result |= -((tmp & 0x40) << shift);
741 }
742 p++;
743 return result;
744}
745
746static uint64_t ReadULEB128FromBuffer(const uint8_t*& p) {
747 uint64_t result = 0;
748 uint64_t tmp;
749 int shift = 0;
750 while (*p & 0x80) {
751 tmp = *p & 0x7f;
752 result |= tmp << shift;
753 shift += 7;
754 p++;
755 }
756 tmp = *p;
757 result |= tmp << shift;
758 p++;
759 return result;
760}
761
762static uint64_t ReadEhEncoding(const uint8_t*& p, uint8_t encoding, bool is_elf64,
763 uint64_t section_vaddr, const uint8_t* section_begin) {
764 const uint8_t* init_addr = p;
765 uint64_t result = 0;
766 switch (encoding & 0x0f) {
767 case DW_EH_PE_absptr:
768 result = ReadFromBuffer(p, is_elf64 ? 8 : 4);
769 break;
770 case DW_EH_PE_omit:
771 result = 0;
772 break;
773 case DW_EH_PE_uleb128:
774 result = ReadULEB128FromBuffer(p);
775 break;
776 case DW_EH_PE_udata2:
777 result = ReadFromBuffer(p, 2);
778 break;
779 case DW_EH_PE_udata4:
780 result = ReadFromBuffer(p, 4);
781 break;
782 case DW_EH_PE_udata8:
783 result = ReadFromBuffer(p, 8);
784 break;
785 case DW_EH_PE_sleb128:
786 result = ReadLEB128FromBuffer(p);
787 break;
788 case DW_EH_PE_sdata2:
789 result = ReadSignValueFromBuffer(p, 2);
790 break;
791 case DW_EH_PE_sdata4:
792 result = ReadSignValueFromBuffer(p, 4);
793 break;
794 case DW_EH_PE_sdata8:
795 result = ReadSignValueFromBuffer(p, 8);
796 break;
797 }
798 switch (encoding & 0xf0) {
799 case DW_EH_PE_pcrel:
800 result += init_addr - section_begin + section_vaddr;
801 break;
802 case DW_EH_PE_datarel:
803 result += section_vaddr;
804 break;
805 }
806 return result;
807}
808
809static bool BuildEhFrameHdr(DebugFrameInfo* info, bool is_elf64) {
810 // For each fde entry, collect its (func_vaddr, fde_vaddr) pair.
811 std::vector<std::pair<uint64_t, uint64_t>> index_table;
812 // Map form cie_offset to fde encoding.
813 std::unordered_map<size_t, uint8_t> cie_map;
814 const uint8_t* eh_frame_begin = info->eh_frame.data.data();
815 const uint8_t* eh_frame_end = eh_frame_begin + info->eh_frame.data.size();
816 const uint8_t* p = eh_frame_begin;
817 uint64_t eh_frame_vaddr = info->eh_frame.vaddr;
818 while (p < eh_frame_end) {
819 const uint8_t* unit_begin = p;
820 uint64_t unit_len = ReadFromBuffer(p, 4);
821 size_t secbytes = 4;
822 if (unit_len == 0xffffffff) {
823 unit_len = ReadFromBuffer(p, 8);
824 secbytes = 8;
825 }
826 const uint8_t* unit_end = p + unit_len;
827 uint64_t cie_id = ReadFromBuffer(p, secbytes);
828 if (cie_id == 0) {
829 // This is a CIE.
830 // Read version
831 uint8_t version = *p++;
832 // Read augmentation
833 const char* augmentation = ReadStrFromBuffer(p);
834 if (version >= 4) {
835 // Read address size and segment size
836 p += 2;
837 }
838 // Read code alignment factor
839 ReadULEB128FromBuffer(p);
840 // Read data alignment factor
841 ReadLEB128FromBuffer(p);
842 // Read return address register
843 if (version == 1) {
844 p++;
845 } else {
846 ReadULEB128FromBuffer(p);
847 }
848 uint8_t fde_pointer_encoding = 0;
849 if (augmentation[0] == 'z') {
850 // Read augmentation length.
851 ReadULEB128FromBuffer(p);
852 for (int i = 1; augmentation[i] != '\0'; ++i) {
853 char c = augmentation[i];
854 if (c == 'R') {
855 fde_pointer_encoding = *p++;
856 } else if (c == 'P') {
857 // Read personality handler
858 uint8_t encoding = *p++;
859 OmitEncodedValue(encoding, p, is_elf64);
860 } else if (c == 'L') {
861 // Read lsda encoding
862 p++;
863 }
864 }
865 }
866 cie_map[unit_begin - eh_frame_begin] = fde_pointer_encoding;
867 } else {
868 // This is an FDE.
869 size_t cie_offset = p - secbytes - eh_frame_begin - cie_id;
870 auto it = cie_map.find(cie_offset);
871 if (it != cie_map.end()) {
872 uint8_t fde_pointer_encoding = it->second;
873 uint64_t initial_location =
874 ReadEhEncoding(p, fde_pointer_encoding, is_elf64, eh_frame_vaddr, eh_frame_begin);
875 uint64_t fde_vaddr = unit_begin - eh_frame_begin + eh_frame_vaddr;
876 index_table.push_back(std::make_pair(initial_location, fde_vaddr));
877 }
878 }
879 p = unit_end;
880 }
881 if (index_table.empty()) {
882 return false;
883 }
884 std::sort(index_table.begin(), index_table.end());
885 info->eh_frame.hdr_vaddr = 0;
886 info->eh_frame.hdr_data.resize(index_table.size() * 8);
887 uint32_t* ptr = reinterpret_cast<uint32_t*>(info->eh_frame.hdr_data.data());
888 for (auto& pair : index_table) {
889 *ptr++ = static_cast<uint32_t>(pair.first - info->eh_frame.hdr_vaddr);
890 *ptr++ = static_cast<uint32_t>(pair.second - info->eh_frame.hdr_vaddr);
891 }
892 info->eh_frame.fde_table_offset = 0;
893 info->eh_frame.min_func_vaddr = index_table[0].first;
894 return true;
895}
896
897template <class ELFT>
898DebugFrameInfo* ReadDebugFrameFromELFFile(const llvm::object::ELFFile<ELFT>* elf) {
899 DebugFrameInfo* result = new DebugFrameInfo;
900 result->eh_frame.hdr_vaddr = 0;
901 result->text_end_vaddr = std::numeric_limits<uint64_t>::max();
902
903 bool is_elf64 = (elf->getHeader()->getFileClass() == llvm::ELF::ELFCLASS64);
904 bool has_eh_frame_hdr = false;
905 bool has_eh_frame = false;
906
907 for (auto it = elf->section_begin(); it != elf->section_end(); ++it) {
908 llvm::ErrorOr<llvm::StringRef> name = elf->getSectionName(&*it);
909 if (name) {
910 std::string s = name.get();
911 if (s == ".debug_frame") {
912 result->has_debug_frame = true;
913 } else if (s == ".gnu_debugdata") {
914 result->has_gnu_debugdata = true;
915 } else if (s == ".eh_frame_hdr") {
916 result->eh_frame.hdr_vaddr = it->sh_addr;
917 llvm::ErrorOr<llvm::ArrayRef<uint8_t>> data = elf->getSectionContents(&*it);
918 if (data) {
919 result->eh_frame.hdr_data.insert(result->eh_frame.hdr_data.end(),
920 data->data(), data->data() + data->size());
921
922 uint64_t fde_table_offset;
923 if (GetFdeTableOffsetInEhFrameHdr(result->eh_frame.hdr_data, &fde_table_offset, is_elf64)) {
924 result->eh_frame.fde_table_offset = fde_table_offset;
925 // Make sure we have at least one entry in fde_table.
926 if (fde_table_offset + 2 * sizeof(int32_t) <= data->size()) {
927 intptr_t eh_frame_hdr_vaddr = it->sh_addr;
928 int32_t sdata;
929 uint8_t* p = result->eh_frame.hdr_data.data() + fde_table_offset;
930 memcpy(&sdata, p, sizeof(sdata));
931 result->eh_frame.min_func_vaddr = eh_frame_hdr_vaddr + sdata;
932 has_eh_frame_hdr = true;
933 }
934 }
935 }
936 } else if (s == ".eh_frame") {
937 result->eh_frame.vaddr = it->sh_addr;
938 llvm::ErrorOr<llvm::ArrayRef<uint8_t>> data = elf->getSectionContents(&*it);
939 if (data) {
940 result->eh_frame.data.insert(result->eh_frame.data.end(),
941 data->data(), data->data() + data->size());
942 has_eh_frame = true;
943 }
944 } else if (s == ".ARM.exidx") {
945 result->arm_exidx.exidx_vaddr = it->sh_addr;
946 llvm::ErrorOr<llvm::ArrayRef<uint8_t>> data = elf->getSectionContents(&*it);
947 if (data) {
948 size_t entry_count = data->size() / sizeof(ArmIdxEntry);
949 result->arm_exidx.exidx_data.resize(entry_count);
950 memcpy(result->arm_exidx.exidx_data.data(), data->data(),
951 entry_count * sizeof(ArmIdxEntry));
952 if (entry_count > 0u) {
953 // Change IdxEntry.func_offset into vaddr.
954 result->arm_exidx.func_vaddr_array.reserve(entry_count);
955 uint32_t vaddr = it->sh_addr;
956 for (auto& entry : result->arm_exidx.exidx_data) {
957 uint32_t func_offset = entry.func_offset + vaddr;
958 // Clear bit 31 for the prel31 offset.
959 // Arm sets bit 0 to mark it as thumb code, remove the flag.
960 result->arm_exidx.func_vaddr_array.push_back(
961 func_offset & 0x7ffffffe);
962 vaddr += 8;
963 }
964 result->has_arm_exidx = true;
965 }
966 }
967 } else if (s == ".ARM.extab") {
968 result->arm_exidx.extab_vaddr = it->sh_addr;
969 llvm::ErrorOr<llvm::ArrayRef<uint8_t>> data = elf->getSectionContents(&*it);
970 if (data) {
971 result->arm_exidx.extab_data.insert(result->arm_exidx.extab_data.end(),
972 data->data(), data->data() + data->size());
973 }
974 } else if (s == ".text") {
975 result->text_end_vaddr = it->sh_addr + it->sh_size;
976 }
977 }
978 }
979
980 if (has_eh_frame) {
981 if (!has_eh_frame_hdr) {
982 // Some libraries (like /vendor/lib64/egl/eglSubDriverAndroid.so) contain empty
983 // .eh_frame_hdr.
984 if (BuildEhFrameHdr(result, is_elf64)) {
985 has_eh_frame_hdr = true;
986 }
987 }
988 if (has_eh_frame_hdr) {
989 result->has_eh_frame = true;
990 }
991 }
992 if (has_eh_frame_hdr && has_eh_frame) {
993 result->has_eh_frame = true;
994 }
995
996 result->min_vaddr = std::numeric_limits<uint64_t>::max();
997 for (auto it = elf->program_header_begin(); it != elf->program_header_end(); ++it) {
998 if ((it->p_type == llvm::ELF::PT_LOAD) && (it->p_flags & llvm::ELF::PF_X)) {
999 if (it->p_vaddr < result->min_vaddr) {
1000 result->min_vaddr = it->p_vaddr;
1001 }
1002 }
1003 }
1004 if (!result->has_eh_frame && !result->has_arm_exidx && !result->has_debug_frame &&
1005 !result->has_gnu_debugdata) {
1006 delete result;
1007 return nullptr;
1008 }
1009 return result;
1010}
1011
1012static bool IsValidElfPath(const std::string& filename) {
1013 static const char elf_magic[] = {0x7f, 'E', 'L', 'F'};
1014
1015 struct stat st;
1016 if (stat(filename.c_str(), &st) != 0 || !S_ISREG(st.st_mode)) {
1017 return false;
1018 }
1019 FILE* fp = fopen(filename.c_str(), "reb");
1020 if (fp == nullptr) {
1021 return false;
1022 }
1023 char buf[4];
1024 if (fread(buf, 4, 1, fp) != 1) {
1025 fclose(fp);
1026 return false;
1027 }
1028 fclose(fp);
1029 return memcmp(buf, elf_magic, 4) == 0;
1030}
1031
1032static bool IsValidApkPath(const std::string& apk_path) {
1033 static const char zip_preamble[] = {0x50, 0x4b, 0x03, 0x04};
1034 struct stat st;
1035 if (stat(apk_path.c_str(), &st) != 0 || !S_ISREG(st.st_mode)) {
1036 return false;
1037 }
1038 FILE* fp = fopen(apk_path.c_str(), "reb");
1039 if (fp == nullptr) {
1040 return false;
1041 }
1042 char buf[4];
1043 if (fread(buf, 4, 1, fp) != 1) {
1044 fclose(fp);
1045 return false;
1046 }
1047 fclose(fp);
1048 return memcmp(buf, zip_preamble, 4) == 0;
1049}
1050
1051class ScopedZiparchiveHandle {
1052 public:
1053 explicit ScopedZiparchiveHandle(ZipArchiveHandle handle) : handle_(handle) {
1054 }
1055
1056 ~ScopedZiparchiveHandle() {
1057 CloseArchive(handle_);
1058 }
1059
1060 private:
1061 ZipArchiveHandle handle_;
1062};
1063
1064llvm::object::OwningBinary<llvm::object::Binary> OpenEmbeddedElfFile(const std::string& filename) {
1065 llvm::object::OwningBinary<llvm::object::Binary> nothing;
1066 size_t pos = filename.find("!/");
1067 if (pos == std::string::npos) {
1068 return nothing;
1069 }
1070 std::string apk_file = filename.substr(0, pos);
1071 std::string elf_file = filename.substr(pos + 2);
1072 if (!IsValidApkPath(apk_file)) {
1073 BACK_LOGW("%s is not a valid apk file", apk_file.c_str());
1074 return nothing;
1075 }
1076 ZipArchiveHandle handle;
1077 int32_t ret_code = OpenArchive(apk_file.c_str(), &handle);
1078 if (ret_code != 0) {
1079 CloseArchive(handle);
1080 BACK_LOGW("failed to open archive %s: %s", apk_file.c_str(), ErrorCodeString(ret_code));
1081 return nothing;
1082 }
1083 ScopedZiparchiveHandle scoped_handle(handle);
1084 ZipEntry zentry;
1085 ret_code = FindEntry(handle, ZipString(elf_file.c_str()), &zentry);
1086 if (ret_code != 0) {
1087 BACK_LOGW("failed to find %s in %s: %s", elf_file.c_str(), apk_file.c_str(),
1088 ErrorCodeString(ret_code));
1089 return nothing;
1090 }
1091 if (zentry.method != kCompressStored || zentry.compressed_length != zentry.uncompressed_length) {
1092 BACK_LOGW("%s is compressed in %s, which doesn't support running directly", elf_file.c_str(),
1093 apk_file.c_str());
1094 return nothing;
1095 }
1096 auto buffer_or_err = llvm::MemoryBuffer::getOpenFileSlice(GetFileDescriptor(handle), apk_file,
1097 zentry.uncompressed_length,
1098 zentry.offset);
1099 if (!buffer_or_err) {
1100 BACK_LOGW("failed to read %s in %s: %s", elf_file.c_str(), apk_file.c_str(),
1101 buffer_or_err.getError().message().c_str());
1102 return nothing;
1103 }
1104 auto binary_or_err = llvm::object::createBinary(buffer_or_err.get()->getMemBufferRef());
1105 if (!binary_or_err) {
1106 BACK_LOGW("failed to create binary for %s in %s: %s", elf_file.c_str(), apk_file.c_str(),
1107 llvm::toString(binary_or_err.takeError()).c_str());
1108 return nothing;
1109 }
1110 return llvm::object::OwningBinary<llvm::object::Binary>(std::move(binary_or_err.get()),
1111 std::move(buffer_or_err.get()));
1112}
1113
1114static DebugFrameInfo* ReadDebugFrameFromFile(const std::string& filename) {
1115 llvm::object::OwningBinary<llvm::object::Binary> owning_binary;
1116 if (filename.find("!/") != std::string::npos) {
1117 owning_binary = OpenEmbeddedElfFile(filename);
1118 } else {
1119 if (!IsValidElfPath(filename)) {
1120 return nullptr;
1121 }
1122 auto binary_or_err = llvm::object::createBinary(llvm::StringRef(filename));
1123 if (!binary_or_err) {
1124 return nullptr;
1125 }
1126 owning_binary = std::move(binary_or_err.get());
1127 }
1128 llvm::object::Binary* binary = owning_binary.getBinary();
1129 auto obj = llvm::dyn_cast<llvm::object::ObjectFile>(binary);
1130 if (obj == nullptr) {
1131 return nullptr;
1132 }
1133 if (auto elf = llvm::dyn_cast<llvm::object::ELF32LEObjectFile>(obj)) {
1134 return ReadDebugFrameFromELFFile(elf->getELFFile());
1135 }
1136 if (auto elf = llvm::dyn_cast<llvm::object::ELF64LEObjectFile>(obj)) {
1137 return ReadDebugFrameFromELFFile(elf->getELFFile());
1138 }
1139 return nullptr;
1140}
1141
1142Backtrace* Backtrace::CreateOffline(pid_t pid, pid_t tid, BacktraceMap* map,
1143 const backtrace_stackinfo_t& stack, bool cache_file) {
1144 return new BacktraceOffline(pid, tid, map, stack, cache_file);
1145}
diff --git a/libbacktrace/BacktraceOffline.h b/libbacktrace/BacktraceOffline.h
deleted file mode 100644
index e028cd848..000000000
--- a/libbacktrace/BacktraceOffline.h
+++ /dev/null
@@ -1,90 +0,0 @@
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _LIBBACKTRACE_UNWIND_OFFLINE_H
18#define _LIBBACKTRACE_UNWIND_OFFLINE_H
19
20#include <libunwind.h>
21#include <stdint.h>
22#include <sys/types.h>
23#include <ucontext.h>
24
25#include <unordered_map>
26#include <unordered_set>
27
28#include <backtrace/Backtrace.h>
29
30struct Space {
31 uint64_t start;
32 uint64_t end;
33 const uint8_t* data;
34
35 Space() { Clear(); }
36
37 void Clear();
38 size_t Read(uint64_t addr, uint8_t* buffer, size_t size);
39};
40
41struct DebugFrameInfo;
42
43class BacktraceOffline : public Backtrace {
44 public:
45 BacktraceOffline(pid_t pid, pid_t tid, BacktraceMap* map, const backtrace_stackinfo_t& stack,
46 bool cache_file)
47 : Backtrace(pid, tid, map),
48 cache_file_(cache_file),
49 context_(nullptr),
50 is_debug_frame_used_(false) {
51 stack_space_.start = stack.start;
52 stack_space_.end = stack.end;
53 stack_space_.data = stack.data;
54 }
55
56 virtual ~BacktraceOffline() = default;
57
58 bool Unwind(size_t num_ignore_frames, ucontext_t* context) override;
59
60 bool ReadWord(uint64_t ptr, word_t* out_value) override;
61
62 size_t Read(uint64_t addr, uint8_t* buffer, size_t bytes) override;
63
64 bool FindProcInfo(unw_addr_space_t addr_space, uint64_t ip, unw_proc_info_t* proc_info,
65 int need_unwind_info);
66
67 bool ReadReg(size_t reg_index, uint64_t* value);
68
69 protected:
70 std::string GetFunctionNameRaw(uint64_t pc, uint64_t* offset) override;
71 DebugFrameInfo* GetDebugFrameInFile(const std::string& filename);
72
73 bool cache_file_;
74 ucontext_t* context_;
75 Space eh_frame_hdr_space_;
76 Space eh_frame_space_;
77 Space arm_extab_space_;
78 Space arm_exidx_space_;
79 Space stack_space_;
80
81 // is_debug_frame_used_ is to make sure we can try both .debug_frame and .ARM.exidx in
82 // FindProcInfo() on ARM. One example is EsxContext::Clear() in
83 // vendor/lib/egl/libGLESv2_adreno.so. EsxContext::Clear() appears in both .debug_frame and
84 // .ARM.exidx. However, libunwind fails to execute debug_frame instruction
85 // "DW_CFA_offset_extended: r265 at cfa-48". So we need to try .ARM.exidx to unwind that
86 // function.
87 bool is_debug_frame_used_;
88};
89
90#endif // _LIBBACKTRACE_BACKTRACE_OFFLINE_H
diff --git a/libbacktrace/UnwindStack.cpp b/libbacktrace/UnwindStack.cpp
index c5d498cb8..158467ec2 100644
--- a/libbacktrace/UnwindStack.cpp
+++ b/libbacktrace/UnwindStack.cpp
@@ -18,7 +18,6 @@
18#include <stdint.h> 18#include <stdint.h>
19#include <stdlib.h> 19#include <stdlib.h>
20#include <string.h> 20#include <string.h>
21#include <ucontext.h>
22 21
23#include <memory> 22#include <memory>
24#include <set> 23#include <set>
@@ -103,7 +102,7 @@ static void FillInDexFrame(UnwindStackMap* stack_map, uint64_t dex_pc,
103 102
104bool Backtrace::Unwind(unwindstack::Regs* regs, BacktraceMap* back_map, 103bool Backtrace::Unwind(unwindstack::Regs* regs, BacktraceMap* back_map,
105 std::vector<backtrace_frame_data_t>* frames, size_t num_ignore_frames, 104 std::vector<backtrace_frame_data_t>* frames, size_t num_ignore_frames,
106 std::vector<std::string>* skip_names) { 105 std::vector<std::string>* skip_names, BacktraceUnwindError* error) {
107 UnwindStackMap* stack_map = reinterpret_cast<UnwindStackMap*>(back_map); 106 UnwindStackMap* stack_map = reinterpret_cast<UnwindStackMap*>(back_map);
108 auto process_memory = stack_map->process_memory(); 107 auto process_memory = stack_map->process_memory();
109 unwindstack::Unwinder unwinder(MAX_BACKTRACE_FRAMES + num_ignore_frames, stack_map->stack_maps(), 108 unwindstack::Unwinder unwinder(MAX_BACKTRACE_FRAMES + num_ignore_frames, stack_map->stack_maps(),
@@ -112,6 +111,38 @@ bool Backtrace::Unwind(unwindstack::Regs* regs, BacktraceMap* back_map,
112 unwinder.SetJitDebug(stack_map->GetJitDebug(), regs->Arch()); 111 unwinder.SetJitDebug(stack_map->GetJitDebug(), regs->Arch());
113 } 112 }
114 unwinder.Unwind(skip_names, &stack_map->GetSuffixesToIgnore()); 113 unwinder.Unwind(skip_names, &stack_map->GetSuffixesToIgnore());
114 if (error != nullptr) {
115 switch (unwinder.LastErrorCode()) {
116 case unwindstack::ERROR_NONE:
117 error->error_code = BACKTRACE_UNWIND_NO_ERROR;
118 break;
119
120 case unwindstack::ERROR_MEMORY_INVALID:
121 error->error_code = BACKTRACE_UNWIND_ERROR_ACCESS_MEM_FAILED;
122 error->error_info.addr = unwinder.LastErrorAddress();
123 break;
124
125 case unwindstack::ERROR_UNWIND_INFO:
126 error->error_code = BACKTRACE_UNWIND_ERROR_UNWIND_INFO;
127 break;
128
129 case unwindstack::ERROR_UNSUPPORTED:
130 error->error_code = BACKTRACE_UNWIND_ERROR_UNSUPPORTED_OPERATION;
131 break;
132
133 case unwindstack::ERROR_INVALID_MAP:
134 error->error_code = BACKTRACE_UNWIND_ERROR_MAP_MISSING;
135 break;
136
137 case unwindstack::ERROR_MAX_FRAMES_EXCEEDED:
138 error->error_code = BACKTRACE_UNWIND_ERROR_EXCEED_MAX_FRAMES_LIMIT;
139 break;
140
141 case unwindstack::ERROR_REPEATED_FRAME:
142 error->error_code = BACKTRACE_UNWIND_ERROR_REPEATED_FRAME;
143 break;
144 }
145 }
115 146
116 if (num_ignore_frames >= unwinder.NumFrames()) { 147 if (num_ignore_frames >= unwinder.NumFrames()) {
117 frames->resize(0); 148 frames->resize(0);
@@ -178,7 +209,7 @@ std::string UnwindStackCurrent::GetFunctionNameRaw(uint64_t pc, uint64_t* offset
178 return GetMap()->GetFunctionName(pc, offset); 209 return GetMap()->GetFunctionName(pc, offset);
179} 210}
180 211
181bool UnwindStackCurrent::UnwindFromContext(size_t num_ignore_frames, ucontext_t* ucontext) { 212bool UnwindStackCurrent::UnwindFromContext(size_t num_ignore_frames, void* ucontext) {
182 std::unique_ptr<unwindstack::Regs> regs; 213 std::unique_ptr<unwindstack::Regs> regs;
183 if (ucontext == nullptr) { 214 if (ucontext == nullptr) {
184 regs.reset(unwindstack::Regs::CreateFromLocal()); 215 regs.reset(unwindstack::Regs::CreateFromLocal());
@@ -189,9 +220,8 @@ bool UnwindStackCurrent::UnwindFromContext(size_t num_ignore_frames, ucontext_t*
189 regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentArch(), ucontext)); 220 regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentArch(), ucontext));
190 } 221 }
191 222
192 error_.error_code = BACKTRACE_UNWIND_NO_ERROR;
193 std::vector<std::string> skip_names{"libunwindstack.so", "libbacktrace.so"}; 223 std::vector<std::string> skip_names{"libunwindstack.so", "libbacktrace.so"};
194 return Backtrace::Unwind(regs.get(), GetMap(), &frames_, num_ignore_frames, &skip_names); 224 return Backtrace::Unwind(regs.get(), GetMap(), &frames_, num_ignore_frames, &skip_names, &error_);
195} 225}
196 226
197UnwindStackPtrace::UnwindStackPtrace(pid_t pid, pid_t tid, BacktraceMap* map) 227UnwindStackPtrace::UnwindStackPtrace(pid_t pid, pid_t tid, BacktraceMap* map)
@@ -201,7 +231,7 @@ std::string UnwindStackPtrace::GetFunctionNameRaw(uint64_t pc, uint64_t* offset)
201 return GetMap()->GetFunctionName(pc, offset); 231 return GetMap()->GetFunctionName(pc, offset);
202} 232}
203 233
204bool UnwindStackPtrace::Unwind(size_t num_ignore_frames, ucontext_t* context) { 234bool UnwindStackPtrace::Unwind(size_t num_ignore_frames, void* context) {
205 std::unique_ptr<unwindstack::Regs> regs; 235 std::unique_ptr<unwindstack::Regs> regs;
206 if (context == nullptr) { 236 if (context == nullptr) {
207 regs.reset(unwindstack::Regs::RemoteGet(Tid())); 237 regs.reset(unwindstack::Regs::RemoteGet(Tid()));
@@ -209,10 +239,77 @@ bool UnwindStackPtrace::Unwind(size_t num_ignore_frames, ucontext_t* context) {
209 regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentArch(), context)); 239 regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentArch(), context));
210 } 240 }
211 241
212 error_.error_code = BACKTRACE_UNWIND_NO_ERROR; 242 return Backtrace::Unwind(regs.get(), GetMap(), &frames_, num_ignore_frames, nullptr, &error_);
213 return Backtrace::Unwind(regs.get(), GetMap(), &frames_, num_ignore_frames, nullptr);
214} 243}
215 244
216size_t UnwindStackPtrace::Read(uint64_t addr, uint8_t* buffer, size_t bytes) { 245size_t UnwindStackPtrace::Read(uint64_t addr, uint8_t* buffer, size_t bytes) {
217 return memory_.Read(addr, buffer, bytes); 246 return memory_.Read(addr, buffer, bytes);
218} 247}
248
249UnwindStackOffline::UnwindStackOffline(ArchEnum arch, pid_t pid, pid_t tid, BacktraceMap* map,
250 bool map_shared)
251 : Backtrace(pid, tid, map), arch_(arch) {
252 map_shared_ = map_shared;
253}
254
255bool UnwindStackOffline::Unwind(size_t num_ignore_frames, void* ucontext) {
256 if (ucontext == nullptr) {
257 return false;
258 }
259
260 unwindstack::ArchEnum arch;
261 switch (arch_) {
262 case ARCH_ARM:
263 arch = unwindstack::ARCH_ARM;
264 break;
265 case ARCH_ARM64:
266 arch = unwindstack::ARCH_ARM64;
267 break;
268 case ARCH_X86:
269 arch = unwindstack::ARCH_X86;
270 break;
271 case ARCH_X86_64:
272 arch = unwindstack::ARCH_X86_64;
273 break;
274 default:
275 return false;
276 }
277
278 std::unique_ptr<unwindstack::Regs> regs(unwindstack::Regs::CreateFromUcontext(arch, ucontext));
279
280 return Backtrace::Unwind(regs.get(), GetMap(), &frames_, num_ignore_frames, nullptr, &error_);
281}
282
283std::string UnwindStackOffline::GetFunctionNameRaw(uint64_t, uint64_t*) {
284 return "";
285}
286
287size_t UnwindStackOffline::Read(uint64_t, uint8_t*, size_t) {
288 return 0;
289}
290
291bool UnwindStackOffline::ReadWord(uint64_t, word_t*) {
292 return false;
293}
294
295Backtrace* Backtrace::CreateOffline(ArchEnum arch, pid_t pid, pid_t tid,
296 const std::vector<backtrace_map_t>& maps,
297 const backtrace_stackinfo_t& stack) {
298 BacktraceMap* map = BacktraceMap::CreateOffline(pid, maps, stack);
299 if (map == nullptr) {
300 return nullptr;
301 }
302
303 return new UnwindStackOffline(arch, pid, tid, map, false);
304}
305
306Backtrace* Backtrace::CreateOffline(ArchEnum arch, pid_t pid, pid_t tid, BacktraceMap* map) {
307 if (map == nullptr) {
308 return nullptr;
309 }
310 return new UnwindStackOffline(arch, pid, tid, map, true);
311}
312
313void Backtrace::SetGlobalElfCache(bool enable) {
314 unwindstack::Elf::SetCachingEnabled(enable);
315}
diff --git a/libbacktrace/UnwindStack.h b/libbacktrace/UnwindStack.h
index 498ad4ef7..33c4282b2 100644
--- a/libbacktrace/UnwindStack.h
+++ b/libbacktrace/UnwindStack.h
@@ -34,7 +34,7 @@ class UnwindStackCurrent : public BacktraceCurrent {
34 34
35 std::string GetFunctionNameRaw(uint64_t pc, uint64_t* offset) override; 35 std::string GetFunctionNameRaw(uint64_t pc, uint64_t* offset) override;
36 36
37 bool UnwindFromContext(size_t num_ignore_frames, ucontext_t* ucontext) override; 37 bool UnwindFromContext(size_t num_ignore_frames, void* ucontext) override;
38}; 38};
39 39
40class UnwindStackPtrace : public BacktracePtrace { 40class UnwindStackPtrace : public BacktracePtrace {
@@ -42,9 +42,9 @@ class UnwindStackPtrace : public BacktracePtrace {
42 UnwindStackPtrace(pid_t pid, pid_t tid, BacktraceMap* map); 42 UnwindStackPtrace(pid_t pid, pid_t tid, BacktraceMap* map);
43 virtual ~UnwindStackPtrace() = default; 43 virtual ~UnwindStackPtrace() = default;
44 44
45 bool Unwind(size_t num_ignore_frames, ucontext_t* context) override; 45 bool Unwind(size_t num_ignore_frames, void* context) override;
46 46
47 std::string GetFunctionNameRaw(uint64_t pc, uint64_t* offset); 47 std::string GetFunctionNameRaw(uint64_t pc, uint64_t* offset) override;
48 48
49 size_t Read(uint64_t addr, uint8_t* buffer, size_t bytes) override; 49 size_t Read(uint64_t addr, uint8_t* buffer, size_t bytes) override;
50 50
@@ -52,4 +52,20 @@ class UnwindStackPtrace : public BacktracePtrace {
52 unwindstack::MemoryRemote memory_; 52 unwindstack::MemoryRemote memory_;
53}; 53};
54 54
55class UnwindStackOffline : public Backtrace {
56 public:
57 UnwindStackOffline(ArchEnum arch, pid_t pid, pid_t tid, BacktraceMap* map, bool map_shared);
58
59 bool Unwind(size_t num_ignore_frames, void* context) override;
60
61 std::string GetFunctionNameRaw(uint64_t pc, uint64_t* offset);
62
63 size_t Read(uint64_t addr, uint8_t* buffer, size_t bytes) override;
64
65 bool ReadWord(uint64_t ptr, word_t* out_value) override;
66
67 private:
68 ArchEnum arch_;
69};
70
55#endif // _LIBBACKTRACE_UNWIND_STACK_H 71#endif // _LIBBACKTRACE_UNWIND_STACK_H
diff --git a/libbacktrace/UnwindStackMap.cpp b/libbacktrace/UnwindStackMap.cpp
index 11ff84a8b..97f8d782d 100644
--- a/libbacktrace/UnwindStackMap.cpp
+++ b/libbacktrace/UnwindStackMap.cpp
@@ -147,6 +147,43 @@ UnwindDexFile* UnwindStackMap::GetDexFile(uint64_t dex_file_offset, unwindstack:
147} 147}
148#endif 148#endif
149 149
150UnwindStackOfflineMap::UnwindStackOfflineMap(pid_t pid) : UnwindStackMap(pid) {}
151
152bool UnwindStackOfflineMap::Build() {
153 return false;
154}
155
156bool UnwindStackOfflineMap::Build(const std::vector<backtrace_map_t>& backtrace_maps,
157 const backtrace_stackinfo_t& stack) {
158 if (stack.start >= stack.end) {
159 return false;
160 }
161
162 for (const backtrace_map_t& map : backtrace_maps) {
163 maps_.push_back(map);
164 }
165
166 std::sort(maps_.begin(), maps_.end(),
167 [](const backtrace_map_t& a, const backtrace_map_t& b) { return a.start < b.start; });
168
169 unwindstack::Maps* maps = new unwindstack::Maps;
170 stack_maps_.reset(maps);
171 for (const backtrace_map_t& map : maps_) {
172 maps->Add(map.start, map.end, map.offset, map.flags, map.name, map.load_bias);
173 }
174
175 // Create the process memory from the stack data.
176 uint64_t size = stack.end - stack.start;
177 unwindstack::MemoryBuffer* memory = new unwindstack::MemoryBuffer;
178 memory->Resize(size);
179 memcpy(memory->GetPtr(0), stack.data, size);
180 std::shared_ptr<unwindstack::Memory> shared_memory(memory);
181
182 process_memory_.reset(new unwindstack::MemoryRange(shared_memory, 0, size, stack.start));
183
184 return true;
185}
186
150//------------------------------------------------------------------------- 187//-------------------------------------------------------------------------
151// BacktraceMap create function. 188// BacktraceMap create function.
152//------------------------------------------------------------------------- 189//-------------------------------------------------------------------------
@@ -167,3 +204,16 @@ BacktraceMap* BacktraceMap::Create(pid_t pid, bool uncached) {
167 } 204 }
168 return map; 205 return map;
169} 206}
207
208//-------------------------------------------------------------------------
209// BacktraceMap create offline function.
210//-------------------------------------------------------------------------
211BacktraceMap* BacktraceMap::CreateOffline(pid_t pid, const std::vector<backtrace_map_t>& maps,
212 const backtrace_stackinfo_t& stack) {
213 UnwindStackOfflineMap* map = new UnwindStackOfflineMap(pid);
214 if (!map->Build(maps, stack)) {
215 delete map;
216 return nullptr;
217 }
218 return map;
219}
diff --git a/libbacktrace/UnwindStackMap.h b/libbacktrace/UnwindStackMap.h
index a815aae71..be5c59e74 100644
--- a/libbacktrace/UnwindStackMap.h
+++ b/libbacktrace/UnwindStackMap.h
@@ -23,7 +23,9 @@
23#include <memory> 23#include <memory>
24#include <mutex> 24#include <mutex>
25#include <unordered_map> 25#include <unordered_map>
26#include <vector>
26 27
28#include <backtrace/Backtrace.h>
27#include <backtrace/BacktraceMap.h> 29#include <backtrace/BacktraceMap.h>
28#include <unwindstack/JitDebug.h> 30#include <unwindstack/JitDebug.h>
29#include <unwindstack/Maps.h> 31#include <unwindstack/Maps.h>
@@ -63,4 +65,14 @@ class UnwindStackMap : public BacktraceMap {
63#endif 65#endif
64}; 66};
65 67
68class UnwindStackOfflineMap : public UnwindStackMap {
69 public:
70 UnwindStackOfflineMap(pid_t pid);
71 ~UnwindStackOfflineMap() = default;
72
73 bool Build() override;
74
75 bool Build(const std::vector<backtrace_map_t>& maps, const backtrace_stackinfo_t& stack);
76};
77
66#endif // _LIBBACKTRACE_UNWINDSTACK_MAP_H 78#endif // _LIBBACKTRACE_UNWINDSTACK_MAP_H
diff --git a/libbacktrace/backtrace_offline_test.cpp b/libbacktrace/backtrace_offline_test.cpp
index e2a744198..9877f2948 100644
--- a/libbacktrace/backtrace_offline_test.cpp
+++ b/libbacktrace/backtrace_offline_test.cpp
@@ -15,9 +15,9 @@
15 */ 15 */
16 16
17#include <inttypes.h> 17#include <inttypes.h>
18#include <libunwind.h>
19#include <pthread.h> 18#include <pthread.h>
20#include <stdint.h> 19#include <stdint.h>
20#include <stdlib.h>
21#include <string.h> 21#include <string.h>
22 22
23#include <functional> 23#include <functional>
@@ -44,33 +44,7 @@ int test_level_two(int, int, int, int, void (*)(void*), void*);
44int test_level_three(int, int, int, int, void (*)(void*), void*); 44int test_level_three(int, int, int, int, void (*)(void*), void*);
45int test_level_four(int, int, int, int, void (*)(void*), void*); 45int test_level_four(int, int, int, int, void (*)(void*), void*);
46int test_recursive_call(int, void (*)(void*), void*); 46int test_recursive_call(int, void (*)(void*), void*);
47void test_get_context_and_wait(unw_context_t* unw_context, volatile int* exit_flag); 47void test_get_context_and_wait(void* context, volatile int* exit_flag);
48}
49
50static ucontext_t GetUContextFromUnwContext(const unw_context_t& unw_context) {
51 ucontext_t ucontext;
52 memset(&ucontext, 0, sizeof(ucontext));
53#if defined(__arm__)
54 ucontext.uc_mcontext.arm_r0 = unw_context.regs[0];
55 ucontext.uc_mcontext.arm_r1 = unw_context.regs[1];
56 ucontext.uc_mcontext.arm_r2 = unw_context.regs[2];
57 ucontext.uc_mcontext.arm_r3 = unw_context.regs[3];
58 ucontext.uc_mcontext.arm_r4 = unw_context.regs[4];
59 ucontext.uc_mcontext.arm_r5 = unw_context.regs[5];
60 ucontext.uc_mcontext.arm_r6 = unw_context.regs[6];
61 ucontext.uc_mcontext.arm_r7 = unw_context.regs[7];
62 ucontext.uc_mcontext.arm_r8 = unw_context.regs[8];
63 ucontext.uc_mcontext.arm_r9 = unw_context.regs[9];
64 ucontext.uc_mcontext.arm_r10 = unw_context.regs[10];
65 ucontext.uc_mcontext.arm_fp = unw_context.regs[11];
66 ucontext.uc_mcontext.arm_ip = unw_context.regs[12];
67 ucontext.uc_mcontext.arm_sp = unw_context.regs[13];
68 ucontext.uc_mcontext.arm_lr = unw_context.regs[14];
69 ucontext.uc_mcontext.arm_pc = unw_context.regs[15];
70#else
71 ucontext.uc_mcontext = unw_context.uc_mcontext;
72#endif
73 return ucontext;
74} 48}
75 49
76struct FunctionSymbol { 50struct FunctionSymbol {
@@ -108,18 +82,17 @@ static std::string RawDataToHexString(const void* data, size_t size) {
108 return s; 82 return s;
109} 83}
110 84
111static void HexStringToRawData(const char* s, void* data, size_t size) { 85static void HexStringToRawData(const char* s, std::vector<uint8_t>* data, size_t size) {
112 uint8_t* p = static_cast<uint8_t*>(data);
113 for (size_t i = 0; i < size; ++i) { 86 for (size_t i = 0; i < size; ++i) {
114 int value; 87 int value;
115 sscanf(s, "%02x", &value); 88 sscanf(s, "%02x", &value);
116 *p++ = static_cast<uint8_t>(value); 89 data->push_back(value);
117 s += 2; 90 s += 2;
118 } 91 }
119} 92}
120 93
121struct OfflineThreadArg { 94struct OfflineThreadArg {
122 unw_context_t unw_context; 95 std::vector<uint8_t> ucontext;
123 pid_t tid; 96 pid_t tid;
124 volatile int exit_flag; 97 volatile int exit_flag;
125}; 98};
@@ -127,12 +100,12 @@ struct OfflineThreadArg {
127static void* OfflineThreadFunc(void* arg) { 100static void* OfflineThreadFunc(void* arg) {
128 OfflineThreadArg* fn_arg = reinterpret_cast<OfflineThreadArg*>(arg); 101 OfflineThreadArg* fn_arg = reinterpret_cast<OfflineThreadArg*>(arg);
129 fn_arg->tid = gettid(); 102 fn_arg->tid = gettid();
130 test_get_context_and_wait(&fn_arg->unw_context, &fn_arg->exit_flag); 103 test_get_context_and_wait(&fn_arg->ucontext, &fn_arg->exit_flag);
131 return nullptr; 104 return nullptr;
132} 105}
133 106
134std::string GetTestPath(std::string path) { 107std::string GetTestPath(const std::string& arch, const std::string& path) {
135 return android::base::GetExecutableDirectory() + "/testdata/" + ABI_STRING + '/' + path; 108 return android::base::GetExecutableDirectory() + "/testdata/" + arch + '/' + path;
136} 109}
137 110
138// This test is disable because it is for generating test data. 111// This test is disable because it is for generating test data.
@@ -149,7 +122,7 @@ TEST(libbacktrace, DISABLED_generate_offline_testdata) {
149 OfflineThreadArg arg; 122 OfflineThreadArg arg;
150 arg.exit_flag = 0; 123 arg.exit_flag = 0;
151 ASSERT_EQ(0, pthread_create(&thread, &attr, OfflineThreadFunc, &arg)); 124 ASSERT_EQ(0, pthread_create(&thread, &attr, OfflineThreadFunc, &arg));
152 // Wait for the offline thread to generate the stack and unw_context information. 125 // Wait for the offline thread to generate the stack and context information.
153 sleep(1); 126 sleep(1);
154 // Copy the stack information. 127 // Copy the stack information.
155 std::vector<uint8_t> stack_data(reinterpret_cast<uint8_t*>(stack), 128 std::vector<uint8_t> stack_data(reinterpret_cast<uint8_t*>(stack),
@@ -179,9 +152,9 @@ TEST(libbacktrace, DISABLED_generate_offline_testdata) {
179 entry->start, entry->end, entry->offset, entry->load_bias, 152 entry->start, entry->end, entry->offset, entry->load_bias,
180 entry->flags, entry->name.c_str()); 153 entry->flags, entry->name.c_str());
181 } 154 }
182 // 3. Dump registers 155 // 3. Dump ucontext
183 testdata += android::base::StringPrintf("registers: %zu ", sizeof(arg.unw_context)); 156 testdata += android::base::StringPrintf("ucontext: %zu ", arg.ucontext.size());
184 testdata += RawDataToHexString(&arg.unw_context, sizeof(arg.unw_context)); 157 testdata += RawDataToHexString(arg.ucontext.data(), arg.ucontext.size());
185 testdata.push_back('\n'); 158 testdata.push_back('\n');
186 159
187 // 4. Dump stack 160 // 4. Dump stack
@@ -218,7 +191,7 @@ struct OfflineTestData {
218 int pid; 191 int pid;
219 int tid; 192 int tid;
220 std::vector<backtrace_map_t> maps; 193 std::vector<backtrace_map_t> maps;
221 unw_context_t unw_context; 194 std::vector<uint8_t> ucontext;
222 backtrace_stackinfo_t stack_info; 195 backtrace_stackinfo_t stack_info;
223 std::vector<uint8_t> stack; 196 std::vector<uint8_t> stack;
224 std::vector<FunctionSymbol> symbols; 197 std::vector<FunctionSymbol> symbols;
@@ -231,7 +204,6 @@ bool ReadOfflineTestData(const std::string offline_testdata_path, OfflineTestDat
231 } 204 }
232 // Parse offline_testdata. 205 // Parse offline_testdata.
233 std::vector<std::string> lines = android::base::Split(s, "\n"); 206 std::vector<std::string> lines = android::base::Split(s, "\n");
234 memset(&testdata->unw_context, 0, sizeof(testdata->unw_context));
235 for (const auto& line : lines) { 207 for (const auto& line : lines) {
236 if (android::base::StartsWith(line, "pid:")) { 208 if (android::base::StartsWith(line, "pid:")) {
237 sscanf(line.c_str(), "pid: %d tid: %d", &testdata->pid, &testdata->tid); 209 sscanf(line.c_str(), "pid: %d tid: %d", &testdata->pid, &testdata->tid);
@@ -244,50 +216,12 @@ bool ReadOfflineTestData(const std::string offline_testdata_path, OfflineTestDat
244 " flags: %d name: %n", 216 " flags: %d name: %n",
245 &map.start, &map.end, &map.offset, &map.load_bias, &map.flags, &pos); 217 &map.start, &map.end, &map.offset, &map.load_bias, &map.flags, &pos);
246 map.name = android::base::Trim(line.substr(pos)); 218 map.name = android::base::Trim(line.substr(pos));
247 } else if (android::base::StartsWith(line, "registers:")) { 219 } else if (android::base::StartsWith(line, "ucontext:")) {
248 size_t size; 220 size_t size;
249 int pos; 221 int pos;
250 sscanf(line.c_str(), "registers: %zu %n", &size, &pos); 222 testdata->ucontext.clear();
251 if (sizeof(testdata->unw_context) != size) { 223 sscanf(line.c_str(), "ucontext: %zu %n", &size, &pos);
252 return false; 224 HexStringToRawData(&line[pos], &testdata->ucontext, size);
253 }
254 HexStringToRawData(&line[pos], &testdata->unw_context, size);
255 } else if (android::base::StartsWith(line, "regs:")) {
256 std::vector<std::string> strs = android::base::Split(line.substr(6), " ");
257 if (strs.size() % 2 != 0) {
258 return false;
259 }
260 std::vector<std::pair<std::string, uint64_t>> items;
261 for (size_t i = 0; i + 1 < strs.size(); i += 2) {
262 if (!android::base::EndsWith(strs[i], ":")) {
263 return false;
264 }
265 uint64_t value = std::stoul(strs[i + 1], nullptr, 16);
266 items.push_back(std::make_pair(strs[i].substr(0, strs[i].size() - 1), value));
267 }
268#if defined(__arm__)
269 for (auto& item : items) {
270 if (item.first == "sp") {
271 testdata->unw_context.regs[13] = item.second;
272 } else if (item.first == "pc") {
273 testdata->unw_context.regs[15] = item.second;
274 } else {
275 return false;
276 }
277 }
278#elif defined(__aarch64__)
279 for (auto& item : items) {
280 if (item.first == "pc") {
281 testdata->unw_context.uc_mcontext.pc = item.second;
282 } else if (item.first == "sp") {
283 testdata->unw_context.uc_mcontext.sp = item.second;
284 } else if (item.first == "x29") {
285 testdata->unw_context.uc_mcontext.regs[UNW_AARCH64_X29] = item.second;
286 } else {
287 return false;
288 }
289 }
290#endif
291 } else if (android::base::StartsWith(line, "stack:")) { 225 } else if (android::base::StartsWith(line, "stack:")) {
292 size_t size; 226 size_t size;
293 int pos; 227 int pos;
@@ -295,8 +229,8 @@ bool ReadOfflineTestData(const std::string offline_testdata_path, OfflineTestDat
295 "stack: start: %" SCNx64 " end: %" SCNx64 " size: %zu %n", 229 "stack: start: %" SCNx64 " end: %" SCNx64 " size: %zu %n",
296 &testdata->stack_info.start, &testdata->stack_info.end, &size, &pos); 230 &testdata->stack_info.start, &testdata->stack_info.end, &size, &pos);
297 CHECK_EQ(testdata->stack_info.end - testdata->stack_info.start, size); 231 CHECK_EQ(testdata->stack_info.end - testdata->stack_info.start, size);
298 testdata->stack.resize(size); 232 testdata->stack.clear();
299 HexStringToRawData(&line[pos], &testdata->stack[0], size); 233 HexStringToRawData(&line[pos], &testdata->stack, size);
300 testdata->stack_info.data = testdata->stack.data(); 234 testdata->stack_info.data = testdata->stack.data();
301 } else if (android::base::StartsWith(line, "function:")) { 235 } else if (android::base::StartsWith(line, "function:")) {
302 testdata->symbols.resize(testdata->symbols.size() + 1); 236 testdata->symbols.resize(testdata->symbols.size() + 1);
@@ -310,17 +244,11 @@ bool ReadOfflineTestData(const std::string offline_testdata_path, OfflineTestDat
310 return true; 244 return true;
311} 245}
312 246
313static void BacktraceOfflineTest(const char* arch, const std::string& testlib_name) { 247static void BacktraceOfflineTest(std::string arch_str, const std::string& testlib_name) {
314 // TODO: For now, we can only run this on the same arch as the library arch. 248 const std::string testlib_path(GetTestPath(arch_str, testlib_name));
315 if (std::string(ABI_STRING) != arch) { 249 const std::string offline_testdata_path(GetTestPath(arch_str, "offline_testdata"));
316 GTEST_LOG_(INFO) << "Ignoring arch " << arch << " for lib " << testlib_name;
317 return;
318 }
319
320 const std::string testlib_path(GetTestPath(testlib_name));
321 const std::string offline_testdata_path(GetTestPath("offline_testdata"));
322 OfflineTestData testdata; 250 OfflineTestData testdata;
323 ASSERT_TRUE(ReadOfflineTestData(offline_testdata_path, &testdata)); 251 ASSERT_TRUE(ReadOfflineTestData(offline_testdata_path, &testdata)) << "Failed " << arch_str;
324 252
325 // Fix path of libbacktrace_testlib.so. 253 // Fix path of libbacktrace_testlib.so.
326 for (auto& map : testdata.maps) { 254 for (auto& map : testdata.maps) {
@@ -329,16 +257,24 @@ static void BacktraceOfflineTest(const char* arch, const std::string& testlib_na
329 } 257 }
330 } 258 }
331 259
332 // Do offline backtrace. 260 Backtrace::ArchEnum arch;
333 std::unique_ptr<BacktraceMap> map(BacktraceMap::Create(testdata.pid, testdata.maps)); 261 if (arch_str == "arm") {
334 ASSERT_TRUE(map != nullptr); 262 arch = Backtrace::ARCH_ARM;
263 } else if (arch_str == "arm64") {
264 arch = Backtrace::ARCH_ARM64;
265 } else if (arch_str == "x86") {
266 arch = Backtrace::ARCH_X86;
267 } else if (arch_str == "x86_64") {
268 arch = Backtrace::ARCH_X86_64;
269 } else {
270 abort();
271 }
335 272
336 std::unique_ptr<Backtrace> backtrace( 273 std::unique_ptr<Backtrace> backtrace(Backtrace::CreateOffline(
337 Backtrace::CreateOffline(testdata.pid, testdata.tid, map.get(), testdata.stack_info)); 274 arch, testdata.pid, testdata.tid, testdata.maps, testdata.stack_info));
338 ASSERT_TRUE(backtrace != nullptr); 275 ASSERT_TRUE(backtrace != nullptr) << "Failed " << arch_str;
339 276
340 ucontext_t ucontext = GetUContextFromUnwContext(testdata.unw_context); 277 ASSERT_TRUE(backtrace->Unwind(0, testdata.ucontext.data())) << "Failed " << arch_str;
341 ASSERT_TRUE(backtrace->Unwind(0, &ucontext));
342 278
343 // Collect pc values of the call stack frames. 279 // Collect pc values of the call stack frames.
344 std::vector<uint64_t> pc_values; 280 std::vector<uint64_t> pc_values;
@@ -354,14 +290,17 @@ static void BacktraceOfflineTest(const char* arch, const std::string& testlib_na
354 } 290 }
355 } 291 }
356 292
357 ASSERT_GE(test_one_index, 3u); 293 ASSERT_GE(test_one_index, 3u) << "Failed " << arch_str;
358 ASSERT_EQ("test_level_one", FunctionNameForAddress(pc_values[test_one_index], testdata.symbols)); 294 ASSERT_EQ("test_level_one", FunctionNameForAddress(pc_values[test_one_index], testdata.symbols))
359 ASSERT_EQ("test_level_two", FunctionNameForAddress(pc_values[test_one_index - 1], 295 << "Failed " << arch_str;
360 testdata.symbols)); 296 ASSERT_EQ("test_level_two", FunctionNameForAddress(pc_values[test_one_index - 1], testdata.symbols))
361 ASSERT_EQ("test_level_three", FunctionNameForAddress(pc_values[test_one_index - 2], 297 << "Failed " << arch_str;
362 testdata.symbols)); 298 ASSERT_EQ("test_level_three",
363 ASSERT_EQ("test_level_four", FunctionNameForAddress(pc_values[test_one_index - 3], 299 FunctionNameForAddress(pc_values[test_one_index - 2], testdata.symbols))
364 testdata.symbols)); 300 << "Failed " << arch_str;
301 ASSERT_EQ("test_level_four",
302 FunctionNameForAddress(pc_values[test_one_index - 3], testdata.symbols))
303 << "Failed " << arch_str;
365} 304}
366 305
367// For now, these tests can only run on the given architectures. 306// For now, these tests can only run on the given architectures.
@@ -384,18 +323,13 @@ TEST(libbacktrace, offline_arm_exidx) {
384 BacktraceOfflineTest("arm", "libbacktrace_test_arm_exidx.so"); 323 BacktraceOfflineTest("arm", "libbacktrace_test_arm_exidx.so");
385} 324}
386 325
387static void LibUnwindingTest(const std::string& arch, const std::string& testdata_name, 326static void LibUnwindingTest(const std::string& arch_str, const std::string& testdata_name,
388 const std::string& testlib_name) { 327 const std::string& testlib_name) {
389 if (std::string(ABI_STRING) != arch) { 328 const std::string testlib_path(GetTestPath(arch_str, testlib_name));
390 GTEST_LOG_(INFO) << "Skipping test since offline for arm on " << ABI_STRING
391 << " isn't supported.";
392 return;
393 }
394 const std::string testlib_path(GetTestPath(testlib_name));
395 struct stat st; 329 struct stat st;
396 ASSERT_EQ(0, stat(testlib_path.c_str(), &st)) << "can't find testlib " << testlib_path; 330 ASSERT_EQ(0, stat(testlib_path.c_str(), &st)) << "can't find testlib " << testlib_path;
397 331
398 const std::string offline_testdata_path(GetTestPath(testdata_name)); 332 const std::string offline_testdata_path(GetTestPath(arch_str, testdata_name));
399 OfflineTestData testdata; 333 OfflineTestData testdata;
400 ASSERT_TRUE(ReadOfflineTestData(offline_testdata_path, &testdata)); 334 ASSERT_TRUE(ReadOfflineTestData(offline_testdata_path, &testdata));
401 335
@@ -406,26 +340,35 @@ static void LibUnwindingTest(const std::string& arch, const std::string& testdat
406 } 340 }
407 } 341 }
408 342
409 // Do offline backtrace. 343 Backtrace::ArchEnum arch;
410 std::unique_ptr<BacktraceMap> map(BacktraceMap::Create(testdata.pid, testdata.maps)); 344 if (arch_str == "arm") {
411 ASSERT_TRUE(map != nullptr); 345 arch = Backtrace::ARCH_ARM;
346 } else if (arch_str == "arm64") {
347 arch = Backtrace::ARCH_ARM64;
348 } else if (arch_str == "x86") {
349 arch = Backtrace::ARCH_X86;
350 } else if (arch_str == "x86_64") {
351 arch = Backtrace::ARCH_X86_64;
352 } else {
353 ASSERT_TRUE(false) << "Unsupported arch " << arch_str;
354 abort();
355 }
412 356
413 std::unique_ptr<Backtrace> backtrace( 357 // Do offline backtrace.
414 Backtrace::CreateOffline(testdata.pid, testdata.tid, map.get(), testdata.stack_info)); 358 std::unique_ptr<Backtrace> backtrace(Backtrace::CreateOffline(
359 arch, testdata.pid, testdata.tid, testdata.maps, testdata.stack_info));
415 ASSERT_TRUE(backtrace != nullptr); 360 ASSERT_TRUE(backtrace != nullptr);
416 361
417 ucontext_t ucontext = GetUContextFromUnwContext(testdata.unw_context); 362 ASSERT_TRUE(backtrace->Unwind(0, testdata.ucontext.data()));
418 ASSERT_TRUE(backtrace->Unwind(0, &ucontext));
419 363
420 ASSERT_EQ(testdata.symbols.size(), backtrace->NumFrames()); 364 ASSERT_EQ(testdata.symbols.size(), backtrace->NumFrames());
421 for (size_t i = 0; i < backtrace->NumFrames(); ++i) { 365 for (size_t i = 0; i < backtrace->NumFrames(); ++i) {
422 uint64_t vaddr_in_file = 366 std::string name = FunctionNameForAddress(backtrace->GetFrame(i)->rel_pc, testdata.symbols);
423 backtrace->GetFrame(i)->pc - testdata.maps[0].start + testdata.maps[0].load_bias;
424 std::string name = FunctionNameForAddress(vaddr_in_file, testdata.symbols);
425 ASSERT_EQ(name, testdata.symbols[i].name); 367 ASSERT_EQ(name, testdata.symbols[i].name);
426 } 368 }
427 ASSERT_TRUE(backtrace->GetError().error_code == BACKTRACE_UNWIND_ERROR_ACCESS_MEM_FAILED || 369 ASSERT_TRUE(backtrace->GetError().error_code == BACKTRACE_UNWIND_ERROR_ACCESS_MEM_FAILED ||
428 backtrace->GetError().error_code == BACKTRACE_UNWIND_ERROR_MAP_MISSING); 370 backtrace->GetError().error_code == BACKTRACE_UNWIND_ERROR_MAP_MISSING ||
371 backtrace->GetError().error_code == BACKTRACE_UNWIND_ERROR_REPEATED_FRAME);
429} 372}
430 373
431// This test tests the situation that ranges of functions covered by .eh_frame and .ARM.exidx 374// This test tests the situation that ranges of functions covered by .eh_frame and .ARM.exidx
diff --git a/libbacktrace/backtrace_test.cpp b/libbacktrace/backtrace_test.cpp
index 10152f7ad..aab6db9de 100644
--- a/libbacktrace/backtrace_test.cpp
+++ b/libbacktrace/backtrace_test.cpp
@@ -31,6 +31,7 @@
31#include <sys/types.h> 31#include <sys/types.h>
32#include <sys/wait.h> 32#include <sys/wait.h>
33#include <time.h> 33#include <time.h>
34#include <ucontext.h>
34#include <unistd.h> 35#include <unistd.h>
35 36
36#include <algorithm> 37#include <algorithm>
@@ -143,6 +144,17 @@ static void FinishRemoteProcess(pid_t pid) {
143 ASSERT_EQ(waitpid(pid, nullptr, 0), pid); 144 ASSERT_EQ(waitpid(pid, nullptr, 0), pid);
144} 145}
145 146
147#if !defined(__ANDROID__) || defined(__arm__)
148// On host and arm target we aren't guaranteed that we will terminate cleanly.
149#define VERIFY_NO_ERROR(error_code) \
150 ASSERT_TRUE(error_code == BACKTRACE_UNWIND_NO_ERROR || \
151 error_code == BACKTRACE_UNWIND_ERROR_UNWIND_INFO || \
152 error_code == BACKTRACE_UNWIND_ERROR_MAP_MISSING) \
153 << "Unknown error code " << std::to_string(error_code);
154#else
155#define VERIFY_NO_ERROR(error_code) ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, error_code);
156#endif
157
146static bool ReadyLevelBacktrace(Backtrace* backtrace) { 158static bool ReadyLevelBacktrace(Backtrace* backtrace) {
147 // See if test_level_four is in the backtrace. 159 // See if test_level_four is in the backtrace.
148 bool found = false; 160 bool found = false;
@@ -189,7 +201,7 @@ static void VerifyLevelBacktrace(void*) {
189 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); 201 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD));
190 ASSERT_TRUE(backtrace.get() != nullptr); 202 ASSERT_TRUE(backtrace.get() != nullptr);
191 ASSERT_TRUE(backtrace->Unwind(0)); 203 ASSERT_TRUE(backtrace->Unwind(0));
192 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 204 VERIFY_NO_ERROR(backtrace->GetError().error_code);
193 205
194 VerifyLevelDump(backtrace.get()); 206 VerifyLevelDump(backtrace.get());
195} 207}
@@ -211,7 +223,7 @@ static void VerifyMaxBacktrace(void*) {
211 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); 223 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD));
212 ASSERT_TRUE(backtrace.get() != nullptr); 224 ASSERT_TRUE(backtrace.get() != nullptr);
213 ASSERT_TRUE(backtrace->Unwind(0)); 225 ASSERT_TRUE(backtrace->Unwind(0));
214 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 226 ASSERT_EQ(BACKTRACE_UNWIND_ERROR_EXCEED_MAX_FRAMES_LIMIT, backtrace->GetError().error_code);
215 227
216 VerifyMaxDump(backtrace.get()); 228 VerifyMaxDump(backtrace.get());
217} 229}
@@ -241,7 +253,7 @@ TEST(libbacktrace, local_no_unwind_frames) {
241 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), getpid())); 253 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), getpid()));
242 ASSERT_TRUE(backtrace.get() != nullptr); 254 ASSERT_TRUE(backtrace.get() != nullptr);
243 ASSERT_TRUE(backtrace->Unwind(0)); 255 ASSERT_TRUE(backtrace->Unwind(0));
244 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 256 VERIFY_NO_ERROR(backtrace->GetError().error_code);
245 257
246 ASSERT_TRUE(backtrace->NumFrames() != 0); 258 ASSERT_TRUE(backtrace->NumFrames() != 0);
247 for (const auto& frame : *backtrace ) { 259 for (const auto& frame : *backtrace ) {
@@ -292,19 +304,19 @@ static void VerifyLevelIgnoreFrames(void*) {
292 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); 304 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD));
293 ASSERT_TRUE(all.get() != nullptr); 305 ASSERT_TRUE(all.get() != nullptr);
294 ASSERT_TRUE(all->Unwind(0)); 306 ASSERT_TRUE(all->Unwind(0));
295 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, all->GetError().error_code); 307 VERIFY_NO_ERROR(all->GetError().error_code);
296 308
297 std::unique_ptr<Backtrace> ign1( 309 std::unique_ptr<Backtrace> ign1(
298 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); 310 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD));
299 ASSERT_TRUE(ign1.get() != nullptr); 311 ASSERT_TRUE(ign1.get() != nullptr);
300 ASSERT_TRUE(ign1->Unwind(1)); 312 ASSERT_TRUE(ign1->Unwind(1));
301 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, ign1->GetError().error_code); 313 VERIFY_NO_ERROR(ign1->GetError().error_code);
302 314
303 std::unique_ptr<Backtrace> ign2( 315 std::unique_ptr<Backtrace> ign2(
304 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD)); 316 Backtrace::Create(BACKTRACE_CURRENT_PROCESS, BACKTRACE_CURRENT_THREAD));
305 ASSERT_TRUE(ign2.get() != nullptr); 317 ASSERT_TRUE(ign2.get() != nullptr);
306 ASSERT_TRUE(ign2->Unwind(2)); 318 ASSERT_TRUE(ign2->Unwind(2));
307 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, ign2->GetError().error_code); 319 VERIFY_NO_ERROR(ign2->GetError().error_code);
308 320
309 VerifyIgnoreFrames(all.get(), ign1.get(), ign2.get(), "VerifyLevelIgnoreFrames"); 321 VerifyIgnoreFrames(all.get(), ign1.get(), ign2.get(), "VerifyLevelIgnoreFrames");
310} 322}
@@ -340,7 +352,6 @@ static void VerifyProcTest(pid_t pid, pid_t tid, bool (*ReadyFunc)(Backtrace*),
340 std::unique_ptr<Backtrace> backtrace(create_func(pid, tid, map.get())); 352 std::unique_ptr<Backtrace> backtrace(create_func(pid, tid, map.get()));
341 ASSERT_TRUE(backtrace.get() != nullptr); 353 ASSERT_TRUE(backtrace.get() != nullptr);
342 ASSERT_TRUE(backtrace->Unwind(0)); 354 ASSERT_TRUE(backtrace->Unwind(0));
343 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code);
344 if (ReadyFunc(backtrace.get())) { 355 if (ReadyFunc(backtrace.get())) {
345 VerifyFunc(backtrace.get(), create_func, map_create_func); 356 VerifyFunc(backtrace.get(), create_func, map_create_func);
346 verified = true; 357 verified = true;
@@ -389,12 +400,12 @@ static void VerifyProcessIgnoreFrames(Backtrace* bt_all, create_func_t create_fu
389 std::unique_ptr<Backtrace> ign1(create_func(bt_all->Pid(), BACKTRACE_CURRENT_THREAD, map.get())); 400 std::unique_ptr<Backtrace> ign1(create_func(bt_all->Pid(), BACKTRACE_CURRENT_THREAD, map.get()));
390 ASSERT_TRUE(ign1.get() != nullptr); 401 ASSERT_TRUE(ign1.get() != nullptr);
391 ASSERT_TRUE(ign1->Unwind(1)); 402 ASSERT_TRUE(ign1->Unwind(1));
392 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, ign1->GetError().error_code); 403 VERIFY_NO_ERROR(ign1->GetError().error_code);
393 404
394 std::unique_ptr<Backtrace> ign2(create_func(bt_all->Pid(), BACKTRACE_CURRENT_THREAD, map.get())); 405 std::unique_ptr<Backtrace> ign2(create_func(bt_all->Pid(), BACKTRACE_CURRENT_THREAD, map.get()));
395 ASSERT_TRUE(ign2.get() != nullptr); 406 ASSERT_TRUE(ign2.get() != nullptr);
396 ASSERT_TRUE(ign2->Unwind(2)); 407 ASSERT_TRUE(ign2->Unwind(2));
397 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, ign2->GetError().error_code); 408 VERIFY_NO_ERROR(ign2->GetError().error_code);
398 409
399 VerifyIgnoreFrames(bt_all, ign1.get(), ign2.get(), nullptr); 410 VerifyIgnoreFrames(bt_all, ign1.get(), ign2.get(), nullptr);
400} 411}
@@ -480,7 +491,7 @@ void VerifyLevelThread(void*) {
480 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), gettid())); 491 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), gettid()));
481 ASSERT_TRUE(backtrace.get() != nullptr); 492 ASSERT_TRUE(backtrace.get() != nullptr);
482 ASSERT_TRUE(backtrace->Unwind(0)); 493 ASSERT_TRUE(backtrace->Unwind(0));
483 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 494 VERIFY_NO_ERROR(backtrace->GetError().error_code);
484 495
485 VerifyLevelDump(backtrace.get()); 496 VerifyLevelDump(backtrace.get());
486} 497}
@@ -493,7 +504,7 @@ static void VerifyMaxThread(void*) {
493 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), gettid())); 504 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), gettid()));
494 ASSERT_TRUE(backtrace.get() != nullptr); 505 ASSERT_TRUE(backtrace.get() != nullptr);
495 ASSERT_TRUE(backtrace->Unwind(0)); 506 ASSERT_TRUE(backtrace->Unwind(0));
496 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 507 ASSERT_EQ(BACKTRACE_UNWIND_ERROR_EXCEED_MAX_FRAMES_LIMIT, backtrace->GetError().error_code);
497 508
498 VerifyMaxDump(backtrace.get()); 509 VerifyMaxDump(backtrace.get());
499} 510}
@@ -535,7 +546,7 @@ TEST(libbacktrace, thread_level_trace) {
535 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), thread_data.tid)); 546 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), thread_data.tid));
536 ASSERT_TRUE(backtrace.get() != nullptr); 547 ASSERT_TRUE(backtrace.get() != nullptr);
537 ASSERT_TRUE(backtrace->Unwind(0)); 548 ASSERT_TRUE(backtrace->Unwind(0));
538 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 549 VERIFY_NO_ERROR(backtrace->GetError().error_code);
539 550
540 VerifyLevelDump(backtrace.get()); 551 VerifyLevelDump(backtrace.get());
541 552
@@ -575,17 +586,17 @@ TEST(libbacktrace, thread_ignore_frames) {
575 std::unique_ptr<Backtrace> all(Backtrace::Create(getpid(), thread_data.tid)); 586 std::unique_ptr<Backtrace> all(Backtrace::Create(getpid(), thread_data.tid));
576 ASSERT_TRUE(all.get() != nullptr); 587 ASSERT_TRUE(all.get() != nullptr);
577 ASSERT_TRUE(all->Unwind(0)); 588 ASSERT_TRUE(all->Unwind(0));
578 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, all->GetError().error_code); 589 VERIFY_NO_ERROR(all->GetError().error_code);
579 590
580 std::unique_ptr<Backtrace> ign1(Backtrace::Create(getpid(), thread_data.tid)); 591 std::unique_ptr<Backtrace> ign1(Backtrace::Create(getpid(), thread_data.tid));
581 ASSERT_TRUE(ign1.get() != nullptr); 592 ASSERT_TRUE(ign1.get() != nullptr);
582 ASSERT_TRUE(ign1->Unwind(1)); 593 ASSERT_TRUE(ign1->Unwind(1));
583 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, ign1->GetError().error_code); 594 VERIFY_NO_ERROR(ign1->GetError().error_code);
584 595
585 std::unique_ptr<Backtrace> ign2(Backtrace::Create(getpid(), thread_data.tid)); 596 std::unique_ptr<Backtrace> ign2(Backtrace::Create(getpid(), thread_data.tid));
586 ASSERT_TRUE(ign2.get() != nullptr); 597 ASSERT_TRUE(ign2.get() != nullptr);
587 ASSERT_TRUE(ign2->Unwind(2)); 598 ASSERT_TRUE(ign2->Unwind(2));
588 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, ign2->GetError().error_code); 599 VERIFY_NO_ERROR(ign2->GetError().error_code);
589 600
590 VerifyIgnoreFrames(all.get(), ign1.get(), ign2.get(), nullptr); 601 VerifyIgnoreFrames(all.get(), ign1.get(), ign2.get(), nullptr);
591 602
@@ -616,7 +627,7 @@ TEST(libbacktrace, thread_max_trace) {
616 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), thread_data.tid)); 627 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(getpid(), thread_data.tid));
617 ASSERT_TRUE(backtrace.get() != nullptr); 628 ASSERT_TRUE(backtrace.get() != nullptr);
618 ASSERT_TRUE(backtrace->Unwind(0)); 629 ASSERT_TRUE(backtrace->Unwind(0));
619 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 630 ASSERT_EQ(BACKTRACE_UNWIND_ERROR_EXCEED_MAX_FRAMES_LIMIT, backtrace->GetError().error_code);
620 631
621 VerifyMaxDump(backtrace.get()); 632 VerifyMaxDump(backtrace.get());
622 633
@@ -713,21 +724,21 @@ TEST(libbacktrace, simultaneous_maps) {
713 Backtrace* back1 = Backtrace::Create(getpid(), BACKTRACE_CURRENT_THREAD, map1); 724 Backtrace* back1 = Backtrace::Create(getpid(), BACKTRACE_CURRENT_THREAD, map1);
714 ASSERT_TRUE(back1 != nullptr); 725 ASSERT_TRUE(back1 != nullptr);
715 EXPECT_TRUE(back1->Unwind(0)); 726 EXPECT_TRUE(back1->Unwind(0));
716 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, back1->GetError().error_code); 727 VERIFY_NO_ERROR(back1->GetError().error_code);
717 delete back1; 728 delete back1;
718 delete map1; 729 delete map1;
719 730
720 Backtrace* back2 = Backtrace::Create(getpid(), BACKTRACE_CURRENT_THREAD, map2); 731 Backtrace* back2 = Backtrace::Create(getpid(), BACKTRACE_CURRENT_THREAD, map2);
721 ASSERT_TRUE(back2 != nullptr); 732 ASSERT_TRUE(back2 != nullptr);
722 EXPECT_TRUE(back2->Unwind(0)); 733 EXPECT_TRUE(back2->Unwind(0));
723 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, back2->GetError().error_code); 734 VERIFY_NO_ERROR(back2->GetError().error_code);
724 delete back2; 735 delete back2;
725 delete map2; 736 delete map2;
726 737
727 Backtrace* back3 = Backtrace::Create(getpid(), BACKTRACE_CURRENT_THREAD, map3); 738 Backtrace* back3 = Backtrace::Create(getpid(), BACKTRACE_CURRENT_THREAD, map3);
728 ASSERT_TRUE(back3 != nullptr); 739 ASSERT_TRUE(back3 != nullptr);
729 EXPECT_TRUE(back3->Unwind(0)); 740 EXPECT_TRUE(back3->Unwind(0));
730 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, back3->GetError().error_code); 741 VERIFY_NO_ERROR(back3->GetError().error_code);
731 delete back3; 742 delete back3;
732 delete map3; 743 delete map3;
733} 744}
@@ -991,7 +1002,7 @@ static void RunReadTest(Backtrace* backtrace, uint64_t read_addr) {
991 uint8_t* expected = new uint8_t[pagesize]; 1002 uint8_t* expected = new uint8_t[pagesize];
992 InitMemory(expected, pagesize); 1003 InitMemory(expected, pagesize);
993 1004
994 uint8_t* data = new uint8_t[2*pagesize]; 1005 uint8_t* data = new uint8_t[2 * pagesize];
995 // Verify that we can only read one page worth of data. 1006 // Verify that we can only read one page worth of data.
996 size_t bytes_read = backtrace->Read(read_addr, data, 2 * pagesize); 1007 size_t bytes_read = backtrace->Read(read_addr, data, 2 * pagesize);
997 ASSERT_EQ(pagesize, bytes_read); 1008 ASSERT_EQ(pagesize, bytes_read);
@@ -1042,8 +1053,10 @@ TEST(libbacktrace, thread_read) {
1042 ASSERT_TRUE(WaitForNonZero(&thread_data.state, 10)); 1053 ASSERT_TRUE(WaitForNonZero(&thread_data.state, 10));
1043} 1054}
1044 1055
1056// The code requires these variables are the same size.
1045volatile uint64_t g_ready = 0; 1057volatile uint64_t g_ready = 0;
1046volatile uint64_t g_addr = 0; 1058volatile uint64_t g_addr = 0;
1059static_assert(sizeof(g_ready) == sizeof(g_addr), "g_ready/g_addr must be same size");
1047 1060
1048static void ForkedReadTest() { 1061static void ForkedReadTest() {
1049 // Create two map pages. 1062 // Create two map pages.
@@ -1091,13 +1104,13 @@ TEST(libbacktrace, process_read) {
1091 1104
1092 uint64_t read_addr; 1105 uint64_t read_addr;
1093 size_t bytes_read = backtrace->Read(reinterpret_cast<uint64_t>(&g_ready), 1106 size_t bytes_read = backtrace->Read(reinterpret_cast<uint64_t>(&g_ready),
1094 reinterpret_cast<uint8_t*>(&read_addr), sizeof(uint64_t)); 1107 reinterpret_cast<uint8_t*>(&read_addr), sizeof(g_ready));
1095 ASSERT_EQ(sizeof(uint64_t), bytes_read); 1108 ASSERT_EQ(sizeof(g_ready), bytes_read);
1096 if (read_addr) { 1109 if (read_addr) {
1097 // The forked process is ready to be read. 1110 // The forked process is ready to be read.
1098 bytes_read = backtrace->Read(reinterpret_cast<uint64_t>(&g_addr), 1111 bytes_read = backtrace->Read(reinterpret_cast<uint64_t>(&g_addr),
1099 reinterpret_cast<uint8_t*>(&read_addr), sizeof(uint64_t)); 1112 reinterpret_cast<uint8_t*>(&read_addr), sizeof(g_addr));
1100 ASSERT_EQ(sizeof(uint64_t), bytes_read); 1113 ASSERT_EQ(sizeof(g_addr), bytes_read);
1101 1114
1102 RunReadTest(backtrace.get(), read_addr); 1115 RunReadTest(backtrace.get(), read_addr);
1103 1116
@@ -1176,7 +1189,7 @@ TEST(libbacktrace, check_unreadable_elf_local) {
1176 int fd = open(tmp_so_name, O_RDONLY); 1189 int fd = open(tmp_so_name, O_RDONLY);
1177 ASSERT_TRUE(fd != -1); 1190 ASSERT_TRUE(fd != -1);
1178 1191
1179 void* map = mmap(NULL, map_size, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, 0); 1192 void* map = mmap(nullptr, map_size, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, 0);
1180 ASSERT_TRUE(map != MAP_FAILED); 1193 ASSERT_TRUE(map != MAP_FAILED);
1181 close(fd); 1194 close(fd);
1182 ASSERT_TRUE(unlink(tmp_so_name) != -1); 1195 ASSERT_TRUE(unlink(tmp_so_name) != -1);
@@ -1225,7 +1238,7 @@ TEST(libbacktrace, check_unreadable_elf_remote) {
1225 exit(0); 1238 exit(0);
1226 } 1239 }
1227 1240
1228 void* map = mmap(NULL, map_size, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, 0); 1241 void* map = mmap(nullptr, map_size, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, 0);
1229 if (map == MAP_FAILED) { 1242 if (map == MAP_FAILED) {
1230 fprintf(stderr, "Failed to map in memory: %s\n", strerror(errno)); 1243 fprintf(stderr, "Failed to map in memory: %s\n", strerror(errno));
1231 unlink(tmp_so_name); 1244 unlink(tmp_so_name);
@@ -1258,11 +1271,11 @@ TEST(libbacktrace, check_unreadable_elf_remote) {
1258 ASSERT_TRUE(backtrace.get() != nullptr); 1271 ASSERT_TRUE(backtrace.get() != nullptr);
1259 1272
1260 uint64_t read_addr; 1273 uint64_t read_addr;
1261 ASSERT_EQ(sizeof(uint64_t), 1274 ASSERT_EQ(sizeof(g_ready),
1262 backtrace->Read(reinterpret_cast<uint64_t>(&g_ready), 1275 backtrace->Read(reinterpret_cast<uint64_t>(&g_ready),
1263 reinterpret_cast<uint8_t*>(&read_addr), sizeof(uint64_t))); 1276 reinterpret_cast<uint8_t*>(&read_addr), sizeof(g_ready)));
1264 if (read_addr) { 1277 if (read_addr) {
1265 ASSERT_EQ(sizeof(uint64_t), 1278 ASSERT_EQ(sizeof(g_addr),
1266 backtrace->Read(reinterpret_cast<uint64_t>(&g_addr), 1279 backtrace->Read(reinterpret_cast<uint64_t>(&g_addr),
1267 reinterpret_cast<uint8_t*>(&read_addr), sizeof(uint64_t))); 1280 reinterpret_cast<uint8_t*>(&read_addr), sizeof(uint64_t)));
1268 1281
@@ -1328,15 +1341,16 @@ static void VerifyUnreadableElfFrame(Backtrace* backtrace, uint64_t test_func, s
1328} 1341}
1329 1342
1330static void VerifyUnreadableElfBacktrace(void* func) { 1343static void VerifyUnreadableElfBacktrace(void* func) {
1331 uint64_t test_func = reinterpret_cast<uint64_t>(func);
1332 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS, 1344 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS,
1333 BACKTRACE_CURRENT_THREAD)); 1345 BACKTRACE_CURRENT_THREAD));
1334 ASSERT_TRUE(backtrace.get() != nullptr); 1346 ASSERT_TRUE(backtrace.get() != nullptr);
1335 ASSERT_TRUE(backtrace->Unwind(0)); 1347 ASSERT_TRUE(backtrace->Unwind(0));
1336 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 1348 VERIFY_NO_ERROR(backtrace->GetError().error_code);
1337 1349
1338 size_t frame_num; 1350 size_t frame_num;
1339 ASSERT_TRUE(FindFuncFrameInBacktrace(backtrace.get(), test_func, &frame_num)); 1351 uint64_t test_func = reinterpret_cast<uint64_t>(func);
1352 ASSERT_TRUE(FindFuncFrameInBacktrace(backtrace.get(), test_func, &frame_num))
1353 << DumpFrames(backtrace.get());
1340 1354
1341 VerifyUnreadableElfFrame(backtrace.get(), test_func, frame_num); 1355 VerifyUnreadableElfFrame(backtrace.get(), test_func, frame_num);
1342} 1356}
@@ -1390,7 +1404,7 @@ TEST(libbacktrace, unwind_through_unreadable_elf_remote) {
1390 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(pid, BACKTRACE_CURRENT_THREAD)); 1404 std::unique_ptr<Backtrace> backtrace(Backtrace::Create(pid, BACKTRACE_CURRENT_THREAD));
1391 ASSERT_TRUE(backtrace.get() != nullptr); 1405 ASSERT_TRUE(backtrace.get() != nullptr);
1392 ASSERT_TRUE(backtrace->Unwind(0)); 1406 ASSERT_TRUE(backtrace->Unwind(0));
1393 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 1407 VERIFY_NO_ERROR(backtrace->GetError().error_code);
1394 1408
1395 size_t frame_num; 1409 size_t frame_num;
1396 if (FindFuncFrameInBacktrace(backtrace.get(), reinterpret_cast<uint64_t>(test_func), 1410 if (FindFuncFrameInBacktrace(backtrace.get(), reinterpret_cast<uint64_t>(test_func),
@@ -1786,7 +1800,7 @@ static void CheckForLeak(pid_t pid, pid_t tid) {
1786 Backtrace* backtrace = Backtrace::Create(pid, tid, map.get()); 1800 Backtrace* backtrace = Backtrace::Create(pid, tid, map.get());
1787 ASSERT_TRUE(backtrace != nullptr); 1801 ASSERT_TRUE(backtrace != nullptr);
1788 ASSERT_TRUE(backtrace->Unwind(0)); 1802 ASSERT_TRUE(backtrace->Unwind(0));
1789 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 1803 VERIFY_NO_ERROR(backtrace->GetError().error_code);
1790 delete backtrace; 1804 delete backtrace;
1791 } 1805 }
1792 size_t stable_pss = GetPssBytes(); 1806 size_t stable_pss = GetPssBytes();
@@ -1797,7 +1811,7 @@ static void CheckForLeak(pid_t pid, pid_t tid) {
1797 Backtrace* backtrace = Backtrace::Create(pid, tid, map.get()); 1811 Backtrace* backtrace = Backtrace::Create(pid, tid, map.get());
1798 ASSERT_TRUE(backtrace != nullptr); 1812 ASSERT_TRUE(backtrace != nullptr);
1799 ASSERT_TRUE(backtrace->Unwind(0)); 1813 ASSERT_TRUE(backtrace->Unwind(0));
1800 ASSERT_EQ(BACKTRACE_UNWIND_NO_ERROR, backtrace->GetError().error_code); 1814 VERIFY_NO_ERROR(backtrace->GetError().error_code);
1801 delete backtrace; 1815 delete backtrace;
1802 } 1816 }
1803 size_t new_pss = GetPssBytes(); 1817 size_t new_pss = GetPssBytes();
diff --git a/libbacktrace/backtrace_testlib.cpp b/libbacktrace/backtrace_testlib.cpp
index 3081d64aa..fec7d985b 100644
--- a/libbacktrace/backtrace_testlib.cpp
+++ b/libbacktrace/backtrace_testlib.cpp
@@ -14,9 +14,15 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17#include <libunwind.h>
18#include <signal.h> 17#include <signal.h>
19#include <stdio.h> 18#include <stdio.h>
19#include <unistd.h>
20
21#include <memory>
22#include <vector>
23
24#include <unwindstack/Regs.h>
25#include <unwindstack/RegsGetLocal.h>
20 26
21#include "backtrace_testlib.h" 27#include "backtrace_testlib.h"
22 28
@@ -66,21 +72,70 @@ int test_recursive_call(int level, void (*callback_func)(void*), void* data) {
66} 72}
67 73
68typedef struct { 74typedef struct {
69 unw_context_t* unw_context; 75 std::vector<uint8_t>* ucontext;
70 volatile int* exit_flag; 76 volatile int* exit_flag;
71} GetContextArg; 77} GetContextArg;
72 78
73static void GetContextAndExit(void* data) { 79static void GetContextAndExit(void* data) {
74 GetContextArg* arg = (GetContextArg*)data; 80 GetContextArg* arg = reinterpret_cast<GetContextArg*>(data);
75 unw_getcontext(arg->unw_context); 81
82 std::unique_ptr<unwindstack::Regs> regs(unwindstack::Regs::CreateFromLocal());
83 unwindstack::RegsGetLocal(regs.get());
84
85 ucontext_t ucontext;
86 memset(&ucontext, 0, sizeof(ucontext));
87#if defined(__arm__)
88 memcpy(&ucontext.uc_mcontext, regs->RawData(), sizeof(uint32_t) * 16);
89#elif defined(__aarch64__)
90 memcpy(&ucontext.uc_mcontext, regs->RawData(), sizeof(uint64_t) * 33);
91#elif defined(__i386__)
92 uint32_t* reg_data = reinterpret_cast<uint32_t*>(regs->RawData());
93 ucontext.uc_mcontext.gregs[0] = reg_data[15];
94 ucontext.uc_mcontext.gregs[1] = reg_data[14];
95 ucontext.uc_mcontext.gregs[2] = reg_data[13];
96 ucontext.uc_mcontext.gregs[3] = reg_data[12];
97 ucontext.uc_mcontext.gregs[4] = reg_data[7];
98 ucontext.uc_mcontext.gregs[5] = reg_data[6];
99 ucontext.uc_mcontext.gregs[6] = reg_data[5];
100 ucontext.uc_mcontext.gregs[7] = reg_data[4];
101 ucontext.uc_mcontext.gregs[8] = reg_data[3];
102 ucontext.uc_mcontext.gregs[9] = reg_data[2];
103 ucontext.uc_mcontext.gregs[10] = reg_data[1];
104 ucontext.uc_mcontext.gregs[11] = reg_data[0];
105 ucontext.uc_mcontext.gregs[14] = reg_data[8];
106 ucontext.uc_mcontext.gregs[15] = reg_data[10];
107#elif defined(__x86_64__)
108 uint64_t* reg_data = reinterpret_cast<uint64_t*>(regs->RawData());
109 ucontext.uc_mcontext.gregs[0] = reg_data[8];
110 ucontext.uc_mcontext.gregs[1] = reg_data[9];
111 ucontext.uc_mcontext.gregs[2] = reg_data[10];
112 ucontext.uc_mcontext.gregs[3] = reg_data[11];
113 ucontext.uc_mcontext.gregs[4] = reg_data[12];
114 ucontext.uc_mcontext.gregs[5] = reg_data[13];
115 ucontext.uc_mcontext.gregs[6] = reg_data[14];
116 ucontext.uc_mcontext.gregs[7] = reg_data[15];
117 ucontext.uc_mcontext.gregs[8] = reg_data[5];
118 ucontext.uc_mcontext.gregs[9] = reg_data[4];
119 ucontext.uc_mcontext.gregs[10] = reg_data[6];
120 ucontext.uc_mcontext.gregs[11] = reg_data[3];
121 ucontext.uc_mcontext.gregs[12] = reg_data[1];
122 ucontext.uc_mcontext.gregs[13] = reg_data[0];
123 ucontext.uc_mcontext.gregs[14] = reg_data[2];
124 ucontext.uc_mcontext.gregs[15] = reg_data[7];
125 ucontext.uc_mcontext.gregs[16] = reg_data[16];
126#endif
127
128 arg->ucontext->resize(sizeof(ucontext));
129 memcpy(arg->ucontext->data(), &ucontext, sizeof(ucontext));
130
76 // Don't touch the stack anymore. 131 // Don't touch the stack anymore.
77 while (*arg->exit_flag == 0) { 132 while (*arg->exit_flag == 0) {
78 } 133 }
79} 134}
80 135
81void test_get_context_and_wait(unw_context_t* unw_context, volatile int* exit_flag) { 136void test_get_context_and_wait(void* ucontext, volatile int* exit_flag) {
82 GetContextArg arg; 137 GetContextArg arg;
83 arg.unw_context = unw_context; 138 arg.ucontext = reinterpret_cast<std::vector<uint8_t>*>(ucontext);
84 arg.exit_flag = exit_flag; 139 arg.exit_flag = exit_flag;
85 test_level_one(1, 2, 3, 4, GetContextAndExit, &arg); 140 test_level_one(1, 2, 3, 4, GetContextAndExit, &arg);
86} 141}
diff --git a/libbacktrace/backtrace_testlib.h b/libbacktrace/backtrace_testlib.h
index 16fedc436..9b55e56d4 100644
--- a/libbacktrace/backtrace_testlib.h
+++ b/libbacktrace/backtrace_testlib.h
@@ -19,8 +19,6 @@
19 19
20#include <sys/cdefs.h> 20#include <sys/cdefs.h>
21 21
22#include <libunwind.h>
23
24__BEGIN_DECLS 22__BEGIN_DECLS
25 23
26void test_loop_forever(); 24void test_loop_forever();
@@ -31,7 +29,7 @@ int test_level_three(int, int, int, int, void (*)(void*), void*);
31int test_level_two(int, int, int, int, void (*)(void*), void*); 29int test_level_two(int, int, int, int, void (*)(void*), void*);
32int test_level_one(int, int, int, int, void (*)(void*), void*); 30int test_level_one(int, int, int, int, void (*)(void*), void*);
33int test_recursive_call(int, void (*)(void*), void*); 31int test_recursive_call(int, void (*)(void*), void*);
34void test_get_context_and_wait(unw_context_t*, volatile int*); 32void test_get_context_and_wait(void*, volatile int*);
35 33
36__END_DECLS 34__END_DECLS
37 35
diff --git a/libbacktrace/include/backtrace/Backtrace.h b/libbacktrace/include/backtrace/Backtrace.h
index 18e9f61e8..7a37015d6 100644
--- a/libbacktrace/include/backtrace/Backtrace.h
+++ b/libbacktrace/include/backtrace/Backtrace.h
@@ -60,6 +60,10 @@ enum BacktraceUnwindErrorCode : uint32_t {
60 BACKTRACE_UNWIND_ERROR_FIND_PROC_INFO_FAILED, 60 BACKTRACE_UNWIND_ERROR_FIND_PROC_INFO_FAILED,
61 // Failed to execute dwarf instructions in debug sections. 61 // Failed to execute dwarf instructions in debug sections.
62 BACKTRACE_UNWIND_ERROR_EXECUTE_DWARF_INSTRUCTION_FAILED, 62 BACKTRACE_UNWIND_ERROR_EXECUTE_DWARF_INSTRUCTION_FAILED,
63 // Unwind information is incorrect.
64 BACKTRACE_UNWIND_ERROR_UNWIND_INFO,
65 // Unwind information stopped due to sp/pc repeating.
66 BACKTRACE_UNWIND_ERROR_REPEATED_FRAME,
63}; 67};
64 68
65struct BacktraceUnwindError { 69struct BacktraceUnwindError {
@@ -87,14 +91,6 @@ struct backtrace_frame_data_t {
87 // NULL. 91 // NULL.
88}; 92};
89 93
90#if defined(__APPLE__)
91struct __darwin_ucontext;
92typedef __darwin_ucontext ucontext_t;
93#else
94struct ucontext;
95typedef ucontext ucontext_t;
96#endif
97
98struct backtrace_stackinfo_t { 94struct backtrace_stackinfo_t {
99 uint64_t start; 95 uint64_t start;
100 uint64_t end; 96 uint64_t end;
@@ -106,7 +102,16 @@ class Regs;
106} 102}
107 103
108class Backtrace { 104class Backtrace {
109public: 105 public:
106 enum ArchEnum : uint8_t {
107 ARCH_ARM,
108 ARCH_ARM64,
109 ARCH_X86,
110 ARCH_X86_64,
111 };
112
113 static void SetGlobalElfCache(bool enable);
114
110 // Create the correct Backtrace object based on what is to be unwound. 115 // Create the correct Backtrace object based on what is to be unwound.
111 // If pid < 0 or equals the current pid, then the Backtrace object 116 // If pid < 0 or equals the current pid, then the Backtrace object
112 // corresponds to the current process. 117 // corresponds to the current process.
@@ -120,6 +125,16 @@ public:
120 static Backtrace* Create(pid_t pid, pid_t tid, BacktraceMap* map = NULL); 125 static Backtrace* Create(pid_t pid, pid_t tid, BacktraceMap* map = NULL);
121 126
122 // Create an offline Backtrace object that can be used to do an unwind without a process 127 // Create an offline Backtrace object that can be used to do an unwind without a process
128 // that is still running. By default, information is only cached in the map
129 // file. If the calling code creates the map, data can be cached between
130 // unwinds. If not, all cached data will be destroyed when the Backtrace
131 // object is destroyed.
132 static Backtrace* CreateOffline(ArchEnum arch, pid_t pid, pid_t tid,
133 const std::vector<backtrace_map_t>& maps,
134 const backtrace_stackinfo_t& stack);
135 static Backtrace* CreateOffline(ArchEnum arch, pid_t pid, pid_t tid, BacktraceMap* map);
136
137 // Create an offline Backtrace object that can be used to do an unwind without a process
123 // that is still running. If cache_file is set to true, then elf information will be cached 138 // that is still running. If cache_file is set to true, then elf information will be cached
124 // for this call. The cached information survives until the calling process ends. This means 139 // for this call. The cached information survives until the calling process ends. This means
125 // that subsequent calls to create offline Backtrace objects will continue to use the same 140 // that subsequent calls to create offline Backtrace objects will continue to use the same
@@ -130,11 +145,11 @@ public:
130 virtual ~Backtrace(); 145 virtual ~Backtrace();
131 146
132 // Get the current stack trace and store in the backtrace_ structure. 147 // Get the current stack trace and store in the backtrace_ structure.
133 virtual bool Unwind(size_t num_ignore_frames, ucontext_t* context = NULL) = 0; 148 virtual bool Unwind(size_t num_ignore_frames, void* context = NULL) = 0;
134 149
135 static bool Unwind(unwindstack::Regs* regs, BacktraceMap* back_map, 150 static bool Unwind(unwindstack::Regs* regs, BacktraceMap* back_map,
136 std::vector<backtrace_frame_data_t>* frames, size_t num_ignore_frames, 151 std::vector<backtrace_frame_data_t>* frames, size_t num_ignore_frames,
137 std::vector<std::string>* skip_names); 152 std::vector<std::string>* skip_names, BacktraceUnwindError* error = nullptr);
138 153
139 // Get the function name and offset into the function given the pc. 154 // Get the function name and offset into the function given the pc.
140 // If the string is empty, then no valid function name was found, 155 // If the string is empty, then no valid function name was found,
@@ -184,7 +199,7 @@ public:
184 199
185 std::string GetErrorString(BacktraceUnwindError error); 200 std::string GetErrorString(BacktraceUnwindError error);
186 201
187protected: 202 protected:
188 Backtrace(pid_t pid, pid_t tid, BacktraceMap* map); 203 Backtrace(pid_t pid, pid_t tid, BacktraceMap* map);
189 204
190 // The name returned is not demangled, GetFunctionName() takes care of 205 // The name returned is not demangled, GetFunctionName() takes care of
diff --git a/libbacktrace/include/backtrace/BacktraceMap.h b/libbacktrace/include/backtrace/BacktraceMap.h
index 4d020e6ad..e19c41396 100644
--- a/libbacktrace/include/backtrace/BacktraceMap.h
+++ b/libbacktrace/include/backtrace/BacktraceMap.h
@@ -34,6 +34,9 @@
34#include <string> 34#include <string>
35#include <vector> 35#include <vector>
36 36
37// Forward declaration.
38struct backtrace_stackinfo_t;
39
37// Special flag to indicate a map is in /dev/. However, a map in 40// Special flag to indicate a map is in /dev/. However, a map in
38// /dev/ashmem/... does not set this flag. 41// /dev/ashmem/... does not set this flag.
39static constexpr int PROT_DEVICE_MAP = 0x8000; 42static constexpr int PROT_DEVICE_MAP = 0x8000;
@@ -58,7 +61,8 @@ public:
58 // is unsupported. 61 // is unsupported.
59 static BacktraceMap* Create(pid_t pid, bool uncached = false); 62 static BacktraceMap* Create(pid_t pid, bool uncached = false);
60 63
61 static BacktraceMap* Create(pid_t pid, const std::vector<backtrace_map_t>& maps); 64 static BacktraceMap* CreateOffline(pid_t pid, const std::vector<backtrace_map_t>& maps,
65 const backtrace_stackinfo_t& stack);
62 66
63 virtual ~BacktraceMap(); 67 virtual ~BacktraceMap();
64 68
diff --git a/libbacktrace/testdata/arm/offline_testdata b/libbacktrace/testdata/arm/offline_testdata
index 6acea2999..d5b8f4718 100644
--- a/libbacktrace/testdata/arm/offline_testdata
+++ b/libbacktrace/testdata/arm/offline_testdata
@@ -93,7 +93,7 @@ map: start: e8812000 end: e8813000 offset: 0 load_bias: 0 flags: 1 name:
93map: start: e8813000 end: e8815000 offset: 0 load_bias: 0 flags: 3 name: 93map: start: e8813000 end: e8815000 offset: 0 load_bias: 0 flags: 3 name:
94map: start: ff886000 end: ff8a9000 offset: 0 load_bias: 0 flags: 3 name: [stack] 94map: start: ff886000 end: ff8a9000 offset: 0 load_bias: 0 flags: 3 name: [stack]
95map: start: ffff0000 end: ffff1000 offset: 0 load_bias: 0 flags: 5 name: [vectors] 95map: start: ffff0000 end: ffff1000 offset: 0 load_bias: 0 flags: 5 name: [vectors]
96registers: 64 34868affdc8871e8150000001c0000001c000000150000000e00000007000000e08771e834868aff2354d2aa24f9ffffdc8871e88c8771e875b86ee778ba6ee7 96ucontext: 104 000000000000000000000000000000000000000000000000000000000000000034868affdc8871e8150000001c0000001c000000150000000e00000007000000e08771e834868aff2354d2aa24f9ffffdc8871e88c8771e875b86ee778ba6ee70000000000000000
97stack: start: e8715000 end: e8719000 size: 16384 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc8871e87dba6ee734868affdc8871e8dc8871e85dba6ee7070000000e000000150000001c000000dc8871e85dba6ee71c000000150000000e00000007000000100000000c0000000800000004000000ddb86ee75dba6ee7dc8871e804000000080000000c00000010000000dc8871e85dba6ee7100000000c000000080000000400000008000000060000000400000002000000288871e835b96ee75dba6ee7dc8871e802000000040000000600000008000000dc8871e85dba6ee70800000006000000040000000200000004000000030000000200000001000000708871e88db96ee75dba6ee7dc8871e801000000020000000300000004000000dc8871e85dba6ee70400000003000000020000000100000004000000208971e8208971e878000000e87d00003dba6ee75dba6ee7dc8871e878000000c5807ce7fc7183e734868aff78868aff78868aff34868aff34868aff78868affe0879437208971e84154d2aa0020000034868aff34868aff34868aff78000000c9b87ee7b1b87ee7a3f47be7288971e8b1b87ee7208971e800000000f83481e800000000e97d0000e87d000000000000005071e82039000000100000000000000000000000000000000000002354d2aa34868aff00000000002071e801000000000000000000000000000000708971e8208971e8000000000000000000000000e0879437000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 97stack: start: e8715000 end: e8719000 size: 16384 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc8871e87dba6ee734868affdc8871e8dc8871e85dba6ee7070000000e000000150000001c000000dc8871e85dba6ee71c000000150000000e00000007000000100000000c0000000800000004000000ddb86ee75dba6ee7dc8871e804000000080000000c00000010000000dc8871e85dba6ee7100000000c000000080000000400000008000000060000000400000002000000288871e835b96ee75dba6ee7dc8871e802000000040000000600000008000000dc8871e85dba6ee70800000006000000040000000200000004000000030000000200000001000000708871e88db96ee75dba6ee7dc8871e801000000020000000300000004000000dc8871e85dba6ee70400000003000000020000000100000004000000208971e8208971e878000000e87d00003dba6ee75dba6ee7dc8871e878000000c5807ce7fc7183e734868aff78868aff78868aff34868aff34868aff78868affe0879437208971e84154d2aa0020000034868aff34868aff34868aff78000000c9b87ee7b1b87ee7a3f47be7288971e8b1b87ee7208971e800000000f83481e800000000e97d0000e87d000000000000005071e82039000000100000000000000000000000000000000000002354d2aa34868aff00000000002071e801000000000000000000000000000000708971e8208971e8000000000000000000000000e0879437000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
98function: start: 0 end: e76eb835 name: unknown_start 98function: start: 0 end: e76eb835 name: unknown_start
99function: start: e76eb835 end: e76eb88d name: test_level_four 99function: start: e76eb835 end: e76eb88d name: test_level_four
diff --git a/libbacktrace/testdata/arm/offline_testdata_for_libGLESv2_adreno b/libbacktrace/testdata/arm/offline_testdata_for_libGLESv2_adreno
index 1f96834fa..d7c186e6f 100644
--- a/libbacktrace/testdata/arm/offline_testdata_for_libGLESv2_adreno
+++ b/libbacktrace/testdata/arm/offline_testdata_for_libGLESv2_adreno
@@ -1,6 +1,6 @@
1pid: 7288 tid: 31656 1pid: 7288 tid: 31656
2regs: pc: cc416235 sp: cc17f000 2ucontext: 104 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f017cc00000000356241cc0000000000000000
3map: start: cc361000 end: cc758000 offset: 0 load_bias: 9000 flags: 5 name: /vendor/lib/egl/libGLESv2_adreno.so 3map: start: cc361000 end: cc758000 offset: 0 load_bias: 9000 flags: 5 name: /vendor/lib/egl/libGLESv2_adreno.so
4stack: start: cc17f254 end: cc17f258 size: 4 b36141cc 4stack: start: cc17f234 end: cc17f258 size: 36 0000000000000000000000000000000000000000000000000000000000000000b36141cc
5function: start: be1f0 end: be304 name: EsxContext::Clear(unsigned int, unsigned int, unsigned int, EsxClearValues*) 5function: start: be1f0 end: be304 name: EsxContext::Clear(unsigned int, unsigned int, unsigned int, EsxClearValues*)
6function: start: be058 end: be1f0 name: EsxContext::ClearBuffersForDebug() 6function: start: be058 end: be1f0 name: EsxContext::ClearBuffersForDebug()
diff --git a/libbacktrace/testdata/arm/offline_testdata_for_libandroid_runtime b/libbacktrace/testdata/arm/offline_testdata_for_libandroid_runtime
index a12bc3c5b..54f352520 100644
--- a/libbacktrace/testdata/arm/offline_testdata_for_libandroid_runtime
+++ b/libbacktrace/testdata/arm/offline_testdata_for_libandroid_runtime
@@ -1,6 +1,6 @@
1pid: 7288 tid: 31656 1pid: 7288 tid: 31656
2regs: pc: f1f6dc49 sp: d8fe6930 2ucontext: 104 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003069fed80000000049dcf6f10000000000000000
3map: start: f1f10000 end: f2049000 offset: 0 load_bias: 10000 flags: 5 name: /system/lib/libandroid_runtime.so 3map: start: f1f10000 end: f2049000 offset: 0 load_bias: 10000 flags: 5 name: /system/lib/libandroid_runtime.so
4stack: start: d8fe6954 end: d8fe6958 size: 4 e7dcf6f1 4stack: start: d8fe6948 end: d8fe6958 size: 16 000000000000000000000000e7dcf6f1
5function: start: 6dbf9 end: 6dce5 name: android::AndroidRuntime::javaThreadShell 5function: start: 6dbf9 end: 6dce5 name: android::AndroidRuntime::javaThreadShell
6function: start: 6dce5 end: 6dd79 name: android::AndroidRuntime::javaCreateThreadEtc 6function: start: 6dce5 end: 6dd79 name: android::AndroidRuntime::javaCreateThreadEtc
diff --git a/libbacktrace/testdata/arm/offline_testdata_for_libart b/libbacktrace/testdata/arm/offline_testdata_for_libart
index db9bf8d8c..c1369ff6c 100644
--- a/libbacktrace/testdata/arm/offline_testdata_for_libart
+++ b/libbacktrace/testdata/arm/offline_testdata_for_libart
@@ -1,5 +1,5 @@
1pid: 32232 tid: 32233 1pid: 32232 tid: 32233
2registers: 64 000000000000000000000000000000006473602451b3e2e700000000d82fd1ff5600000000908eec00000000d42dd1ff00000000c02dd1ff617171e9617171e9 2ucontext: 104 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006473602451b3e2e700000000d82fd1ff5600000000908eec00000000d42dd1ff00000000c02dd1ff617171e9617171e90000000000000000
3map: start: e9380000 end: e9766000 offset: 0 load_bias: b000 flags: 5 name: /system/lib/libart.so 3map: start: e9380000 end: e9766000 offset: 0 load_bias: b000 flags: 5 name: /system/lib/libart.so
4stack: start: ffd12dc0 end: ffd1306c size: 684 00000000000c5024070000000300000005070a0a0100000051b3e2e700000000d82fd1ff560000004c2ed1ff000000000000000081b771e9d82fd1ff000000004c2ed1ff0c2ed1ff40a8d27024bf76e900908eec000000000834d1ff0000000000000000000000000d000000050000000000000000000000080000000101d1ff44b8bfeb4b0000000000000000000000e8b8952400000000fc2ed1ff4fb3e2e7bc49ac6f00908eecb02ed1ffd82fd1ff040000008c908eec942fd1ffd5c141e9d82fd1ff4fb3e2e7542fd1ff336c68e940000000400000007030d1fff031d1ff00000000bc49ac6f5c30d1ff942fd1ff842fd1ffd82fd1ff00000000b8f1786f4fb3e2e7610d67e9d82fd1ff4fb3e2e77880adeb7980adeb7a80adeb7b80adeb7c80adeb7d80adeb7e80adeb7f80adeb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007430d1ff02000000e8b89524e8d895240200000000908eec5c30d1ffbc49ac6f4fb3e2e74030d1ffe8d8952400000000b8f1786fbc49ac6f332367e94fb3e2e701000000637171e9637171e9000000005c30d1ff8430d1ffe0c08bec882fd1ff4fb3e2e70200000004000000942fd1ffe8b8952400908eec58d8952458d895247fbd69e90500000000400fe40100000000908eec58d89524060000009c86bd6f6b876fe900908eece0c08bec00008eec0000000000000000000000000000000044b8bfeb4b000000009be86f040000000038d1ff01000000c8e7446f060000000000000000908eec30d89524e8b895249c86bd6f7893476f00908eec00000000358c6fe970400fe4116e71e9a0285a6fa4d49c6f4489bd6f30d8952458d89524e8d8952400908eeca431d1ff2c31d1ffb75861e90100000000908eec30528bec409181e958d89524 4stack: start: ffd12dc0 end: ffd1306c size: 684 00000000000c5024070000000300000005070a0a0100000051b3e2e700000000d82fd1ff560000004c2ed1ff000000000000000081b771e9d82fd1ff000000004c2ed1ff0c2ed1ff40a8d27024bf76e900908eec000000000834d1ff0000000000000000000000000d000000050000000000000000000000080000000101d1ff44b8bfeb4b0000000000000000000000e8b8952400000000fc2ed1ff4fb3e2e7bc49ac6f00908eecb02ed1ffd82fd1ff040000008c908eec942fd1ffd5c141e9d82fd1ff4fb3e2e7542fd1ff336c68e940000000400000007030d1fff031d1ff00000000bc49ac6f5c30d1ff942fd1ff842fd1ffd82fd1ff00000000b8f1786f4fb3e2e7610d67e9d82fd1ff4fb3e2e77880adeb7980adeb7a80adeb7b80adeb7c80adeb7d80adeb7e80adeb7f80adeb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007430d1ff02000000e8b89524e8d895240200000000908eec5c30d1ffbc49ac6f4fb3e2e74030d1ffe8d8952400000000b8f1786fbc49ac6f332367e94fb3e2e701000000637171e9637171e9000000005c30d1ff8430d1ffe0c08bec882fd1ff4fb3e2e70200000004000000942fd1ffe8b8952400908eec58d8952458d895247fbd69e90500000000400fe40100000000908eec58d89524060000009c86bd6f6b876fe900908eece0c08bec00008eec0000000000000000000000000000000044b8bfeb4b000000009be86f040000000038d1ff01000000c8e7446f060000000000000000908eec30d89524e8b895249c86bd6f7893476f00908eec00000000358c6fe970400fe4116e71e9a0285a6fa4d49c6f4489bd6f30d8952458d89524e8d8952400908eeca431d1ff2c31d1ffb75861e90100000000908eec30528bec409181e958d89524
5function: start: 3a2121 end: 3a217a name: art_quick_invoke_stub_internal 5function: start: 3a2121 end: 3a217a name: art_quick_invoke_stub_internal
diff --git a/libbacktrace/testdata/arm64/offline_testdata b/libbacktrace/testdata/arm64/offline_testdata
index 75a2f12d1..cee9f7202 100644
--- a/libbacktrace/testdata/arm64/offline_testdata
+++ b/libbacktrace/testdata/arm64/offline_testdata
@@ -95,7 +95,7 @@ map: start: 70160e1000 end: 70160e4000 offset: 0 load_bias: 0 flags: 3 name:
95map: start: 70160e4000 end: 70160e5000 offset: 0 load_bias: 0 flags: 1 name: 95map: start: 70160e4000 end: 70160e5000 offset: 0 load_bias: 0 flags: 1 name:
96map: start: 70160e5000 end: 70160e8000 offset: 0 load_bias: 0 flags: 3 name: 96map: start: 70160e5000 end: 70160e8000 offset: 0 load_bias: 0 flags: 3 name:
97map: start: 7fd8baf000 end: 7fd8be6000 offset: 0 load_bias: 0 flags: 3 name: [stack] 97map: start: 7fd8baf000 end: 7fd8be6000 offset: 0 load_bias: 0 flags: 3 name: [stack]
98registers: 4560 679a0b1670000000f3eb6d705500000090f56e7055000000000000000000000000206f705500000014e0677055000000d038bed87f0000004cde67705500000041000000000000001900000000000000c00f241470000000d3aec914588f4bcd0400000000000000e493af157000000090f56e7055000000060000000000000023c00b1670000000b1d1fd15700000003039bed87f000000c898041670000000304cbed87f000000b8130e1670000000303cbed87f000000f838bed87f0000000e0000000000000015000000000000001c00000000000000ec59cf1570000000b863fd15700000005064fd15700000000000000000000000ec59cf15700000000200000000000000b863fd1570000000144abed87f0000006064fd15700000005064fd157000000000010000000000005826bed87f000000d86fcf15700000006057cf157000000000000000000000005064fd15700000005064fd15700000005064fd1570000000b67e00000000000040fd677055000000d064fd15700000000030fd157000000002000000000000000100000000000000fcb58a56000000000063fd15700000009857cf1570000000c062fd15700000001c5acf157000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000003003167000000001000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000033000000000000000300000000000000003303167000000008330316700000000000000006000000f8320316700000005839bed87f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000c84cbed87f000000e84cbed87f000000984dbed87f00000078170e167000000002fd0000000000001400000000000000ff8100000100000000000000000000000000000000000000000000000000000078145700000000000010000000000000902b000000000000bdd04058000000000000000000000000bdd04058000000000000000000000000ccb58a560000000042487408000000000000000000000000cc57041670000000004704167000000010c0fd157000000010c0fd157000000090c0fd15700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000010000000000000002f48bed87f000000d3aec914588f4bcd2045bed87f0000002045bed87f0000002f48bed87f00000001000000000000002f000080000000005045bed87f0000000045bed87f000000c0a0c315700000006045bed87f0000006045bed87f000000010000000000000001000000000000000344bed87f00000001000000100000009c3fbed87f0000009b3fbed87f0000000344bed87f0000009a3fbed87f0000000100000000000000953fbed87f0000004344bed80100000001000000010000002c48bed87f0000000444bed87f0000004344bed80100000000000000000000000100000000000000b03fbed87f000000000000000200000000000000000000000000000000000000d3aec914588f4bcd000000000100000000000000000000000100000000000000f03fbed87f000000000000000200000000000000000000000000000000000000d3aec914588f4bcd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a03fbed87f0000000000000000000000000000000000000000000000000000000000000000000000d3aec914588f4bcd08226f70550000000000000000000000000000000000000000000000000000001048bed87f0000008047bed87f0000006047bed87f000000e0ffffff80ffffff03000000000000000000000000000000891d6e7055000000d3aec914588f4bcd5047bed87f0000005047bed87f000000861d6e705500000003000000000000002f00008000000000f0a6ca15700000004047bed87f000000c0a0c31570000000891d6e7055000000d3aec914000000000100000000000000a047bed800000000f9006e70550000000100000000000000dc41bed87f000000db41bed87f0000004346bed87f000000da41bed87f0000000100000000000000d541bed87f00000001000000010000000100000001000000861d6e70550000004446bed87f0000002c42bed80300000000000000000000000100000000000000f041bed87f0000009b1e6e700100000000000000000000000000000000000000d3aec914588f4bcd8e1e6e70550000000d000000000000002f00008000000000f0a6ca15700000003048bed87f000000c0a0c31570000000661e6e700100000000000000000000002f000000000000001000000000000000e21e6e7055000000d3aec914588f4bcdb048bed87f000000b048bed87f000000e21e6e70550000002f000000000000002f00008000000000f0a6ca1570000000a048bed87f000000c0a0c315700000008e1e6e7055000000000000000000000022000000000000000000000000000000205827147000000022000000000000003c43bed87f0000003b43bed87f000000a347bed87f0000003a43bed87f00000001000000000000003543bed87f000000f048bed8010000000100000001000000dd1e6e7055000000a447bed87f0000008c43bed82f000000000000000000000001000000000000005043bed87f000000861d6e700300000000000000000000000000000000000000d3aec914588f4bcd721e6e7055000000f447bed87f000000981123141800000000000000000000000100000000000000a043bed87f000000861d6e70030000000000000000000000d042bed87f0000000000000000000000981123147000000098112314700000009811231470000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000504abed87f000000b049bed87f0000008049bed87f00000000000000000000004043bed87f0000000000000000000000991123147000000000000000000000008e1e6e70550000000d00000000000000a04abed87f000000000000000000000000000000000000000000000000000000504abed87f000000e049bed87f000000a049bed87f000000c8ffffff80ffffff591e6e70550000000d0000000000000098112314700000000000000000000000df1e6e7055000000010000000000000020582714700000002200000000000000f049bed87f000000c8ffffff80ffffff9811231470000000980023147000000098112314700000009811231470000000741e6e7055000000060000000000000009f12914700000000c00000000000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b149bed87f000000b149bed87f000000f049be317f000000f049bed87f000000f049bed87f000000b149bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000b049bed87f000000f149bed87f000000f049bed87f000000d3aec914588f4bcdfcb58a56000000006cbb687055000000160000000000000098112314700000009911231470000000991123147000000098112314700000009911231470000000fcb58a5600000000010000000000000000000000000000000100000000000000604a050000000000e845bed87f0000006048bed87f000000a046bed87f00000017000000000000002c48bed87f0000009046bed87f000000ac73c515700000009911231470000000d3aec914588f4bcd1048bed87f0000008047bed87f0000006047bed87f000000e8ffffff80ffffffffffffffffffffff99112314700000006148bed87f000000981123141500000008020000ffffffff6048bed87f000000160000000000000058112314700000001700000000000000a849bed87f0000000000000000000000284abed87f0000001700000000000000284abed87f000000284abed87f000000d249bed87f00000001000000000000009a112314700000001600000000000000284abed87f000000ffffffffffffffff284abed87f000000284abed87f000000284abed87f000000284abed87f0000001700000000000000ffffffffffffffff284abed87f000000284abed87f000000ff49bed87f000000284abed87f00000000000000000000000000000000000000d049bed87f000000d049bed87f000000004abed87f000000d049bed87f0000000100000000000000d049bed87f000000d049bed87f000000d049bed87f00000017000000000000000100000000000000ffffffffffffffff991123147000000001000000000000003448bed87f0000009911231470000000b0ca687055000000ffffffffffffffff010000000000000099112314700000007047bed87f000000d3aec914588f4bcdfcb58a56000000000100000000000000000000000000000050226f70550000000000000000000000b44b05000000000000102a1470000000861d6e70550000000300000000000000f0a6ca1570000000a047bed87f0000006c79c31570000000f048bed87f0000008048bed87f0000004048bed87f000000c8ffffff80ffffff0000000000000000d3aec914588f4bcdf849bed87f000000f0a6ca15700000000200000000000000085b0e1670000000e048bed87f0000002c6fc515700000009048bed87f000000d3aec914588f4bcd0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a89912314700000000000000000000000e9216f70550000008991231470000000e449bed87f0000008991231470000000000000000000000000000000000000008891231470000000899123147000000089912314700000008891231470000000170000000000000088912314700000008891231470000000d3aec914588f4bcd899123147000000016000000000000000000000000000000e9216f705500000088912314700000008891231470000000889123147000000088912314700000008891231470000000f0a6ca15700000000049bed87f0000006c79c31570000000889123147000000088912314700000008891231470000000889123147000000088912314700000008891231470000000889123147000000089912314700000008991231470000000085b0e1670000000404abed87f0000002c6fc51570000000c80a6f7055000000d3aec914588f4bcd0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a3b3325736d001b5b6d002c20776865726520002573203d202573000a526570650000000000000000000000000000000000000000000000008891231470000000000000000000000088912314700000008891231470000000889123147000000088912314700000000000000000000000889123147000000088912314700000008891231470000000470000000000000000502a1470000000d3aec914588f4bcdf05727147000000000b2221470000000604abed87f0000005c716c7055000000fcb58a56000000007c706c7055000000fcb58a5600000000ea4b050000000000 98ucontext: 464 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f838bed87f0000000e0000000000000015000000000000001c00000000000000ec59cf1570000000b863fd15700000005064fd15700000000000000000000000ec59cf15700000000200000000000000b863fd1570000000144abed87f0000006064fd15700000005064fd157000000000010000000000005826bed87f000000d86fcf15700000006057cf157000000000000000000000005064fd15700000005064fd15700000005064fd1570000000b67e00000000000040fd677055000000d064fd15700000000030fd157000000002000000000000000100000000000000fcb58a56000000000063fd15700000009857cf1570000000c062fd15700000001c5acf157000000000000000000000000000000000000000
99stack: start: 7015fd3000 end: 7015fd7000 size: 16384 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f838bed87f0000004038bed87f000000b863fd1570000000b863fd1570000000b863fd1570000000ec59cf15700000001c000000150000000e000000070000003063fd15700000001c58cf1570000000b863fd1570000000ec59cf1570000000100000000c00000008000000040000006063fd15700000007c58cf1570000000b863fd1570000000ec59cf1570000000080000000600000004000000020000009063fd1570000000dc58cf1570000000b863fd1570000000ec59cf157000000004000000030000000200000001000000d063fd1570000000c459cf15700000000100000000000000144abed87f0000004038bed87f0000004038bed87f000000144abed87f000000d3aec914588f4bcd1064fd157000000074fd6770550000004038bed87f0000004038bed87f000000ec84c41570000000e484c41570000000c484c4157000000000000000000000004064fd15700000004015c01570000000b67e0000000000000000000000000000705a0e1670000000185b0e167000000000000000000000000000000000000000705a0e16700000000000000000000000b77e0000b67e000000000000550000000030fd157000000050340000000000000010000000000000000000000000000000b222147000000000102a14700000000000000000000000000000000000000040fd6770550000004038bed87f000000000000000000000000a0fa1570000000010000000000000000000000000000000000000000000000e864fd15700000005064fd1570000000000000000000000000000000000000000000000000000000d3aec914588f4bcd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 99stack: start: 7015fd3000 end: 7015fd7000 size: 16384 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f838bed87f0000004038bed87f000000b863fd1570000000b863fd1570000000b863fd1570000000ec59cf15700000001c000000150000000e000000070000003063fd15700000001c58cf1570000000b863fd1570000000ec59cf1570000000100000000c00000008000000040000006063fd15700000007c58cf1570000000b863fd1570000000ec59cf1570000000080000000600000004000000020000009063fd1570000000dc58cf1570000000b863fd1570000000ec59cf157000000004000000030000000200000001000000d063fd1570000000c459cf15700000000100000000000000144abed87f0000004038bed87f0000004038bed87f000000144abed87f000000d3aec914588f4bcd1064fd157000000074fd6770550000004038bed87f0000004038bed87f000000ec84c41570000000e484c41570000000c484c4157000000000000000000000004064fd15700000004015c01570000000b67e0000000000000000000000000000705a0e1670000000185b0e167000000000000000000000000000000000000000705a0e16700000000000000000000000b77e0000b67e000000000000550000000030fd157000000050340000000000000010000000000000000000000000000000b222147000000000102a14700000000000000000000000000000000000000040fd6770550000004038bed87f000000000000000000000000a0fa1570000000010000000000000000000000000000000000000000000000e864fd15700000005064fd1570000000000000000000000000000000000000000000000000000000d3aec914588f4bcd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
100function: start: 0 end: 7015cf5760 name: unknown_start 100function: start: 0 end: 7015cf5760 name: unknown_start
101function: start: 7015cf5760 end: 7015cf57cc name: test_level_four 101function: start: 7015cf5760 end: 7015cf57cc name: test_level_four
diff --git a/libbacktrace/testdata/arm64/offline_testdata_for_eglSubDriverAndroid b/libbacktrace/testdata/arm64/offline_testdata_for_eglSubDriverAndroid
index dfad1725c..673e30e1d 100644
--- a/libbacktrace/testdata/arm64/offline_testdata_for_eglSubDriverAndroid
+++ b/libbacktrace/testdata/arm64/offline_testdata_for_eglSubDriverAndroid
@@ -1,6 +1,6 @@
1pid: 12276 tid: 12303 1pid: 12276 tid: 12303
2regs: pc: 7b8c027f64 sp: 7b8c157010 x29: 7b8c157040
3map: start: 7b8c01e000 end: 7b8c030000 offset: 0 load_bias: 0 flags: 5 name: /vendor/lib64/egl/eglSubDriverAndroid.so 2map: start: 7b8c01e000 end: 7b8c030000 offset: 0 load_bias: 0 flags: 5 name: /vendor/lib64/egl/eglSubDriverAndroid.so
4stack: start: 7b8c157048 end: 7b8c157050 size: 8 547e028c7b000000 3ucontext: 464 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004070158c7b00000000000000000000001070158c7b000000647f028c7b00000000000000000000000000000000000000
4stack: start: 7b8c157020 end: 7b8c157050 size: 48 00000000000000000000000000000000000000000000000000000000000000000000000000000000547e028c7b000000
5function: start: 9ed8 end: a1b0 name: EglAndroidWindowSurface::Initialize(EglAndroidConfig*, int const*) 5function: start: 9ed8 end: a1b0 name: EglAndroidWindowSurface::Initialize(EglAndroidConfig*, int const*)
6function: start: 9dcc end: 9ed8 name: EglAndroidWindowSurface::Create(ANativeWindow*, EglAndroidConfig*, EglAndroidWindowSurface**, int const*) 6function: start: 9dcc end: 9ed8 name: EglAndroidWindowSurface::Create(ANativeWindow*, EglAndroidConfig*, EglAndroidWindowSurface**, int const*)
diff --git a/libbacktrace/testdata/arm64/offline_testdata_for_libskia b/libbacktrace/testdata/arm64/offline_testdata_for_libskia
index 1027c5573..da820c0bd 100644
--- a/libbacktrace/testdata/arm64/offline_testdata_for_libskia
+++ b/libbacktrace/testdata/arm64/offline_testdata_for_libskia
@@ -1,6 +1,6 @@
1pid: 32232 tid: 32233 1pid: 32232 tid: 32233
2regs: pc: 7c25189a0c sp: 7b8c154b50 x29: 7b8c154bb0
3map: start: 7c24c80000 end: 7c25413000 offset: 0 load_bias: 5f000 flags: 5 name: /system/lib64/libskia.so 2map: start: 7c24c80000 end: 7c25413000 offset: 0 load_bias: 5f000 flags: 5 name: /system/lib64/libskia.so
4stack: start: 7b8c154bb8 end: 7b8c154bc0 size: 8 ec43f2247c000000 3ucontext: 464 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b04b158c7b0000000000000000000000504b158c7b0000000c9a18257c00000000000000000000000000000000000000
4stack: start: 7b8c154b80 end: 7b8c154bc0 size: 64 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec43f2247c000000
5function: start: 568970 end: 568c08 name: SkScalerContext_FreeType::generateImage(SkGlyph const&) 5function: start: 568970 end: 568c08 name: SkScalerContext_FreeType::generateImage(SkGlyph const&)
6function: start: 30330c end: 3044b0 name: SkScalerContext::getImage(SkGlyph const&) 6function: start: 30330c end: 3044b0 name: SkScalerContext::getImage(SkGlyph const&)
diff --git a/libbacktrace/testdata/x86/offline_testdata b/libbacktrace/testdata/x86/offline_testdata
index e8b7a9937..920b3385b 100644
--- a/libbacktrace/testdata/x86/offline_testdata
+++ b/libbacktrace/testdata/x86/offline_testdata
@@ -70,7 +70,7 @@ map: start: f77d4000 end: f77d5000 offset: 320000 load_bias: 0 flags: 3 name: /s
70map: start: f77d5000 end: f77d6000 offset: 0 load_bias: 0 flags: 3 name: 70map: start: f77d5000 end: f77d6000 offset: 0 load_bias: 0 flags: 3 name:
71map: start: f7ec6000 end: f7ee7000 offset: 0 load_bias: 0 flags: 3 name: [heap] 71map: start: f7ec6000 end: f7ee7000 offset: 0 load_bias: 0 flags: 3 name: [heap]
72map: start: ffe4e000 end: ffe70000 offset: 0 load_bias: 0 flags: 3 name: [stack] 72map: start: ffe4e000 end: ffe70000 offset: 0 load_bias: 0 flags: 3 name: [stack]
73registers: 348 00000000abdae6fff83b7df704000000a6ec77f7abdae6ff00000000afdae6ff78dae6ff150000001c000000b8f132f7a0f132f7d0df48f7a0ca48f728d9e6ff000000008c8decf78c8decf7ceca48f7a8dae6ff8d8decf70a0000000000000014dae6ff8c8decf78c8decf78c8decf78c8decf78c8decf7a9dae6ff06000000c03a23f78c8decf78c8decf78c8decf78c8decf78c8decf78c8decf78c8decf78d8decf78d8decf7c03a23f7543b23f7000033f75f5f0ff7c03a23f7503423f77000000098000000020000000f2700006c0000000e00000080000000000000008c8decf7000000008c8decf77f03ffff0000ffffffffffff0000000000000000000000000000ffff040000000f27000008000000003023f78d8decf7f069ec000046bdaa308decf715537df7f83b7df78c8decf74c1c71f78c8decf715537df70000000000000000f069ecf7f83b7df75064ecf792e671f7f069ecf7 73ucontext: 96 0000000000000000000000000000000000000000abdae6ff00000000afdae6ff78dae6ff150000001c000000b8f132f7a0f132f7d0df48f7a0ca48f728d9e6ff000000000000000000000000ceca48f7a8dae6ff000000000000000000000000
74stack: start: f732c000 end: f7330000 size: 16384 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d9d49f761b009f71e382ff7000000000000000000000000000000000000000002000000f6372ff704c82bf70000000000204bf7f0a908f7ceca48f728d9e6fff4a449f70000000020f332f720f332f7d0df48f7f8f132f794c748f720f332f70c144205978142a8d4be08f7d0df48f720f332f7a0ca48f71c000000150000000e000000070000001c000000a0ca48f7d0df48f748f232f739c848f7070000000e000000150000001c000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f7100000000c000000080000000400000010000000a0ca48f7d0df48f798f232f7c9c848f704000000080000000c00000010000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f70800000006000000040000000200000008000000a0ca48f7d0df48f7e8f232f759c948f702000000040000000600000008000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f7040000000300000002000000010000000046bdaa00000000d0df48f738f332f77cca48f701000000020000000300000004000000a0ca48f720f332f700000000f83b7df7696d4df7d0df48f788dae6ff28d9e6ff28d9e6ff88dae6ff58f332f70046bdaa40fb32f7f83b7df758f332f78d6d4df728d9e6ff88dae6fff83b7df728d9e6ff28d9e6ff009030f728f432f7726f2ff728d9e6ff40fb32f740fb32f740fb32f790f332f700000000000000000000000000000000000000000000000000000000009030f740fb32f7000f3d0028f432f703b12c75032f144e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a06e2ff700000000000f3d00000000008e3f17f740fb32f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a03823f7c4fd32f700000000e0341df7e02e1df7e03d1df70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040fb32f7188eecf740fb32f70100000030647cf70046bdaa28658876000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a705f7a4b130f7f2860000f1860000b0fb32f7ecffffff000000000000000090f332f7000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccfb32f70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c2638cfa7f3e1d0000000000000000000000000000000000406d4df728d9e6ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c032f7004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 74stack: start: f732c000 end: f7330000 size: 16384 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d9d49f761b009f71e382ff7000000000000000000000000000000000000000002000000f6372ff704c82bf70000000000204bf7f0a908f7ceca48f728d9e6fff4a449f70000000020f332f720f332f7d0df48f7f8f132f794c748f720f332f70c144205978142a8d4be08f7d0df48f720f332f7a0ca48f71c000000150000000e000000070000001c000000a0ca48f7d0df48f748f232f739c848f7070000000e000000150000001c000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f7100000000c000000080000000400000010000000a0ca48f7d0df48f798f232f7c9c848f704000000080000000c00000010000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f70800000006000000040000000200000008000000a0ca48f7d0df48f7e8f232f759c948f702000000040000000600000008000000a0ca48f720f332f70000000000000000d0df48f720f332f7a0ca48f7040000000300000002000000010000000046bdaa00000000d0df48f738f332f77cca48f701000000020000000300000004000000a0ca48f720f332f700000000f83b7df7696d4df7d0df48f788dae6ff28d9e6ff28d9e6ff88dae6ff58f332f70046bdaa40fb32f7f83b7df758f332f78d6d4df728d9e6ff88dae6fff83b7df728d9e6ff28d9e6ff009030f728f432f7726f2ff728d9e6ff40fb32f740fb32f740fb32f790f332f700000000000000000000000000000000000000000000000000000000009030f740fb32f7000f3d0028f432f703b12c75032f144e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a06e2ff700000000000f3d00000000008e3f17f740fb32f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a03823f7c4fd32f700000000e0341df7e02e1df7e03d1df70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040fb32f7188eecf740fb32f70100000030647cf70046bdaa28658876000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a705f7a4b130f7f2860000f1860000b0fb32f7ecffffff000000000000000090f332f7000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccfb32f70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c2638cfa7f3e1d0000000000000000000000000000000000406d4df728d9e6ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c032f7004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
75function: start: 0 end: f748c740 name: unknown_start 75function: start: 0 end: f748c740 name: unknown_start
76function: start: f748c740 end: f748c7c0 name: test_level_four 76function: start: f748c740 end: f748c7c0 name: test_level_four
diff --git a/libbacktrace/testdata/x86_64/offline_testdata b/libbacktrace/testdata/x86_64/offline_testdata
index f8d0dc0a0..c6bb24161 100644
--- a/libbacktrace/testdata/x86_64/offline_testdata
+++ b/libbacktrace/testdata/x86_64/offline_testdata
@@ -81,7 +81,7 @@ map: start: 7fd5ad54e000 end: 7fd5ad56f000 offset: 0 load_bias: 0 flags: 3 name:
81map: start: 7ffcf47ed000 end: 7ffcf480f000 offset: 0 load_bias: 0 flags: 3 name: [stack] 81map: start: 7ffcf47ed000 end: 7ffcf480f000 offset: 0 load_bias: 0 flags: 3 name: [stack]
82map: start: 7ffcf48d5000 end: 7ffcf48d7000 offset: 0 load_bias: ffffffffff700000 flags: 5 name: [vdso] 82map: start: 7ffcf48d5000 end: 7ffcf48d7000 offset: 0 load_bias: ffffffffff700000 flags: 5 name: [vdso]
83map: start: ffffffffff600000 end: ffffffffff601000 offset: 0 load_bias: 0 flags: 5 name: [vsyscall] 83map: start: ffffffffff600000 end: ffffffffff601000 offset: 0 load_bias: 0 flags: 5 name: [vsyscall]
84registers: 936 010000000000000028b480f4fc7f000028b480f4fc7f000028b480f4fc7f0000b92455add57f0000b07bcfabd57f000098deb6abd57f0000b82455add57f0000010000000000000000000000000000000000000000000000c0e354add57f000000e7b6abd57f0000c8b080f4fc7f00000e0000000000000080ddb6abd57f000000000000000000001500000000000000b07bcfabd57f00001c0000000000000060ddb6abd57f0000d07bcfabd57f0000a0b180f4fc7f000028b480f4fc7f000028b480f4fc7f000028b480f4fc7f000078b480f4fc7f000078b480f4fc7f00007f03ffff0000ffffffffffff000000000000000000000000801f0000fc7f000078b480f4fc7f000060b280f4fc7f000000006a80f3f73cf110b480f4fc7f0000de66d6abd57f00000000000000000000000000000000000000006a80f3f73cf128b480f4fc7f0000782455add57f0000fd96d6abd57f0000092555add57f0000000000000000000057b480f4fc7f0000092555add57f000060b480f4fc7f00006994d6abd57f0000b0e0c6abd57f000071b280f4fc7f000070b280f4fc7f0000256c640000000000a8b180f4fc7f000090b480f4fc7f0000082555add57f0000092555add57f0000092555add57f0000082555add57f00001700000000000000082555add57f0000082555add57f0000f93cfcabd57f0000092555add57f000016000000000000000000000000000000090c07acd57f0000082555add57f0000082555add57f0000082555add57f0000082555add57f0000082555add57f000010b380f4fc7f000078b480f4fc7f00000000000000000000082555add57f0000082555add57f0000082555add57f0000082555add57f0000082555add57f0000082555add57f0000082555add57f0000092555add57f0000092555add57f0000b92455add57f000028b480f4fc7f0000c800000000000000014c7f0b0380ffff0d000000fc7f0000030000000000000033000000d57f000000b480f4fc7f00000000000000000000a0e154ad5b000000000000000000000000000000000000006e000000770000000000000000000000082555add57f00000000000000000000082555add57f0000082555add57f0000082555add57f0000082555add57f00000000000000000000082555add57f0000082555add57f0000082555add57f00006027b4aad57f0000c800000000000000a0e154add57f0000c0e354add57f0000092555add57f000000006a80f3f73cf1e0e054add57f0000e0e554add57f0000d14df6abd57f0000 84ucontext: 224 00000000000000000000000000000000000000000000000000000000000000000000000000000000b07bcfabd57f000098deb6abd57f0000b82455add57f0000010000000000000000000000000000000000000000000000c0e354add57f000000e7b6abd57f0000c8b080f4fc7f00000e0000000000000080ddb6abd57f000000000000000000001500000000000000b07bcfabd57f00001c0000000000000060ddb6abd57f0000d07bcfabd57f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
85stack: start: 7fd5abb6b000 end: 7fd5abb6f000 size: 16384 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c4eaeabd57f00000000000000000000978142a8000000000f0000000000000012000000000000003888b4abd57f0000e657aeabd57f00000000000000000000a0dcb6abd57f0000307d78aad57f0000b0ddb6abd57f000028d978aad57f0000060aa10200000000a0ddb6abd57f0000000000000000000000000000000000002091b1abd57f0000e094b4abd57f000017008cabd57f0000c84d79aad57f000028e28babd57f00000000000005000000d503000001000000000000000000000068deb6abd57f000040deb6abd57f00002091b1abd57f00000100000000000000e0f3c6abd57f000088f0c6abd57f00006159aeabd57f000000000000000000002091b1abd57f000005000000000000000000000000000000010000000000000088f0c6abd57f00000000000000000000d07bcfabd57f00000000000000000000000000000000000098deb6abd57f000098deb6abd57f0000b0ddb6abd57f00006179cfabd57f000098deb6abd57f0000b07bcfabd57f00001c000000150000000e00000007000000f0ddb6abd57f0000e179cfabd57f00000000000000000000150000001c00000098deb6abd57f0000b07bcfabd57f0000100000000c000000080000000400000030deb6abd57f0000417acfabd57f000000000000000000000c0000001000000098deb6abd57f0000b07bcfabd57f00000800000006000000040000000200000070deb6abd57f0000a17acfabd57f00000000000000000000060000000800000098deb6abd57f0000b07bcfabd57f000004000000030000000200000001000000b0deb6abd57f0000817bcfabd57f0000000000000000000074b480f4fc7f0000c8b080f4fc7f0000c8b080f4fc7f000074b480f4fc7f000000006a80f3f73cf1d0deb6abd57f00002a52d5abd57f0000c8b080f4fc7f0000c8b080f4fc7f0000000000000000000084518cabd57f0000000000000000000000e7b6abd57f000000e7b6abd57f00008f990b1e3bad5a6700000000000000000000000000000000c0e354add57f000000e7b6abd57f00008f99cba356faf1988f9991bc23faf1980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7b6abd57f00007de387aad57f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006030b4aad57f0000b8edb6abd57f00000000000000000000000000000000000080b88eaad57f0000000000000000000080b28eaad57f0000000000000000000080c18eaad57f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7b6abd57f0000402555add57f000000e7b6abd57f00000100000000000000000000000000000000006a80f3f73cf1058f9d56adb3c7cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407ab1abd57f000030a3adabd57f00005c64000053640000e0e9b6abd57f0000e0e9b6abd57f0000e0ffffffffffffff00000000000000000000000000000000f0deb6abd57f00000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010eab6abd57f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c46ad90f52391d00000000000000000000000000000000000000000000000000f051d5abd57f0000c8b080f4fc7f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0b6abd57f000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 85stack: start: 7fd5abb6b000 end: 7fd5abb6f000 size: 16384 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c4eaeabd57f00000000000000000000978142a8000000000f0000000000000012000000000000003888b4abd57f0000e657aeabd57f00000000000000000000a0dcb6abd57f0000307d78aad57f0000b0ddb6abd57f000028d978aad57f0000060aa10200000000a0ddb6abd57f0000000000000000000000000000000000002091b1abd57f0000e094b4abd57f000017008cabd57f0000c84d79aad57f000028e28babd57f00000000000005000000d503000001000000000000000000000068deb6abd57f000040deb6abd57f00002091b1abd57f00000100000000000000e0f3c6abd57f000088f0c6abd57f00006159aeabd57f000000000000000000002091b1abd57f000005000000000000000000000000000000010000000000000088f0c6abd57f00000000000000000000d07bcfabd57f00000000000000000000000000000000000098deb6abd57f000098deb6abd57f0000b0ddb6abd57f00006179cfabd57f000098deb6abd57f0000b07bcfabd57f00001c000000150000000e00000007000000f0ddb6abd57f0000e179cfabd57f00000000000000000000150000001c00000098deb6abd57f0000b07bcfabd57f0000100000000c000000080000000400000030deb6abd57f0000417acfabd57f000000000000000000000c0000001000000098deb6abd57f0000b07bcfabd57f00000800000006000000040000000200000070deb6abd57f0000a17acfabd57f00000000000000000000060000000800000098deb6abd57f0000b07bcfabd57f000004000000030000000200000001000000b0deb6abd57f0000817bcfabd57f0000000000000000000074b480f4fc7f0000c8b080f4fc7f0000c8b080f4fc7f000074b480f4fc7f000000006a80f3f73cf1d0deb6abd57f00002a52d5abd57f0000c8b080f4fc7f0000c8b080f4fc7f0000000000000000000084518cabd57f0000000000000000000000e7b6abd57f000000e7b6abd57f00008f990b1e3bad5a6700000000000000000000000000000000c0e354add57f000000e7b6abd57f00008f99cba356faf1988f9991bc23faf1980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7b6abd57f00007de387aad57f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006030b4aad57f0000b8edb6abd57f00000000000000000000000000000000000080b88eaad57f0000000000000000000080b28eaad57f0000000000000000000080c18eaad57f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7b6abd57f0000402555add57f000000e7b6abd57f00000100000000000000000000000000000000006a80f3f73cf1058f9d56adb3c7cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407ab1abd57f000030a3adabd57f00005c64000053640000e0e9b6abd57f0000e0e9b6abd57f0000e0ffffffffffffff00000000000000000000000000000000f0deb6abd57f00000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010eab6abd57f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c46ad90f52391d00000000000000000000000000000000000000000000000000f051d5abd57f0000c8b080f4fc7f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0b6abd57f000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
86function: start: 0 end: 7fd5abcf7930 name: unknown_start 86function: start: 0 end: 7fd5abcf7930 name: unknown_start
87function: start: 7fd5abcf7930 end: 7fd5abcf7990 name: test_level_four 87function: start: 7fd5abcf7930 end: 7fd5abcf7990 name: test_level_four