// ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field

// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
import 'dart:ffi' as ffi;
import 'package:ffi/ffi.dart' as pkg_ffi;

/// Tests calling Objective-C methods
class MethodTestObjCLibrary {
  /// Holds the symbol lookup function.
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;

  /// The symbols are looked up in [dynamicLibrary].
  MethodTestObjCLibrary(ffi.DynamicLibrary dynamicLibrary)
      : _lookup = dynamicLibrary.lookup;

  /// The symbols are looked up with [lookup].
  MethodTestObjCLibrary.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  late final ffi.Pointer<ffi.Double> _NSFoundationVersionNumber =
      _lookup<ffi.Double>('NSFoundationVersionNumber');

  double get NSFoundationVersionNumber => _NSFoundationVersionNumber.value;

  set NSFoundationVersionNumber(double value) =>
      _NSFoundationVersionNumber.value = value;

  late final ffi.Pointer<NSInteger> _NSNotFound =
      _lookup<NSInteger>('NSNotFound');

  int get NSNotFound => _NSNotFound.value;

  set NSNotFound(int value) => _NSNotFound.value = value;

  late final ffi.Pointer<ffi.Double> _kCFCoreFoundationVersionNumber =
      _lookup<ffi.Double>('kCFCoreFoundationVersionNumber');

  double get kCFCoreFoundationVersionNumber =>
      _kCFCoreFoundationVersionNumber.value;

  set kCFCoreFoundationVersionNumber(double value) =>
      _kCFCoreFoundationVersionNumber.value = value;

  late final ffi.Pointer<CFIndex> _kCFNotFound =
      _lookup<CFIndex>('kCFNotFound');

  int get kCFNotFound => _kCFNotFound.value;

  set kCFNotFound(int value) => _kCFNotFound.value = value;

  late final ffi.Pointer<CFNullRef> _kCFNull = _lookup<CFNullRef>('kCFNull');

  CFNullRef get kCFNull => _kCFNull.value;

  set kCFNull(CFNullRef value) => _kCFNull.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorDefault =
      _lookup<CFAllocatorRef>('kCFAllocatorDefault');

  CFAllocatorRef get kCFAllocatorDefault => _kCFAllocatorDefault.value;

  set kCFAllocatorDefault(CFAllocatorRef value) =>
      _kCFAllocatorDefault.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorSystemDefault =
      _lookup<CFAllocatorRef>('kCFAllocatorSystemDefault');

  CFAllocatorRef get kCFAllocatorSystemDefault =>
      _kCFAllocatorSystemDefault.value;

  set kCFAllocatorSystemDefault(CFAllocatorRef value) =>
      _kCFAllocatorSystemDefault.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorMalloc =
      _lookup<CFAllocatorRef>('kCFAllocatorMalloc');

  CFAllocatorRef get kCFAllocatorMalloc => _kCFAllocatorMalloc.value;

  set kCFAllocatorMalloc(CFAllocatorRef value) =>
      _kCFAllocatorMalloc.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorMallocZone =
      _lookup<CFAllocatorRef>('kCFAllocatorMallocZone');

  CFAllocatorRef get kCFAllocatorMallocZone => _kCFAllocatorMallocZone.value;

  set kCFAllocatorMallocZone(CFAllocatorRef value) =>
      _kCFAllocatorMallocZone.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorNull =
      _lookup<CFAllocatorRef>('kCFAllocatorNull');

  CFAllocatorRef get kCFAllocatorNull => _kCFAllocatorNull.value;

  set kCFAllocatorNull(CFAllocatorRef value) => _kCFAllocatorNull.value = value;

  late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorUseContext =
      _lookup<CFAllocatorRef>('kCFAllocatorUseContext');

  CFAllocatorRef get kCFAllocatorUseContext => _kCFAllocatorUseContext.value;

  set kCFAllocatorUseContext(CFAllocatorRef value) =>
      _kCFAllocatorUseContext.value = value;

  ffi.Pointer<ObjCSel> _sel_registerName(
    ffi.Pointer<pkg_ffi.Char> str,
  ) {
    return __sel_registerName(
      str,
    );
  }

  late final __sel_registerNamePtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCSel> Function(
              ffi.Pointer<pkg_ffi.Char>)>>('sel_registerName');
  late final __sel_registerName = __sel_registerNamePtr
      .asFunction<ffi.Pointer<ObjCSel> Function(ffi.Pointer<pkg_ffi.Char>)>();

  ffi.Pointer<ObjCObject> _objc_getClass(
    ffi.Pointer<pkg_ffi.Char> str,
  ) {
    return __objc_getClass(
      str,
    );
  }

