Skip to content

Commit c0fee4e

Browse files
committed
2.9.4
04/19/2015 - Added -O to be passed for Krakatau Decompiler/Disassembler/Assembler. (Thanks Storyyeller). 04/19/2015 - Added -skip to be passed for Krakatau Decompiler. (Thanks Storyyeller). 04/19/2015 - Changed the warning window for Python to recommend PyPy. (Thanks Storyyeller). 04/20/2015 - Happy 2015 4/20 (Shoutout to @announce420 for being 2 years old). 04/21/2015 - Started reworking the View Panes. 04/21/2015 - Finished reworking the View Panes - http://i.imgur.com/SqIw4Vj.png - Cheers to whoever's idea this was (I forget sorry <3). 04/21/2015 - Updated CFR to 0_100.jar 04/21/2015 - Added CTRL + R for run. 04/21/2015 - Added CTRL + S for save files as. 04/21/2015 - Added CTRL + T for compile. 04/21/2015 - Added Krakatau optional library. 04/21/2015 - The about pane now provides a lot more up to date information. 04/21/2015 - Changed 'View Panes' to simply 'View'.
1 parent a38032a commit c0fee4e

14 files changed

+749
-356
lines changed
15.9 MB
Binary file not shown.

BytecodeViewer.exe

6.8 MB
Binary file not shown.

README.txt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,4 +333,18 @@ Changelog:
333333
02/28/2015 - Added resource refreshing.
334334
02/28/2015 - Im Frizzy started working on Obfuscation.
335335
03/20/2015 - Updated Dex2Jar to 2.0.
336-
03/20/2015 - Updated CFR to 0_98.jar
336+
03/20/2015 - Updated CFR to 0_98.jar
337+
-----2.9.4-----:
338+
04/19/2015 - Added -O to be passed for Krakatau Decompiler/Disassembler/Assembler. (Thanks Storyyeller).
339+
04/19/2015 - Added -skip to be passed for Krakatau Decompiler. (Thanks Storyyeller).
340+
04/19/2015 - Changed the warning window for Python to recommend PyPy. (Thanks Storyyeller).
341+
04/20/2015 - Happy 2015 4/20 (Shoutout to @announce420 for being 2 years old).
342+
04/21/2015 - Started reworking the View Panes.
343+
04/21/2015 - Finished reworking the View Panes - http://i.imgur.com/SqIw4Vj.png - Cheers to whoever's idea this was (I forget sorry <3).
344+
04/21/2015 - Updated CFR to 0_100.jar
345+
04/21/2015 - Added CTRL + R for run.
346+
04/21/2015 - Added CTRL + S for save files as.
347+
04/21/2015 - Added CTRL + T for compile.
348+
04/21/2015 - Added Krakatau optional library.
349+
04/21/2015 - The about pane now provides a lot more up to date information.
350+
04/21/2015 - Changed 'View Panes' to simply 'View'.
1.33 MB
Binary file not shown.

libs/jd-gui-1.0.0-RC4.jar

7.55 MB
Binary file not shown.

src/the/bytecode/club/bytecodeviewer/BytecodeViewer.java

