mono_security_core_clr_set_options (MonoSecurityCoreCLROptions options)
{
  security_core_clr_options = options;
}


mono_security_core_clr_get_options ()
{
  MonoSecurityCoreCLROptions D.17896;

  D.17896 = security_core_clr_options;
  return D.17896;
}


mono_security_core_clr_determine_platform_image (struct MonoImage * image)
{
  gboolean D.17898;
  mono_bool (*<Tbe8>) (const char *) platform_callback.0;
  char * D.17900;

  platform_callback.0 = platform_callback;
  D.17900 = image->name;
  D.17898 = platform_callback.0 (D.17900);
  return D.17898;
}


default_platform_check (const char * image_name)
{
  struct MonoImage * D.17902;
  gboolean D.17905;
  int D.17485;
  char * D.17906;
  _Bool D.17907;
  long unsigned int D.17908;
  long unsigned int D.17909;
  int iftmp.1;
  int D.17497;
  int iftmp.2;
  int D.17493;
  sizetype D.17917;
  sizetype D.17918;
  sizetype D.17919;
  const char[13] * D.17920;
  unsigned char D.17921;
  int D.17922;
  unsigned char D.17923;
  int D.17924;
  _Bool D.17925;
  _Bool D.17926;
  _Bool D.17927;
  const unsigned char * D.17930;
  unsigned char D.17931;
  int D.17932;
  const unsigned char * D.17933;
  unsigned char D.17934;
  int D.17935;
  _Bool D.17936;
  _Bool D.17937;
  const unsigned char * D.17940;
  unsigned char D.17941;
  int D.17942;
  const unsigned char * D.17943;
  unsigned char D.17944;
  int D.17945;
  _Bool D.17946;
  _Bool D.17947;
  const unsigned char * D.17950;
  unsigned char D.17951;
  int D.17952;
  const unsigned char * D.17953;
  unsigned char D.17954;
  int D.17955;
  const char * D.17957;

  D.17902 = mono_defaults.corlib;
  if (D.17902 != 0B) goto <D.17903>; else goto <D.17904>;
  <D.17903>:
  {
    size_t __s1_len;
    size_t __s2_len;

    D.17902 = mono_defaults.corlib;
    D.17906 = D.17902->name;
    D.17485 = __builtin_strcmp (D.17906, image_name);
  }
  D.17907 = D.17485 == 0;
  D.17905 = (gboolean) D.17907;
  return D.17905;
  <D.17904>:
  {
    const char * corlib;
    int ilen;
    int clen;

    corlib = "mscorlib.dll";
    D.17908 = strlen (image_name);
    ilen = (int) D.17908;
    D.17909 = strlen (corlib);
    clen = (int) D.17909;
    if (ilen >= clen) goto <D.17913>; else goto <D.17911>;
    <D.17913>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s1_len = 12;
      if (__s1_len <= 3) goto <D.17915>; else goto <D.17916>;
      <D.17915>:
      {
        const unsigned char * __s2;
        int __result;

        D.17917 = (sizetype) ilen;
        D.17918 = (sizetype) clen;
        D.17919 = D.17917 - D.17918;
        __s2 = image_name + D.17919;
        D.17920 = "mscorlib.dll";
        D.17921 = MEM[(const unsigned char *)D.17920];
        D.17922 = (int) D.17921;
        D.17923 = *__s2;
        D.17924 = (int) D.17923;
        __result = D.17922 - D.17924;
        {
          D.17925 = __s1_len != 0;
          D.17926 = __result == 0;
          D.17927 = D.17925 & D.17926;
          if (D.17927 != 0) goto <D.17928>; else goto <D.17929>;
          <D.17928>:
          D.17930 = &MEM[(void *)"mscorlib.dll" + 1B];
          D.17931 = *D.17930;
          D.17932 = (int) D.17931;
          D.17933 = __s2 + 1;
          D.17934 = *D.17933;
          D.17935 = (int) D.17934;
          __result = D.17932 - D.17935;
          D.17936 = __s1_len > 1;
          D.17926 = __result == 0;
          D.17937 = D.17936 & D.17926;
          if (D.17937 != 0) goto <D.17938>; else goto <D.17939>;
          <D.17938>:
          D.17940 = &MEM[(void *)"mscorlib.dll" + 2B];
          D.17941 = *D.17940;
          D.17942 = (int) D.17941;
          D.17943 = __s2 + 2;
          D.17944 = *D.17943;
          D.17945 = (int) D.17944;
          __result = D.17942 - D.17945;
          D.17946 = __s1_len > 2;
          D.17926 = __result == 0;
          D.17947 = D.17946 & D.17926;
          if (D.17947 != 0) goto <D.17948>; else goto <D.17949>;
          <D.17948>:
          D.17950 = &MEM[(void *)"mscorlib.dll" + 3B];
          D.17951 = *D.17950;
          D.17952 = (int) D.17951;
          D.17953 = __s2 + 3;
          D.17954 = *D.17953;
          D.17955 = (int) D.17954;
          __result = D.17952 - D.17955;
          <D.17949>:
          <D.17939>:
          <D.17929>:
        }
        D.17493 = __result;
      }
      iftmp.2 = D.17493;
      goto <D.17956>;
      <D.17916>:
      D.17917 = (sizetype) ilen;
      D.17918 = (sizetype) clen;
      D.17919 = D.17917 - D.17918;
      D.17957 = image_name + D.17919;
      iftmp.2 = __builtin_strcmp ("mscorlib.dll", D.17957);
      <D.17956>:
      D.17497 = iftmp.2;
    }
    if (D.17497 == 0) goto <D.17958>; else goto <D.17911>;
    <D.17958>:
    iftmp.1 = 1;
    goto <D.17912>;
    <D.17911>:
    iftmp.1 = 0;
    <D.17912>:
    D.17905 = iftmp.1;
    return D.17905;
  }
}


mono_security_set_core_clr_platform_callback (mono_bool (*MonoCoreClrPlatformCB) (const char *) callback)
{
  platform_callback = callback;
}


mono_security_core_clr_is_platform_image (struct MonoImage * image)
{
  gboolean D.17960;
  <unnamed-unsigned:1> D.17961;

  D.17961 = image->core_clr_platform_code;
  D.17960 = (gboolean) D.17961;
  return D.17960;
}


mono_security_core_clr_check_inheritance (struct MonoClass * class)
{
  short unsigned int D.17970;
  int D.17971;
  int D.17972;
  struct MonoMethod * D.17975;
  MonoSecurityCoreCLRLevel class_level;
  MonoSecurityCoreCLRLevel parent_level;
  struct MonoClass * parent;

  parent = class->parent;
  if (parent == 0B) goto <D.17963>; else goto <D.17964>;
  <D.17963>:
  return;
  <D.17964>:
  class_level = mono_security_core_clr_class_level (class);
  parent_level = mono_security_core_clr_class_level (parent);
  if (class_level < parent_level) goto <D.17965>; else goto <D.17966>;
  <D.17965>:
  set_type_load_exception_type ("Inheritance failure for type %s. Parent class %s is more restricted.", class);
  goto <D.17967>;
  <D.17966>:
  {
    struct MonoMethod * parent_ctor;

    parent_ctor = get_default_ctor (parent);
    if (parent_ctor != 0B) goto <D.17968>; else goto <D.17969>;
    <D.17968>:
    D.17970 = parent_ctor->flags;
    D.17971 = (int) D.17970;
    D.17972 = D.17971 & 6;
    if (D.17972 != 0) goto <D.17973>; else goto <D.17974>;
    <D.17973>:
    D.17975 = get_default_ctor (class);
    class_level = mono_security_core_clr_method_level (D.17975, 0);
    parent_level = mono_security_core_clr_method_level (parent_ctor, 0);
    if (class_level < parent_level) goto <D.17976>; else goto <D.17977>;
    <D.17976>:
    set_type_load_exception_type ("Inheritance failure for type %s. Default constructor security mismatch with %s.", class);
    <D.17977>:
    <D.17974>:
    <D.17969>:
  }
  <D.17967>:
}


get_default_ctor (struct MonoClass * klass)
{
  struct MonoMethod * * D.17979;
  struct MonoMethod * D.17982;
  long unsigned int D.17983;
  long unsigned int D.17984;
  struct MonoMethod * * D.17985;
  short unsigned int D.17988;
  int D.17989;
  int D.17990;
  const char * D.17995;
  char D.17996;
  int D.17549;
  int iftmp.3;
  int D.17545;
  const char[6] * D.18001;
  unsigned char D.18002;
  int D.18003;
  unsigned char D.18004;
  int D.18005;
  _Bool D.18006;
  _Bool D.18007;
  _Bool D.18008;
  const unsigned char * D.18011;
  unsigned char D.18012;
  int D.18013;
  const unsigned char * D.18014;
  unsigned char D.18015;
  int D.18016;
  _Bool D.18017;
  _Bool D.18018;
  const unsigned char * D.18021;
  unsigned char D.18022;
  int D.18023;
  const unsigned char * D.18024;
  unsigned char D.18025;
  int D.18026;
  _Bool D.18027;
  _Bool D.18028;
  const unsigned char * D.18031;
  unsigned char D.18032;
  int D.18033;
  const unsigned char * D.18034;
  unsigned char D.18035;
  int D.18036;
  short unsigned int D.18040;
  unsigned int i.4;
  unsigned int D.18044;
  int i;

  mono_class_setup_methods (klass);
  D.17979 = klass->methods;
  if (D.17979 == 0B) goto <D.17980>; else goto <D.17981>;
  <D.17980>:
  D.17982 = 0B;
  return D.17982;
  <D.17981>:
  i = 0;
  goto <D.17551>;
  <D.17550>:
  {
    struct MonoMethodSignature * sig;
    struct MonoMethod * method;

    D.17979 = klass->methods;
    D.17983 = (long unsigned int) i;
    D.17984 = D.17983 * 8;
    D.17985 = D.17979 + D.17984;
    method = *D.17985;
    if (method == 0B) goto <D.17986>; else goto <D.17987>;
    <D.17986>:
    // predicted unlikely by continue predictor.
    goto <D.17540>;
    <D.17987>:
    D.17988 = method->flags;
    D.17989 = (int) D.17988;
    D.17990 = D.17989 & 2048;
    if (D.17990 == 0) goto <D.17991>; else goto <D.17992>;
    <D.17991>:
    // predicted unlikely by continue predictor.
    goto <D.17540>;
    <D.17992>:
    D.17995 = method->name;
    D.17996 = *D.17995;
    if (D.17996 != 46) goto <D.17993>; else goto <D.17997>;
    <D.17997>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s1_len = 5;
      if (__s1_len <= 3) goto <D.17999>; else goto <D.18000>;
      <D.17999>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = method->name;
        D.18001 = ".ctor";
        D.18002 = MEM[(const unsigned char *)D.18001];
        D.18003 = (int) D.18002;
        D.18004 = *__s2;
        D.18005 = (int) D.18004;
        __result = D.18003 - D.18005;
        {
          D.18006 = __s1_len != 0;
          D.18007 = __result == 0;
          D.18008 = D.18006 & D.18007;
          if (D.18008 != 0) goto <D.18009>; else goto <D.18010>;
          <D.18009>:
          D.18011 = &MEM[(void *)".ctor" + 1B];
          D.18012 = *D.18011;
          D.18013 = (int) D.18012;
          D.18014 = __s2 + 1;
          D.18015 = *D.18014;
          D.18016 = (int) D.18015;
          __result = D.18013 - D.18016;
          D.18017 = __s1_len > 1;
          D.18007 = __result == 0;
          D.18018 = D.18017 & D.18007;
          if (D.18018 != 0) goto <D.18019>; else goto <D.18020>;
          <D.18019>:
          D.18021 = &MEM[(void *)".ctor" + 2B];
          D.18022 = *D.18021;
          D.18023 = (int) D.18022;
          D.18024 = __s2 + 2;
          D.18025 = *D.18024;
          D.18026 = (int) D.18025;
          __result = D.18023 - D.18026;
          D.18027 = __s1_len > 2;
          D.18007 = __result == 0;
          D.18028 = D.18027 & D.18007;
          if (D.18028 != 0) goto <D.18029>; else goto <D.18030>;
          <D.18029>:
          D.18031 = &MEM[(void *)".ctor" + 3B];
          D.18032 = *D.18031;
          D.18033 = (int) D.18032;
          D.18034 = __s2 + 3;
          D.18035 = *D.18034;
          D.18036 = (int) D.18035;
          __result = D.18033 - D.18036;
          <D.18030>:
          <D.18020>:
          <D.18010>:
        }
        D.17545 = __result;
      }
      iftmp.3 = D.17545;
      goto <D.18037>;
      <D.18000>:
      D.17995 = method->name;
      iftmp.3 = __builtin_strcmp (".ctor", D.17995);
      <D.18037>:
      D.17549 = iftmp.3;
    }
    if (D.17549 != 0) goto <D.17993>; else goto <D.17994>;
    <D.17993>:
    // predicted unlikely by continue predictor.
    goto <D.17540>;
    <D.17994>:
    sig = mono_method_signature (method);
    if (sig != 0B) goto <D.18038>; else goto <D.18039>;
    <D.18038>:
    D.18040 = sig->param_count;
    if (D.18040 == 0) goto <D.18041>; else goto <D.18042>;
    <D.18041>:
    D.17982 = method;
    return D.17982;
    <D.18042>:
    <D.18039>:
  }
  <D.17540>:
  i = i + 1;
  <D.17551>:
  i.4 = (unsigned int) i;
  D.18044 = klass->method.count;
  if (i.4 < D.18044) goto <D.17550>; else goto <D.17552>;
  <D.17552>:
  D.17982 = 0B;
  return D.17982;
}


set_type_load_exception_type (const char * format, struct MonoClass * class)
{
  struct MonoClass * D.18046;
  char * type_name;
  char * parent_name;
  char * message;

  type_name = mono_type_get_full_name (class);
  D.18046 = class->parent;
  parent_name = mono_type_get_full_name (D.18046);
  message = monoeg_g_strdup_printf (format, type_name, parent_name);
  monoeg_g_free (parent_name);
  monoeg_g_free (type_name);
  mono_trace (16, 64, message);
  mono_class_set_failure (class, 7, message);
}