  late final __objc_getClassPtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<pkg_ffi.Char>)>>('objc_getClass');
  late final __objc_getClass = __objc_getClassPtr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<pkg_ffi.Char>)>();

  void _objc_msgSend_0(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_0(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_0Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_0 = __objc_msgSend_0Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  instancetype _objc_msgSend_1(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_1(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_1Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_1 = __objc_msgSend_1Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  instancetype _objc_msgSend_2(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<_NSZone> zone,
  ) {
    return __objc_msgSend_2(
      obj,
      sel,
      zone,
    );
  }

  late final __objc_msgSend_2Ptr = _lookup<
      ffi.NativeFunction<
          instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<_NSZone>)>>('objc_msgSend');
  late final __objc_msgSend_2 = __objc_msgSend_2Ptr.asFunction<
      instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<_NSZone>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_3(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_3(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_3Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_3 = __objc_msgSend_3Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_4(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_4(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_4Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_4 = __objc_msgSend_4Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_5(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<_NSZone> zone,
  ) {
    return __objc_msgSend_5(
      obj,
      sel,
      zone,
    );
  }

  late final __objc_msgSend_5Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>>('objc_msgSend');
  late final __objc_msgSend_5 = __objc_msgSend_5Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_6(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<_NSZone> zone,
  ) {
    return __objc_msgSend_6(
      obj,
      sel,
      zone,
    );
  }

  late final __objc_msgSend_6Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>>('objc_msgSend');
  late final __objc_msgSend_6 = __objc_msgSend_6Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<_NSZone>)>();

  bool _objc_msgSend_7(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_7(
          obj,
          sel,
          aSelector,
        ) !=
        0;
  }

  late final __objc_msgSend_7Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_7 = __objc_msgSend_7Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_8(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> protocol,
  ) {
    return __objc_msgSend_8(
          obj,
          sel,
          protocol,
        ) !=
        0;
  }

  late final __objc_msgSend_8Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_8 = __objc_msgSend_8Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  IMP _objc_msgSend_9(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_9(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_9Ptr = _lookup<
      ffi.NativeFunction<
          IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction<
      IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  IMP _objc_msgSend_10(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_10(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_10Ptr = _lookup<
      ffi.NativeFunction<
          IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_10 = __objc_msgSend_10Ptr.asFunction<
      IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  void _objc_msgSend_11(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_11(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_11Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_11 = __objc_msgSend_11Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_12(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_12(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_12Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_12 = __objc_msgSend_12Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

  void _objc_msgSend_13(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> anInvocation,
  ) {
    return __objc_msgSend_13(
      obj,
      sel,
      anInvocation,
    );
  }

  late final __objc_msgSend_13Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction<
      void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_14(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_14(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_14Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_14 = __objc_msgSend_14Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_15(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> aSelector,
  ) {
    return __objc_msgSend_15(
      obj,
      sel,
      aSelector,
    );
  }

  late final __objc_msgSend_15Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_15 = __objc_msgSend_15Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_16(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_16(
          obj,
          sel,
        ) !=
        0;
  }

  late final __objc_msgSend_16Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_16 = __objc_msgSend_16Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_17(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCObject> aClass,
  ) {
    return __objc_msgSend_17(
          obj,
          sel,
          aClass,
        ) !=
        0;
  }

  late final __objc_msgSend_17Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCObject>)>>('objc_msgSend');
  late final __objc_msgSend_17 = __objc_msgSend_17Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCObject>)>();

  bool _objc_msgSend_18(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> sel1,
  ) {
    return __objc_msgSend_18(
          obj,
          sel,
          sel1,
        ) !=
        0;
  }

  late final __objc_msgSend_18Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_18 = __objc_msgSend_18Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  bool _objc_msgSend_19(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<ObjCSel> sel1,
  ) {
    return __objc_msgSend_19(
          obj,
          sel,
          sel1,
        ) !=
        0;
  }

  late final __objc_msgSend_19Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_19 = __objc_msgSend_19Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
          ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_20(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_20(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_20Ptr = _lookup<
      ffi.NativeFunction<
          NSUInteger Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_20 = __objc_msgSend_20Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_21(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_21(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_21Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_21 = __objc_msgSend_21Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_22(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_22(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_22Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_22 = __objc_msgSend_22Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_23(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    ffi.Pointer<pkg_ffi.Char> cString,
    int enc,
  ) {
    return __objc_msgSend_23(
      obj,
      sel,
      cString,
      enc,
    );
  }

  late final __objc_msgSend_23Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>,
              ffi.Pointer<ObjCSel>,
              ffi.Pointer<pkg_ffi.Char>,
              pkg_ffi.UnsignedInt)>>('objc_msgSend');
  late final __objc_msgSend_23 = __objc_msgSend_23Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>,
          ffi.Pointer<ObjCSel>, ffi.Pointer<pkg_ffi.Char>, int)>();

  ffi.Pointer<pkg_ffi.Char> _objc_msgSend_24(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_24(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_24Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<pkg_ffi.Char> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_24 = __objc_msgSend_24Ptr.asFunction<
      ffi.Pointer<pkg_ffi.Char> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  ffi.Pointer<ObjCObject> _objc_msgSend_25(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_25(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_25Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ObjCObject> Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_25 = __objc_msgSend_25Ptr.asFunction<
      ffi.Pointer<ObjCObject> Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_26(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
  ) {
    return __objc_msgSend_26(
      obj,
      sel,
    );
  }

  late final __objc_msgSend_26Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend');
  late final __objc_msgSend_26 = __objc_msgSend_26Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>();

  int _objc_msgSend_27(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int x,
  ) {
    return __objc_msgSend_27(
      obj,
      sel,
      x,
    );
  }

  late final __objc_msgSend_27Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Int32)>>('objc_msgSend');
  late final __objc_msgSend_27 = __objc_msgSend_27Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int)>();

  int _objc_msgSend_28(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int x,
    int y,
  ) {
    return __objc_msgSend_28(
      obj,
      sel,
      x,
      y,
    );
  }

  late final __objc_msgSend_28Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Int32, ffi.Int32)>>('objc_msgSend');
  late final __objc_msgSend_28 = __objc_msgSend_28Ptr.asFunction<
      int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int)>();

  int _objc_msgSend_29(
    ffi.Pointer<ObjCObject> obj,
    ffi.Pointer<ObjCSel> sel,
    int x,
    int y,
    int z,
  ) {
    return __objc_msgSend_29(
      obj,
      sel,
      x,
      y,
      z,
    );
  }

  late final __objc_msgSend_29Ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>,
              ffi.Int32, ffi.Int32, ffi.Int32)>>('objc_msgSend');
  late final __objc_msgSend_29 = __objc_msgSend_29Ptr.asFunction<
      int Function(
          ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, int, int, int)>();
}

abstract class NSComparisonResult {
  static const int NSOrderedAscending = -1;
  static const int NSOrderedSame = 0;
  static const int NSOrderedDescending = 1;
}

abstract class NSEnumerationOptions {
  static const int NSEnumerationConcurrent = 1;
  static const int NSEnumerationReverse = 2;
}

abstract class NSSortOptions {
  static const int NSSortConcurrent = 1;
  static const int NSSortStable = 16;
}

abstract class NSQualityOfService {
  static const int NSQualityOfServiceUserInteractive = 33;
  static const int NSQualityOfServiceUserInitiated = 25;
  static const int NSQualityOfServiceUtility = 17;
  static const int NSQualityOfServiceBackground = 9;
  static const int NSQualityOfServiceDefault = -1;
}

typedef NSInteger = pkg_ffi.Long;

class __CFString extends ffi.Opaque {}

abstract class CFComparisonResult {
  static const int kCFCompareLessThan = -1;
  static const int kCFCompareEqualTo = 0;
  static const int kCFCompareGreaterThan = 1;
}

typedef CFIndex = pkg_ffi.Long;

class CFRange extends ffi.Struct {
  @CFIndex()
  external int location;

  @CFIndex()
  external int length;
}

class __CFNull extends ffi.Opaque {}

typedef CFNullRef = ffi.Pointer<__CFNull>;

class __CFAllocator extends ffi.Opaque {}

typedef CFAllocatorRef = ffi.Pointer<__CFAllocator>;

class CFAllocatorContext extends ffi.Struct {
  @CFIndex()
  external int version;

  external ffi.Pointer<ffi.Void> info;

  external CFAllocatorRetainCallBack retain;

  external CFAllocatorReleaseCallBack release;

  external CFAllocatorCopyDescriptionCallBack copyDescription;

  external CFAllocatorAllocateCallBack allocate;

  external CFAllocatorReallocateCallBack reallocate;

  external CFAllocatorDeallocateCallBack deallocate;

  external CFAllocatorPreferredSizeCallBack preferredSize;
}

typedef CFAllocatorRetainCallBack = ffi.Pointer<
    ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorReleaseCallBack
    = ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorCopyDescriptionCallBack = ffi
    .Pointer<ffi.NativeFunction<CFStringRef Function(ffi.Pointer<ffi.Void>)>>;
typedef CFStringRef = ffi.Pointer<__CFString>;
typedef CFAllocatorAllocateCallBack = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Pointer<ffi.Void> Function(
            CFIndex, CFOptionFlags, ffi.Pointer<ffi.Void>)>>;
typedef CFOptionFlags = pkg_ffi.UnsignedLong;
typedef CFAllocatorReallocateCallBack = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, CFIndex,
            CFOptionFlags, ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorDeallocateCallBack = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>;
typedef CFAllocatorPreferredSizeCallBack = ffi.Pointer<
    ffi.NativeFunction<
        CFIndex Function(CFIndex, CFOptionFlags, ffi.Pointer<ffi.Void>)>>;

ffi.Pointer<ObjCSel> _registerName(MethodTestObjCLibrary _lib, String name) {
  final cstr = name.toNativeUtf8();
  final sel = _lib._sel_registerName(cstr.cast());
  pkg_ffi.calloc.free(cstr);
  return sel;
}

ffi.Pointer<ObjCObject> _getClass(MethodTestObjCLibrary _lib, String name) {
  final cstr = name.toNativeUtf8();
  final clazz = _lib._objc_getClass(cstr.cast());
  pkg_ffi.calloc.free(cstr);
  return clazz;
}

class _ObjCWrapper {
  final ffi.Pointer<ObjCObject> _id;
  final MethodTestObjCLibrary _lib;
  _ObjCWrapper._(this._id, this._lib);
}

class MethodInterface extends NSObject {
  MethodInterface._(ffi.Pointer<ObjCObject> id, MethodTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static MethodInterface castFrom<T extends _ObjCWrapper>(T other) {
    return MethodInterface._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_add;
  int add() {
    _sel_add ??= _registerName(_lib, "add");
    return _lib._objc_msgSend_26(_id, _sel_add!);
  }

  static ffi.Pointer<ObjCSel>? _sel_add1;
  int add1(int x) {
    _sel_add1 ??= _registerName(_lib, "add:");
    return _lib._objc_msgSend_27(_id, _sel_add1!, x);
  }

  static ffi.Pointer<ObjCSel>? _sel_add_Y;
  int add_Y(int x, int y) {
    _sel_add_Y ??= _registerName(_lib, "add:Y:");
    return _lib._objc_msgSend_28(_id, _sel_add_Y!, x, y);
  }

  static ffi.Pointer<ObjCSel>? _sel_add_Y_Z;
  int add_Y_Z(int x, int y, int z) {
    _sel_add_Y_Z ??= _registerName(_lib, "add:Y:Z:");
    return _lib._objc_msgSend_29(_id, _sel_add_Y_Z!, x, y, z);
  }

  static ffi.Pointer<ObjCSel>? _sel_sub;
  static int sub(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "MethodInterface");
    _sel_sub ??= _registerName(_lib, "sub");
    return _lib._objc_msgSend_26(_class!, _sel_sub!);
  }

  static ffi.Pointer<ObjCSel>? _sel_sub1;
  static int sub1(MethodTestObjCLibrary _lib, int x) {
    _class ??= _getClass(_lib, "MethodInterface");
    _sel_sub1 ??= _registerName(_lib, "sub:");
    return _lib._objc_msgSend_27(_class!, _sel_sub1!, x);
  }

  static ffi.Pointer<ObjCSel>? _sel_sub_Y;
  static int sub_Y(MethodTestObjCLibrary _lib, int x, int y) {
    _class ??= _getClass(_lib, "MethodInterface");
    _sel_sub_Y ??= _registerName(_lib, "sub:Y:");
    return _lib._objc_msgSend_28(_class!, _sel_sub_Y!, x, y);
  }

  static ffi.Pointer<ObjCSel>? _sel_sub_Y_Z;
  static int sub_Y_Z(MethodTestObjCLibrary _lib, int x, int y, int z) {
    _class ??= _getClass(_lib, "MethodInterface");
    _sel_sub_Y_Z ??= _registerName(_lib, "sub:Y:Z:");
    return _lib._objc_msgSend_29(_class!, _sel_sub_Y_Z!, x, y, z);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static MethodInterface new1(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "MethodInterface");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return MethodInterface._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static MethodInterface alloc(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "MethodInterface");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return MethodInterface._(_ret, _lib);
  }
}

class NSObject extends _ObjCWrapper {
  NSObject._(ffi.Pointer<ObjCObject> id, MethodTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSObject castFrom<T extends _ObjCWrapper>(T other) {
    return NSObject._(other._id, other._lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_load;
  static void load(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_load ??= _registerName(_lib, "load");
    _lib._objc_msgSend_0(_class!, _sel_load!);
  }

  static ffi.Pointer<ObjCSel>? _sel_initialize;
  static void initialize(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_initialize ??= _registerName(_lib, "initialize");
    _lib._objc_msgSend_0(_class!, _sel_initialize!);
  }

  static ffi.Pointer<ObjCSel>? _sel_init;
  NSObject init() {
    _sel_init ??= _registerName(_lib, "init");
    final _ret = _lib._objc_msgSend_1(_id, _sel_init!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_new1;
  static NSObject new1(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_new1 ??= _registerName(_lib, "new");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_new1!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_allocWithZone;
  static NSObject allocWithZone(
      MethodTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_allocWithZone ??= _registerName(_lib, "allocWithZone:");
    final _ret = _lib._objc_msgSend_2(_class!, _sel_allocWithZone!, zone);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_alloc;
  static NSObject alloc(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_alloc ??= _registerName(_lib, "alloc");
    final _ret = _lib._objc_msgSend_1(_class!, _sel_alloc!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_dealloc;
  void dealloc() {
    _sel_dealloc ??= _registerName(_lib, "dealloc");
    _lib._objc_msgSend_0(_id, _sel_dealloc!);
  }

  static ffi.Pointer<ObjCSel>? _sel_finalize;
  void finalize() {
    _sel_finalize ??= _registerName(_lib, "finalize");
    _lib._objc_msgSend_0(_id, _sel_finalize!);
  }

  static ffi.Pointer<ObjCSel>? _sel_copy;
  NSObject copy() {
    _sel_copy ??= _registerName(_lib, "copy");
    final _ret = _lib._objc_msgSend_3(_id, _sel_copy!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_mutableCopy;
  NSObject mutableCopy() {
    _sel_mutableCopy ??= _registerName(_lib, "mutableCopy");
    final _ret = _lib._objc_msgSend_4(_id, _sel_mutableCopy!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_copyWithZone;
  static NSObject copyWithZone(
      MethodTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_copyWithZone ??= _registerName(_lib, "copyWithZone:");
    final _ret = _lib._objc_msgSend_5(_class!, _sel_copyWithZone!, zone);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_mutableCopyWithZone;
  static NSObject mutableCopyWithZone(
      MethodTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_mutableCopyWithZone ??= _registerName(_lib, "mutableCopyWithZone:");
    final _ret = _lib._objc_msgSend_6(_class!, _sel_mutableCopyWithZone!, zone);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_instancesRespondToSelector;
  static bool instancesRespondToSelector(
      MethodTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_instancesRespondToSelector ??=
        _registerName(_lib, "instancesRespondToSelector:");
    return _lib._objc_msgSend_7(
        _class!, _sel_instancesRespondToSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_conformsToProtocol;
  static bool conformsToProtocol(
      MethodTestObjCLibrary _lib, NSObject protocol) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_conformsToProtocol ??= _registerName(_lib, "conformsToProtocol:");
    return _lib._objc_msgSend_8(
        _class!, _sel_conformsToProtocol!, protocol._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_methodForSelector;
  IMP methodForSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_methodForSelector ??= _registerName(_lib, "methodForSelector:");
    return _lib._objc_msgSend_9(_id, _sel_methodForSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_instanceMethodForSelector;
  static IMP instanceMethodForSelector(
      MethodTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_instanceMethodForSelector ??=
        _registerName(_lib, "instanceMethodForSelector:");
    return _lib._objc_msgSend_10(
        _class!, _sel_instanceMethodForSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_doesNotRecognizeSelector;
  void doesNotRecognizeSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_doesNotRecognizeSelector ??=
        _registerName(_lib, "doesNotRecognizeSelector:");
    _lib._objc_msgSend_11(_id, _sel_doesNotRecognizeSelector!, aSelector);
  }

  static ffi.Pointer<ObjCSel>? _sel_forwardingTargetForSelector;
  NSObject forwardingTargetForSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_forwardingTargetForSelector ??=
        _registerName(_lib, "forwardingTargetForSelector:");
    final _ret = _lib._objc_msgSend_12(
        _id, _sel_forwardingTargetForSelector!, aSelector);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_forwardInvocation;
  void forwardInvocation(NSObject anInvocation) {
    _sel_forwardInvocation ??= _registerName(_lib, "forwardInvocation:");
    _lib._objc_msgSend_13(_id, _sel_forwardInvocation!, anInvocation._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_methodSignatureForSelector;
  NSMethodSignature methodSignatureForSelector(ffi.Pointer<ObjCSel> aSelector) {
    _sel_methodSignatureForSelector ??=
        _registerName(_lib, "methodSignatureForSelector:");
    final _ret =
        _lib._objc_msgSend_14(_id, _sel_methodSignatureForSelector!, aSelector);
    return NSMethodSignature._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_instanceMethodSignatureForSelector;
  static NSMethodSignature instanceMethodSignatureForSelector(
      MethodTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_instanceMethodSignatureForSelector ??=
        _registerName(_lib, "instanceMethodSignatureForSelector:");
    final _ret = _lib._objc_msgSend_15(
        _class!, _sel_instanceMethodSignatureForSelector!, aSelector);
    return NSMethodSignature._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_allowsWeakReference;
  bool allowsWeakReference() {
    _sel_allowsWeakReference ??= _registerName(_lib, "allowsWeakReference");
    return _lib._objc_msgSend_16(_id, _sel_allowsWeakReference!);
  }

  static ffi.Pointer<ObjCSel>? _sel_retainWeakReference;
  bool retainWeakReference() {
    _sel_retainWeakReference ??= _registerName(_lib, "retainWeakReference");
    return _lib._objc_msgSend_16(_id, _sel_retainWeakReference!);
  }

  static ffi.Pointer<ObjCSel>? _sel_isSubclassOfClass;
  static bool isSubclassOfClass(MethodTestObjCLibrary _lib, NSObject aClass) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_isSubclassOfClass ??= _registerName(_lib, "isSubclassOfClass:");
    return _lib._objc_msgSend_17(_class!, _sel_isSubclassOfClass!, aClass._id);
  }

  static ffi.Pointer<ObjCSel>? _sel_resolveClassMethod;
  static bool resolveClassMethod(
      MethodTestObjCLibrary _lib, ffi.Pointer<ObjCSel> sel) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_resolveClassMethod ??= _registerName(_lib, "resolveClassMethod:");
    return _lib._objc_msgSend_18(_class!, _sel_resolveClassMethod!, sel);
  }

  static ffi.Pointer<ObjCSel>? _sel_resolveInstanceMethod;
  static bool resolveInstanceMethod(
      MethodTestObjCLibrary _lib, ffi.Pointer<ObjCSel> sel) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_resolveInstanceMethod ??=
        _registerName(_lib, "resolveInstanceMethod:");
    return _lib._objc_msgSend_19(_class!, _sel_resolveInstanceMethod!, sel);
  }

  static ffi.Pointer<ObjCSel>? _sel_hash;
  static int hash(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_hash ??= _registerName(_lib, "hash");
    return _lib._objc_msgSend_20(_class!, _sel_hash!);
  }

  static ffi.Pointer<ObjCSel>? _sel_superclass;
  static NSObject superclass(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_superclass ??= _registerName(_lib, "superclass");
    final _ret = _lib._objc_msgSend_21(_class!, _sel_superclass!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_class1;
  static NSObject class1(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_class1 ??= _registerName(_lib, "class");
    final _ret = _lib._objc_msgSend_22(_class!, _sel_class1!);
    return NSObject._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_description;
  static NSString description(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_description ??= _registerName(_lib, "description");
    final _ret = _lib._objc_msgSend_25(_class!, _sel_description!);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_debugDescription;
  static NSString debugDescription(MethodTestObjCLibrary _lib) {
    _class ??= _getClass(_lib, "NSObject");
    _sel_debugDescription ??= _registerName(_lib, "debugDescription");
    final _ret = _lib._objc_msgSend_25(_class!, _sel_debugDescription!);
    return NSString._(_ret, _lib);
  }
}

typedef instancetype = ffi.Pointer<ObjCObject>;

class ObjCObject extends ffi.Opaque {}

class _NSZone extends ffi.Opaque {}

class ObjCSel extends ffi.Opaque {}

typedef IMP = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>;

class NSMethodSignature extends _ObjCWrapper {
  NSMethodSignature._(ffi.Pointer<ObjCObject> id, MethodTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) {
    return NSMethodSignature._(other._id, other._lib);
  }
}

typedef NSUInteger = pkg_ffi.UnsignedLong;

class NSString extends _ObjCWrapper {
  NSString._(ffi.Pointer<ObjCObject> id, MethodTestObjCLibrary lib)
      : super._(id, lib);

  static ffi.Pointer<ObjCObject>? _class;

  static NSString castFrom<T extends _ObjCWrapper>(T other) {
    return NSString._(other._id, other._lib);
  }

  factory NSString(MethodTestObjCLibrary _lib, String str) {
    final cstr = str.toNativeUtf8();
    final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
    pkg_ffi.calloc.free(cstr);
    return nsstr;
  }

  @override
  String toString() => UTF8String().cast<pkg_ffi.Utf8>().toDartString();

  static ffi.Pointer<ObjCSel>? _sel_stringWithCString_encoding;
  static NSString stringWithCString_encoding(
      MethodTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) {
    _class ??= _getClass(_lib, "NSString");
    _sel_stringWithCString_encoding ??=
        _registerName(_lib, "stringWithCString:encoding:");
    final _ret = _lib._objc_msgSend_23(
        _class!, _sel_stringWithCString_encoding!, cString, enc);
    return NSString._(_ret, _lib);
  }

  static ffi.Pointer<ObjCSel>? _sel_UTF8String;
  ffi.Pointer<pkg_ffi.Char> UTF8String() {
    _sel_UTF8String ??= _registerName(_lib, "UTF8String");
    return _lib._objc_msgSend_24(_id, _sel_UTF8String!);
  }
}

extension StringToNSString on String {
  NSString toNSString(MethodTestObjCLibrary lib) => NSString(lib, this);
}

const int NSScannedOption = 1;

const int NSCollectorDisabledOption = 2;

const int NS_BLOCKS_AVAILABLE = 1;

const int __COREFOUNDATION_CFAVAILABILITY__ = 1;

const int __CF_ENUM_FIXED_IS_AVAILABLE = 1;

const double NSFoundationVersionNumber10_0 = 397.4;

const double NSFoundationVersionNumber10_1 = 425.0;

const double NSFoundationVersionNumber10_1_1 = 425.0;

const double NSFoundationVersionNumber10_1_2 = 425.0;

const double NSFoundationVersionNumber10_1_3 = 425.0;

const double NSFoundationVersionNumber10_1_4 = 425.0;

const double NSFoundationVersionNumber10_2 = 462.0;

const double NSFoundationVersionNumber10_2_1 = 462.0;

const double NSFoundationVersionNumber10_2_2 = 462.0;

const double NSFoundationVersionNumber10_2_3 = 462.0;

const double NSFoundationVersionNumber10_2_4 = 462.0;

const double NSFoundationVersionNumber10_2_5 = 462.0;

const double NSFoundationVersionNumber10_2_6 = 462.0;

const double NSFoundationVersionNumber10_2_7 = 462.7;

const double NSFoundationVersionNumber10_2_8 = 462.7;

const double NSFoundationVersionNumber10_3 = 500.0;

const double NSFoundationVersionNumber10_3_1 = 500.0;

const double NSFoundationVersionNumber10_3_2 = 500.3;

const double NSFoundationVersionNumber10_3_3 = 500.54;

const double NSFoundationVersionNumber10_3_4 = 500.56;

const double NSFoundationVersionNumber10_3_5 = 500.56;

const double NSFoundationVersionNumber10_3_6 = 500.56;

const double NSFoundationVersionNumber10_3_7 = 500.56;

const double NSFoundationVersionNumber10_3_8 = 500.56;

const double NSFoundationVersionNumber10_3_9 = 500.58;

const double NSFoundationVersionNumber10_4 = 567.0;

const double NSFoundationVersionNumber10_4_1 = 567.0;

const double NSFoundationVersionNumber10_4_2 = 567.12;

const double NSFoundationVersionNumber10_4_3 = 567.21;

const double NSFoundationVersionNumber10_4_4_Intel = 567.23;

const double NSFoundationVersionNumber10_4_4_PowerPC = 567.21;

const double NSFoundationVersionNumber10_4_5 = 567.25;

const double NSFoundationVersionNumber10_4_6 = 567.26;

const double NSFoundationVersionNumber10_4_7 = 567.27;

const double NSFoundationVersionNumber10_4_8 = 567.28;

const double NSFoundationVersionNumber10_4_9 = 567.29;

const double NSFoundationVersionNumber10_4_10 = 567.29;

const double NSFoundationVersionNumber10_4_11 = 567.36;

const double NSFoundationVersionNumber10_5 = 677.0;

const double NSFoundationVersionNumber10_5_1 = 677.1;

const double NSFoundationVersionNumber10_5_2 = 677.15;

const double NSFoundationVersionNumber10_5_3 = 677.19;

const double NSFoundationVersionNumber10_5_4 = 677.19;

const double NSFoundationVersionNumber10_5_5 = 677.21;

const double NSFoundationVersionNumber10_5_6 = 677.22;

const double NSFoundationVersionNumber10_5_7 = 677.24;

const double NSFoundationVersionNumber10_5_8 = 677.26;

const double NSFoundationVersionNumber10_6 = 751.0;

const double NSFoundationVersionNumber10_6_1 = 751.0;

const double NSFoundationVersionNumber10_6_2 = 751.14;

const double NSFoundationVersionNumber10_6_3 = 751.21;

const double NSFoundationVersionNumber10_6_4 = 751.29;

const double NSFoundationVersionNumber10_6_5 = 751.42;

const double NSFoundationVersionNumber10_6_6 = 751.53;

const double NSFoundationVersionNumber10_6_7 = 751.53;

const double NSFoundationVersionNumber10_6_8 = 751.62;

const double NSFoundationVersionNumber10_7 = 833.1;

const double NSFoundationVersionNumber10_7_1 = 833.1;

const double NSFoundationVersionNumber10_7_2 = 833.2;

const double NSFoundationVersionNumber10_7_3 = 833.24;

const double NSFoundationVersionNumber10_7_4 = 833.25;

const double NSFoundationVersionNumber10_8 = 945.0;

const double NSFoundationVersionNumber10_8_1 = 945.0;

const double NSFoundationVersionNumber10_8_2 = 945.11;

const double NSFoundationVersionNumber10_8_3 = 945.16;

const double NSFoundationVersionNumber10_8_4 = 945.18;

const int NSFoundationVersionNumber10_9 = 1056;

const int NSFoundationVersionNumber10_9_1 = 1056;

const double NSFoundationVersionNumber10_9_2 = 1056.13;

const double NSFoundationVersionNumber10_10 = 1151.16;

const double NSFoundationVersionNumber10_10_1 = 1151.16;

const double NSFoundationVersionNumber10_10_2 = 1152.14;

const double NSFoundationVersionNumber10_10_3 = 1153.2;

const double NSFoundationVersionNumber10_10_4 = 1153.2;

const int NSFoundationVersionNumber10_10_5 = 1154;

const int NSFoundationVersionNumber10_10_Max = 1199;

const int NSFoundationVersionNumber10_11 = 1252;

const double NSFoundationVersionNumber10_11_1 = 1255.1;

const double NSFoundationVersionNumber10_11_2 = 1256.1;

const double NSFoundationVersionNumber10_11_3 = 1256.1;

const int NSFoundationVersionNumber10_11_4 = 1258;

const int NSFoundationVersionNumber10_11_Max = 1299;

const int __COREFOUNDATION_CFBASE__ = 1;

const int TRUE = 1;

const int FALSE = 0;

const double kCFCoreFoundationVersionNumber10_0 = 196.4;

const double kCFCoreFoundationVersionNumber10_0_3 = 196.5;

const double kCFCoreFoundationVersionNumber10_1 = 226.0;

const double kCFCoreFoundationVersionNumber10_1_1 = 226.0;

const double kCFCoreFoundationVersionNumber10_1_2 = 227.2;

const double kCFCoreFoundationVersionNumber10_1_3 = 227.2;

const double kCFCoreFoundationVersionNumber10_1_4 = 227.3;

const double kCFCoreFoundationVersionNumber10_2 = 263.0;

const double kCFCoreFoundationVersionNumber10_2_1 = 263.1;

const double kCFCoreFoundationVersionNumber10_2_2 = 263.1;

const double kCFCoreFoundationVersionNumber10_2_3 = 263.3;

const double kCFCoreFoundationVersionNumber10_2_4 = 263.3;

const double kCFCoreFoundationVersionNumber10_2_5 = 263.5;

const double kCFCoreFoundationVersionNumber10_2_6 = 263.5;

const double kCFCoreFoundationVersionNumber10_2_7 = 263.5;

const double kCFCoreFoundationVersionNumber10_2_8 = 263.5;

const double kCFCoreFoundationVersionNumber10_3 = 299.0;

const double kCFCoreFoundationVersionNumber10_3_1 = 299.0;

const double kCFCoreFoundationVersionNumber10_3_2 = 299.0;

const double kCFCoreFoundationVersionNumber10_3_3 = 299.3;

const double kCFCoreFoundationVersionNumber10_3_4 = 299.31;

const double kCFCoreFoundationVersionNumber10_3_5 = 299.31;

const double kCFCoreFoundationVersionNumber10_3_6 = 299.32;

const double kCFCoreFoundationVersionNumber10_3_7 = 299.33;

const double kCFCoreFoundationVersionNumber10_3_8 = 299.33;

const double kCFCoreFoundationVersionNumber10_3_9 = 299.35;

const double kCFCoreFoundationVersionNumber10_4 = 368.0;

const double kCFCoreFoundationVersionNumber10_4_1 = 368.1;

const double kCFCoreFoundationVersionNumber10_4_2 = 368.11;

const double kCFCoreFoundationVersionNumber10_4_3 = 368.18;

const double kCFCoreFoundationVersionNumber10_4_4_Intel = 368.26;

const double kCFCoreFoundationVersionNumber10_4_4_PowerPC = 368.25;

const double kCFCoreFoundationVersionNumber10_4_5_Intel = 368.26;

const double kCFCoreFoundationVersionNumber10_4_5_PowerPC = 368.25;

const double kCFCoreFoundationVersionNumber10_4_6_Intel = 368.26;

const double kCFCoreFoundationVersionNumber10_4_6_PowerPC = 368.25;

const double kCFCoreFoundationVersionNumber10_4_7 = 368.27;

const double kCFCoreFoundationVersionNumber10_4_8 = 368.27;

const double kCFCoreFoundationVersionNumber10_4_9 = 368.28;

const double kCFCoreFoundationVersionNumber10_4_10 = 368.28;

const double kCFCoreFoundationVersionNumber10_4_11 = 368.31;

const double kCFCoreFoundationVersionNumber10_5 = 476.0;

const double kCFCoreFoundationVersionNumber10_5_1 = 476.0;

const double kCFCoreFoundationVersionNumber10_5_2 = 476.1;

const double kCFCoreFoundationVersionNumber10_5_3 = 476.13;

const double kCFCoreFoundationVersionNumber10_5_4 = 476.14;

const double kCFCoreFoundationVersionNumber10_5_5 = 476.15;

const double kCFCoreFoundationVersionNumber10_5_6 = 476.17;

const double kCFCoreFoundationVersionNumber10_5_7 = 476.18;

const double kCFCoreFoundationVersionNumber10_5_8 = 476.19;

const double kCFCoreFoundationVersionNumber10_6 = 550.0;

const double kCFCoreFoundationVersionNumber10_6_1 = 550.0;

const double kCFCoreFoundationVersionNumber10_6_2 = 550.13;

const double kCFCoreFoundationVersionNumber10_6_3 = 550.19;

const double kCFCoreFoundationVersionNumber10_6_4 = 550.29;

const double kCFCoreFoundationVersionNumber10_6_5 = 550.42;

const double kCFCoreFoundationVersionNumber10_6_6 = 550.42;

const double kCFCoreFoundationVersionNumber10_6_7 = 550.42;

const double kCFCoreFoundationVersionNumber10_6_8 = 550.43;

const double kCFCoreFoundationVersionNumber10_7 = 635.0;

const double kCFCoreFoundationVersionNumber10_7_1 = 635.0;

const double kCFCoreFoundationVersionNumber10_7_2 = 635.15;

const double kCFCoreFoundationVersionNumber10_7_3 = 635.19;

const double kCFCoreFoundationVersionNumber10_7_4 = 635.21;

const double kCFCoreFoundationVersionNumber10_7_5 = 635.21;

const double kCFCoreFoundationVersionNumber10_8 = 744.0;

const double kCFCoreFoundationVersionNumber10_8_1 = 744.0;

const double kCFCoreFoundationVersionNumber10_8_2 = 744.12;

const double kCFCoreFoundationVersionNumber10_8_3 = 744.18;

const double kCFCoreFoundationVersionNumber10_8_4 = 744.19;

const double kCFCoreFoundationVersionNumber10_9 = 855.11;

const double kCFCoreFoundationVersionNumber10_9_1 = 855.11;

const double kCFCoreFoundationVersionNumber10_9_2 = 855.14;

const double kCFCoreFoundationVersionNumber10_10 = 1151.16;

const double kCFCoreFoundationVersionNumber10_10_1 = 1151.16;

const int kCFCoreFoundationVersionNumber10_10_2 = 1152;

const double kCFCoreFoundationVersionNumber10_10_3 = 1153.18;

const double kCFCoreFoundationVersionNumber10_10_4 = 1153.18;

const double kCFCoreFoundationVersionNumber10_10_5 = 1153.18;

const int kCFCoreFoundationVersionNumber10_10_Max = 1199;

const int kCFCoreFoundationVersionNumber10_11 = 1253;

const double kCFCoreFoundationVersionNumber10_11_1 = 1255.1;

const double kCFCoreFoundationVersionNumber10_11_2 = 1256.14;

const double kCFCoreFoundationVersionNumber10_11_3 = 1256.14;

const double kCFCoreFoundationVersionNumber10_11_4 = 1258.1;

const int kCFCoreFoundationVersionNumber10_11_Max = 1299;

const int ISA_PTRAUTH_DISCRIMINATOR = 27361;
