diff --git a/trunk/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/trunk/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java new file mode 100644 index 000000000..5d5f01c18 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -0,0 +1,573 @@ +/* + * Copyright (C) 2010-2013 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.console; + +import com.jpexs.decompiler.flash.AbortRetryIgnoreHandler; +import com.jpexs.decompiler.flash.Configuration; +import com.jpexs.decompiler.flash.ConsoleAbortRetryIgnoreHandler; +import com.jpexs.decompiler.flash.EventListener; +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.gui.Main; +import com.jpexs.decompiler.flash.gui.View; +import com.jpexs.decompiler.flash.gui.proxy.ProxyFrame; +import com.jpexs.decompiler.graph.ExportMode; +import com.jpexs.helpers.Helper; +import com.sun.jna.Platform; +import com.sun.jna.platform.win32.Kernel32; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author JPEXS + */ +public class CommandLineArgumentParser { + + private static boolean commandLineMode = false; + + private static String[] commandlineConfigBoolean = new String[]{ + "decompile", + "parallelSpeedUp", + "internalFlashViewer", + "autoDeobfuscate", + "cacheOnDisk"}; + + public static boolean isCommandLineMode() { + return commandLineMode; + } + + public static void printCmdLineUsage() { + System.out.println("Commandline arguments:"); + System.out.println(" 1) -help | --help | /?"); + System.out.println(" ...shows commandline arguments (this help)"); + System.out.println(" 2) infile"); + System.out.println(" ...opens SWF file with the decompiler GUI"); + System.out.println(" 3) -proxy (-PXXX)"); + System.out.println(" ...auto start proxy in the tray. Optional parameter -P specifies port for proxy. Defaults to 55555. "); + System.out.println(" 4) -export (as|pcode|pcodehex|hex|image|shape|movie|sound|binaryData|text|textplain|all|all_as|all_pcode|all_pcodehex|all_hex) outdirectory infile [-selectas3class class1 class2 ...]"); + System.out.println(" ...export infile sources to outdirectory as AsctionScript code (\"as\" argument) or as PCode (\"pcode\" argument), images, shapes, movies, binaryData, text with formatting, plain text or all."); + System.out.println(" When \"as\" or \"pcode\" type specified, optional \"-selectas3class\" parameter can be passed to export only selected classes (ActionScript 3 only)"); + System.out.println(" 5) -dumpSWF infile"); + System.out.println(" ...dumps list of SWF tags to console"); + System.out.println(" 6) -compress infile outfile"); + System.out.println(" ...Compress SWF infile and save it to outfile"); + System.out.println(" 7) -decompress infile outfile"); + System.out.println(" ...Decompress infile and save it to outfile"); + System.out.println(" 8) -config key=value[,key2=value2][,key3=value3...] [other parameters]"); + System.out.print(" ...Sets configuration values. Available keys[current setting]:"); + for (String key : commandlineConfigBoolean) { + System.out.print(" " + key + "[" + Configuration.getConfig(key) + "]"); + } + System.out.println(""); + System.out.println(" Values are boolean, you can use 0/1, true/false, on/off or yes/no."); + System.out.println(" If no other parameters passed, configuration is saved. Otherwise it is used only once."); + System.out.println(" DO NOT PUT space between comma (,) and next value."); + System.out.println(" 9) -onerror (abort|retryN|ignore)"); + System.out.println(" ...error handling mode. \"abort\" stops the exporting, \"retry\" tries the exporting N times, \"ignore\" ignores the current file"); + System.out.println(" 10) -timeout N"); + System.out.println(" ...decompilation timeout for a single method in AS3 or single action in AS1/2 in seconds"); + System.out.println(); + System.out.println("Examples:"); + System.out.println("java -jar ffdec.jar myfile.swf"); + System.out.println("java -jar ffdec.jar -proxy"); + System.out.println("java -jar ffdec.jar -proxy -P1234"); + System.out.println("java -jar ffdec.jar -export as \"C:\\decompiled\\\" myfile.swf"); + System.out.println("java -jar ffdec.jar -export as \"C:\\decompiled\\\" myfile.swf -selectas3class com.example.MyClass com.example.SecondClass"); + System.out.println("java -jar ffdec.jar -export pcode \"C:\\decompiled\\\" myfile.swf"); + System.out.println("java -jar ffdec.jar -dumpSWF myfile.swf"); + System.out.println("java -jar ffdec.jar -compress myfile.swf myfiledec.swf"); + System.out.println("java -jar ffdec.jar -decompress myfiledec.swf myfile.swf"); + System.out.println("java -jar ffdec.jar -onerror ignore -export as \"C:\\decompiled\\\" myfile.swf"); + System.out.println("java -jar ffdec.jar -onerror retry 5 -export as \"C:\\decompiled\\\" myfile.swf"); + System.out.println("java -jar ffdec.jar -config autoDeobfuscate=1,parallelSpeedUp=0 -export as \"C:\\decompiled\\\" myfile.swf"); + System.out.println(""); + System.out.println("Instead of \"java -jar ffdec.jar\" you can use ffdec.bat on Windows, ffdec.sh on Linux/MacOs"); + } + + /** + * Parses the console arguments + * @return path to the file which should be opened or null + */ + public static String parseArguments(String[] arguments) throws IOException { + Level traceLevel = Level.WARNING; + Queue args = new LinkedList<>(Arrays.asList(arguments)); + AbortRetryIgnoreHandler handler = null; + + String nextParam; + while (true) { + nextParam = args.remove(); + if (nextParam.equals("-config")) { + parseConfig(args); + if (args.isEmpty()) { + Main.saveConfig(); + System.out.println("Configuration saved"); + return null; + } + } else if (nextParam.equals("-onerror")) { + handler = parseOnError(args); + } else if (nextParam.equals("-timeout")) { + parseTimeout(args); + } else if (nextParam.equals("-affinity")) { + parseAffinity(args); + } else if (nextParam.equals("-priority")) { + parsePriority(args); + } else if (nextParam.equals("-verbose")) { + traceLevel = Level.FINE; + } else if (nextParam.equals("-debug")) { + Configuration.debugMode = true; + } else { + break; + } + + if (args.isEmpty()) { + return null; + } + } + if (nextParam.equals("-removefromcontextmenu")) { + Main.addToContextMenu(false); + System.exit(0); + } else if (nextParam.equals("-addtocontextmenu")) { + Main.addToContextMenu(true); + System.exit(0); + } else if (nextParam.equals("-proxy")) { + parseProxy(args); + } else if (nextParam.equals("-export")) { + parseExport(args, handler, traceLevel); + } else if (nextParam.equals("-compress")) { + parseCompress(args); + } else if (nextParam.equals("-decompress")) { + parseDecompress(args); + } else if (nextParam.equals("-dumpSWF")) { + parseDumpSwf(args); + } else if (nextParam.equals("-help") || nextParam.equals("--help") || nextParam.equals("/?")) { + printHeader(); + printCmdLineUsage(); + System.exit(0); + } else if (args.size() == 1) { + return args.remove(); + } else { + badArguments(); + } + + return null; + } + + public static void printHeader() { + System.out.println(Main.applicationVerName); + for (int i = 0; i < Main.applicationVerName.length(); i++) { + System.out.print("-"); + } + System.out.println(); + } + + public static void badArguments() { + System.err.println("Error: Bad Commandline Arguments!"); + printCmdLineUsage(); + System.exit(1); + } + + private static void setConfigurations(String cfgStr) { + String[] cfgs; + if (cfgStr.contains(",")) { + cfgs = cfgStr.split(","); + } else { + cfgs = new String[]{cfgStr}; + } + + for (String c : cfgs) { + String[] cp; + if (c.contains("=")) { + cp = c.split("="); + } else { + cp = new String[]{c, "1"}; + } + String key = cp[0]; + String value = cp[1]; + if (key.toLowerCase().equals("paralelSpeedUp".toLowerCase())) { + key = "parallelSpeedUp"; + } + for (String bk : commandlineConfigBoolean) { + if (key.toLowerCase().equals(bk.toLowerCase())) { + Boolean bValue = parseBooleanConfigValue(value); + if (bValue != null) { + System.out.println("Config " + bk + " set to " + bValue); + Configuration.setConfig(bk, bValue); + } + } + } + } + } + + private static Boolean parseBooleanConfigValue(String value) { + if (value == null) { + return null; + } + + Boolean bValue = null; + value = value.toLowerCase(); + if (value.equals("0") || value.equals("false") || value.equals("no") || value.equals("off")) { + bValue = false; + } + if (value.equals("1") || value.equals("true") || value.equals("yes") || value.equals("on")) { + bValue = true; + } + return bValue; + } + + private static ExportMode strToExportFormat(String exportFormatStr) { + if (exportFormatStr.equals("pcode")) { + return ExportMode.PCODE; + } else if (exportFormatStr.equals("pcodehex")) { + return ExportMode.PCODEWITHHEX; + } else if (exportFormatStr.equals("hex")) { + return ExportMode.HEX; + } else { + return ExportMode.SOURCE; + } + } + + private static void parseConfig(Queue args) { + if (args.isEmpty()) { + System.err.println("Config values expected"); + badArguments(); + } + setConfigurations(args.remove()); + } + + private static AbortRetryIgnoreHandler parseOnError(Queue args) { + int errorMode = AbortRetryIgnoreHandler.UNDEFINED; + int retryCount = 0; + + if (args.isEmpty()) { + System.err.println("onerror parameter expected"); + badArguments(); + } + String errorModeParameter = args.remove(); + switch (errorModeParameter) { + case "abort": + errorMode = AbortRetryIgnoreHandler.ABORT; + break; + case "retry": + errorMode = AbortRetryIgnoreHandler.RETRY; + if (args.isEmpty()) { + System.err.println("onerror retry count parameter expected"); + badArguments(); + } + + try { + retryCount = Integer.parseInt(args.remove()); + } catch (NumberFormatException nex) { + System.err.println("Bad retry count number"); + } + break; + case "ignore": + errorMode = AbortRetryIgnoreHandler.IGNORE; + break; + } + + return new ConsoleAbortRetryIgnoreHandler(errorMode, retryCount); + } + + private static void parseTimeout(Queue args) { + if (args.isEmpty()) { + System.err.println("timeout parameter expected"); + badArguments(); + } + try { + int timeout = Integer.parseInt(args.remove()); + Configuration.setConfig("decompilationTimeoutSingleMethod", timeout); + } catch (NumberFormatException nex) { + System.err.println("Bad timeout value"); + } + } + + private static void parseAffinity(Queue args) { + if (Platform.isWindows()) { + if (args.isEmpty()) { + System.err.println("affinity parameter expected"); + badArguments(); + } + try { + int affinityMask = Integer.parseInt(args.remove()); + Kernel32.INSTANCE.SetProcessAffinityMask(Kernel32.INSTANCE.GetCurrentProcess(), affinityMask); + } catch (NumberFormatException nex) { + System.err.println("Bad affinityMask value"); + } + } else { + System.err.println("Process affinity setting is only available on Windows platform."); + } + } + + private static void parsePriority(Queue args) { + if (Platform.isWindows()) { + if (args.isEmpty()) { + System.err.println("priority parameter expected"); + badArguments(); + } + String priority = args.remove(); + int priorityClass = 0; + switch (priority) { + case "low": + priorityClass = Kernel32.IDLE_PRIORITY_CLASS; + break; + case "belownormal": + priorityClass = Kernel32.BELOW_NORMAL_PRIORITY_CLASS; + break; + case "normal": + priorityClass = Kernel32.NORMAL_PRIORITY_CLASS; + break; + case "abovenormal": + priorityClass = Kernel32.ABOVE_NORMAL_PRIORITY_CLASS; + break; + case "high": + priorityClass = Kernel32.HIGH_PRIORITY_CLASS; + break; + case "realtime": + priorityClass = Kernel32.REALTIME_PRIORITY_CLASS; + break; + default: + System.err.println("Bad affinityMask value"); + } + if (priorityClass != 0) { + Kernel32.INSTANCE.SetPriorityClass(Kernel32.INSTANCE.GetCurrentProcess(), priorityClass); + } + } else { + System.err.println("Process priority setting is only available on Windows platform."); + } + } + + private static void parseProxy(Queue args) { + int port = 55555; + String portStr = args.peek(); + if (portStr != null && portStr.startsWith("-P")) { + args.remove(); + try { + port = Integer.parseInt(portStr.substring(2)); + } catch (NumberFormatException nex) { + System.err.println("Bad port number"); + } + } + View.execInEventDispatch(new Runnable() { + @Override + public void run() { + if (Main.proxyFrame == null) { + Main.proxyFrame = new ProxyFrame(); + } + } + }); + Main.proxyFrame.setPort(port); + Main.addTrayIcon(); + Main.switchProxy(); + } + + private static void parseExport(Queue args, AbortRetryIgnoreHandler handler, Level traceLevel) { + if (args.size() < 3) { + badArguments(); + } + String[] validExportFormats = new String[]{ + "as", + "pcode", + "image", + "shape", + "movie", + "sound", + "binarydata", + "text", + "textplain", + "all", + "fla", + "xfl" + }; + + if (handler == null) { + handler = new ConsoleAbortRetryIgnoreHandler(AbortRetryIgnoreHandler.UNDEFINED, 0); + } + String exportFormat = args.remove().toLowerCase(); + if (!Arrays.asList(validExportFormats).contains(exportFormat)) { + System.err.println("Invalid export format:" + exportFormat); + badArguments(); + } + File outDir = new File(args.remove()); + File inFile = new File(args.remove()); + if (!inFile.exists()) { + System.err.println("Input SWF file does not exist!"); + badArguments(); + } + commandLineMode = true; + long startTime = System.currentTimeMillis(); + boolean exportOK; + try { + printHeader(); + SWF exfile = new SWF(new FileInputStream(inFile), Configuration.getConfig("parallelSpeedUp", true)); + final Level level = traceLevel; + exfile.addEventListener(new EventListener() { + @Override + public void handleEvent(String event, Object data) { + if (level.intValue() <= Level.FINE.intValue() && event.equals("exporting")) { + System.out.println((String) data); + } + if (event.equals("exported")) { + System.out.println((String) data); + } + } + }); + + switch (exportFormat) { + case "all": + case "all_as": + case "all_pcode": + case "all_pcodehex": + case "all_hex": + ExportMode allExportMode = strToExportFormat(exportFormat.substring(3)); + System.out.println("Exporting images..."); + exfile.exportImages(handler, outDir.getAbsolutePath() + File.separator + "images"); + System.out.println("Exporting shapes..."); + exfile.exportShapes(handler, outDir.getAbsolutePath() + File.separator + "shapes"); + System.out.println("Exporting scripts..."); + exfile.exportActionScript(handler, outDir.getAbsolutePath() + File.separator + "scripts", allExportMode, Configuration.getConfig("parallelSpeedUp", true)); + System.out.println("Exporting movies..."); + exfile.exportMovies(handler, outDir.getAbsolutePath() + File.separator + "movies"); + System.out.println("Exporting sounds..."); + exfile.exportSounds(handler, outDir.getAbsolutePath() + File.separator + "sounds", true, true); + System.out.println("Exporting binaryData..."); + exfile.exportBinaryData(handler, outDir.getAbsolutePath() + File.separator + "binaryData"); + System.out.println("Exporting texts..."); + exfile.exportTexts(handler, outDir.getAbsolutePath() + File.separator + "texts", true); + exportOK = true; + break; + case "image": + exfile.exportImages(handler, outDir.getAbsolutePath()); + exportOK = true; + break; + case "shape": + exfile.exportShapes(handler, outDir.getAbsolutePath()); + exportOK = true; + break; + case "as": + case "pcode": + case "pcodehex": + case "hex": + ExportMode exportMode = strToExportFormat(exportFormat); + boolean parallel = Configuration.getConfig("parallelSpeedUp", true); + if (!args.isEmpty() && args.peek().equals("-selectas3class")) { + args.remove(); + exportOK = true; + while (!args.isEmpty()) { + exportOK = exportOK && exfile.exportAS3Class(args.remove(), outDir.getAbsolutePath(), exportMode, parallel); + } + } else { + exportOK = exfile.exportActionScript(handler, outDir.getAbsolutePath(), exportMode, parallel) != null; + } + break; + case "movie": + exfile.exportMovies(handler, outDir.getAbsolutePath()); + exportOK = true; + break; + case "sound": + exfile.exportSounds(handler, outDir.getAbsolutePath(), true, true); + exportOK = true; + break; + case "binarydata": + exfile.exportBinaryData(handler, outDir.getAbsolutePath()); + exportOK = true; + break; + case "text": + exfile.exportTexts(handler, outDir.getAbsolutePath(), true); + exportOK = true; + break; + case "textplain": + exfile.exportTexts(handler, outDir.getAbsolutePath(), false); + exportOK = true; + break; + case "fla": + exfile.exportFla(handler, outDir.getAbsolutePath(), inFile.getName(), Main.applicationName, Main.applicationVerName, Main.version, Configuration.getConfig("parallelSpeedUp", true)); + exportOK = true; + break; + case "xfl": + exfile.exportXfl(handler, outDir.getAbsolutePath(), inFile.getName(), Main.applicationName, Main.applicationVerName, Main.version, Configuration.getConfig("parallelSpeedUp", true)); + exportOK = true; + break; + default: + exportOK = false; + } + } catch (OutOfMemoryError | Exception ex) { + exportOK = false; + System.err.print("FAIL: Exporting Failed on Exception - "); + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + System.exit(1); + } + long stopTime = System.currentTimeMillis(); + long time = stopTime - startTime; + System.out.println("Export finished. Total export time: " + Helper.formatTimeSec(time)); + if (exportOK) { + System.out.println("OK"); + System.exit(0); + } else { + System.err.println("FAIL"); + System.exit(1); + } + } + + private static void parseCompress(Queue args) throws FileNotFoundException { + if (args.size() < 2) { + badArguments(); + } + + if (SWF.fws2cws(new FileInputStream(args.remove()), new FileOutputStream(args.remove()))) { + System.out.println("OK"); + } else { + System.err.println("FAIL"); + } + } + + private static void parseDecompress(Queue args) throws FileNotFoundException { + if (args.size() < 2) { + badArguments(); + } + + if (SWF.decompress(new FileInputStream(args.remove()), new FileOutputStream(args.remove()))) { + System.out.println("OK"); + System.exit(0); + } else { + System.err.println("FAIL"); + System.exit(1); + } + } + + private static void parseDumpSwf(Queue args) { + if (args.isEmpty()) { + badArguments(); + } + try { + Configuration.dump_tags = true; + Configuration.setConfig("parallelSpeedUp", false); + SWF swf = Main.parseSWF(args.remove()); + } catch (Exception ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + System.exit(1); + } + System.exit(0); + } +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.form b/trunk/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.form new file mode 100644 index 000000000..f040e67b3 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.form @@ -0,0 +1,36 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java new file mode 100644 index 000000000..52375b335 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2013 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.gui; + +/** + * + * @author JPEXS + */ +public class AdvancedSettingsDialog extends AppDialog { + + /** + * Creates new form AdvancedSettingsDialog + */ + public AdvancedSettingsDialog() { + initComponents(); + View.centerScreen(this); + View.setWindowIcon(this); + pack(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setResizable(false); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 300, Short.MAX_VALUE) + ); + + pack(); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java index 5d5a0f333..8328f955c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java @@ -16,16 +16,14 @@ */ package com.jpexs.decompiler.flash.gui; -import com.jpexs.decompiler.flash.AbortRetryIgnoreHandler; import com.jpexs.decompiler.flash.Configuration; -import com.jpexs.decompiler.flash.ConsoleAbortRetryIgnoreHandler; import com.jpexs.decompiler.flash.EventListener; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.Version; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.console.CommandLineArgumentParser; import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel; import com.jpexs.decompiler.flash.gui.proxy.ProxyFrame; -import com.jpexs.decompiler.graph.ExportMode; import com.jpexs.helpers.Cache; import com.jpexs.helpers.Helper; import com.jpexs.helpers.ProgressListener; @@ -51,7 +49,6 @@ import java.net.URLDecoder; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Locale; import java.util.Properties; @@ -97,7 +94,6 @@ public class Main { private static boolean working = false; private static TrayIcon trayIcon; private static MenuItem stopMenuItem; - private static boolean commandLineMode = false; public static MainFrame mainFrame; private static final int UPDATE_SYSTEM_MAJOR = 1; private static final int UPDATE_SYSTEM_MINOR = 0; @@ -119,12 +115,6 @@ public class Main { } loadFromMemoryFrame.setVisible(true); } - private static String[] commandlineConfigBoolean = new String[]{ - "decompile", - "parallelSpeedUp", - "internalFlashViewer", - "autoDeobfuscate", - "cacheOnDisk"}; private static void loadProperties() { Properties prop = new Properties(); @@ -140,10 +130,6 @@ public class Main { } } - public static boolean isCommandLineMode() { - return commandLineMode; - } - /** * Get title of the file * @@ -209,7 +195,7 @@ public class Main { loadingDialog.setPercent(percent); } } - if (Main.isCommandLineMode()) { + if (CommandLineArgumentParser.isCommandLineMode()) { System.out.println(name); } } @@ -694,68 +680,6 @@ public class Main { } - public static void badArguments() { - System.err.println("Error: Bad Commandline Arguments!"); - printCmdLineUsage(); - System.exit(1); - } - - public static void printHeader() { - System.out.println(applicationVerName); - for (int i = 0; i < applicationVerName.length(); i++) { - System.out.print("-"); - } - System.out.println(); - } - - public static void printCmdLineUsage() { - System.out.println("Commandline arguments:"); - System.out.println(" 1) -help | --help | /?"); - System.out.println(" ...shows commandline arguments (this help)"); - System.out.println(" 2) infile"); - System.out.println(" ...opens SWF file with the decompiler GUI"); - System.out.println(" 3) -proxy (-PXXX)"); - System.out.println(" ...auto start proxy in the tray. Optional parameter -P specifies port for proxy. Defaults to 55555. "); - System.out.println(" 4) -export (as|pcode|pcodehex|hex|image|shape|movie|sound|binaryData|text|textplain|all|all_as|all_pcode|all_pcodehex|all_hex) outdirectory infile [-selectas3class class1 class2 ...]"); - System.out.println(" ...export infile sources to outdirectory as AsctionScript code (\"as\" argument) or as PCode (\"pcode\" argument), images, shapes, movies, binaryData, text with formatting, plain text or all."); - System.out.println(" When \"as\" or \"pcode\" type specified, optional \"-selectas3class\" parameter can be passed to export only selected classes (ActionScript 3 only)"); - System.out.println(" 5) -dumpSWF infile"); - System.out.println(" ...dumps list of SWF tags to console"); - System.out.println(" 6) -compress infile outfile"); - System.out.println(" ...Compress SWF infile and save it to outfile"); - System.out.println(" 7) -decompress infile outfile"); - System.out.println(" ...Decompress infile and save it to outfile"); - System.out.println(" 8) -config key=value[,key2=value2][,key3=value3...] [other parameters]"); - System.out.print(" ...Sets configuration values. Available keys[current setting]:"); - for (String key : commandlineConfigBoolean) { - System.out.print(" " + key + "[" + Configuration.getConfig(key) + "]"); - } - System.out.println(""); - System.out.println(" Values are boolean, you can use 0/1, true/false, on/off or yes/no."); - System.out.println(" If no other parameters passed, configuration is saved. Otherwise it is used only once."); - System.out.println(" DO NOT PUT space between comma (,) and next value."); - System.out.println(" 9) -onerror (abort|retryN|ignore)"); - System.out.println(" ...error handling mode. \"abort\" stops the exporting, \"retry\" tries the exporting N times, \"ignore\" ignores the current file"); - System.out.println(" 10) -timeout N"); - System.out.println(" ...decompilation timeout for a single method in AS3 or single action in AS1/2 in seconds"); - System.out.println(); - System.out.println("Examples:"); - System.out.println("java -jar ffdec.jar myfile.swf"); - System.out.println("java -jar ffdec.jar -proxy"); - System.out.println("java -jar ffdec.jar -proxy -P1234"); - System.out.println("java -jar ffdec.jar -export as \"C:\\decompiled\\\" myfile.swf"); - System.out.println("java -jar ffdec.jar -export as \"C:\\decompiled\\\" myfile.swf -selectas3class com.example.MyClass com.example.SecondClass"); - System.out.println("java -jar ffdec.jar -export pcode \"C:\\decompiled\\\" myfile.swf"); - System.out.println("java -jar ffdec.jar -dumpSWF myfile.swf"); - System.out.println("java -jar ffdec.jar -compress myfile.swf myfiledec.swf"); - System.out.println("java -jar ffdec.jar -decompress myfiledec.swf myfile.swf"); - System.out.println("java -jar ffdec.jar -onerror ignore -export as \"C:\\decompiled\\\" myfile.swf"); - System.out.println("java -jar ffdec.jar -onerror retry 5 -export as \"C:\\decompiled\\\" myfile.swf"); - System.out.println("java -jar ffdec.jar -config autoDeobfuscate=1,parallelSpeedUp=0 -export as \"C:\\decompiled\\\" myfile.swf"); - System.out.println(""); - System.out.println("Instead of \"java -jar ffdec.jar\" you can use ffdec.bat on Windows, ffdec.sh on Linux/MacOs"); - } - private static void offerAssociation() { boolean offered = Configuration.getConfig("offeredAssociation"); if (!offered) { @@ -891,13 +815,6 @@ public class Main { startFreeMemThread(); loadProperties(); Configuration.loadFromFile(getConfigFile(), getReplacementsFile()); - int pos = 0; - if (args.length > 0) { - if (args[0].equals("-debug")) { - Configuration.debugMode = true; - pos++; - } - } initLogging(Configuration.debugMode); initLang(); @@ -910,424 +827,18 @@ public class Main { Cache.setStorageType(Cache.STORAGE_MEMORY); } - int errorMode = AbortRetryIgnoreHandler.UNDEFINED; - int retryCount = 0; - Level traceLevel = Level.WARNING; - - if (args.length < pos + 1) { + if (args.length == 0) { initGui(); showModeFrame(); } else { - boolean parameterProcessed = true; - while (parameterProcessed) { - parameterProcessed = false; - if (args[pos].equals("-config")) { - parameterProcessed = true; - pos++; - if (args.length <= pos) { - System.err.println("Config values expected"); - badArguments(); - } - setConfigurations(args[pos]); - pos++; - if (args.length <= pos) { - saveConfig(); - System.out.println("Configuration saved"); - return; - } - } else if (args[pos].equals("-onerror")) { - parameterProcessed = true; - pos++; - if (args.length <= pos) { - System.err.println("onerror parameter expected"); - badArguments(); - } - String errorModeParameter = args[pos]; - switch (errorModeParameter) { - case "abort": - errorMode = AbortRetryIgnoreHandler.ABORT; - break; - case "retry": - errorMode = AbortRetryIgnoreHandler.RETRY; - pos++; - if (args.length <= pos) { - System.err.println("onerror retry count parameter expected"); - badArguments(); - } - - try { - retryCount = Integer.parseInt(args[pos]); - } catch (NumberFormatException nex) { - System.err.println("Bad retry count number"); - } - break; - case "ignore": - errorMode = AbortRetryIgnoreHandler.IGNORE; - break; - } - - pos++; - } else if (args[pos].equals("-timeout")) { - parameterProcessed = true; - pos++; - if (args.length <= pos) { - System.err.println("timeout parameter expected"); - badArguments(); - } - try { - int timeout = Integer.parseInt(args[pos]); - Configuration.setConfig("decompilationTimeoutSingleMethod", timeout); - } catch (NumberFormatException nex) { - System.err.println("Bad timeout value"); - } - - pos++; - } else if (args[pos].equals("-affinity")) { - parameterProcessed = true; - pos++; - if (Platform.isWindows()) { - if (args.length <= pos) { - System.err.println("affinity parameter expected"); - badArguments(); - } - try { - int affinityMask = Integer.parseInt(args[pos]); - Kernel32.INSTANCE.SetProcessAffinityMask(Kernel32.INSTANCE.GetCurrentProcess(), affinityMask); - } catch (NumberFormatException nex) { - System.err.println("Bad affinityMask value"); - } - - pos++; - } else { - System.err.println("Process affinity setting is only available on Windows platform."); - } - } else if (args[pos].equals("-priority")) { - parameterProcessed = true; - pos++; - if (Platform.isWindows()) { - if (args.length <= pos) { - System.err.println("priority parameter expected"); - badArguments(); - } - String priority = args[pos]; - int priorityClass = 0; - switch (priority) { - case "low": - priorityClass = Kernel32.IDLE_PRIORITY_CLASS; - break; - case "belownormal": - priorityClass = Kernel32.BELOW_NORMAL_PRIORITY_CLASS; - break; - case "normal": - priorityClass = Kernel32.NORMAL_PRIORITY_CLASS; - break; - case "abovenormal": - priorityClass = Kernel32.ABOVE_NORMAL_PRIORITY_CLASS; - break; - case "high": - priorityClass = Kernel32.HIGH_PRIORITY_CLASS; - break; - case "realtime": - priorityClass = Kernel32.REALTIME_PRIORITY_CLASS; - break; - default: - System.err.println("Bad affinityMask value"); - } - if (priorityClass != 0) { - Kernel32.INSTANCE.SetPriorityClass(Kernel32.INSTANCE.GetCurrentProcess(), priorityClass); - } - - pos++; - } else { - System.err.println("Process priority setting is only available on Windows platform."); - } - } else if (args[pos].equals("-verbose")) { - parameterProcessed = true; - pos++; - traceLevel = Level.FINE; - } - } - if (args[pos].equals("-removefromcontextmenu")) { - addToContextMenu(false); - System.exit(0); - } else if (args[pos].equals("-addtocontextmenu")) { - addToContextMenu(true); - System.exit(0); - } else if (args[pos].equals("-proxy")) { - int port = 55555; - for (int i = pos; i < args.length; i++) { - if (args[i].startsWith("-P")) { - try { - port = Integer.parseInt(args[pos].substring(2)); - } catch (NumberFormatException nex) { - System.err.println("Bad port number"); - } - } - } - View.execInEventDispatch(new Runnable() { - @Override - public void run() { - if (proxyFrame == null) { - proxyFrame = new ProxyFrame(); - } - } - }); - proxyFrame.setPort(port); - addTrayIcon(); - switchProxy(); - - } else if (args[pos].equals("-export")) { - if (args.length < pos + 4) { - badArguments(); - } - String[] validExportFormats = new String[]{ - "as", - "pcode", - "image", - "shape", - "movie", - "sound", - "binarydata", - "text", - "textplain", - "all", - "fla", - "xfl" - }; - - AbortRetryIgnoreHandler handler = new ConsoleAbortRetryIgnoreHandler(errorMode, retryCount); - String exportFormat = args[pos + 1].toLowerCase(); - if (!Arrays.asList(validExportFormats).contains(exportFormat)) { - System.err.println("Invalid export format:" + exportFormat); - badArguments(); - } - File outDir = new File(args[pos + 2]); - File inFile = new File(args[pos + 3]); - if (!inFile.exists()) { - System.err.println("Input SWF file does not exist!"); - badArguments(); - } - commandLineMode = true; - long startTime = System.currentTimeMillis(); - boolean exportOK; - try { - printHeader(); - SWF exfile = new SWF(new FileInputStream(inFile), Configuration.getConfig("parallelSpeedUp", true)); - final Level level = traceLevel; - exfile.addEventListener(new EventListener() { - @Override - public void handleEvent(String event, Object data) { - if (level.intValue() <= Level.FINE.intValue() && event.equals("exporting")) { - System.out.println((String) data); - } - if (event.equals("exported")) { - System.out.println((String) data); - } - } - }); - - switch (exportFormat) { - case "all": - case "all_as": - case "all_pcode": - case "all_pcodehex": - case "all_hex": - ExportMode allExportMode = strToExportFormat(exportFormat.substring(3)); - System.out.println("Exporting images..."); - exfile.exportImages(handler, outDir.getAbsolutePath() + File.separator + "images"); - System.out.println("Exporting shapes..."); - exfile.exportShapes(handler, outDir.getAbsolutePath() + File.separator + "shapes"); - System.out.println("Exporting scripts..."); - exfile.exportActionScript(handler, outDir.getAbsolutePath() + File.separator + "scripts", allExportMode, Configuration.getConfig("parallelSpeedUp", true)); - System.out.println("Exporting movies..."); - exfile.exportMovies(handler, outDir.getAbsolutePath() + File.separator + "movies"); - System.out.println("Exporting sounds..."); - exfile.exportSounds(handler, outDir.getAbsolutePath() + File.separator + "sounds", true, true); - System.out.println("Exporting binaryData..."); - exfile.exportBinaryData(handler, outDir.getAbsolutePath() + File.separator + "binaryData"); - System.out.println("Exporting texts..."); - exfile.exportTexts(handler, outDir.getAbsolutePath() + File.separator + "texts", true); - exportOK = true; - break; - case "image": - exfile.exportImages(handler, outDir.getAbsolutePath()); - exportOK = true; - break; - case "shape": - exfile.exportShapes(handler, outDir.getAbsolutePath()); - exportOK = true; - break; - case "as": - case "pcode": - case "pcodehex": - case "hex": - ExportMode exportMode = strToExportFormat(exportFormat); - boolean parallel = Configuration.getConfig("parallelSpeedUp", true); - if ((pos + 5 < args.length) && (args[pos + 4].equals("-selectas3class"))) { - exportOK = true; - for (int i = pos + 5; i < args.length; i++) { - exportOK = exportOK && exfile.exportAS3Class(args[i], outDir.getAbsolutePath(), exportMode, parallel); - } - } else { - exportOK = exfile.exportActionScript(handler, outDir.getAbsolutePath(), exportMode, parallel) != null; - } - break; - case "movie": - exfile.exportMovies(handler, outDir.getAbsolutePath()); - exportOK = true; - break; - case "sound": - exfile.exportSounds(handler, outDir.getAbsolutePath(), true, true); - exportOK = true; - break; - case "binarydata": - exfile.exportBinaryData(handler, outDir.getAbsolutePath()); - exportOK = true; - break; - case "text": - exfile.exportTexts(handler, outDir.getAbsolutePath(), true); - exportOK = true; - break; - case "textplain": - exfile.exportTexts(handler, outDir.getAbsolutePath(), false); - exportOK = true; - break; - case "fla": - exfile.exportFla(handler, outDir.getAbsolutePath(), inFile.getName(), applicationName, applicationVerName, version, Configuration.getConfig("parallelSpeedUp", true)); - exportOK = true; - break; - case "xfl": - exfile.exportXfl(handler, outDir.getAbsolutePath(), inFile.getName(), applicationName, applicationVerName, version, Configuration.getConfig("parallelSpeedUp", true)); - exportOK = true; - break; - default: - exportOK = false; - } - } catch (OutOfMemoryError | Exception ex) { - exportOK = false; - System.err.print("FAIL: Exporting Failed on Exception - "); - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - System.exit(1); - } - long stopTime = System.currentTimeMillis(); - long time = stopTime - startTime; - System.out.println("Export finished. Total export time: " + Helper.formatTimeSec(time)); - if (exportOK) { - System.out.println("OK"); - System.exit(0); - } else { - System.err.println("FAIL"); - System.exit(1); - } - } else if (args[pos].equals("-compress")) { - if (args.length < pos + 3) { - badArguments(); - } - - if (SWF.fws2cws(new FileInputStream(args[pos + 1]), new FileOutputStream(args[pos + 2]))) { - System.out.println("OK"); - } else { - System.err.println("FAIL"); - } - } else if (args[pos].equals("-decompress")) { - if (args.length < pos + 3) { - badArguments(); - } - - if (SWF.decompress(new FileInputStream(args[pos + 1]), new FileOutputStream(args[pos + 2]))) { - System.out.println("OK"); - System.exit(0); - } else { - System.err.println("FAIL"); - System.exit(1); - } - } else if (args[pos].equals("-dumpSWF")) { - if (args.length < pos + 2) { - badArguments(); - } - try { - Configuration.dump_tags = true; - Configuration.setConfig("parallelSpeedUp", false); - SWF swf = parseSWF(args[pos + 1]); - } catch (Exception ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - System.exit(1); - } - System.exit(0); - } else if (args[pos].equals("-help") || args[pos].equals("--help") || args[pos].equals("/?")) { - printHeader(); - printCmdLineUsage(); - System.exit(0); - } else if (args.length == pos + 1) { - + String fileToOpen = CommandLineArgumentParser.parseArguments(args); + if (fileToOpen != null) { initGui(); - openFile(args[pos]); - } else { - badArguments(); + openFile(fileToOpen); } } } - private static ExportMode strToExportFormat(String exportFormatStr) { - if (exportFormatStr.equals("pcode")) { - return ExportMode.PCODE; - } else if (exportFormatStr.equals("pcodehex")) { - return ExportMode.PCODEWITHHEX; - } else if (exportFormatStr.equals("hex")) { - return ExportMode.HEX; - } else { - return ExportMode.SOURCE; - } - } - - private static void setConfigurations(String cfgStr) { - String[] cfgs; - if (cfgStr.contains(",")) { - cfgs = cfgStr.split(","); - } else { - cfgs = new String[]{cfgStr}; - } - - for (String c : cfgs) { - String[] cp; - if (c.contains("=")) { - cp = c.split("="); - } else { - cp = new String[]{c, "1"}; - } - String key = cp[0]; - String value = cp[1]; - if (key.toLowerCase().equals("paralelSpeedUp".toLowerCase())) { - key = "parallelSpeedUp"; - } - for (String bk : commandlineConfigBoolean) { - if (key.toLowerCase().equals(bk.toLowerCase())) { - Boolean bValue = parseBooleanConfigValue(value); - if (bValue != null) { - System.out.println("Config " + bk + " set to " + bValue); - Configuration.setConfig(bk, bValue); - } - } - } - } - } - - private static Boolean parseBooleanConfigValue(String value) { - if (value == null) { - return null; - } - - Boolean bValue = null; - value = value.toLowerCase(); - if (value.equals("0") || value.equals("false") || value.equals("no") || value.equals("off")) { - bValue = false; - } - if (value.equals("1") || value.equals("true") || value.equals("yes") || value.equals("on")) { - bValue = true; - } - return bValue; - } - public static String tempFile(String url) throws IOException { File f = new File(getFFDecHome() + "saved" + File.separator); if (!f.exists()) { @@ -1443,6 +954,10 @@ public class Main { (new AboutDialog()).setVisible(true); } + public static void advancedSettings() { + (new AdvancedSettingsDialog()).setVisible(true); + } + public static void autoCheckForUpdates() { Calendar lastUpdatesCheckDate = Configuration.getConfig("lastUpdatesCheckDate", null); if ((lastUpdatesCheckDate == null) || (lastUpdatesCheckDate.getTime().getTime() < Calendar.getInstance().getTime().getTime() - 1000 * 60 * 60 * 24)) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index 72b34173e..bef3a05a3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -391,7 +391,6 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel JCommandButton reloadCommandButton = new JCommandButton(fixCommandTitle(translate("menu.file.reload")), View.getResizableIcon("reload16")); assignListener(reloadCommandButton, "RELOAD"); - editBand.addCommandButton(openCommandButton, RibbonElementPriority.TOP); editBand.addCommandButton(saveCommandButton, RibbonElementPriority.TOP); editBand.addCommandButton(saveasCommandButton, RibbonElementPriority.MEDIUM); @@ -477,7 +476,6 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel miGotoMainClassOnStartup = new JCheckBox(translate("menu.settings.gotoMainClassOnStartup")); //assignListener(miGotoMainClassOnStartup,"GOTODOCUMENTCLASSONSTARTUP"); - settingsBand.addRibbonComponent(new JRibbonComponent(miAutoDeobfuscation)); settingsBand.addRibbonComponent(new JRibbonComponent(miInternalViewer)); settingsBand.addRibbonComponent(new JRibbonComponent(miParallelSpeedUp)); @@ -500,8 +498,15 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel JCommandButton setLanguageCommandButton = new JCommandButton(fixCommandTitle(translate("menu.settings.language")), View.getResizableIcon("setlanguage32")); assignListener(setLanguageCommandButton, "SETLANGUAGE"); languageBand.addCommandButton(setLanguageCommandButton, RibbonElementPriority.TOP); - RibbonTask settingsTask = new RibbonTask(translate("menu.settings"), settingsBand, languageBand); + JRibbonBand advancedSettingsBand = new JRibbonBand(translate("menu.advancedsettings.advancedsettings"), null); + advancedSettingsBand.setResizePolicies((List) Arrays.asList(new CoreRibbonResizePolicies.Mirror(advancedSettingsBand.getControlPanel()), new IconRibbonBandResizePolicy(advancedSettingsBand.getControlPanel()))); + JCommandButton advancedSettingsCommandButton = new JCommandButton(fixCommandTitle(translate("menu.advancedsettings.advancedsettings")), View.getResizableIcon("settings16")); + assignListener(advancedSettingsCommandButton, "ADVANCEDSETTINGS"); + + advancedSettingsBand.addCommandButton(advancedSettingsCommandButton, RibbonElementPriority.MEDIUM); + + RibbonTask settingsTask = new RibbonTask(translate("menu.settings"), settingsBand, languageBand, advancedSettingsBand); //----------------------------------------- HELP ----------------------------------- @@ -2313,6 +2318,9 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel Main.reloadSWF(); } break; + case "ADVANCEDSETTINGS": + Main.advancedSettings(); + break; case "LOADMEMORY": Main.loadFromMemory(); break; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/settings16.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/settings16.png new file mode 100644 index 000000000..67de2c6cc Binary files /dev/null and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/settings16.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties new file mode 100644 index 000000000..732ce2430 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties @@ -0,0 +1,15 @@ +# Copyright (C) 2013 JPEXS +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 6a5c3bec7..5e8dcbf10 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -368,3 +368,4 @@ filter.gfx = ScaleForm GFx files (*.gfx) filter.supported = All supported filetypes (*.swf, *.gfx) work.canceled = Canceled work.restoringControlFlow = Restoring control flow +menu.advancedsettings.advancedsettings = Advanced Settings diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties index 038bd6cab..926319a3e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties @@ -372,3 +372,4 @@ filter.gfx = ScaleForm GFx f\u00e1jlok (*.gfx) filter.supported = Minden t\u00e1mogatott f\u00e1jlt\u00edpus (*.swf, *.gfx) work.canceled = Megszak\u00edtva work.restoringControlFlow = Vez\u00e9rl\u00e9si-folyam helyre\u00e1ll\u00edt\u00e1s +menu.advancedsettings.advancedsettings = Halad\u00f3 be\u00e1ll\u00edt\u00e1sok