Lines changed: 80 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import the.bytecode.club.bytecodeviewer.gui.ClassViewer;
3535
import the.bytecode.club.bytecodeviewer.gui.FileNavigationPane;
3636
import the.bytecode.club.bytecodeviewer.gui.MainViewerGUI;
37+
import the.bytecode.club.bytecodeviewer.gui.RunOptions;
3738
import the.bytecode.club.bytecodeviewer.gui.SearchingPane;
3839
import the.bytecode.club.bytecodeviewer.gui.SystemErrConsole;
3940
import the.bytecode.club.bytecodeviewer.gui.WorkPane;
@@ -83,21 +84,23 @@
8384
* fix the randomly sometimes fucked up names on file navigation bug
8485
* make zipfile not include the decode shit
8586
* When you drag a folder, it must add the folder name not just the child into the root jtree path
86-
* add ctrl + r for run
87-
* add ctrl + t for compile
8887
* add stackmapframes to bytecode decompiler
8988
* add stackmapframes remover?
9089
*
91-
* -----2.9.3-----:
92-
* 02/28/2015 - Added drag and drop for any file.
93-
* 02/28/2015 - Added ctrl + w to close the current opened tab.
94-
* 02/28/2015 - Updated to CFR 0_97.jar
95-
* 02/28/2015 - Fixed a concurrency issue with the decompilers.
96-
* 02/28/2015 - Added image resize via scroll on mouse.
97-
* 02/28/2015 - Added resource refreshing.
98-
* 02/28/2015 - Im Frizzy started working on Obfuscation.
99-
* 03/20/2015 - Updated Dex2Jar to 2.0.
100-
* 03/20/2015 - Updated CFR to 0_98.jar
90+
* -----2.9.4-----:
91+
* 04/19/2015 - Added -O to be passed for Krakatau Decompiler/Disassembler/Assembler. (Thanks Storyyeller).
92+
* 04/19/2015 - Added -skip to be passed for Krakatau Decompiler. (Thanks Storyyeller).
93+
* 04/19/2015 - Changed the warning window for Python to recommend PyPy. (Thanks Storyyeller).
94+
* 04/20/2015 - Happy 2015 4/20 (Shoutout to @announce420 for being 2 years old).
95+
* 04/21/2015 - Started reworking the View Panes.
96+
* 04/21/2015 - Finished reworking the View Panes - http://i.imgur.com/SqIw4Vj.png - Cheers to whoever's idea this was (I forget sorry <3).
97+
* 04/21/2015 - Updated CFR to 0_100.jar
98+
* 04/21/2015 - Added CTRL + R for run.
99+
* 04/21/2015 - Added CTRL + S for save files as.
100+
* 04/21/2015 - Added CTRL + T for compile.
101+
* 04/21/2015 - Added Krakatau optional library.
102+
* 04/21/2015 - The about pane now provides a lot more up to date information.
103+
* 04/21/2015 - Changed 'View Panes' to simply 'View'.
101104
*
102105
* @author Konloch
103106
*
@@ -106,13 +109,14 @@
106109
public class BytecodeViewer {
107110

108111
/*per version*/
109-
public static String version = "2.9.3";
112+
public static String version = "2.9.4";
110113
public static String krakatauVersion = "2";
111114
/*the rest*/
112115
public static MainViewerGUI viewer = null;
113116
public static ClassNodeLoader loader = new ClassNodeLoader(); //might be insecure due to assholes targeting BCV, however that's highly unlikely.
114117
public static String python = "";
115118
public static String rt = "";
119+
public static String library = "";
116120
public static SecurityMan sm = new SecurityMan();
117121
public static HashMap<String, ClassNode> loadedClasses = new HashMap<String, ClassNode>();
118122
public static HashMap<String, byte[]> loadedResources = new HashMap<String, byte[]>();
@@ -919,6 +923,69 @@ public static void checkHotKey(KeyEvent e) {
919923
} else if ((e.getKeyCode() == KeyEvent.VK_N) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
920924
last = System.currentTimeMillis();
921925
BytecodeViewer.resetWorkSpace(true);
926+
} else if ((e.getKeyCode() == KeyEvent.VK_T) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
927+
last = System.currentTimeMillis();
928+
BytecodeViewer.compile(true);
929+
} else if ((e.getKeyCode() == KeyEvent.VK_R) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
930+
last = System.currentTimeMillis();
931+
if(BytecodeViewer.getLoadedClasses().isEmpty()) {
932+
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
933+
return;
934+
}
935+
new RunOptions().setVisible(true);
936+
} else if ((e.getKeyCode() == KeyEvent.VK_S) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
937+
last = System.currentTimeMillis();
938+
939+
if(BytecodeViewer.getLoadedClasses().isEmpty()) {
940+
BytecodeViewer.showMessage("First open a class, jar, zip, apk or dex file.");
941+
return;
942+
}
943+
if(viewer.autoCompileSmali.isSelected() && !BytecodeViewer.compile(false))
944+
return;
945+
JFileChooser fc = new JFileChooser();
946+
fc.setFileFilter(viewer.new ZipFileFilter());
947+
fc.setFileHidingEnabled(false);
948+
fc.setAcceptAllFileFilterUsed(false);
949+
int returnVal = fc.showSaveDialog(viewer);
950+
if (returnVal == JFileChooser.APPROVE_OPTION) {
951+
File file = fc.getSelectedFile();
952+
if(!file.getAbsolutePath().endsWith(".zip"))
953+
file = new File(file.getAbsolutePath()+".zip");
954+
955+
if(file.exists()) {
956+
JOptionPane pane = new JOptionPane(
957+
"Are you sure you wish to overwrite this existing file?");
958+
Object[] options = new String[] { "Yes", "No" };
959+
pane.setOptions(options);
960+
JDialog dialog = pane.createDialog(BytecodeViewer.viewer,
961+
"Bytecode Viewer - Overwrite File");
962+
dialog.setVisible(true);
963+
Object obj = pane.getValue();
964+
int result = -1;
965+
for (int k = 0; k < options.length; k++)
966+
if (options[k].equals(obj))
967+
result = k;
968+
969+
if (result == 0) {
970+
file.delete();
971+
} else {
972+
return;
973+
}
974+
}
975+
976+
final File file2 = file;
977+
978+
BytecodeViewer.viewer.setIcon(true);
979+
Thread t = new Thread() {
980+
@Override
981+
public void run() {
982+
JarUtils.saveAsJar(BytecodeViewer.getLoadedClasses(),
983+
file2.getAbsolutePath());
984+
BytecodeViewer.viewer.setIcon(false);
985+
}
986+
};
987+
t.start();
988+
}
922989
} else if ((e.getKeyCode() == KeyEvent.VK_W) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
923990
last = System.currentTimeMillis();
924991
if(viewer.workPane.getCurrentViewer() != null)

src/the/bytecode/club/bytecodeviewer/Settings.java

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ else if(BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel
113113
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "6", false);
114114
else if(BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1Krakatau.getModel()))
115115
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
116-
else if(BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1KrakatauEditable.getModel()))
116+
else if(BytecodeViewer.viewer.panelGroup1.isSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel()))
117117
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
118118

