Commit 79a45f72 authored by Sam Hocevar's avatar Sam Hocevar

  * Updated TODO list with Henri's Apr 6th post.
  * Built-in modules support almost finished.

    Now you can compile any module within vlc, even the Gnome, Qt, SDL
  and GGI modules at the same time, resulting in an awful extra fat
  vlc binary with gazillons of library dependecies.

    The only exception is that the Gnome and Gtk+ modules can't be
  compiled together into vlc. But you can have one compiled built-in
  and the other as a plugin.

    Another consequence is that libdl should no longer be needed under
  MacOS X. I'll check this as soon as possible.
parent 5b51669f
......@@ -4,7 +4,9 @@
HEAD
* A few Makefile fixes for BeOS
* Updated TODO list.
* Built-in modules support almost finished.
* A few Makefile fixes for BeOS.
* XVideo patches by Shane Harper <shanegh@optusnet.com.au>.
* Beginning of the built-in modules support.
* Got rid of the sleep() hack in beos_specific.cpp.
......
###############################################################################
# vlc (VideoLAN Client) main makefile
# (c)1998 VideoLAN
###############################################################################
# This makefile is the main makefile for the VideoLAN client.
# vlc (VideoLAN Client) main Makefile - (c)1998 VideoLAN
###############################################################################
include Makefile.opts
......@@ -36,8 +33,8 @@ PLUGINS_TARGETS := alsa/alsa beos/beos darwin/darwin dsp/dsp dummy/dummy \
#
# Translate plugin names
#
PLUGINS_OBJ := $(shell for i in $(PLUGINS) ; do echo " "$(PLUGINS_TARGETS)" " | sed 's@.*/\('$$i'\) .*@lib/\1.so@ ; s@^ .*@@' ; done)
BUILTINS_OBJ := $(shell for i in $(BUILTINS) ; do echo " "$(PLUGINS_TARGETS)" " | sed 's@.*/\('$$i'\) .*@lib/\1.a@ ; s@^ .*@@' ; done)
PLUGINS_OBJ := $(shell for i in : $(PLUGINS) ; do echo " "$(PLUGINS_TARGETS)" " | sed 's@.*/\('$$i'\) .*@lib/\1.so@ ; s@^ .*@@' ; done)
BUILTINS_OBJ := $(shell for i in : $(BUILTINS) ; do echo " "$(PLUGINS_TARGETS)" " | sed 's@.*/\('$$i'\) .*@lib/\1.a@ ; s@^ .*@@' ; done)
#
# C Objects
......@@ -164,8 +161,18 @@ export
#
all: vlc ${ALIASES} plugins vlc.app
Makefile.opts:
@echo
@echo "Sorry, you need to run ./configure before using this makefile."
@echo "To make clean or make distclean, use this:"
@echo
@echo " touch Makefile.opts Makefile.modules && make distclean"
@echo
@exit 1
clean:
for d in $(PLUGINS_DIR) ; do ( cd plugins/$${d} && make clean ) ; done
for d in $(PLUGINS_DIR) ; do ( cd plugins/$${d} && $(MAKE) clean ) ; done
rm -f plugins/*/*.o plugins/*/*.moc plugins/*/*.bak
rm -f $(C_OBJ) $(CPP_OBJ)
rm -f src/*/*.o extras/*/*.o
rm -f lib/*.so lib/*.a vlc gnome-vlc gvlc kvlc qvlc
......@@ -204,6 +211,7 @@ show:
@echo PLUGINS_OBJ: $(PLUGINS_OBJ)
@echo BUILTINS_OBJ: $(BUILTINS_OBJ)
# ugliest of all, but I have no time to do it -- sam
snapshot:
rm -Rf /tmp/vlc-${PROGRAM_VERSION}* /tmp/vlc-${PROGRAM_VERSION}nocss*
......@@ -331,12 +339,12 @@ endif
#
plugins: $(PLUGINS_OBJ)
$(PLUGINS_OBJ): FORCE
cd $(shell echo " "$(PLUGINS_TARGETS)" " | sed 's@.* \([^/]*/\)'$(@:lib/%.so=%)' .*@plugins/\1@ ; s@^ .*@@') && make $(@:%=../../%)
cd $(shell echo " "$(PLUGINS_TARGETS)" " | sed 's@.* \([^/]*/\)'$(@:lib/%.so=%)' .*@plugins/\1@ ; s@^ .*@@') && $(MAKE) $(@:%=../../%)
#
# Built-in modules target
#
builtins: $(BUILTINS_OBJ)
$(BUILTINS_OBJ): FORCE
cd $(shell echo " "$(PLUGINS_TARGETS)" " | sed 's@.* \([^/]*/\)'$(@:lib/%.a=%)' .*@plugins/\1@ ; s@^ .*@@') && make $(@:%=../../%)
cd $(shell echo " "$(PLUGINS_TARGETS)" " | sed 's@.* \([^/]*/\)'$(@:lib/%.a=%)' .*@plugins/\1@ ; s@^ .*@@') && $(MAKE) $(@:%=../../%)
......@@ -26,10 +26,3 @@ PLCFLAGS += -shared
endif
endif
#
# Libraries for special cases
#
LIB_GGI = @LIB_GGI@
LIB_GLIDE = @LIB_GLIDE@
LIB_SDL = @LIB_SDL@
......@@ -7,28 +7,57 @@
# Configuration
###############################################################################
# Debugging mode on or off (set to 1 to activate)
DEBUG=@DEBUG@
STATS=@STATS@
OPTIMS=@OPTIMS@
GETOPT=@GETOPT@
PLUGINS:=@PLUGINS@
BUILTINS:=@BUILTINS@
SYS=@SYS@
ALIASES=@ALIASES@
INSTALL=@INSTALL@
ARCH=@ARCH@
exec_prefix=@exec_prefix@
prefix=@prefix@
bindir=@bindir@
datadir=@datadir@
libdir=@libdir@
#
# Compilation options
#
DEBUG = @DEBUG@
STATS = @STATS@
OPTIMS = @OPTIMS@
GETOPT = @GETOPT@
PLUGINS := @PLUGINS@
BUILTINS := @BUILTINS@
SYS = @SYS@
ALIASES =@ALIASES@
INSTALL = @INSTALL@
ARCH = @ARCH@
#
# Build environment
#
CC = @CC@
SHELL = @SHELL@
#
# Installation environment
#
exec_prefix = @exec_prefix@
prefix = @prefix@
bindir = @bindir@
datadir = @datadir@
libdir = @libdir@
CC=@CC@
SHELL=@SHELL@
#
# Libraries for special cases
#
LIB_ALSA = @LIB_ALSA@
LIB_BEOS = @LIB_BEOS@
LIB_DARWIN = @LIB_DARWIN@
LIB_ESD = @LIB_ESD@
LIB_GGI = @LIB_GGI@
LIB_GLIDE = @LIB_GLIDE@
LIB_GNOME = @LIB_GNOME@
LIB_GTK = @LIB_GTK@
LIB_IDCTALTIVEC = @LIB_IDCTALTIVEC@
LIB_MACOSX = @LIB_MACOSX@
LIB_NCURSES = @LIB_NCURSES@
LIB_QT = @LIB_QT@
LIB_TS = @LIB_TS@
LIB_SDL = @LIB_SDL@
LIB_X11 = @LIB_X11@
LIB_XVIDEO = @LIB_XVIDEO@
LIB_YUV = @LIB_YUV@
###############################################################################
# Configuration pre-processing
......@@ -81,13 +110,12 @@ INCLUDE += -Iinclude -Iextras -I/usr/local/include
#
# Libraries
#
LIB = @LIB@ -L/usr/local/lib
LIB += @LIB@ -L/usr/local/lib
ifeq ($(SYS),beos)
LIB += -lbe -lroot -lgame
else
LIB += -lm
endif
#
# Libraries needed by built-in modules
#
LIB += $(shell for i in ${BUILTINS} ; do echo $$i | tr '[a-z]' '[A-Z]' | sed 's/.*/$$LIB_&/' ; done)
#
# C compiler flags: mainstream compilation
......
......@@ -7,6 +7,138 @@
#
# Urgency values: Wishlist, Normal, Important, Critical
Task: 0x5e
Difficulty: Hard
Urgency: Wishlist
Description: All-in-one interface window
Find a way for the interface plugin to provide video output capabilities
and have it display the stream in the same window.
Status: Todo
Task: 0x5d
Difficulty: Guru
Urgency: Normal
Description: Win32 port
Win32 is probably the most common desktop platform, we should support it
as well. Besides, most students at Centrale use Windows and VideoLAN was
originally designed for them.
Status: Todo
Task: 0x5c
Difficulty: Normal
Urgency: Wishlist
Description: Infrared support
Write a plugin which listens to the infrared port and sends appropriate
commands to the application. This can either be an interface plugin, or,
preferably, a new kind of interface-agnostic "command" plugin.
Status: Todo
Task: 0x5b
Difficulty: Hard
Urgency: Critical
Description: Fix the FreeBSD port
The FreeBSD port of vlc doesn't run, probably because of a pthread
issue. This should be investigated.
Status: Todo
Task: 0x5a
Difficulty: Hard
Urgency: Wishlist
Description: Share stream information between vlc and vls
vls should send misc TS packets to let us know what the stream PID
contain, such as the language, or the subtitle palette.
Status: Todo
Task: 0x59
Difficulty: Hard
Urgency: Important
Description: Cope with vls/vlc clock jitter
The internal clocks of the server and the client are not assured to be
in perfect synchronization, which may be annoying when playing a movie.
Reduce this jitter by using a well-chosen filter.
Status: Todo
Task: 0x58
Difficulty: Normal
Urgency: Critical
Description: Language and subtitles selection in network input
The vls will probably have to be modified as well.
Status: Todo
Task: 0x57
Difficulty: Guru
Urgency: Low
Description: Full DVD navigation
Once the core DVD navigation features are ready (see item 0x52), port the
interface and video output modules so that they can handle it.
Status: Todo
Task: 0x56
Difficulty: Important
Urgency: Normal
Description: XVideo video output
XVideo is reported to work a bit better than the SDL wrapper on some
configurations. Modify the X11 plugin so that it supports XVideo.
Status: Done 1 Apr 2001 (shane)
Task: 0x55
Difficulty: Hard
Urgency: Critical
Description: Video output IV
The new video output should support subtitles both in software and hardware
YUV (see item 0x4d). One should also care about XVideo buffers, there is a
way to directly decode into them, which would improve performances.
Status: Todo
Task: 0x54
Difficulty: Hard
Urgency: Wishlist
Description: Hardware AC3 decoding
Some soundcards directly grok Dolby AC3. This would spare a lot of CPU time.
Status: Todo
Task: 0x53
Difficulty: Normal
Urgency: Critical
Description: Fix AC3 decoder
The AC3 decoder still has a few quality issues; fix them, and try to add
MMX support to it as well.
Status: Todo
Task: 0x52
Difficulty: Guru
Urgency: Low
Description: DVD navigation core features
We need an interpreter for the DVD virtual machine to make it easier to
browse DVDs later.
Status: Todo
Task: 0x51
Difficulty: Easy
Urgency: Normal
Description: Better subtitle color handling
The subtitle palette is pretty ugly for the moment, since we don't parse
the color information. Find it in the IFO file and pass the information to
the video output.
Status: Todo
Task: 0x50
Difficulty: Hard
Urgency: Critical
Description: Multi-angle multi-language support
Some DVDs have several languages encoded in the same video stream, we
need to properly parse them.
Status: Todo
Task: 0x4f
Difficulty: Hard
Urgency: Critical
Description: Fix all known DVD playback issues
A few DVDs are still reported not to work at all. Try to find what is
causing this, have a more robust DVD input, and list all discs reported
to work flawlessly to prevent bug regression.
Status: Todo
Task: 0x4e
Difficulty: Hard
Urgency: High
......@@ -260,7 +392,7 @@ Description: Enable compiled-in plugins
Some plugins may have their place inside the main program, such as the
dummy plugin, or the beos plugin under BeOS. We should allow to link
them with the main app.
Status: Todo
Status: Done 15 Apr 2001 (sam)
Task: 0x31
Difficulty: Easy
......@@ -516,7 +648,7 @@ Urgency: Normal
Description: Draw a vlc icon
The vlc needs an icon. It should render well in 48x48 but
can be any size.
Status: Todo
Status: Done 11 Apr 2001 (sam)
Task: 0x0f
Difficulty: Easy
......
This diff is collapsed.
This diff is collapsed.
......@@ -49,7 +49,7 @@ $(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
# Real targets
#
../../lib/alsa.so: $(PLUGIN_ALSA)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -lasound
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_ALSA)
../../lib/alsa.a: $(BUILTIN_ALSA)
ar r $@ $^
......
......@@ -49,7 +49,7 @@ $(BUILTIN_BEOS): %-BUILTIN.o: %.cpp
# Real targets
#
../../lib/beos.so: $(PLUGIN_BEOS)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -lbe -lgame -lroot -ltracker
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_BEOS)
../../lib/beos.a: $(BUILTIN_BEOS)
ar r $@ $^
......
......@@ -49,7 +49,7 @@ $(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
# Real targets
#
../../lib/darwin.so: $(PLUGIN_DARWIN)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -framework CoreAudio
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_DARWIN)
../../lib/darwin.a: $(BUILTIN_DARWIN)
ar r $@ $^
......
......@@ -49,11 +49,7 @@ $(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
# Real targets
#
../../lib/esd.so: $(PLUGIN_ESD)
ifneq (,$(findstring bsd,$(SYS)))
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -lesd
else
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -laudiofile -lesd
endif
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_ESD)
../../lib/esd.a: $(BUILTIN_ESD)
ar r $@ $^
......
......@@ -47,7 +47,7 @@ $(BUILTIN_GNOME): %-BUILTIN.o: %.c
# Real targets
#
../../lib/gnome.so: $(PLUGIN_GNOME)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) `gnome-config --libs gnomeui | sed 's,-rdynamic,,'`
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_GNOME)
../../lib/gnome.a: $(BUILTIN_GNOME)
ar r $@ $^
......
......@@ -47,7 +47,7 @@ $(BUILTIN_GTK): %-BUILTIN.o: %.c
# Real targets
#
../../lib/gtk.so: $(PLUGIN_GTK)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) `gtk-config --libs gtk | sed 's,-rdynamic,,'`
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_GTK)
../../lib/gtk.a: $(BUILTIN_GTK)
ar r $@ $^
......
......@@ -107,7 +107,7 @@ $(BUILTIN_IDCTALTIVEC): %-BUILTIN-IDCTALTIVEC.o: %.c
ar r $@ $^
../../lib/idctaltivec.so: $(PLUGIN_IDCTALTIVEC) $(PLUGIN_IDCTCOMMON)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -framework vecLib
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_IDCTALTIVEC)
../../lib/idctaltivec.a: $(BUILTIN_IDCTALTIVEC)
ar r $@ $^
......
......@@ -47,7 +47,7 @@ $(BUILTIN_MACOSX): %-BUILTIN.o: %.c
# Real targets
#
../../lib/macosx.so: $(PLUGIN_MACOSX)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -framework CoreAudio -framework Carbon -framework AGL
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_MACOSX)
../../lib/macosx.a: $(BUILTIN_MACOSX)
ar r $@ $^
......
......@@ -88,9 +88,3 @@ $(BUILTIN_MOTIONMMXEXT): %-BUILTIN-MOTIONMMXEXT.o: %.c
../../lib/motionmmxext.a: $(BUILTIN_MOTIONMMXEXT)
ar r $@ $^
../../lib/motionaltivec.so: $(PLUGIN_MOTIONALTIVEC) $(PLUGIN_MOTIONCOMMON)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -framework vecLib
../../lib/motionaltivec.a: $(BUILTIN_MOTIONALTIVEC)
ar r $@ $^
......@@ -57,11 +57,7 @@ $(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
ar r $@ $^
../../lib/ts.so: $(PLUGIN_TS)
ifneq (,$(findstring darwin,$(SYS)))
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -framework AGL -framework Carbon
else
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS)
endif
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_TS)
../../lib/ts.a: $(BUILTIN_TS)
ar r $@ $^
......
......@@ -41,17 +41,17 @@ $(PLUGIN_QT): %.o: %.moc
$(PLUGIN_QT:%.o=%.moc): %.moc: %.cpp
moc -i $< -o $@
$(BUILTIN_QT): %.o: .dep/%.dpp
$(BUILTIN_QT): %-BUILTIN.o: .dep/%.dpp
$(BUILTIN_QT): %.o: %.moc
$(CC) $(CFLAGS) -DBUILTIN -I/usr/include/qt -I${QTDIR}/include -c -o $@ $(<:%.moc=%.cpp)
$(BUILTIN_QT:%.o=%.moc): %.moc: %.cpp
$(CC) $(CFLAGS) -DBUILTIN -I/usr/include/qt -I${QTDIR}/include -c -o $@ $(<:%-BUILTIN.moc=%.cpp)
$(BUILTIN_QT:%.o=%.moc): %-BUILTIN.moc: %.cpp
moc -i $< -o $@
#
# Real targets
#
../../lib/qt.so: $(PLUGIN_QT)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -lqt -L${QTDIR}/lib
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_QT)
../../lib/qt.a: $(BUILTIN_QT)
ar r $@ $^
......
......@@ -2,7 +2,7 @@
* intf_qt.cpp: Qt interface
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: intf_qt.cpp,v 1.2 2001/03/18 00:01:13 sam Exp $
* $Id: intf_qt.cpp,v 1.3 2001/04/15 10:54:46 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
......@@ -140,7 +140,11 @@ private:
QLabel *p_date;
};
#include "intf_qt.moc"
#ifdef BUILTIN
# include "intf_qt-BUILTIN.moc"
#else
# include "intf_qt.moc"
#endif
#define SLIDER_MIN 0x00000
#define SLIDER_MAX 0x10000
......
......@@ -35,23 +35,19 @@ $(cdependancies): %.d: FORCE
$(ALL_OBJ): %.o: ../../Makefile.dep Makefile
$(STD_PLUGIN_OBJ): %.o: .dep/%.d
$(STD_PLUGIN_OBJ): %.o: %.c
$(PLUGIN_SDL): %.o: .dep/%.d
$(PLUGIN_SDL): %.o: %.c
$(CC) $(CFLAGS) $(PCFLAGS) -c -o $@ $<
$(STD_BUILTIN_OBJ): %-BUILTIN.o: .dep/%.d
$(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
$(BUILTIN_SDL): %-BUILTIN.o: .dep/%.d
$(BUILTIN_SDL): %-BUILTIN.o: %.c
$(CC) $(CFLAGS) -DBUILTIN -c -o $@ $<
#
# Real targets
#
../../lib/sdl.so: $(PLUGIN_SDL)
ifneq (,$(findstring darwin,$(SYS)))
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_SDL) -framework Carbon -framework AGL
else
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_SDL)
endif
../../lib/sdl.a: $(BUILTIN_SDL)
ar r $@ $^
......
......@@ -47,7 +47,7 @@ $(BUILTIN_NCURSES): %-BUILTIN.o: %.c
# Real targets
#
../../lib/ncurses.so: $(PLUGIN_NCURSES)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -lncurses
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_NCURSES)
../../lib/ncurses.a: $(BUILTIN_NCURSES)
ar r $@ $^
......
......@@ -53,9 +53,9 @@ $(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
#
../../lib/x11.so: $(PLUGIN_X11)
ifeq ($(SYS),nto-qnx)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -L/usr/X11R6/lib -lX11 -lXext -lsocket
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_X11) -lsocket
else
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -L/usr/X11R6/lib -lX11 -lXext
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_X11)
endif
../../lib/x11.a: $(BUILTIN_X11)
......@@ -63,9 +63,9 @@ endif
../../lib/xvideo.so: $(PLUGIN_XVIDEO)
ifeq ($(SYS),nto-qnx)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -L/usr/X11R6/lib -lX11 -lXext -lXv -lsocket
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_XVIDEO) -lsocket
else
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) -L/usr/X11R6/lib -lX11 -lXext -lXv
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_XVIDEO)
endif
../../lib/xvideo.a: $(BUILTIN_XVIDEO)
......
......@@ -52,7 +52,7 @@ $(STD_BUILTIN_OBJ): %-BUILTIN.o: %.c
# Real targets
#
../../lib/yuv.so: $(PLUGIN_YUV)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS)
$(CC) $(PCFLAGS) -o $@ $^ $(PLCFLAGS) $(LIB_YUV)
../../lib/yuv.a: $(BUILTIN_YUV)
ar r $@ $^
......
......@@ -2,7 +2,7 @@
* modules.c : Built-in and plugin modules management functions
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: modules.c,v 1.23 2001/04/15 04:19:58 sam Exp $
* $Id: modules.c,v 1.24 2001/04/15 10:54:46 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Ethan C. Baldridge <BaldridgeE@cadmus.com>
......@@ -276,6 +276,9 @@ void module_ManageBank( module_bank_t * p_bank )
intf_WarnMsg( 3, "module: hiding unused module `%s'",
p_module->psz_name );
HideModule( p_module );
/* Break here, so that we only hide one module at a time */
break;
}
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment