Extract the contents of *archive* to the specified *directory*. This
  function ensures that no file is extracted outside of the target directory
  (which can theoretically happen if the arcname is not relative or points
  to a parent directory).

  # Parameters
  archive (str, archive-like): The filename of an archive or an already
    opened archive.
  directory (str): Path to the directory to unpack the contents to.
  unpack_single_dir (bool): If this is True and if the archive contains only
    a single top-level directory, its contents will be placed directly into
    the target *directory*.

def extract(archive, directory, suffix=None, unpack_single_dir=False,
    check_extract_file=None, progress_callback=None, default_mode='755'):
  """
  Extract the contents of *archive* to the specified *directory*. This
  function ensures that no file is extracted outside of the target directory
  (which can theoretically happen if the arcname is not relative or points
  to a parent directory).

  # Parameters
  archive (str, archive-like): The filename of an archive or an already
    opened archive.
  directory (str): Path to the directory to unpack the contents to.
  unpack_single_dir (bool): If this is True and if the archive contains only
    a single top-level directory, its contents will be placed directly into
    the target *directory*.
  """

  if isinstance(archive, str):
    with open(archive, suffix=suffix) as archive:
      return extract(archive, directory, None, unpack_single_dir,
          check_extract_file, progress_callback, default_mode)

  if isinstance(default_mode, str):
    default_mode = int(default_mode, 8)

  if progress_callback:
    progress_callback(-1, 0, None)
  names = archive.getnames()

  # Find out if we have only one top-level directory.
  toplevel_dirs = set()
  for name in names:
    parts = name.split('/')
    if len(parts) > 1:
      toplevel_dirs.add(parts[0])
  if unpack_single_dir and len(toplevel_dirs) == 1:
    stripdir = next(iter(toplevel_dirs)) + '/'
  else:
    stripdir = None

  for index, name in enumerate(names):
    if progress_callback:
      progress_callback(index + 1, len(names), name)
    if name.startswith('..') or name.startswith('/') or os.path.isabs(name):
      continue
    if check_extract_file and not check_extract_file(name):
      continue
    if name.endswith('/'):
      continue
    if stripdir:
      filename = name[len(stripdir):]
      if not filename:
        continue
    else:
      filename = name

    info = archive.getmember(name)
    src = archive.extractfile(name)
    if not src:
      continue

    try:
      filename = os.path.join(directory, filename)
      dirname = os.path.dirname(filename)
      if not os.path.exists(dirname):
        os.makedirs(dirname)
      with builtins.open(filename, 'wb') as dst:
        shutil.copyfileobj(src, dst)
      os.chmod(filename, info.mode or default_mode)
      os.utime(filename, (-1, info.mtime))
    finally:
      src.close()

  if progress_callback:
    progress_callback(len(names), len(names), None)