class_docstr: This class represents an optical medium. The prime reason to implement this is
  to facilitate refraction, Fermat's principle, etc.
  
  Explanation
  ===========
  
  An optical medium is a material through which electromagnetic waves propagate.
  The permittivity and permeability of the medium define how electromagnetic
  waves propagate in it.
  
  
  Parameters
  ==========
  
  name: string
      The display name of the Medium.
  
  permittivity: Sympifyable
      Electric permittivity of the space.
  
  permeability: Sympifyable
      Magnetic permeability of the space.
  
  n: Sympifyable
      Index of refraction of the medium.
  
  
  Examples
  ========
  
  >>> from sympy.abc import epsilon, mu
  >>> from sympy.physics.optics import Medium
  >>> m1 = Medium('m1')
  >>> m2 = Medium('m2', epsilon, mu)
  >>> m1.intrinsic_impedance
  149896229*pi*kilogram*meter**2/(1250000*ampere**2*second**3)
  >>> m2.refractive_index
  299792458*meter*sqrt(epsilon*mu)/second
  
  
  References
  ==========
  
  .. [1] https://en.wikipedia.org/wiki/Optical_medium
code: def __new__(cls, name, permittivity=None, permeability=None, n=None):
      if not isinstance(name, Str):
          name = Str(name)
  
      permittivity = (
          _sympify(permittivity)
          if permittivity is not None
          else permittivity
      )
      permeability = (
          _sympify(permeability)
          if permeability is not None
          else permeability
      )
      n = _sympify(n) if n is not None else n
  
      if n is not None:
          if permittivity is not None and permeability is None:
              permeability = n**2 / (c**2 * permittivity)
              return MediumPP(name, permittivity, permeability)
          elif permeability is not None and permittivity is None:
              permittivity = n**2 / (c**2 * permeability)
              return MediumPP(name, permittivity, permeability)
          elif permittivity is not None and permittivity is not None:
              raise ValueError(
                  "Specifying all of permittivity, permeability, and n is not allowed"
              )
          else:
              return MediumN(name, n)
      elif permittivity is not None and permeability is not None:
          return MediumPP(name, permittivity, permeability)
      elif permittivity is None and permeability is None:
          return MediumPP(name, _e0mksa, _u0mksa)
      else:
          raise ValueError(
              "Arguments are underspecified. Either specify n or any two of permittivity, "
              "permeability, and n"
          )
  
imports: from sympy.physics.units import second, meter, kilogram, ampere
  from sympy.core.basic import Basic
  from sympy.core.symbol import Str
  from sympy.core.sympify import _sympify
  from sympy.functions.elementary.miscellaneous import sqrt
  from sympy.physics.units import speed_of_light, u0, e0
label_desc: Use image node_id 1 for calling the Medium obj's underlying member method code with example usage: obj.__new__(cls, name, permittivity, permeability, n) and returns: MediumPP, MediumPP, MediumPP, MediumPP, MediumN