#!/usr/bin/python

import portage
import portage_dep

sysatoms = {}

for atom in portage.settings.packages:
	if atom[0] != "*":
		continue
	atom = atom[1:]
	key = portage.dep_getkey(atom)
	if portage.settings.virtuals.has_key(key):
		virt = portage.settings.virtuals[key][0]
		atom = atom.replace(key, virt)
		key = virt
	if not sysatoms.has_key(key):
		sysatoms[key] = []
	if not atom in sysatoms[key]:
		sysatoms[key]+= [atom]

reqdpkgs = {}

keys = sysatoms.keys()
idx = 0

def kill_some(deps):
	newdeps = []
	x = 0
	while x != len(deps):
		if isinstance(deps[x], list):
			newdeps+= [kill_some(deps[x])]
		elif deps[x] == "||":
			newdeps+= [kill_some(deps[x+1][0])]
			x += 1
		else:
			newdeps+= [deps[x]]
		x += 1
	return newdeps

while idx != len(keys):
	key = keys[idx]
	if reqdpkgs.has_key(key) and reqdpkgs[key]:
		idx+=1
		continue

	atoms = sysatoms[key]
	pkgs = portage.db["/"]["porttree"].dbapi.xmatch("match-visible", key)
	for atom in atoms:
		tmppkgs = portage.db["/"]["porttree"].dbapi.xmatch("match-visible", atom)
		for x in range(len(pkgs)-1, -1, -1):
			if pkgs[x] not in tmppkgs:
				del pkgs[x]
	
	if not pkgs:
		pkgs = portage.db["/"]["porttree"].dbapi.xmatch("match-visible", key)
	else:
		pkgs = [portage.best(pkgs)]
	
	reqdpkgs[key] = pkgs
	
	for pkg in pkgs:
		deps = " ".join(portage.db["/"]["porttree"].dbapi.aux_get(pkg, ["DEPEND","RDEPEND","PDEPEND"]))
		deps = portage_dep.use_reduce(portage_dep.paren_reduce(deps), portage.settings["USE"].split())
		deps = portage.flatten(kill_some(deps))
		for dep in deps:
			if dep[0] == "!":
				continue
			key = portage.dep_getkey(dep)
			if not sysatoms.has_key(key):
				sysatoms[key] = []
				keys = sysatoms.keys()
			if dep not in sysatoms[key]:
				sysatoms[key]+= [dep]
				reqdpkgs[key] = []
				idx = -1
	
	idx+=1

finallist = []
	
for key in reqdpkgs.keys():
	for pkg in reqdpkgs[key]:
		if pkg not in finallist:
			finallist+= [pkg]

finallist.sort()
for pkg in finallist:
	print pkg
