code: func (p *Parser) onCSVCMsg_CreateStringTable(m *dota.CSVCMsg_CreateStringTable) error {
  	// Create a new string table at the next index position
  	t := &stringTable{
  		index:             p.stringTables.nextIndex,
  		name:              m.GetName(),
  		Items:             make(map[int32]*stringTableItem),
  		userDataFixedSize: m.GetUserDataFixedSize(),
  		userDataSize:      m.GetUserDataSize(),
  		flags:             m.GetFlags(),
  	}
  
  	// Increment the index
  	p.stringTables.nextIndex += 1
  
  	// Decompress the data if necessary
  	buf := m.GetStringData()
  	if m.GetDataCompressed() {
  		// old replays = lzss
  		// new replays = snappy
  
  		r := newReader(buf)
  		var err error
  
  		if s := r.readStringN(4); s != "LZSS" {
  			if buf, err = snappy.Decode(nil, buf); err != nil {
  				return err
  			}
  		} else {
  			if buf, err = unlzss(buf); err != nil {
  				return err
  			}
  		}
  	}
  
  	// Parse the items out of the string table data
  	items := parseStringTable(buf, m.GetNumEntries(), t.name, t.userDataFixedSize, t.userDataSize, t.flags)
  
  	// Insert the items into the table
  	for _, item := range items {
  		t.Items[item.Index] = item
  	}
  
  	// Add the table to the parser state
  	p.stringTables.Tables[t.index] = t
  	p.stringTables.NameIndex[t.name] = t.index
  
  	// Apply the updates to baseline state
  	if t.name == "instancebaseline" {
  		p.updateInstanceBaseline()
  	}
  
  	return nil
  }
docs: // Internal callback for CSVCMsg_CreateStringTable.
  // XXX TODO: This is currently using an artificial, internally crafted message.
  // This should be replaced with the real message once we have updated protos.