// File: /workspace/github_cpp_makefile_star2_O2/exrd[P]neteruhsp/neteruhsp/neteruhsp.cc
// Function: neteruhsp::prepro_line(neteruhsp::prepro_context_t*, char const*, bool)
char* prepro_line( prepro_context_t* pctx, const char* line, bool enable_preprocessor )
{
	// 最初の空白をスキップ
	while ( line[0] == ' ' || line[0] == '\t' )
	{ ++line; }

	// 普通の行なら展開
	if ( !enable_preprocessor || line[0] != '#' )
	{
		static constexpr int MAX_REPLACE_LOOP = 256;
		int replaced_loop = 0;

		char* res = nullptr;
		char* holded = nullptr;

		// 展開があるならずっとループ
		for ( ; ; )
		{
			bool is_replaced = false;
			res = prepro_line_expand( pctx, line, &is_replaced );
			if ( !is_replaced )
			{
				break;
			}
			if ( holded != nullptr )
			{
				destroy_string( holded );
				holded = nullptr;
			}
			holded = res;
			line = res;

			++replaced_loop;
			if ( replaced_loop > MAX_REPLACE_LOOP )
			{
				raise_error( "マクロの再起展開が上限数（%d）を突破しました、マクロが無限ループしてる可能性があります@@ %d行目", replaced_loop, pctx->line_ + 1 );
				return nullptr;
			}
		}

		if ( holded != nullptr )
		{
			destroy_string( holded );
			holded = nullptr;
		}
		return res;
	}

	// 最初の#はスキップ
	++line;

	tokenize_context_t tokenize_ctx{};
	parse_context_t parse_ctx{};
	initialize_tokenize_context( &tokenize_ctx, line );
	initialize_parse_context( &parse_ctx, tokenize_ctx );

	{
		auto* const st = read_token( parse_ctx );

		if ( st->tag_ != TOKEN_IDENTIFIER )
		{
			raise_error( "プリプロセス：# の後に識別子でないトークンが検出されました@@ %d行目", pctx->line_ + 1 );
			return nullptr;
		}

		const auto pptag = query_preprocessor( st->content_ );
		if ( pptag == PREPRO_UNKNOWN )
		{
			raise_error( "プリプロセス：想定外のプリプロセッサ（%s）@@ %d行目", st->content_, pctx->line_ + 1 );
			return nullptr;
		}

		switch ( pptag )
		{
			case PREPRO_DEFINE:
			{
				if ( pctx->is_current_region_valid_ )
				{
					bool is_ctype = false;
					{
						const auto* const it = read_token( parse_ctx );
						if ( it->tag_ == TOKEN_IDENTIFIER && query_keyword( it->content_ ) == KEYWORD_CTYPE )
						{
							is_ctype = true;
						}
						else
						{
							unread_token( parse_ctx );
						}
					}

					const auto* const nit = read_token( parse_ctx );
					if ( nit->tag_ != TOKEN_IDENTIFIER )
					{
						raise_error( "プリプロセス：define に失敗：識別子名が見つかりません@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					auto* const nmacro = create_macro();
					nmacro->name_ = create_string( nit->content_ );
					nmacro->is_ctype_ = is_ctype;

					const auto* const rt = read_token( parse_ctx );
					if ( rt->tag_ == TOKEN_LPARENTHESIS )
					{
						// パラメータあり
						bool is_break = false;

						for ( ; ; )
						{
							const auto* const ct = read_token( parse_ctx );
							if ( ct->tag_ == TOKEN_EOF )
							{
								raise_error( "プリプロセス：define に失敗：パラメータのパース中に行末に到達しました@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}
							if ( ct->tag_ == TOKEN_RPARENTHESIS )
							{
								// 何もパラメータがない、おわり
								unread_token( parse_ctx );
								break;
							}
							if ( ct->tag_ != TOKEN_PP_ARG_INDICATOR )
							{
								raise_error( "プリプロセス：define に失敗：パラメータは%%から始まる必要があります@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							const auto* const it = read_token( parse_ctx );
							if ( it->tag_ != TOKEN_INTEGER || it->left_space_ )
							{
								raise_error( "プリプロセス：define に失敗：パラメータ%%のあと、スペースなしで数値を入れる必要があります@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							const auto itidx = atoi( it->content_ );
							if ( itidx != nmacro->param_num_ + 1 )
							{
								raise_error( "プリプロセス：define に失敗：パラメータ%%は順番に定義する必要があります@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							if ( nmacro->param_num_ > MACRO_PARAM_MAX )
							{
								raise_error( "プリプロセス：define に失敗：パラメータ%%の数が多すぎます@@ %d行目", pctx->line_ + 1 );
								return nullptr;
							}

							auto& nparam = nmacro->params_[nmacro->param_num_];
							++nmacro->param_num_;

							const auto* const at = read_token( parse_ctx );
							if ( at->tag_ == TOKEN_ASSIGN )
							{
								// デフォルト値あり
								int parenthesis_depth = 0;
								for ( ; ; )
								{
									const auto* const nt = read_token( parse_ctx );
									if ( parenthesis_depth == 0 && ( nt->tag_ == TOKEN_RPARENTHESIS || nt->tag_ == TOKEN_COMMA ) )
									{
										// ここまで食って終わり
										nparam.default_param_ = create_string( parse_ctx.tokenize_context_->script_ + at->cursor_end_, nt->cursor_begin_ - at->cursor_end_ );

										if ( nt->tag_ == TOKEN_RPARENTHESIS )
										{
											is_break = true;
											unread_token( parse_ctx );
										}
										break;
									}
									if ( nt->tag_ == TOKEN_LPARENTHESIS )
									{
										++parenthesis_depth;
									}
									if ( nt->tag_ == TOKEN_RPARENTHESIS )
									{
										--parenthesis_depth;
									}
									if ( nt->tag_ == TOKEN_EOF )
									{
										raise_error( "プリプロセス：define に失敗：パラメータ%%のデフォルト値を取得中、文末まで到達しました@@ %d行目", pctx->line_ + 1 );
										return nullptr;
									}
								}
							}
							else
							{
								// デフォルト値なし
								if ( at->tag_ == TOKEN_RPARENTHESIS )
								{
									unread_token( parse_ctx );
									break;
								}
								if ( at->tag_ != TOKEN_COMMA )
								{
									raise_error( "プリプロセス：define に失敗：パラメータ%%の定義の後に不明なトークンを読み込みました（%s）@@ %d行目", at->content_, pctx->line_ + 1 );
									return nullptr;
								}
							}

							if ( is_break )
							{ break; }
						}

						// 残り
						const auto* const lrt = read_token( parse_ctx );
						if ( lrt->tag_ != TOKEN_RPARENTHESIS )
						{
							raise_error( "プリプロセス：define に失敗：パラメータ%%の定義の後に不明なトークンを読み込みました（%s）@@ %d行目", lrt->content_, pctx->line_ + 1 );
							return nullptr;
						}
						nmacro->replacing_ = create_string( parse_ctx.tokenize_context_->script_ + lrt->cursor_end_ );
					}
					else
					{
						// パラメータなし
						nmacro->replacing_ = create_string( parse_ctx.tokenize_context_->script_ + rt->cursor_begin_ );
					}

					prepro_register_macro( pctx, nmacro );
				}
				break;
			}
			case PREPRO_UNDEF:
			{
				if ( pctx->is_current_region_valid_ )
				{
					auto* const it = read_token( parse_ctx );
					auto* const et = read_token( parse_ctx );
					if ( it->tag_ != TOKEN_IDENTIFIER || et->tag_ != TOKEN_EOF )
					{
						raise_error( "プリプロセス：undef に失敗：構文が間違っています@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}
					if ( !prepro_erase_macro( pctx, it->content_ ) )
					{
						raise_error( "プリプロセス：undef に失敗：（%s）が見つかりません@@ %d行目", it->content_, pctx->line_ + 1 );
						return nullptr;
					}
				}
				break;
			}
			case PREPRO_IF:
			{
				bool is_valid = false;
				if ( pctx->is_current_region_valid_ )
				{
					const auto* const rest_top = line + st->cursor_end_;
					auto* rest_pp = prepro_line( pctx, rest_top, false );
					if ( rest_pp == nullptr )
					{
						raise_error( "プリプロセス：if に失敗：式のプリプロセスに失敗@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					tokenize_context_t etoken_ctx{};
					parse_context_t eparse_ctx{};
					initialize_tokenize_context( &etoken_ctx, rest_pp );
					initialize_parse_context( &eparse_ctx, etoken_ctx );

					etoken_ctx.line_ = pctx->line_;// ラインを同期

					auto* east = parse_expression( eparse_ctx );
					if ( east == nullptr )
					{
						raise_error( "プリプロセス：if に失敗：式のパースに失敗@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					auto* ev = evaluate_ast_immediate( east );
					if ( ev == nullptr )
					{
						raise_error( "プリプロセス：if に失敗：式の評価に失敗@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}

					is_valid = value_calc_boolean( *ev );

					destroy_ast_node( east );
					destroy_value( ev );

					uninitialize_parse_context( &eparse_ctx );
					uninitialize_tokenize_context( &etoken_ctx );
					destroy_string( rest_pp );
				}
				else
				{
					// 何も食わずに判断
					is_valid = false;
				}

				if ( pctx->pp_region_idx_ >= PP_DIRECTIVE_MAX )
				{
					raise_error( "プリプロセス：ifdef に失敗：if ネストが深すぎます@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				++pctx->pp_region_idx_;
				auto& directive = pctx->pp_region_[pctx->pp_region_idx_];
				directive.is_valid_ = ( pctx->is_current_region_valid_ && is_valid );
				directive.line_ = pctx->line_;
				pctx->is_current_region_valid_ = directive.is_valid_;
				break;
			}
			case PREPRO_IFDEF:
			{
				auto* const it = read_token( parse_ctx );
				auto* const et = read_token( parse_ctx );
				if ( it->tag_ != TOKEN_IDENTIFIER || et->tag_ != TOKEN_EOF )
				{
					raise_error( "プリプロセス：ifdef に失敗：構文が間違っています@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				const bool has_macro = ( prepro_find_macro( pctx, it->content_ ) != nullptr );
				if ( pctx->pp_region_idx_ >= PP_DIRECTIVE_MAX )
				{
					raise_error( "プリプロセス：ifdef に失敗：if ネストが深すぎます@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				++pctx->pp_region_idx_;
				auto& directive = pctx->pp_region_[pctx->pp_region_idx_];
				directive.is_valid_ = ( pctx->is_current_region_valid_ && has_macro );
				directive.line_ = pctx->line_;
				pctx->is_current_region_valid_ = directive.is_valid_;
				break;
			}
			case PREPRO_ENDIF:
			{
				auto* const et = read_token( parse_ctx );
				if ( et->tag_ != TOKEN_EOF )
				{
					raise_error( "プリプロセス：endif に失敗：endif後に余計なトークンを検出@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				if ( pctx->pp_region_idx_ <= 0 )
				{
					raise_error( "プリプロセス：endif に失敗：if ネストがされいてません@@ %d行目", pctx->line_ + 1 );
					return nullptr;
				}
				--pctx->pp_region_idx_;
				pctx->is_current_region_valid_ = pctx->pp_region_[pctx->pp_region_idx_].is_valid_;
				break;
			}
			case PREPRO_ENUM:
			{
				if ( pctx->is_current_region_valid_ )
				{
					auto* const it = read_token( parse_ctx );
					if ( it->tag_ != TOKEN_IDENTIFIER )
					{
						raise_error( "プリプロセス：enum に失敗：構文が間違っています@@ %d行目", pctx->line_ + 1 );
						return nullptr;
					}
					auto* const at = read_token( parse_ctx );
					if ( at->tag_ == TOKEN_ASSIGN )
					{
						const auto* const rest_top = line + at->cursor_end_;
						auto* rest_pp = prepro_line( pctx, rest_top, false );
						if ( rest_pp == nullptr )
						{
							raise_error( "プリプロセス：enum に失敗：式のプリプロセスに失敗@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						tokenize_context_t etoken_ctx{};
						parse_context_t eparse_ctx{};
						initialize_tokenize_context( &etoken_ctx, rest_pp );
						initialize_parse_context( &eparse_ctx, etoken_ctx );

						etoken_ctx.line_ = pctx->line_;// ラインを同期

						auto* east = parse_expression( eparse_ctx );
						if ( east == nullptr )
						{
							raise_error( "プリプロセス：enum に失敗：式のパースに失敗@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						auto* ev = evaluate_ast_immediate( east );
						if ( ev == nullptr )
						{
							raise_error( "プリプロセス：enum に失敗：式の評価に失敗@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						value_isolate( *ev );
						if ( value_get_primitive_tag( *ev ) != VALUE_INT )
						{
							raise_error( "プリプロセス：enum に失敗：評価後の値がintではありません@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}

						pctx->enum_next_ = value_calc_int( *ev );

						destroy_ast_node( east );
						destroy_value( ev );

						uninitialize_parse_context( &eparse_ctx );
						uninitialize_tokenize_context( &etoken_ctx );
						destroy_string( rest_pp );
					}
					else
					{
						if ( at->tag_ != TOKEN_EOF )
						{
							raise_error( "プリプロセス：enum に失敗：enum後に余計なトークンを検出@@ %d行目", pctx->line_ + 1 );
							return nullptr;
						}
					}

					// 登録
					auto* const nm = create_macro();
					nm->name_ = create_string( it->content_ );
					nm->replacing_ = create_string_from( pctx->enum_next_ );
					prepro_register_macro( pctx, nm );
					++pctx->enum_next_;
				}
				break;
			}
			default: assert( false ); break;
		}
	}

	uninitialize_parse_context( &parse_ctx );
	uninitialize_tokenize_context( &tokenize_ctx );

	return create_string( "" );
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x78, %rsp
movq %rsi, %r14
movq %rdi, %rbx
incq %r14
movzbl -0x1(%r14), %eax
cmpl $0x20, %eax
je 0x38c9
cmpl $0x9, %eax
je 0x38c9
cmpb $0x23, %al
sete %al
testb %dl, %al
je 0x3ab4
leaq 0x20(%rsp), %r15
movq %r14, (%r15)
andq $0x0, 0x8(%r15)
movq %r14, 0x10(%r15)
callq 0x2aa2
leaq 0x8(%rsp), %rdi
movq %rax, (%rdi)
andq $0x0, 0x8(%rdi)
movq %r15, 0x10(%rdi)
callq 0x3416
cmpl $0x23, (%rax)
jne 0x3ef5
movq %rax, %r15
movq 0x8(%rax), %r12
movq %r12, %rdi
callq 0x34f2
incl %eax
cmpl $0x6, %eax
ja 0x3fa5
leaq 0x7a46(%rip), %rcx      # 0xb384
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpb $0x1, 0x14(%rbx)
jne 0x3e83
leaq 0x8(%rsp), %rdi
callq 0x3416
cmpl $0x23, (%rax)
jne 0x3971
movq 0x8(%rax), %rdi
callq 0x2bc2
movb $0x1, %bpl
cmpl $0x1, %eax
je 0x3980
leaq 0x8(%rsp), %rdi
pushq $0x1
popq %rsi
callq 0x345a
xorl %ebp, %ebp
leaq 0x8(%rsp), %rdi
callq 0x3416
cmpl $0x23, (%rax)
jne 0x3fc4
movq %rax, %r15
callq 0x3554
movq %rax, %r14
movq 0x8(%r15), %rdi
callq 0x36e9
movq %rax, (%r14)
movb %bpl, 0x8(%r14)
leaq 0x8(%rsp), %rdi
callq 0x3416
cmpl $0x6, (%rax)
jne 0x3e0d
leaq 0x8(%rsp), %r15
movq %r14, 0x40(%rsp)
movq %r15, %rdi
callq 0x3416
movl (%rax), %eax
cmpl $0x3, %eax
jne 0x3e18
movq %r15, %rdi
callq 0x3416
cmpl $0x9, (%rax)
jne 0x3ee7
cmpb $0x1, 0x1c(%rax)
je 0x3ee7
movq 0x8(%rax), %rdi
callq 0x2250
movl 0x18(%r14), %ebp
leal 0x1(%rbp), %ecx
cmpl %ecx, %eax
jne 0x3f11
cmpl $0x11, %ebp
jae 0x3f1f
movl %eax, 0x18(%r14)
movq %r15, %rdi
callq 0x3416
movq %rax, %r12
movl (%rax), %eax
cmpl $0x8, %eax
je 0x39cb
cmpl $0x1a, %eax
jne 0x3e36
xorl %r14d, %r14d
movq %r15, %rdi
callq 0x3416
movq %rax, %r13
testl %r14d, %r14d
sete %cl
movl (%rax), %eax
leal -0x7(%rax), %edx
cmpl $0x2, %edx
setb %dl
andb %cl, %dl
cmpb $0x1, %dl
je 0x3a7e
xorl %ecx, %ecx
cmpl $0x6, %eax
sete %cl
addl %ecx, %r14d
xorl %ecx, %ecx
cmpl $0x7, %eax
sete %cl
subl %ecx, %r14d
testl %eax, %eax
jne 0x3a3c
jmp 0x3ed4
movq 0x18(%rsp), %rax
movslq 0x14(%r12), %rcx
movq (%rax), %rdi
addq %rcx, %rdi
movslq 0x10(%r13), %rsi
subq %rcx, %rsi
callq 0x4598
movq 0x40(%rsp), %r14
movq %rax, 0x20(%r14,%rbp,8)
cmpl $0x7, (%r13)
jne 0x39cb
jmp 0x3e3f
decq %r14
movl $0x100, %ebp            # imm = 0x100
xorl %r12d, %r12d
leaq 0x20(%rsp), %r15
movb $0x0, 0x20(%rsp)
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x4077
movq %rax, %r14
cmpb $0x1, 0x20(%rsp)
jne 0x3af7
movq %r12, %rdi
callq 0x21a0
subl $0x1, %ebp
jb 0x3ebc
movq %r14, %r12
jmp 0x3ac4
movq %r12, %rdi
callq 0x21a0
jmp 0x3eaa
cmpb $0x1, 0x14(%rbx)
jne 0x3e83
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq 0x3416
movq %rax, %r14
movq %r15, %rdi
callq 0x3416
cmpl $0x23, (%r14)
jne 0x3f6d
cmpl $0x0, (%rax)
jne 0x3f6d
movq 0x8(%r14), %rsi
movq %rbx, %rdi
callq 0x45ca
testb %al, %al
jne 0x3e83
movq 0x8(%r14), %rsi
movl 0x10(%rbx), %edx
incl %edx
leaq 0x87b8(%rip), %rdi      # 0xc315
jmp 0x3f9e
leaq 0x8(%rsp), %rdi
callq 0x3416
cmpl $0x0, (%rax)
jne 0x3f5c
movl 0x18(%rbx), %eax
testl %eax, %eax
jle 0x3f7e
decl %eax
movl %eax, 0x18(%rbx)
movb 0x1c(%rbx,%rax,8), %al
jmp 0x3bed
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq 0x3416
movq %rax, %r14
movq %r15, %rdi
callq 0x3416
cmpl $0x23, (%r14)
jne 0x3f2d
cmpl $0x0, (%rax)
jne 0x3f2d
movl 0x18(%rbx), %r15d
cmpq $0xf, %r15
ja 0x3f3b
movq 0x8(%r14), %rsi
movq %rbx, %rdi
callq 0x4769
testq %rax, %rax
setne %al
leaq 0x1(%r15), %rcx
movl %ecx, 0x18(%rbx)
andb 0x14(%rbx), %al
movb %al, 0x24(%rbx,%r15,8)
movl 0x10(%rbx), %ecx
movl %ecx, 0x28(%rbx,%r15,8)
movb %al, 0x14(%rbx)
jmp 0x3e83
cmpb $0x1, 0x14(%rbx)
jne 0x3de1
movslq 0x14(%r15), %rax
addq %rax, %r14
movq %rbx, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x38b5
testq %rax, %rax
je 0x3fd5
movq %rax, %r14
leaq 0x60(%rsp), %r15
movq %rax, (%r15)
andl $0x0, 0x8(%r15)
movq %rax, 0x10(%r15)
callq 0x2aa2
leaq 0x48(%rsp), %rdi
movq %rax, (%rdi)
andq $0x0, 0x8(%rdi)
movq %r15, 0x10(%rdi)
movl 0x10(%rbx), %eax
movl %eax, 0xc(%r15)
callq 0x5071
testq %rax, %rax
je 0x3ff7
movq %rax, %r15
movq %rax, %rdi
callq 0x4621
testq %rax, %rax
je 0x4008
movq %rax, %r12
movq %rax, %rdi
callq 0x468a
movl %eax, %ebp
movq %r15, %rdi
callq 0x46eb
movq %r12, %rdi
callq 0x4738
leaq 0x48(%rsp), %rdi
callq 0x33d0
movq %r14, %rdi
callq 0x21a0
jmp 0x3de3
cmpb $0x1, 0x14(%rbx)
jne 0x3e83
leaq 0x8(%rsp), %rdi
callq 0x3416
cmpl $0x23, (%rax)
jne 0x3fe6
movq %rax, %r15
leaq 0x8(%rsp), %rdi
callq 0x3416
movl (%rax), %ecx
testl %ecx, %ecx
je 0x3da8
cmpl $0x1a, %ecx
jne 0x4019
movslq 0x14(%rax), %rax
addq %rax, %r14
movq %rbx, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x38b5
testq %rax, %rax
je 0x402a
movq %rax, %r14
leaq 0x60(%rsp), %r12
movq %rax, (%r12)
andl $0x0, 0x8(%r12)
movq %rax, 0x10(%r12)
callq 0x2aa2
leaq 0x48(%rsp), %rdi
movq %rax, (%rdi)
andq $0x0, 0x8(%rdi)
movq %r12, 0x10(%rdi)
movl 0x10(%rbx), %eax
movl %eax, 0xc(%r12)
callq 0x5071
testq %rax, %rax
je 0x403b
movq %rax, %r12
movq %rax, %rdi
callq 0x4621
testq %rax, %rax
je 0x404c
movq %rax, %r13
movq %rax, %rdi
callq 0x47ad
movl (%r13), %eax
cmpl $0x4, %eax
jne 0x3d6f
movq 0x8(%r13), %rax
movl 0x8(%rax), %eax
cmpl $0x1, %eax
jne 0x405d
movq %r13, %rdi
callq 0x4834
movl %eax, 0x9c(%rbx)
movq %r12, %rdi
callq 0x46eb
movq %r13, %rdi
callq 0x4738
leaq 0x48(%rsp), %rdi
callq 0x33d0
movq %r14, %rdi
callq 0x21a0
callq 0x3554
movq %rax, %r14
movq 0x8(%r15), %rdi
callq 0x36e9
movq %rax, (%r14)
movl 0x9c(%rbx), %edi
callq 0x488f
movq %rax, 0x10(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x36fe
incl 0x9c(%rbx)
jmp 0x3e83
xorl %ebp, %ebp
movl 0x18(%rbx), %eax
cmpq $0x10, %rax
jae 0x3f3b
leaq 0x1(%rax), %rcx
movl %ecx, 0x18(%rbx)
andb 0x14(%rbx), %bpl
movb %bpl, 0x24(%rbx,%rax,8)
movl 0x10(%rbx), %ecx
movl %ecx, 0x28(%rbx,%rax,8)
movb %bpl, 0x14(%rbx)
jmp 0x3e83
movq 0x18(%rsp), %rcx
addq $0x10, %rax
jmp 0x3e69
cmpl $0x7, %eax
je 0x3e3f
testl %eax, %eax
jne 0x3f03
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8148(%rip), %rdi      # 0xbf79
jmp 0x3ee0
cmpl $0x7, %eax
jne 0x3f49
leaq 0x8(%rsp), %r15
pushq $0x1
popq %rsi
movq %r15, %rdi
callq 0x345a
movq %r15, %rdi
callq 0x3416
cmpl $0x7, (%rax)
jne 0x406e
movq 0x18(%rsp), %rcx
addq $0x14, %rax
movslq (%rax), %rdi
addq (%rcx), %rdi
callq 0x36e9
movq %rax, 0x10(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x36fe
leaq 0x8(%rsp), %rdi
callq 0x33d0
xorps %xmm0, %xmm0
movaps %xmm0, 0x20(%rsp)
andq $0x0, 0x30(%rsp)
leaq 0x726e(%rip), %rdi      # 0xb110
callq 0x36e9
movq %rax, %r14
movq %r14, %rax
addq $0x78, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl 0x10(%rbx), %edx
incl %edx
leaq 0x7f21(%rip), %rdi      # 0xbde9
movl $0x101, %esi            # imm = 0x101
xorl %eax, %eax
callq 0x326e
movl 0x10(%rbx), %esi
incl %esi
leaq 0x82d1(%rip), %rdi      # 0xc1b1
xorl %eax, %eax
callq 0x326e
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8162(%rip), %rdi      # 0xc055
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x7f74(%rip), %rdi      # 0xbe75
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x80da(%rip), %rdi      # 0xbfe9
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x81c5(%rip), %rdi      # 0xc0e2
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8229(%rip), %rdi      # 0xc154
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x855e(%rip), %rdi      # 0xc497
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x84ff(%rip), %rdi      # 0xc446
jmp 0x3ee0
movq 0x8(%r12), %rsi
movl 0x10(%rbx), %edx
incl %edx
leaq 0x82de(%rip), %rdi      # 0xc238
jmp 0x3f9e
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8580(%rip), %rdi      # 0xc4e8
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x834b(%rip), %rdi      # 0xc2c4
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x85ba(%rip), %rdi      # 0xc544
jmp 0x3ee0
movl 0x10(%rbx), %edx
incl %edx
leaq 0x7f3c(%rip), %rdi      # 0xbed7
movq %r12, %rsi
xorl %eax, %eax
callq 0x326e
leaq 0x87d9(%rip), %rdi      # 0xc785
leaq 0x78e6(%rip), %rsi      # 0xb899
leaq 0x87d1(%rip), %rcx      # 0xc78b
movl $0xa4c, %edx            # imm = 0xA4C
callq 0x20e0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x7f51(%rip), %rdi      # 0xbf21
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8387(%rip), %rdi      # 0xc368
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x85a9(%rip), %rdi      # 0xc59b
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x83b6(%rip), %rdi      # 0xc3b9
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x83ed(%rip), %rdi      # 0xc401
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8706(%rip), %rdi      # 0xc72b
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x85b5(%rip), %rdi      # 0xc5eb
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x85f7(%rip), %rdi      # 0xc63e
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8630(%rip), %rdi      # 0xc688
jmp 0x3ee0
movl 0x10(%rbx), %esi
incl %esi
leaq 0x8666(%rip), %rdi      # 0xc6cf
jmp 0x3ee0
movq 0x8(%rax), %rsi
jmp 0x3f4e