diff --git a/app/Resources/public/css/base.css b/app/Resources/public/css/base.css index 5057eac276..69a286daea 100644 --- a/app/Resources/public/css/base.css +++ b/app/Resources/public/css/base.css @@ -235,22 +235,24 @@ header { filter:progid:DXImageTransform.Microsoft.Alpha(opacity=80); } .notification-panel .help a { - background-color:#879DAA; - border:1px solid #FFFFFF; - display:block; - margin-left:50px; - opacity:0.6; - width:65px; - padding: 6px 0 8px 6px; + background-color:#879DAA; + border:1px solid #FFFFFF; + display:block; + margin-left:50px; + opacity:0.8; + width:65px; + padding: 6px 0 8px 6px; + border-radius: 10px 0 0 10px; } .notification-panel .report a { - background-color:#8fd400; - border:1px solid #FFFFFF; - display:block; - margin-left:50px; - opacity:0.6; - width:65px; - padding: 6px 0 8px 6px; + background-color:#8fd400; + border:1px solid #FFFFFF; + display:block; + margin-left:50px; + opacity:0.8; + width:65px; + padding: 6px 0 8px 6px; + border-radius: 10px 0 0 10px; } .cookieUsageValidation { padding: 5px; diff --git a/app/Resources/public/css/themes/rainbow/default.css b/app/Resources/public/css/themes/rainbow/default.css index 5f3349410a..99ba96cd13 100755 --- a/app/Resources/public/css/themes/rainbow/default.css +++ b/app/Resources/public/css/themes/rainbow/default.css @@ -2059,4 +2059,21 @@ blockquote p { .skills_chart > ul > li > ul > li > a { width: 8em; } - +.communications #skillList .thumbnail{ + border: none; +} +.communications #skillList .table-bordered tbody tr td{ + border: 1px solid #84bd00; +} +.table thead tr th.achieved{ + vertical-align: bottom; + border-bottom: 2px solid #84bd00; +} +.table-header{ + color: #333; + padding: 8px; + line-height: 1.428; + border-bottom: 2px solid #84bd00; + font-size: 13px; + font-weight: bold; +} \ No newline at end of file diff --git a/app/bootstrap.php.cache b/app/bootstrap.php.cache index c968f55da0..300520e6d9 100644 --- a/app/bootstrap.php.cache +++ b/app/bootstrap.php.cache @@ -205,7 +205,7 @@ $this->headers[$key] = $values; $this->headers[$key] = array_merge($this->headers[$key], $values); } if ('cache-control'=== $key) { -$this->cacheControl = $this->parseCacheControl($values[0]); +$this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key])); } } public function has($key) @@ -332,6 +332,9 @@ $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file[ } } else { $file = array_map(array($this,'convertFileInformation'), $file); +if (array_keys($keys) === $keys) { +$file = array_filter($file); +} } } return $file; @@ -387,7 +390,7 @@ $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION']; if (null !== $authorizationHeader) { if (0 === stripos($authorizationHeader,'basic ')) { $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2); -if (count($exploded) == 2) { +if (2 == count($exploded)) { list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded; } } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader,'digest '))) { @@ -590,22 +593,22 @@ self::$requestFactory = $callable; public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) { $dup = clone $this; -if ($query !== null) { +if (null !== $query) { $dup->query = new ParameterBag($query); } -if ($request !== null) { +if (null !== $request) { $dup->request = new ParameterBag($request); } -if ($attributes !== null) { +if (null !== $attributes) { $dup->attributes = new ParameterBag($attributes); } -if ($cookies !== null) { +if (null !== $cookies) { $dup->cookies = new ParameterBag($cookies); } -if ($files !== null) { +if (null !== $files) { $dup->files = new FileBag($files); } -if ($server !== null) { +if (null !== $server) { $dup->server = new ServerBag($server); $dup->headers = new HeaderBag($dup->server->getHeaders()); } @@ -816,7 +819,7 @@ $host = $host[0]; } elseif (!$host = $this->headers->get('HOST')) { return $this->server->get('SERVER_PORT'); } -if ($host[0] ==='[') { +if ('['=== $host[0]) { $pos = strpos($host,':', strrpos($host,']')); } else { $pos = strrpos($host,':'); @@ -847,7 +850,7 @@ public function getHttpHost() { $scheme = $this->getScheme(); $port = $this->getPort(); -if (('http'== $scheme && $port == 80) || ('https'== $scheme && $port == 443)) { +if (('http'== $scheme && 80 == $port) || ('https'== $scheme && 443 == $port)) { return $this->getHost(); } return $this->getHost().':'.$port; @@ -1043,7 +1046,7 @@ return in_array($this->getMethod(), array('GET','HEAD')); public function getContent($asResource = false) { $currentContentIsResource = is_resource($this->content); -if (PHP_VERSION_ID < 50600 && false === $this->content) { +if (\PHP_VERSION_ID < 50600 && false === $this->content) { throw new \LogicException('getContent() can only be called once when using the resource return type and PHP below 5.6.'); } if (true === $asResource) { @@ -1115,7 +1118,7 @@ $lang = $codes[1]; } } else { for ($i = 0, $max = count($codes); $i < $max; ++$i) { -if ($i === 0) { +if (0 === $i) { $lang = strtolower($codes[0]); } else { $lang .='_'.strtoupper($codes[$i]); @@ -1164,14 +1167,14 @@ $this->server->remove('IIS_WasUrlRewritten'); } elseif ($this->headers->has('X_REWRITE_URL')) { $requestUri = $this->headers->get('X_REWRITE_URL'); $this->headers->remove('X_REWRITE_URL'); -} elseif ($this->server->get('IIS_WasUrlRewritten') =='1'&& $this->server->get('UNENCODED_URL') !='') { +} elseif ('1'== $this->server->get('IIS_WasUrlRewritten') &&''!= $this->server->get('UNENCODED_URL')) { $requestUri = $this->server->get('UNENCODED_URL'); $this->server->remove('UNENCODED_URL'); $this->server->remove('IIS_WasUrlRewritten'); } elseif ($this->server->has('REQUEST_URI')) { $requestUri = $this->server->get('REQUEST_URI'); $schemeAndHttpHost = $this->getSchemeAndHttpHost(); -if (strpos($requestUri, $schemeAndHttpHost) === 0) { +if (0 === strpos($requestUri, $schemeAndHttpHost)) { $requestUri = substr($requestUri, strlen($schemeAndHttpHost)); } } elseif ($this->server->has('ORIG_PATH_INFO')) { @@ -1207,7 +1210,7 @@ $baseUrl ='/'.$seg.$baseUrl; } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos); } $requestUri = $this->getRequestUri(); -if ($requestUri !==''&& $requestUri[0] !=='/') { +if (''!== $requestUri &&'/'!== $requestUri[0]) { $requestUri ='/'.$requestUri; } if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) { @@ -1224,7 +1227,7 @@ $basename = basename($baseUrl); if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) { return''; } -if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && $pos !== 0) { +if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) { $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); } return rtrim($baseUrl,'/'.DIRECTORY_SEPARATOR); @@ -1255,7 +1258,7 @@ return'/'; if (false !== $pos = strpos($requestUri,'?')) { $requestUri = substr($requestUri, 0, $pos); } -if ($requestUri !==''&& $requestUri[0] !=='/') { +if (''!== $requestUri &&'/'!== $requestUri[0]) { $requestUri ='/'.$requestUri; } $pathInfo = substr($requestUri, strlen($baseUrl)); diff --git a/bin/doctrine.php b/bin/doctrine.php index 91986c6286..63bb135aae 100644 --- a/bin/doctrine.php +++ b/bin/doctrine.php @@ -47,10 +47,12 @@ Type::overrideType( Database::getUTCDateTimeTypeClass() ); -/*Type::addType( - 'json', - 'Sonata\Doctrine\Types\JsonType' -);*/ +if (!Type::hasType('json')) { + Type::addType( + 'json', + 'Sonata\Doctrine\Types\JsonType' + ); +} $commands = array( new \Doctrine\DBAL\Migrations\Tools\Console\Command\DiffCommand(), diff --git a/main/auth/my_progress.php b/main/auth/my_progress.php index df7d4527f7..6c9a955922 100755 --- a/main/auth/my_progress.php +++ b/main/auth/my_progress.php @@ -75,11 +75,13 @@ $content .= Tracking::show_course_detail(api_get_user_id(), $courseCode, $sessio // Ofaj $courseId = 0; + if (empty($courseCode)) { - $content .= '
'; + $content .= '
'; $content .= Tracking::displayUserSkills( $user_id ); + $content .= '
'; } if (!empty($dates)) { diff --git a/main/img/icons/128/help.png b/main/img/icons/128/help.png new file mode 100644 index 0000000000..6db4042788 Binary files /dev/null and b/main/img/icons/128/help.png differ diff --git a/main/img/icons/128/project.png b/main/img/icons/128/project.png new file mode 100644 index 0000000000..00b72bf39b Binary files /dev/null and b/main/img/icons/128/project.png differ diff --git a/main/img/icons/128/ticket.png b/main/img/icons/128/ticket.png new file mode 100644 index 0000000000..2552470a03 Binary files /dev/null and b/main/img/icons/128/ticket.png differ diff --git a/main/img/icons/128/tickets.png b/main/img/icons/128/tickets.png new file mode 100644 index 0000000000..dc867bf807 Binary files /dev/null and b/main/img/icons/128/tickets.png differ diff --git a/main/img/icons/128/tickets_urgent.png b/main/img/icons/128/tickets_urgent.png new file mode 100644 index 0000000000..2adcbcb7b9 Binary files /dev/null and b/main/img/icons/128/tickets_urgent.png differ diff --git a/main/img/icons/22/help.png b/main/img/icons/22/help.png new file mode 100644 index 0000000000..21ed8cb242 Binary files /dev/null and b/main/img/icons/22/help.png differ diff --git a/main/img/icons/22/project.png b/main/img/icons/22/project.png new file mode 100644 index 0000000000..73ac516c0e Binary files /dev/null and b/main/img/icons/22/project.png differ diff --git a/main/img/icons/22/ticket.png b/main/img/icons/22/ticket.png new file mode 100644 index 0000000000..8dcab370f4 Binary files /dev/null and b/main/img/icons/22/ticket.png differ diff --git a/main/img/icons/22/tickets.png b/main/img/icons/22/tickets.png new file mode 100644 index 0000000000..40e90556bb Binary files /dev/null and b/main/img/icons/22/tickets.png differ diff --git a/main/img/icons/22/tickets_urgent.png b/main/img/icons/22/tickets_urgent.png new file mode 100644 index 0000000000..cb212fca2b Binary files /dev/null and b/main/img/icons/22/tickets_urgent.png differ diff --git a/main/img/icons/32/help.png b/main/img/icons/32/help.png new file mode 100644 index 0000000000..fe62616769 Binary files /dev/null and b/main/img/icons/32/help.png differ diff --git a/main/img/icons/32/project.png b/main/img/icons/32/project.png new file mode 100644 index 0000000000..41874cc2b8 Binary files /dev/null and b/main/img/icons/32/project.png differ diff --git a/main/img/icons/32/ticket.png b/main/img/icons/32/ticket.png new file mode 100644 index 0000000000..f8f3b8e7b8 Binary files /dev/null and b/main/img/icons/32/ticket.png differ diff --git a/main/img/icons/32/tickets.png b/main/img/icons/32/tickets.png new file mode 100644 index 0000000000..b857ae408f Binary files /dev/null and b/main/img/icons/32/tickets.png differ diff --git a/main/img/icons/32/tickets_urgent.png b/main/img/icons/32/tickets_urgent.png new file mode 100644 index 0000000000..34e75e5f4e Binary files /dev/null and b/main/img/icons/32/tickets_urgent.png differ diff --git a/main/img/icons/48/help.png b/main/img/icons/48/help.png new file mode 100644 index 0000000000..293bf685f1 Binary files /dev/null and b/main/img/icons/48/help.png differ diff --git a/main/img/icons/48/project.png b/main/img/icons/48/project.png new file mode 100644 index 0000000000..7acec41100 Binary files /dev/null and b/main/img/icons/48/project.png differ diff --git a/main/img/icons/48/ticket.png b/main/img/icons/48/ticket.png new file mode 100644 index 0000000000..f5ad667cbc Binary files /dev/null and b/main/img/icons/48/ticket.png differ diff --git a/main/img/icons/48/tickets.png b/main/img/icons/48/tickets.png new file mode 100644 index 0000000000..7f6519f71f Binary files /dev/null and b/main/img/icons/48/tickets.png differ diff --git a/main/img/icons/48/tickets_urgent.png b/main/img/icons/48/tickets_urgent.png new file mode 100644 index 0000000000..51f5097b42 Binary files /dev/null and b/main/img/icons/48/tickets_urgent.png differ diff --git a/main/img/icons/64/help.png b/main/img/icons/64/help.png new file mode 100644 index 0000000000..d95d8e4bb0 Binary files /dev/null and b/main/img/icons/64/help.png differ diff --git a/main/img/icons/64/project.png b/main/img/icons/64/project.png new file mode 100644 index 0000000000..6ed8e58e5e Binary files /dev/null and b/main/img/icons/64/project.png differ diff --git a/main/img/icons/64/ticket.png b/main/img/icons/64/ticket.png new file mode 100644 index 0000000000..153346130d Binary files /dev/null and b/main/img/icons/64/ticket.png differ diff --git a/main/img/icons/64/tickets.png b/main/img/icons/64/tickets.png new file mode 100644 index 0000000000..134620f0d2 Binary files /dev/null and b/main/img/icons/64/tickets.png differ diff --git a/main/img/icons/64/tickets_urgent.png b/main/img/icons/64/tickets_urgent.png new file mode 100644 index 0000000000..912f736552 Binary files /dev/null and b/main/img/icons/64/tickets_urgent.png differ diff --git a/main/img/icons/svg/help.svg b/main/img/icons/svg/help.svg new file mode 100644 index 0000000000..1f1d418300 --- /dev/null +++ b/main/img/icons/svg/help.svg @@ -0,0 +1,425 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/img/icons/svg/project.svg b/main/img/icons/svg/project.svg new file mode 100644 index 0000000000..7a0ebb610a --- /dev/null +++ b/main/img/icons/svg/project.svg @@ -0,0 +1,1859 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/img/icons/svg/ticket.svg b/main/img/icons/svg/ticket.svg new file mode 100644 index 0000000000..31e21f7843 --- /dev/null +++ b/main/img/icons/svg/ticket.svg @@ -0,0 +1,1610 @@ + + + + +begin='' id='W5M0MpCehiHzreSzNTczkc9d' +Adobe PDF library 5.00 +2003-03-10T02:02:16+02:00 +2004-03-29T08:59:47Z +Adobe Illustrator 10.0 +2004-01-18T18:44:12+01:00 +JPEG +256 +256 +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYqsmmhgieaZ1jijBaSRyFVVG5JJ6YqwPUvzf0yO5MGl2MuoldvUr6StTuo4uxHzU +YQLUlqw/OPR3k9LU7KewcGhI/eqP9bZH/wCFwUrLdL8zaBqoH6Pv4Z2P+6w1JPpjajj7sVTPFXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq87/ADX1O5lk +0/y7avxa9YSXAHdeXGMH/J5BiflhiLNIkaFpx5Z8q2VtZCOEenEuxcAc5G7sxzMnkGPYBxYQOTco +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 +2KuxV2KuxV//2Q== +uuid:c0ca0d88-d3d0-4de4-88fb-576c6d69015f +image/svg+xml +folder-1.aiimage/svg+xml +end='w' \ No newline at end of file diff --git a/main/img/icons/svg/tickets.svg b/main/img/icons/svg/tickets.svg new file mode 100644 index 0000000000..ca829d31c7 --- /dev/null +++ b/main/img/icons/svg/tickets.svg @@ -0,0 +1,1803 @@ + + + + +begin='' id='W5M0MpCehiHzreSzNTczkc9d' +Adobe PDF library 5.00 +2003-03-10T02:02:16+02:00 +2004-03-29T08:59:47Z +Adobe Illustrator 10.0 +2004-01-18T18:44:12+01:00 +JPEG +256 +256 +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYqsmmhgieaZ1jijBaSRyFVVG5JJ6YqwPUvzf0yO5MGl2MuoldvUr6StTuo4uxHzU +YQLUlqw/OPR3k9LU7KewcGhI/eqP9bZH/wCFwUrLdL8zaBqoH6Pv4Z2P+6w1JPpjajj7sVTPFXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq87/ADX1O5lk +0/y7avxa9YSXAHdeXGMH/J5BiflhiLNIkaFpx5Z8q2VtZCOEenEuxcAc5G7sxzMnkGPYBxYQOTco +vUfKFneJxkSO4XssyAkfJt8iNQD9QZeAR9JYfqv5VWJJe3WWzcbhoz6qV8aGp/4YY+HjlyNI48ke +YtARQfmVof8AxztS+v2ybCCUh/hHbjL9n/YtkJaaQ5bs46iJ5o+0/OHULF1h8x6NJC3QywVWvyjk +6/8AB5TKJHNuEgeTLdI/MXyfqnFYdRjhmP8Aum4/ctU9vjop/wBiTkUsjVlZQykFSKgjcEHFW8Vd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiryb1v01+Y1/e/at9PrHE +eoqg9IfeeTZkaaNyvuaNRKo09TsofRtYo+4X4vmdzlWSVyJbMcaiArZBm7FVGaztZv7yNWJ/a6H7 +xvk45JDkWEoA8wl135ctJkZAao3WOQB1P35fHUnqGo6cdCxHWPyq0i5qy2nosf8Adlo3H/hD8P8A +wuH91LyY/vI+bHV8m+cNDct5f1qSNVNfq0pZB9KnnG30qMB03cUjUd4RUP5nefNEovmDRxdwJ9u5 +jHpmncl4+cX4DKJY5DmG6OSJ5Fkuj/nH5L1Dik80mnTHbjcp8Nf+Mic1p/rUyDNmNnf2N7CJ7O4j +uYT0khdXU/SpIxVXxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpf5g1MaXol7 +fk0NvCzJXu9KIPpYgYq8/wDyw0xjai4kFXvJi7MepSPbf6eWZeP04ye9xcnqmA9QzEcp2KuxV2Ku +xV2KrZIYpRxkQOPBhXCJEckGIPNAzaJZvulYj7Go+45fHUyHPdplgiWM6z+Wuj3/ACaayhlc/wC7 +Yx6MlfEleNfpOT8THLmGHhzjyLDLv8qr3TZzc6Hqdzp1wPs8yy/QJI+Bp9Bx/LxP0lPjkfUF8Xmn +83/L9BdQJrVqn7fH1Gp7NHwk+llOVSwSHRsjmiU50n8+PL0z+jrFncaZODR2A9aNT3rQLIP+Aylt +Z1o/mjy7rKg6XqMF0SK+mjj1AOu8Zo4+kYqmeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV +2KsB/N/Umj0e00uLeW/mqVHUpFQ0+l2XFU88n6atnZpGOlvGsIPiafEcy9RtERcbBuTJkWYjkuxV +2KuxV2KuxV2KuxV2KuIBFCKg9QcVQc2lWMu/p8D4pt+HTLo55Dq1SwxKSav5I03UU43MEN2B0EyA +sP8AVbqMt8eJ+oNXgkfSWCax+S2m8jLYvcadKu6Mh9aNT1rueX/D4+FjlyK+JOPMIGKL84fLn/HO +1IavaJ0gmYSniO1JqOPkj5CWmkOW7OOoieaY2P583VjKtv5p0KazlPWWAFa+JEU3E0/2ZygxI5tw +kDyZxof5meR9a4pZ6rEk7bC3uCYJK+AEnHkf9UnAlk4IIBBqD0OKuxV2KuxV2KuxV2KuxV2KuxV2 +KuxV2KuxV5V5im/TP5lRwD4rfSkUHw5J8ZP/ACMcL9GXYI3JqzSqL0rSofSsYwer/Gfp6fhjnlci +uGNRReUtrsVdirsVdirsVdirsVdXFWsKuxQ1XFWsKFCaztZv7yME/wAw2P3jJxySHIsZQB5hLL7y +3ZXMTROFkib7UUyiRD9By4ajvDScHcWEa5+THly85Olo1pIf92WbUH/ItuS/cuGscvJbyR82KT+X +vzA8iRtqHl7VpLywtqvPYSA8Qg3NYWLIwA6laN4ZXPTkCxuzhnBNHZ635B862Pm/QU1GBfRuEPpX +ltWpjlAqaHupG6nMdvZJirsVdirsVdirsVdirsVdirsVdiqje3UVnZz3cxpFbxtLIf8AJRSx/Vir +yz8vbaa/ur3VJ95r6fjy+Z5yH72/DMvB6YmTjZt5CL1kAAADYDYDMRyXYq7FXYq7FXYq7FXVxVqu +FXYoarirWFXVxQ0TirVcKtYoariqW63HG0CswBavH5gg1GZOnJumjONni/5Oan+i/PGs2luaabLO +0RQbqFV5PTYfID7sxZ8y5EeQfQORZOxV2KuxV2KuxV2KuxV2KuxV2KsP/NTVPqXlSSFTSS+dYB48 +ftv+C0+nFXeQNK+qafbRstGhiDv/AMZJdz+s5l5fTjAcXH6pkswzEcp2KuxV2KuxV2KtVxV2FDVc +Vawq6uKGicVarhVrFWq4odXCrWKGJfmHrg0rQ768DcWtYGMR/wCLZPhjH/BFcycfpgZNGT1SAeWf +lFpLfVjdcayTsSp7mp4KP+JZhOW+iMVdirsVczKqlmICgVJOwAGKpNqHnXydp1Rf65YWzDqstzCr +eH2S1e2Xw0uWXKMj8C1yzQHMhjV/+e/5V2Wza4kz9lt4p5a/7JUK/jmVDsnUS/h+5olrcQ6oC1/5 +yM/K2eYRvfT24P8Au2W2l4g+/AOfwyyXYuoA5A/FiO0MR6vQtK1jStXskvtLu4r2zk+xPA4dCR1F +V7juM1uTHKBqQouXGYkLBtF5Bk7FXYq8v/MKb9LedNM0ZfiitFDzj3f43H/ItF+/LMUbkAwySqJL +0DRIfTs+Z6ykt9A2GWamVyrua8EaimGY7e7FXYq7FWq4q7CrVcUNYqhrvU9Os/8Aeu6ht+/72RU2 +/wBkRk4wlLkLYmQHNJrz8w/JVoSJdYt2p/vpjN/yaD5fHR5T/CWs54Dqkt3+c/kuAkRPc3QHeKGl +f+Rpjy+PZmU9wajq4BKW/PfSROqrpdwbevxSF0DgeITcH/gsu/kqVfULYfnR3PQ9J1Wz1XToNQs3 +9S2uF5RN02BI3B6EEb5rsmMwkYnmHKhMSFhF1yDJrFDVcVaJwq8V/PPV3eys9LhJMuoXBcqO6RUC +qfmzj7svz+mIi04d5Esq/LPRkt4rWICqQryr7RgKp/4LfMNynpTMqqWYgKBUk7AAYq+f/wAxP+cl +ngu5dM8mQxzem3B9XmBdWYGh9CPYEf5TbHw750ei7DscWX5frdTqO0aNQ+bzW6/MD85dVq0msagn +Pf8AdOLP7vS9KmbzH2VhjygPjv8Ae66WtyHnIoVfJP5k68QZkvL6u4MjT3H6hJ4Zb+6xczCPxAa7 +nPpKXzTrT/8AnHvz5dEc7ZogevIIn/Jx4z+GY8+0tNHnMfCy2R0uY8oH7mTaf/zi9rUlDd3ccXiD +Jv8Ackb/APEsxZ9u6ccuI/Buj2dnP80IrVv+cYLiKzeSxulnmUE+mrFWPy5jifvGRxdvYZGpAx8+ +a5Ozc0RYIk878v655u/LLzKJrZ29Itxu7R6rFOiGjJIh+y6+PVfl1ztXpMeeFH4Fx9NqZQlY+IfX +PlfzLpfmXQ7bWNNfnbXK14n7SP8AtRuOzKdjnDZsUsczGXMPTY5icRIcimuVM2mZVUsxooFST2Ax +V5J5VZ9Z8z6rrRBIlkMdvXwdvhH+xRVGZWmHOTjag8g9aijEcSRr0QBR9GY0jZtyAKFLsCUFc63o +1qStzf28BHUSSoh/4YjLI4pnkCWBnEcylNz+Ynk2CobUkYjtGsklfpRSMvjosp/hazqcY6pPc/nD +5XiqIorqcjoVRVU/Szg/hl0ezMh50Gs6yHmk91+dtARa6Tv2eWb/AI1VP45fHsrvl9jUdd3BJ7n8 +4vNk9Utre2hJ6FY3d/8AhmI/DL49mYxzJazrJ+SXz+cfzNv1otxcIh6elCkQ/wCCVFP45dHR4Y9G +o6mZ6oKTSfzC1Q8bi4upgeiy3DOP+BDN+rLQMUOQAazklLqSq235TeaZzWRQvLqeLn8WCD8cEtZi +HUJGKZ6FN7X8kdSahnnK/wDAL+oyZTLtPGGwaXIeibQfkppkNDd3Qp/lOT+oRZUe1AfpiSz/ACUu +sgGOfmB5Q0fRNOb9HmOYqI3aZdyKvwK/af2zL02olkFkU42XHwSAu2R/lDq1x/hRoVYUt7mRQpHZ +gr/rbNV2kP3l94djpD6Pi9Jt5xNCsgFK9R7jNe5K+uFXYqh76X07WQ9yOI+nbLMUbkGvIaD598yT +trv5omJPig0tViX/AFo9z9PrSU+jI6iVyZYI1F7p5OsVgsmkp1pGh9kHX6ScobmCf85Jeb7jRPJc +WlWkhiutdkaB2Bofq0agzAf6xZFPsTm57E0wyZeI8off0cDtDLwwofxPNPyM/LWy1y6k1PVRSxtU +Esxrx2avBAe3IKSxHbbaudF2nrTpsY4f7yfLy83VaTTjLI8X0R5ve4NV8raWBDpmnIix7K0UaRg+ +9ftH5nOZlgz5d5y+Zt2Y1GKG0Yul86yn+6tVXwLMW/UFxj2cOpQdeegQkvm7Vn+yY4/9Va/8SLZb +HQYx3lqOtme5By+YNXk+1duP9Wif8Rpl0dLjH8LUdTM9VKHWtRhkEiXUnIdmYsD8wajJS08JCqDG +OeYN2Xnn53WlnqUKarFGI55o+U6j/f0BAZh/rRsM2nZYlHHLGd+E7e4/guHrZA5IzH8XP3j8BJfy +a/Mi08oyTQalK40+diXiRWc1psygbVBzX9qdn5MuQSgOm7sdFq4wgRI9Xpl5/wA5H+To6i0sb65Y +dGKRRofpLs3/AAuYcew8p5mIciXacOgLG9Y/5yHvNSsrixsdFW1FxG8RuJLgyMA60JCqiUO/jlx7 +EERZl9jWO0iTQiknlTzr5mtyttYLHEis0zMsXNi3QE8uQ8O2ZY7NxQxb2bcQ62csnTZks3mXz/e7 +veXK1/32BB/xAJlMdJiH8IbZaqZ6qH6D82amazPPcE9TJI8v6ueTvHDuDDilLvKNtvyx8wTU5RlK ++Kkf8TKZXLWYh1ZjBkP8JTW2/KC8anrzcfmyj/iIkymXaWMct20aPIe4JnB+U+jxb3Nwu3iWP/Gy +ZSe0ieUSzGj75BMIPIvk63+3xcjuEU/rVz+OQOszHkGQ02Mcyjo9P8rWwpHbM9PmB91VH4ZA5M56 +0y4MI6WrC70uL+50+MEdGIWv6jkfDmecinjgOUQ02vXIHGOONF7UB/riNLHqSp1B6IaTWdRb/dvE +eCgD+GWDTw7ms5596Elvbt/tzOw8Cxpl0ccR0azkkeqFZqmp65YA1ljfnOL1tJukAqRAzU/1fiH6 +sysPJomfUEu/Jq5Bi1S3J3VopFX5hgT+AzB7Tj9J97sNGeYeu6W9bcg9mP6hmqc1F8l8RhpFtc18 +RjS2knmnVILDT5rmVv3drE9xIO9EUn+BzIwigZNGU2QHif5W2ct5e3erXHxTXErSMx7kHkT9Lv8A +hmETblgU+i9Ntvq1jDDShVRy/wBY7n8TgS+ff+cskcXvlpyDwMd2FPaoaGv6xnTez3Kfw/S6ftTn +H4oz8qtUSLyhPZoaNI9vJIR3T0jxH3rmy7Tw3khL+i4ODLUJR82Sm7XxzD8NeNTa9XxyQxsTkU2v +x45IYmJyKTagPHJDExOVVii1S4/3ntJ5a/yRu36hkZShHnID4swJy5An4IbXPIfmzWrVYI7B1UrI +pMjJHQSKATR2U9sOHtHT47uXP3lGTQ551UeSUWH/ADjjqxo11dRRAdQZCT9yof8AiWQn23gHISLk +R7NznnwhP7P8gNAgobzUUJHVVUn8Wk/41zGl25f04/t/Y2jss/xZPkETeflz5I0vgsJeWTiWc0RR +7U4oD+OY0+0s+QgVEfj3t0dDigCTKRT3yroXluCKWYWXOpCKXJPTc9T7+GOs1GY1HiY6XBiFypka +S2EP9xYwx06EKo/UMwDGZ5yLnAxHKIXtqtyegVfkP65EYIpOYqL3923WQj5UH6smMUe5icku9Qea +VvtOzfMk5YIgMDIlSJyTFaThQsJwoWE5JipsckEKbHJBiVNjkgxUmOSDEpPqSi49aM/ZdTH9BFDm +VjFBx5ndhv5T3Ho+YbmBjxMtuwA8WR1NPurmN2hG4A+bnaU+r4PaNKf+8X5H9eacOcUeThQ0ThV5 +B+c+tcNLmgRvivJlgX/jHF8TEfSo+/MnOeDCB3uNhHHlJ7k4/KvQvQs7OBl3+EyD/V+N/vYkZq3Z +PXcVeIf85V6f6nlbRtQpX6tetAT4CeJm/wCZOb/sCdZJR7x939rrO04+kHzY3+R+iXOu2ciQXCQ+ +jCvPmCSQHZRQDwpm97V1ccWOJIu3VabTHLIgGqeuRflrEByudSZh34RhKfSzNnPS7YP8MftdiOyh +1kiI/JflWH+8ee4Pfk9P+IBMrPaOc8qDMaDCOdlFxaL5Vgp6Wmo9P9+Vf/iZfKpajPLnP8fBsGDC +OUUZFPa2/wDvNZww06cFA/4iBlMoyl9UiW4SjHkAG31O5PQhfkP64BhipylDyX103WVh8jT9WWDH +HuYHIe9DvK7faYn5muWAMCVMnJMWOapP6ly5rtWg+S7Zbpo3O+5r1EqhXeyPToPQsYY6UbjVvm25 +yrLLikS2Yo8MQEQTlbNaThQtJwoWk4VWk4ULScKFhOSQsY4QxUmOSDFTY5IMVNjkghQlk4oW8OmT +iLLCRSx8yg45YH5WcWX5hrGdkM88Q+TqwX8aZVqxeIuXpz6g9r0x6XBH8ynNEHZlNCcLFQvLj0LW +WXuikj59vxyzHHikAwnKgS8C86TfpXzzY6YDyislDSjr8TfvX+9Qowa+dzruTooVC+97j5F0/wBG +3MhFCiCMf6zfE+YLmMqxV5r/AM5E6f8AW/ys1GUCrWU1vcKO/wDfLET0/lkObTsadaged/c4Wvje +I+Tzb/nGG/4azNbMdpYZo1HuDHKP1NnQduw4tKD/ADZOs7NlWau+L3/UbhnlMQPwJ1Hic5XFGhbt +8srNIPLWp2KtFqYaVTZskAhTZskAxWFsNMbUbmb04HfuBt8+2EqGP2kX1jUIouq8hy+Q3OZGH04z +Joy+rIAy4nMJy1pOFDROFC0nCq0nChaThQsJwoWE5JisY4QhTY5IMSpMckGKmxyYQg7mSp4joOvz +y6AaplCNloai891JxY+fYbjoguLeU/I8eX8ccguBHk34jVPa7J+N1H7mn3imc8HapwThQk3mW7SG +zCs3FSS7k9AqCprmXpY7k9zjamWwHe8V8gxPrHme+1eUVEsp417AnmR9CqozV5J8Uie92MI8MQH0 +boVt6GmQgijSD1G/2W4/CmQZo/FWM/mbYfX/AMvfMVsByZtPuHRfF4ozIo/4JRmVoZ8OeB/pBp1M +bxyHk+bv+ce7/wCred7VSaBpQlPH1o3j/WRnadpQ4tLkHlfyLz+klWaJfTd6Ct3KPev375x+PeId +5MbqNTk2LROKFhbJUxKmWw0xJWFslTErC2GkJdq84WFU/mNT8hgl3Jip+W4eUstwR9kcR823OZOo +9MRFx8HqkZJ+TmG5S0nCq0nChaTihaThRa0nJItYThQtJwoU2bJAIU2OSDEqTHJBioSyUHv2ycQw +kUI+XBqKi2TDEvPPzAjMerwTLtzhG/8AlKx/qMsizhyewafdCaK2uhssqpKPkwDZzko0SHcA2LZC +ThQ84/NrWvqmiXvE0eRRaRfOT7f/AAvLMiZ4MJ/pNERx5h5ID8pNDK6dbgij3BBY/wDGQ8ifoTjm +pdm9yAAAAFANgMVdiqld2yXNrNbSf3c6NG/ycFT+vDGVG0EWKfFn5b3Mmk+drf1vhe1nRnHSjQTK +T1+R7Z6NKPiY5AfxRP2h5QHhmD3SD7A1VaXVf5lB/h/DOEwH0vSZOaDJy5rWFsNMSsLZKmJUy2Gm +BWFslTErC2GkWkWrz8pmFdloo/WclijxZB5IyyqCd6LD6OnR12aT4z9PT8MGolcyuCNRRpOUty0n +ChaThQtJwoWlsNIWFsNIWFslSLWlsNIU2bJAMSVNmyQDFRd6ZIBiShnau5y0BrKixyYYlSc5IMSw +r8xIaxWU38rOhP8ArAEf8RyyLLGzzyhdfWfLGmydxAsZ/wCef7v/AI1zRamNZD73a4jcQzIzKsHq +t9kLyPypXIRFmmRNB4L+b+s27ahZWd1N6VvHW5vJKE8RI3EGigmoAbYDvk9bcpRxxYaPYGZTnyz+ +ef5daKiMTd3fpKeK20H7TbCnrNF0XJYux88+4e8/qZz1+OPemif85VeV2vY4zo94lmzASXDNHzVT +T4vTBNab/tZlHsDJX1C2n+U43yNPabK9tb6zgvbSQTWtyiywSr0ZHFVI+YOaKUTEkHmHZA2LCtkU +vizzDaDS/wA2NYtAOMa6jdBFH8kjM0Y29mGeh9nZOLHA/wBEfc8tq41OQ831q919c0vTr7r9at0l +r/rorf8AG2cWIcE5R/myId+ZcUYy7whS2WU1lYWyVMSsLZKmJUy2GmJWFslTEqckgRGY9FBJ+jCh +jpVri7SP9qRgCfdjvlumFRMmrUGyIswACqFGwUUA9hmI5TROFC0nFC0thpVhOSQtLYaYrC2GkWsL +ZKkWsLYaRaxmyQDFReTwyYDElRZsmAwKkxyQYlRY5MMSpMckGJYz57i9TROf++pUb7wV/wCNsmE4 +zunX5aXJl8rRxk1+ryyRj6T6n/G+ajXRrJ73Z6c+lml9c8dJRQd5KJ9A6/qyOmjcvcjUSqL5n85X +MOu+Yb1pavbyzcEAJFY4iFXp7LXJaKPiZzLoEaqRxYREcyj9I8s6HFbB/qUbFjUcxz26D7Vc6/DE +CLzObNInmkvnZIPrNjpdnEkbOeZVFC1LngnQfPDlmIxJPIC27SRMj79n0R+UGr3kVtDpEnxWaRhb +fr8HpqFUfIhc85yTM5GR5k29nGPCAB0eoZBk+RvzztBp35yXc4HFLg2lyB7GJEfr4sjZ2/Ys7wR8 +ifved7QjWQ+b6F8p3Ju/y/0WetSkfo/REWi/40zQ66HDq8g87+e/6XZaeXFgifx3IgtldJKwtkqY +lYWyVMCplsNMSsLZKmJQWpTcbcr3c0+jrkZ8kw5oTy/F6t+0x+zECR8zsPwzIyenGB3tGP1ZCe5k +ZOYbltE4ULS2FFrC2FFrS2SpFrC2GmKxmwgItSaeMftfdkxEsTIKTXAPTJCLHiUmkJ65IBjawtkq +RamzZIBBKmzZIBiVJjkgxKkxyYYlJ/M8Xq6FeJ4Jz/4Ahv4ZIIid1L8p7kmx1C2rtHKkgHvIpX/m +Xmt7QjuC7PTHmGQec9a+oeXrudTR7eJljP8AxbLRU/FhlETwYjJMhx5BF8/WQL3e37Ow+bZl9k4q +hfe4vaeS5V3M2taKioOiin3Z1EHnZMP08HV/PEs4+KK2J4eHwfu0p82+LNR21n4MBHWWzveysNyH +lu+mPyw0wRxvcEbIvFD/AMKP+Ns4t6R6Bir5i/5yosPS84aRfqKfWbH0iR3aCZzX50lGdX2BO8Uh +3S/Q6TtOPrB8nqP5S3v138uD/wAu9wwA9mCS/wDMw5j9tRrVg/zoj9I/Q29nm8BHcU8LZh02lYWy +VMSsLZKmJUy2GmJWFslTEpRq83xcf5R+LYBHimAplwxJTHy9D6diZCPilYn6BsP45PVSuVdzDTxq +N96ZE5jt6nLPFGKyOqD3IGSjEnkxMgOaEk1azXo/I+Cg5aMEms5ood9ZQ/YjJ+Zp/XLBpz1LA51J +tUmboFX8ckMIY+KVhu526ufo2/VkvDDHjK31Cepr88NItsNgpNu5Y0tuL4aW1pbGkWsZskAi1Nmy +QDElTZskAxUmbJBiUJfR+taTw9fUjZP+CUjJBF7sc/Ku4KatewVosluJCO1Y3AH/ABPMLXx9IPm7 +LTncqX5r6rx0+2tAaG6le5kH+RGOKA/Ov4ZrtXtGMB1cjS7ylM9HnmgLylEh7kuf1DN/o4cIA7nS +audknvZJeXv1PSLq8rRo0PD/AFjsv/DEZt4crdbw3IBBflZphZXu2WrSv8Pusew/4ds5Pt7NeQQ/ +mj73rOzMdQMu99U+UrAWejRLT4n3J+W38K5oXZJzirwb/nK+w56T5f1AD+4uJ7ct/wAZkVwP+SJz +ofZ+fqnHyH4+11fakdolH/8AOO14bnynqdoT9iOF1HuVeM/8mxmT7QRqWKXvHypp7MO04s2LZrqc +grC2SpgVMtkqYlYWw0xKwtkqYlI9bdImaWRgiEAgsaDbamHHYyBGSjAqNl560+O2W2A/eR/CJGqq +EdjmdPs2RPF0LhQ18QK6qr65d3Q5LMAh6CI0H3jf8cA00Y9EnUSl1UOZJqTU9ycnTG14bI0leGwU +m14bBSbXhsjSbbDY0m2+WCk23yxpba540i1pbDSLWlsNItTZskAhTZskAxJU2bJAMSpMckEFg3li +Y2XnD6uDxMrT2wH+xY/8aZTnhxR9zmQnXxY/+Z2qfWvMFzGjVS342cX+w+3/AMOWzSj16jyj+Pvc +8+jB/W/H3IHRgEhJ8aAfIZ0mDYOgzblf54uTDpVrYr9udubgeCDp/wAE2bLkHH04uRL0f8stCaOO +ztgvxLxB/wBYbn73bPPdXm8TLKfef7HtMGPggI9z6GhiWKJIl+zGoUfICmY7avxV5X/zkpp5uvyy +lnpX6jeW9wT4ci0Ff+S2bfsSdaiu8H9f6HB7RjeL3Fhf/OMV8Prt1Zsfhe3kAH+UkiNT7pDm67fh +enjL+bL7wXX9mSrKR3xeoygo7Ieqkg/RmpjuHLKkWyVMCsLZKmJWFsNMSxnXPONraFoLOlxcjZm/ +3Wp9yPtH5ZstN2fKe8th9rgZ9YI7R3LDLzULy9mMt1KZH7V6D2A6DNt+WgI8IFOsOeRlZKiADlHh +ZIciz8SEua+N5Ym5ROUbxBI/VkTnPKQZDCOcSmFvruoRUD0lX/KG/wB4yPDily2ZcWSPmmdv5jtX +oJVaI+P2h+G/4ZCWmPTdnHUDrsmdveW04rFKr+wO/wB2Y8oEcw3RmDyRAbIUztsNgpNrg2Ck23yx +pbdyxpbaLY0ttFsNItYWw0i1hbDSLWM2SAY2ps2SAQVNmyQDEvItT8zQ23n9Li2Ilt7K5Dsw6M3R +wPlUjLMkOHFKR7m6HqlEebHNRuXn1EFzycVkkPizmuc52fHnI9Xa66XKPcyPR4ucsEPYULfRuc6T +BGyA6DMdiUPqK/pPzlDD9qG1IDeFI/jav+y2w9qZ/DwyPlXzcjszDxSiPi+hfyu0qk6ysu0K1Pz6 +n/hmGcG9W9PxV2KsP/N/T/r/AOWXmOCleFm9x/0jET/8y8zezp8OogfP79nH1cbxS9zwP/nHTUPQ +85W8RNFkZ0b/AJ6QuF/4ZBnXdqw4tJPyo/a6PRSrNH4vedUX09QuF/yyfv3/AI5zuE3AOyy7SKCL +ZdTSVjNkgGJYH5p82tOz2OnvSAVWader+Kqf5ffv8s3ui0HD6p8+51Wq1V+mPJiwObR15Xg5FiV4 +OBiqK2QItINKgCnMeeniW+OeQb9KvvlBwSj9JbhmjL6g1wZTUVBHQ4PFnH6gnwoS5FFQatqUFAsh +dR+y3xfr3yPFjlz2Tw5I8t0xt/M69LiKniyH+B/rgOnB+kpGeuYTK31axnpwmAb+VvhP45TLDIdG +2OWJ6ovnldNlu5Y0tuLYaRa0tjS2tLZKkWsLYaRawthpjamzZIBFsK/Mfzd+ibD6haPTUbxaAjrH +Edi/zPRfv7ZkYcdm1DyMwTWt0I5RxcAEj5gNlupjcCG3DL1Aoizf1715ezvUf6q9M57SY+EAObqp +8RJZp5fKxx3N6/2IUP6uR/Vm+0g5l0uo6R73eQ7JrrVJ72QVZ348vp5v/DNH29m+mHx/V+l6DsvF +Vy+D6g8h6f8AVtHEjCjyn9W/6znNu3ZLirsVQmsWI1DSL6wPS7t5YD/z0Qp/HJ458Mge4sZxsEPj +n8ob82XnSwdvhCXEDOO9FlUMPuY56Fnhx4Zx74H7nl8UuHJE/wBIPqPzInDU3P8AOqt+FP4ZyGkN +wd1qBUkpZsy6cYsQ87+YDbxfo22ak0orcMDuqH9n5t+r55t+zdLxHjlyHJwNZmocIYKDm8dWV4OR +YleDgYrwcDFcDkUKitkSEgqqtkSGQKor5EhNrqIeoymWGJ6Nscsh1WtAD0P0HKDpq5FuGovmFNrd +h2P0b4OLJHzTw45eS6G8vbf+6lYAfs12+47Y+NCX1BfCkPpKPg8zXCUE8YceI+E/xGHwoS+kr4so +8wmEGvafLQFzEx7OKfj0yEsEgyGaJRqzI68kYMp6EGoyumy3F8aW1hfDSLWFslTG0s1/XLTRtMmv +7k/DGKInd3P2UHzycI2aRzeaeSfLeteevNqzSfHNcSci5B4RovVz4JGuw96Drl2ozxwYzI9GyGM5 +JCEUn896e+n680DfaQFGPT4o3ZD+rLcchON97GA4bHclemALU+Gw/Wc0xjwzl73LkbAZjdsbPytH +H0kuyCfkfi/4iAM3GEcOMebrfqynyZh+W2kUgt1K7yUZv9n8bf8AC0GcT2lm8TPI9Bt8nrdHj4cY +D6TsLf6tZQwd0UBv9Y7n8cwXJV8VdirsVfE9zbnSPzL1WxT4Bb393Ch9kkfge38oz0bQz44RPfEf +c8rqI8MiO4vqvzFKtwljer9m5gDL8jRv+N84/SR4eKPcXdak3R7wxzUL6Kys5rqU/BCpYjxPYfSd +s2OLGZyER1cKc+EW8jurua7upbmY1llYsx+fYewzrIYxCIiOQdJORJsrAckwK8HIsV4OBiuBwIXg +4GK4HIoVFbAQtr1fIkMrVA+RpNrw+CmVrg+Ck248W6gHISgDzZCZHJTaBD0NPxymWmHRtjqD1UHt +WHTf5ZHgyR5G2XFjlzUle4gasbsjexKnHx+kgjwesSjIfMN/FtJSVf8AKFD94yQGOXI0gmceYtHQ ++ZLN6CVWiPj9ofhv+GJ056KM46oxL21kQukqMqirGo2A8fDIGBHNmJA8nknmfWbjzbr6WloWOm2z +FYqftb0MlPFui+305lY48I3Zk0PN7vpNhb/ll5JUhFHmbVlCxpQEwqB0+Udanxb2znckzrc9f5KH +2/2/c7SI/K4rP95P8fZ97wv8x7eQ/UrtyWdzKsjtuSx4tUn783+E9HWRY7pEDXE8FuvWVwtR7nr9 +2YGaF5q728yqF9zLPMAF1q9pp0f93GFUqO3Lc/cgGZ2szDHjMv5ocbQYuMj+kXtX5YaSJLuFivwp +Rz4b/F+pQM8+exewYq7FXYq7FXx9+cFp+jfzn1OgpHLcW84PiJ4o2c9/2mbO67GyXggfh9rzmvjW +WT6Ds7j635C8v3RNSkCQlupqicD/AMm80eSPBq8sfO/0/pc+7wwLA/zD1Epa29ip3mYySD/JTYD6 +Sfwze9lYrkZdzrNZPYBgoObx1y8HAxXg4ELgcixXg4GK4HAhcDgRS4HAxpeGwUq4PkaTa8PgpNrg ++Ck2u54KW3c8aTbueNLbRYEUO4xMbUSpReGI9Nj7ZVLTRLYM8gh5LU9iD+ByvwJx+ks/GjL6gw/z +fqskbDSrUkzy0E/HqA3RNv5u/tl2Mz/ibIY4/UHqH5JeRLHStPl84a4oWysQZLfkK+pMu3MA9eB+ +FPFvlmm7V1RJGDH9Uuf4/Gzs9DhG+af0x5fj8bqOu61eeYdam1K52DnjBFWojiX7KD9Z98vwYI4Y +CI/BcTPmOWZkWJ/mVYk+W4pwN4bhCT/ksrL+sjMjTy9bEBi3kK2EuoPO32LVS1T2ZhxH4Vy4Y7zc +XcGvUTqFd5Tny3G2peYZ7o/ZrRfbmaD7lBzUdu5qxiP84/YPwHa9lYfVf80Ppb8uNOENg9yRQvsv +07/qC5yjvWZYq7FXYq7FXy1/zlBZG2/MCxvUFBdWETFvGSKWRT/wvHOu7BneEjul+p0faUf3gPeH +qvkC6F5+VUVDUWc7qPk0nP8AVNmP2nHh11/zoj7v2NunN6b3H8fe8z86XZuPME61qsAWJfoFT/wz +HOm7Ox8OEee7p9QbmkoOZjjrwcCFwOBivByLFcDgQuBwIXA4GNLgcCKXA4EUuBxRTYbBSth8FKu5 +40tu54KW3c8NLbueNLa0vjSpX5h1uPSrBpzQzv8ADBGe7ePyHfE7NmPHxFBflN5BvvNnmFZbgt6b +EzXNweqRV+Jt/wBp+i/0zX6/WDBjMuvT3u00+A5ZiA+kc3qn5heYra6mh8uaOBHoul0j4x/ZeRBx +691ToPE1Phmq7P05iDln9cvx9rk67OCRjh9EUgsrXptmbOThRCh57071vJWpADeNFlH/ADzkVj+A +OQwT/eBtrZ5P5a1EWmn6qlaPNHGE8a1Kmn0Nm3vZx8kLkGf/AJa6YzQpJT45m5D/AGR4L+AJzi+2 +c3HnI6R2ek7Px8OO+99O6DaC10q3iApVQxH+tuPwzVOcj8VdirsVdir58/5yxsKp5c1BR0N1byH5 ++m6fqbOk9n5/XH3fpdT2pH6T704/Ie9W88gatZcgXiCT8a71MXEn74cyO3I1mxT7xX2/ta9Cbxzj +8fx8nnOqTGbU7uU/tzSN97HOqwxqER5B089yVAHJsFwOBivBwIXA4GK4HAheDgY02DgRS4HAilwO +BFNg4EU3XFabrgRTfLFadyxWncsVp3LFaU57iKCF5pWCRxgs7HoAMUgWwSCK+83eYkWONnh5rFbw +DqeRoqD/ACnPXKMmQRBJ5Bz4Q4QIj6i+hLt7PyB5Pj0LTZEfX9RXlfXERB9MUoaEfy/ZT6WzmYA6 +vN4kh+7jyH4+35O2nIabFwR+uXP8fcwmytem2bacnVxCaJd6ZZit3dwW4HUyyIn/ABIjMYgnkG0B +Ca/5x8kPoeoWMmrQO9zbTQoIuUvxOhUbxhx1ODHgycQNdWyxTwexWSS4SGPd5SEUe7GgzcZJiMTI +8g1xjZAHV9H/AJZ6KrT2sKj4FoB/qj4B+FTnnmSZnIyPMm3qYREQAOj3QAAUGwHTIMnYq7FXYq7F +WIfmp5Ei86+ULjSgQl9ERc6dK3RbiMEKGP8AK4YqfCte2Zug1fgZRLpyPucfU4PEhXV8veQfNuse +SvMklrOrQujvbXVrLsK14yRP8yPoO+dxPFj1GPhPI7xPce95+E5YpX801d+UjN05En782wFBxS4H +AxXg4GK4HAhcDgQvBwMaXA4EU2DgRS4HAilwOKKbrgRTdcC03XFFO5YrTfLGlpTkureP+8lRP9Zg +P14CQkRJQkuu6TF9q5U/6tW/4iDkeMMxil3MR82eZVvgtlZk/VweUzUpyYdB8hkZStyMWLh3KWWe +u39nbiG3jjjUbluJLEnuammVkW2GAJte3mfzFIeK3bjwEYVT/wAKAciYxHNkIdzRi803oo4vJ1Pd +zIV+9tsolqsEOcoj4hujp5nlEqkPk7zBLT/RuAPd3QfgCTmNPtjTx/iv4Fvjocp6Jnb/AJba5LTm +yKD/ACh2/wCNVH45iz7fxDlGR+TdHsyfUhk3lv8ALr6jcrPcEyzfsOQAF/1Vq2/uc1Wu7XnmHCBw +x+9zdPoY4zZ3L3z8uNEe1DzyJx4KFWvbagHzpX781DnM7xV2KuxV2KuxV2KvDv8AnIT8pW1S3k83 +6JFXUbZK6pbIN5oUH98tOrxr9rxX3G+/7H7R4D4U/pPLydZr9LxeuPPq8U8u639YQWlw3+kKPgY/ +tgfxGdthy3seboiE/By9iuByLFeDgQuBwMVwOBC4HAim+WKKWNd2yfblRfYsMgZAdV4SpNq9gv8A +u0E+wJ/hkDlj3p8KSk2v2g+yrt9AA/XkDnDLwCoP5j/kh+kt/ZkDn8mQ0/monXr+Q0iRa/5Kkn+O +Vy1NcyAzjpgeVlaZvMM32VlAPT4eH8BmJPtLEOcx+Pc5EdDI8olr9DeYLg0eu/8APJy/UWzFn2zg +HUn4frcmPZuTuAV4vI2rS/bYKPEKx/XxzFl29AfTEn7P1uRHsyXUhGw/ltI1PWmffw4r/wA15jT7 +en/DED7f1N0ezI9SUztfyrtTTlC8v/Bkf8LwzGn2zqDyIHw/W3R7PxDpacWn5W2akUskPuypX/h+ +RzFnr88uc5fOm6OmxjlEMgsfyyn4gRWtF8FDf8aqBmNKZlzNtwiByTm1/K65NCYQPmF/42Yn8Mil +N7b8sgoHN1Udxy/gqj9eKplB+XemJTm4bxHEn/iTH9WKplb+T9GhIIQkj/VX/iIGKpxDDFBEsUSh +I12VRiq/FXYq7FXYq7FXYq7FXzV+ef5LyaTPN5s8swkae7GXUbKIb27k1MsQH+6yeoH2O3w/Z6js +rtW6x5Dv0P6HT63RV648uoecaR5lglh4XriOZB/eHZWHj8863HmBG7pzFFSeZ9HTpKXPgqt/EDJH +NFHCUO/nGyH93DI3+txX+Jys5wvApN5wlP8Ad26r/rMW/UFyB1B7l8Nya7rVx/cx9f8AfcZb9fLM +fJrBHmQGyOAnkCUQkXmif9iYV8aR/r45hZO1sI5zHw/Y3x0OQ/woiLy1r1xTnT/ZMW/4iGzCydt4 +R/OP482+PZuTyCPg8jam9Ob8fYL/AM1FcxZ9vR/hh9rfHss9ZJhb/l87EB3YnwqB+oNmLPtzKeQi +G6PZkOpKbW35boaEwu3uQ5H4lRmNPtXUH+KvgG+OhxDom9p+W61AW2Ffklfw5HMaeryy5yl826OC +A5RCeWn5Z3bAf6OadjRyP+NRlBNtoCcWv5WzinKNV96ID+tjgVNbf8tIlA9SRaeFWP6gmKplB+X+ +kx05nn/sR/xsXxVMYPKmjQ9Iy3zNP+IhcVRcej6ZH9m2Q/6w5f8AEq4qio4Yo/7tFT/VAH6sVXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq06JIjI6hkYEMpFQQeoIxV89/mZ/wA4+WUd9Jq+gloLGZuU +9kgBETHrwr0Un7s3Wn7bywjwyHF5uvy9nQkbBphlp+UtqSObSynuOX8EX+OM+3c55CI/HvWPZuMc +7Kd2f5S2C0P1Ik/5YY/8Tan4Ziz7V1Ev4vlQbo6LEOifWH5YRrQQ2aKf8lVH/EFJzFnqMkvqlI/F +ujigOQCf2v5Y3bUrbkfNWP8AxMrlLYm9r+V0gpyCx/8AAD/iIfFU0g/La1WnqyD/AIZv4piqYweR +NGjpyHIjuFUfrDYqmEPlrSIhQQlvmx/hTFUXHpmnR/YtowfEqCfvOKohUVRRQFHgBTFW8VdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVcVDAqwqDsQemKoEaFpIYt9XFT7tT7q0x +VXjsbKP+7t41PiFFf1YqrgACg2GKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV +2KuxV2KuxV//2Q== +uuid:c0ca0d88-d3d0-4de4-88fb-576c6d69015f +image/svg+xml +folder-1.aiimage/svg+xml +end='w' \ No newline at end of file diff --git a/main/img/icons/svg/tickets_urgent.svg b/main/img/icons/svg/tickets_urgent.svg new file mode 100644 index 0000000000..4ebb746fc5 --- /dev/null +++ b/main/img/icons/svg/tickets_urgent.svg @@ -0,0 +1,155 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/inc/lib/TicketManager.php b/main/inc/lib/TicketManager.php index fbc47a42a3..07bc4bc6e7 100644 --- a/main/inc/lib/TicketManager.php +++ b/main/inc/lib/TicketManager.php @@ -5,6 +5,7 @@ use Chamilo\TicketBundle\Entity\Project; use Chamilo\TicketBundle\Entity\Status; use Chamilo\TicketBundle\Entity\Priority; use Chamilo\TicketBundle\Entity\Ticket; +use \Database; /** * Class TicketManager @@ -850,6 +851,9 @@ class TicketManager ticket.message LIKE '%$keyword%' OR ticket.keyword LIKE '%$keyword%' OR ticket.source LIKE '%$keyword%' OR + cat.name LIKE '%$keyword%' OR + status.name LIKE '%$keyword%' OR + priority.name LIKE '%$keyword%' OR ticket.personal_email LIKE '%$keyword%' )"; } @@ -863,10 +867,12 @@ class TicketManager 'keyword_priority' => 'ticket.priority_id' ]; - foreach ($keywords as $keyword => $sqlLabel) { + foreach ($keywords as $keyword => $label) { if (isset($_GET[$keyword])) { $data = Database::escape_string(trim($_GET[$keyword])); - $sql .= " AND $sqlLabel = '$data' "; + if (!empty($data)) { + $sql .= " AND $label = '$data' "; + } } } @@ -932,14 +938,20 @@ class TicketManager $img_source = 'icons/32/event.png'; break; default: - $img_source = 'icons/32/course_home.png'; + $img_source = 'icons/32/ticket.png'; break; } $row['start_date'] = Display::dateToStringAgoAndLongDate($row['start_date']); $row['sys_lastedit_datetime'] = Display::dateToStringAgoAndLongDate($row['sys_lastedit_datetime']); - $icon = Display::return_icon($img_source, get_lang('Info')).''.$row['code'].''; + $icon = Display::return_icon( + $img_source, + get_lang('Info'), + ['style' => 'margin-right: 10px; float: left;'] + ); + + $icon .= ''.$row['code'].''; if ($isAdmin) { $ticket = array( @@ -2167,29 +2179,48 @@ class TicketManager } /** - * @return string + * Returns a list of menu elements for the tickets system's configuration + * @param string $exclude The element to exclude from the list + * @return array */ - public static function getSettingsMenu() + public static function getSettingsMenuItems($exclude = null) { - $items = [ - [ - 'url' => 'projects.php', - 'content' => get_lang('Projects') - ], - [ - 'url' => 'status.php', - 'content' => get_lang('Status') - ], - [ - 'url' => 'priorities.php', - 'content' => get_lang('Priority') - ] + $items = []; + $project = [ + 'icon' => 'project.png', + 'url' => 'projects.php', + 'content' => get_lang('Projects') + ]; + $status = [ + 'icon' => 'check-circle.png', + 'url' => 'status.php', + 'content' => get_lang('Status') ]; + $priority = [ + 'icon' => 'tickets_urgent.png', + 'url' => 'priorities.php', + 'content' => get_lang('Priority') + ]; + switch ($exclude) { + case 'project': + $items = [$status, $priority]; + break; + case 'status': + $items = [$project, $priority]; + break; + case 'priority': + $items = [$project, $status]; + break; + default: + $items = [$project, $status, $priority]; + break; + } - echo Display::actions($items); + return $items; } /** + * Returns a list of strings representing the default statuses * @return array */ public static function getDefaultStatusList() diff --git a/main/inc/lib/skill.lib.php b/main/inc/lib/skill.lib.php index b63e15e19d..960d967c35 100755 --- a/main/inc/lib/skill.lib.php +++ b/main/inc/lib/skill.lib.php @@ -1339,7 +1339,7 @@ class Skill extends Model - + @@ -1391,7 +1391,7 @@ class Skill extends Model $transparency = ''; if ($passed === false) { // @todo use a css class - $transparency = 'opacity: 0.4; filter: alpha(opacity=40);'; + $transparency = 'filter: alpha(opacity=40);'; } $label = $this->processSkillListSimple([$data], 'mini', $transparency); diff --git a/main/inc/lib/template.lib.php b/main/inc/lib/template.lib.php index 3c4b5e45b3..04e442c810 100755 --- a/main/inc/lib/template.lib.php +++ b/main/inc/lib/template.lib.php @@ -1004,7 +1004,7 @@ class Template if (api_get_setting('show_link_ticket_notification') == 'true' && $this->user_is_logged_in) { // by default is project_id = 1 $iconTicket = Display::return_icon( - 'bug.png', + 'help.png', get_lang('Ticket'), [], ICON_SIZE_LARGE @@ -1015,7 +1015,7 @@ class Template $courseParams = api_get_cidreq(); } $url = api_get_path(WEB_CODE_PATH).'ticket/tickets.php?project_id=1&'.$courseParams; - $rightFloatMenu .= '
+ $rightFloatMenu .= '
'.$iconTicket.' diff --git a/main/inc/lib/userportal.lib.php b/main/inc/lib/userportal.lib.php index 15c4770c58..b021d42684 100755 --- a/main/inc/lib/userportal.lib.php +++ b/main/inc/lib/userportal.lib.php @@ -1097,7 +1097,7 @@ class IndexManager 'icon' => Display::return_icon('order-course.png', get_lang('SortMyCourses')), 'link' => api_get_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses', 'title' => get_lang('SortMyCourses') - ];*/ + ]; // Session history if (isset($_GET['history']) && intval($_GET['history']) == 1) { @@ -1115,7 +1115,7 @@ class IndexManager 'title' => get_lang('HistoryTrainingSessions') ]; } - + */ if ($isHrm) { $items[] = [ 'link' => api_get_path(WEB_CODE_PATH).'auth/hrm_courses.php', diff --git a/main/mySpace/myStudents.php b/main/mySpace/myStudents.php index 1610aa164f..0104d090cf 100755 --- a/main/mySpace/myStudents.php +++ b/main/mySpace/myStudents.php @@ -1682,12 +1682,13 @@ if (empty($_GET['details'])) {
'; echo Tracking::displayUserSkills( $user_info['user_id'], $courseInfo ? $courseInfo['real_id'] : 0, $sessionId ); +echo '
'; if ($allowMessages === true) { // Messages diff --git a/main/survey/fillsurvey.php b/main/survey/fillsurvey.php index 75357dffa1..20257cd6f0 100755 --- a/main/survey/fillsurvey.php +++ b/main/survey/fillsurvey.php @@ -19,7 +19,6 @@ if (!isset($_GET['cidReq'])) { $_cid = $_GET['cidReq']; } -// Including the global initialization file require_once __DIR__.'/../inc/global.inc.php'; // Database table definitions @@ -33,32 +32,34 @@ $table_user = Database::get_main_table(TABLE_MAIN_USER); $allowRequiredSurveyQuestions = api_get_configuration_value('allow_required_survey_questions'); // Check if user is anonymous or not +$isAnonymous = false; if (api_is_anonymous(api_get_user_id(), true)) { $isAnonymous = true; -} else { - $isAnonymous = false; } // getting all the course information if (isset($_GET['course'])) { - $course_info = api_get_course_info($_GET['course']); + $courseInfo = api_get_course_info($_GET['course']); } else { - $course_info = api_get_course_info(); + $courseInfo = api_get_course_info(); } -if (empty($course_info)) { - api_not_allowed(); +if (empty($courseInfo)) { + api_not_allowed(true); } +$userInfo = api_get_user_info(); +$sessionId = isset($_GET['id_session']) ? (int) $_GET['id_session'] : api_get_session_id(); + // Breadcrumbs -if (!empty($_user)) { - $interbreadcrumb[] = array( - 'url' => api_get_path(WEB_CODE_PATH).'survey/survey_list.php?cidReq='.$course_info['code'], +if (!empty($userInfo)) { + $interbreadcrumb[] = [ + 'url' => api_get_path(WEB_CODE_PATH).'survey/survey_list.php?cidReq='.$courseInfo['code'].'&id_session='.$sessionId, 'name' => get_lang('SurveyList') - ); + ]; } -$course_id = $course_info['real_id']; +$course_id = $courseInfo['real_id']; $surveyCode = isset($_GET['scode']) ? Database::escape_string($_GET['scode']) : ''; if ($surveyCode != '') { @@ -159,7 +160,7 @@ $sql = "SELECT * FROM $table_survey WHERE c_id = $course_id AND code = '".Database::escape_string($survey_invitation['survey_code'])."'"; -$sql .= api_get_session_condition(api_get_session_id()); +$sql .= api_get_session_condition($sessionId); $result = Database::query($sql); if (Database::num_rows($result) > 1) { @@ -192,6 +193,9 @@ if (Database::num_rows($result) > 1) { // Getting the survey information $survey_data = SurveyManager::get_survey($survey_invitation['survey_id']); +if (empty($survey_data)) { + api_not_allowed(true); +} $survey_data['survey_id'] = $survey_invitation['survey_id']; // Storing the answers @@ -353,7 +357,7 @@ if (count($_POST) > 0) { } } else { // In case it's another type than 0 or 1 - die(get_lang('ErrorSurveyTypeUnknown')); + api_not_allowed(true, get_lang('ErrorSurveyTypeUnknown')); } } @@ -379,14 +383,11 @@ if ($survey_data['form_fields'] != '' && } } - // We use the same form as in auth/profile.php - $form = new FormValidator( - 'profile', - 'post', - api_get_self()."?".api_get_cidreq().'&' - .str_replace('&show_form=1', '&show_form=1', Security::remove_XSS($_SERVER['QUERY_STRING'])) - ); + $url = api_get_self().'?cidReq='.$courseInfo['code'].'&id_session='.$sessionId.'&'. + str_replace('&show_form=1', '&show_form=1', Security::remove_XSS($_SERVER['QUERY_STRING'])); + // We use the same form as in auth/profile.php + $form = new FormValidator('profile', 'post', $url); if (api_is_western_name_order()) { if (isset($list['firstname']) && $list['firstname'] == 1) { //FIRST NAME @@ -605,10 +606,10 @@ if (isset($_POST['finish_survey'])) { $survey_invitation['c_id'] ); - if ($course_info) { + if ($courseInfo) { echo Display::toolbarButton( get_lang('ReturnToCourseHomepage'), - api_get_course_url($course_info['code']), + api_get_course_url($courseInfo['code']), 'home' ); } @@ -807,10 +808,7 @@ if (isset($_GET['show']) || isset($_POST['personality'])) { $list['group'] = $row['survey_group_pri']; $totals[] = $list; } - //echo '
'; print_r($totals);
-
-            $final_results = array();
-
+            $final_results = [];
             // Get a percentage score for each group
             for ($i = 0; $i < count($totals); $i++) {
                 for ($j = 0; $j < count($results); $j++) {
@@ -974,7 +972,6 @@ if (isset($_GET['show']) || isset($_POST['personality'])) {
                         $paged_questions_sec = Session::read('page_questions_sec');
                     }
                     $paged_questions = Session::read('paged_questions'); // For the sake of pages counting
-                    //$paged_questions = $paged_questions_sec; // For the sake of pages counting coming up at display time...
                     if ($shuffle == '') {
                         $shuffle = ' BY survey_question.sort, survey_question_option.sort ASC ';
                     }
@@ -1153,7 +1150,6 @@ if (isset($_GET['show']) || isset($_POST['personality'])) {
                     }
                     $counter++;
                 }
-                var_Dump($questions);
             }
         }
     } else { // In case it's another type than 0 or 1
@@ -1192,7 +1188,8 @@ $p_l = isset($_POST['language']) ? Security::remove_XSS($_POST['language']) : ''
 
 $add_parameters = isset($_GET['user_id']) ? 'user_id='.intval($_GET['user_id']).'&' : '';
 
-$url = api_get_self().'?'.api_get_cidreq().'&'.$add_parameters.'course='.$g_c.'&invitationcode='.$g_ic.'&show='.$show;
+$url = api_get_self().'?cidReq='.$courseInfo['code'].'&id_session='.$sessionId.
+       '&'.$add_parameters.'course='.$g_c.'&invitationcode='.$g_ic.'&show='.$show;
 $form = new FormValidator(
     'question',
     'post',
@@ -1209,7 +1206,6 @@ if (isset($questions) && is_array($questions)) {
         $display = new $ch_type;
         // @todo move this in a function.
         $form->addHtml('
'); - //$form->addHtml('
'); $form->addHtml('
'.$question['sort'].'. '.strip_tags($question['survey_question']).'
'); //$form->addHtml($question['survey_question']); @@ -1220,8 +1216,7 @@ if (isset($questions) && is_array($questions)) { $userAnswer = $userAnswerData[$user_id]; switch ($question['type']) { case 'score': - $finalAnswer = array(); - + $finalAnswer = []; foreach ($userAnswer as $userChoice) { list($choiceId, $choiceValue) = explode('*', $userChoice); @@ -1238,7 +1233,6 @@ if (isset($questions) && is_array($questions)) { break; } } - $display->render($form, $question, $finalAnswer); $form->addHtml('
'); } @@ -1305,7 +1299,8 @@ if ($survey_data['survey_type'] === '0') { } } } -} elseif ($survey_data['survey_type'] === '1') { //conditional/personality-test type survey +} elseif ($survey_data['survey_type'] === '1') { + //conditional/personality-test type survey if (isset($_GET['show']) || isset($_POST['personality'])) { $numberofpages = count($paged_questions); if (!empty($paged_questions_sec) && count($paged_questions_sec) > 0) { @@ -1361,33 +1356,20 @@ if ($survey_data['survey_type'] === '0') { } $form->addHtml('
'); $form->display(); - -// Footer Display::display_footer(); /** * Check whether this survey has ended. If so, display message and exit rhis script + * @param array $surveyData Survey data */ -function check_time_availability($surv_data) +function check_time_availability($surveyData) { - $start_date = mktime( - 0, - 0, - 0, - substr($surv_data['start_date'], 5, 2), - substr($surv_data['start_date'], 8, 2), - substr($surv_data['start_date'], 0, 4) - ); - $end_date = mktime( - 0, - 0, - 0, - substr($surv_data['end_date'], 5, 2), - substr($surv_data['end_date'], 8, 2), - substr($surv_data['end_date'], 0, 4) - ); - $cur_date = time(); - if ($cur_date < $start_date) { + $userTimeZone = new DateTimeZone(api_get_timezone()); + $startDate = new DateTime($surveyData['start_date'], $userTimeZone); + $endDate = new DateTime($surveyData['end_date'], $userTimeZone); + $currentDate = new DateTime('now', $userTimeZone); + $currentDate->modify('today'); + if ($currentDate < $startDate) { api_not_allowed( true, Display:: return_message( @@ -1398,7 +1380,7 @@ function check_time_availability($surv_data) ); } - if ($cur_date > $end_date) { + if ($currentDate > $endDate) { api_not_allowed( true, Display:: return_message( diff --git a/main/survey/surveyUtil.class.php b/main/survey/surveyUtil.class.php index e10240c31c..1f4c2f2efd 100755 --- a/main/survey/surveyUtil.class.php +++ b/main/survey/surveyUtil.class.php @@ -2173,11 +2173,8 @@ class SurveyUtil * @param int $reminder * @param bool $sendmail * @param int $remindUnAnswered - * @return int - * @internal param - * @internal param - * @internal param - * The text has to contain a **link** string or this will automatically be added to the end + * @return bool $isAdditionalEmail + * * @author Patrick Cool , Ghent University * @author Julio Montoya - Adding auto-generated link support * @version January 2007 @@ -2188,7 +2185,8 @@ class SurveyUtil $invitation_text, $reminder = 0, $sendmail = false, - $remindUnAnswered = 0 + $remindUnAnswered = 0, + $isAdditionalEmail = false ) { if (!is_array($users_array)) { // Should not happen @@ -2211,36 +2209,37 @@ class SurveyUtil $counter = 0; // Nr of invitations "sent" (if sendmail option) $course_id = api_get_course_int_id(); $session_id = api_get_session_id(); - $result = CourseManager::separateUsersGroups($users_array); - - $groupList = $result['groups']; - $users_array = $result['users']; - - foreach ($groupList as $groupId) { - $userGroupList = GroupManager::getStudents($groupId); - $userGroupIdList = array_column($userGroupList, 'user_id'); - $users_array = array_merge($users_array, $userGroupIdList); - - $params = array( - 'c_id' => $course_id, - 'session_id' => $session_id, - 'group_id' => $groupId, - 'survey_code' => $survey_data['code'] - ); - $invitationExists = self::invitationExists( - $course_id, - $session_id, - $groupId, - $survey_data['code'] - ); - if (empty($invitationExists)) { - self::save_invitation($params); + if ($isAdditionalEmail == false) { + $result = CourseManager::separateUsersGroups($users_array); + $groupList = $result['groups']; + $users_array = $result['users']; + + foreach ($groupList as $groupId) { + $userGroupList = GroupManager::getStudents($groupId); + $userGroupIdList = array_column($userGroupList, 'user_id'); + $users_array = array_merge($users_array, $userGroupIdList); + + $params = [ + 'c_id' => $course_id, + 'session_id' => $session_id, + 'group_id' => $groupId, + 'survey_code' => $survey_data['code'] + ]; + + $invitationExists = self::invitationExists( + $course_id, + $session_id, + $groupId, + $survey_data['code'] + ); + if (empty($invitationExists)) { + self::save_invitation($params); + } } } $users_array = array_unique($users_array); - foreach ($users_array as $key => $value) { if (!isset($value) || $value == '') { continue; @@ -3253,7 +3252,8 @@ class SurveyUtil ICON_SIZE_TINY ); echo ''.$row['title'] + .'&invitationcode='.$row['invitation_code'].'&cidReq='.$_course['sysCode'].'&id_session='.$row['session_id'].'"> + '.$row['title'] .''; } else { $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh( @@ -3291,7 +3291,6 @@ class SurveyUtil ); echo '
'; } - echo ''; } echo ''; diff --git a/main/survey/survey_invite.php b/main/survey/survey_invite.php index c147016c16..5e28ba711d 100755 --- a/main/survey/survey_invite.php +++ b/main/survey/survey_invite.php @@ -163,7 +163,7 @@ if (api_is_multiple_url_enabled()) { } // Show the URL that can be used by users to fill a survey without invitation -$auto_survey_link = $portal_url.'main/survey/fillsurvey.php?course='.$_course['sysCode'].'&invitationcode=auto&scode='.$survey_data['survey_code']; +$auto_survey_link = $portal_url.'main/survey/fillsurvey.php?course='.$_course['sysCode'].'&invitationcode=auto&scode='.$survey_data['survey_code'].'&id_session='.$survey_data['session_id']; $form->addElement('label', null, get_lang('AutoInviteLink')); $form->addElement('label', null, $auto_survey_link); @@ -174,6 +174,7 @@ if ($form->validate()) { $resendAll = isset($values['resend_to_all']) ? $values['resend_to_all'] : ''; $sendMail = isset($values['send_mail']) ? $values['send_mail'] : ''; $remindUnAnswered = isset($values['remindUnAnswered']) ? $values['remindUnAnswered'] : ''; + $users = isset($values['users']) ? $values['users'] : []; if ($sendMail) { if (empty($values['mail_title']) || empty($values['mail_text'])) { @@ -194,6 +195,7 @@ if ($form->validate()) { return; } } + // Save the invitation mail SurveyUtil::save_invite_mail( $values['mail_text'], @@ -203,7 +205,7 @@ if ($form->validate()) { // Saving the invitations for the course users $count_course_users = SurveyUtil::saveInvitations( - $values['users'], + $users, $values['mail_title'], $values['mail_text'], $resendAll, @@ -225,7 +227,8 @@ if ($form->validate()) { $values['mail_text'], $resendAll, $sendMail, - $remindUnAnswered + $remindUnAnswered, + true ); // Updating the invited field in the survey table diff --git a/main/template/rainbow/skill/issued.tpl b/main/template/rainbow/skill/issued.tpl old mode 100644 new mode 100755 index 2e7ae6d93c..f9102f8887 --- a/main/template/rainbow/skill/issued.tpl +++ b/main/template/rainbow/skill/issued.tpl @@ -20,56 +20,16 @@ {% endif %} - {% if allow_download_export %} - {% if badge_error %} -
-
{{ 'BakedBadgeProblem'|get_lang }}
- {% else %} -

- - {{ 'DownloadBadge'|get_lang }} - -

- {% endif %} -
-

- - {{ 'ExportBadge'|get_lang }} - -

-
-
{{ 'ShareWithYourFriends' | get_lang }}
- - - - - - -
- {% endif %}
-

{{ 'RecipientDetails'|get_lang }}

-

{{ issue_info.user_complete_name }}

-

{{ 'SkillAcquiredAt'|get_lang }}

+

{{ issue_info.user_complete_name }}

@@ -130,13 +90,22 @@
{% else %} -
-

+

{{ 'XComments'|get_lang|format(issue_info.comments|length) }} - / - - {{ 'AverageRatingX'|get_lang|format(issue_info.feedback_average) }} +

{% endif %} diff --git a/main/template/rainbow/skill/student_report.tpl b/main/template/rainbow/skill/student_report.tpl index 95d628f7b5..8d92efd817 100644 --- a/main/template/rainbow/skill/student_report.tpl +++ b/main/template/rainbow/skill/student_report.tpl @@ -1,3 +1,4 @@ + - +

{{ 'MyBadges' | get_lang }}

+

+{{ 'MySkillsReportIntroduction' | get_lang }} +

{% if rows %} -

{{ 'SkillsAcquired' | get_lang }}

+
+ {% if skill_table %} + {{ skill_table }} + {% endif %} +
+
{{ 'SkillsHistory' | get_lang }}
'.get_lang('AchievedSkills').''.get_lang('AchievedSkills').'
'.($efvMandatory['value'] ? get_lang('Yes') : get_lang('No')).'
@@ -40,7 +49,4 @@ {% endfor %}
- {% if skill_table %} - {{ skill_table }} - {% endif %} {% endif %} diff --git a/main/ticket/priorities.php b/main/ticket/priorities.php index 767b7184f6..5d74c59aea 100644 --- a/main/ticket/priorities.php +++ b/main/ticket/priorities.php @@ -150,13 +150,24 @@ $table->set_column_filter('3', 'modify_filter'); Display::display_header($toolName); $items = [ - [ - 'url' => 'priorities.php?action=add', - 'content' => Display::return_icon('new_folder.png', null, null, ICON_SIZE_MEDIUM) - ] + 'icon' => 'new_folder.png', + 'url' => 'priorities.php?action=add', + 'content' => get_lang('AddPriority') ]; - -echo Display::actions($items); +echo '
'; +echo Display::url( + Display::return_icon('back.png', get_lang('Tickets'), [], ICON_SIZE_MEDIUM), + api_get_path(WEB_CODE_PATH).'ticket/tickets.php' +); +$sections = TicketManager::getSettingsMenuItems('priority'); +array_unshift($sections, $items); +foreach ($sections as $item) { + echo Display::url( + Display::return_icon($item['icon'], $item['content'], [], ICON_SIZE_MEDIUM), + $item['url'] + ); +} +echo '
'; echo $formToString; echo $table->return_table(); diff --git a/main/ticket/projects.php b/main/ticket/projects.php index f19bb5e60c..2969b66d78 100644 --- a/main/ticket/projects.php +++ b/main/ticket/projects.php @@ -161,13 +161,26 @@ $table->set_column_filter('3', 'modify_filter'); Display::display_header(''); $items = [ - [ - 'url' => 'projects.php?action=add', - 'content' => Display::return_icon('new_folder.png', null, null, ICON_SIZE_MEDIUM) - ] + 'icon' => 'new_folder.png', + 'url' => 'projects.php?action=add', + 'content' => get_lang('AddProject') ]; -echo Display::actions($items); +echo '
'; +echo Display::url( + Display::return_icon('back.png', get_lang('Tickets'), [], ICON_SIZE_MEDIUM), + api_get_path(WEB_CODE_PATH).'ticket/tickets.php' +); +$sections = TicketManager::getSettingsMenuItems('project'); +array_unshift($sections, $items); +foreach ($sections as $item) { + echo Display::url( + Display::return_icon($item['icon'], $item['content'], [], ICON_SIZE_MEDIUM), + $item['url'] + ); +} +echo '
'; + echo $formToString; echo $table->return_table(); diff --git a/main/ticket/settings.php b/main/ticket/settings.php index b3c5efde70..defe223e2c 100644 --- a/main/ticket/settings.php +++ b/main/ticket/settings.php @@ -21,8 +21,15 @@ echo Display::url( Display::return_icon('back.png', get_lang('Tickets'), [], ICON_SIZE_MEDIUM), api_get_path(WEB_CODE_PATH).'ticket/tickets.php' ); +$sections = TicketManager::getSettingsMenuItems(); +foreach ($sections as $item) { + echo Display::url( + Display::return_icon($item['icon'], $item['content'], [], ICON_SIZE_MEDIUM), + $item['url'] + ); +} echo ''; -echo TicketManager::getSettingsMenu(); + Display::display_footer(); diff --git a/main/ticket/status.php b/main/ticket/status.php index b711ca50d7..36ba50def4 100644 --- a/main/ticket/status.php +++ b/main/ticket/status.php @@ -151,13 +151,24 @@ $table->set_column_filter('3', 'modify_filter'); Display::display_header($toolName); $items = [ - [ - 'url' => 'status.php?action=add', - 'content' => Display::return_icon('new_folder.png', null, null, ICON_SIZE_MEDIUM) - ] + 'icon' => 'new_folder.png', + 'url' => 'status.php?action=add', + 'content' => get_lang('AddStatus') ]; - -echo Display::actions($items); +echo '
'; +echo Display::url( + Display::return_icon('back.png', get_lang('Tickets'), [], ICON_SIZE_MEDIUM), + api_get_path(WEB_CODE_PATH).'ticket/tickets.php' +); +$sections = TicketManager::getSettingsMenuItems('status'); +array_unshift($sections, $items); +foreach ($sections as $item) { + echo Display::url( + Display::return_icon($item['icon'], $item['content'], [], ICON_SIZE_MEDIUM), + $item['url'] + ); +} +echo '
'; echo $formToString; echo $table->return_table(); diff --git a/main/ticket/tickets.php b/main/ticket/tickets.php index 3545b7146e..1a722c34af 100644 --- a/main/ticket/tickets.php +++ b/main/ticket/tickets.php @@ -236,7 +236,7 @@ if (!empty($projectId)) { null, ICON_SIZE_MEDIUM ), - api_get_path(WEB_CODE_PATH) . 'ticket/new_ticket.php?project_id=' . $projectId, + api_get_path(WEB_CODE_PATH) . 'ticket/new_ticket.php?project_id=' . $projectId.'&'.api_get_cidReq(), ['title' => get_lang('Add')] ); } @@ -256,7 +256,7 @@ if (!empty($projectId)) { $actionRight .= Display::url( Display::return_icon( 'settings.png', - get_lang('Categories'), + get_lang('Settings'), null, ICON_SIZE_MEDIUM ), @@ -283,21 +283,32 @@ if (!empty($projectId)) { } $options = ''; + $iconProject = Display::return_icon( + 'project.png', + get_lang('Projects'), + null, + ICON_SIZE_MEDIUM + ) ; if ($isAdmin) { $options .= Display::url( - get_lang('Projects'), + $iconProject, api_get_path(WEB_CODE_PATH).'ticket/projects.php' ); } - - $options .= Display::url( + $iconTicket = Display::return_icon( + 'tickets.png', $ticketLabel, + null, + ICON_SIZE_MEDIUM + ) ; + $options .= Display::url( + $iconTicket, $url ); if ($isAllow) { echo Display::toolbarAction( - 'options', + 'toolbar-options', array( $options ) diff --git a/plugin/bbb/lib/bbb.lib.php b/plugin/bbb/lib/bbb.lib.php index b198ea331a..97050cb0c7 100755 --- a/plugin/bbb/lib/bbb.lib.php +++ b/plugin/bbb/lib/bbb.lib.php @@ -349,7 +349,6 @@ class bbb // This setting currently limits the maximum conference duration, // to avoid lingering sessions on the video-conference server #6261 $duration = 300; - $bbbParams = array( 'meetingId' => $params['remote_id'], // REQUIRED 'meetingName' => $meetingName, // REQUIRED @@ -389,8 +388,9 @@ class bbb } } - return $this->logoutUrl; + return false; } + return false; } /** @@ -479,8 +479,12 @@ class bbb * @assert ('') === false * @assert ('abcdefghijklmnopqrstuvwxyzabcdefghijklmno') === false */ - public function joinMeeting($meetingName, $loop = false) + public function joinMeeting($meetingName) { + if ($this->debug) { + error_log("joinMeeting: $meetingName"); + } + if (empty($meetingName)) { return false; } @@ -521,51 +525,47 @@ class bbb // -- REQUIRED - The moderator password for the meeting ); - $status = false; $meetingInfoExists = false; - while ($status === false) { - $meetingIsRunningInfo = $this->getMeetingInfo($params); - if ($meetingIsRunningInfo === false) { - //checking with the remote_id didn't work, so just in case and - // to provide backwards support, check with the id - $params = array( - 'meetingId' => $meetingData['id'], - // -- REQUIRED - The unique id for the meeting - 'password' => $this->getModMeetingPassword() - // -- REQUIRED - The moderator password for the meeting - ); - $meetingIsRunningInfo = $this->getMeetingInfo($params); - } + $meetingIsRunningInfo = $this->getMeetingInfo($params); + if ($this->debug) { + error_log('Searching meeting with params:'); + error_log(print_r($params, 1)); + error_log('Result:'); + error_log(print_r($meetingIsRunningInfo, 1)); + } + if ($meetingIsRunningInfo === false) { + // checking with the remote_id didn't work, so just in case and + // to provide backwards support, check with the id + $params = array( + 'meetingId' => $meetingData['id'], + // -- REQUIRED - The unique id for the meeting + 'password' => $this->getModMeetingPassword() + // -- REQUIRED - The moderator password for the meeting + ); + $meetingIsRunningInfo = $this->getMeetingInfo($params); if ($this->debug) { + error_log('Searching meetingId with params:'); + error_log(print_r($params, 1)); + error_log('Result:'); error_log(print_r($meetingIsRunningInfo, 1)); } + } - if (strval($meetingIsRunningInfo['returncode']) == 'SUCCESS' && - isset($meetingIsRunningInfo['meetingName']) && - !empty($meetingIsRunningInfo['meetingName']) - //strval($meetingIsRunningInfo['running']) == 'true' - ) { - $meetingInfoExists = true; - } - - if ($this->debug) { - error_log( - "meeting is running: ".intval($meetingInfoExists) - ); - } - - if ($meetingInfoExists) { - $status = true; - } + if (strval($meetingIsRunningInfo['returncode']) == 'SUCCESS' && + isset($meetingIsRunningInfo['meetingName']) && + !empty($meetingIsRunningInfo['meetingName']) + ) { + $meetingInfoExists = true; + } - if ($loop) { - continue; - } else { - break; - } + if ($this->debug) { + error_log( + "meeting is running: ".intval($meetingInfoExists) + ); } + $url = false; if ($meetingInfoExists) { $joinParams = array( 'meetingId' => $meetingData['remote_id'], // -- REQUIRED - A unique id for the meeting @@ -577,8 +577,6 @@ class bbb ); $url = $this->api->getJoinMeetingURL($joinParams); $url = $this->protocol.$url; - } else { - $url = $this->logoutUrl; } if ($this->debug) { error_log("return url :".$url); @@ -858,7 +856,10 @@ class bbb 'userID' => '', // -- OPTIONAL - string 'webVoiceConf' => '' // -- OPTIONAL - string ); - $item['go_url'] = $this->protocol.$this->api->getJoinMeetingURL($joinParams); + $item['go_url'] = ''; + if (!empty($pass)) { + $item['go_url'] = $this->protocol.$this->api->getJoinMeetingURL($joinParams); + } } $item = array_merge($item, $meetingDB, $meetingBBB); diff --git a/plugin/bbb/start.php b/plugin/bbb/start.php index d0474d7f83..a89c1e8141 100755 --- a/plugin/bbb/start.php +++ b/plugin/bbb/start.php @@ -56,15 +56,19 @@ if ($bbb->pluginEnabled) { $meetingParams = array(); $meetingParams['meeting_name'] = $bbb->getCurrentVideoConferenceName(); - if ($bbb->meetingExists($meetingParams['meeting_name'])) { - $url = $bbb->joinMeeting($meetingParams['meeting_name']) ?: $bbb->createMeeting($meetingParams); + $joinUrl = $bbb->joinMeeting($meetingParams['meeting_name']); + if ($joinUrl) { + $url = $joinUrl; + } else { + $url = $bbb->createMeeting($meetingParams); + } } else { $url = $bbb->isConferenceManager() ? $bbb->createMeeting($meetingParams) : $bbb->getListingUrl(); } $meetingInfo = $bbb->findMeetingByName($meetingParams['meeting_name']); - if (!empty($meetingInfo)) { + if (!empty($meetingInfo) && $url) { $bbb->saveParticipant($meetingInfo['id'], api_get_user_id()); $bbb->redirectToBBB($url); } else { diff --git a/src/Chamilo/CoreBundle/Entity/Repository/SequenceRepository.php b/src/Chamilo/CoreBundle/Entity/Repository/SequenceRepository.php index abaea94637..f85540e50e 100644 --- a/src/Chamilo/CoreBundle/Entity/Repository/SequenceRepository.php +++ b/src/Chamilo/CoreBundle/Entity/Repository/SequenceRepository.php @@ -39,7 +39,7 @@ class SequenceRepository extends EntityRepository public function getRequirementAndDependencies($resourceId, $type) { $sequence = $this->findRequirementForResource($resourceId, $type); - $result = ['requirements' => '', 'dependencies' => '']; + $result = ['requirements' => '', 'dependencies' => []]; if ($sequence && $sequence->hasGraph()) { $graph = $sequence->getSequence()->getUnSerializeGraph(); $vertex = $graph->getVertex($resourceId); diff --git a/user_portal.php b/user_portal.php index f50c8aad9d..cc7f9b43cd 100755 --- a/user_portal.php +++ b/user_portal.php @@ -338,6 +338,7 @@ $controller->tpl->assign('user_image_block', $controller->return_user_image_bloc $controller->tpl->assign('course_block', $controller->return_course_block()); $controller->tpl->assign('navigation_course_links', $controller->return_navigation_links()); $controller->tpl->assign('search_block', $controller->return_search_block()); +$controller->tpl->assign('notice_block', $controller->return_notice()); $controller->tpl->assign('classes_block', $controller->return_classes_block()); $controller->tpl->assign('skills_block', $controller->returnSkillLinks());