mono_security_core_clr_check_override (struct MonoClass * class, struct MonoMethod * override, struct MonoMethod * base)
{
  MonoSecurityCoreCLRLevel base_level;
  MonoSecurityCoreCLRLevel override_level;

  base_level = mono_security_core_clr_method_level (base, 0);
  override_level = mono_security_core_clr_method_level (override, 0);
  if (base_level == 2) goto <D.18047>; else goto <D.18048>;
  <D.18047>:
  if (override_level != 2) goto <D.18049>; else goto <D.18050>;
  <D.18049>:
  set_type_load_exception_methods ("Override failure for %s over %s. Override MUST be [SecurityCritical].", override, base);
  <D.18050>:
  goto <D.18051>;
  <D.18048>:
  if (override_level == 2) goto <D.18052>; else goto <D.18053>;
  <D.18052>:
  set_type_load_exception_methods ("Override failure for %s over %s. Override must NOT be [SecurityCritical].", override, base);
  <D.18053>:
  <D.18051>:
}


set_type_load_exception_methods (const char * format, struct MonoMethod * override, struct MonoMethod * base)
{
  struct MonoClass * D.18054;
  char * method_name;
  char * base_name;
  char * message;

  method_name = get_method_full_name (override);
  base_name = get_method_full_name (base);
  message = monoeg_g_strdup_printf (format, method_name, base_name);
  monoeg_g_free (base_name);
  monoeg_g_free (method_name);
  mono_trace (16, 64, message);
  D.18054 = override->klass;
  mono_class_set_failure (D.18054, 7, message);
}


get_method_full_name (struct MonoMethod * method)
{
  char * D.18055;
  char * iftmp.5;

  if (method != 0B) goto <D.18057>; else goto <D.18058>;
  <D.18057>:
  iftmp.5 = mono_method_full_name (method, 1);
  goto <D.18059>;
  <D.18058>:
  iftmp.5 = monoeg_strdup ("\'no caller found\'");
  <D.18059>:
  D.18055 = iftmp.5;
  return D.18055;
}


monoeg_strdup (const gchar * str)
{
  gchar * D.18063;

  if (str != 0B) goto <D.18061>; else goto <D.18062>;
  <D.18061>:
  D.18063 = __strdup (str);
  return D.18063;
  <D.18062>:
  D.18063 = 0B;
  return D.18063;
}


mono_security_core_clr_require_elevated_permissions ()
{
  struct MonoMethod * D.18067;
  int D.18069;
  gboolean D.18070;
  <unnamed type> D.18071;
  _Bool D.18072;
  struct ElevatedTrustCookie cookie;

  try
    {
      cookie.depth = 0;
      cookie.caller = 0B;
      mono_stack_walk_no_il (get_caller_of_elevated_trust_code, &cookie);
      D.18067 = cookie.caller;
      if (D.18067 == 0B) goto <D.18065>; else goto <D.18068>;
      <D.18068>:
      D.18069 = cookie.depth;
      if (D.18069 <= 2) goto <D.18065>; else goto <D.18066>;
      <D.18065>:
      D.18070 = 1;
      return D.18070;
      <D.18066>:
      D.18067 = cookie.caller;
      D.18071 = mono_security_core_clr_method_level (D.18067, 1);
      D.18072 = D.18071 == 0;
      D.18070 = (gboolean) D.18072;
      return D.18070;
    }
  finally
    {
      cookie = {CLOBBER};
    }
}


get_caller_of_elevated_trust_code (struct MonoMethod * m, gint32 no, gint32 ilo, gboolean managed, void * data)
{
  unsigned char D.18078;
  unsigned char D.18079;
  gboolean D.18080;
  struct MonoClass * D.18081;
  struct MonoImage * D.18082;
  int D.18083;
  int D.18086;
  int D.17692;
  int iftmp.6;
  int D.17691;
  const char[16] * D.18090;
  unsigned char D.18091;
  int D.18092;
  unsigned char D.18093;
  int D.18094;
  _Bool D.18095;
  _Bool D.18096;
  _Bool D.18097;
  const unsigned char * D.18100;
  unsigned char D.18101;
  int D.18102;
  const unsigned char * D.18103;
  unsigned char D.18104;
  int D.18105;
  _Bool D.18106;
  _Bool D.18107;
  const unsigned char * D.18110;
  unsigned char D.18111;
  int D.18112;
  const unsigned char * D.18113;
  unsigned char D.18114;
  int D.18115;
  _Bool D.18116;
  _Bool D.18117;
  const unsigned char * D.18120;
  unsigned char D.18121;
  int D.18122;
  const unsigned char * D.18123;
  unsigned char D.18124;
  int D.18125;
  const char * D.18127;
  int D.17701;
  int iftmp.7;
  int D.17700;
  const char[16] * D.18133;
  unsigned char D.18134;
  int D.18135;
  unsigned char D.18136;
  int D.18137;
  _Bool D.18138;
  _Bool D.18139;
  _Bool D.18140;
  const unsigned char * D.18143;
  unsigned char D.18144;
  int D.18145;
  const unsigned char * D.18146;
  unsigned char D.18147;
  int D.18148;
  _Bool D.18149;
  _Bool D.18150;
  const unsigned char * D.18153;
  unsigned char D.18154;
  int D.18155;
  const unsigned char * D.18156;
  unsigned char D.18157;
  int D.18158;
  _Bool D.18159;
  _Bool D.18160;
  const unsigned char * D.18163;
  unsigned char D.18164;
  int D.18165;
  const unsigned char * D.18166;
  unsigned char D.18167;
  int D.18168;
  const char * D.18170;
  int D.17710;
  int iftmp.8;
  int D.17709;
  const char[26] * D.18176;
  unsigned char D.18177;
  int D.18178;
  unsigned char D.18179;
  int D.18180;
  _Bool D.18181;
  _Bool D.18182;
  _Bool D.18183;
  const unsigned char * D.18186;
  unsigned char D.18187;
  int D.18188;
  const unsigned char * D.18189;
  unsigned char D.18190;
  int D.18191;
  _Bool D.18192;
  _Bool D.18193;
  const unsigned char * D.18196;
  unsigned char D.18197;
  int D.18198;
  const unsigned char * D.18199;
  unsigned char D.18200;
  int D.18201;
  _Bool D.18202;
  _Bool D.18203;
  const unsigned char * D.18206;
  unsigned char D.18207;
  int D.18208;
  const unsigned char * D.18209;
  unsigned char D.18210;
  int D.18211;
  const char * D.18213;
  int D.17719;
  int iftmp.9;
  int D.17718;
  const char[25] * D.18219;
  unsigned char D.18220;
  int D.18221;
  unsigned char D.18222;
  int D.18223;
  _Bool D.18224;
  _Bool D.18225;
  _Bool D.18226;
  const unsigned char * D.18229;
  unsigned char D.18230;
  int D.18231;
  const unsigned char * D.18232;
  unsigned char D.18233;
  int D.18234;
  _Bool D.18235;
  _Bool D.18236;
  const unsigned char * D.18239;
  unsigned char D.18240;
  int D.18241;
  const unsigned char * D.18242;
  unsigned char D.18243;
  int D.18244;
  _Bool D.18245;
  _Bool D.18246;
  const unsigned char * D.18249;
  unsigned char D.18250;
  int D.18251;
  const unsigned char * D.18252;
  unsigned char D.18253;
  int D.18254;
  int D.18258;
  <unnamed type> D.18259;
  struct ElevatedTrustCookie * cookie;

  cookie = data;
  if (managed == 0) goto <D.18075>; else goto <D.18077>;
  <D.18077>:
  D.18078 = BIT_FIELD_REF <*m, 8, 256>;
  D.18079 = D.18078 & 124;
  if (D.18079 != 0) goto <D.18075>; else goto <D.18076>;
  <D.18075>:
  D.18080 = 0;
  return D.18080;
  <D.18076>:
  D.18081 = m->klass;
  D.18082 = D.18081->image;
  D.18083 = mono_security_core_clr_is_platform_image (D.18082);
  if (D.18083 == 0) goto <D.18084>; else goto <D.18085>;
  <D.18084>:
  cookie->caller = m;
  D.18080 = 1;
  return D.18080;
  <D.18085>:
  D.18086 = cookie->depth;
  switch (D.18086) <default: <D.17722>, case 0: <D.17683>, case 1: <D.17721>>
  <D.17683>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 15;
    if (__s2_len <= 3) goto <D.18088>; else goto <D.18089>;
    <D.18088>:
    {
      const unsigned char * __s2;
      int __result;

      D.18081 = m->klass;
      __s2 = D.18081->name_space;
      D.18090 = "System.Security";
      D.18091 = MEM[(const unsigned char *)D.18090];
      D.18092 = (int) D.18091;
      D.18093 = *__s2;
      D.18094 = (int) D.18093;
      __result = D.18092 - D.18094;
      {
        D.18095 = __s2_len != 0;
        D.18096 = __result == 0;
        D.18097 = D.18095 & D.18096;
        if (D.18097 != 0) goto <D.18098>; else goto <D.18099>;
        <D.18098>:
        D.18100 = &MEM[(void *)"System.Security" + 1B];
        D.18101 = *D.18100;
        D.18102 = (int) D.18101;
        D.18103 = __s2 + 1;
        D.18104 = *D.18103;
        D.18105 = (int) D.18104;
        __result = D.18102 - D.18105;
        D.18106 = __s2_len > 1;
        D.18096 = __result == 0;
        D.18107 = D.18106 & D.18096;
        if (D.18107 != 0) goto <D.18108>; else goto <D.18109>;
        <D.18108>:
        D.18110 = &MEM[(void *)"System.Security" + 2B];
        D.18111 = *D.18110;
        D.18112 = (int) D.18111;
        D.18113 = __s2 + 2;
        D.18114 = *D.18113;
        D.18115 = (int) D.18114;
        __result = D.18112 - D.18115;
        D.18116 = __s2_len > 2;
        D.18096 = __result == 0;
        D.18117 = D.18116 & D.18096;
        if (D.18117 != 0) goto <D.18118>; else goto <D.18119>;
        <D.18118>:
        D.18120 = &MEM[(void *)"System.Security" + 3B];
        D.18121 = *D.18120;
        D.18122 = (int) D.18121;
        D.18123 = __s2 + 3;
        D.18124 = *D.18123;
        D.18125 = (int) D.18124;
        __result = D.18122 - D.18125;
        <D.18119>:
        <D.18109>:
        <D.18099>:
      }
      D.17691 = __result;
    }
    iftmp.6 = -D.17691;
    goto <D.18126>;
    <D.18089>:
    D.18081 = m->klass;
    D.18127 = D.18081->name_space;
    iftmp.6 = __builtin_strcmp (D.18127, "System.Security");
    <D.18126>:
    D.17692 = iftmp.6;
  }
  if (D.17692 != 0) goto <D.18128>; else goto <D.18129>;
  <D.18128>:
  D.18080 = 0;
  return D.18080;
  <D.18129>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 15;
    if (__s2_len <= 3) goto <D.18131>; else goto <D.18132>;
    <D.18131>:
    {
      const unsigned char * __s2;
      int __result;

      D.18081 = m->klass;
      __s2 = D.18081->name;
      D.18133 = "SecurityManager";
      D.18134 = MEM[(const unsigned char *)D.18133];
      D.18135 = (int) D.18134;
      D.18136 = *__s2;
      D.18137 = (int) D.18136;
      __result = D.18135 - D.18137;
      {
        D.18138 = __s2_len != 0;
        D.18139 = __result == 0;
        D.18140 = D.18138 & D.18139;
        if (D.18140 != 0) goto <D.18141>; else goto <D.18142>;
        <D.18141>:
        D.18143 = &MEM[(void *)"SecurityManager" + 1B];
        D.18144 = *D.18143;
        D.18145 = (int) D.18144;
        D.18146 = __s2 + 1;
        D.18147 = *D.18146;
        D.18148 = (int) D.18147;
        __result = D.18145 - D.18148;
        D.18149 = __s2_len > 1;
        D.18139 = __result == 0;
        D.18150 = D.18149 & D.18139;
        if (D.18150 != 0) goto <D.18151>; else goto <D.18152>;
        <D.18151>:
        D.18153 = &MEM[(void *)"SecurityManager" + 2B];
        D.18154 = *D.18153;
        D.18155 = (int) D.18154;
        D.18156 = __s2 + 2;
        D.18157 = *D.18156;
        D.18158 = (int) D.18157;
        __result = D.18155 - D.18158;
        D.18159 = __s2_len > 2;
        D.18139 = __result == 0;
        D.18160 = D.18159 & D.18139;
        if (D.18160 != 0) goto <D.18161>; else goto <D.18162>;
        <D.18161>:
        D.18163 = &MEM[(void *)"SecurityManager" + 3B];
        D.18164 = *D.18163;
        D.18165 = (int) D.18164;
        D.18166 = __s2 + 3;
        D.18167 = *D.18166;
        D.18168 = (int) D.18167;
        __result = D.18165 - D.18168;
        <D.18162>:
        <D.18152>:
        <D.18142>:
      }
      D.17700 = __result;
    }
    iftmp.7 = -D.17700;
    goto <D.18169>;
    <D.18132>:
    D.18081 = m->klass;
    D.18170 = D.18081->name;
    iftmp.7 = __builtin_strcmp (D.18170, "SecurityManager");
    <D.18169>:
    D.17701 = iftmp.7;
  }
  if (D.17701 != 0) goto <D.18171>; else goto <D.18172>;
  <D.18171>:
  D.18080 = 0;
  return D.18080;
  <D.18172>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 25;
    if (__s2_len <= 3) goto <D.18174>; else goto <D.18175>;
    <D.18174>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = m->name;
      D.18176 = "EnsureElevatedPermissions";
      D.18177 = MEM[(const unsigned char *)D.18176];
      D.18178 = (int) D.18177;
      D.18179 = *__s2;
      D.18180 = (int) D.18179;
      __result = D.18178 - D.18180;
      {
        D.18181 = __s2_len != 0;
        D.18182 = __result == 0;
        D.18183 = D.18181 & D.18182;
        if (D.18183 != 0) goto <D.18184>; else goto <D.18185>;
        <D.18184>:
        D.18186 = &MEM[(void *)"EnsureElevatedPermissions" + 1B];
        D.18187 = *D.18186;
        D.18188 = (int) D.18187;
        D.18189 = __s2 + 1;
        D.18190 = *D.18189;
        D.18191 = (int) D.18190;
        __result = D.18188 - D.18191;
        D.18192 = __s2_len > 1;
        D.18182 = __result == 0;
        D.18193 = D.18192 & D.18182;
        if (D.18193 != 0) goto <D.18194>; else goto <D.18195>;
        <D.18194>:
        D.18196 = &MEM[(void *)"EnsureElevatedPermissions" + 2B];
        D.18197 = *D.18196;
        D.18198 = (int) D.18197;
        D.18199 = __s2 + 2;
        D.18200 = *D.18199;
        D.18201 = (int) D.18200;
        __result = D.18198 - D.18201;
        D.18202 = __s2_len > 2;
        D.18182 = __result == 0;
        D.18203 = D.18202 & D.18182;
        if (D.18203 != 0) goto <D.18204>; else goto <D.18205>;
        <D.18204>:
        D.18206 = &MEM[(void *)"EnsureElevatedPermissions" + 3B];
        D.18207 = *D.18206;
        D.18208 = (int) D.18207;
        D.18209 = __s2 + 3;
        D.18210 = *D.18209;
        D.18211 = (int) D.18210;
        __result = D.18208 - D.18211;
        <D.18205>:
        <D.18195>:
        <D.18185>:
      }
      D.17709 = __result;
    }
    iftmp.8 = -D.17709;
    goto <D.18212>;
    <D.18175>:
    D.18213 = m->name;
    iftmp.8 = __builtin_strcmp (D.18213, "EnsureElevatedPermissions");
    <D.18212>:
    D.17710 = iftmp.8;
  }
  if (D.17710 != 0) goto <D.18214>; else goto <D.18215>;
  <D.18214>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 24;
    if (__s2_len <= 3) goto <D.18217>; else goto <D.18218>;
    <D.18217>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = m->name;
      D.18219 = "CheckElevatedPermissions";
      D.18220 = MEM[(const unsigned char *)D.18219];
      D.18221 = (int) D.18220;
      D.18222 = *__s2;
      D.18223 = (int) D.18222;
      __result = D.18221 - D.18223;
      {
        D.18224 = __s2_len != 0;
        D.18225 = __result == 0;
        D.18226 = D.18224 & D.18225;
        if (D.18226 != 0) goto <D.18227>; else goto <D.18228>;
        <D.18227>:
        D.18229 = &MEM[(void *)"CheckElevatedPermissions" + 1B];
        D.18230 = *D.18229;
        D.18231 = (int) D.18230;
        D.18232 = __s2 + 1;
        D.18233 = *D.18232;
        D.18234 = (int) D.18233;
        __result = D.18231 - D.18234;
        D.18235 = __s2_len > 1;
        D.18225 = __result == 0;
        D.18236 = D.18235 & D.18225;
        if (D.18236 != 0) goto <D.18237>; else goto <D.18238>;
        <D.18237>:
        D.18239 = &MEM[(void *)"CheckElevatedPermissions" + 2B];
        D.18240 = *D.18239;
        D.18241 = (int) D.18240;
        D.18242 = __s2 + 2;
        D.18243 = *D.18242;
        D.18244 = (int) D.18243;
        __result = D.18241 - D.18244;
        D.18245 = __s2_len > 2;
        D.18225 = __result == 0;
        D.18246 = D.18245 & D.18225;
        if (D.18246 != 0) goto <D.18247>; else goto <D.18248>;
        <D.18247>:
        D.18249 = &MEM[(void *)"CheckElevatedPermissions" + 3B];
        D.18250 = *D.18249;
        D.18251 = (int) D.18250;
        D.18252 = __s2 + 3;
        D.18253 = *D.18252;
        D.18254 = (int) D.18253;
        __result = D.18251 - D.18254;
        <D.18248>:
        <D.18238>:
        <D.18228>:
      }
      D.17718 = __result;
    }
    iftmp.9 = -D.17718;
    goto <D.18255>;
    <D.18218>:
    D.18213 = m->name;
    iftmp.9 = __builtin_strcmp (D.18213, "CheckElevatedPermissions");
    <D.18255>:
    D.17719 = iftmp.9;
  }
  if (D.17719 != 0) goto <D.18256>; else goto <D.18257>;
  <D.18256>:
  D.18080 = 0;
  return D.18080;
  <D.18257>:
  <D.18215>:
  cookie->depth = 1;
  goto <D.17720>;
  <D.17721>:
  cookie->depth = 2;
  goto <D.17720>;
  <D.17722>:
  D.18086 = cookie->depth;
  D.18258 = D.18086 + 1;
  cookie->depth = D.18258;
  D.18259 = mono_security_core_clr_method_level (m, 1);
  if (D.18259 == 0) goto <D.17720>; else goto <D.18260>;
  <D.18260>:
  cookie->caller = m;
  D.18080 = 1;
  return D.18080;
  <D.17720>:
  D.18080 = 0;
  return D.18080;
}