119119
if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2None.getModel()))
@@ -132,7 +132,7 @@ else if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel
132132
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "6", false);
133133
else if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2Krakatau.getModel()))
134134
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
135-
else if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2KrakatauEditable.getModel()))
135+
else if(BytecodeViewer.viewer.panelGroup2.isSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel()))
136136
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
137137

138138
if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3None.getModel()))
@@ -151,7 +151,7 @@ else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel
151151
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "6", false);
152152
else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3Krakatau.getModel()))
153153
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "7", false);
154-
else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3KrakatauEditable.getModel()))
154+
else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel()))
155155
DiskWriter.writeNewLine(BytecodeViewer.settingsName, "8", false);
156156

157157
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.refreshOnChange.isSelected()), false);
@@ -161,10 +161,23 @@ else if(BytecodeViewer.viewer.panelGroup3.isSelected(BytecodeViewer.viewer.panel
161161
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.lastDirectory, false);
162162
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.python, false);
163163
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.rt, false);
164-
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.pane1Editable.isSelected()), false);
165-
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.pane2Editable.isSelected()), false);
166-
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.pane3Editable.isSelected()), false);
164+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel1Proc_E.isSelected()), false);
165+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel1CFR_E.isSelected()), false);
166+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel1Fern_E.isSelected()), false);
167+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel1Krakatau_E.isSelected()), false);
168+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel1Smali_E.isSelected()), false);
169+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel2Proc_E.isSelected()), false);
170+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel2CFR_E.isSelected()), false);
171+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel2Fern_E.isSelected()), false);
172+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel2Krakatau_E.isSelected()), false);
173+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel2Smali_E.isSelected()), false);
174+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel3Proc_E.isSelected()), false);
175+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel3CFR_E.isSelected()), false);
176+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel3Fern_E.isSelected()), false);
177+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel3Krakatau_E.isSelected()), false);
178+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.panel3Smali_E.isSelected()), false);
167179
DiskWriter.writeNewLine(BytecodeViewer.settingsName, String.valueOf(BytecodeViewer.viewer.decodeAPKResources.isSelected()), false);
180+
DiskWriter.writeNewLine(BytecodeViewer.settingsName, BytecodeViewer.library, false);
168181
} catch(Exception e) {
169182
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
170183
}
@@ -270,7 +283,7 @@ else if(decompiler == 6)
270283
else if(decompiler == 7)
271284
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1Krakatau.getModel(), true);
272285
else if(decompiler == 8)
273-
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1KrakatauEditable.getModel(), true);
286+
BytecodeViewer.viewer.panelGroup1.setSelected(BytecodeViewer.viewer.panel1KrakatauBytecode.getModel(), true);
274287

