library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;

extension /* unnamed */ _extension#0 on core::int {
  method _laterUnnamedParameter = self::_extension#0|_laterUnnamedParameter;
  method tearoff _laterUnnamedParameter = self::_extension#0|get#_laterUnnamedParameter;
  method _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter;
  method tearoff _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|get#_laterUnnamedParameterDependsOnNamedParameter;
  method _earlierUnnamedParameter = self::_extension#0|_earlierUnnamedParameter;
  method tearoff _earlierUnnamedParameter = self::_extension#0|get#_earlierUnnamedParameter;
  method _laterNamedParameter = self::_extension#0|_laterNamedParameter;
  method tearoff _laterNamedParameter = self::_extension#0|get#_laterNamedParameter;
  method _earlierNamedParameter = self::_extension#0|_earlierNamedParameter;
  method tearoff _earlierNamedParameter = self::_extension#0|get#_earlierNamedParameter;
  method _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter;
  method tearoff _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter;
  method _propagateToReturnType = self::_extension#0|_propagateToReturnType;
  method tearoff _propagateToReturnType = self::_extension#0|get#_propagateToReturnType;
  method _closureAsParameterType = self::_extension#0|_closureAsParameterType;
  method tearoff _closureAsParameterType = self::_extension#0|get#_closureAsParameterType;
  method _propagateToEarlierClosure = self::_extension#0|_propagateToEarlierClosure;
  method tearoff _propagateToEarlierClosure = self::_extension#0|get#_propagateToEarlierClosure;
  method _propagateToLaterClosure = self::_extension#0|_propagateToLaterClosure;
  method tearoff _propagateToLaterClosure = self::_extension#0|get#_propagateToLaterClosure;
  method _longDependencyChain = self::_extension#0|_longDependencyChain;
  method tearoff _longDependencyChain = self::_extension#0|get#_longDependencyChain;
  method _dependencyCycle = self::_extension#0|_dependencyCycle;
  method tearoff _dependencyCycle = self::_extension#0|get#_dependencyCycle;
  method _propagateFromContravariantReturnType = self::_extension#0|_propagateFromContravariantReturnType;
  method tearoff _propagateFromContravariantReturnType = self::_extension#0|get#_propagateFromContravariantReturnType;
  method _propagateToContravariantParameterType = self::_extension#0|_propagateToContravariantParameterType;
  method tearoff _propagateToContravariantParameterType = self::_extension#0|get#_propagateToContravariantParameterType;
  method _returnTypeRefersToMultipleTypeVars = self::_extension#0|_returnTypeRefersToMultipleTypeVars;
  method tearoff _returnTypeRefersToMultipleTypeVars = self::_extension#0|get#_returnTypeRefersToMultipleTypeVars;
  method _unnecessaryDueToNoDependency = self::_extension#0|_unnecessaryDueToNoDependency;
  method tearoff _unnecessaryDueToNoDependency = self::_extension#0|get#_unnecessaryDueToNoDependency;
  method _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed;
  method tearoff _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed;
  method _parenthesized = self::_extension#0|_parenthesized;
  method tearoff _parenthesized = self::_extension#0|get#_parenthesized;
  method _parenthesizedNamed = self::_extension#0|_parenthesizedNamed;
  method tearoff _parenthesizedNamed = self::_extension#0|get#_parenthesizedNamed;
  method _parenthesizedTwice = self::_extension#0|_parenthesizedTwice;
  method tearoff _parenthesizedTwice = self::_extension#0|get#_parenthesizedTwice;
  method _parenthesizedTwiceNamed = self::_extension#0|_parenthesizedTwiceNamed;
  method tearoff _parenthesizedTwiceNamed = self::_extension#0|get#_parenthesizedTwiceNamed;
}
static method testLaterUnnamedParameter(core::int i) → dynamic {
  self::_extension#0|_laterUnnamedParameter<core::int>(i, 0, (core::int x) → void {
    x;
  });
}
static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
  self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
    x;
  }, a: 0);
}
static method testEarlierUnnamedParameter(core::int i) → dynamic {
  self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
    x;
  }, 0);
}
static method testLaterNamedParameter(core::int i) → dynamic {
  self::_extension#0|_laterNamedParameter<core::int>(i, a: 0, b: (core::int x) → void {
    x;
  });
}
static method testEarlierNamedParameter(core::int i) → dynamic {
  self::_extension#0|_earlierNamedParameter<core::int>(i, a: (core::int x) → void {
    x;
  }, b: 0);
}
static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
  self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
    x;
  });
}
static method testPropagateToReturnType(core::int i) → dynamic {
  self::_extension#0|_propagateToReturnType<core::int, core::List<core::int>>(i, 0, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testClosureAsParameterType(core::int i) → dynamic {
  self::_extension#0|_closureAsParameterType<() → core::int, core::List<core::int>>(i, () → core::int => 0, (() → core::int h) → core::List<core::int> => <core::int>[h(){() → core::int}]);
}
static method testPropagateToEarlierClosure(core::int i) → dynamic {
  self::_extension#0|_propagateToEarlierClosure<core::int, core::List<core::int>>(i, (core::int x) → core::List<core::int> => <core::int>[x], () → core::int => 0);
}
static method testPropagateToLaterClosure(core::int i) → dynamic {
  self::_extension#0|_propagateToLaterClosure<core::int, core::List<core::int>>(i, () → core::int => 0, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testLongDependencyChain(core::int i) → dynamic {
  self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → core::List<core::int> => <core::int>[0], (core::List<core::int> x) → core::int => x.{core::Iterable::single}{core::int}, (core::int y) → core::Set<core::int> => block {
    final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
    #t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
  } =>#t1);
}
static method testDependencyCycle(core::int i) → dynamic {
  self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (core::Object? x) → core::List<core::Object?> => <core::Object?>[x], (core::Object? y) → core::Set<core::Object?> => block {
    final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
    #t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
  } =>#t2);
}
static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
  self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testPropagateToContravariantParameterType(core::int i) → dynamic {
  self::_extension#0|_propagateToContravariantParameterType<core::int, core::List<(core::int) → void>>(i, () → core::int => 0, ((core::int) → void x) → core::List<(core::int) → void> => <(core::int) → void>[x]);
}
static method testReturnTypeRefersToMultipleTypeVars(core::int i) → dynamic {
  self::_extension#0|_returnTypeRefersToMultipleTypeVars<core::int, core::String>(i, () → core::Map<core::int, core::String> => <core::int, core::String>{0: ""}, (core::int k) → void {
    k;
  }, (core::String v) → void {
    v;
  });
}
static method testUnnecessaryDueToNoDependency(core::int i) → dynamic {
  self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
}
static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
  core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
  a;
}
static method testParenthesized(core::int i) → dynamic {
  self::_extension#0|_parenthesized<core::int>(i, 0, (core::int x) → void {
    x;
  });
}
static method testParenthesizedNamed(core::int i) → dynamic {
  self::_extension#0|_parenthesizedNamed<core::int>(i, a: 0, b: (core::int x) → void {
    x;
  });
}
static method testParenthesizedTwice(core::int i) → dynamic {
  self::_extension#0|_parenthesizedTwice<core::int>(i, 0, (core::int x) → void {
    x;
  });
}
static method testParenthesizedTwiceNamed(core::int i) → dynamic {
  self::_extension#0|_parenthesizedTwiceNamed<core::int>(i, a: 0, b: (core::int x) → void {
    x;
  });
}
static extension-member method _extension#0|_laterUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_laterUnnamedParameter::T% x, (self::_extension#0|_laterUnnamedParameter::T%) → void y) → self::_extension#0|_laterUnnamedParameter::T%
  return throw "";
