// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// See https://github.com/dart-lang/sdk/issues/38654 for context.

// The Dart Project Fuzz Tester (1.53).
// Program generated as:
//   dart dartfuzz.dart --seed 194851581 --no-fp --no-ffi

import 'dart:async';
import 'dart:cli';
import 'dart:collection';
import 'dart:convert';
import 'dart:core';
import 'dart:io';
import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';

Map<int, String> var0 = {
  39: 'sl2a(',
  29: 'HGYdMd',
  93: '\u2665',
  97: 'hJ',
  38: 'O',
  25: '',
  40: ''
};
int var1 = 56;
int var2 = -9;
bool var3 = false;
int var4 = -77;
double var5 = 0.9130097229882881;
String var6 = '\u2665g';
List<int> var7 = [-4294967280, -46, -51, 13, -77, -20];
Set<int> var8 = {
  -9223372036854775680,
  25,
  -43,
  2,
  -57,
  -9223372030412324865,
  4294967423,
  -39
};
Map<int, String> var9 = {90: 'DXbRR', 8: 's\u2665y', 51: '0wumJ', 33: 'aee'};

String foo0() {
  {
    int loc0 = 79;
    while (--loc0 > 0) {
      for (int loc1 in ((var7 +
              [
                -51,
                Int32x4.wwzy,
                (((var3 ? (--var2) : 21) < -40)
                    ? (var3 ? var2 : var7[var1])
                    : (var1--)),
                ((var3
                        ? Float32x4.wyyy
                        : var7[
                            (false ? var4 : ZLibOption.DEFAULT_WINDOW_BITS)]) <<
                    var7[var7[-32769]]),
                (var3 ? 8 : var7[-9223372036854775680]),
                (Int32x4.xxww ^ Int32x4.zzyy)
              ]) ??
          ((!((var0 !=
                  {
                    96: 'r&\u2665P',
                    94: ('JXX ' + var6),
                    62: '\u26656',
                    35: ListBase.listToString(var7)
                  })))
              ? ((var3 ? var7 : (true ? var7 : var7)) ??
                  [
                    (false ? var2 : -66),
                    -55,
                    (-(var7[loc0])),
                    var7[-12],
                    ((((27 + var1)).isInfinite
                            ? var3
                            : (var3 ? (var9[var7[-88]])!.isEmpty : var3))
                        ? -4294934528
                        : var1),
                    -40,
                    var7[var7[var7[Int32x4.wxyw]]],
                    14
                  ])
              : [Float32x4.yxyy]))) {
        /*
         * Multi-line
         * comment.
         */
        {
          int loc2 = 67;
          while (--loc2 > 0) {
            var8 = {loc1, 62, -37, Float32x4.yxwz, -42};
          }
        }
        var9.forEach((loc2, loc3) {
          var7 = var7;
          try {
            loc3 ??= 'tSWbA';
          } catch (exception, stackTrace) {
            for (int loc4 in [
              ((!((((-82 * var7[-28])).toString() == (var0[31] ?? var6))))
                  ? (--var2)
                  : (--var4))
            ]) {
              var7[Int32x4.wxzx] ~/= Int32x4.ywwx;
            }
            var3 ??= var3;
          } finally {
            var0 ??= var9;
          }
        });
      }
    }
  }
  return ((var3 &&
          (((var3 ? true : (var3 || var3)) ? false : false)
              ? true
              : (!((false && false)))))
      ? 'V-5p'
      : (((Float32x4.xwwx > var7[var2])
              ? var6
              : var9[(((--var2)).isEven ? -90 : (++var2))]) ??
          (var3 ? '' : '!5s#rtD')));
}

