code: def broadcast_shapes(
      *shapes: Union[List[int], List[Tuple]],
  ) -> Tuple[int, ...]:
      if len(shapes) > 1:
          desired_shape = tf.broadcast_dynamic_shape(
              shapes[0], shapes[1]
          )
          if len(shapes) > 2:
              for i in range(2, len(shapes)):
                  desired_shape = tf.broadcast_dynamic_shape(
                      desired_shape, shapes[i]
                  )
      else:
          return [shapes[0]]
      return tuple(desired_shape.numpy().tolist())
  
imports: from collections import namedtuple
  from typing import Iterable, Union, Optional, Sequence, Tuple, NamedTuple, List, Literal, Callable, Any
  from numbers import Number
  import tensorflow
  from ivy.func_wrapper import with_unsupported_dtypes
  from ..None import backend_version
  import ivy
  from ivy.functional.ivy.experimental.manipulation import _to_tf_padding
label_desc: Use image node_id 18 for calling a global function with example usage: broadcast_shapes() and returns: tuple, list