275288
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 82, false));
276289
if(decompiler == 0)
@@ -290,7 +303,7 @@ else if(decompiler == 6)
290303
else if(decompiler == 7)
291304
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2Krakatau.getModel(), true);
292305
else if(decompiler == 8)
293-
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2KrakatauEditable.getModel(), true);
306+
BytecodeViewer.viewer.panelGroup2.setSelected(BytecodeViewer.viewer.panel2KrakatauBytecode.getModel(), true);
294307

295308
decompiler = Integer.parseInt(DiskReader.loadString(BytecodeViewer.settingsName, 83, false));
296309
if(decompiler == 0)
@@ -310,7 +323,7 @@ else if(decompiler == 6)
310323
else if(decompiler == 7)
311324
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3Krakatau.getModel(), true);
312325
else if(decompiler == 8)
313-
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3KrakatauEditable.getModel(), true);
326+
BytecodeViewer.viewer.panelGroup3.setSelected(BytecodeViewer.viewer.panel3KrakatauBytecode.getModel(), true);
314327

315328
BytecodeViewer.viewer.refreshOnChange.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 84, false)));
316329

@@ -324,12 +337,26 @@ else if(decompiler == 8)
324337
BytecodeViewer.lastDirectory = DiskReader.loadString(BytecodeViewer.settingsName, 88, false);
325338
BytecodeViewer.python = DiskReader.loadString(BytecodeViewer.settingsName, 89, false);
326339
BytecodeViewer.rt = DiskReader.loadString(BytecodeViewer.settingsName, 90, false);
327-
BytecodeViewer.viewer.pane1Editable.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 91, false)));
328-
BytecodeViewer.viewer.pane2Editable.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 92, false)));
329-
BytecodeViewer.viewer.pane3Editable.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 93, false)));
330-
BytecodeViewer.viewer.decodeAPKResources.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 94, false)));
340+
BytecodeViewer.viewer.panel1Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 91, false)));
341+
BytecodeViewer.viewer.panel1CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 92, false)));
342+
BytecodeViewer.viewer.panel1Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 93, false)));
343+
BytecodeViewer.viewer.panel1Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 94, false)));
344+
BytecodeViewer.viewer.panel1Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 95, false)));
345+
BytecodeViewer.viewer.panel2Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 96, false)));
346+
BytecodeViewer.viewer.panel2CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 97, false)));
347+
BytecodeViewer.viewer.panel2Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 98, false)));
348+
BytecodeViewer.viewer.panel2Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 99, false)));
349+
BytecodeViewer.viewer.panel2Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 100, false)));
350+
BytecodeViewer.viewer.panel3Proc_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 101, false)));
351+
BytecodeViewer.viewer.panel3CFR_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 101, false)));
352+
BytecodeViewer.viewer.panel3Fern_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 103, false)));
353+
BytecodeViewer.viewer.panel3Krakatau_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 104, false)));
354+
BytecodeViewer.viewer.panel3Smali_E.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 105, false)));
355+
BytecodeViewer.viewer.decodeAPKResources.setSelected(Boolean.parseBoolean(DiskReader.loadString(BytecodeViewer.settingsName, 106, false)));
356+
BytecodeViewer.library = DiskReader.loadString(BytecodeViewer.settingsName, 107, false);
331357
} catch(Exception e) {
332358
//ignore because errors are expected, first start up and outdated settings.
359+
e.printStackTrace();
333360
}
334361
}
335362

src/the/bytecode/club/bytecodeviewer/compilers/KrakatauAssembler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class KrakatauAssembler extends Compiler {
2121
@Override
2222
public byte[] compile(String contents, String name) {
2323
if(BytecodeViewer.python.equals("")) {
24-
BytecodeViewer.showMessage("You need to set your Python 2.7 executable path.");
24+
BytecodeViewer.showMessage("You need to set your Python (or PyPy for speed) 2.7 executable path.");
2525
BytecodeViewer.viewer.pythonC();
2626
}
2727

@@ -46,6 +46,7 @@ public byte[] compile(String contents, String name) {
4646
try {
4747
ProcessBuilder pb = new ProcessBuilder(
4848
BytecodeViewer.python,
49+
"-O", //love you storyyeller <3
4950
BytecodeViewer.krakatauWorkingDirectory + BytecodeViewer.fs + "assemble.py",
5051
"-out",
5152
tempDirectory.getAbsolutePath(),

0 commit comments

Comments
 (0)