mono_security_core_clr_ensure_reflection_access_field (struct MonoClassField * field)
{
  <unnamed type> D.18262;
  <unnamed type> D.18265;
  unsigned int D.18266;
  struct MonoClass * D.18269;
  struct MonoImage * D.18270;
  int D.18271;
  struct MonoClass * D.18274;
  <unnamed type> D.18275;
  struct MonoException * D.18278;
  int D.18279;
  struct MonoException * D.18282;
  struct MonoMethod * caller;

  caller = get_reflection_caller ();
  D.18262 = mono_security_core_clr_method_level (caller, 1);
  if (D.18262 != 0) goto <D.18263>; else goto <D.18264>;
  <D.18263>:
  return;
  <D.18264>:
  D.18265 = mono_security_core_clr_get_options ();
  D.18266 = D.18265 & 1;
  if (D.18266 != 0) goto <D.18267>; else goto <D.18268>;
  <D.18267>:
  D.18269 = mono_field_get_parent (field);
  D.18270 = D.18269->image;
  D.18271 = mono_security_core_clr_is_platform_image (D.18270);
  if (D.18271 == 0) goto <D.18272>; else goto <D.18273>;
  <D.18272>:
  return;
  <D.18273>:
  <D.18268>:
  D.18274 = mono_field_get_parent (field);
  D.18275 = mono_security_core_clr_class_level (D.18274);
  if (D.18275 == 2) goto <D.18276>; else goto <D.18277>;
  <D.18276>:
  D.18278 = get_field_access_exception ("Transparent method %s cannot get or set Critical field %s.", caller, field);
  mono_raise_exception (D.18278);
  <D.18277>:
  D.18279 = check_field_access (caller, field);
  if (D.18279 == 0) goto <D.18280>; else goto <D.18281>;
  <D.18280>:
  D.18282 = get_field_access_exception ("Transparent method %s cannot get or set private/internal field %s.", caller, field);
  mono_raise_exception (D.18282);
  <D.18281>:
}


get_reflection_caller ()
{
  struct MonoMethod * m.10;
  _Bool D.18285;
  long int D.18286;
  long int D.18287;
  struct MonoMethod * D.18290;
  struct MonoMethod * m;

  try
    {
      m = 0B;
      mono_stack_walk_no_il (get_caller_no_reflection_related, &m);
      m.10 = m;
      D.18285 = m.10 == 0B;
      D.18286 = (long int) D.18285;
      D.18287 = __builtin_expect (D.18286, 0);
      if (D.18287 != 0) goto <D.18288>; else goto <D.18289>;
      <D.18288>:
      mono_trace (16, 64, "No caller outside reflection was found");
      <D.18289>:
      D.18290 = m;
      return D.18290;
    }
  finally
    {
      m = {CLOBBER};
    }
}


