From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18918 invoked by alias); 9 Sep 2009 13:29:57 -0000 Received: (qmail 18718 invoked by uid 22791); 9 Sep 2009 13:29:51 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-px0-f180.google.com (HELO mail-px0-f180.google.com) (209.85.216.180) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 Sep 2009 13:29:40 +0000 Received: by mail-px0-f180.google.com with SMTP id 10so4032492pxi.24 for ; Wed, 09 Sep 2009 06:29:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.154.17 with SMTP id g17mr10334wfo.247.1252502980125; Wed, 09 Sep 2009 06:29:40 -0700 (PDT) From: Hui Zhu Date: Wed, 09 Sep 2009 13:29:00 -0000 Message-ID: Subject: [RFA] Make the prec support signal better[4/4] -- amd64-linux To: gdb-patches ml Cc: Michael Snyder Content-Type: multipart/mixed; boundary=001636e0a68135e3d804732513b4 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-09/txt/msg00245.txt.bz2 --001636e0a68135e3d804732513b4 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 6061 This patch make amd64-linux support signal record. When signal happen, amd64_linux_record_signal will record the change. When the signal handler want return, new code in "amd64_linux_syscall_record" will record the change. 2009-09-09 Michael Snyder Hui Zhu * amd64-linux-tdep.c (amd64_all_but_ip_registers_record): New function. (amd64_linux_syscall_record): Call amd64_all_but_ip_registers_record if syscall is sys_rt_sigreturn. (amd64_linux_signal_stack): New enum. (amd64_linux_record_signal): New function. (amd64_linux_init_abi): Call set_gdbarch_process_record_signal. --- amd64-linux-tdep.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 15 deletions(-) --- a/amd64-linux-tdep.c +++ b/amd64-linux-tdep.c @@ -263,6 +263,49 @@ amd64_linux_write_pc (struct regcache *r regcache_cooked_write_unsigned (regcache, AMD64_LINUX_ORIG_RAX_REGNUM, -1); } +/* Record all registers for process-record. */ + +static int +amd64_all_but_ip_registers_record (struct regcache *regcache) +{ + if (record_arch_list_add_reg (regcache, AMD64_RAX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RCX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RDX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RBX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RSP_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RBP_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RSI_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_RDI_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R8_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R9_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R10_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R11_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R12_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R13_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R14_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_R15_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, AMD64_EFLAGS_REGNUM)) + return -1; + + return 0; +} + /* Parse the arguments of current system call instruction and record the values of the registers and memory that will be changed into "record_arch_list". This instruction is "syscall". @@ -1094,27 +1137,39 @@ amd64_linux_syscall_record (struct regca regcache_raw_read_unsigned (regcache, AMD64_RAX_REGNUM, &syscall_native); - syscall_gdb = amd64_canonicalize_syscall (syscall_native); - - if (syscall_native == amd64_sys_arch_prctl) + switch (syscall_native) { - ULONGEST arg3; + case amd64_sys_rt_sigreturn: + if (amd64_all_but_ip_registers_record (regcache)) + return -1; + return 0; + break; - regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg3, - &arg3); - if (arg3 == RECORD_ARCH_GET_FS || arg3 == RECORD_ARCH_GET_GS) + case amd64_sys_arch_prctl: + if (syscall_native == amd64_sys_arch_prctl) { - CORE_ADDR addr; + ULONGEST arg3; - regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg2, - &addr); - if (record_arch_list_add_mem (addr, - amd64_linux_record_tdep.size_ulong)) - return -1; + regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg3, + &arg3); + if (arg3 == RECORD_ARCH_GET_FS || arg3 == RECORD_ARCH_GET_GS) + { + CORE_ADDR addr; + + regcache_raw_read_unsigned (regcache, + amd64_linux_record_tdep.arg2, + &addr); + if (record_arch_list_add_mem (addr, + amd64_linux_record_tdep.size_ulong)) + return -1; + } + goto record_regs; } - goto record_regs; + break; } + syscall_gdb = amd64_canonicalize_syscall (syscall_native); + if (syscall_gdb < 0) { printf_unfiltered (_("Process record and replay target doesn't " @@ -1130,13 +1185,51 @@ amd64_linux_syscall_record (struct regca return ret; } - record_regs: +record_regs: /* Record the return value of the system call. */ if (record_arch_list_add_reg (regcache, AMD64_RCX_REGNUM)) return -1; if (record_arch_list_add_reg (regcache, AMD64_R11_REGNUM)) return -1; + return 0; +} + +enum amd64_linux_signal_stack { + redzone = 128, + xstate = 512, + frame_size = 560, +}; + +int +amd64_linux_record_signal (struct gdbarch *gdbarch, + struct regcache *regcache, + enum target_signal signal) +{ + ULONGEST rsp; + + if (amd64_all_but_ip_registers_record (regcache)) + return -1; + + if (record_arch_list_add_reg (regcache, AMD64_RIP_REGNUM)) + return -1; + + /* Record the change in the stack. */ + regcache_raw_read_unsigned (regcache, AMD64_RSP_REGNUM, &rsp); + /* redzone + sp -= 128; */ + rsp -= redzone; + /* This is for xstate. + sp -= sizeof (struct _fpstate); */ + rsp -= xstate; + /* This is for frame_size. + sp -= sizeof (struct rt_sigframe); */ + rsp -= frame_size; + if (record_arch_list_add_mem (rsp, redzone + xstate + frame_size)) + return -1; + + if (record_arch_list_add_end ()) + return -1; return 0; } @@ -1187,6 +1280,7 @@ amd64_linux_init_abi (struct gdbarch_inf set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); set_gdbarch_process_record (gdbarch, i386_process_record); + set_gdbarch_process_record_signal (gdbarch, amd64_linux_record_signal); /* Initialize the amd64_linux_record_tdep. */ /* These values are the size of the type that will be used in a system --001636e0a68135e3d804732513b4 Content-Type: text/plain; charset=US-ASCII; name="prec-support-signal-amd64-linux.txt" Content-Disposition: attachment; filename="prec-support-signal-amd64-linux.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fze3t9hr0 Content-length: 7373 LS0tCiBhbWQ2NC1saW51eC10ZGVwLmMgfCAgMTI0ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgMTA5IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygt KQoKLS0tIGEvYW1kNjQtbGludXgtdGRlcC5jCisrKyBiL2FtZDY0LWxpbnV4 LXRkZXAuYwpAQCAtMjYzLDYgKzI2Myw0OSBAQCBhbWQ2NF9saW51eF93cml0 ZV9wYyAoc3RydWN0IHJlZ2NhY2hlICpyCiAgIHJlZ2NhY2hlX2Nvb2tlZF93 cml0ZV91bnNpZ25lZCAocmVnY2FjaGUsIEFNRDY0X0xJTlVYX09SSUdfUkFY X1JFR05VTSwgLTEpOwogfQogCisvKiBSZWNvcmQgYWxsIHJlZ2lzdGVycyBm b3IgcHJvY2Vzcy1yZWNvcmQuICAqLworCitzdGF0aWMgaW50CithbWQ2NF9h bGxfYnV0X2lwX3JlZ2lzdGVyc19yZWNvcmQgKHN0cnVjdCByZWdjYWNoZSAq cmVnY2FjaGUpCit7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KHJlZ2NhY2hlLCBBTUQ2NF9SQVhfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7 CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBB TUQ2NF9SQ1hfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBBTUQ2NF9SRFhfUkVH TlVNKSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKHJlZ2NhY2hlLCBBTUQ2NF9SQlhfUkVHTlVNKSkKKyAgICBy ZXR1cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJl Z2NhY2hlLCBBTUQ2NF9SU1BfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7Cisg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBBTUQ2 NF9SQlBfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBBTUQ2NF9SU0lfUkVHTlVN KSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKHJlZ2NhY2hlLCBBTUQ2NF9SRElfUkVHTlVNKSkKKyAgICByZXR1 cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2Nh Y2hlLCBBTUQ2NF9SOF9SRUdOVU0pKQorICAgIHJldHVybiAtMTsKKyAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAocmVnY2FjaGUsIEFNRDY0X1I5 X1JFR05VTSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChyZWdjYWNoZSwgQU1ENjRfUjEwX1JFR05VTSkpCisg ICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChyZWdjYWNoZSwgQU1ENjRfUjExX1JFR05VTSkpCisgICAgcmV0dXJuIC0x OworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdjYWNoZSwg QU1ENjRfUjEyX1JFR05VTSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdjYWNoZSwgQU1ENjRfUjEzX1JF R05VTSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfcmVnIChyZWdjYWNoZSwgQU1ENjRfUjE0X1JFR05VTSkpCisgICAg cmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChy ZWdjYWNoZSwgQU1ENjRfUjE1X1JFR05VTSkpCisgICAgcmV0dXJuIC0xOwor ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdjYWNoZSwgQU1E NjRfRUZMQUdTX1JFR05VTSkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVy biAwOworfQorCiAvKiBQYXJzZSB0aGUgYXJndW1lbnRzIG9mIGN1cnJlbnQg c3lzdGVtIGNhbGwgaW5zdHJ1Y3Rpb24gYW5kIHJlY29yZAogICAgdGhlIHZh bHVlcyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBtZW1vcnkgdGhhdCB3aWxsIGJl IGNoYW5nZWQgaW50bwogICAgInJlY29yZF9hcmNoX2xpc3QiLiAgVGhpcyBp bnN0cnVjdGlvbiBpcyAic3lzY2FsbCIuCkBAIC0xMDk0LDI3ICsxMTM3LDM5 IEBAIGFtZDY0X2xpbnV4X3N5c2NhbGxfcmVjb3JkIChzdHJ1Y3QgcmVnY2EK IAogICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25lZCAocmVnY2FjaGUsIEFN RDY0X1JBWF9SRUdOVU0sICZzeXNjYWxsX25hdGl2ZSk7CiAKLSAgc3lzY2Fs bF9nZGIgPSBhbWQ2NF9jYW5vbmljYWxpemVfc3lzY2FsbCAoc3lzY2FsbF9u YXRpdmUpOwotCi0gIGlmIChzeXNjYWxsX25hdGl2ZSA9PSBhbWQ2NF9zeXNf YXJjaF9wcmN0bCkgCisgIHN3aXRjaCAoc3lzY2FsbF9uYXRpdmUpCiAgICAg ewotICAgICAgVUxPTkdFU1QgYXJnMzsKKyAgICBjYXNlIGFtZDY0X3N5c19y dF9zaWdyZXR1cm46CisgICAgICBpZiAoYW1kNjRfYWxsX2J1dF9pcF9yZWdp c3RlcnNfcmVjb3JkIChyZWdjYWNoZSkpCisgICAgICAgIHJldHVybiAtMTsK KyAgICAgIHJldHVybiAwOworICAgICAgYnJlYWs7CiAKLSAgICAgIHJlZ2Nh Y2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChyZWdjYWNoZSwgYW1kNjRfbGludXhf cmVjb3JkX3RkZXAuYXJnMywKLQkJCQkgICZhcmczKTsKLSAgICAgIGlmIChh cmczID09IFJFQ09SRF9BUkNIX0dFVF9GUyB8fCBhcmczID09IFJFQ09SRF9B UkNIX0dFVF9HUykKKyAgICBjYXNlIGFtZDY0X3N5c19hcmNoX3ByY3RsOgor ICAgIGlmIChzeXNjYWxsX25hdGl2ZSA9PSBhbWQ2NF9zeXNfYXJjaF9wcmN0 bCkKICAgICAgIHsKLQlDT1JFX0FERFIgYWRkcjsKKyAgICAgICAgVUxPTkdF U1QgYXJnMzsKIAotCXJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChyZWdj YWNoZSwgYW1kNjRfbGludXhfcmVjb3JkX3RkZXAuYXJnMiwKLQkJCQkgICAg JmFkZHIpOwotCWlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFkZHIs IAotCQkJCSAgICAgIGFtZDY0X2xpbnV4X3JlY29yZF90ZGVwLnNpemVfdWxv bmcpKQotCSAgcmV0dXJuIC0xOworICAgICAgICByZWdjYWNoZV9yYXdfcmVh ZF91bnNpZ25lZCAocmVnY2FjaGUsIGFtZDY0X2xpbnV4X3JlY29yZF90ZGVw LmFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm YXJnMyk7CisgICAgICAgIGlmIChhcmczID09IFJFQ09SRF9BUkNIX0dFVF9G UyB8fCBhcmczID09IFJFQ09SRF9BUkNIX0dFVF9HUykKKyAgICAgICAgICB7 CisJICAgIENPUkVfQUREUiBhZGRyOworCisJICAgIHJlZ2NhY2hlX3Jhd19y ZWFkX3Vuc2lnbmVkIChyZWdjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBhbWQ2NF9saW51eF9yZWNvcmRfdGRlcC5h cmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZhZGRyKTsKKwkgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGFtZDY0X2xpbnV4X3JlY29yZF90ZGVwLnNpemVfdWxvbmcpKQorICAg ICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICBn b3RvIHJlY29yZF9yZWdzOwogICAgICAgfQotICAgICAgZ290byByZWNvcmRf cmVnczsKKyAgICAgIGJyZWFrOwogICAgIH0KIAorICBzeXNjYWxsX2dkYiA9 IGFtZDY0X2Nhbm9uaWNhbGl6ZV9zeXNjYWxsIChzeXNjYWxsX25hdGl2ZSk7 CisKICAgaWYgKHN5c2NhbGxfZ2RiIDwgMCkKICAgICB7CiAgICAgICBwcmlu dGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQgYW5kIHJlcGxheSB0 YXJnZXQgZG9lc24ndCAiCkBAIC0xMTMwLDEzICsxMTg1LDUxIEBAIGFtZDY0 X2xpbnV4X3N5c2NhbGxfcmVjb3JkIChzdHJ1Y3QgcmVnY2EKICAgICAgICAg cmV0dXJuIHJldDsKICAgICB9CiAKLSByZWNvcmRfcmVnczoKK3JlY29yZF9y ZWdzOgogICAvKiBSZWNvcmQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3lz dGVtIGNhbGwuICAqLwogICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChyZWdjYWNoZSwgQU1ENjRfUkNYX1JFR05VTSkpCiAgICAgcmV0dXJuIC0x OwogICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdjYWNoZSwg QU1ENjRfUjExX1JFR05VTSkpCiAgICAgcmV0dXJuIC0xOwogCisgIHJldHVy biAwOworfQorCitlbnVtIGFtZDY0X2xpbnV4X3NpZ25hbF9zdGFjayB7Cisg IHJlZHpvbmUgPSAxMjgsCisgIHhzdGF0ZSA9IDUxMiwKKyAgZnJhbWVfc2l6 ZSA9IDU2MCwKK307CisKK2ludAorYW1kNjRfbGludXhfcmVjb3JkX3NpZ25h bCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25h bCkKK3sKKyAgVUxPTkdFU1QgcnNwOworCisgIGlmIChhbWQ2NF9hbGxfYnV0 X2lwX3JlZ2lzdGVyc19yZWNvcmQgKHJlZ2NhY2hlKSkKKyAgICByZXR1cm4g LTE7CisKKyAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAocmVnY2Fj aGUsIEFNRDY0X1JJUF9SRUdOVU0pKQorICAgIHJldHVybiAtMTsKKworICAv KiBSZWNvcmQgdGhlIGNoYW5nZSBpbiB0aGUgc3RhY2suICAqLworICByZWdj YWNoZV9yYXdfcmVhZF91bnNpZ25lZCAocmVnY2FjaGUsIEFNRDY0X1JTUF9S RUdOVU0sICZyc3ApOworICAvKiByZWR6b25lCisgICAgIHNwIC09IDEyODsg Ki8KKyAgcnNwIC09IHJlZHpvbmU7CisgIC8qIFRoaXMgaXMgZm9yIHhzdGF0 ZS4KKyAgICAgc3AgLT0gc2l6ZW9mIChzdHJ1Y3QgX2Zwc3RhdGUpOyAgKi8K KyAgcnNwIC09IHhzdGF0ZTsKKyAgLyogVGhpcyBpcyBmb3IgZnJhbWVfc2l6 ZS4KKyAgICAgc3AgLT0gc2l6ZW9mIChzdHJ1Y3QgcnRfc2lnZnJhbWUpOyAg Ki8KKyAgcnNwIC09IGZyYW1lX3NpemU7CisgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9tZW0gKHJzcCwgcmVkem9uZSArIHhzdGF0ZSArIGZyYW1lX3Np emUpKQorICAgIHJldHVybiAtMTsKKworICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfZW5kICgpKQorICAgIHJldHVybiAtMTsKIAogICByZXR1cm4gMDsK IH0KQEAgLTExODcsNiArMTI4MCw3IEBAIGFtZDY0X2xpbnV4X2luaXRfYWJp IChzdHJ1Y3QgZ2RiYXJjaF9pbmYKICAgc2V0X2dkYmFyY2hfZ2V0X3NpZ2lu Zm9fdHlwZSAoZ2RiYXJjaCwgbGludXhfZ2V0X3NpZ2luZm9fdHlwZSk7CiAK ICAgc2V0X2dkYmFyY2hfcHJvY2Vzc19yZWNvcmQgKGdkYmFyY2gsIGkzODZf cHJvY2Vzc19yZWNvcmQpOworICBzZXRfZ2RiYXJjaF9wcm9jZXNzX3JlY29y ZF9zaWduYWwgKGdkYmFyY2gsIGFtZDY0X2xpbnV4X3JlY29yZF9zaWduYWwp OwogCiAgIC8qIEluaXRpYWxpemUgdGhlIGFtZDY0X2xpbnV4X3JlY29yZF90 ZGVwLiAgKi8KICAgLyogVGhlc2UgdmFsdWVzIGFyZSB0aGUgc2l6ZSBvZiB0 aGUgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiBhIHN5c3RlbQo= --001636e0a68135e3d804732513b4--