code: def mk_coroutine():
      from abc import abstractmethod
  
      class Coroutine(Awaitable):
          __slots__ = ()
  
          @abstractmethod
          def send(self, value):
              """Send a value into the coroutine.
              Return next yielded value or raise StopIteration.
              """
              raise StopIteration
  
          @abstractmethod
          def throw(self, typ, val=None, tb=None):
              """Raise an exception in the coroutine.
              Return next yielded value or raise StopIteration.
              """
              if val is None:
                  if tb is None:
                      raise typ
                  val = typ()
              if tb is not None:
                  val = val.with_traceback(tb)
              raise val
  
          def close(self):
              """Raise GeneratorExit inside coroutine."""
              try:
                  self.throw(GeneratorExit)
              except (GeneratorExit, StopIteration):
                  pass
              else:
                  raise RuntimeError("coroutine ignored GeneratorExit")
  
          @classmethod
          def __subclasshook__(cls, C):
              if cls is Coroutine:
                  mro = get_mro(C)
                  for method in ("__await__", "send", "throw", "close"):
                      for base in mro:
                          if method in base.__dict__:
                              break
                      else:
                          return NotImplemented
                  return True
              return NotImplemented
  
      return Coroutine
  
label_desc: Use image node_id 5 for calling a global function with example usage: mk_coroutine() and returns: Coroutine, NotImplemented, True, NotImplemented