static extension-member method _extension#0|get#_laterUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → T%
  return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
static extension-member method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
  return throw "";
static extension-member method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
  return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
static extension-member method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
  return throw "";
static extension-member method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
  return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
static extension-member method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
static extension-member method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
  return throw "";
static extension-member method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
  return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
static extension-member method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
  return throw "";
static extension-member method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
  return throw "";
static extension-member method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
  return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
static extension-member method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
  return throw "";
static extension-member method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToReturnType<T%, U%>(#this, x, y);
static extension-member method _extension#0|_closureAsParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_closureAsParameterType::T% x, (self::_extension#0|_closureAsParameterType::T%) → self::_extension#0|_closureAsParameterType::U% y) → self::_extension#0|_closureAsParameterType::U%
  return throw "";
static extension-member method _extension#0|get#_closureAsParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_closureAsParameterType<T%, U%>(#this, x, y);
static extension-member method _extension#0|_propagateToEarlierClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_propagateToEarlierClosure::T%) → self::_extension#0|_propagateToEarlierClosure::U% x, () → self::_extension#0|_propagateToEarlierClosure::T% y) → self::_extension#0|_propagateToEarlierClosure::U%
  return throw "";
static extension-member method _extension#0|get#_propagateToEarlierClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U%, () → T%) → U%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U% x, () → T% y) → U% => self::_extension#0|_propagateToEarlierClosure<T%, U%>(#this, x, y);
static extension-member method _extension#0|get#_propagateToLaterClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, (T%) → U%) → U%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToLaterClosure<T%, U%>(#this, x, y);
static extension-member method _extension#0|_propagateToLaterClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToLaterClosure::T% x, (self::_extension#0|_propagateToLaterClosure::T%) → self::_extension#0|_propagateToLaterClosure::U% y) → self::_extension#0|_propagateToLaterClosure::U%
  return throw "";
static extension-member method _extension#0|_longDependencyChain<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_longDependencyChain::T% x, (self::_extension#0|_longDependencyChain::T%) → self::_extension#0|_longDependencyChain::U% y, (self::_extension#0|_longDependencyChain::U%) → self::_extension#0|_longDependencyChain::V% z) → self::_extension#0|_longDependencyChain::V%
  return throw "";
static extension-member method _extension#0|get#_longDependencyChain(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T%, (T%) → U%, (U%) → V%) → V%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T% x, (T%) → U% y, (U%) → V% z) → V% => self::_extension#0|_longDependencyChain<T%, U%, V%>(#this, x, y, z);
static extension-member method _extension#0|_dependencyCycle<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_dependencyCycle::U%) → self::_extension#0|_dependencyCycle::T% x, (self::_extension#0|_dependencyCycle::T%) → self::_extension#0|_dependencyCycle::U% y) → core::Map<self::_extension#0|_dependencyCycle::T%, self::_extension#0|_dependencyCycle::U%>
  return throw "";
static extension-member method _extension#0|get#_dependencyCycle(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T%, (T%) → U%) → core::Map<T%, U%>
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T% x, (T%) → U% y) → core::Map<T%, U%> => self::_extension#0|_dependencyCycle<T%, U%>(#this, x, y);
static extension-member method _extension#0|_propagateFromContravariantReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → (self::_extension#0|_propagateFromContravariantReturnType::T%) → void x, (self::_extension#0|_propagateFromContravariantReturnType::T%) → self::_extension#0|_propagateFromContravariantReturnType::U% y) → self::_extension#0|_propagateFromContravariantReturnType::U%
  return throw "";
