docs: def olympusini_metadata(inistr):
      """Return OlympusSIS metadata from INI string.
  
      No documentation is available.
  
      """
      def keyindex(key):
          # split key into name and index
          index = 0
          i = len(key.rstrip('0123456789'))
          if i < len(key):
              index = int(key[i:]) - 1
              key = key[:i]
          return key, index
  
      result = {}
      bands = []
      zpos = None
      tpos = None
      for line in inistr.splitlines():
          line = line.strip()
          if line == '' or line[0] == ';':
              continue
          if line[0] == '[' and line[-1] == ']':
              section_name = line[1:-1]
              result[section_name] = section = {}
              if section_name == 'Dimension':
                  result['axes'] = axes = []
                  result['shape'] = shape = []
              elif section_name == 'ASD':
                  result[section_name] = []
              elif section_name == 'Z':
                  if 'Dimension' in result:
                      result[section_name]['ZPos'] = zpos = []
              elif section_name == 'Time':
                  if 'Dimension' in result:
                      result[section_name]['TimePos'] = tpos = []
              elif section_name == 'Band':
                  nbands = result['Dimension']['Band']
                  bands = [{'LUT': []} for i in range(nbands)]
                  result[section_name] = bands
                  iband = 0
          else:
              key, value = line.split('=')
              if value.strip() == '':
                  value = None
              elif ',' in value:
                  value = tuple(astype(v) for v in value.split(','))
              else:
                  value = astype(value)
  
              if section_name == 'Dimension':
                  section[key] = value
                  axes.append(key)
                  shape.append(value)
              elif section_name == 'ASD':
                  if key == 'Count':
                      result['ASD'] = [{}] * value
                  else:
                      key, index = keyindex(key)
                      result['ASD'][index][key] = value
              elif section_name == 'Band':
                  if key[:3] == 'LUT':
                      lut = bands[iband]['LUT']
                      value = struct.pack('<I', value)
                      lut.append(
                          [ord(value[0:1]), ord(value[1:2]), ord(value[2:3])])
                  else:
                      key, iband = keyindex(key)
                      bands[iband][key] = value
              elif key[:4] == 'ZPos' and zpos is not None:
                  zpos.append(value)
              elif key[:7] == 'TimePos' and tpos is not None:
                  tpos.append(value)
              else:
                  section[key] = value
  
      if 'axes' in result:
          sisaxes = {'Band': 'C'}
          axes = []
          shape = []
          for i, x in zip(result['shape'], result['axes']):
              if i > 1:
                  axes.append(sisaxes.get(x, x[0].upper()))
                  shape.append(i)
          result['axes'] = ''.join(axes)
          result['shape'] = tuple(shape)
      try:
          result['Z']['ZPos'] = numpy.array(
              result['Z']['ZPos'][:result['Dimension']['Z']], 'float64')
      except Exception:
          pass
      try:
          result['Time']['TimePos'] = numpy.array(
              result['Time']['TimePos'][:result['Dimension']['Time']], 'int32')
      except Exception:
          pass
      for band in bands:
          band['LUT'] = numpy.array(band['LUT'], 'uint8')
  
      return result