function entryPoints( pkgs, clbk ) {
	var count;
	var total;
	var main;
	var file;
	var keys;
	var data;
	var out;
	var dir;
	var pkg;
	var tmp;
	var id;
	var b;
	var i;
	var j;
	var k;

	total = pkgs.length;
	out = new Array( total );

	debug( 'Determining main entry points for %d packages...', total );
	for ( i = 0; i < total; i++ ) {
		k = i + 1;
		pkg = pkgs[ i ].pkg;
		main = pkgs[ i ].id;

		debug( 'Determined main entry point for package: %s (%d of %d). Main: %s', pkg, k, total, main );
		out[ i ] = {
			'id': main,
			'pkg': pkg,
			'dir': pkgs[ i ].dir,
			'entries': []
		};
	}
	debug( 'Finished determining main entry points.' );

	debug( 'Resolving browser entry points for %d packages...', total );
	count = 0;
	for ( i = 0; i < total; i++ ) {
		k = i + 1;
		pkg = pkgs[ i ].pkg;
		data = pkgs[ i ].data;
		if (
			data.__stdlib__ && // eslint-disable-line no-underscore-dangle
			data.__stdlib__.envs && // eslint-disable-line no-underscore-dangle
			data.__stdlib__.envs.browser === false // eslint-disable-line no-underscore-dangle
		) {
			debug( 'Package is not compatible with browser environments: %s (%d of %d). Skipping...', pkg, k, total );
			done( null, [], i ); // eslint-disable-line node/callback-return
			continue;
		}
		debug( 'Resolving browser files for package: %s (%d of %d).', pkg, k, total );
		id = pkgs[ i ].id;
		dir = pkgs[ i ].dir;
		b = pkgs[ i ].data.browser;

		tmp = [];
		if ( isString( b ) && b.length > 0 ) {
			file = resolve( dir, b );
			debug( 'Found browser entry file for package: %s (%d of %d). File: %s', pkg, k, total, file );
			tmp.push( file );
		} else if ( isObject( b ) ) {
			keys = objectKeys( b );
			for ( j = 0; j < keys.length; j++ ) {
				if ( resolve( dir, keys[j] ) === id ) {
					file = resolve( dir, b[ keys[j] ] );
					debug( 'Found browser entry file for package: %s (%d of %d). File: %s', pkg, k, total, file );
					tmp.push( file );
				}
			}
			if ( tmp.length === 0 ) {
				tmp.push( id );
			}
		} else {
			debug( 'No browser-specific files for package: %s (%d of %d). Using main entry point...', pkg, k, total );
			tmp.push( id );
		}
		resolveFiles( tmp, i, done );
	}

	/**
	* Callback invoked upon resolving a package's browser entry files.
	*
	* @private
	* @param {(Error|null)} error - error object
	* @param {(StringArray|EmptyArray)} files - resolved file paths
	* @param {NonNegativeInteger} idx - package index
	* @returns {void}
	*/
	function done( error, files, idx ) {
		if ( error ) {
			return clbk( error );
		}
		if ( files.length ) {
			out[ idx ].entries = out[ idx ].entries.concat( files );
		}
		debug( 'Resolved %d browser entry points for package: %s (%d of %d).', out[ idx ].entries.length, pkgs[ idx ].pkg, idx+1, total );

		count += 1;
		debug( 'Resolved browser entry points for %d of %d packages.', count, total );
		if ( count === total ) {
			debug( 'Resolved browser entry points for all packages.' );
			return clbk( null, out );
		}
	}
}
Determines browser entry points.

@private
@param {ObjectArray} pkgs - packages
@param {Callback} clbk - callback to invoke after determining entry points