get_caller_no_reflection_related (struct MonoMethod * m, gint32 no, gint32 ilo, gboolean managed, void * data)
{
  gboolean D.18295;
  unsigned char D.18296;
  unsigned char D.18297;
  struct MonoClass * D.18300;
  char D.18304;
  struct MonoImage * D.18305;
  int D.18306;
  int D.17584;
  int iftmp.11;
  int D.17583;
  const char[18] * D.18312;
  unsigned char D.18313;
  int D.18314;
  unsigned char D.18315;
  int D.18316;
  _Bool D.18317;
  _Bool D.18318;
  _Bool D.18319;
  const unsigned char * D.18322;
  unsigned char D.18323;
  int D.18324;
  const unsigned char * D.18325;
  unsigned char D.18326;
  int D.18327;
  _Bool D.18328;
  _Bool D.18329;
  const unsigned char * D.18332;
  unsigned char D.18333;
  int D.18334;
  const unsigned char * D.18335;
  unsigned char D.18336;
  int D.18337;
  _Bool D.18338;
  _Bool D.18339;
  const unsigned char * D.18342;
  unsigned char D.18343;
  int D.18344;
  const unsigned char * D.18345;
  unsigned char D.18346;
  int D.18347;
  int D.17593;
  int iftmp.12;
  int D.17592;
  const char[23] * D.18354;
  unsigned char D.18355;
  int D.18356;
  unsigned char D.18357;
  int D.18358;
  _Bool D.18359;
  _Bool D.18360;
  _Bool D.18361;
  const unsigned char * D.18364;
  unsigned char D.18365;
  int D.18366;
  const unsigned char * D.18367;
  unsigned char D.18368;
  int D.18369;
  _Bool D.18370;
  _Bool D.18371;
  const unsigned char * D.18374;
  unsigned char D.18375;
  int D.18376;
  const unsigned char * D.18377;
  unsigned char D.18378;
  int D.18379;
  _Bool D.18380;
  _Bool D.18381;
  const unsigned char * D.18384;
  unsigned char D.18385;
  int D.18386;
  const unsigned char * D.18387;
  unsigned char D.18388;
  int D.18389;
  int D.17602;
  int iftmp.13;
  int D.17601;
  const char[7] * D.18396;
  unsigned char D.18397;
  int D.18398;
  unsigned char D.18399;
  int D.18400;
  _Bool D.18401;
  _Bool D.18402;
  _Bool D.18403;
  const unsigned char * D.18406;
  unsigned char D.18407;
  int D.18408;
  const unsigned char * D.18409;
  unsigned char D.18410;
  int D.18411;
  _Bool D.18412;
  _Bool D.18413;
  const unsigned char * D.18416;
  unsigned char D.18417;
  int D.18418;
  const unsigned char * D.18419;
  unsigned char D.18420;
  int D.18421;
  _Bool D.18422;
  _Bool D.18423;
  const unsigned char * D.18426;
  unsigned char D.18427;
  int D.18428;
  const unsigned char * D.18429;
  unsigned char D.18430;
  int D.18431;
  char D.18435;
  int D.17612;
  int iftmp.14;
  int D.17611;
  const char[10] * D.18441;
  unsigned char D.18442;
  int D.18443;
  unsigned char D.18444;
  int D.18445;
  _Bool D.18446;
  _Bool D.18447;
  _Bool D.18448;
  const unsigned char * D.18451;
  unsigned char D.18452;
  int D.18453;
  const unsigned char * D.18454;
  unsigned char D.18455;
  int D.18456;
  _Bool D.18457;
  _Bool D.18458;
  const unsigned char * D.18461;
  unsigned char D.18462;
  int D.18463;
  const unsigned char * D.18464;
  unsigned char D.18465;
  int D.18466;
  _Bool D.18467;
  _Bool D.18468;
  const unsigned char * D.18471;
  unsigned char D.18472;
  int D.18473;
  const unsigned char * D.18474;
  unsigned char D.18475;
  int D.18476;
  int D.17621;
  int iftmp.15;
  int D.17620;
  const char[5] * D.18487;
  unsigned char D.18488;
  int D.18489;
  unsigned char D.18490;
  int D.18491;
  _Bool D.18492;
  _Bool D.18493;
  _Bool D.18494;
  const unsigned char * D.18497;
  unsigned char D.18498;
  int D.18499;
  const unsigned char * D.18500;
  unsigned char D.18501;
  int D.18502;
  _Bool D.18503;
  _Bool D.18504;
  const unsigned char * D.18507;
  unsigned char D.18508;
  int D.18509;
  const unsigned char * D.18510;
  unsigned char D.18511;
  int D.18512;
  _Bool D.18513;
  _Bool D.18514;
  const unsigned char * D.18517;
  unsigned char D.18518;
  int D.18519;
  const unsigned char * D.18520;
  unsigned char D.18521;
  int D.18522;
  int D.17630;
  int iftmp.16;
  int D.17629;
  const char[9] * D.18528;
  unsigned char D.18529;
  int D.18530;
  unsigned char D.18531;
  int D.18532;
  _Bool D.18533;
  _Bool D.18534;
  _Bool D.18535;
  const unsigned char * D.18538;
  unsigned char D.18539;
  int D.18540;
  const unsigned char * D.18541;
  unsigned char D.18542;
  int D.18543;
  _Bool D.18544;
  _Bool D.18545;
  const unsigned char * D.18548;
  unsigned char D.18549;
  int D.18550;
  const unsigned char * D.18551;
  unsigned char D.18552;
  int D.18553;
  _Bool D.18554;
  _Bool D.18555;
  const unsigned char * D.18558;
  unsigned char D.18559;
  int D.18560;
  const unsigned char * D.18561;
  unsigned char D.18562;
  int D.18563;
  int D.17639;
  int iftmp.17;
  int D.17638;
  const char[13] * D.18568;
  unsigned char D.18569;
  int D.18570;
  unsigned char D.18571;
  int D.18572;
  _Bool D.18573;
  _Bool D.18574;
  _Bool D.18575;
  const unsigned char * D.18578;
  unsigned char D.18579;
  int D.18580;
  const unsigned char * D.18581;
  unsigned char D.18582;
  int D.18583;
  _Bool D.18584;
  _Bool D.18585;
  const unsigned char * D.18588;
  unsigned char D.18589;
  int D.18590;
  const unsigned char * D.18591;
  unsigned char D.18592;
  int D.18593;
  _Bool D.18594;
  _Bool D.18595;
  const unsigned char * D.18598;
  unsigned char D.18599;
  int D.18600;
  const unsigned char * D.18601;
  unsigned char D.18602;
  int D.18603;
  const char * D.18605;
  int D.17648;
  int iftmp.18;
  int D.17647;
  const char[9] * D.18615;
  unsigned char D.18616;
  int D.18617;
  unsigned char D.18618;
  int D.18619;
  _Bool D.18620;
  _Bool D.18621;
  _Bool D.18622;
  const unsigned char * D.18625;
  unsigned char D.18626;
  int D.18627;
  const unsigned char * D.18628;
  unsigned char D.18629;
  int D.18630;
  _Bool D.18631;
  _Bool D.18632;
  const unsigned char * D.18635;
  unsigned char D.18636;
  int D.18637;
  const unsigned char * D.18638;
  unsigned char D.18639;
  int D.18640;
  _Bool D.18641;
  _Bool D.18642;
  const unsigned char * D.18645;
  unsigned char D.18646;
  int D.18647;
  const unsigned char * D.18648;
  unsigned char D.18649;
  int D.18650;
  int D.17657;
  int iftmp.19;
  int D.17656;
  const char[18] * D.18656;
  unsigned char D.18657;
  int D.18658;
  unsigned char D.18659;
  int D.18660;
  _Bool D.18661;
  _Bool D.18662;
  _Bool D.18663;
  const unsigned char * D.18666;
  unsigned char D.18667;
  int D.18668;
  const unsigned char * D.18669;
  unsigned char D.18670;
  int D.18671;
  _Bool D.18672;
  _Bool D.18673;
  const unsigned char * D.18676;
  unsigned char D.18677;
  int D.18678;
  const unsigned char * D.18679;
  unsigned char D.18680;
  int D.18681;
  _Bool D.18682;
  _Bool D.18683;
  const unsigned char * D.18686;
  unsigned char D.18687;
  int D.18688;
  const unsigned char * D.18689;
  unsigned char D.18690;
  int D.18691;
  int D.17666;
  int iftmp.20;
  int D.17665;
  const char[14] * D.18696;
  unsigned char D.18697;
  int D.18698;
  unsigned char D.18699;
  int D.18700;
  _Bool D.18701;
  _Bool D.18702;
  _Bool D.18703;
  const unsigned char * D.18706;
  unsigned char D.18707;
  int D.18708;
  const unsigned char * D.18709;
  unsigned char D.18710;
  int D.18711;
  _Bool D.18712;
  _Bool D.18713;
  const unsigned char * D.18716;
  unsigned char D.18717;
  int D.18718;
  const unsigned char * D.18719;
  unsigned char D.18720;
  int D.18721;
  _Bool D.18722;
  _Bool D.18723;
  const unsigned char * D.18726;
  unsigned char D.18727;
  int D.18728;
  const unsigned char * D.18729;
  unsigned char D.18730;
  int D.18731;
  struct MonoMethod * D.18735;
  struct MonoMethod * * dest;
  const char * ns;

  dest = data;
  if (managed == 0) goto <D.18293>; else goto <D.18294>;
  <D.18293>:
  D.18295 = 0;
  return D.18295;
  <D.18294>:
  D.18296 = BIT_FIELD_REF <*m, 8, 256>;
  D.18297 = D.18296 & 124;
  if (D.18297 != 0) goto <D.18298>; else goto <D.18299>;
  <D.18298>:
  D.18295 = 0;
  return D.18295;
  <D.18299>:
  D.18300 = m->klass;
  ns = D.18300->name_space;
  if (ns == 0B) goto <D.18301>; else goto <D.18303>;
  <D.18303>:
  D.18304 = *ns;
  if (D.18304 != 83) goto <D.18301>; else goto <D.18302>;
  <D.18301>:
  *dest = m;
  D.18295 = 1;
  return D.18295;
  <D.18302>:
  D.18300 = m->klass;
  D.18305 = D.18300->image;
  D.18306 = mono_security_core_clr_is_platform_image (D.18305);
  if (D.18306 == 0) goto <D.18307>; else goto <D.18308>;
  <D.18307>:
  *dest = m;
  D.18295 = 1;
  return D.18295;
  <D.18308>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 17;
    if (__s2_len <= 3) goto <D.18310>; else goto <D.18311>;
    <D.18310>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.18312 = "System.Reflection";
      D.18313 = MEM[(const unsigned char *)D.18312];
      D.18314 = (int) D.18313;
      D.18315 = *__s2;
      D.18316 = (int) D.18315;
      __result = D.18314 - D.18316;
      {
        D.18317 = __s2_len != 0;
        D.18318 = __result == 0;
        D.18319 = D.18317 & D.18318;
        if (D.18319 != 0) goto <D.18320>; else goto <D.18321>;
        <D.18320>:
        D.18322 = &MEM[(void *)"System.Reflection" + 1B];
        D.18323 = *D.18322;
        D.18324 = (int) D.18323;
        D.18325 = __s2 + 1;
        D.18326 = *D.18325;
        D.18327 = (int) D.18326;
        __result = D.18324 - D.18327;
        D.18328 = __s2_len > 1;
        D.18318 = __result == 0;
        D.18329 = D.18328 & D.18318;
        if (D.18329 != 0) goto <D.18330>; else goto <D.18331>;
        <D.18330>:
        D.18332 = &MEM[(void *)"System.Reflection" + 2B];
        D.18333 = *D.18332;
        D.18334 = (int) D.18333;
        D.18335 = __s2 + 2;
        D.18336 = *D.18335;
        D.18337 = (int) D.18336;
        __result = D.18334 - D.18337;
        D.18338 = __s2_len > 2;
        D.18318 = __result == 0;
        D.18339 = D.18338 & D.18318;
        if (D.18339 != 0) goto <D.18340>; else goto <D.18341>;
        <D.18340>:
        D.18342 = &MEM[(void *)"System.Reflection" + 3B];
        D.18343 = *D.18342;
        D.18344 = (int) D.18343;
        D.18345 = __s2 + 3;
        D.18346 = *D.18345;
        D.18347 = (int) D.18346;
        __result = D.18344 - D.18347;
        <D.18341>:
        <D.18331>:
        <D.18321>:
      }
      D.17583 = __result;
    }
    iftmp.11 = -D.17583;
    goto <D.18348>;
    <D.18311>:
    iftmp.11 = __builtin_strcmp (ns, "System.Reflection");
    <D.18348>:
    D.17584 = iftmp.11;
  }
  if (D.17584 == 0) goto <D.18349>; else goto <D.18350>;
  <D.18349>:
  D.18295 = 0;
  return D.18295;
  <D.18350>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 22;
    if (__s2_len <= 3) goto <D.18352>; else goto <D.18353>;
    <D.18352>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.18354 = "System.Reflection.Emit";
      D.18355 = MEM[(const unsigned char *)D.18354];
      D.18356 = (int) D.18355;
      D.18357 = *__s2;
      D.18358 = (int) D.18357;
      __result = D.18356 - D.18358;
      {
        D.18359 = __s2_len != 0;
        D.18360 = __result == 0;
        D.18361 = D.18359 & D.18360;
        if (D.18361 != 0) goto <D.18362>; else goto <D.18363>;
        <D.18362>:
        D.18364 = &MEM[(void *)"System.Reflection.Emit" + 1B];
        D.18365 = *D.18364;
        D.18366 = (int) D.18365;
        D.18367 = __s2 + 1;
        D.18368 = *D.18367;
        D.18369 = (int) D.18368;
        __result = D.18366 - D.18369;
        D.18370 = __s2_len > 1;
        D.18360 = __result == 0;
        D.18371 = D.18370 & D.18360;
        if (D.18371 != 0) goto <D.18372>; else goto <D.18373>;
        <D.18372>:
        D.18374 = &MEM[(void *)"System.Reflection.Emit" + 2B];
        D.18375 = *D.18374;
        D.18376 = (int) D.18375;
        D.18377 = __s2 + 2;
        D.18378 = *D.18377;
        D.18379 = (int) D.18378;
        __result = D.18376 - D.18379;
        D.18380 = __s2_len > 2;
        D.18360 = __result == 0;
        D.18381 = D.18380 & D.18360;
        if (D.18381 != 0) goto <D.18382>; else goto <D.18383>;
        <D.18382>:
        D.18384 = &MEM[(void *)"System.Reflection.Emit" + 3B];
        D.18385 = *D.18384;
        D.18386 = (int) D.18385;
        D.18387 = __s2 + 3;
        D.18388 = *D.18387;
        D.18389 = (int) D.18388;
        __result = D.18386 - D.18389;
        <D.18383>:
        <D.18373>:
        <D.18363>:
      }
      D.17592 = __result;
    }
    iftmp.12 = -D.17592;
    goto <D.18390>;
    <D.18353>:
    iftmp.12 = __builtin_strcmp (ns, "System.Reflection.Emit");
    <D.18390>:
    D.17593 = iftmp.12;
  }
  if (D.17593 == 0) goto <D.18391>; else goto <D.18392>;
  <D.18391>:
  D.18295 = 0;
  return D.18295;
  <D.18392>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.18394>; else goto <D.18395>;
    <D.18394>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.18396 = "System";
      D.18397 = MEM[(const unsigned char *)D.18396];
      D.18398 = (int) D.18397;
      D.18399 = *__s2;
      D.18400 = (int) D.18399;
      __result = D.18398 - D.18400;
      {
        D.18401 = __s2_len != 0;
        D.18402 = __result == 0;
        D.18403 = D.18401 & D.18402;
        if (D.18403 != 0) goto <D.18404>; else goto <D.18405>;
        <D.18404>:
        D.18406 = &MEM[(void *)"System" + 1B];
        D.18407 = *D.18406;
        D.18408 = (int) D.18407;
        D.18409 = __s2 + 1;
        D.18410 = *D.18409;
        D.18411 = (int) D.18410;
        __result = D.18408 - D.18411;
        D.18412 = __s2_len > 1;
        D.18402 = __result == 0;
        D.18413 = D.18412 & D.18402;
        if (D.18413 != 0) goto <D.18414>; else goto <D.18415>;
        <D.18414>:
        D.18416 = &MEM[(void *)"System" + 2B];
        D.18417 = *D.18416;
        D.18418 = (int) D.18417;
        D.18419 = __s2 + 2;
        D.18420 = *D.18419;
        D.18421 = (int) D.18420;
        __result = D.18418 - D.18421;
        D.18422 = __s2_len > 2;
        D.18402 = __result == 0;
        D.18423 = D.18422 & D.18402;
        if (D.18423 != 0) goto <D.18424>; else goto <D.18425>;
        <D.18424>:
        D.18426 = &MEM[(void *)"System" + 3B];
        D.18427 = *D.18426;
        D.18428 = (int) D.18427;
        D.18429 = __s2 + 3;
        D.18430 = *D.18429;
        D.18431 = (int) D.18430;
        __result = D.18428 - D.18431;
        <D.18425>:
        <D.18415>:
        <D.18405>:
      }
      D.17601 = __result;
    }
    iftmp.13 = -D.17601;
    goto <D.18432>;
    <D.18395>:
    iftmp.13 = __builtin_strcmp (ns, "System");
    <D.18432>:
    D.17602 = iftmp.13;
  }
  if (D.17602 == 0) goto <D.18433>; else goto <D.18434>;
  <D.18433>:
  {
    const char * kname;

    D.18300 = m->klass;
    kname = D.18300->name;
    D.18435 = *kname;
    if (D.18435 == 65) goto <D.18436>; else goto <D.18437>;
    <D.18436>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 9;
      if (__s2_len <= 3) goto <D.18439>; else goto <D.18440>;
      <D.18439>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18441 = "Activator";
        D.18442 = MEM[(const unsigned char *)D.18441];
        D.18443 = (int) D.18442;
        D.18444 = *__s2;
        D.18445 = (int) D.18444;
        __result = D.18443 - D.18445;
        {
          D.18446 = __s2_len != 0;
          D.18447 = __result == 0;
          D.18448 = D.18446 & D.18447;
          if (D.18448 != 0) goto <D.18449>; else goto <D.18450>;
          <D.18449>:
          D.18451 = &MEM[(void *)"Activator" + 1B];
          D.18452 = *D.18451;
          D.18453 = (int) D.18452;
          D.18454 = __s2 + 1;
          D.18455 = *D.18454;
          D.18456 = (int) D.18455;
          __result = D.18453 - D.18456;
          D.18457 = __s2_len > 1;
          D.18447 = __result == 0;
          D.18458 = D.18457 & D.18447;
          if (D.18458 != 0) goto <D.18459>; else goto <D.18460>;
          <D.18459>:
          D.18461 = &MEM[(void *)"Activator" + 2B];
          D.18462 = *D.18461;
          D.18463 = (int) D.18462;
          D.18464 = __s2 + 2;
          D.18465 = *D.18464;
          D.18466 = (int) D.18465;
          __result = D.18463 - D.18466;
          D.18467 = __s2_len > 2;
          D.18447 = __result == 0;
          D.18468 = D.18467 & D.18447;
          if (D.18468 != 0) goto <D.18469>; else goto <D.18470>;
          <D.18469>:
          D.18471 = &MEM[(void *)"Activator" + 3B];
          D.18472 = *D.18471;
          D.18473 = (int) D.18472;
          D.18474 = __s2 + 3;
          D.18475 = *D.18474;
          D.18476 = (int) D.18475;
          __result = D.18473 - D.18476;
          <D.18470>:
          <D.18460>:
          <D.18450>:
        }
        D.17611 = __result;
      }
      iftmp.14 = -D.17611;
      goto <D.18477>;
      <D.18440>:
      iftmp.14 = __builtin_strcmp (kname, "Activator");
      <D.18477>:
      D.17612 = iftmp.14;
    }
    if (D.17612 == 0) goto <D.18478>; else goto <D.18479>;
    <D.18478>:
    D.18295 = 0;
    return D.18295;
    <D.18479>:
    <D.18437>:
    D.18435 = *kname;
    if (D.18435 == 84) goto <D.18483>; else goto <D.18480>;
    <D.18483>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 4;
      if (__s2_len <= 3) goto <D.18485>; else goto <D.18486>;
      <D.18485>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18487 = "Type";
        D.18488 = MEM[(const unsigned char *)D.18487];
        D.18489 = (int) D.18488;
        D.18490 = *__s2;
        D.18491 = (int) D.18490;
        __result = D.18489 - D.18491;
        {
          D.18492 = __s2_len != 0;
          D.18493 = __result == 0;
          D.18494 = D.18492 & D.18493;
          if (D.18494 != 0) goto <D.18495>; else goto <D.18496>;
          <D.18495>:
          D.18497 = &MEM[(void *)"Type" + 1B];
          D.18498 = *D.18497;
          D.18499 = (int) D.18498;
          D.18500 = __s2 + 1;
          D.18501 = *D.18500;
          D.18502 = (int) D.18501;
          __result = D.18499 - D.18502;
          D.18503 = __s2_len > 1;
          D.18493 = __result == 0;
          D.18504 = D.18503 & D.18493;
          if (D.18504 != 0) goto <D.18505>; else goto <D.18506>;
          <D.18505>:
          D.18507 = &MEM[(void *)"Type" + 2B];
          D.18508 = *D.18507;
          D.18509 = (int) D.18508;
          D.18510 = __s2 + 2;
          D.18511 = *D.18510;
          D.18512 = (int) D.18511;
          __result = D.18509 - D.18512;
          D.18513 = __s2_len > 2;
          D.18493 = __result == 0;
          D.18514 = D.18513 & D.18493;
          if (D.18514 != 0) goto <D.18515>; else goto <D.18516>;
          <D.18515>:
          D.18517 = &MEM[(void *)"Type" + 3B];
          D.18518 = *D.18517;
          D.18519 = (int) D.18518;
          D.18520 = __s2 + 3;
          D.18521 = *D.18520;
          D.18522 = (int) D.18521;
          __result = D.18519 - D.18522;
          <D.18516>:
          <D.18506>:
          <D.18496>:
        }
        D.17620 = __result;
      }
      iftmp.15 = -D.17620;
      goto <D.18523>;
      <D.18486>:
      iftmp.15 = __builtin_strcmp (kname, "Type");
      <D.18523>:
      D.17621 = iftmp.15;
    }
    if (D.17621 == 0) goto <D.18481>; else goto <D.18480>;
    <D.18480>:
    D.18435 = *kname;
    if (D.18435 == 77) goto <D.18524>; else goto <D.18482>;
    <D.18524>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 8;
      if (__s2_len <= 3) goto <D.18526>; else goto <D.18527>;
      <D.18526>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18528 = "MonoType";
        D.18529 = MEM[(const unsigned char *)D.18528];
        D.18530 = (int) D.18529;
        D.18531 = *__s2;
        D.18532 = (int) D.18531;
        __result = D.18530 - D.18532;
        {
          D.18533 = __s2_len != 0;
          D.18534 = __result == 0;
          D.18535 = D.18533 & D.18534;
          if (D.18535 != 0) goto <D.18536>; else goto <D.18537>;
          <D.18536>:
          D.18538 = &MEM[(void *)"MonoType" + 1B];
          D.18539 = *D.18538;
          D.18540 = (int) D.18539;
          D.18541 = __s2 + 1;
          D.18542 = *D.18541;
          D.18543 = (int) D.18542;
          __result = D.18540 - D.18543;
          D.18544 = __s2_len > 1;
          D.18534 = __result == 0;
          D.18545 = D.18544 & D.18534;
          if (D.18545 != 0) goto <D.18546>; else goto <D.18547>;
          <D.18546>:
          D.18548 = &MEM[(void *)"MonoType" + 2B];
          D.18549 = *D.18548;
          D.18550 = (int) D.18549;
          D.18551 = __s2 + 2;
          D.18552 = *D.18551;
          D.18553 = (int) D.18552;
          __result = D.18550 - D.18553;
          D.18554 = __s2_len > 2;
          D.18534 = __result == 0;
          D.18555 = D.18554 & D.18534;
          if (D.18555 != 0) goto <D.18556>; else goto <D.18557>;
          <D.18556>:
          D.18558 = &MEM[(void *)"MonoType" + 3B];
          D.18559 = *D.18558;
          D.18560 = (int) D.18559;
          D.18561 = __s2 + 3;
          D.18562 = *D.18561;
          D.18563 = (int) D.18562;
          __result = D.18560 - D.18563;
          <D.18557>:
          <D.18547>:
          <D.18537>:
        }
        D.17629 = __result;
      }
      iftmp.16 = -D.17629;
      goto <D.18564>;
      <D.18527>:
      iftmp.16 = __builtin_strcmp (kname, "MonoType");
      <D.18564>:
      D.17630 = iftmp.16;
    }
    if (D.17630 == 0) goto <D.18481>; else goto <D.18482>;
    <D.18481>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 12;
      if (__s2_len <= 3) goto <D.18566>; else goto <D.18567>;
      <D.18566>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = m->name;
        D.18568 = "InvokeMember";
        D.18569 = MEM[(const unsigned char *)D.18568];
        D.18570 = (int) D.18569;
        D.18571 = *__s2;
        D.18572 = (int) D.18571;
        __result = D.18570 - D.18572;
        {
          D.18573 = __s2_len != 0;
          D.18574 = __result == 0;
          D.18575 = D.18573 & D.18574;
          if (D.18575 != 0) goto <D.18576>; else goto <D.18577>;
          <D.18576>:
          D.18578 = &MEM[(void *)"InvokeMember" + 1B];
          D.18579 = *D.18578;
          D.18580 = (int) D.18579;
          D.18581 = __s2 + 1;
          D.18582 = *D.18581;
          D.18583 = (int) D.18582;
          __result = D.18580 - D.18583;
          D.18584 = __s2_len > 1;
          D.18574 = __result == 0;
          D.18585 = D.18584 & D.18574;
          if (D.18585 != 0) goto <D.18586>; else goto <D.18587>;
          <D.18586>:
          D.18588 = &MEM[(void *)"InvokeMember" + 2B];
          D.18589 = *D.18588;
          D.18590 = (int) D.18589;
          D.18591 = __s2 + 2;
          D.18592 = *D.18591;
          D.18593 = (int) D.18592;
          __result = D.18590 - D.18593;
          D.18594 = __s2_len > 2;
          D.18574 = __result == 0;
          D.18595 = D.18594 & D.18574;
          if (D.18595 != 0) goto <D.18596>; else goto <D.18597>;
          <D.18596>:
          D.18598 = &MEM[(void *)"InvokeMember" + 3B];
          D.18599 = *D.18598;
          D.18600 = (int) D.18599;
          D.18601 = __s2 + 3;
          D.18602 = *D.18601;
          D.18603 = (int) D.18602;
          __result = D.18600 - D.18603;
          <D.18597>:
          <D.18587>:
          <D.18577>:
        }
        D.17638 = __result;
      }
      iftmp.17 = -D.17638;
      goto <D.18604>;
      <D.18567>:
      D.18605 = m->name;
      iftmp.17 = __builtin_strcmp (D.18605, "InvokeMember");
      <D.18604>:
      D.17639 = iftmp.17;
    }
    if (D.17639 == 0) goto <D.18606>; else goto <D.18607>;
    <D.18606>:
    D.18295 = 0;
    return D.18295;
    <D.18607>:
    <D.18482>:
    D.18435 = *kname;
    if (D.18435 == 68) goto <D.18611>; else goto <D.18608>;
    <D.18611>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 8;
      if (__s2_len <= 3) goto <D.18613>; else goto <D.18614>;
      <D.18613>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18615 = "Delegate";
        D.18616 = MEM[(const unsigned char *)D.18615];
        D.18617 = (int) D.18616;
        D.18618 = *__s2;
        D.18619 = (int) D.18618;
        __result = D.18617 - D.18619;
        {
          D.18620 = __s2_len != 0;
          D.18621 = __result == 0;
          D.18622 = D.18620 & D.18621;
          if (D.18622 != 0) goto <D.18623>; else goto <D.18624>;
          <D.18623>:
          D.18625 = &MEM[(void *)"Delegate" + 1B];
          D.18626 = *D.18625;
          D.18627 = (int) D.18626;
          D.18628 = __s2 + 1;
          D.18629 = *D.18628;
          D.18630 = (int) D.18629;
          __result = D.18627 - D.18630;
          D.18631 = __s2_len > 1;
          D.18621 = __result == 0;
          D.18632 = D.18631 & D.18621;
          if (D.18632 != 0) goto <D.18633>; else goto <D.18634>;
          <D.18633>:
          D.18635 = &MEM[(void *)"Delegate" + 2B];
          D.18636 = *D.18635;
          D.18637 = (int) D.18636;
          D.18638 = __s2 + 2;
          D.18639 = *D.18638;
          D.18640 = (int) D.18639;
          __result = D.18637 - D.18640;
          D.18641 = __s2_len > 2;
          D.18621 = __result == 0;
          D.18642 = D.18641 & D.18621;
          if (D.18642 != 0) goto <D.18643>; else goto <D.18644>;
          <D.18643>:
          D.18645 = &MEM[(void *)"Delegate" + 3B];
          D.18646 = *D.18645;
          D.18647 = (int) D.18646;
          D.18648 = __s2 + 3;
          D.18649 = *D.18648;
          D.18650 = (int) D.18649;
          __result = D.18647 - D.18650;
          <D.18644>:
          <D.18634>:
          <D.18624>:
        }
        D.17647 = __result;
      }
      iftmp.18 = -D.17647;
      goto <D.18651>;
      <D.18614>:
      iftmp.18 = __builtin_strcmp (kname, "Delegate");
      <D.18651>:
      D.17648 = iftmp.18;
    }
    if (D.17648 == 0) goto <D.18609>; else goto <D.18608>;
    <D.18608>:
    D.18435 = *kname;
    if (D.18435 == 77) goto <D.18652>; else goto <D.18610>;
    <D.18652>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 17;
      if (__s2_len <= 3) goto <D.18654>; else goto <D.18655>;
      <D.18654>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18656 = "MulticastDelegate";
        D.18657 = MEM[(const unsigned char *)D.18656];
        D.18658 = (int) D.18657;
        D.18659 = *__s2;
        D.18660 = (int) D.18659;
        __result = D.18658 - D.18660;
        {
          D.18661 = __s2_len != 0;
          D.18662 = __result == 0;
          D.18663 = D.18661 & D.18662;
          if (D.18663 != 0) goto <D.18664>; else goto <D.18665>;
          <D.18664>:
          D.18666 = &MEM[(void *)"MulticastDelegate" + 1B];
          D.18667 = *D.18666;
          D.18668 = (int) D.18667;
          D.18669 = __s2 + 1;
          D.18670 = *D.18669;
          D.18671 = (int) D.18670;
          __result = D.18668 - D.18671;
          D.18672 = __s2_len > 1;
          D.18662 = __result == 0;
          D.18673 = D.18672 & D.18662;
          if (D.18673 != 0) goto <D.18674>; else goto <D.18675>;
          <D.18674>:
          D.18676 = &MEM[(void *)"MulticastDelegate" + 2B];
          D.18677 = *D.18676;
          D.18678 = (int) D.18677;
          D.18679 = __s2 + 2;
          D.18680 = *D.18679;
          D.18681 = (int) D.18680;
          __result = D.18678 - D.18681;
          D.18682 = __s2_len > 2;
          D.18662 = __result == 0;
          D.18683 = D.18682 & D.18662;
          if (D.18683 != 0) goto <D.18684>; else goto <D.18685>;
          <D.18684>:
          D.18686 = &MEM[(void *)"MulticastDelegate" + 3B];
          D.18687 = *D.18686;
          D.18688 = (int) D.18687;
          D.18689 = __s2 + 3;
          D.18690 = *D.18689;
          D.18691 = (int) D.18690;
          __result = D.18688 - D.18691;
          <D.18685>:
          <D.18675>:
          <D.18665>:
        }
        D.17656 = __result;
      }
      iftmp.19 = -D.17656;
      goto <D.18692>;
      <D.18655>:
      iftmp.19 = __builtin_strcmp (kname, "MulticastDelegate");
      <D.18692>:
      D.17657 = iftmp.19;
    }
    if (D.17657 == 0) goto <D.18609>; else goto <D.18610>;
    <D.18609>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 13;
      if (__s2_len <= 3) goto <D.18694>; else goto <D.18695>;
      <D.18694>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = m->name;
        D.18696 = "DynamicInvoke";
        D.18697 = MEM[(const unsigned char *)D.18696];
        D.18698 = (int) D.18697;
        D.18699 = *__s2;
        D.18700 = (int) D.18699;
        __result = D.18698 - D.18700;
        {
          D.18701 = __s2_len != 0;
          D.18702 = __result == 0;
          D.18703 = D.18701 & D.18702;
          if (D.18703 != 0) goto <D.18704>; else goto <D.18705>;
          <D.18704>:
          D.18706 = &MEM[(void *)"DynamicInvoke" + 1B];
          D.18707 = *D.18706;
          D.18708 = (int) D.18707;
          D.18709 = __s2 + 1;
          D.18710 = *D.18709;
          D.18711 = (int) D.18710;
          __result = D.18708 - D.18711;
          D.18712 = __s2_len > 1;
          D.18702 = __result == 0;
          D.18713 = D.18712 & D.18702;
          if (D.18713 != 0) goto <D.18714>; else goto <D.18715>;
          <D.18714>:
          D.18716 = &MEM[(void *)"DynamicInvoke" + 2B];
          D.18717 = *D.18716;
          D.18718 = (int) D.18717;
          D.18719 = __s2 + 2;
          D.18720 = *D.18719;
          D.18721 = (int) D.18720;
          __result = D.18718 - D.18721;
          D.18722 = __s2_len > 2;
          D.18702 = __result == 0;
          D.18723 = D.18722 & D.18702;
          if (D.18723 != 0) goto <D.18724>; else goto <D.18725>;
          <D.18724>:
          D.18726 = &MEM[(void *)"DynamicInvoke" + 3B];
          D.18727 = *D.18726;
          D.18728 = (int) D.18727;
          D.18729 = __s2 + 3;
          D.18730 = *D.18729;
          D.18731 = (int) D.18730;
          __result = D.18728 - D.18731;
          <D.18725>:
          <D.18715>:
          <D.18705>:
        }
        D.17665 = __result;
      }
      iftmp.20 = -D.17665;
      goto <D.18732>;
      <D.18695>:
      D.18605 = m->name;
      iftmp.20 = __builtin_strcmp (D.18605, "DynamicInvoke");
      <D.18732>:
      D.17666 = iftmp.20;
    }
    if (D.17666 != 0) goto <D.18733>; else goto <D.18734>;
    <D.18733>:
    D.18295 = 0;
    return D.18295;
    <D.18734>:
    <D.18610>:
  }
  <D.18434>:
  D.18735 = *dest;
  if (D.18735 == m) goto <D.18736>; else goto <D.18737>;
  <D.18736>:
  *dest = 0B;
  D.18295 = 0;
  return D.18295;
  <D.18737>:
  *dest = m;
  D.18295 = 1;
  return D.18295;
}


