@ -55,7 +55,7 @@ def get_brand_addrs() -> Dict[str, Set[AddrType]]: 
			
		
	
		
			
				
					  return  dict ( brand_addrs )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					def  match_fw_to_car_fuzzy ( live_fw_versions ,  log = True ,  exclude = None ) :  
			
		
	
		
			
				
					def  match_fw_to_car_fuzzy ( live_fw_versions ,  match_brand = None ,  log = True ,  exclude = None ) :  
			
		
	
		
			
				
					  """ Do a fuzzy FW match. This function will return a match, and the number of firmware version   
			
		
	
		
			
				
					  that  were  matched  uniquely  to  that  specific  car .  If  multiple  ECUs  uniquely  match  to  different  cars   
			
		
	
		
			
				
					  the  match  is  rejected . """   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -63,6 +63,9 @@ def match_fw_to_car_fuzzy(live_fw_versions, log=True, exclude=None): 
			
		
	
		
			
				
					  # Build lookup table from (addr, sub_addr, fw) to list of candidate cars   
			
		
	
		
			
				
					  all_fw_versions  =  defaultdict ( list )   
			
		
	
		
			
				
					  for  candidate ,  fw_by_addr  in  FW_VERSIONS . items ( ) :   
			
		
	
		
			
				
					    if  not  is_brand ( MODEL_TO_BRAND [ candidate ] ,  match_brand ) :   
			
		
	
		
			
				
					      continue   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    if  candidate  ==  exclude :   
			
		
	
		
			
				
					      continue   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -102,13 +105,14 @@ def match_fw_to_car_fuzzy(live_fw_versions, log=True, exclude=None): 
			
		
	
		
			
				
					    return  set ( )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					def  match_fw_to_car_exact ( live_fw_versions ,  log = True )  - >  Set [ str ] :  
			
		
	
		
			
				
					def  match_fw_to_car_exact ( live_fw_versions ,  match_brand = None ,  log = True )  - >  Set [ str ] :  
			
		
	
		
			
				
					  """ Do an exact FW match. Returns all cars that match the given   
			
		
	
		
			
				
					  FW  versions  for  a  list  of  " essential "  ECUs .  If  an  ECU  is  not  considered   
			
		
	
		
			
				
					  essential  the  FW  version  can  be  missing  to  get  a  fingerprint ,  but  if  it ' s present it   
			
		
	
		
			
				
					  needs  to  match  the  database . """   
			
		
	
		
			
				
					  invalid  =  set ( )   
			
		
	
		
			
				
					  candidates  =  FW_VERSIONS   
			
		
	
		
			
				
					  candidates  =  { c :  f  for  c ,  f  in  FW_VERSIONS . items ( )  if   
			
		
	
		
			
				
					                is_brand ( MODEL_TO_BRAND [ c ] ,  match_brand ) }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  for  candidate ,  fws  in  candidates . items ( ) :   
			
		
	
		
			
				
					    config  =  FW_QUERY_CONFIGS [ MODEL_TO_BRAND [ candidate ] ]   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -150,7 +154,7 @@ def match_fw_to_car(fw_versions, allow_exact=True, allow_fuzzy=True, log=True): 
			
		
	
		
			
				
					    matches  =  set ( )   
			
		
	
		
			
				
					    for  brand  in  VERSIONS . keys ( ) :   
			
		
	
		
			
				
					      fw_versions_dict  =  build_fw_dict ( fw_versions ,  filter_brand = brand )   
			
		
	
		
			
				
					      matches  | =  match_func ( fw_versions_dict ,  log = log )   
			
		
	
		
			
				
					      matches  | =  match_func ( fw_versions_dict ,  match_brand = brand ,  log = log )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      # If specified and no matches so far, fall back to brand's fuzzy fingerprinting function   
			
		
	
		
			
				
					      config  =  FW_QUERY_CONFIGS [ brand ]