
/* DWARF original prototype: __node_base *
   _M_find_before_node(_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>
   * this, size_type __n, key_type.conflict * __k, __hash_code __code) */

__node_base * __thiscall
std::
_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>
::_M_find_before_node
          (_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>
           *this,size_type __n,key_type_conflict *__k,__hash_code __code)

{
  _Hash_node_base *p_Var1;
  _Hash_node_base *p_Var2;
  __node_base *p_Var3;
  __node_base *p_Var4;
  
  p_Var4 = this->_M_buckets[__n];
  if (p_Var4 != (__node_base *)0x0) {
    p_Var2 = p_Var4->_M_nxt[2]._M_nxt;
    p_Var1 = p_Var4->_M_nxt;
    while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||
           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {
      p_Var1 = p_Var3->_M_nxt;
      if ((p_Var1 == (_Hash_node_base *)0x0) ||
         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))
      {
        return (__node_base *)0x0;
      }
    }
  }
  return p_Var4;
}



long * FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)

{
  long *plVar1;
  ulong uVar2;
  long *plVar3;
  long *plVar4;
  
  plVar4 = *(long **)(*param_1 + param_2 * 8);
  if (plVar4 != (long *)0x0) {
    uVar2 = ((long *)*plVar4)[2];
    plVar1 = (long *)*plVar4;
    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {
      plVar1 = (long *)*plVar3;
      if ((plVar1 == (long *)0x0) ||
         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {
        return (long *)0x0;
      }
    }
  }
  return plVar4;
}


MOV RAX,qword ptr [RDI]
MOV R11,RDX
MOV R10,qword ptr [RAX + RSI*0x8]
TEST R10,R10
JZ 0x00290fde
MOV R9,qword ptr [R10]
MOV R8,qword ptr [R9 + 0x10]
JMP 0x00290fd0
MOV RAX,qword ptr [R9]
TEST RAX,RAX
JZ 0x00290fe8
MOV R8,qword ptr [RAX + 0x10]
MOV R10,R9
XOR EDX,EDX
MOV R9,RAX
MOV RAX,R8
DIV qword ptr [RDI + 0x8]
CMP RSI,RDX
JNZ 0x00290fe8
CMP R8,RCX
JNZ 0x00290fb0
MOV RAX,qword ptr [R11]
CMP qword ptr [R9 + 0x8],RAX
JNZ 0x00290fb0
MOV RAX,R10
RET
XOR R10D,R10D
MOV RAX,R10
RET
(translation_unit "long * FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)\n\n{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}\n\n" (function_definition "long * FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)\n\n{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}" (sized_type_specifier "long" long) (pointer_declarator "* FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)" * (function_declarator "FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)" identifier (parameter_list "(long *param_1,ulong param_2,long *param_3,ulong param_4)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "ulong param_2" type_identifier identifier) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "ulong param_4" type_identifier identifier) )))) (compound_statement "{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}" { (declaration "long *plVar1;" (sized_type_specifier "long" long) (pointer_declarator "*plVar1" * identifier) ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "long *plVar3;" (sized_type_specifier "long" long) (pointer_declarator "*plVar3" * identifier) ;) (declaration "long *plVar4;" (sized_type_specifier "long" long) (pointer_declarator "*plVar4" * identifier) ;) (expression_statement "plVar4 = *(long **)(*param_1 + param_2 * 8);" (assignment_expression "plVar4 = *(long **)(*param_1 + param_2 * 8)" identifier = (pointer_expression "*(long **)(*param_1 + param_2 * 8)" * (cast_expression "(long **)(*param_1 + param_2 * 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*param_1 + param_2 * 8)" ( (binary_expression "*param_1 + param_2 * 8" (pointer_expression "*param_1" * identifier) + (binary_expression "param_2 * 8" identifier * number_literal)) ))))) ;) (if_statement "if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }" if (parenthesized_expression "(plVar4 != (long *)0x0)" ( (binary_expression "plVar4 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }" { (expression_statement "uVar2 = ((long *)*plVar4)[2];" (assignment_expression "uVar2 = ((long *)*plVar4)[2]" identifier = (subscript_expression "((long *)*plVar4)[2]" (parenthesized_expression "((long *)*plVar4)" ( (cast_expression "(long *)*plVar4" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar4" * identifier)) )) [ number_literal ])) ;) (expression_statement "plVar1 = (long *)*plVar4;" (assignment_expression "plVar1 = (long *)*plVar4" identifier = (cast_expression "(long *)*plVar4" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar4" * identifier))) ;) (while_statement "while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }" while (parenthesized_expression "((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3)))" ( (parenthesized_expression "(plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))" ( (comma_expression "plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3)" (assignment_expression "plVar3 = plVar1" identifier = identifier) , (binary_expression "uVar2 != param_4 || (plVar3[1] != *param_3)" (binary_expression "uVar2 != param_4" identifier != identifier) || (parenthesized_expression "(plVar3[1] != *param_3)" ( (binary_expression "plVar3[1] != *param_3" (subscript_expression "plVar3[1]" identifier [ number_literal ]) != (pointer_expression "*param_3" * identifier)) )))) )) )) (compound_statement "{\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }" { (expression_statement "plVar1 = (long *)*plVar3;" (assignment_expression "plVar1 = (long *)*plVar3" identifier = (cast_expression "(long *)*plVar3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar3" * identifier))) ;) (if_statement "if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }" if (parenthesized_expression "((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]))" ( (binary_expression "(plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])" (parenthesized_expression "(plVar1 == (long *)0x0)" ( (binary_expression "plVar1 == (long *)0x0" identifier == (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) || (parenthesized_expression "(uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])" ( (comma_expression "uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]" (assignment_expression "uVar2 = plVar1[2]" identifier = (subscript_expression "plVar1[2]" identifier [ number_literal ])) , (comma_expression "plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]" (assignment_expression "plVar4 = plVar3" identifier = identifier) , (binary_expression "param_2 != uVar2 % (ulong)param_1[1]" identifier != (binary_expression "uVar2 % (ulong)param_1[1]" identifier % (cast_expression "(ulong)param_1[1]" ( (type_descriptor "ulong" type_identifier) ) (subscript_expression "param_1[1]" identifier [ number_literal ])))))) ))) )) (compound_statement "{\n        return (long *)0x0;\n      }" { (return_statement "return (long *)0x0;" return (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal) ;) })) })) })) (return_statement "return plVar4;" return identifier ;) })))
(translation_unit "/* DWARF original prototype: __node_base *\n   _M_find_before_node(_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>\n   * this, size_type __n, key_type.conflict * __k, __hash_code __code) */\n\n__node_base * __thiscall\nstd::\n_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>\n::_M_find_before_node\n          (_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>\n           *this,size_type __n,key_type_conflict *__k,__hash_code __code)\n\n{\n  _Hash_node_base *p_Var1;\n  _Hash_node_base *p_Var2;\n  __node_base *p_Var3;\n  __node_base *p_Var4;\n  \n  p_Var4 = this->_M_buckets[__n];\n  if (p_Var4 != (__node_base *)0x0) {\n    p_Var2 = p_Var4->_M_nxt[2]._M_nxt;\n    p_Var1 = p_Var4->_M_nxt;\n    while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }\n  }\n  return p_Var4;\n}\n\n" comment (ERROR "__node_base * __thiscall\nstd::\n_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true," (binary_expression "__node_base * __thiscall\nstd::\n_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold" (binary_expression "__node_base * __thiscall\nstd::\n_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int" (binary_expression "__node_base * __thiscall\nstd::\n_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std" (binary_expression "__node_base * __thiscall\nstd::\n_Hashtable<long_int,_long_int,_std::allocator<long_int" (binary_expression "__node_base * __thiscall\nstd::\n_Hashtable<long_int" (binary_expression "__node_base * __thiscall" identifier * identifier) (ERROR "std::\n_Hashtable" identifier : : identifier) < identifier) (ERROR ",_long_int,_std::allocator" , identifier , identifier : : identifier) < identifier) > (ERROR "," ,) identifier) (ERROR "::__detail::_Identity,_std::equal_to" : : identifier : : identifier , identifier : : identifier) < identifier) > (ERROR "," ,) identifier) : : identifier : : identifier , identifier : : identifier : : identifier , identifier : : identifier : : identifier , identifier : : identifier : : identifier , identifier : : identifier : : (binary_expression "_Hashtable_traits<true" identifier < true) ,) (function_definition "_true,_true>_>\n::_M_find_before_node\n          (_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>\n           *this,size_type __n,key_type_conflict *__k,__hash_code __code)\n\n{\n  _Hash_node_base *p_Var1;\n  _Hash_node_base *p_Var2;\n  __node_base *p_Var3;\n  __node_base *p_Var4;\n  \n  p_Var4 = this->_M_buckets[__n];\n  if (p_Var4 != (__node_base *)0x0) {\n    p_Var2 = p_Var4->_M_nxt[2]._M_nxt;\n    p_Var1 = p_Var4->_M_nxt;\n    while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }\n  }\n  return p_Var4;\n}" type_identifier (ERROR ",_true>_>\n::" , identifier > identifier > : :) (function_declarator "_M_find_before_node\n          (_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>\n           *this,size_type __n,key_type_conflict *__k,__hash_code __code)" identifier (parameter_list "(_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>\n           *this,size_type __n,key_type_conflict *__k,__hash_code __code)" ( (parameter_declaration "_Hashtable<long_int" type_identifier (ERROR "<" <) identifier) , (parameter_declaration "_long_int" type_identifier) , (parameter_declaration "_std::allocator<long_int" type_identifier (ERROR "::allocator<" : : identifier <) identifier) (ERROR ">" >) , (parameter_declaration "_std::__detail::_Identity" type_identifier (ERROR "::__detail::" : : identifier : :) identifier) , (parameter_declaration "_std::equal_to<long_int" type_identifier (ERROR "::equal_to<" : : identifier <) identifier) (ERROR ">" >) , (parameter_declaration "_gold::Archive::Seen_hash" type_identifier (ERROR "::Archive::" : : identifier : :) identifier) , (parameter_declaration "_std::__detail::_Mod_range_hashing" type_identifier (ERROR "::__detail::" : : identifier : :) identifier) , (parameter_declaration "_std::__detail::_Default_ranged_hash" type_identifier (ERROR "::__detail::" : : identifier : :) identifier) , (parameter_declaration "_std::__detail::_Prime_rehash_policy" type_identifier (ERROR "::__detail::" : : identifier : :) identifier) , (parameter_declaration "_std::__detail::_Hashtable_traits" type_identifier (ERROR "::__detail::" : : identifier : :) identifier) (ERROR "<true" < true) , (parameter_declaration "_true" type_identifier) , (parameter_declaration "_true>_>\n           *this" type_identifier (ERROR ">_>" > identifier >) (pointer_declarator "*this" * identifier)) , (parameter_declaration "size_type __n" type_identifier identifier) , (parameter_declaration "key_type_conflict *__k" type_identifier (pointer_declarator "*__k" * identifier)) , (parameter_declaration "__hash_code __code" type_identifier identifier) ))) (compound_statement "{\n  _Hash_node_base *p_Var1;\n  _Hash_node_base *p_Var2;\n  __node_base *p_Var3;\n  __node_base *p_Var4;\n  \n  p_Var4 = this->_M_buckets[__n];\n  if (p_Var4 != (__node_base *)0x0) {\n    p_Var2 = p_Var4->_M_nxt[2]._M_nxt;\n    p_Var1 = p_Var4->_M_nxt;\n    while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }\n  }\n  return p_Var4;\n}" { (declaration "_Hash_node_base *p_Var1;" type_identifier (pointer_declarator "*p_Var1" * identifier) ;) (declaration "_Hash_node_base *p_Var2;" type_identifier (pointer_declarator "*p_Var2" * identifier) ;) (declaration "__node_base *p_Var3;" type_identifier (pointer_declarator "*p_Var3" * identifier) ;) (declaration "__node_base *p_Var4;" type_identifier (pointer_declarator "*p_Var4" * identifier) ;) (expression_statement "p_Var4 = this->_M_buckets[__n];" (assignment_expression "p_Var4 = this->_M_buckets[__n]" identifier = (subscript_expression "this->_M_buckets[__n]" (field_expression "this->_M_buckets" identifier -> field_identifier) [ identifier ])) ;) (if_statement "if (p_Var4 != (__node_base *)0x0) {\n    p_Var2 = p_Var4->_M_nxt[2]._M_nxt;\n    p_Var1 = p_Var4->_M_nxt;\n    while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }\n  }" if (parenthesized_expression "(p_Var4 != (__node_base *)0x0)" ( (binary_expression "p_Var4 != (__node_base *)0x0" identifier != (cast_expression "(__node_base *)0x0" ( (type_descriptor "__node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    p_Var2 = p_Var4->_M_nxt[2]._M_nxt;\n    p_Var1 = p_Var4->_M_nxt;\n    while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }\n  }" { (expression_statement "p_Var2 = p_Var4->_M_nxt[2]._M_nxt;" (assignment_expression "p_Var2 = p_Var4->_M_nxt[2]._M_nxt" identifier = (field_expression "p_Var4->_M_nxt[2]._M_nxt" (subscript_expression "p_Var4->_M_nxt[2]" (field_expression "p_Var4->_M_nxt" identifier -> field_identifier) [ number_literal ]) . field_identifier)) ;) (expression_statement "p_Var1 = p_Var4->_M_nxt;" (assignment_expression "p_Var1 = p_Var4->_M_nxt" identifier = (field_expression "p_Var4->_M_nxt" identifier -> field_identifier)) ;) (while_statement "while ((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))) {\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }" while (parenthesized_expression "((p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k)))" ( (parenthesized_expression "(p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k))" ( (comma_expression "p_Var3 = p_Var1, p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k)" (assignment_expression "p_Var3 = p_Var1" identifier = identifier) , (binary_expression "p_Var2 != (_Hash_node_base *)__code ||\n           (p_Var3[1]._M_nxt != (_Hash_node_base *)*__k)" (binary_expression "p_Var2 != (_Hash_node_base *)__code" identifier != (cast_expression "(_Hash_node_base *)__code" ( (type_descriptor "_Hash_node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) || (parenthesized_expression "(p_Var3[1]._M_nxt != (_Hash_node_base *)*__k)" ( (binary_expression "p_Var3[1]._M_nxt != (_Hash_node_base *)*__k" (field_expression "p_Var3[1]._M_nxt" (subscript_expression "p_Var3[1]" identifier [ number_literal ]) . field_identifier) != (cast_expression "(_Hash_node_base *)*__k" ( (type_descriptor "_Hash_node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) (pointer_expression "*__k" * identifier))) )))) )) )) (compound_statement "{\n      p_Var1 = p_Var3->_M_nxt;\n      if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }\n    }" { (expression_statement "p_Var1 = p_Var3->_M_nxt;" (assignment_expression "p_Var1 = p_Var3->_M_nxt" identifier = (field_expression "p_Var3->_M_nxt" identifier -> field_identifier)) ;) (if_statement "if ((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))\n      {\n        return (__node_base *)0x0;\n      }" if (parenthesized_expression "((p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count))" ( (binary_expression "(p_Var1 == (_Hash_node_base *)0x0) ||\n         (p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count)" (parenthesized_expression "(p_Var1 == (_Hash_node_base *)0x0)" ( (binary_expression "p_Var1 == (_Hash_node_base *)0x0" identifier == (cast_expression "(_Hash_node_base *)0x0" ( (type_descriptor "_Hash_node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal)) )) || (parenthesized_expression "(p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count)" ( (comma_expression "p_Var2 = p_Var1[2]._M_nxt, p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count" (assignment_expression "p_Var2 = p_Var1[2]._M_nxt" identifier = (field_expression "p_Var1[2]._M_nxt" (subscript_expression "p_Var1[2]" identifier [ number_literal ]) . field_identifier)) , (comma_expression "p_Var4 = p_Var3, __n != (ulong)p_Var2 % this->_M_bucket_count" (assignment_expression "p_Var4 = p_Var3" identifier = identifier) , (binary_expression "__n != (ulong)p_Var2 % this->_M_bucket_count" identifier != (binary_expression "(ulong)p_Var2 % this->_M_bucket_count" (cast_expression "(ulong)p_Var2" ( (type_descriptor "ulong" type_identifier) ) identifier) % (field_expression "this->_M_bucket_count" identifier -> field_identifier))))) ))) )) (compound_statement "{\n        return (__node_base *)0x0;\n      }" { (return_statement "return (__node_base *)0x0;" return (cast_expression "(__node_base *)0x0" ( (type_descriptor "__node_base *" type_identifier (abstract_pointer_declarator "*" *)) ) number_literal) ;) })) })) })) (return_statement "return p_Var4;" return identifier ;) })))
(translation_unit "long * FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)\n\n{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}\n\n" (function_definition "long * FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)\n\n{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}" (sized_type_specifier "long" long) (pointer_declarator "* FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)" * (function_declarator "FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)" identifier (parameter_list "(long *param_1,ulong param_2,long *param_3,ulong param_4)" ( (parameter_declaration "long *param_1" (sized_type_specifier "long" long) (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "ulong param_2" type_identifier identifier) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "ulong param_4" type_identifier identifier) )))) (compound_statement "{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}" { (declaration "long *plVar1;" (sized_type_specifier "long" long) (pointer_declarator "*plVar1" * identifier) ;) (declaration "ulong uVar2;" type_identifier identifier ;) (declaration "long *plVar3;" (sized_type_specifier "long" long) (pointer_declarator "*plVar3" * identifier) ;) (declaration "long *plVar4;" (sized_type_specifier "long" long) (pointer_declarator "*plVar4" * identifier) ;) (expression_statement "plVar4 = *(long **)(*param_1 + param_2 * 8);" (assignment_expression "plVar4 = *(long **)(*param_1 + param_2 * 8)" identifier = (pointer_expression "*(long **)(*param_1 + param_2 * 8)" * (cast_expression "(long **)(*param_1 + param_2 * 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(*param_1 + param_2 * 8)" ( (binary_expression "*param_1 + param_2 * 8" (pointer_expression "*param_1" * identifier) + (binary_expression "param_2 * 8" identifier * number_literal)) ))))) ;) (if_statement "if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }" if (parenthesized_expression "(plVar4 != (long *)0x0)" ( (binary_expression "plVar4 != (long *)0x0" identifier != (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) (compound_statement "{\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }" { (expression_statement "uVar2 = ((long *)*plVar4)[2];" (assignment_expression "uVar2 = ((long *)*plVar4)[2]" identifier = (subscript_expression "((long *)*plVar4)[2]" (parenthesized_expression "((long *)*plVar4)" ( (cast_expression "(long *)*plVar4" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar4" * identifier)) )) [ number_literal ])) ;) (expression_statement "plVar1 = (long *)*plVar4;" (assignment_expression "plVar1 = (long *)*plVar4" identifier = (cast_expression "(long *)*plVar4" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar4" * identifier))) ;) (while_statement "while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }" while (parenthesized_expression "((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3)))" ( (parenthesized_expression "(plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))" ( (comma_expression "plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3)" (assignment_expression "plVar3 = plVar1" identifier = identifier) , (binary_expression "uVar2 != param_4 || (plVar3[1] != *param_3)" (binary_expression "uVar2 != param_4" identifier != identifier) || (parenthesized_expression "(plVar3[1] != *param_3)" ( (binary_expression "plVar3[1] != *param_3" (subscript_expression "plVar3[1]" identifier [ number_literal ]) != (pointer_expression "*param_3" * identifier)) )))) )) )) (compound_statement "{\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }" { (expression_statement "plVar1 = (long *)*plVar3;" (assignment_expression "plVar1 = (long *)*plVar3" identifier = (cast_expression "(long *)*plVar3" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (pointer_expression "*plVar3" * identifier))) ;) (if_statement "if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }" if (parenthesized_expression "((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]))" ( (binary_expression "(plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])" (parenthesized_expression "(plVar1 == (long *)0x0)" ( (binary_expression "plVar1 == (long *)0x0" identifier == (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal)) )) || (parenthesized_expression "(uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])" ( (comma_expression "uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]" (assignment_expression "uVar2 = plVar1[2]" identifier = (subscript_expression "plVar1[2]" identifier [ number_literal ])) , (comma_expression "plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]" (assignment_expression "plVar4 = plVar3" identifier = identifier) , (binary_expression "param_2 != uVar2 % (ulong)param_1[1]" identifier != (binary_expression "uVar2 % (ulong)param_1[1]" identifier % (cast_expression "(ulong)param_1[1]" ( (type_descriptor "ulong" type_identifier) ) (subscript_expression "param_1[1]" identifier [ number_literal ])))))) ))) )) (compound_statement "{\n        return (long *)0x0;\n      }" { (return_statement "return (long *)0x0;" return (cast_expression "(long *)0x0" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) number_literal) ;) })) })) })) (return_statement "return plVar4;" return identifier ;) })))
(translation_unit (function_definition (sized_type_specifier long) (pointer_declarator * (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) )))) (compound_statement { (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (declaration (sized_type_specifier long) (pointer_declarator * IDENT) ;) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + (binary_expression IDENT * LIT)) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) (compound_statement { (expression_statement (assignment_expression IDENT = (subscript_expression (parenthesized_expression ( (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT)) )) [ LIT ])) ;) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (while_statement while (parenthesized_expression ( (parenthesized_expression ( (comma_expression (assignment_expression IDENT = IDENT) , (binary_expression (binary_expression IDENT != IDENT) || (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ LIT ]) != (pointer_expression * IDENT)) )))) )) )) (compound_statement { (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (pointer_expression * IDENT))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT == (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT)) )) || (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (subscript_expression IDENT [ LIT ])) , (comma_expression (assignment_expression IDENT = IDENT) , (binary_expression IDENT != (binary_expression IDENT % (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ LIT ])))))) ))) )) (compound_statement { (return_statement return (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) LIT) ;) })) })) })) (return_statement return IDENT ;) })))
(function_definition "long * FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)\n\n{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}" (sized_type_specifier "long" (long "long")) (pointer_declarator "* FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)" (* "*") (function_declarator "FUN_00290f90(long *param_1,ulong param_2,long *param_3,ulong param_4)" (identifier "FUN_00290f90") (parameter_list "(long *param_1,ulong param_2,long *param_3,ulong param_4)" (( "(") (parameter_declaration "long *param_1" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "ulong param_2" (type_identifier "ulong") (identifier "param_2")) (, ",") (parameter_declaration "long *param_3" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_3" (* "*") (identifier "param_3"))) (, ",") (parameter_declaration "ulong param_4" (type_identifier "ulong") (identifier "param_4")) () ")")))) (compound_statement "{\n  long *plVar1;\n  ulong uVar2;\n  long *plVar3;\n  long *plVar4;\n  \n  plVar4 = *(long **)(*param_1 + param_2 * 8);\n  if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }\n  return plVar4;\n}" ({ "{") (declaration "long *plVar1;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*plVar1" (* "*") (identifier "plVar1")) (; ";")) (declaration "ulong uVar2;" (type_identifier "ulong") (identifier "uVar2") (; ";")) (declaration "long *plVar3;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*plVar3" (* "*") (identifier "plVar3")) (; ";")) (declaration "long *plVar4;" (sized_type_specifier "long" (long "long")) (pointer_declarator "*plVar4" (* "*") (identifier "plVar4")) (; ";")) (expression_statement "plVar4 = *(long **)(*param_1 + param_2 * 8);" (assignment_expression "plVar4 = *(long **)(*param_1 + param_2 * 8)" (identifier "plVar4") (= "=") (pointer_expression "*(long **)(*param_1 + param_2 * 8)" (* "*") (cast_expression "(long **)(*param_1 + param_2 * 8)" (( "(") (type_descriptor "long **" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(*param_1 + param_2 * 8)" (( "(") (binary_expression "*param_1 + param_2 * 8" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (+ "+") (binary_expression "param_2 * 8" (identifier "param_2") (* "*") (number_literal "8"))) () ")"))))) (; ";")) (if_statement "if (plVar4 != (long *)0x0) {\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }" (if "if") (parenthesized_expression "(plVar4 != (long *)0x0)" (( "(") (binary_expression "plVar4 != (long *)0x0" (identifier "plVar4") (!= "!=") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (compound_statement "{\n    uVar2 = ((long *)*plVar4)[2];\n    plVar1 = (long *)*plVar4;\n    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }\n  }" ({ "{") (expression_statement "uVar2 = ((long *)*plVar4)[2];" (assignment_expression "uVar2 = ((long *)*plVar4)[2]" (identifier "uVar2") (= "=") (subscript_expression "((long *)*plVar4)[2]" (parenthesized_expression "((long *)*plVar4)" (( "(") (cast_expression "(long *)*plVar4" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*plVar4" (* "*") (identifier "plVar4"))) () ")")) ([ "[") (number_literal "2") (] "]"))) (; ";")) (expression_statement "plVar1 = (long *)*plVar4;" (assignment_expression "plVar1 = (long *)*plVar4" (identifier "plVar1") (= "=") (cast_expression "(long *)*plVar4" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*plVar4" (* "*") (identifier "plVar4")))) (; ";")) (while_statement "while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }" (while "while") (parenthesized_expression "((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3)))" (( "(") (parenthesized_expression "(plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))" (( "(") (comma_expression "plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3)" (assignment_expression "plVar3 = plVar1" (identifier "plVar3") (= "=") (identifier "plVar1")) (, ",") (binary_expression "uVar2 != param_4 || (plVar3[1] != *param_3)" (binary_expression "uVar2 != param_4" (identifier "uVar2") (!= "!=") (identifier "param_4")) (|| "||") (parenthesized_expression "(plVar3[1] != *param_3)" (( "(") (binary_expression "plVar3[1] != *param_3" (subscript_expression "plVar3[1]" (identifier "plVar3") ([ "[") (number_literal "1") (] "]")) (!= "!=") (pointer_expression "*param_3" (* "*") (identifier "param_3"))) () ")")))) () ")")) () ")")) (compound_statement "{\n      plVar1 = (long *)*plVar3;\n      if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }\n    }" ({ "{") (expression_statement "plVar1 = (long *)*plVar3;" (assignment_expression "plVar1 = (long *)*plVar3" (identifier "plVar1") (= "=") (cast_expression "(long *)*plVar3" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (pointer_expression "*plVar3" (* "*") (identifier "plVar3")))) (; ";")) (if_statement "if ((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {\n        return (long *)0x0;\n      }" (if "if") (parenthesized_expression "((plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]))" (( "(") (binary_expression "(plVar1 == (long *)0x0) ||\n         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])" (parenthesized_expression "(plVar1 == (long *)0x0)" (( "(") (binary_expression "plVar1 == (long *)0x0" (identifier "plVar1") (== "==") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (|| "||") (parenthesized_expression "(uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])" (( "(") (comma_expression "uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]" (assignment_expression "uVar2 = plVar1[2]" (identifier "uVar2") (= "=") (subscript_expression "plVar1[2]" (identifier "plVar1") ([ "[") (number_literal "2") (] "]"))) (, ",") (comma_expression "plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1]" (assignment_expression "plVar4 = plVar3" (identifier "plVar4") (= "=") (identifier "plVar3")) (, ",") (binary_expression "param_2 != uVar2 % (ulong)param_1[1]" (identifier "param_2") (!= "!=") (binary_expression "uVar2 % (ulong)param_1[1]" (identifier "uVar2") (% "%") (cast_expression "(ulong)param_1[1]" (( "(") (type_descriptor "ulong" (type_identifier "ulong")) () ")") (subscript_expression "param_1[1]" (identifier "param_1") ([ "[") (number_literal "1") (] "]"))))))) () ")"))) () ")")) (compound_statement "{\n        return (long *)0x0;\n      }" ({ "{") (return_statement "return (long *)0x0;" (return "return") (cast_expression "(long *)0x0" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0")) (; ";")) (} "}"))) (} "}"))) (} "}"))) (return_statement "return plVar4;" (return "return") (identifier "plVar4") (; ";")) (} "}")))

/* DWARF original prototype: __node_base *
   _M_find_before_node(_Hashtable<long_int,_long_int,_std::allocator<long_int>,_std::__detail::_Identity,_std::equal_to<long_int>,_gold::Archive::Seen_hash,_std::__detail::_Mod_range_hashing,_std::__detail::_Default_ranged_hash,_std::__detail::_Prime_rehash_policy,_std::__detail::_Hashtable_traits<true,_true,_true>_>
   * this, size_type __n, key_type.conflict * __k, __hash_code __code) */

type_10 * __thiscall
std::
type_2<long_int,type_3,type_4::allocator<long_int>,type_4::__detail::_Identity,type_4::equal_to<long_int>,type_5::Archive::Seen_hash,type_4::__detail::_Mod_range_hashing,type_4::__detail::_Default_ranged_hash,type_4::__detail::_Prime_rehash_policy,type_4::__detail::_Hashtable_traits<true,type_1,type_1>_>
::function_1
          (type_2<long_int,type_3,type_4::allocator<long_int>,type_4::__detail::_Identity,type_4::equal_to<long_int>,type_5::Archive::Seen_hash,type_4::__detail::_Mod_range_hashing,type_4::__detail::_Default_ranged_hash,type_4::__detail::_Prime_rehash_policy,type_4::__detail::_Hashtable_traits<true,type_1,type_1>_>
           *this,type_6 var_4,type_7 *__k,type_8 __code)

{
  type_9 *var_3;
  type_9 *var_2;
  type_10 *p_Var3;
  type_10 *var_1;
  
  var_1 = this->_M_buckets[var_4];
  if (var_1 != (type_10 *)0x0) {
    var_2 = var_1->_M_nxt[2]._M_nxt;
    var_3 = var_1->_M_nxt;
    while ((p_Var3 = var_3, var_2 != (type_9 *)__code ||
           (p_Var3[1]._M_nxt != (type_9 *)*__k))) {
      var_3 = p_Var3->_M_nxt;
      if ((var_3 == (type_9 *)0x0) ||
         (var_2 = var_3[2]._M_nxt, var_1 = p_Var3, var_4 != (type_11)var_2 % this->_M_bucket_count))
      {
        return (type_10 *)0x0;
      }
    }
  }
  return var_1;
}


(translation_unit (function_definition type: (sized_type_specifier) declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (identifier)) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (identifier))))) body: (compound_statement (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (number_literal)))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (parenthesized_expression (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier)))) index: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (while_statement condition: (parenthesized_expression (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (identifier)) right: (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (pointer_expression argument: (identifier)))))))) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (pointer_expression argument: (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (number_literal)))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (number_literal))) right: (comma_expression left: (assignment_expression left: (identifier) right: (identifier)) right: (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier)) value: (subscript_expression argument: (identifier) index: (number_literal)))))))))) consequence: (compound_statement (return_statement (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (number_literal))))))))) (return_statement (identifier)))))

long * MASKED(long *param_1,ulong param_2,long *param_3,ulong param_4)

{
  long *plVar1;
  ulong uVar2;
  long *plVar3;
  long *plVar4;
  
  plVar4 = *(long **)(*param_1 + param_2 * 8);
  if (plVar4 != (long *)0x0) {
    uVar2 = ((long *)*plVar4)[2];
    plVar1 = (long *)*plVar4;
    while ((plVar3 = plVar1, uVar2 != param_4 || (plVar3[1] != *param_3))) {
      plVar1 = (long *)*plVar3;
      if ((plVar1 == (long *)0x0) ||
         (uVar2 = plVar1[2], plVar4 = plVar3, param_2 != uVar2 % (ulong)param_1[1])) {
        return (long *)0x0;
      }
    }
  }
  return plVar4;
}