static extension-member method _extension#0|get#_propagateFromContravariantReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void, (T%) → U%) → U%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void x, (T%) → U% y) → U% => self::_extension#0|_propagateFromContravariantReturnType<T%, U%>(#this, x, y);
static extension-member method _extension#0|_propagateToContravariantParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToContravariantParameterType::T% x, ((self::_extension#0|_propagateToContravariantParameterType::T%) → void) → self::_extension#0|_propagateToContravariantParameterType::U% y) → self::_extension#0|_propagateToContravariantParameterType::U%
  return throw "";
static extension-member method _extension#0|get#_propagateToContravariantParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, ((T%) → void) → U%) → U%
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, ((T%) → void) → U% y) → U% => self::_extension#0|_propagateToContravariantParameterType<T%, U%>(#this, x, y);
static extension-member method _extension#0|_returnTypeRefersToMultipleTypeVars<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → core::Map<self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%, self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%> x, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%) → void y, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%) → void z) → void
  return throw "";
static extension-member method _extension#0|get#_returnTypeRefersToMultipleTypeVars(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%>, (T%) → void, (U%) → void) → void
  return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%> x, (T%) → void y, (U%) → void z) → void => self::_extension#0|_returnTypeRefersToMultipleTypeVars<T%, U%>(#this, x, y, z);
static extension-member method _extension#0|_unnecessaryDueToNoDependency<T extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_unnecessaryDueToNoDependency::T% x, self::_extension#0|_unnecessaryDueToNoDependency::T% y) → self::_extension#0|_unnecessaryDueToNoDependency::T%
  return throw "";
static extension-member method _extension#0|get#_unnecessaryDueToNoDependency(lowered final core::int #this) → <T extends core::Object? = dynamic>(() → T%, T%) → T%
  return <T extends core::Object? = dynamic>(() → T% x, T% y) → T% => self::_extension#0|_unnecessaryDueToNoDependency<T%>(#this, x, y);
static extension-member method _extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% x, ({required x: self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%, required y: core::int}) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% y) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%
  return throw "";
static extension-member method _extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, ({required x: T%, required y: core::int}) → T%) → T%
  return <T extends core::Object? = dynamic>(T% x, ({required x: T%, required y: core::int}) → T% y) → T% => self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T%>(#this, x, y);
static extension-member method _extension#0|_parenthesized<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesized::T% x, (self::_extension#0|_parenthesized::T%) → void y) → void
  return throw "";
static extension-member method _extension#0|get#_parenthesized(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
  return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
static extension-member method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
  return throw "";
static extension-member method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
static extension-member method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
  return throw "";
static extension-member method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
  return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
static extension-member method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
  return throw "";
static extension-member method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
  return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
static method main() → dynamic {}

constants  {
  #C1 = null
}
