| 
					
				 | 
			
			
				@@ -59,12 +59,12 @@ var defaults = function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'amber_dir': amber_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'smalltalk': {}, // the evaluated compiler will be stored in this variable (see create_compiler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		'base': kernel_libraries, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'compiler_libraries': kernel_libraries.concat(compiler_libs), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		'load': [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'init': path.join(amber_dir, 'js', 'init.js'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'main': undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'mainfile': undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		'base': kernel_libraries, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		'load': [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'closure': false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'closure_parts': false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		'closure_full': false, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -149,7 +149,9 @@ function handle_options(optionsArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// print options and exit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * print usage options and exit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function usage() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	console.log('Usage: $0 [-l lib1,lib2...] [-i init_file] [-m main_class] [-M main_file]'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	console.log('          [-o] [-O|-A] [-d] [-s suffix] [-S suffix] [file1 [file2 ...]] [Program]'); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -229,6 +231,13 @@ function usage() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Checks if the java executable exists and afterwards, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * if compiler.jar exists at the path stored in defaults.closure_jar. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * All closure related entries are set to false upon failure. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * callback gets called in any case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function check_for_closure_compiler(callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (defaults.closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		exec('which java', function(error, stdout, stderr) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -258,17 +267,40 @@ function check_for_closure_compiler(callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function resolve_js(filename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Check if the file given as parameter exists in the local directory or in $AMBER/js/. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * '.js' is appended first. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param filename name of a file without '.js' prefix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param callback gets called on success with path to .js file as parameter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function resolve_js(filename, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var jsFile = filename + defaults.loadsuffix + '.js'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var amberJsFile = path.join(defaults.amber_dir, 'js', jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	console.log('Resolving: ' + jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (path.existsSync(jsFile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return jsFile; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} else if (path.existsSync(amberJsFile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return amberJsFile; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		throw(new Error('JavaScript file not found: ' + jsFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	path.exists(jsFile, function(exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			callback(jsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			path.exists(amberJsFile, function(exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					callback(amberJsFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					throw(new Error('JavaScript file not found: ' + jsFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Always evaluates the callback parameter. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Used by Combo blocks to always call the next function, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * even if all of the other functions did not run. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function always_resolve(callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	callback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -277,56 +309,144 @@ function resolve_js(filename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // both locally and in $AMBER/js and $AMBER/st  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // -------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function collect_files(filesArray) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var stFiles = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var jsFiles = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var programName = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	filesArray.forEach(function(currentFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var fileSuffix = path.extname(currentFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var category = path.basename(currentFile, '.st'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var amberFile = path.join(defaults.amber_dir, 'st', currentFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		switch (fileSuffix) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			case '.st': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if (path.existsSync(currentFile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaults.compile.push(currentFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaults.compiled_categories.push(category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaults.compiled.push(category + defaults.suffix_used + '.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} else if (path.existsSync(amberFile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaults.compile.push(amberFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaults.compiled_categories.push(category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					defaults.compiled.push(category + defaults.suffix_used + '.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					throw(new Error('File not found: ' + currentFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				stFiles.push(currentFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			case '.js': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				defaults.libraries.push(resolve_js(currentFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				jsFiles.push(currentFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// Will end up being the last non js/st argument 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				defaults.program = currentFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				programName.push(currentFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	resolve_libraries(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if(1 < programName.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		throw new Error('More than one name for ProgramName given: ' + programName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		defaults.program = programName[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// collecting files starts here!! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var collected_files = new Combo(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		resolve_libraries(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	collect_st_files(stFiles, collected_files.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	collect_js_files(jsFiles, collected_files.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function collect_st_files(stFiles, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var collected_st_files = new Combo(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Array.prototype.slice.call(arguments).forEach(function(data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (undefined !== data[0]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var stFile = data[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				var stCategory = data[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				defaults.compile.push(stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				defaults.compiled_categories.push(stCategory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				defaults.compiled.push(stCategory + defaults.suffix_used + '.js'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		callback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	stFiles.forEach(function(stFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var _callback = collected_st_files.add(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		console.log('Checking: ' + stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var category = path.basename(stFile, '.st'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var amberStFile = path.join(defaults.amber_dir, 'st', stFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		path.exists(stFile, function(exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				_callback(stFile, category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				path.exists(amberJsFile, function(exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						_callback(amberStFile, category); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						throw(new Error('JavaScript file not found: ' + jsFile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	always_resolve(collected_st_files.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function collect_js_files(jsFiles, callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var collected_js_files = new Combo(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Array.prototype.slice.call(arguments).forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (undefined !== file[0]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				defaults.libraries.push(file[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		callback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	jsFiles.forEach(function(jsFile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		resolve_js(currentFile, collected_js_files.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	always_resolve(collected_js_files.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function resolve_libraries() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// Resolve libraries listed in defaults.base 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	defaults.base.forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		defaults.libraries.push(resolve_js(file)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var all_resolved = new Combo(function(resolved_library_files, resolved_compiler_files) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		resolve_init(resolved_compiler_files[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	resolve_kernel(all_resolved.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	resolve_compiler(all_resolved.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function resolve_kernel(callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var kernel_files = defaults.base.concat(defaults.load); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var kernel_resolved = new Combo(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Array.prototype.slice.call(arguments).forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (undefined !== file[0]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				defaults.libraries.push(file[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		callback(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// Resolve libraries listed in defaults.compiler 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	var compilerFiles = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	defaults.compiler_libraries.forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compilerFiles.push(resolve_js(file)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	kernel_files.forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		resolve_js(file, kernel_resolved.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// Resolve libraries listed in defaults.load 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	defaults.load.forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var resolvedFile = resolve_js(file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		compilerFiles.push(resolvedFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		defaults.libraries.push(resolvedFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	always_resolve(kernel_resolved.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function resolve_compiler(callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// Resolve compiler libraries 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var compiler_files = defaults.compiler_libraries.concat(defaults.load); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var compiler_resolved = new Combo(function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var compilerFiles = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Array.prototype.slice.call(arguments).forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (undefined !== file[0]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				compilerFiles.push(file[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		callback(compilerFiles); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	compiler_files.forEach(function(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		resolve_js(file, compiler_resolved.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	always_resolve(compiler_resolved.add()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function resolve_init(compilerFiles) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// check and add init.js 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var initFile = defaults.init; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if ('.js' !== path.extname(initFile)) { 
			 |