check_field_access (struct MonoMethod * caller, struct MonoClassField * field)
{
  int D.18741;
  gboolean D.18744;
  struct MonoClass * iftmp.21;
  unsigned int D.18746;
  unsigned int D.18747;

  if (caller != 0B) goto <D.18739>; else goto <D.18740>;
  <D.18739>:
  {
    struct MonoError error;
    struct MonoClass * klass;

    try
      {
        mono_field_get_type_checked (field, &error);
        D.18741 = mono_error_ok (&error);
        if (D.18741 == 0) goto <D.18742>; else goto <D.18743>;
        <D.18742>:
        mono_error_cleanup (&error);
        D.18744 = 0;
        return D.18744;
        <D.18743>:
        D.18746 = mono_field_get_flags (field);
        D.18747 = D.18746 & 16;
        if (D.18747 == 0) goto <D.18748>; else goto <D.18749>;
        <D.18748>:
        iftmp.21 = mono_field_get_parent (field);
        goto <D.18750>;
        <D.18749>:
        iftmp.21 = 0B;
        <D.18750>:
        klass = iftmp.21;
        D.18744 = mono_method_can_access_field_full (caller, field, klass);
        return D.18744;
      }
    finally
      {
        error = {CLOBBER};
      }
  }
  <D.18740>:
  D.18744 = 0;
  return D.18744;
}