Set<int> foo1(int par1, bool par2) {
  // Single-line comment.
  {
    int loc0 = 68;
    while (--loc0 > 0) {
      {
        List<int> loc1 = [
          var1,
          -13,
          (false ? ((~(19)) - ((!(true)) ? (par1++) : -89)) : (~((var2--)))),
          Float32x4.yzww,
          var7[(~((--par1)))],
          (-99 % par1),
          (true ? (~(var7[par1])) : Int32x4.xyxw)
        ];
        for (int loc2 in var8) {
          var7[16] <<= Float32x4.yyyx;
        }
        for (int loc2 = 0; loc2 < 33; loc2++) {
          if (var3) {
            var0 = (Map.unmodifiable(var9) ??
                (Map.unmodifiable(var9) ??
                    Map.from({6: var9[var1], 28: foo0(), 36: '8+'})));
            var9[((-93 * loc1[loc2]) +
                (((!((!(par2)))) || (!(par2)))
                    ? (var4 ~/ JsonUtf8Encoder.DEFAULT_BUFFER_SIZE)
                    : -9223372032559775745))] ??= var6;
          }
          var3 = ((!((loc1[loc0] != (false ? (--var4) : var1)))) ||
              ('').endsWith('xTYEp\u2665'));
        }
      }
      for (int loc1 in var7) {
        var7[Float32x4.ywzy] >>= var2;
        /*
         * Multi-line
         * comment.
         */
        var8 = (((false ? var8 : {var1, Float32x4.xwyw}) ??
                ({(Int32x4.wxyy & var7[(par1--)])} ??
                    (var3
                        ? {var7[73], 20, var4, (var7[(-20 | loc1)] * 84), 47}
                        : (par2
                            ? {
                                8,
                                -66,
                                (((var7[var7[-56]])
                                            .toRadixString(Int32x4.wyxx) !=
                                        (('j' ?? 'r')).toLowerCase())
                                    ? var7[var7[(var2++)]]
                                    : (-(Duration.microsecondsPerDay))),
                                (~(((!(true))
                                    ? (false
                                        ? (++var2)
                                        : var7[ZLibOption.STRATEGY_FILTERED])
                                    : Float32x4.xxyz))),
                                (var3
                                    ? (true
                                        ? (-95 -
                                            (-25 ??
                                                ((false ? true : var3)
                                                    ? Int32x4.xxww
                                                    : var7[-29])))
                                        : (var2++))
                                    : -34)
                              }
                            : ({(++var4), par1, (-81 % var7[-54])})
                                .toSet())))) ??
            {
              (~((-((loc1++))))),
              (var7[var7[4295032832]] - RawSocketOption.levelIPv4)
            });
      }
    }
  }
  return {
    var7[var2],
    var2,
    (-(((par2 && par2) ? Int32x4.ywzw : Float32x4.wywx))),
    ((!(NetworkInterface.listSupported))
        ? (--var4)
        : (((var6).isEmpty
                ? (-73 * ((var7[var4]).isOdd ? Float32x4.xwww : -63))
                : -4) -
            (~(69)))),
    (((true
                ? (true
                    ? -9223372032559808257
                    : (~((par2 ? (var1--) : (false ? var7[-4] : var1)))))
                : 27) <<
            Float32x4.xyzy) -
        ((~(var7[Float32x4.xyzz])) &
            (((par2 ? true : false) ? par2 : true)
                ? 44
                : ((!(par2)) ? -57 : var7[var2])))),
    (MapBase.mapToString((Map.from({
              77: ((!(false)) ? var6 : var0[var7[var7[var7[-63]]]]),
              87: '9vj',
              50: 'e\u26655-',
              46: var9[-32],
              96: var6
            }) ??
            {
              32: var0[-9223372032559742976],
              4: SetBase.setToString(var8),
              67: var0[Int32x4.yxww],
              53: var9[53],
              91: var6,
              17: '2gtffn'
            })))
        .length
  };
}

