Rename OSX to macOS and iPhoneOS to iOS.
This commit is contained in:
parent
292c952e3b
commit
8823eae328
245 changed files with 1151 additions and 1149 deletions
|
|
@ -55,7 +55,7 @@ env_mono.add_source_files(env.modules_sources, "utils/*.cpp")
|
|||
|
||||
env_mono.add_source_files(env.modules_sources, "mono_gd/support/*.cpp")
|
||||
|
||||
if env["platform"] in ["osx", "iphone"]:
|
||||
if env["platform"] in ["macos", "ios"]:
|
||||
env_mono.add_source_files(env.modules_sources, "mono_gd/support/*.mm")
|
||||
env_mono.add_source_files(env.modules_sources, "mono_gd/support/*.m")
|
||||
elif env["platform"] == "android":
|
||||
|
|
|
|||
|
|
@ -63,15 +63,15 @@ def copy_file(src_dir, dst_dir, src_name, dst_name=""):
|
|||
|
||||
|
||||
def is_desktop(platform):
|
||||
return platform in ["windows", "osx", "linuxbsd", "server", "uwp", "haiku"]
|
||||
return platform in ["windows", "macos", "linuxbsd", "server", "uwp", "haiku"]
|
||||
|
||||
|
||||
def is_unix_like(platform):
|
||||
return platform in ["osx", "linuxbsd", "server", "android", "haiku", "iphone"]
|
||||
return platform in ["macos", "linuxbsd", "server", "android", "haiku", "ios"]
|
||||
|
||||
|
||||
def module_supports_tools_on(platform):
|
||||
return platform not in ["android", "javascript", "iphone"]
|
||||
return platform not in ["android", "javascript", "ios"]
|
||||
|
||||
|
||||
def find_wasm_src_dir(mono_root):
|
||||
|
|
@ -89,7 +89,7 @@ def configure(env, env_mono):
|
|||
bits = env["bits"]
|
||||
is_android = env["platform"] == "android"
|
||||
is_javascript = env["platform"] == "javascript"
|
||||
is_ios = env["platform"] == "iphone"
|
||||
is_ios = env["platform"] == "ios"
|
||||
is_ios_sim = is_ios and env["arch"] in ["x86", "x86_64"]
|
||||
|
||||
tools_enabled = env["tools"]
|
||||
|
|
@ -206,7 +206,7 @@ def configure(env, env_mono):
|
|||
|
||||
copy_file(mono_bin_path, "#bin", mono_dll_file)
|
||||
else:
|
||||
is_apple = env["platform"] in ["osx", "iphone"]
|
||||
is_apple = env["platform"] in ["macos", "ios"]
|
||||
is_macos = is_apple and not is_ios
|
||||
|
||||
sharedlib_ext = ".dylib" if is_apple else ".so"
|
||||
|
|
@ -221,7 +221,7 @@ def configure(env, env_mono):
|
|||
)
|
||||
|
||||
if not mono_root and is_macos:
|
||||
# Try with some known directories under OSX
|
||||
# Try with some known directories under macOS
|
||||
hint_dirs = ["/Library/Frameworks/Mono.framework/Versions/Current", "/usr/local/var/homebrew/linked/mono"]
|
||||
for hint_dir in hint_dirs:
|
||||
if os.path.isdir(hint_dir):
|
||||
|
|
@ -270,7 +270,7 @@ def configure(env, env_mono):
|
|||
|
||||
def copy_mono_lib(libname_wo_ext):
|
||||
copy_file(
|
||||
mono_lib_path, "#bin", libname_wo_ext + ".a", "%s.iphone.%s.a" % (libname_wo_ext, arch)
|
||||
mono_lib_path, "#bin", libname_wo_ext + ".a", "%s.ios.%s.a" % (libname_wo_ext, arch)
|
||||
)
|
||||
|
||||
# Copy Mono libraries to the output folder. These are meant to be bundled with
|
||||
|
|
@ -539,7 +539,7 @@ def copy_mono_shared_libs(env, mono_root, target_mono_root_dir):
|
|||
os.makedirs(target_mono_lib_dir)
|
||||
|
||||
lib_file_names = []
|
||||
if platform == "osx":
|
||||
if platform == "macos":
|
||||
lib_file_names = [
|
||||
lib_name + ".dylib"
|
||||
for lib_name in ["libmono-btls-shared", "libmono-native-compat", "libMonoPosixHelper"]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
supported_platforms = ["windows", "osx", "linuxbsd", "server", "android", "haiku", "javascript", "iphone"]
|
||||
supported_platforms = ["windows", "macos", "linuxbsd", "server", "android", "haiku", "javascript", "ios"]
|
||||
|
||||
|
||||
def can_build(env, platform):
|
||||
|
|
@ -15,7 +15,7 @@ def configure(env):
|
|||
|
||||
from SCons.Script import BoolVariable, PathVariable, Variables, Help
|
||||
|
||||
default_mono_static = platform in ["iphone", "javascript"]
|
||||
default_mono_static = platform in ["ios", "javascript"]
|
||||
default_mono_bundles_zlib = platform in ["javascript"]
|
||||
|
||||
envvars = Variables()
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@
|
|||
<PropertyGroup Condition=" '$(GodotTargetPlatform)' == '' ">
|
||||
<GodotTargetPlatform Condition=" '$([MSBuild]::IsOsPlatform(Linux))' ">linuxbsd</GodotTargetPlatform>
|
||||
<GodotTargetPlatform Condition=" '$([MSBuild]::IsOsPlatform(FreeBSD))' ">linuxbsd</GodotTargetPlatform>
|
||||
<GodotTargetPlatform Condition=" '$([MSBuild]::IsOsPlatform(OSX))' ">osx</GodotTargetPlatform>
|
||||
<GodotTargetPlatform Condition=" '$([MSBuild]::IsOsPlatform(OSX))' ">macos</GodotTargetPlatform>
|
||||
<GodotTargetPlatform Condition=" '$([MSBuild]::IsOsPlatform(Windows))' ">windows</GodotTargetPlatform>
|
||||
</PropertyGroup>
|
||||
|
||||
|
|
@ -76,12 +76,12 @@
|
|||
-->
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'windows' ">GODOT_WINDOWS;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'linuxbsd' ">GODOT_LINUXBSD;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'osx' ">GODOT_OSX;GODOT_MACOS;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'macos' ">GODOT_OSX;GODOT_MACOS;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'server' ">GODOT_SERVER;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'uwp' ">GODOT_UWP;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'haiku' ">GODOT_HAIKU;GODOT_PC</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'android' ">GODOT_ANDROID;GODOT_MOBILE</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'iphone' ">GODOT_IPHONE;GODOT_IOS;GODOT_MOBILE</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'ios' ">GODOT_IPHONE;GODOT_IOS;GODOT_MOBILE</GodotPlatformConstants>
|
||||
<GodotPlatformConstants Condition=" '$(GodotTargetPlatform)' == 'javascript' ">GODOT_JAVASCRIPT;GODOT_HTML5;GODOT_WASM;GODOT_WEB</GodotPlatformConstants>
|
||||
|
||||
<GodotDefineConstants>$(GodotDefineConstants);$(GodotPlatformConstants)</GodotDefineConstants>
|
||||
|
|
|
|||
|
|
@ -336,10 +336,10 @@ MONO_AOT_MODE_LAST = 1000,
|
|||
|
||||
// Add the required Mono libraries to the Xcode project
|
||||
|
||||
string MonoLibFile(string libFileName) => libFileName + ".iphone.fat.a";
|
||||
string MonoLibFile(string libFileName) => libFileName + ".ios.fat.a";
|
||||
|
||||
string MonoLibFromTemplate(string libFileName) =>
|
||||
Path.Combine(Internal.FullTemplatesDir, "iphone-mono-libs", MonoLibFile(libFileName));
|
||||
Path.Combine(Internal.FullTemplatesDir, "ios-mono-libs", MonoLibFile(libFileName));
|
||||
|
||||
exporter.AddIosProjectStaticLib(MonoLibFromTemplate("libmonosgen-2.0"));
|
||||
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ namespace GodotTools.Export
|
|||
|
||||
private static bool PlatformHasTemplateDir(string platform)
|
||||
{
|
||||
// OSX export templates are contained in a zip, so we place our custom template inside it and let Godot do the rest.
|
||||
// macOS export templates are contained in a zip, so we place our custom template inside it and let Godot do the rest.
|
||||
return !new[] { OS.Platforms.MacOS, OS.Platforms.Android, OS.Platforms.iOS, OS.Platforms.HTML5 }.Contains(platform);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -263,16 +263,16 @@ namespace GodotTools
|
|||
|
||||
var args = new List<string>();
|
||||
|
||||
bool osxAppBundleInstalled = false;
|
||||
bool macOSAppBundleInstalled = false;
|
||||
|
||||
if (OS.IsMacOS)
|
||||
{
|
||||
// The package path is '/Applications/Visual Studio Code.app'
|
||||
const string vscodeBundleId = "com.microsoft.VSCode";
|
||||
|
||||
osxAppBundleInstalled = Internal.IsOsxAppBundleInstalled(vscodeBundleId);
|
||||
macOSAppBundleInstalled = Internal.IsMacOSAppBundleInstalled(vscodeBundleId);
|
||||
|
||||
if (osxAppBundleInstalled)
|
||||
if (macOSAppBundleInstalled)
|
||||
{
|
||||
args.Add("-b");
|
||||
args.Add(vscodeBundleId);
|
||||
|
|
@ -307,13 +307,13 @@ namespace GodotTools
|
|||
|
||||
if (OS.IsMacOS)
|
||||
{
|
||||
if (!osxAppBundleInstalled && string.IsNullOrEmpty(_vsCodePath))
|
||||
if (!macOSAppBundleInstalled && string.IsNullOrEmpty(_vsCodePath))
|
||||
{
|
||||
GD.PushError("Cannot find code editor: VSCode");
|
||||
return Error.FileNotFound;
|
||||
}
|
||||
|
||||
command = osxAppBundleInstalled ? "/usr/bin/open" : _vsCodePath;
|
||||
command = macOSAppBundleInstalled ? "/usr/bin/open" : _vsCodePath;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ namespace GodotTools.Ides.MonoDevelop
|
|||
{
|
||||
string bundleId = BundleIds[_editorId];
|
||||
|
||||
if (Internal.IsOsxAppBundleInstalled(bundleId))
|
||||
if (Internal.IsMacOSAppBundleInstalled(bundleId))
|
||||
{
|
||||
command = "open";
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace GodotTools.Internals
|
|||
|
||||
public static string SimplifyGodotPath(this string path) => internal_SimplifyGodotPath(path);
|
||||
|
||||
public static bool IsOsxAppBundleInstalled(string bundleId) => internal_IsOsxAppBundleInstalled(bundleId);
|
||||
public static bool IsMacOSAppBundleInstalled(string bundleId) => internal_IsMacOSAppBundleInstalled(bundleId);
|
||||
|
||||
public static bool GodotIs32Bits() => internal_GodotIs32Bits();
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ namespace GodotTools.Internals
|
|||
private static extern string internal_SimplifyGodotPath(this string path);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_IsOsxAppBundleInstalled(string bundleId);
|
||||
private static extern bool internal_IsMacOSAppBundleInstalled(string bundleId);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_GodotIs32Bits();
|
||||
|
|
|
|||
|
|
@ -37,13 +37,13 @@ namespace GodotTools.Utils
|
|||
public static class Platforms
|
||||
{
|
||||
public const string Windows = "windows";
|
||||
public const string MacOS = "osx";
|
||||
public const string MacOS = "macos";
|
||||
public const string LinuxBSD = "linuxbsd";
|
||||
public const string Server = "server";
|
||||
public const string UWP = "uwp";
|
||||
public const string Haiku = "haiku";
|
||||
public const string Android = "android";
|
||||
public const string iOS = "iphone";
|
||||
public const string iOS = "ios";
|
||||
public const string HTML5 = "javascript";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
#include "../glue/cs_glue_version.gen.h"
|
||||
#include "../godotsharp_dirs.h"
|
||||
#include "../mono_gd/gd_mono_marshal.h"
|
||||
#include "../utils/osx_utils.h"
|
||||
#include "../utils/macos_utils.h"
|
||||
#include "code_completion.h"
|
||||
#include "godotsharp_export.h"
|
||||
|
||||
|
|
@ -198,10 +198,10 @@ MonoString *godot_icall_Internal_SimplifyGodotPath(MonoString *p_path) {
|
|||
return GDMonoMarshal::mono_string_from_godot(path.simplify_path());
|
||||
}
|
||||
|
||||
MonoBoolean godot_icall_Internal_IsOsxAppBundleInstalled(MonoString *p_bundle_id) {
|
||||
#ifdef OSX_ENABLED
|
||||
MonoBoolean godot_icall_Internal_IsMacOSAppBundleInstalled(MonoString *p_bundle_id) {
|
||||
#ifdef MACOS_ENABLED
|
||||
String bundle_id = GDMonoMarshal::mono_string_to_godot(p_bundle_id);
|
||||
return (MonoBoolean)osx_is_app_bundle_installed(bundle_id);
|
||||
return (MonoBoolean)macos_is_app_bundle_installed(bundle_id);
|
||||
#else
|
||||
(void)p_bundle_id; // UNUSED
|
||||
return (MonoBoolean) false;
|
||||
|
|
@ -366,7 +366,7 @@ void register_editor_internal_calls() {
|
|||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_UpdateApiAssembliesFromPrebuilt", godot_icall_Internal_UpdateApiAssembliesFromPrebuilt);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_FullTemplatesDir", godot_icall_Internal_FullTemplatesDir);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_SimplifyGodotPath", godot_icall_Internal_SimplifyGodotPath);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_IsOsxAppBundleInstalled", godot_icall_Internal_IsOsxAppBundleInstalled);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_IsMacOSAppBundleInstalled", godot_icall_Internal_IsMacOSAppBundleInstalled);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GodotIs32Bits", godot_icall_Internal_GodotIs32Bits);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GodotIsRealTDouble", godot_icall_Internal_GodotIsRealTDouble);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GodotMainIteration", godot_icall_Internal_GodotMainIteration);
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ private:
|
|||
data_mono_bin_dir = data_mono_root_dir.plus_file("bin");
|
||||
#endif
|
||||
|
||||
#ifdef OSX_ENABLED
|
||||
#ifdef MACOS_ENABLED
|
||||
if (!DirAccess::exists(data_editor_tools_dir)) {
|
||||
data_editor_tools_dir = exe_dir.plus_file("../Resources/GodotSharp/Tools");
|
||||
}
|
||||
|
|
@ -222,7 +222,7 @@ private:
|
|||
data_mono_bin_dir = data_mono_root_dir.plus_file("bin");
|
||||
#endif
|
||||
|
||||
#ifdef OSX_ENABLED
|
||||
#ifdef MACOS_ENABLED
|
||||
if (!DirAccess::exists(data_mono_root_dir)) {
|
||||
data_mono_etc_dir = exe_dir.plus_file("../Resources/GodotSharp/Mono/etc");
|
||||
data_mono_lib_dir = exe_dir.plus_file("../Resources/GodotSharp/Mono/lib");
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
#ifdef ANDROID_ENABLED
|
||||
#include "android_mono_config.h"
|
||||
#include "support/android_support.h"
|
||||
#elif defined(IPHONE_ENABLED)
|
||||
#elif defined(IOS_ENABLED)
|
||||
#include "support/ios_support.h"
|
||||
#endif
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ MonoDomain *gd_initialize_mono_runtime() {
|
|||
MonoDomain *gd_initialize_mono_runtime() {
|
||||
gd_mono_debug_init();
|
||||
|
||||
#if defined(IPHONE_ENABLED) || defined(ANDROID_ENABLED)
|
||||
#if defined(IOS_ENABLED) || defined(ANDROID_ENABLED)
|
||||
// I don't know whether this actually matters or not
|
||||
const char *runtime_version = "mobile";
|
||||
#else
|
||||
|
|
@ -263,7 +263,7 @@ void GDMono::determine_mono_dirs(String &r_assembly_rootdir, String &r_config_di
|
|||
if (mono_reg_info.config_dir.length() && DirAccess::exists(mono_reg_info.config_dir)) {
|
||||
r_config_dir = mono_reg_info.config_dir;
|
||||
}
|
||||
#elif defined(OSX_ENABLED)
|
||||
#elif defined(MACOS_ENABLED)
|
||||
const char *c_assembly_rootdir = mono_assembly_getrootdir();
|
||||
const char *c_config_dir = mono_get_config_dir();
|
||||
|
||||
|
|
@ -343,7 +343,7 @@ void GDMono::initialize() {
|
|||
|
||||
#if defined(ANDROID_ENABLED)
|
||||
gdmono::android::support::initialize();
|
||||
#elif defined(IPHONE_ENABLED)
|
||||
#elif defined(IOS_ENABLED)
|
||||
gdmono::ios::support::initialize();
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
|
||||
#include "core/typedefs.h"
|
||||
|
||||
#if !defined(JAVASCRIPT_ENABLED) && !defined(IPHONE_ENABLED)
|
||||
#if !defined(JAVASCRIPT_ENABLED) && !defined(IOS_ENABLED)
|
||||
// We have custom mono log callbacks for WASM and iOS
|
||||
#define GD_MONO_LOG_ENABLED
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
#include "gd_mono_method.h"
|
||||
#include "gd_mono_utils.h"
|
||||
|
||||
#if !defined(JAVASCRIPT_ENABLED) && !defined(IPHONE_ENABLED)
|
||||
#if !defined(JAVASCRIPT_ENABLED) && !defined(IOS_ENABLED)
|
||||
#define HAVE_METHOD_THUNKS
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#ifndef IOS_SUPPORT_H
|
||||
#define IOS_SUPPORT_H
|
||||
|
||||
#if defined(IPHONE_ENABLED)
|
||||
#if defined(IOS_ENABLED)
|
||||
|
||||
#include "core/string/ustring.h"
|
||||
|
||||
|
|
@ -45,6 +45,6 @@ void cleanup();
|
|||
} // namespace ios
|
||||
} // namespace gdmono
|
||||
|
||||
#endif // IPHONE_ENABLED
|
||||
#endif // IOS_ENABLED
|
||||
|
||||
#endif // IOS_SUPPORT_H
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#include "ios_support.h"
|
||||
|
||||
#if defined(IPHONE_ENABLED)
|
||||
#if defined(IOS_ENABLED)
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include <os/log.h>
|
||||
|
|
@ -147,4 +147,4 @@ GD_PINVOKE_EXPORT void xamarin_start_wwan(const char *p_uri) {
|
|||
os_log_error(OS_LOG_DEFAULT, "Not implemented: 'xamarin_start_wwan'");
|
||||
}
|
||||
|
||||
#endif // IPHONE_ENABLED
|
||||
#endif // IOS_ENABLED
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* osx_utils.cpp */
|
||||
/* macos_utils.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -28,16 +28,16 @@
|
|||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "osx_utils.h"
|
||||
#include "macos_utils.h"
|
||||
|
||||
#ifdef OSX_ENABLED
|
||||
#ifdef MACOS_ENABLED
|
||||
|
||||
#include "core/string/print_string.h"
|
||||
|
||||
#import <CoreFoundation/CoreFoundation.h>
|
||||
#import <CoreServices/CoreServices.h>
|
||||
|
||||
bool osx_is_app_bundle_installed(const String &p_bundle_id) {
|
||||
bool macos_is_app_bundle_installed(const String &p_bundle_id) {
|
||||
CFStringRef bundle_id = CFStringCreateWithCString(nullptr, p_bundle_id.utf8(), kCFStringEncodingUTF8);
|
||||
CFArrayRef result = LSCopyApplicationURLsForBundleIdentifier(bundle_id, nullptr);
|
||||
CFRelease(bundle_id);
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*************************************************************************/
|
||||
/* osx_utils.h */
|
||||
/* macos_utils.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
|
|
@ -30,13 +30,13 @@
|
|||
|
||||
#include "core/string/ustring.h"
|
||||
|
||||
#ifndef OSX_UTILS_H
|
||||
#define OSX_UTILS_H
|
||||
#ifndef MACOS_UTILS_H
|
||||
#define MACOS_UTILS_H
|
||||
|
||||
#ifdef OSX_ENABLED
|
||||
#ifdef MACOS_ENABLED
|
||||
|
||||
bool osx_is_app_bundle_installed(const String &p_bundle_id);
|
||||
bool macos_is_app_bundle_installed(const String &p_bundle_id);
|
||||
|
||||
#endif
|
||||
|
||||
#endif // OSX_UTILS_H
|
||||
#endif // MACOS_UTILS_H
|
||||
Loading…
Add table
Add a link
Reference in a new issue