get_field_access_exception (const char * format, struct MonoMethod * caller, struct MonoClassField * field)
{
  struct MonoException * D.18753;
  struct MonoException * ex;
  char * caller_name;
  char * field_name;
  char * message;

  caller_name = get_method_full_name (caller);
  field_name = mono_field_full_name (field);
  message = monoeg_g_strdup_printf (format, caller_name, field_name);
  monoeg_g_free (field_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_field_access_msg (message);
  monoeg_g_free (message);
  D.18753 = ex;
  return D.18753;
}


mono_security_core_clr_ensure_reflection_access_method (struct MonoMethod * method)
{
  <unnamed type> D.18755;
  <unnamed type> D.18758;
  unsigned int D.18759;
  struct MonoClass * D.18762;
  struct MonoImage * D.18763;
  int D.18764;
  <unnamed type> D.18767;
  struct MonoException * D.18770;
  int D.18771;
  struct MonoException * D.18774;
  struct MonoMethod * caller;

  caller = get_reflection_caller ();
  D.18755 = mono_security_core_clr_method_level (caller, 1);
  if (D.18755 != 0) goto <D.18756>; else goto <D.18757>;
  <D.18756>:
  return;
  <D.18757>:
  D.18758 = mono_security_core_clr_get_options ();
  D.18759 = D.18758 & 1;
  if (D.18759 != 0) goto <D.18760>; else goto <D.18761>;
  <D.18760>:
  D.18762 = method->klass;
  D.18763 = D.18762->image;
  D.18764 = mono_security_core_clr_is_platform_image (D.18763);
  if (D.18764 == 0) goto <D.18765>; else goto <D.18766>;
  <D.18765>:
  return;
  <D.18766>:
  <D.18761>:
  D.18767 = mono_security_core_clr_method_level (method, 1);
  if (D.18767 == 2) goto <D.18768>; else goto <D.18769>;
  <D.18768>:
  D.18770 = get_method_access_exception ("Transparent method %s cannot invoke Critical method %s.", caller, method);
  mono_raise_exception (D.18770);
  <D.18769>:
  D.18771 = check_method_access (caller, method);
  if (D.18771 == 0) goto <D.18772>; else goto <D.18773>;
  <D.18772>:
  D.18774 = get_method_access_exception ("Transparent method %s cannot invoke private/internal method %s.", caller, method);
  mono_raise_exception (D.18774);
  <D.18773>:
}


check_method_access (struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoClass * iftmp.22;
  short unsigned int D.18779;
  int D.18780;
  int D.18781;
  gboolean D.18785;

  if (caller != 0B) goto <D.18776>; else goto <D.18777>;
  <D.18776>:
  {
    struct MonoClass * klass;

    D.18779 = callee->flags;
    D.18780 = (int) D.18779;
    D.18781 = D.18780 & 16;
    if (D.18781 == 0) goto <D.18782>; else goto <D.18783>;
    <D.18782>:
    iftmp.22 = callee->klass;
    goto <D.18784>;
    <D.18783>:
    iftmp.22 = 0B;
    <D.18784>:
    klass = iftmp.22;
    D.18785 = mono_method_can_access_method_full (caller, callee, klass);
    return D.18785;
  }
  <D.18777>:
  D.18785 = 0;
  return D.18785;
}


get_method_access_exception (const char * format, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoException * D.18787;
  struct MonoException * ex;
  char * caller_name;
  char * callee_name;
  char * message;

  caller_name = get_method_full_name (caller);
  callee_name = get_method_full_name (callee);
  message = monoeg_g_strdup_printf (format, caller_name, callee_name);
  monoeg_g_free (callee_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_method_access_msg (message);
  monoeg_g_free (message);
  D.18787 = ex;
  return D.18787;
}


mono_security_core_clr_ensure_delegate_creation (struct MonoMethod * method, gboolean throwOnBindFailure)
{
  int D.18789;
  gboolean D.18792;
  <unnamed type> D.18793;
  <unnamed type> D.18796;
  struct MonoException * D.18801;
  <unnamed type> D.18802;
  unsigned int D.18803;
  struct MonoClass * D.18806;
  struct MonoImage * D.18807;
  int D.18808;
  int D.18811;
  struct MonoException * D.18814;
  struct MonoMethod * caller;

  D.18789 = can_avoid_corlib_reflection_delegate_optimization (method);
  if (D.18789 != 0) goto <D.18790>; else goto <D.18791>;
  <D.18790>:
  D.18792 = 1;
  return D.18792;
  <D.18791>:
  caller = get_reflection_caller ();
  D.18793 = mono_security_core_clr_method_level (caller, 1);
  if (D.18793 != 0) goto <D.18794>; else goto <D.18795>;
  <D.18794>:
  D.18792 = 1;
  return D.18792;
  <D.18795>:
  D.18796 = mono_security_core_clr_method_level (method, 1);
  if (D.18796 == 2) goto <D.18797>; else goto <D.18798>;
  <D.18797>:
  if (throwOnBindFailure == 0) goto <D.18799>; else goto <D.18800>;
  <D.18799>:
  D.18792 = 0;
  return D.18792;
  <D.18800>:
  D.18801 = get_argument_exception ("Transparent method %s cannot create a delegate on Critical method %s.", caller, method);
  mono_raise_exception (D.18801);
  <D.18798>:
  D.18802 = mono_security_core_clr_get_options ();
  D.18803 = D.18802 & 2;
  if (D.18803 != 0) goto <D.18804>; else goto <D.18805>;
  <D.18804>:
  D.18806 = method->klass;
  D.18807 = D.18806->image;
  D.18808 = mono_security_core_clr_is_platform_image (D.18807);
  if (D.18808 == 0) goto <D.18809>; else goto <D.18810>;
  <D.18809>:
  D.18792 = 1;
  return D.18792;
  <D.18810>:
  <D.18805>:
  D.18811 = check_method_access (caller, method);
  if (D.18811 == 0) goto <D.18812>; else goto <D.18813>;
  <D.18812>:
  D.18814 = get_method_access_exception ("Transparent method %s cannot create a delegate on private/internal method %s.", caller, method);
  mono_raise_exception (D.18814);
  <D.18813>:
  D.18792 = 1;
  return D.18792;
}


can_avoid_corlib_reflection_delegate_optimization (struct MonoMethod * method)
{
  struct MonoClass * D.18816;
  struct MonoImage * D.18817;
  int D.18818;
  gboolean D.18821;
  int D.17784;
  int iftmp.23;
  int D.17783;
  const char[18] * D.18825;
  unsigned char D.18826;
  int D.18827;
  unsigned char D.18828;
  int D.18829;
  _Bool D.18830;
  _Bool D.18831;
  _Bool D.18832;
  const unsigned char * D.18835;
  unsigned char D.18836;
  int D.18837;
  const unsigned char * D.18838;
  unsigned char D.18839;
  int D.18840;
  _Bool D.18841;
  _Bool D.18842;
  const unsigned char * D.18845;
  unsigned char D.18846;
  int D.18847;
  const unsigned char * D.18848;
  unsigned char D.18849;
  int D.18850;
  _Bool D.18851;
  _Bool D.18852;
  const unsigned char * D.18855;
  unsigned char D.18856;
  int D.18857;
  const unsigned char * D.18858;
  unsigned char D.18859;
  int D.18860;
  const char * D.18862;
  int D.17793;
  int iftmp.24;
  int D.17792;
  const char[13] * D.18868;
  unsigned char D.18869;
  int D.18870;
  unsigned char D.18871;
  int D.18872;
  _Bool D.18873;
  _Bool D.18874;
  _Bool D.18875;
  const unsigned char * D.18878;
  unsigned char D.18879;
  int D.18880;
  const unsigned char * D.18881;
  unsigned char D.18882;
  int D.18883;
  _Bool D.18884;
  _Bool D.18885;
  const unsigned char * D.18888;
  unsigned char D.18889;
  int D.18890;
  const unsigned char * D.18891;
  unsigned char D.18892;
  int D.18893;
  _Bool D.18894;
  _Bool D.18895;
  const unsigned char * D.18898;
  unsigned char D.18899;
  int D.18900;
  const unsigned char * D.18901;
  unsigned char D.18902;
  int D.18903;
  const char * D.18905;
  int D.17802;
  int iftmp.25;
  int D.17801;
  const char[19] * D.18913;
  unsigned char D.18914;
  int D.18915;
  unsigned char D.18916;
  int D.18917;
  _Bool D.18918;
  _Bool D.18919;
  _Bool D.18920;
  const unsigned char * D.18923;
  unsigned char D.18924;
  int D.18925;
  const unsigned char * D.18926;
  unsigned char D.18927;
  int D.18928;
  _Bool D.18929;
  _Bool D.18930;
  const unsigned char * D.18933;
  unsigned char D.18934;
  int D.18935;
  const unsigned char * D.18936;
  unsigned char D.18937;
  int D.18938;
  _Bool D.18939;
  _Bool D.18940;
  const unsigned char * D.18943;
  unsigned char D.18944;
  int D.18945;
  const unsigned char * D.18946;
  unsigned char D.18947;
  int D.18948;
  const char * D.18950;
  int D.17811;
  int iftmp.26;
  int D.17810;
  const char[25] * D.18955;
  unsigned char D.18956;
  int D.18957;
  unsigned char D.18958;
  int D.18959;
  _Bool D.18960;
  _Bool D.18961;
  _Bool D.18962;
  const unsigned char * D.18965;
  unsigned char D.18966;
  int D.18967;
  const unsigned char * D.18968;
  unsigned char D.18969;
  int D.18970;
  _Bool D.18971;
  _Bool D.18972;
  const unsigned char * D.18975;
  unsigned char D.18976;
  int D.18977;
  const unsigned char * D.18978;
  unsigned char D.18979;
  int D.18980;
  _Bool D.18981;
  _Bool D.18982;
  const unsigned char * D.18985;
  unsigned char D.18986;
  int D.18987;
  const unsigned char * D.18988;
  unsigned char D.18989;
  int D.18990;
  int D.17820;
  int iftmp.27;
  int D.17819;
  const char[10] * D.18996;
  unsigned char D.18997;
  int D.18998;
  unsigned char D.18999;
  int D.19000;
  _Bool D.19001;
  _Bool D.19002;
  _Bool D.19003;
  const unsigned char * D.19006;
  unsigned char D.19007;
  int D.19008;
  const unsigned char * D.19009;
  unsigned char D.19010;
  int D.19011;
  _Bool D.19012;
  _Bool D.19013;
  const unsigned char * D.19016;
  unsigned char D.19017;
  int D.19018;
  const unsigned char * D.19019;
  unsigned char D.19020;
  int D.19021;
  _Bool D.19022;
  _Bool D.19023;
  const unsigned char * D.19026;
  unsigned char D.19027;
  int D.19028;
  const unsigned char * D.19029;
  unsigned char D.19030;
  int D.19031;
  int D.17829;
  int iftmp.28;
  int D.17828;
  const char[14] * D.19040;
  unsigned char D.19041;
  int D.19042;
  unsigned char D.19043;
  int D.19044;
  _Bool D.19045;
  _Bool D.19046;
  _Bool D.19047;
  const unsigned char * D.19050;
  unsigned char D.19051;
  int D.19052;
  const unsigned char * D.19053;
  unsigned char D.19054;
  int D.19055;
  _Bool D.19056;
  _Bool D.19057;
  const unsigned char * D.19060;
  unsigned char D.19061;
  int D.19062;
  const unsigned char * D.19063;
  unsigned char D.19064;
  int D.19065;
  _Bool D.19066;
  _Bool D.19067;
  const unsigned char * D.19070;
  unsigned char D.19071;
  int D.19072;
  const unsigned char * D.19073;
  unsigned char D.19074;
  int D.19075;
  int D.17838;
  int iftmp.29;
  int D.17837;
  const char[27] * D.19081;
  unsigned char D.19082;
  int D.19083;
  unsigned char D.19084;
  int D.19085;
  _Bool D.19086;
  _Bool D.19087;
  _Bool D.19088;
  const unsigned char * D.19091;
  unsigned char D.19092;
  int D.19093;
  const unsigned char * D.19094;
  unsigned char D.19095;
  int D.19096;
  _Bool D.19097;
  _Bool D.19098;
  const unsigned char * D.19101;
  unsigned char D.19102;
  int D.19103;
  const unsigned char * D.19104;
  unsigned char D.19105;
  int D.19106;
  _Bool D.19107;
  _Bool D.19108;
  const unsigned char * D.19111;
  unsigned char D.19112;
  int D.19113;
  const unsigned char * D.19114;
  unsigned char D.19115;
  int D.19116;

  D.18816 = method->klass;
  D.18817 = D.18816->image;
  D.18818 = mono_security_core_clr_is_platform_image (D.18817);
  if (D.18818 == 0) goto <D.18819>; else goto <D.18820>;
  <D.18819>:
  D.18821 = 0;
  return D.18821;
  <D.18820>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 17;
    if (__s2_len <= 3) goto <D.18823>; else goto <D.18824>;
    <D.18823>:
    {
      const unsigned char * __s2;
      int __result;

      D.18816 = method->klass;
      __s2 = D.18816->name_space;
      D.18825 = "System.Reflection";
      D.18826 = MEM[(const unsigned char *)D.18825];
      D.18827 = (int) D.18826;
      D.18828 = *__s2;
      D.18829 = (int) D.18828;
      __result = D.18827 - D.18829;
      {
        D.18830 = __s2_len != 0;
        D.18831 = __result == 0;
        D.18832 = D.18830 & D.18831;
        if (D.18832 != 0) goto <D.18833>; else goto <D.18834>;
        <D.18833>:
        D.18835 = &MEM[(void *)"System.Reflection" + 1B];
        D.18836 = *D.18835;
        D.18837 = (int) D.18836;
        D.18838 = __s2 + 1;
        D.18839 = *D.18838;
        D.18840 = (int) D.18839;
        __result = D.18837 - D.18840;
        D.18841 = __s2_len > 1;
        D.18831 = __result == 0;
        D.18842 = D.18841 & D.18831;
        if (D.18842 != 0) goto <D.18843>; else goto <D.18844>;
        <D.18843>:
        D.18845 = &MEM[(void *)"System.Reflection" + 2B];
        D.18846 = *D.18845;
        D.18847 = (int) D.18846;
        D.18848 = __s2 + 2;
        D.18849 = *D.18848;
        D.18850 = (int) D.18849;
        __result = D.18847 - D.18850;
        D.18851 = __s2_len > 2;
        D.18831 = __result == 0;
        D.18852 = D.18851 & D.18831;
        if (D.18852 != 0) goto <D.18853>; else goto <D.18854>;
        <D.18853>:
        D.18855 = &MEM[(void *)"System.Reflection" + 3B];
        D.18856 = *D.18855;
        D.18857 = (int) D.18856;
        D.18858 = __s2 + 3;
        D.18859 = *D.18858;
        D.18860 = (int) D.18859;
        __result = D.18857 - D.18860;
        <D.18854>:
        <D.18844>:
        <D.18834>:
      }
      D.17783 = __result;
    }
    iftmp.23 = -D.17783;
    goto <D.18861>;
    <D.18824>:
    D.18816 = method->klass;
    D.18862 = D.18816->name_space;
    iftmp.23 = __builtin_strcmp (D.18862, "System.Reflection");
    <D.18861>:
    D.17784 = iftmp.23;
  }
  if (D.17784 != 0) goto <D.18863>; else goto <D.18864>;
  <D.18863>:
  D.18821 = 0;
  return D.18821;
  <D.18864>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 12;
    if (__s2_len <= 3) goto <D.18866>; else goto <D.18867>;
    <D.18866>:
    {
      const unsigned char * __s2;
      int __result;

      D.18816 = method->klass;
      __s2 = D.18816->name;
      D.18868 = "MonoProperty";
      D.18869 = MEM[(const unsigned char *)D.18868];
      D.18870 = (int) D.18869;
      D.18871 = *__s2;
      D.18872 = (int) D.18871;
      __result = D.18870 - D.18872;
      {
        D.18873 = __s2_len != 0;
        D.18874 = __result == 0;
        D.18875 = D.18873 & D.18874;
        if (D.18875 != 0) goto <D.18876>; else goto <D.18877>;
        <D.18876>:
        D.18878 = &MEM[(void *)"MonoProperty" + 1B];
        D.18879 = *D.18878;
        D.18880 = (int) D.18879;
        D.18881 = __s2 + 1;
        D.18882 = *D.18881;
        D.18883 = (int) D.18882;
        __result = D.18880 - D.18883;
        D.18884 = __s2_len > 1;
        D.18874 = __result == 0;
        D.18885 = D.18884 & D.18874;
        if (D.18885 != 0) goto <D.18886>; else goto <D.18887>;
        <D.18886>:
        D.18888 = &MEM[(void *)"MonoProperty" + 2B];
        D.18889 = *D.18888;
        D.18890 = (int) D.18889;
        D.18891 = __s2 + 2;
        D.18892 = *D.18891;
        D.18893 = (int) D.18892;
        __result = D.18890 - D.18893;
        D.18894 = __s2_len > 2;
        D.18874 = __result == 0;
        D.18895 = D.18894 & D.18874;
        if (D.18895 != 0) goto <D.18896>; else goto <D.18897>;
        <D.18896>:
        D.18898 = &MEM[(void *)"MonoProperty" + 3B];
        D.18899 = *D.18898;
        D.18900 = (int) D.18899;
        D.18901 = __s2 + 3;
        D.18902 = *D.18901;
        D.18903 = (int) D.18902;
        __result = D.18900 - D.18903;
        <D.18897>:
        <D.18887>:
        <D.18877>:
      }
      D.17792 = __result;
    }
    iftmp.24 = -D.17792;
    goto <D.18904>;
    <D.18867>:
    D.18816 = method->klass;
    D.18905 = D.18816->name;
    iftmp.24 = __builtin_strcmp (D.18905, "MonoProperty");
    <D.18904>:
    D.17793 = iftmp.24;
  }
  if (D.17793 == 0) goto <D.18906>; else goto <D.18907>;
  <D.18906>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 18;
    if (__s2_len <= 3) goto <D.18911>; else goto <D.18912>;
    <D.18911>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18913 = "GetterAdapterFrame";
      D.18914 = MEM[(const unsigned char *)D.18913];
      D.18915 = (int) D.18914;
      D.18916 = *__s2;
      D.18917 = (int) D.18916;
      __result = D.18915 - D.18917;
      {
        D.18918 = __s2_len != 0;
        D.18919 = __result == 0;
        D.18920 = D.18918 & D.18919;
        if (D.18920 != 0) goto <D.18921>; else goto <D.18922>;
        <D.18921>:
        D.18923 = &MEM[(void *)"GetterAdapterFrame" + 1B];
        D.18924 = *D.18923;
        D.18925 = (int) D.18924;
        D.18926 = __s2 + 1;
        D.18927 = *D.18926;
        D.18928 = (int) D.18927;
        __result = D.18925 - D.18928;
        D.18929 = __s2_len > 1;
        D.18919 = __result == 0;
        D.18930 = D.18929 & D.18919;
        if (D.18930 != 0) goto <D.18931>; else goto <D.18932>;
        <D.18931>:
        D.18933 = &MEM[(void *)"GetterAdapterFrame" + 2B];
        D.18934 = *D.18933;
        D.18935 = (int) D.18934;
        D.18936 = __s2 + 2;
        D.18937 = *D.18936;
        D.18938 = (int) D.18937;
        __result = D.18935 - D.18938;
        D.18939 = __s2_len > 2;
        D.18919 = __result == 0;
        D.18940 = D.18939 & D.18919;
        if (D.18940 != 0) goto <D.18941>; else goto <D.18942>;
        <D.18941>:
        D.18943 = &MEM[(void *)"GetterAdapterFrame" + 3B];
        D.18944 = *D.18943;
        D.18945 = (int) D.18944;
        D.18946 = __s2 + 3;
        D.18947 = *D.18946;
        D.18948 = (int) D.18947;
        __result = D.18945 - D.18948;
        <D.18942>:
        <D.18932>:
        <D.18922>:
      }
      D.17801 = __result;
    }
    iftmp.25 = -D.17801;
    goto <D.18949>;
    <D.18912>:
    D.18950 = method->name;
    iftmp.25 = __builtin_strcmp (D.18950, "GetterAdapterFrame");
    <D.18949>:
    D.17802 = iftmp.25;
  }
  if (D.17802 == 0) goto <D.18908>; else goto <D.18951>;
  <D.18951>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 24;
    if (__s2_len <= 3) goto <D.18953>; else goto <D.18954>;
    <D.18953>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18955 = "StaticGetterAdapterFrame";
      D.18956 = MEM[(const unsigned char *)D.18955];
      D.18957 = (int) D.18956;
      D.18958 = *__s2;
      D.18959 = (int) D.18958;
      __result = D.18957 - D.18959;
      {
        D.18960 = __s2_len != 0;
        D.18961 = __result == 0;
        D.18962 = D.18960 & D.18961;
        if (D.18962 != 0) goto <D.18963>; else goto <D.18964>;
        <D.18963>:
        D.18965 = &MEM[(void *)"StaticGetterAdapterFrame" + 1B];
        D.18966 = *D.18965;
        D.18967 = (int) D.18966;
        D.18968 = __s2 + 1;
        D.18969 = *D.18968;
        D.18970 = (int) D.18969;
        __result = D.18967 - D.18970;
        D.18971 = __s2_len > 1;
        D.18961 = __result == 0;
        D.18972 = D.18971 & D.18961;
        if (D.18972 != 0) goto <D.18973>; else goto <D.18974>;
        <D.18973>:
        D.18975 = &MEM[(void *)"StaticGetterAdapterFrame" + 2B];
        D.18976 = *D.18975;
        D.18977 = (int) D.18976;
        D.18978 = __s2 + 2;
        D.18979 = *D.18978;
        D.18980 = (int) D.18979;
        __result = D.18977 - D.18980;
        D.18981 = __s2_len > 2;
        D.18961 = __result == 0;
        D.18982 = D.18981 & D.18961;
        if (D.18982 != 0) goto <D.18983>; else goto <D.18984>;
        <D.18983>:
        D.18985 = &MEM[(void *)"StaticGetterAdapterFrame" + 3B];
        D.18986 = *D.18985;
        D.18987 = (int) D.18986;
        D.18988 = __s2 + 3;
        D.18989 = *D.18988;
        D.18990 = (int) D.18989;
        __result = D.18987 - D.18990;
        <D.18984>:
        <D.18974>:
        <D.18964>:
      }
      D.17810 = __result;
    }
    iftmp.26 = -D.17810;
    goto <D.18991>;
    <D.18954>:
    D.18950 = method->name;
    iftmp.26 = __builtin_strcmp (D.18950, "StaticGetterAdapterFrame");
    <D.18991>:
    D.17811 = iftmp.26;
  }
  if (D.17811 == 0) goto <D.18908>; else goto <D.18909>;
  <D.18908>:
  D.18821 = 1;
  return D.18821;
  <D.18909>:
  goto <D.18992>;
  <D.18907>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 9;
    if (__s2_len <= 3) goto <D.18994>; else goto <D.18995>;
    <D.18994>:
    {
      const unsigned char * __s2;
      int __result;

      D.18816 = method->klass;
      __s2 = D.18816->name;
      D.18996 = "EventInfo";
      D.18997 = MEM[(const unsigned char *)D.18996];
      D.18998 = (int) D.18997;
      D.18999 = *__s2;
      D.19000 = (int) D.18999;
      __result = D.18998 - D.19000;
      {
        D.19001 = __s2_len != 0;
        D.19002 = __result == 0;
        D.19003 = D.19001 & D.19002;
        if (D.19003 != 0) goto <D.19004>; else goto <D.19005>;
        <D.19004>:
        D.19006 = &MEM[(void *)"EventInfo" + 1B];
        D.19007 = *D.19006;
        D.19008 = (int) D.19007;
        D.19009 = __s2 + 1;
        D.19010 = *D.19009;
        D.19011 = (int) D.19010;
        __result = D.19008 - D.19011;
        D.19012 = __s2_len > 1;
        D.19002 = __result == 0;
        D.19013 = D.19012 & D.19002;
        if (D.19013 != 0) goto <D.19014>; else goto <D.19015>;
        <D.19014>:
        D.19016 = &MEM[(void *)"EventInfo" + 2B];
        D.19017 = *D.19016;
        D.19018 = (int) D.19017;
        D.19019 = __s2 + 2;
        D.19020 = *D.19019;
        D.19021 = (int) D.19020;
        __result = D.19018 - D.19021;
        D.19022 = __s2_len > 2;
        D.19002 = __result == 0;
        D.19023 = D.19022 & D.19002;
        if (D.19023 != 0) goto <D.19024>; else goto <D.19025>;
        <D.19024>:
        D.19026 = &MEM[(void *)"EventInfo" + 3B];
        D.19027 = *D.19026;
        D.19028 = (int) D.19027;
        D.19029 = __s2 + 3;
        D.19030 = *D.19029;
        D.19031 = (int) D.19030;
        __result = D.19028 - D.19031;
        <D.19025>:
        <D.19015>:
        <D.19005>:
      }
      D.17819 = __result;
    }
    iftmp.27 = -D.17819;
    goto <D.19032>;
    <D.18995>:
    D.18816 = method->klass;
    D.18905 = D.18816->name;
    iftmp.27 = __builtin_strcmp (D.18905, "EventInfo");
    <D.19032>:
    D.17820 = iftmp.27;
  }
  if (D.17820 == 0) goto <D.19033>; else goto <D.19034>;
  <D.19033>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 13;
    if (__s2_len <= 3) goto <D.19038>; else goto <D.19039>;
    <D.19038>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.19040 = "AddEventFrame";
      D.19041 = MEM[(const unsigned char *)D.19040];
      D.19042 = (int) D.19041;
      D.19043 = *__s2;
      D.19044 = (int) D.19043;
      __result = D.19042 - D.19044;
      {
        D.19045 = __s2_len != 0;
        D.19046 = __result == 0;
        D.19047 = D.19045 & D.19046;
        if (D.19047 != 0) goto <D.19048>; else goto <D.19049>;
        <D.19048>:
        D.19050 = &MEM[(void *)"AddEventFrame" + 1B];
        D.19051 = *D.19050;
        D.19052 = (int) D.19051;
        D.19053 = __s2 + 1;
        D.19054 = *D.19053;
        D.19055 = (int) D.19054;
        __result = D.19052 - D.19055;
        D.19056 = __s2_len > 1;
        D.19046 = __result == 0;
        D.19057 = D.19056 & D.19046;
        if (D.19057 != 0) goto <D.19058>; else goto <D.19059>;
        <D.19058>:
        D.19060 = &MEM[(void *)"AddEventFrame" + 2B];
        D.19061 = *D.19060;
        D.19062 = (int) D.19061;
        D.19063 = __s2 + 2;
        D.19064 = *D.19063;
        D.19065 = (int) D.19064;
        __result = D.19062 - D.19065;
        D.19066 = __s2_len > 2;
        D.19046 = __result == 0;
        D.19067 = D.19066 & D.19046;
        if (D.19067 != 0) goto <D.19068>; else goto <D.19069>;
        <D.19068>:
        D.19070 = &MEM[(void *)"AddEventFrame" + 3B];
        D.19071 = *D.19070;
        D.19072 = (int) D.19071;
        D.19073 = __s2 + 3;
        D.19074 = *D.19073;
        D.19075 = (int) D.19074;
        __result = D.19072 - D.19075;
        <D.19069>:
        <D.19059>:
        <D.19049>:
      }
      D.17828 = __result;
    }
    iftmp.28 = -D.17828;
    goto <D.19076>;
    <D.19039>:
    D.18950 = method->name;
    iftmp.28 = __builtin_strcmp (D.18950, "AddEventFrame");
    <D.19076>:
    D.17829 = iftmp.28;
  }
  if (D.17829 == 0) goto <D.19035>; else goto <D.19077>;
  <D.19077>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 26;
    if (__s2_len <= 3) goto <D.19079>; else goto <D.19080>;
    <D.19079>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.19081 = "StaticAddEventAdapterFrame";
      D.19082 = MEM[(const unsigned char *)D.19081];
      D.19083 = (int) D.19082;
      D.19084 = *__s2;
      D.19085 = (int) D.19084;
      __result = D.19083 - D.19085;
      {
        D.19086 = __s2_len != 0;
        D.19087 = __result == 0;
        D.19088 = D.19086 & D.19087;
        if (D.19088 != 0) goto <D.19089>; else goto <D.19090>;
        <D.19089>:
        D.19091 = &MEM[(void *)"StaticAddEventAdapterFrame" + 1B];
        D.19092 = *D.19091;
        D.19093 = (int) D.19092;
        D.19094 = __s2 + 1;
        D.19095 = *D.19094;
        D.19096 = (int) D.19095;
        __result = D.19093 - D.19096;
        D.19097 = __s2_len > 1;
        D.19087 = __result == 0;
        D.19098 = D.19097 & D.19087;
        if (D.19098 != 0) goto <D.19099>; else goto <D.19100>;
        <D.19099>:
        D.19101 = &MEM[(void *)"StaticAddEventAdapterFrame" + 2B];
        D.19102 = *D.19101;
        D.19103 = (int) D.19102;
        D.19104 = __s2 + 2;
        D.19105 = *D.19104;
        D.19106 = (int) D.19105;
        __result = D.19103 - D.19106;
        D.19107 = __s2_len > 2;
        D.19087 = __result == 0;
        D.19108 = D.19107 & D.19087;
        if (D.19108 != 0) goto <D.19109>; else goto <D.19110>;
        <D.19109>:
        D.19111 = &MEM[(void *)"StaticAddEventAdapterFrame" + 3B];
        D.19112 = *D.19111;
        D.19113 = (int) D.19112;
        D.19114 = __s2 + 3;
        D.19115 = *D.19114;
        D.19116 = (int) D.19115;
        __result = D.19113 - D.19116;
        <D.19110>:
        <D.19100>:
        <D.19090>:
      }
      D.17837 = __result;
    }
    iftmp.29 = -D.17837;
    goto <D.19117>;
    <D.19080>:
    D.18950 = method->name;
    iftmp.29 = __builtin_strcmp (D.18950, "StaticAddEventAdapterFrame");
    <D.19117>:
    D.17838 = iftmp.29;
  }
  if (D.17838 == 0) goto <D.19035>; else goto <D.19036>;
  <D.19035>:
  D.18821 = 1;
  return D.18821;
  <D.19036>:
  <D.19034>:
  <D.18992>:
  D.18821 = 0;
  return D.18821;
}


