ae115bc77f6fcde83175c75b4206dc2e50747966mrj/*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * CDDL HEADER START
ae115bc77f6fcde83175c75b4206dc2e50747966mrj *
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * The contents of this file are subject to the terms of the
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Common Development and Distribution License (the "License").
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * You may not use this file except in compliance with the License.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj *
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * or http://www.opensolaris.org/os/licensing.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * See the License for the specific language governing permissions
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * and limitations under the License.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj *
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * When distributing Covered Code, include this CDDL HEADER in each
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * If applicable, add the following below this CDDL HEADER, with the
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * fields enclosed by brackets "[]" replaced with your own identifying
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * information: Portions Copyright [yyyy] [name of copyright owner]
ae115bc77f6fcde83175c75b4206dc2e50747966mrj *
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * CDDL HEADER END
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj/*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Use is subject to license terms.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#pragma ident "%Z%%M% %I% %E% SMI"
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <stdlib.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <fcntl.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <strings.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <stdio.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <errno.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/types.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/inttypes.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/elf.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/elf_notes.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/mman.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/stat.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#include <sys/statvfs.h>
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjstatic char *pname;
ae115bc77f6fcde83175c75b4206dc2e50747966mrjstatic char *fname;
ae115bc77f6fcde83175c75b4206dc2e50747966mrjstatic char *image; /* pointer to the ELF file in memory */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj#define ELFSEEK(offset) ((void *)(image + offset))
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj/*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Extract the PT_LOAD bits and format them into a .s
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrjstatic void
ae115bc77f6fcde83175c75b4206dc2e50747966mrjextract32(Elf32_Ehdr *eh)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj{
ae115bc77f6fcde83175c75b4206dc2e50747966mrj Elf32_Phdr *phdr;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj caddr_t allphdrs;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj int i;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj int c;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj unsigned char *bytes;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj uint_t cnt = 10;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj allphdrs = NULL;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (eh->e_type != ET_EXEC) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: not ET_EXEC, e_type = 0x%x\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, eh->e_type);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (eh->e_phnum == 0 || eh->e_phoff == 0) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: no program headers\n", pname);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Get the program headers.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj allphdrs = ELFSEEK(eh->e_phoff);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (allphdrs == NULL) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: Failed to get %d program hdrs\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, eh->e_phnum);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Find the PT_LOAD section
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj for (i = 0; i < eh->e_phnum; i++) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*LINTED [ELF program header alignment]*/
ae115bc77f6fcde83175c75b4206dc2e50747966mrj phdr = (Elf32_Phdr *)(allphdrs + eh->e_phentsize * i);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (phdr->p_type != PT_LOAD)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj continue;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (phdr->p_memsz == 0)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj continue;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj bytes = ELFSEEK(phdr->p_offset);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj for (c = 0; c < phdr->p_filesz; ++c) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (c % cnt == 0)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("\n .byte ");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj else
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf(",");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("0x%x", bytes[c]);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj for (; c < phdr->p_memsz; ++c) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (c % cnt == 0) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("\n .byte ");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj cnt = 20;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj } else {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf(", ");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("0");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("\n");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj return;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: Failed finding PT_LOAD section\n", pname);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj}
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjstatic void
ae115bc77f6fcde83175c75b4206dc2e50747966mrjextract64(Elf64_Ehdr *eh)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj{
ae115bc77f6fcde83175c75b4206dc2e50747966mrj Elf64_Phdr *phdr;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj caddr_t allphdrs;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj int i;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj int c;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj unsigned char *bytes;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj uint_t cnt = 10;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj allphdrs = NULL;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (eh->e_type != ET_EXEC) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: not ET_EXEC, e_type = 0x%x\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, eh->e_type);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (eh->e_phnum == 0 || eh->e_phoff == 0) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: no program headers\n", pname);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Get the program headers.
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj allphdrs = ELFSEEK(eh->e_phoff);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (allphdrs == NULL) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: Failed to get %d program hdrs\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, eh->e_phnum);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Find the PT_LOAD section
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj for (i = 0; i < eh->e_phnum; i++) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*LINTED [ELF program header alignment]*/
ae115bc77f6fcde83175c75b4206dc2e50747966mrj phdr = (Elf64_Phdr *)(allphdrs + eh->e_phentsize * i);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (phdr->p_type != PT_LOAD)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj continue;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (phdr->p_memsz == 0)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj continue;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj bytes = ELFSEEK(phdr->p_offset);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj for (c = 0; c < phdr->p_filesz; ++c) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (c % cnt == 0)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("\n .byte ");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj else
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf(",");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("0x%x", bytes[c]);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj for (; c < phdr->p_memsz; ++c) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (c % cnt == 0) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("\n .byte ");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj cnt = 20;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj } else {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf(", ");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("0");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) printf("\n");
ae115bc77f6fcde83175c75b4206dc2e50747966mrj return;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: Failed finding PT_LOAD section\n", pname);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj}
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrjint
ae115bc77f6fcde83175c75b4206dc2e50747966mrjmain(int argc, char **argv)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj{
ae115bc77f6fcde83175c75b4206dc2e50747966mrj int fd;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj uchar_t *ident;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj void *hdr = NULL;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj struct stat stats;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ssize_t r;
843e19887f64dde75055cf8842fc4db2171eff45johnlev size_t pgsz;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj uint_t len;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * we expect one argument -- the elf file
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (argc != 2) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "usage: %s <unix-elf-file>\n", argv[0]);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname = strrchr(argv[0], '/');
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (pname == NULL)
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname = argv[0];
ae115bc77f6fcde83175c75b4206dc2e50747966mrj else
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ++pname;
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fname = argv[1];
ae115bc77f6fcde83175c75b4206dc2e50747966mrj fd = open(fname, O_RDONLY);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (fd < 0) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: open(%s, O_RDONLY) failed, %s\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, fname, strerror(errno));
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (stat(fname, &stats) < 0) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: stat(%s, ...) failed, %s\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, fname, strerror(errno));
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
843e19887f64dde75055cf8842fc4db2171eff45johnlev pgsz = getpagesize();
843e19887f64dde75055cf8842fc4db2171eff45johnlev len = (stats.st_size + (pgsz - 1)) & (~(pgsz - 1));
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj /*
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * mmap the file
ae115bc77f6fcde83175c75b4206dc2e50747966mrj */
ae115bc77f6fcde83175c75b4206dc2e50747966mrj image = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (image == MAP_FAILED) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: mmap() of %s failed, %s\n",
ae115bc77f6fcde83175c75b4206dc2e50747966mrj pname, fname, strerror(errno));
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ident = ELFSEEK(0);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (ident[EI_MAG0] != ELFMAG0 || ident[EI_MAG1] != ELFMAG1 ||
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ident[EI_MAG2] != ELFMAG2 || ident[EI_MAG3] != ELFMAG3) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: not an ELF file!\n", pname);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj
ae115bc77f6fcde83175c75b4206dc2e50747966mrj if (ident[EI_CLASS] == ELFCLASS32) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj hdr = ELFSEEK(0);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj extract32(hdr);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj } else if (ident[EI_CLASS] == ELFCLASS64) {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj hdr = ELFSEEK(0);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj extract64(hdr);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj } else {
ae115bc77f6fcde83175c75b4206dc2e50747966mrj (void) fprintf(stderr, "%s: Wrong ELF class 0x%x\n", pname,
ae115bc77f6fcde83175c75b4206dc2e50747966mrj ident[EI_CLASS]);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj exit(1);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj }
ae115bc77f6fcde83175c75b4206dc2e50747966mrj return (0);
ae115bc77f6fcde83175c75b4206dc2e50747966mrj}