修复穿山甲demo存在时不获取路径的BUG
自动打包程序新增批量打包广告源SDK 配置文件manual字段新增data和end字段,data为添加的内容,end为检测到结束的表示,意思是从find到end这一段由data替换
This commit is contained in:
parent
4e2efcc143
commit
561177d0f4
@ -2,7 +2,7 @@
|
|||||||
"array": [
|
"array": [
|
||||||
{
|
{
|
||||||
"title": "广点通",
|
"title": "广点通",
|
||||||
"ltName": "GDTUnionSDK_QY.lt",
|
"ltName": "tgd",
|
||||||
"manifest": [
|
"manifest": [
|
||||||
"<service android:name=\"com.qq.e.comm.DownloadService\" android:exported=\"false\" />",
|
"<service android:name=\"com.qq.e.comm.DownloadService\" android:exported=\"false\" />",
|
||||||
"<activity android:name=\"com.qq.e.ads.ADActivity\" android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\" />",
|
"<activity android:name=\"com.qq.e.ads.ADActivity\" android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\" />",
|
||||||
@ -76,7 +76,9 @@
|
|||||||
{
|
{
|
||||||
"class": "com.uniplay.adsdk.basic.RuleManage",
|
"class": "com.uniplay.adsdk.basic.RuleManage",
|
||||||
"find": ".method public configRight",
|
"find": ".method public configRight",
|
||||||
"msg": "仅保留const-string v0, \"\" return-object v0"
|
"msg": "仅保留const-string v0, \"\" return-object v0",
|
||||||
|
"data":".method public configRight(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;\n.locals 3\n.prologue\nconst-string v0, \"\" \nreturn-object v0\n",
|
||||||
|
"end":".end method"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
24
config.cfg
24
config.cfg
@ -1,21 +1,13 @@
|
|||||||
{
|
{
|
||||||
"1": "/home/yutou/AndroidStudioProjects/ADSDK_v5/sdk_rx/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/",
|
"1": "D:\\AndroidStudio_Data\\ADSDK_v5\\sdk_rx\\build\\intermediates\\javac\\debug\\classes\\com",
|
||||||
"2": "/home/yutou/AndroidStudioProjects/ADSDK_v5/qyadsdk/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/",
|
"2": "D:\\AndroidStudio_Data\\ADSDK_v5\\qyadsdk\\build\\intermediates\\javac\\debug\\classes\\com",
|
||||||
"3": "F:/AndroidStudio_Data/GameSDK/sdk_rx/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/",
|
|
||||||
"4": "/home/yutou/AndroidStudioProjects/ADSDK_v5/sdk_rx/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/",
|
|
||||||
"5": "/home/yutou/AndroidStudioProjects/ADSDK_v5/qyadsdk/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/",
|
|
||||||
"6": "/home/yutou/AndroidStudioProjects/ADSDK_v5/Test/build/intermediates/javac/debug/classes/com/",
|
|
||||||
"switch": "1",
|
"switch": "1",
|
||||||
"input": "/media/yutou/_dde_data/AndroidStudio_Data/buildTools/com.zip",
|
"input": "com.zip",
|
||||||
"out": "/media/yutou/_dde_data/AndroidStudio_Data/buildTools/",
|
"out": "",
|
||||||
"dx": "dx.jar",
|
"dx": "dx.jar",
|
||||||
"array": [
|
"array": [
|
||||||
"rd_rx",
|
"aa",
|
||||||
"qy_rx",
|
"tl"
|
||||||
"rx",
|
|
||||||
"rd_rx",
|
|
||||||
"qy_rx",
|
|
||||||
"atest"
|
|
||||||
],
|
],
|
||||||
"csjConfig": {
|
"csjConfig": {
|
||||||
"xml": {
|
"xml": {
|
||||||
@ -43,8 +35,8 @@
|
|||||||
"name": "${demoRoot}/res/raw/*"
|
"name": "${demoRoot}/res/raw/*"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command":"delete",
|
"command": "delete",
|
||||||
"name":"${demoRoot}/lib/*"
|
"name": "${demoRoot}/lib/*"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,7 @@
|
|||||||
package com.qy.utils;
|
package com.qy.utils;
|
||||||
|
|
||||||
import java.awt.Desktop;
|
import java.awt.Desktop;
|
||||||
import java.io.BufferedReader;
|
import java.io.*;
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.sql.SQLOutput;
|
import java.sql.SQLOutput;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -69,16 +64,67 @@ public class AutoRandomAdSDK {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
new AutoRandomAdSDK(new File("JooMobAdSDK_6.1.8.jar"), "5600", "5", 1, null);
|
// new AutoRandomAdSDK(new File("JooMobAdSDK_6.1.8.jar"), "5600", "5", 1, null);
|
||||||
// new AutoRandomAdSDK(new File("GDTSDK.unionNormal.4.100.970.jar"), 0, null);
|
// new AutoRandomAdSDK(new File("GDTSDK.unionNormal.4.100.970.jar"), 0, null);
|
||||||
|
JSONArray array = new JSONArray();
|
||||||
|
|
||||||
|
JSONObject gdt = new JSONObject();
|
||||||
|
gdt.put("file", "D:\\IDEA\\android_sdk_tools\\GDTSDK.unionNormal.4.170.1040.jar");
|
||||||
|
gdt.put("version", "5700");
|
||||||
|
gdt.put("type", "1");
|
||||||
|
gdt.put("index", 0);
|
||||||
|
gdt.put("packageName", "com.gzlt.tgttaxc.lmd1.tgd");
|
||||||
|
array.put(gdt);
|
||||||
|
|
||||||
|
JSONObject unplay = new JSONObject();
|
||||||
|
unplay.put("file", "D:\\IDEA\\android_sdk_tools\\JooMobAdSDK_6.1.8.jar");
|
||||||
|
unplay.put("version", "5700");
|
||||||
|
unplay.put("type", "5");
|
||||||
|
unplay.put("index", 1);
|
||||||
|
unplay.put("packageName", "com.gzlt.tgttaxc.lmd1.up");
|
||||||
|
array.put(unplay);
|
||||||
|
|
||||||
|
JSONObject qy = new JSONObject();
|
||||||
|
qy.put("file", "D:\\IDEA\\android_sdk_tools\\classes.jar");
|
||||||
|
qy.put("version", "5700");
|
||||||
|
qy.put("type", "0");
|
||||||
|
qy.put("packageName", "com.gzlt.tgttaxc.lmd1.ww");
|
||||||
|
qy.put("index", 3);
|
||||||
|
array.put(qy);
|
||||||
|
new AutoRandomAdSDK(array, new SmaliApkToolsPath() {
|
||||||
|
@Override
|
||||||
|
public void smaliPath(String path) {
|
||||||
|
System.out.println("完成:"+path);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoRandomAdSDK() {
|
public AutoRandomAdSDK() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoRandomAdSDK(File sdk, String version, String type, int cfgIndex, SmaliApkToolsPath inster) {
|
public AutoRandomAdSDK(JSONArray batch, SmaliApkToolsPath inter) {
|
||||||
|
final JSONArray array = new JSONArray();
|
||||||
|
for (Object o : batch) {
|
||||||
|
final JSONObject item = (JSONObject) o;
|
||||||
|
autoRandomAdSDK(new File(item.getString("file")), item.getString("version"), item
|
||||||
|
.getString("type"), item.getString("packageName"), item.getInt("index"), new SmaliApkToolsPath() {
|
||||||
|
public void smaliPath(String path) {
|
||||||
|
item.put("path", path);
|
||||||
|
array.put(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
inter.smaliPath(array.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void autoRandomAdSDK(File sdk, String version, String type, String packageName, int cfgIndex, SmaliApkToolsPath inster) {
|
||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
|
if (inster == null) {
|
||||||
|
inster = path -> {
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
this.inter = inster;
|
this.inter = inster;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.sdktype = type;
|
this.sdktype = type;
|
||||||
@ -88,9 +134,21 @@ public class AutoRandomAdSDK {
|
|||||||
}
|
}
|
||||||
this.sdk = sdk;
|
this.sdk = sdk;
|
||||||
config = cfg.getJSONArray("array").getJSONObject(cfgIndex);
|
config = cfg.getJSONArray("array").getJSONObject(cfgIndex);
|
||||||
|
if (packageName != null) {
|
||||||
|
String[] pname = packageName.split("\\.");
|
||||||
|
JSONArray random = new JSONArray();
|
||||||
|
for (String pn : pname) {
|
||||||
|
random.put(pn);
|
||||||
|
}
|
||||||
|
this.config.put("random", random);
|
||||||
|
}
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AutoRandomAdSDK(File sdk, String version, String type, int cfgIndex, SmaliApkToolsPath inster) {
|
||||||
|
autoRandomAdSDK(sdk, version, type, null, cfgIndex, inster);
|
||||||
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
adClass = new HashMap<String, File>();
|
adClass = new HashMap<String, File>();
|
||||||
nowAdClass = new HashMap<String, File>();
|
nowAdClass = new HashMap<String, File>();
|
||||||
@ -219,7 +277,7 @@ public class AutoRandomAdSDK {
|
|||||||
|
|
||||||
|
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
JSONArray array = config.isNull("filter")?null:config.getJSONArray("filter");
|
JSONArray array = config.isNull("filter") ? null : config.getJSONArray("filter");
|
||||||
if (array != null) {
|
if (array != null) {
|
||||||
List<String> list = new ArrayList<>();
|
List<String> list = new ArrayList<>();
|
||||||
for (int i = 0; i < array.length(); i++) {
|
for (int i = 0; i < array.length(); i++) {
|
||||||
@ -253,20 +311,46 @@ public class AutoRandomAdSDK {
|
|||||||
BufferedReader reader = new BufferedReader(new FileReader(file));
|
BufferedReader reader = new BufferedReader(new FileReader(file));
|
||||||
String tmp;
|
String tmp;
|
||||||
int index = 1;
|
int index = 1;
|
||||||
|
boolean find = false;
|
||||||
|
boolean end = false;
|
||||||
|
boolean write = false;
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
while ((tmp = reader.readLine()) != null) {
|
while ((tmp = reader.readLine()) != null) {
|
||||||
if (tmp.contains(json.getString("find"))) {
|
if (tmp.contains(json.getString("find"))) {
|
||||||
list.add(index);
|
list.add(index);
|
||||||
|
find = true;
|
||||||
|
}
|
||||||
|
if (find && !write) {
|
||||||
|
buffer.append(json.getString("data"));
|
||||||
|
write = true;
|
||||||
|
}
|
||||||
|
if (find && tmp.contains(json.getString("end"))) {
|
||||||
|
end = true;
|
||||||
|
find = false;
|
||||||
|
}
|
||||||
|
if (!find) {
|
||||||
|
buffer.append(tmp).append("\n");
|
||||||
|
if (end) {
|
||||||
|
end = false;
|
||||||
|
write = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
reader.close();
|
reader.close();
|
||||||
Desktop.getDesktop().open(file);
|
FileWriter writer = new FileWriter(file);
|
||||||
|
writer.write(buffer.toString());
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
|
out();
|
||||||
|
reader.close();
|
||||||
|
// Desktop.getDesktop().open(file);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
System.out.println("请手动打开:" + file.getAbsolutePath() + " 文件");
|
System.out.println("请手动打开:" + file.getAbsolutePath() + " 文件");
|
||||||
}
|
}
|
||||||
String index = "";
|
/* String index = "";
|
||||||
for (Integer integer : list) {
|
for (Integer integer : list) {
|
||||||
System.out.println("请修改第:" + integer + " 行附近的代码");
|
System.out.println("请修改第:" + integer + " 行附近的代码");
|
||||||
index += integer + ",";
|
index += integer + ",";
|
||||||
@ -278,21 +362,23 @@ public class AutoRandomAdSDK {
|
|||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
out();
|
out();
|
||||||
}
|
}
|
||||||
});
|
});*/
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void show(File file){
|
|
||||||
|
private void show(File file) {
|
||||||
for (File listFile : file.listFiles()) {
|
for (File listFile : file.listFiles()) {
|
||||||
if(listFile.isDirectory()){
|
if (listFile.isDirectory()) {
|
||||||
show(listFile);
|
show(listFile);
|
||||||
}else{
|
} else {
|
||||||
System.out.println(">?"+listFile.getAbsolutePath());
|
System.out.println(">?" + listFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void out() {
|
private void out() {
|
||||||
if (!isPackage) {
|
if (!isPackage) {
|
||||||
if (inter != null) {
|
if (inter != null) {
|
||||||
@ -334,19 +420,19 @@ public class AutoRandomAdSDK {
|
|||||||
} else {
|
} else {
|
||||||
System.out.println(sdk.getAbsolutePath() + ".out" + File.separator + sdk.getName());
|
System.out.println(sdk.getAbsolutePath() + ".out" + File.separator + sdk.getName());
|
||||||
|
|
||||||
String exec=config.getString("dex2jar") + " " + sdk.getAbsolutePath() + ".out" + File.separator + sdk.getName();
|
String exec = config.getString("dex2jar") + " " + sdk.getAbsolutePath() + ".out" + File.separator + sdk.getName();
|
||||||
System.out.println("exec:"+exec);
|
System.out.println("exec:" + exec);
|
||||||
Process process = Runtime.getRuntime().exec(exec);
|
Process process = Runtime.getRuntime().exec(exec);
|
||||||
process.waitFor();
|
process.waitFor();
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
process=Runtime.getRuntime().exec(exec);
|
process = Runtime.getRuntime().exec(exec);
|
||||||
process.waitFor();
|
process.waitFor();
|
||||||
lt = new File(sdk.getAbsolutePath().split(sdk.getName())[0], sdk.getName().replace(".jar", "-dex2jar.jar"));
|
lt = new File(sdk.getAbsolutePath().split(sdk.getName())[0], sdk.getName().replace(".jar", "-dex2jar.jar"));
|
||||||
}
|
}
|
||||||
System.out.println(">>>:" + lt.getAbsolutePath());
|
System.out.println(">>>:" + lt.getAbsolutePath());
|
||||||
if (lt.exists()) {
|
if (lt.exists()) {
|
||||||
nLt = new File(config.getString("ltName"));
|
nLt = new File(config.getString("ltName"));
|
||||||
if(nLt.exists()){
|
if (nLt.exists()) {
|
||||||
nLt.delete();
|
nLt.delete();
|
||||||
}
|
}
|
||||||
lt.renameTo(nLt);
|
lt.renameTo(nLt);
|
||||||
@ -376,21 +462,21 @@ public class AutoRandomAdSDK {
|
|||||||
File filePath = new File(file.getAbsolutePath().replace(file.getName(), ""));
|
File filePath = new File(file.getAbsolutePath().replace(file.getName(), ""));
|
||||||
|
|
||||||
for (File fs : filePath.listFiles()) {
|
for (File fs : filePath.listFiles()) {
|
||||||
System.out.println(fs.getAbsolutePath().replace(new File("").getAbsolutePath(),""));
|
System.out.println(fs.getAbsolutePath().replace(new File("").getAbsolutePath(), ""));
|
||||||
if(fs.isDirectory()){
|
if (fs.isDirectory()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(!fs.getName().startsWith(fileName)){
|
if (!fs.getName().startsWith(fileName)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String nName = getNewName(fs.getName());
|
String nName = getNewName(fs.getName());
|
||||||
if (fs.getName().startsWith(fileName + "$")) {
|
if (fs.getName().startsWith(fileName + "$")) {
|
||||||
|
|
||||||
if (getNewName(fs.getName()).endsWith("[notmover]")) {
|
if (getNewName(fs.getName()).endsWith("[notmover]")) {
|
||||||
Tools.copyFileToName(fs.getAbsolutePath(), fs.getAbsolutePath(),
|
Tools.copyFileToName(fs.getAbsolutePath(), fs.getAbsolutePath(), fs
|
||||||
nName + "$" + fs.getName().split("\\$")[1], true);
|
.getName().replace(fs.getName().split("\\$")[0], nName), true);
|
||||||
} else {
|
} else {
|
||||||
moveFile(fs, key, nName + "$" + fs.getName().split("\\$")[1],false);
|
moveFile(fs, key, fs.getName().replace(fs.getName().split("\\$")[0], nName), false);
|
||||||
}
|
}
|
||||||
fs.delete();
|
fs.delete();
|
||||||
}
|
}
|
||||||
@ -400,12 +486,12 @@ public class AutoRandomAdSDK {
|
|||||||
Tools.copyFileToName(file.getAbsolutePath(), file.getAbsolutePath().replace(file.getName(), ""),
|
Tools.copyFileToName(file.getAbsolutePath(), file.getAbsolutePath().replace(file.getName(), ""),
|
||||||
getNewName(file.getName()) + ".smali", true);
|
getNewName(file.getName()) + ".smali", true);
|
||||||
} else {
|
} else {
|
||||||
moveFile(file, key, getNewName(file.getName()) + ".smali",true);
|
moveFile(file, key, getNewName(file.getName()) + ".smali", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
file.delete();
|
file.delete();
|
||||||
}
|
}
|
||||||
System.out.println("配置:"+config.getBoolean("isAllPackage"));
|
System.out.println("配置:" + config.getBoolean("isAllPackage"));
|
||||||
if (config.getBoolean("isAllPackage")) {
|
if (config.getBoolean("isAllPackage")) {
|
||||||
String tmp = nowAdClass.keySet().iterator().next();
|
String tmp = nowAdClass.keySet().iterator().next();
|
||||||
File path = new File((nowAdClass.get(tmp)).getAbsolutePath());
|
File path = new File((nowAdClass.get(tmp)).getAbsolutePath());
|
||||||
@ -426,7 +512,7 @@ public class AutoRandomAdSDK {
|
|||||||
tmp = tmp.replace("/", File.separator);
|
tmp = tmp.replace("/", File.separator);
|
||||||
String t = tmp.substring(0, 1);
|
String t = tmp.substring(0, 1);
|
||||||
if (t.equals("+")) {
|
if (t.equals("+")) {
|
||||||
path = nowAdClass.get(key).getAbsolutePath() + tmp.replace("+","");
|
path = nowAdClass.get(key).getAbsolutePath() + tmp.replace("+", "");
|
||||||
} else {
|
} else {
|
||||||
path = rootPath + File.separator + "smali" + tmp;
|
path = rootPath + File.separator + "smali" + tmp;
|
||||||
}
|
}
|
||||||
@ -466,8 +552,8 @@ public class AutoRandomAdSDK {
|
|||||||
new File(rootPath + File.separator + tmp).mkdirs();
|
new File(rootPath + File.separator + tmp).mkdirs();
|
||||||
movesdk(file, tmp);
|
movesdk(file, tmp);
|
||||||
} else {
|
} else {
|
||||||
boolean data=file.renameTo(new File(rootPath + File.separator + toPath, file.getName()));
|
boolean data = file.renameTo(new File(rootPath + File.separator + toPath, file.getName()));
|
||||||
// System.out.println("移动文件:"+file.getAbsolutePath().replace(rootPath, "")+" 到"+(rootPath + File.separator + toPath)+" "+data);
|
// System.out.println("移动文件:"+file.getAbsolutePath().replace(rootPath, "")+" 到"+(rootPath + File.separator + toPath)+" "+data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -516,9 +602,9 @@ public class AutoRandomAdSDK {
|
|||||||
tmpName = name;
|
tmpName = name;
|
||||||
}
|
}
|
||||||
String nName;
|
String nName;
|
||||||
if(config.getJSONObject("rename").isNull(tmpName.contains("$") ? tmpName.split("\\$")[0] : tmpName)){
|
if (config.getJSONObject("rename").isNull(tmpName.contains("$") ? tmpName.split("\\$")[0] : tmpName)) {
|
||||||
nName=name;
|
nName = name;
|
||||||
}else{
|
} else {
|
||||||
nName = config.getJSONObject("rename")
|
nName = config.getJSONObject("rename")
|
||||||
.getString(tmpName.contains("$") ? tmpName.split("\\$")[0] : tmpName);
|
.getString(tmpName.contains("$") ? tmpName.split("\\$")[0] : tmpName);
|
||||||
}
|
}
|
||||||
|
@ -231,6 +231,8 @@ public class CsjTools {
|
|||||||
if (new File(csjFile.getName().replace(".apk", "")).exists()) {
|
if (new File(csjFile.getName().replace(".apk", "")).exists()) {
|
||||||
System.out.println(">?>>"+new File(csjFile.getName().replace(".apk", "")).getAbsolutePath());
|
System.out.println(">?>>"+new File(csjFile.getName().replace(".apk", "")).getAbsolutePath());
|
||||||
unPackageCSJ = true;
|
unPackageCSJ = true;
|
||||||
|
csj_Path = new File(csjFile.getName().replace(".apk", "")).getAbsolutePath();
|
||||||
|
csj_res = csj_Path + File.separator + "res" + File.separator + "values";
|
||||||
}
|
}
|
||||||
SmaliUtils utils = new SmaliUtils();
|
SmaliUtils utils = new SmaliUtils();
|
||||||
// Tools.deleteFiles(new File("").getAbsolutePath() + File.separator + new File(csjPath).getName().replace(".apk", File.separator));
|
// Tools.deleteFiles(new File("").getAbsolutePath() + File.separator + new File(csjPath).getName().replace(".apk", File.separator));
|
||||||
|
Loading…
Reference in New Issue
Block a user