String foo2(Map<int, String> par1, bool par2) {
  try {
    par2 = (false
        ? false
        : (SecurityContext.alpnSupported
            ? false
            : (var3 ? ('aXL').isNotEmpty : (77).isNegative)));
    if ((((++var4) ~/ (var4 & var1))).isEven) {
      /*
       * Multi-line
       * comment.
       */
      var7 ??= (((((-(var7[-2]))).toString() ?? foo0()) ??
              (true
                  ? (par1[(-57 + (var7[52] | -91))]! + var9[57]!)
                  : Uri.decodeFull((false
                      ? '17'
                      : (8).toStringAsExponential(var7[var7[8]]))))))
          .codeUnits;
    }
  } catch (exception, stackTrace) {
    {
      bool loc0 = ({
        61: String.fromEnvironment(('K4\u2665dc0' + var6)),
        85: ((!(true)) ? 'I&P' : par1[(~((-((++var4)))))])
      }).isNotEmpty;
      {
        Map<int, String> loc1 =
            Map.from({55: (true ? '' : 'ZoDx\u{1f600}'), 82: foo0()});

        /// Single-line documentation comment.
        var3 = var3;
      }
      {
        int loc1 = 81;
        while (--loc1 > 0) {
          var3 = (!((List.filled(38, 87) !=
              ((false ? (true ? loc0 : true) : var3) ? var7 : var7))));
          try {
            par2 = var3;
            switch (loc1) {
              case 1947756698:
                {
                  var7 = [
                    [(--var1), -74, (-(Float32x4.ywyw))][((-(38)) | (var2--))],
                    Float32x4.yyzy,
                    (Int32x4.yxzx % Int32x4.ywyx),
                    var4,
                    (loc0 ? (var1--) : Float32x4.xzxy),
                    (-((~(-15))))
                  ];

                  /// Single-line documentation comment.
                  throw {
                    (true ? ((var4++) ~/ (-69 ?? 78)) : (var1--)),
                    (--var1),
                    (-((var2--))),
                    (-82 % (-30).bitLength),
                    14,
                    32768,
                    Int32x4.zxwy
                  };
                }
                break;
              case 1947756704:
                {
                  if (true) {
                    break;
                  }
                }
                break;
            }
          } catch (exception, stackTrace) {
            var6 = 'YgW\u{1f600}';
            if ((!(((true ? loc0 : var3) &&
                ((var3 ? ((var1++)).isFinite : par2) || var3))))) {
              try {
                return foo0();
              } catch (exception, stackTrace) {
                var6 = foo0();
              }
              par1 = ((par2 ? (par1 ?? Map.identity()) : var9) ?? var9);
            } else {
              var7 ??= var7;
              return 'ACaB#Z1';
            }
          }
        }
      }
    }
    for (int loc0 = 0; loc0 < 15; loc0++) {
      var7[(-(((Uint64List.bytesPerElement).isFinite ? -12 : -46)))] ~/= (true
          ? loc0
          : (~((var7[(14 >> (-((var1--))))] ^ (9223372032559808639 ?? loc0)))));
    }
  } finally {
    /*
     * Multi-line
     * comment.
     */
    try {
      {
        int loc0 = 73;
        while (--loc0 > 0) {
          {
            int loc1 = 0;
            do {
              var4 <<= loc0;
              for (int loc2 in var8) {
                par2 = true;
                par2 ??= (foo0()).isEmpty;
              }
            } while (++loc1 < 73);
          }
          var9 = var0;
        }
      }
      for (int loc0 = 0; loc0 < 96; loc0++) {
        /// Single-line documentation comment.
        try {
          par2 ??= ('(b').endsWith('x-f76ee');
          var3 = var3;
        } catch (exception, stackTrace) {
          var8 ??= foo1((var3 ? 51 : (false ? Int32x4.zzxy : (-((~(-84)))))),
              (NetworkInterface.listSupported || true));
        }
      }
    } catch (exception, stackTrace) {
      for (int loc0 in [
        (~((-(((par2 ? Int32x4.zzzw : var2) * (-(89))))))),
        -14,
        -88,
        (var4++),
        (var7[((var7[Float32x4.xxxx] % (~(var7[var4]))) | -16)] |
            (var7[Float32x4.zwwz] ^ -9223372036854775681))
      ]) {
        var7[(par2 ? 60 : (-7 >> -53))] ??= Int32x4.yzxw;
        for (int loc1
            in (var3 ? (((loc0 * var7[16])).toString()).codeUnits : var7)) {
          var0.forEach((loc2, loc3) {
            var3 ??= (foo0()).isNotEmpty;
            throw (var4++);
          });
        }
      }
    } finally {
      try {
        var8 = ((!(true))
            ? {Float32x4.zzwy, 67, -6, 85}
            : foo1(Float32x4.zwxy, var3));
        var8 = foo1(
            (-54).abs(),
            ((var3 ? true : (!(var3)))
                ? (!((Uri.encodeFull('aILQc')).endsWith('+7o0Q6b')))
                : ((true ? ('bEIx').endsWith(par1[var2]!) : par2)
                    ? false
                    : ({
                          -77,
                          (false ? -9223372036854775792 : 4294968296),
                          var4,
                          var7[var7[var7[var2]]]
                        } !=
                        {
                          var7[-80],
                          (true ? var7[22] : (-(58))),
                          -77,
                          (var7[Int32x4.wxwz] ~/ 66)
                        }))));
      } catch (exception, stackTrace) {
        try {
          var6 ??= par1[(('R12').isNotEmpty
              ? (par2 ? 4294967396 : var2)
              : (((var0).isEmpty ? true : par2) ? var4 : var2))]!;
          var8 ??= (var8 ??
              {
                (~(((var7[var2] ?? 86) >>
                    (((-(var7[var1]))).isNaN
                        ? (var3 ? (false ? -4294901760 : (-(var7[32]))) : var1)
                        : var4)))),
                Int32x4.wyzy
              });
        } catch (exception, stackTrace) {
          var9 = (Map.of({
                59: var6,
                3: var0[DateTime.may]!,
                49: par1[var2]!,
                71: '6',
                77: ((!(true)) ? ('QB\u2665OU6' ?? 'r-\u2665') : foo0()),
                88: foo0()
              }) ??
              var0);
          var6 ??= ((('').substring(40, (~(Int32x4.yxxx))) ??
                  ((var9[81] ?? '0(G') + ('u-+').toLowerCase())))
              .trimRight();
        }
        var7 = [-9223372032559808512];
      } finally {
        var4 -= var7[(++var2)];
      }
      var0.forEach((loc0, loc1) {
        switch (Int32x4.xyyw) {
          case 2310807338:
            {
              var9[((var7[var7[var1]] % (~(49))) & (~((var7[34]).toInt())))] ??=
                  ('5j' ?? 'jfHUh');
              var8 ??= ((!((!(var3))))
                  ? (par2
                      ? var8
                      : ((var7[(-38 - (var3 ? -38 : -91))]).isNegative
                          ? (true
                              ? (({-83, loc0} ??
                                      {
                                        var1,
                                        27,
                                        -73,
                                        var7[var4],
                                        (-88 +
                                            (~(((var3
                                                    ? ((-(-51)) + -60)
                                                    : var7[-21]) ??
                                                -65))))
                                      }))
                                  .difference({
                                  (-(Float32x4.yxzw)),
                                  (--var2),
                                  Int32x4.wywz,
                                  (-(((true
                                          ? (true
                                              ? (true ? (!(var3)) : true)
                                              : true)
                                          : (var8 != {(~(loc0)), 28, -96}))
                                      ? (par2
                                          ? ((par2
                                                  ? var7[var7[(++var4)]]
                                                  : (var4--)) +
                                              57)
                                          : ((((var3 ? false : true)
                                                      ? par2
                                                      : par2)
                                                  ? (var4 * var7[-74])
                                                  : var2) >>
                                              (false ? 63 : -23)))
                                      : (false ? -6 : (par2 ? 10 : var2))))),
                                  -35,
                                  (-(-92)),
                                  var7[DateTime.saturday]
                                })
                              : Set.identity())
                          : (par2
                              ? {(-((var2 | (-(-57)))))}
                              : ((var4 < 10)
                                  ? foo1(var7[8], par2)
                                  : (var3
                                      ? {96, 82, var7[(++var4)]}
                                      : {var2})))))
                  : foo1(
                      ((false || true)
                          ? loc0
                          : ((var3
                                  ? 49
                                  : ((var2 ?? var7[(-((~(23))))]) >> 97)) <<
                              var7[34])),
                      (!(par2))));
            }
            break;
          case 2310807345:
            {
              var8 ??= ((foo1((false ? var1 : (var4++)), (!(par2))) ??
                      ((var8 ??
                              {
                                var4,
                                -22,
                                (-(var7[((~(Float32x4.zyzx)) | var7[-23])])),
                                -35
                              }) ??
                          {var1, 21, var2, var7[Float32x4.ywyw], loc0})) ??
                  foo1(var7[(~(-75))], (!(false))));
              {
                int loc2 = 64;
                while (--loc2 > 0) {
                  var7 = var7;

                  /// Single-line documentation comment.
                  if (true) {
                    par2 = (var8).add(((var7[var1] + (-(4294967425))) ??
                        var7[((-(-9223372032559775745)) - (--var4))]));
                    if ((Map.from(par1)).isEmpty) {
                      var9 ??= ((Map.unmodifiable(Map.unmodifiable(par1)) ??
                              (((var2).isInfinite ? var9 : par1) ??
                                  Map.unmodifiable((par1 ?? par1)))) ??
                          (Map.unmodifiable({
                                51: par1[(~((~(Uint64List.bytesPerElement))))],
                                14: foo0(),
                                69: var0[var1],
                                56: loc1,
                                41: (false ? var0[Int32x4.yxwy] : loc1),
                                30: ((!(var3)) ? '' : 'L'),
                                80: 'UsR6'
                              }) ??
                              {
                                67: loc1,
                                73: ((var4).isEven
                                    ? ('' ?? (var3 ? foo0() : var6))
                                    : foo0())
                              }));
                    }
                  } else {
                    var7[(SecurityContext.alpnSupported
                        ? (~((true ? Float32x4.ywzw : -97)))
                        : loc2)] = (--var2);
                  }
                }
              }
            }
            break;
        }
        print(true);
      });
    }
    for (int loc0 in [
      (++var1),
      (var7[(~(((false ? (false && par2) : (71).isInfinite)
              ? var7[87]
              : -9223372028264841217)))] -
          var7[var2]),
      ((~((-(((true ? true : false)
              ? var7[-78]
              : (((false || false) ? true : (true && (false && true)))
                  ? var2
                  : (par2 ? -13 : 65))))))) >>
          ((var3 ? false : false) ? (~((~(-97)))) : Uint8List.bytesPerElement))
    ]) {
      // Single-line comment.
      break;
    }
  }
  return 'F+\u2665';
}

main() {
  try {
    foo2(
        ((var3 ? var9 : var0) ??
            {
              30: '',
              58: '\u2665bc',
              45: ' \u{1f600}',
              79: 'zLuiBp',
              2: 'X9\u{1f600}2Lq',
              78: 'PP6NIH',
              77: 'OB',
              80: 'EcL\u{1f600}yp'
            }),
        (!(((47).toString()).isEmpty)));
  } on OutOfMemoryError {
    print('oom');
    exit(254);
  } catch (e, st) {
    print('foo2 throws');
  }
}
