Commit 6489184b authored by lphuberdeau's avatar lphuberdeau

[ENH] Converting freetaglib

parent f7d01a1a
......@@ -15,10 +15,7 @@ if (isset($_REQUEST["freetagsfeatures"])) {
if (isset($_REQUEST["cleanup"])) {
check_ticket('admin-inc-freetags');
global $freetaglib;
if (!is_object($freetaglib)) {
include_once ('lib/freetag/freetaglib.php');
}
$freetaglib = TikiLib::lib('freetag');
$freetaglib->cleanup_tags();
}
......
......@@ -35,6 +35,9 @@
<service id="tiki.lib.filegal" class="FileGalLib">
<file>%kernel.root_dir%/lib/filegals/filegallib.php</file>
</service>
<service id="tiki.lib.freetag" class="FreetagLib">
<file>%kernel.root_dir%/lib/freetag/freetaglib.php</file>
</service>
<service id="tiki.lib.hist" class="HistLib">
<file>%kernel.root_dir%/lib/wiki/histlib.php</file>
</service>
......
......@@ -11,7 +11,7 @@
//this script may only be included - so its better to err & die if called directly.
//smarty is not there - we need setup
require_once('tiki-setup.php');
global $access; require_once("lib/tikiaccesslib.php");
$access = TikiLib::lib('access');
$access->check_script($_SERVER["SCRIPT_NAME"], basename(__FILE__));
global $prefs;
......@@ -19,10 +19,7 @@ global $tiki_p_freetags_tag;
if ($prefs['feature_freetags'] == 'y' and $tiki_p_freetags_tag == 'y') {
global $freetaglib;
if (!is_object($freetaglib)) {
include_once('lib/freetag/freetaglib.php');
}
$freetaglib = TikiLib::lib('freetag');
if (isset($_REQUEST['freetag_string'])) {
$tag_string = $_REQUEST['freetag_string'];
......
......@@ -152,7 +152,7 @@ class BlogLib extends TikiDb_Bridge
*/
function list_user_blogs($user, $include_public = false)
{
global $tikilib;
$tikilib = TikiLib::lib('tiki');
$query = "select * from `tiki_blogs` where `user`=? ";
$bindvars=array($user);
......@@ -180,7 +180,9 @@ class BlogLib extends TikiDb_Bridge
*/
function list_blogs_user_can_post()
{
global $tikilib, $tiki_p_blog_admin, $user;
global $tiki_p_blog_admin, $user;
$tikilib = TikiLib::lib('tiki');
$query = "select * from `tiki_blogs` order by `title` asc";
$result = $this->fetchAll($query);
$ret = array();
......@@ -209,7 +211,7 @@ class BlogLib extends TikiDb_Bridge
*/
function list_posts($offset = 0, $maxRecords = -1, $sort_mode = 'created_desc', $find = '', $filterByBlogId = -1, $author='', $ref='', $date_min = 0, $date_max = 0)
{
global $tikilib;
$tikilib = TikiLib::lib('tiki');
$authorized_blogs = $this->list_blogs(0, -1, 'created_desc', '', $ref);
$permit_blogs = array();
......@@ -380,7 +382,7 @@ class BlogLib extends TikiDb_Bridge
*/
function get_post_images($postId)
{
global $tikilib;
$tikilib = TikiLib::lib('tiki');
$query = "select `postId`,`filename`,`filesize`,`imgId` from `tiki_blog_posts_images` where `postId`=?";
$result = $this->query($query, array((int) $postId));
......@@ -446,7 +448,8 @@ class BlogLib extends TikiDb_Bridge
)
{
//TODO: all the display parameters can be one single array parameter
global $tikilib, $prefs;
global $prefs;
$tikilib = TikiLib::lib('tiki');
if ($lastModif == 0) {
$lastModif = $tikilib->now;
......@@ -500,10 +503,11 @@ class BlogLib extends TikiDb_Bridge
$date_min = '', $date_max = '', $approved = 'y'
)
{
global $tikilib, $tiki_p_admin, $tiki_p_blog_admin, $tiki_p_blog_post, $user, $prefs;
global $tiki_p_admin, $tiki_p_blog_admin, $tiki_p_blog_post, $user, $prefs;
$parserlib = TikiLib::lib('parser');
$categlib = TikiLib::lib('categ');
$tikilib = TikiLib::lib('tiki');
$mid = array();
$bindvars = array();
......@@ -724,7 +728,9 @@ class BlogLib extends TikiDb_Bridge
function blog_post($blogId, $data, $excerpt, $user, $title = '', $contributions = '', $priv = 'n', $created = 0, $is_wysiwyg=FALSE)
{
// update tiki_blogs and call activity functions
global $smarty, $tikilib, $prefs;
global $prefs;
$tikilib = TikiLib::lib('tiki');
$smarty = TikiLib::lib('smarty');
$wysiwyg=$is_wysiwyg==TRUE?'y':'n';
if (!$created) {
......@@ -882,7 +888,7 @@ class BlogLib extends TikiDb_Bridge
*/
function get_post($postId, $adjacent = false)
{
global $tikilib;
$tikilib = TikiLib::lib('tiki');
$query = "select * from `tiki_blog_posts` where `postId`=?";
$result = $this->query($query, array((int) $postId));
......@@ -908,7 +914,7 @@ class BlogLib extends TikiDb_Bridge
*/
function get_related_posts($postId, $maxResults = 5)
{
global $freetaglib;
$freetaglib = TikiLib::lib('freetag');
$related_posts = $freetaglib->get_similar('blog post', $postId, $maxResults);
// extract 'postId' from href to be able to use {self_link}
......@@ -976,7 +982,8 @@ class BlogLib extends TikiDb_Bridge
$contributions = '', $priv='n', $created = 0, $is_wysiwyg=FALSE
)
{
global $tikilib, $prefs;
global $prefs;
$tikilib = TikiLib::lib('tiki');
if ($is_wysiwyg) {
$data = TikiFilter::get('purifier')->filter($data);
......@@ -1054,7 +1061,7 @@ class BlogLib extends TikiDb_Bridge
*/
function add_blog_activity($blogId)
{
global $tikilib;
$tikilib = TikiLib::lib('tiki');
//Caclulate activity, update tiki_blogs and purge activity table
$today = $tikilib->make_time(0, 0, 0, $tikilib->date_format("%m"), $tikilib->date_format("%d"), $tikilib->date_format("%Y"));
......@@ -1126,7 +1133,7 @@ class BlogLib extends TikiDb_Bridge
*/
function check_blog_exists($blogId)
{
global $smarty;
$smarty = TikiLib::lib('smarty');
if (!$this->blog_exists($blogId)) {
$msg = tra('Blog cannot be found');
......@@ -1169,7 +1176,7 @@ class BlogLib extends TikiDb_Bridge
}
function mod_blog_posts(&$blogItems, $charCount, $wordBoundary='y', $ellipsis='y', $more='y')
{
global $smarty;
$smarty = TikiLib::lib('smarty');
/* The function takes an argument asking if the break should occur on a
word boundary. The truncate function asks if words can be broken.
......
......@@ -1651,4 +1651,3 @@ class FreetagLib extends ObjectLib
}
}
$freetaglib = new FreetagLib;
......@@ -15,7 +15,6 @@
*/
require_once('tikiimporter.php');
require_once('lib/blogs/bloglib.php');
/**
* Class to provide basic functionalities to blog importers. So far
......@@ -278,7 +277,7 @@ class TikiImporter_Blog extends TikiImporter
*/
function createTags($tags)
{
global $freetaglib; require_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
foreach ($tags as $tag) {
$freetaglib->find_or_create_tag($tag);
}
......@@ -294,7 +293,7 @@ class TikiImporter_Blog extends TikiImporter
*/
function linkObjectWithTags($objId, $type, $tags)
{
global $freetaglib; require_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
global $user;
$freetaglib->_tag_object_array($user, $objId, $type, $tags);
......@@ -375,7 +374,7 @@ class TikiImporter_Blog extends TikiImporter
*/
function insertPost($post)
{
global $bloglib;
$bloglib = TikiLib::lib('blog');
$objectlib = TikiLib::lib('object');
$post = array_merge(array('content' => '', 'excerpt' => '', 'author' => '', 'name' => '', 'created' => 0), $post); // set defaults
......
......@@ -9,7 +9,7 @@
$access->check_script($_SERVER['SCRIPT_NAME'], basename(__FILE__));
if ( isset($section) and isset($sections[$section])) {
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$here = $sections[$section];
if ( $tiki_p_freetags_tag == 'y' && isset($_POST['addtags']) && trim($_POST['addtags']) != '' ) {
if ( ! isset($user) ) $userid = 0;
......
......@@ -96,7 +96,7 @@ BODY;
}
if ($prefs['feature_freetags'] == 'y') {
global $freetaglib; require_once 'lib/freetag/freetaglib.php';
$freetaglib = TikiLib::lib('freetag');
$smarty->assign('filter_tags', isset($filter['tags']) ? $filter['tags'] : '');
$smarty->assign('filter_tagmap', json_encode(TikiDb::get()->fetchMap('SELECT tagId, tag FROM tiki_freetags')));
......
......@@ -5,7 +5,7 @@
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
require_once 'lib/freetag/freetaglib.php';
$freetaglib = TikiLib::lib('freetag');
class FreetagTest extends TikiTestCase
{
......
......@@ -258,7 +258,7 @@ class TikiImporter_Blog_Test extends TikiImporter_TestCase
public function testCreateTags()
{
global $freetaglib; require_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$freetaglib = $this->getMock('FreetagLib', array('find_or_create_tag'));
$freetaglib->expects($this->exactly(4))->method('find_or_create_tag');
......@@ -285,7 +285,7 @@ class TikiImporter_Blog_Test extends TikiImporter_TestCase
public function testLinkObjectWithTags()
{
global $freetaglib; require_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$freetaglib = $this->getMock('FreetagLib', array('_tag_object_array'));
$freetaglib->expects($this->once())->method('_tag_object_array');
......
......@@ -71,9 +71,6 @@ class TikiLib extends TikiDb_Bridge
case 'header':
global $headerlib; require_once 'lib/headerlib.php';
return self::$libraries[$name] = $headerlib;
case 'freetag':
global $freetaglib; include_once('lib/freetag/freetaglib.php');
return self::$libraries[$name] = $freetaglib;
case 'notification':
global $notificationlib; include_once ('lib/notifications/notificationlib.php');
return self::$libraries[$name] = $notificationlib;
......
......@@ -135,8 +135,10 @@ function wikiplugin_freetagged_info()
function wikiplugin_freetagged($data, $params)
{
global $freetaglib, $smarty, $tikilib, $headerlib;
include_once('lib/freetag/freetaglib.php');
$smarty = TikiLib::lib('smarty');
$tikilib = TikiLib::lib('tiki');
$headerlib = TikiLib::lib('header');
$freetaglib = TikiLib::lib('freetag');
$defaults = array(
'tags' => '',
......
......@@ -203,7 +203,9 @@ function wikiplugin_listpages_info()
function wikiplugin_listpages($data, $params)
{
global $prefs, $tiki_p_view, $tikilib, $smarty;
global $prefs, $tiki_p_view;
$tikilib = TikiLib::lib('tiki');
$smarty = TikiLib::lib('smarty');
if ( isset($prefs) ) {
// Handle 1.10.x prefs
......@@ -295,8 +297,7 @@ function wikiplugin_listpages($data, $params)
} else {
$aExcludetag[] = $excludetag;
}
global $freetaglib;
require_once 'lib/freetag/freetaglib.php';
$freetaglib = TikiLib::lib('freetag');
$i = 0;
foreach ( $listpages['data'] as $page ) {
......
......@@ -42,9 +42,8 @@ function module_action_similarcontent_info()
*/
function module_action_similarcontent($mod_reference, $module_params)
{
global $smarty, $freetaglib;
include_once ('lib/freetag/freetaglib.php');
$smarty = TikiLib::lib('smarty');
$freetaglib = TikiLib::lib('freetag');
$filterType = '';
if (isset($module_params['contentType'])) {
......
......@@ -30,10 +30,9 @@ function module_freetags_current_info()
*/
function module_freetags_current($mod_reference, $module_params)
{
global $user, $page, $smarty;
global $freetaglib;
include_once 'lib/freetag/freetaglib.php';
global $user, $page;
$smarty = TikiLib::lib('smarty');
$freetaglib = TikiLib::lib('freetag');
$objectperms = Perms::get(array('type' => 'wiki page', 'object' => $page));
if (! empty($page) && $objectperms->view) {
......
......@@ -38,8 +38,8 @@ function module_freetags_morelikethis_info()
*/
function module_freetags_morelikethis($mod_reference, $module_params)
{
global $smarty;
global $freetaglib; include_once 'lib/freetag/freetaglib.php';
$smarty = TikiLib::lib('smarty');
$freetaglib = TikiLib::lib('freetag');
$out = null;
if (isset($module_params['type'])) {
......
......@@ -71,10 +71,10 @@ function module_freetags_most_popular_info()
*/
function module_freetags_most_popular($mod_reference, $module_params)
{
global $smarty;
$smarty = TikiLib::lib('smarty');
$globalperms = Perms::get();
if ($globalperms->view_freetags) {
global $freetaglib; require_once 'lib/freetag/freetaglib.php';
$freetaglib = TikiLib::lib('freetag');
$most_popular_tags = $freetaglib->get_most_popular_tags('', 0, empty($module_params['max']) ? $mod_reference["rows"] : $module_params['max'], empty($module_params['where'])?'': $module_params['where'], empty($module_params['objectId'])?'': $module_params['objectId']);
$smarty->assign_by_ref('most_popular_tags', $most_popular_tags);
$smarty->assign('type', (isset($module_params['type']) && $module_params['type'] == 'cloud') ? 'cloud' : 'list');
......
......@@ -32,9 +32,9 @@ function module_freetags_prefered_info()
function module_freetags_prefered($mod_reference, $module_params)
{
global $user;
global $smarty;
$smarty = TikiLib::lib('smarty');
if ($user) {
global $freetaglib; require_once("lib/freetag/freetaglib.php");
$freetaglib = TikiLib::lib('freetag');
$preferred_tags = $freetaglib->get_most_popular_tags($user, 0, $mod_reference["rows"]);
$smarty->assign('preferred_tags', $preferred_tags);
$smarty->assign('tpl_module_title', tra('My preferred tags'));
......
......@@ -11,8 +11,8 @@
$section = 'blogs';
require_once ('tiki-setup.php');
$categlib = TikiLib::lib('categ');
include_once ('lib/blogs/bloglib.php');
include_once ('lib/wiki/editlib.php');
$bloglib = TikiLib::lib('blog');
$editlib = TikiLib::lib('edit');
$access->check_feature('feature_blogs');
......@@ -80,7 +80,7 @@ if (isset($_REQUEST["publish_Hour"])) {
}
if ($prefs['feature_freetags'] == 'y') {
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
if ($prefs['feature_multilingual'] == 'y') {
$languages = array();
......@@ -209,7 +209,7 @@ if (isset($_REQUEST['save']) && $prefs['feature_contribution'] == 'y' && $prefs[
}
if (isset($_REQUEST['save']) && !$contribution_needed) {
include_once ("lib/imagegals/imagegallib.php");
$imagegallib = TikiLib::lib('imagegal');
$smarty->assign('individual', 'n');
$edit_data = $imagegallib->capture_images($edit_data);
......
......@@ -10,7 +10,7 @@
$section = 'freetags';
require_once ('tiki-setup.php');
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$access->check_feature('feature_freetags');
$access->check_permission('tiki_p_view_freetags');
......
......@@ -15,12 +15,11 @@ $inputConfiguration = array(
require_once ('tiki-setup.php');
$categlib = TikiLib::lib('categ');
include_once ('lib/articles/artlib.php');
$artlib = TikiLib::lib('art');
//get_strings tra('New Article')
if ($prefs['feature_freetags'] == 'y') {
global $freetaglib;
include_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
}
$access->check_feature('feature_articles');
......
......@@ -10,10 +10,10 @@
$section = 'cms';
require_once ('tiki-setup.php');
include_once ('lib/articles/artlib.php');
$artlib = TikiLib::lib('art');
if ($prefs['feature_freetags'] == 'y') {
include_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
}
$access->check_feature('feature_submissions');
......
......@@ -10,7 +10,6 @@
include_once('tiki-setup.php');
require_once("XML/Server.php");
require_once("lib/freetag/freetaglib.php");
$access->check_feature('feature_freetags', 'freetags_feature_3d');
......@@ -24,57 +23,58 @@ $server = new XML_RPC_Server($map);
*/
function getSubGraph($params)
{
global $freetaglib, $dbTiki, $base_url, $prefs;
$nodeName = $params->getParam(0); $nodeName = $nodeName->scalarVal();
$depth = $params->getParam(1); $depth = $depth->scalarVal();
$nodes = array();
$passed = array($nodeName => true);
$queue = array($nodeName);
$i = 0;
$tikilib = new TikiLib;
$color = $prefs['freetags_3d_existing_page_color'];
while ($i <= $depth && count($queue) > 0) {
$nextQueue = array();
foreach ($queue as $nodeName) {
$similar = $freetaglib->similar_tags($nodeName, 5);
$neighbours = array();
foreach ($similar as $tag) {
$neighbours[] = $tag['tag'];
}
$temp_max = count($neighbours);
for ($j = 0; $j < $temp_max; $j++) {
if (!isset($passed[$neighbours[$j]])) {
$nextQueue[] = $neighbours[$j];
$passed[$neighbours[$j]] = true;
}
$neighbours[$j] = new XML_RPC_Value($neighbours[$j]);
}
global $base_url, $prefs;
$freetaglib = TikiLib::lib('freetag');
$nodeName = $params->getParam(0); $nodeName = $nodeName->scalarVal();
$depth = $params->getParam(1); $depth = $depth->scalarVal();
$nodes = array();
$passed = array($nodeName => true);
$queue = array($nodeName);
$i = 0;
$tikilib = TikiLib::lib('tiki');
$color = $prefs['freetags_3d_existing_page_color'];
$node = array();
while ($i <= $depth && count($queue) > 0) {
$nextQueue = array();
foreach ($queue as $nodeName) {
$actionUrl = $base_url.'tiki-browse_freetags.php?tag='.$nodeName;
$similar = $freetaglib->similar_tags($nodeName, 5);
$neighbours = array();
foreach ($similar as $tag) {
$neighbours[] = $tag['tag'];
}
$node['neighbours'] = new XML_RPC_Value($neighbours, "array");
if (!empty($color)) {
$node['color'] = new XML_RPC_Value($color, "string");
}
$node['actionUrl'] = new XML_RPC_Value($actionUrl, "string");
$temp_max = count($neighbours);
for ($j = 0; $j < $temp_max; $j++) {
if (!isset($passed[$neighbours[$j]])) {
$nextQueue[] = $neighbours[$j];
$passed[$neighbours[$j]] = true;
}
$neighbours[$j] = new XML_RPC_Value($neighbours[$j]);
}
$nodes[$nodeName] = new XML_RPC_Value($node, "struct");
$node = array();
$actionUrl = $base_url.'tiki-browse_freetags.php?tag='.$nodeName;
$node['neighbours'] = new XML_RPC_Value($neighbours, "array");
if (!empty($color)) {
$node['color'] = new XML_RPC_Value($color, "string");
}
$node['actionUrl'] = new XML_RPC_Value($actionUrl, "string");
$nodes[$nodeName] = new XML_RPC_Value($node, "struct");
}
$i++;
$queue = $nextQueue;
}
$i++;
$queue = $nextQueue;
}
$response = array("graph" => new XML_RPC_Value($nodes, "struct"));
return new XML_RPC_Response(new XML_RPC_Value($response, "struct"));
$response = array("graph" => new XML_RPC_Value($nodes, "struct"));
return new XML_RPC_Response(new XML_RPC_Value($response, "struct"));
}
......@@ -23,7 +23,7 @@ if ($cat_type != 'wiki page' && $cat_type != 'article') {
die;
}
include_once "lib/freetag/freetaglib.php";
$freetaglib = TikiLib::lib('freetag');
$multilinguallib = TikiLib::lib('multilingual');
if ( $cat_objId ) {
......
......@@ -10,7 +10,7 @@
$section = 'cms';
require_once ('tiki-setup.php');
require_once 'lib/articles/artlib.php';
$artlib = TikiLib::lib('art');
$access->check_feature('feature_articles');
if (!isset($_REQUEST["articleId"])) {
$smarty->assign('msg', tra("No article indicated"));
......@@ -51,16 +51,13 @@ if (isset($_REQUEST['switchlang']) && $_REQUEST['switchlang'] == 'y' && $prefs['
die;
}
global $statslib;
include_once ('lib/stats/statslib.php');
global $artlib;
include_once ('lib/articles/artlib.php');
$statslib = TikiLib::lib('stats');
if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
}
//This is basicaly a copy of part of the freetag code from tiki-setup.php and should be only there. The problem is that the section name for articles is "cms" and the object name for article in the table tiki_objects is "article". Maybe it is a good idea to use "cms" on tiki_objects instead "article" and then this block of code can be removed. Another solution?
if ($prefs['feature_freetags'] == 'y') {
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$here = $sections[$section];
if (isset($here['itemkey']) and isset($_REQUEST[$here['itemkey']])) {
$tags = $freetaglib->get_tags_on_object($_REQUEST[$here['itemkey']], "article " . $_REQUEST[$here['key']]);
......@@ -224,7 +221,7 @@ if (isset($is_categorized) && $is_categorized) {
}
}
if ($prefs['feature_categories'] == 'y' && $prefs['category_morelikethis_algorithm'] != '') {
global $freetaglib; include_once('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$category_related_objects = $freetaglib->get_similar('article', $_REQUEST['articleId'], empty($prefs['category_morelikethis_mincommon_max'])? $prefs['maxRecords']: $prefs['category_morelikethis_mincommon_max'], null, 'category');
$smarty->assign_by_ref('category_related_objects', $category_related_objects);
}
......
......@@ -11,9 +11,9 @@
$section = 'cms';
//get_strings tra('Articles Home');
require_once ('tiki-setup.php');
include_once ('lib/articles/artlib.php');
$artlib = TikiLib::lib('art');
if ($prefs['feature_freetags'] == 'y') {
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
}
if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
......
......@@ -10,14 +10,14 @@
$section = 'blogs';
require_once ('tiki-setup.php');
include_once ('lib/blogs/bloglib.php');
$bloglib = TikiLib::lib('blog');
$auto_query_args = array(
'blogId'
);
if ($prefs['feature_freetags'] == 'y') {
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
}
if ($prefs['feature_categories'] == 'y') {
......
......@@ -92,7 +92,7 @@ if (isset($post_info['priv']) && ($post_info['priv'] == 'y')) {
if ($prefs['feature_freetags'] == 'y') {
// Get Tags
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
$post_info['freetags'] = $freetaglib->get_tags_on_object($postId, "blog post");
if ($blog_data['show_related'] == 'y' && !empty($post_info['freetags'])) {
......
......@@ -14,7 +14,7 @@ if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
}
if ($prefs['feature_freetags'] == 'y') {
include_once ('lib/freetag/freetaglib.php');
$freetaglib = TikiLib::lib('freetag');
}
$access->check_feature('feature_forums');
......
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