code: def parse_DID(did, name_type=None):
      
      did_pattern = '^did:stack:v0:({}{{25,35}})-([0-9]+)$'.format(OP_BASE58CHECK_CLASS)
  
      m = re.match(did_pattern, did)
      assert m, 'Invalid DID: {}'.format(did)
  
      original_address = str(m.groups()[0])
      name_index = int(m.groups()[1])
      vb = keylib.b58check.b58check_version_byte(original_address)
      name_type = None
  
      if vb in [SUBDOMAIN_ADDRESS_VERSION_BYTE, SUBDOMAIN_ADDRESS_MULTISIG_VERSION_BYTE]:
          name_type = 'subdomain'
  
          # decode version 
          if vb == SUBDOMAIN_ADDRESS_VERSION_BYTE:
              vb = bitcoin_blockchain.version_byte
          else:
              vb = bitcoin_blockchain.multisig_version_byte
  
          original_address = virtualchain.address_reencode(original_address, version_byte=vb)
  
      else:
          name_type = 'name'
          original_address = virtualchain.address_reencode(original_address)
  
      return {'address': original_address, 'index': name_index, 'name_type': name_type}
docs: Given a DID string, parse it into {'address': ..., 'index': ..., 'name_type'}
      Raise on invalid DID