get_argument_exception (const char * format, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoException * D.19119;
  struct MonoException * ex;
  char * caller_name;
  char * callee_name;
  char * message;

  caller_name = get_method_full_name (caller);
  callee_name = get_method_full_name (callee);
  message = monoeg_g_strdup_printf (format, caller_name, callee_name);
  monoeg_g_free (callee_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_argument ("method", message);
  monoeg_g_free (message);
  D.19119 = ex;
  return D.19119;
}


mono_security_core_clr_ensure_dynamic_method_resolved_object (void * ref, struct MonoClass * handle_class)
{
  struct MonoClass * D.19121;
  struct MonoImage * D.19124;
  int D.19125;
  int D.19128;
  struct MonoException * D.19131;
  struct MonoClass * D.19133;
  struct MonoClass * D.19136;
  struct MonoImage * D.19137;
  int D.19138;
  int D.19141;

  D.19121 = mono_defaults.fieldhandle_class;
  if (D.19121 == handle_class) goto <D.19122>; else goto <D.19123>;
  <D.19122>:
  {
    struct MonoClassField * field;
    struct MonoClass * klass;

    field = ref;
    klass = mono_field_get_parent (field);
    D.19124 = klass->image;
    D.19125 = mono_security_core_clr_is_platform_image (D.19124);
    if (D.19125 != 0) goto <D.19126>; else goto <D.19127>;
    <D.19126>:
    {
      struct MonoMethod * caller;

      caller = get_reflection_caller ();
      D.19128 = check_field_access (caller, field);
      if (D.19128 == 0) goto <D.19129>; else goto <D.19130>;
      <D.19129>:
      D.19131 = get_field_access_exception ("Dynamic method %s cannot create access private/internal field %s.", caller, field);
      return D.19131;
      <D.19130>:
    }
    <D.19127>:
  }
  goto <D.19132>;
  <D.19123>:
  D.19133 = mono_defaults.methodhandle_class;
  if (D.19133 == handle_class) goto <D.19134>; else goto <D.19135>;
  <D.19134>:
  {
    struct MonoMethod * method;

    method = ref;
    D.19136 = method->klass;
    D.19137 = D.19136->image;
    D.19138 = mono_security_core_clr_is_platform_image (D.19137);
    if (D.19138 != 0) goto <D.19139>; else goto <D.19140>;
    <D.19139>:
    {
      struct MonoMethod * caller;

      caller = get_reflection_caller ();
      D.19141 = check_method_access (caller, method);
      if (D.19141 == 0) goto <D.19142>; else goto <D.19143>;
      <D.19142>:
      D.19131 = get_method_access_exception ("Dynamic method %s cannot create access private/internal method %s.", caller, method);
      return D.19131;
      <D.19143>:
    }
    <D.19140>:
  }
  <D.19135>:
  <D.19132>:
  D.19131 = 0B;
  return D.19131;
}


mono_security_core_clr_can_access_internals (struct MonoImage * accessing, struct MonoImage * accessed)
{
  int D.19145;
  gboolean D.19148;
  int D.19149;
  struct MonoAssembly * D.19154;
  char * D.19155;
  struct MonoAssembly * D.19157;
  char * D.19158;
  int D.17865;
  _Bool D.19159;

  D.19145 = mono_security_core_clr_is_platform_image (accessed);
  if (D.19145 == 0) goto <D.19146>; else goto <D.19147>;
  <D.19146>:
  D.19148 = 1;
  return D.19148;
  <D.19147>:
  D.19149 = mono_security_core_clr_is_platform_image (accessing);
  if (D.19149 != 0) goto <D.19150>; else goto <D.19151>;
  <D.19150>:
  D.19148 = 1;
  return D.19148;
  <D.19151>:
  D.19154 = accessed->assembly;
  D.19155 = D.19154->basedir;
  if (D.19155 == 0B) goto <D.19152>; else goto <D.19156>;
  <D.19156>:
  D.19157 = accessing->assembly;
  D.19158 = D.19157->basedir;
  if (D.19158 == 0B) goto <D.19152>; else goto <D.19153>;
  <D.19152>:
  D.19148 = 0;
  return D.19148;
  <D.19153>:
  {
    size_t __s1_len;
    size_t __s2_len;

    D.19157 = accessing->assembly;
    D.19158 = D.19157->basedir;
    D.19154 = accessed->assembly;
    D.19155 = D.19154->basedir;
    D.17865 = __builtin_strcmp (D.19155, D.19158);
  }
  D.19159 = D.17865 == 0;
  D.19148 = (gboolean) D.19159;
  return D.19148;
}


mono_security_core_clr_is_field_access_allowed (struct MonoMethod * caller, struct MonoClassField * field)
{
  struct MonoClass * D.19161;
  <unnamed type> D.19162;
  struct MonoException * D.19165;
  <unnamed type> D.19169;

  D.19161 = mono_field_get_parent (field);
  D.19162 = mono_security_core_clr_class_level (D.19161);
  if (D.19162 != 2) goto <D.19163>; else goto <D.19164>;
  <D.19163>:
  D.19165 = 0B;
  return D.19165;
  <D.19164>:
  if (caller == 0B) goto <D.19166>; else goto <D.19168>;
  <D.19168>:
  D.19169 = mono_security_core_clr_method_level (caller, 1);
  if (D.19169 != 0) goto <D.19166>; else goto <D.19167>;
  <D.19166>:
  D.19165 = 0B;
  return D.19165;
  <D.19167>:
  D.19165 = get_field_access_exception ("Transparent method %s cannot call use Critical field %s.", caller, field);
  return D.19165;
}


mono_security_core_clr_is_call_allowed (struct MonoMethod * caller, struct MonoMethod * callee)
{
  <unnamed type> D.19171;
  struct MonoException * D.19174;
  <unnamed type> D.19178;

  D.19171 = mono_security_core_clr_method_level (callee, 1);
  if (D.19171 != 2) goto <D.19172>; else goto <D.19173>;
  <D.19172>:
  D.19174 = 0B;
  return D.19174;
  <D.19173>:
  if (caller == 0B) goto <D.19175>; else goto <D.19177>;
  <D.19177>:
  D.19178 = mono_security_core_clr_method_level (caller, 1);
  if (D.19178 != 0) goto <D.19175>; else goto <D.19176>;
  <D.19175>:
  D.19174 = 0B;
  return D.19174;
  <D.19176>:
  D.19174 = get_method_access_exception ("Transparent method %s cannot call Critical method %s.", caller, callee);
  return D.19174;
}


mono_security_core_clr_class_level (struct MonoClass * class)
{
  int mono_security_core_clr_test.30;
  struct MonoImage * D.19183;
  int D.19184;
  MonoSecurityCoreCLRLevel D.19187;

  mono_security_core_clr_test.30 = mono_security_core_clr_test;
  if (mono_security_core_clr_test.30 == 0) goto <D.19181>; else goto <D.19182>;
  <D.19181>:
  D.19183 = class->image;
  D.19184 = mono_security_core_clr_is_platform_image (D.19183);
  if (D.19184 == 0) goto <D.19185>; else goto <D.19186>;
  <D.19185>:
  D.19187 = 0;
  return D.19187;
  <D.19186>:
  <D.19182>:
  D.19187 = mono_security_core_clr_class_level_no_platform_check (class);
  return D.19187;
}


mono_security_core_clr_class_level_no_platform_check (struct MonoClass * class)
{
  struct MonoImage * D.19191;
  struct MonoClass * D.19194;
  MonoSecurityCoreCLRLevel D.19197;
  MonoSecurityCoreCLRLevel level;
  struct MonoCustomAttrInfo * cinfo;

  level = 0;
  cinfo = mono_custom_attrs_from_class (class);
  if (cinfo != 0B) goto <D.19189>; else goto <D.19190>;
  <D.19189>:
  D.19191 = class->image;
  level = mono_security_core_clr_level_from_cinfo (cinfo, D.19191);
  mono_custom_attrs_free (cinfo);
  <D.19190>:
  if (level == 0) goto <D.19192>; else goto <D.19193>;
  <D.19192>:
  D.19194 = class->nested_in;
  if (D.19194 != 0B) goto <D.19195>; else goto <D.19196>;
  <D.19195>:
  D.19194 = class->nested_in;
  level = mono_security_core_clr_class_level_no_platform_check (D.19194);
  <D.19196>:
  <D.19193>:
  D.19197 = level;
  return D.19197;
}


mono_security_core_clr_level_from_cinfo (struct MonoCustomAttrInfo * cinfo, struct MonoImage * image)
{
  struct MonoClass * D.19201;
  int D.19202;
  struct MonoClass * D.19207;
  int D.19208;
  MonoSecurityCoreCLRLevel D.19211;
  int level;

  level = 0;
  if (cinfo != 0B) goto <D.19199>; else goto <D.19200>;
  <D.19199>:
  D.19201 = security_safe_critical_attribute ();
  D.19202 = mono_custom_attrs_has_attr (cinfo, D.19201);
  if (D.19202 != 0) goto <D.19203>; else goto <D.19204>;
  <D.19203>:
  level = 1;
  <D.19204>:
  <D.19200>:
  if (cinfo != 0B) goto <D.19205>; else goto <D.19206>;
  <D.19205>:
  D.19207 = security_critical_attribute ();
  D.19208 = mono_custom_attrs_has_attr (cinfo, D.19207);
  if (D.19208 != 0) goto <D.19209>; else goto <D.19210>;
  <D.19209>:
  level = 2;
  <D.19210>:
  <D.19206>:
  D.19211 = (MonoSecurityCoreCLRLevel) level;
  return D.19211;
}


security_safe_critical_attribute ()
{
  struct MonoClass * class.31;
  struct MonoImage * D.19216;
  struct MonoClass * class.32;
  _Bool D.19218;
  long int D.19219;
  long int D.19220;
  struct MonoClass * D.19223;
  static struct MonoClass * class = 0B;

  class.31 = class;
  if (class.31 == 0B) goto <D.19214>; else goto <D.19215>;
  <D.19214>:
  D.19216 = mono_defaults.corlib;
  class.32 = mono_class_from_name (D.19216, "System.Security", "SecuritySafeCriticalAttribute");
  class = class.32;
  <D.19215>:
  class.31 = class;
  D.19218 = class.31 == 0B;
  D.19219 = (long int) D.19218;
  D.19220 = __builtin_expect (D.19219, 0);
  if (D.19220 != 0) goto <D.19221>; else goto <D.19222>;
  <D.19221>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "security-core-clr.c", 147, "class");
  <D.19222>:
  D.19223 = class;
  return D.19223;
}


