code: def test_fully_flatten(self):
      self.assertEqual(fully_flatten([[1, 3], [1, 2]]), [1, 3, 1, 2])
      self.assertEqual(fully_flatten(((1, 3), (1, 2))), [1, 3, 1, 2])
      self.assertEqual(
          fully_flatten([[[1], [3]], [[1], [2]]]), [1, 3, 1, 2]
      )
      self.assertEqual(fully_flatten([[[[1], 2], 3], 4]), [1, 2, 3, 4])
      self.assertEqual(
          fully_flatten([[1, 2, [3, 4]], [5, 6], 7]),
          [1, 2, 3, 4, 5, 6, 7],
      )
      self.assertEqual(
          fully_flatten([[1, "ab"], [True, None], [3.14, [5, "b"]]]),
          [1, "ab", True, None, 3.14, 5, "b"],
      )
  
imports: import unittest
  from PIL import Image
  from tinygrad.helpers import Context, ContextVar, merge_dicts, strip_parens, prod, round_up, fetch, fully_flatten, from_mv, to_mv
  from tinygrad.shape.symbolic import Variable, NumNode
label_desc: Use image node_id 1 for calling the TestFullyFlatten obj's underlying member method code with example usage: obj.test_fully_flatten() without return types