security_critical_attribute ()
{
  struct MonoClass * class.33;
  struct MonoImage * D.19228;
  struct MonoClass * class.34;
  _Bool D.19230;
  long int D.19231;
  long int D.19232;
  struct MonoClass * D.19235;
  static struct MonoClass * class = 0B;

  class.33 = class;
  if (class.33 == 0B) goto <D.19226>; else goto <D.19227>;
  <D.19226>:
  D.19228 = mono_defaults.corlib;
  class.34 = mono_class_from_name (D.19228, "System.Security", "SecurityCriticalAttribute");
  class = class.34;
  <D.19227>:
  class.33 = class;
  D.19230 = class.33 == 0B;
  D.19231 = (long int) D.19230;
  D.19232 = __builtin_expect (D.19231, 0);
  if (D.19232 != 0) goto <D.19233>; else goto <D.19234>;
  <D.19233>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "security-core-clr.c", 134, "class");
  <D.19234>:
  D.19235 = class;
  return D.19235;
}


mono_security_core_clr_method_level (struct MonoMethod * method, gboolean with_class_level)
{
  MonoSecurityCoreCLRLevel D.19239;
  int mono_security_core_clr_test.35;
  struct MonoClass * D.19243;
  struct MonoImage * D.19244;
  int D.19245;
  _Bool D.19250;
  _Bool D.19251;
  _Bool D.19252;
  struct MonoCustomAttrInfo * cinfo;
  MonoSecurityCoreCLRLevel level;

  level = 0;
  if (method == 0B) goto <D.19237>; else goto <D.19238>;
  <D.19237>:
  D.19239 = level;
  return D.19239;
  <D.19238>:
  mono_security_core_clr_test.35 = mono_security_core_clr_test;
  if (mono_security_core_clr_test.35 == 0) goto <D.19241>; else goto <D.19242>;
  <D.19241>:
  D.19243 = method->klass;
  D.19244 = D.19243->image;
  D.19245 = mono_security_core_clr_is_platform_image (D.19244);
  if (D.19245 == 0) goto <D.19246>; else goto <D.19247>;
  <D.19246>:
  D.19239 = level;
  return D.19239;
  <D.19247>:
  <D.19242>:
  cinfo = mono_custom_attrs_from_method (method);
  if (cinfo != 0B) goto <D.19248>; else goto <D.19249>;
  <D.19248>:
  D.19243 = method->klass;
  D.19244 = D.19243->image;
  level = mono_security_core_clr_level_from_cinfo (cinfo, D.19244);
  mono_custom_attrs_free (cinfo);
  <D.19249>:
  D.19250 = with_class_level != 0;
  D.19251 = level == 0;
  D.19252 = D.19250 & D.19251;
  if (D.19252 != 0) goto <D.19253>; else goto <D.19254>;
  <D.19253>:
  D.19243 = method->klass;
  level = mono_security_core_clr_class_level (D.19243);
  <D.19254>:
  D.19239 = level;
  return D.19239;
}


mono_security_enable_core_clr ()
{
  mono_verifier_set_mode (2);
  mono_security_set_mode (1);
}


