mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-26 21:54:13 +01:00
Compare commits
101 Commits
feature/77
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94a36c0066 | ||
|
|
62e09f1224 | ||
|
|
57a0b5691f | ||
|
|
f82389d156 | ||
|
|
9e21976424 | ||
|
|
f558093f5d | ||
|
|
5201a1ed3b | ||
|
|
dad39c3ebe | ||
|
|
29920bfeb7 | ||
|
|
2313ee2bbd | ||
|
|
22b0c431a0 | ||
|
|
499b3bca88 | ||
|
|
aede5ea7b8 | ||
|
|
da6c443a35 | ||
|
|
9c39efd9af | ||
|
|
d5f2303ed2 | ||
|
|
48e584503e | ||
|
|
454a1b26eb | ||
|
|
4853ca444e | ||
|
|
330539abd2 | ||
|
|
5357a0c060 | ||
|
|
fc22cce037 | ||
|
|
34c8a57814 | ||
|
|
b91e6c384a | ||
|
|
2247691e58 | ||
|
|
f014b43761 | ||
|
|
076d49abc2 | ||
|
|
9fd0ffd84e | ||
|
|
0f11fd9919 | ||
|
|
2b828f8a22 | ||
|
|
d2f67dcb3c | ||
|
|
d5706fcbef | ||
|
|
807f2a88bc | ||
|
|
9d3311e623 | ||
|
|
9bf2cb7e1d | ||
|
|
0134ead5dd | ||
|
|
54909520e9 | ||
|
|
d124f8ee58 | ||
|
|
3fdbcbc0fb | ||
|
|
a5296e11e1 | ||
|
|
3b62597092 | ||
|
|
b085147f23 | ||
|
|
38fccf85e3 | ||
|
|
c0a2771d4e | ||
|
|
6bd5a7b634 | ||
|
|
82b7ef86c7 | ||
|
|
f8cf14cbad | ||
|
|
a5dededfb4 | ||
|
|
4f878536a8 | ||
|
|
d937ec0350 | ||
|
|
1cdcaac3d0 | ||
|
|
985db46960 | ||
|
|
01adaadfad | ||
|
|
3f807a64bb | ||
|
|
1d4a155e8f | ||
|
|
643752f8e7 | ||
|
|
0e0c09c420 | ||
|
|
2b6fa8b381 | ||
|
|
7d2dc5e36a | ||
|
|
f87df8f28b | ||
|
|
cc9e64616f | ||
|
|
f34373be6d | ||
|
|
a39234f438 | ||
|
|
ac8937105d | ||
|
|
fb6f892244 | ||
|
|
0a04c83c7b | ||
|
|
cc8252bebf | ||
|
|
3e879c64a7 | ||
|
|
5c6369b9b8 | ||
|
|
154fb5c737 | ||
|
|
efb1bd765b | ||
|
|
b39af74d07 | ||
|
|
904cd0b518 | ||
|
|
4c1ad0f4f2 | ||
|
|
3955b4eb22 | ||
|
|
3d46fe6ef1 | ||
|
|
4dba47798c | ||
|
|
9480c4053d | ||
|
|
9ea197148c | ||
|
|
49a7f3118d | ||
|
|
bf80b5dca2 | ||
|
|
09afcb229c | ||
|
|
92f843f676 | ||
|
|
3df4ddc696 | ||
|
|
d552727c55 | ||
|
|
1fe401c102 | ||
|
|
a4b0b6e855 | ||
|
|
545028d68a | ||
|
|
6cb08ba361 | ||
|
|
b3cd79605d | ||
|
|
f9db405343 | ||
|
|
4f1f144c51 | ||
|
|
ef8ade5d20 | ||
|
|
cef4a52081 | ||
|
|
dc9fb2d693 | ||
|
|
e9ffbe5b09 | ||
|
|
9c792a601f | ||
|
|
cda6c1dfa8 | ||
|
|
0b242d872a | ||
|
|
c144c80663 | ||
|
|
d9261b8342 |
14
.github/workflows/action.yml
vendored
14
.github/workflows/action.yml
vendored
@@ -26,13 +26,23 @@ jobs:
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Add internal tag if member
|
- name: Add internal tag if member of the organization
|
||||||
if: env.is_member == 'true'
|
if: env.is_member == 'true'
|
||||||
run: |
|
run: |
|
||||||
curl -X POST -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
curl -X POST -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
||||||
-H "Accept: application/vnd.github.v3+json" \
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/labels \
|
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/labels \
|
||||||
-d '{"labels":["internal"]}'
|
-d '{"labels":["internal"]}'
|
||||||
|
|
||||||
|
- name: Set PR author as assignee if member of the organization
|
||||||
|
if: env.is_member == 'true'
|
||||||
|
run: |
|
||||||
|
curl -L \
|
||||||
|
-X POST \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
-H "Authorization: Bearer ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
||||||
|
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/assignees \
|
||||||
|
-d '{"assignees":["${{ github.event.pull_request.user.login }}"]}'
|
||||||
env:
|
env:
|
||||||
is_member: ${{ env.is_member }}
|
is_member: ${{ env.is_member }}
|
||||||
|
|
||||||
@@ -40,4 +50,4 @@ jobs:
|
|||||||
uses: actions/add-to-project@v1.0.2
|
uses: actions/add-to-project@v1.0.2
|
||||||
with:
|
with:
|
||||||
project-url: ${{ env.project_url }}
|
project-url: ${{ env.project_url }}
|
||||||
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}
|
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -58,6 +58,9 @@ tests/*/vendor/*
|
|||||||
/tests/php-unit-tests/phpunit.xml
|
/tests/php-unit-tests/phpunit.xml
|
||||||
/tests/php-unit-tests/postbuild_integration.xml
|
/tests/php-unit-tests/postbuild_integration.xml
|
||||||
|
|
||||||
|
# PHP CS Fixer: Cache file
|
||||||
|
/.php-cs-fixer.cache
|
||||||
|
|
||||||
|
|
||||||
# Jetbrains
|
# Jetbrains
|
||||||
/.idea/**
|
/.idea/**
|
||||||
|
|||||||
16
.phpstorm.meta.php
Normal file
16
.phpstorm.meta.php
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @copyright Copyright (C) 2010-2025 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace PHPSTORM_META
|
||||||
|
{
|
||||||
|
override(\MetaModel::NewObject(0), map([
|
||||||
|
'' => '@',
|
||||||
|
]));
|
||||||
|
override(\MetaModel::GetObject(0), map([
|
||||||
|
'' => '@',
|
||||||
|
]));
|
||||||
|
}
|
||||||
@@ -5632,7 +5632,7 @@ JS
|
|||||||
* @return void
|
* @return void
|
||||||
* @since 3.1.0
|
* @since 3.1.0
|
||||||
*/
|
*/
|
||||||
final public function AddAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', string $sReason = null): void
|
final public function AddAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', ?string $sReason = null): void
|
||||||
{
|
{
|
||||||
if (!isset($this->aAttributesFlags[$sTargetState])) {
|
if (!isset($this->aAttributesFlags[$sTargetState])) {
|
||||||
$this->aAttributesFlags[$sTargetState] = [];
|
$this->aAttributesFlags[$sTargetState] = [];
|
||||||
@@ -5655,7 +5655,7 @@ JS
|
|||||||
* @return void
|
* @return void
|
||||||
* @since 3.1.0
|
* @since 3.1.0
|
||||||
*/
|
*/
|
||||||
final public function ForceAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', string $sReason = null): void
|
final public function ForceAttributeFlags(string $sAttCode, int $iFlags, string $sTargetState = '', ?string $sReason = null): void
|
||||||
{
|
{
|
||||||
if (!isset($this->aAttributesFlags[$sTargetState])) {
|
if (!isset($this->aAttributesFlags[$sTargetState])) {
|
||||||
$this->aAttributesFlags[$sTargetState] = [];
|
$this->aAttributesFlags[$sTargetState] = [];
|
||||||
@@ -5696,7 +5696,7 @@ JS
|
|||||||
* @return void
|
* @return void
|
||||||
* @since 3.1.0
|
* @since 3.1.0
|
||||||
*/
|
*/
|
||||||
final public function AddInitialAttributeFlags(string $sAttCode, int $iFlags, string $sReason = null)
|
final public function AddInitialAttributeFlags(string $sAttCode, int $iFlags, ?string $sReason = null)
|
||||||
{
|
{
|
||||||
if (!isset($this->aInitialAttributesFlags)) {
|
if (!isset($this->aInitialAttributesFlags)) {
|
||||||
$this->aInitialAttributesFlags = [];
|
$this->aInitialAttributesFlags = [];
|
||||||
@@ -5718,7 +5718,7 @@ JS
|
|||||||
* @return void
|
* @return void
|
||||||
* @since 3.1.0
|
* @since 3.1.0
|
||||||
*/
|
*/
|
||||||
final public function ForceInitialAttributeFlags(string $sAttCode, int $iFlags, string $sReason = null)
|
final public function ForceInitialAttributeFlags(string $sAttCode, int $iFlags, ?string $sReason = null)
|
||||||
{
|
{
|
||||||
if (!isset($this->aInitialAttributesFlags)) {
|
if (!isset($this->aInitialAttributesFlags)) {
|
||||||
$this->aInitialAttributesFlags = [];
|
$this->aInitialAttributesFlags = [];
|
||||||
|
|||||||
@@ -1029,7 +1029,7 @@ EOF
|
|||||||
var dashboard = $('.ibo-dashboard#$sDivId')
|
var dashboard = $('.ibo-dashboard#$sDivId')
|
||||||
dashboard.block();
|
dashboard.block();
|
||||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
|
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
|
||||||
{ operation: 'toggle_dashboard', dashboard_id: '$sId', file: '$sFile', extra_params: $sExtraParams, reload_url: '$sReloadURL' },
|
{ operation: 'toggle_dashboard', dashboard_id: '$sId', file: '$sFile', extra_params: $sExtraParams, reload_url: $sReloadURL },
|
||||||
function(data) {
|
function(data) {
|
||||||
dashboard.html(data);
|
dashboard.html(data);
|
||||||
dashboard.unblock();
|
dashboard.unblock();
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="https://www.combodo.com/itop-schema/3.3"
|
||||||
|
version="3.3">
|
||||||
<classes>
|
<classes>
|
||||||
<class id="AbstractResource" _delta="define">
|
<class id="AbstractResource" _delta="define">
|
||||||
<parent>cmdbAbstractObject</parent>
|
<parent>cmdbAbstractObject</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<comment>/* Resource access control abstraction. Can be herited by abstract resource access control classes. Generaly controlled using UR_ACTION_MODIFY access right. */</comment>
|
<comment>/* Resource access control abstraction. Can be herited by abstract resource access control classes. Generally controlled using UR_ACTION_MODIFY access right. */</comment>
|
||||||
<abstract>true</abstract>
|
<abstract>true</abstract>
|
||||||
</properties>
|
</properties>
|
||||||
<presentation/>
|
<presentation/>
|
||||||
@@ -552,7 +554,7 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
|||||||
<description><![CDATA[Inform the listeners about the connection states]]></description>
|
<description><![CDATA[Inform the listeners about the connection states]]></description>
|
||||||
<event_data>
|
<event_data>
|
||||||
<event_datum id="code">
|
<event_datum id="code">
|
||||||
<description>The login step result code (LoginWebPage::EXIT_CODE_...) </description>
|
<description>The login step result code (LoginWebPage::EXIT_CODE_...)</description>
|
||||||
<type>integer</type>
|
<type>integer</type>
|
||||||
</event_datum>
|
</event_datum>
|
||||||
<event_datum id="state">
|
<event_datum id="state">
|
||||||
@@ -849,5 +851,168 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
|||||||
</methods>
|
</methods>
|
||||||
</class>
|
</class>
|
||||||
</classes>
|
</classes>
|
||||||
|
<property_types _delta="define">
|
||||||
|
<property_type id="Dashlet" xsi:type="Combodo-AbstractPropertyType"/>
|
||||||
|
<property_type id="DashletGroupBy" xsi:type="Combodo-PropertyType">
|
||||||
|
<extends>Dashlet</extends>
|
||||||
|
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||||
|
<label>UI:DashletGroupBy:Title</label>
|
||||||
|
<nodes>
|
||||||
|
<node id="title" xsi:type="Combodo-ValueType-Label">
|
||||||
|
<label>UI:DashletGroupBy:Prop-Title</label>
|
||||||
|
</node>
|
||||||
|
<node id="query" xsi:type="Combodo-ValueType-OQL">
|
||||||
|
<label>UI:DashletGroupBy:Prop-Query</label>
|
||||||
|
</node>
|
||||||
|
<node id="group_by" xsi:type="Combodo-ValueType-ClassAttributeGroupBy">
|
||||||
|
<label>UI:DashletGroupBy:Prop-GroupBy</label>
|
||||||
|
<class>{{query.selected_class}}</class>
|
||||||
|
</node>
|
||||||
|
<node id="style" xsi:type="Combodo-ValueType-Choice"> <!-- Possible de le cacher, etc celui-ci nous met dedans -->
|
||||||
|
<label>UI:DashletGroupBy:Prop-Style</label>
|
||||||
|
<values>
|
||||||
|
<value id="bars">
|
||||||
|
<label>UI:DashletGroupByBars:Label</label>
|
||||||
|
</value>
|
||||||
|
<value id="pie">
|
||||||
|
<label>UI:DashletGroupByPie:Label</label>
|
||||||
|
</value>
|
||||||
|
<value id="table">
|
||||||
|
<label>UI:DashletGroupByTable:Label</label>
|
||||||
|
</value>
|
||||||
|
</values>
|
||||||
|
</node>
|
||||||
|
<node id="aggregation_function" xsi:type="Combodo-ValueType-AggregateFunction">
|
||||||
|
<label>UI:DashletGroupBy:Prop-Function</label>
|
||||||
|
<class>{{query.selected_class}}</class> <!-- pour savoir si il y a des attributs additionnables -->
|
||||||
|
</node>
|
||||||
|
<node id="aggregation_attribute" xsi:type="Combodo-ValueType-ClassAttribute">
|
||||||
|
<label>UI:DashletGroupBy:Prop-FunctionAttribute</label>
|
||||||
|
<relevance-condition>{{aggregation_function.value != 'count'}}</relevance-condition>
|
||||||
|
<class>{{query.selected_class}}</class>
|
||||||
|
<category>numeric</category>
|
||||||
|
</node>
|
||||||
|
<node id="order_by" xsi:type="Combodo-ValueType-ChoiceFromInput">
|
||||||
|
<label>UI:DashletGroupBy:Prop-OrderField</label>
|
||||||
|
<values>
|
||||||
|
<value id="attribute">
|
||||||
|
<label>{{aggregation_attribute.label}}</label>
|
||||||
|
</value>
|
||||||
|
<value id="function">
|
||||||
|
<label>{{aggregation_function.label}}</label>
|
||||||
|
</value>
|
||||||
|
</values>
|
||||||
|
</node>
|
||||||
|
<node id="limit" xsi:type="Combodo-ValueType-Integer">
|
||||||
|
<label>UI:DashletGroupBy:Prop-Limit</label>
|
||||||
|
<relevance-condition>{{order_by.value = 'function'}}</relevance-condition>
|
||||||
|
</node>
|
||||||
|
<node id="order_direction" xsi:type="Combodo-ValueType-Choice">
|
||||||
|
<label>UI:DashletGroupBy:Prop-OrderDirection</label>
|
||||||
|
<values>
|
||||||
|
<value id="asc">
|
||||||
|
<label>UI:DashletGroupBy:Order:asc</label>
|
||||||
|
</value>
|
||||||
|
<value id="desc">
|
||||||
|
<label>UI:DashletGroupBy:Order:desc</label>
|
||||||
|
</value>
|
||||||
|
</values>
|
||||||
|
</node>
|
||||||
|
</nodes>
|
||||||
|
</definition>
|
||||||
|
</property_type>
|
||||||
|
<property_type id="DashletBadge" xsi:type="Combodo-PropertyType">
|
||||||
|
<extends>Dashlet</extends>
|
||||||
|
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||||
|
<nodes>
|
||||||
|
<node id="class" xsi:type="Combodo-ValueType-Class">
|
||||||
|
<label>UI:DashletBadge:Prop-Class</label>
|
||||||
|
<categories-csv>bizmodel</categories-csv>
|
||||||
|
</node>
|
||||||
|
</nodes>
|
||||||
|
</definition>
|
||||||
|
</property_type>
|
||||||
|
<property_type id="DashletHeaderDynamic" xsi:type="Combodo-PropertyType">
|
||||||
|
<extends>Dashlet</extends>
|
||||||
|
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||||
|
<label>UI:DashletHeaderDynamic:Title</label>
|
||||||
|
<nodes>
|
||||||
|
<node id="title" xsi:type="Combodo-ValueType-Label">
|
||||||
|
<label>UI:DashletHeaderDynamic:Prop-Title</label>
|
||||||
|
</node>
|
||||||
|
<node id="icon" xsi:type="Combodo-ValueType-Icon">
|
||||||
|
<label>UI:DashletHeaderDynamic:Prop-Icon</label>
|
||||||
|
</node>
|
||||||
|
<node id="subtitle" xsi:type="Combodo-ValueType-Label">
|
||||||
|
<label>UI:DashletHeaderDynamic:Prop-Subtitle</label>
|
||||||
|
</node>
|
||||||
|
<node id="query" xsi:type="Combodo-ValueType-OQL">
|
||||||
|
<label>UI:DashletHeaderDynamic:Prop-Query</label>
|
||||||
|
</node>
|
||||||
|
<node id="group_by" xsi:type="Combodo-ValueType-ClassAttribute">
|
||||||
|
<label>UI:DashletHeaderDynamic:Prop-GroupBy</label>
|
||||||
|
<class>{{query.selected_class}}</class>
|
||||||
|
<category>enum</category>
|
||||||
|
</node>
|
||||||
|
<node id="values" xsi:type="Combodo-ValueType-CollectionOfValues">
|
||||||
|
<label>UI:DashletHeaderDynamic:Prop-Values</label>
|
||||||
|
<xml-format xsi:type="Combodo-XMLFormat-CSV"/>
|
||||||
|
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
|
||||||
|
<class>{{query.selected_class}}</class>
|
||||||
|
<attribute>{{group_by.attribute}}</attribute>
|
||||||
|
</value-type>
|
||||||
|
</node>
|
||||||
|
</nodes>
|
||||||
|
</definition>
|
||||||
|
</property_type>
|
||||||
|
<property_type id="DashletHeaderStatic" xsi:type="Combodo-PropertyType">
|
||||||
|
<extends>Dashlet</extends>
|
||||||
|
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||||
|
<nodes>
|
||||||
|
<node id="title" xsi:type="Combodo-ValueType-Label">
|
||||||
|
<label>UI:DashletHeaderStatic:Prop-Title</label>
|
||||||
|
</node>
|
||||||
|
<node id="icon" xsi:type="Combodo-ValueType-Icon">
|
||||||
|
<label>UI:DashletHeaderStatic:Prop-Icon</label>
|
||||||
|
</node>
|
||||||
|
</nodes>
|
||||||
|
</definition>
|
||||||
|
</property_type>
|
||||||
|
<property_type id="DashletObjectList" xsi:type="Combodo-PropertyType">
|
||||||
|
<extends>Dashlet</extends>
|
||||||
|
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||||
|
<nodes>
|
||||||
|
<node id="title" xsi:type="Combodo-ValueType-Label">
|
||||||
|
<label>UI:DashletObjectList:Prop-Title</label>
|
||||||
|
</node>
|
||||||
|
<node id="query" xsi:type="Combodo-ValueType-OQL">
|
||||||
|
<label>UI:DashletObjectList:Prop-Query</label>
|
||||||
|
</node>
|
||||||
|
<node id="menu" xsi:type="Combodo-ValueType-Boolean">
|
||||||
|
<label>UI:DashletObjectList:Prop-Menu</label>
|
||||||
|
<on>
|
||||||
|
<!-- not so cute, but matches exactly 3.2 implementation of boolean fields -->
|
||||||
|
<label>UI:UserManagement:ActionAllowed:Yes</label>
|
||||||
|
<value>true</value>
|
||||||
|
</on>
|
||||||
|
<off>
|
||||||
|
<label>UI:UserManagement:ActionAllowed:No</label>
|
||||||
|
<value>false</value>
|
||||||
|
</off>
|
||||||
|
</node>
|
||||||
|
</nodes>
|
||||||
|
</definition>
|
||||||
|
</property_type>
|
||||||
|
<property_type id="DashletPlainText" xsi:type="Combodo-PropertyType">
|
||||||
|
<extends>Dashlet</extends>
|
||||||
|
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||||
|
<nodes>
|
||||||
|
<node id="text" xsi:type="Combodo-ValueType-Text">
|
||||||
|
<label>UI:DashletPlainText:Prop-Text</label>
|
||||||
|
</node>
|
||||||
|
</nodes>
|
||||||
|
</definition>
|
||||||
|
</property_type>
|
||||||
|
</property_types>
|
||||||
</meta>
|
</meta>
|
||||||
</itop_design>
|
</itop_design>
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ForgotPasswordApplicationException extends Exception
|
||||||
|
{
|
||||||
|
}
|
||||||
10
application/exceptions/ForgotPasswordUserInputException.php
Normal file
10
application/exceptions/ForgotPasswordUserInputException.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ForgotPasswordUserInputException extends Exception
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -243,15 +243,12 @@ class LoginTwigRenderer
|
|||||||
|
|
||||||
public function GetDefaultVars()
|
public function GetDefaultVars()
|
||||||
{
|
{
|
||||||
$sVersionShort = Dict::Format('UI:iTopVersion:Short', ITOP_APPLICATION, ITOP_VERSION);
|
|
||||||
$sIconUrl = Utils::GetConfig()->Get('app_icon_url');
|
$sIconUrl = Utils::GetConfig()->Get('app_icon_url');
|
||||||
$sDisplayIcon = Branding::GetLoginLogoAbsoluteUrl();
|
$sDisplayIcon = Branding::GetLoginLogoAbsoluteUrl();
|
||||||
|
|
||||||
$aVars = [
|
$aVars = [
|
||||||
'sAppRootUrl' => utils::GetAbsoluteUrlAppRoot(),
|
'sAppRootUrl' => utils::GetAbsoluteUrlAppRoot(),
|
||||||
'aPluginFormData' => $this->GetPluginFormData(),
|
'aPluginFormData' => $this->GetPluginFormData(),
|
||||||
'sItopVersion' => ITOP_VERSION,
|
|
||||||
'sVersionShort' => $sVersionShort,
|
|
||||||
'sIconUrl' => $sIconUrl,
|
'sIconUrl' => $sIconUrl,
|
||||||
'sDisplayIcon' => $sDisplayIcon,
|
'sDisplayIcon' => $sDisplayIcon,
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -221,15 +221,15 @@ class LoginWebPage extends NiceWebPage
|
|||||||
|
|
||||||
if ($oUser != null) {
|
if ($oUser != null) {
|
||||||
if (!MetaModel::IsValidAttCode(get_class($oUser), 'reset_pwd_token')) {
|
if (!MetaModel::IsValidAttCode(get_class($oUser), 'reset_pwd_token')) {
|
||||||
throw new Exception(Dict::S('UI:ResetPwd-Error-NotPossible'));
|
throw new ForgotPasswordUserInputException('External accounts do not allow password reset');
|
||||||
}
|
}
|
||||||
if (!$oUser->CanChangePassword()) {
|
if (!$oUser->CanChangePassword()) {
|
||||||
throw new Exception(Dict::S('UI:ResetPwd-Error-FixedPwd'));
|
throw new ForgotPasswordUserInputException('The account does not allow password reset');
|
||||||
}
|
}
|
||||||
|
|
||||||
$sTo = $oUser->GetResetPasswordEmail(); // throws Exceptions if not allowed
|
$sTo = $oUser->GetResetPasswordEmail(); // throws Exceptions if not allowed
|
||||||
if ($sTo == '') {
|
if ($sTo == '') {
|
||||||
throw new Exception(Dict::S('UI:ResetPwd-Error-NoEmail'));
|
throw new ForgotPasswordUserInputException('Missing email address for this account');
|
||||||
}
|
}
|
||||||
|
|
||||||
// This token allows the user to change the password without knowing the previous one
|
// This token allows the user to change the password without knowing the previous one
|
||||||
@@ -255,17 +255,21 @@ class LoginWebPage extends NiceWebPage
|
|||||||
|
|
||||||
case EMAIL_SEND_ERROR:
|
case EMAIL_SEND_ERROR:
|
||||||
default:
|
default:
|
||||||
IssueLog::Error('Failed to send the email with the NEW password for '.$oUser->Get('friendlyname').': '.implode(', ', $aIssues));
|
throw new ForgotPasswordApplicationException('Failed to send the password reset email for '.$oUser->Get('friendlyname').': '.implode(', ', $aIssues));
|
||||||
throw new Exception(Dict::S('UI:ResetPwd-Error-Send'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$oTwigContext = new LoginTwigRenderer();
|
} catch (ForgotPasswordApplicationException $e) {
|
||||||
$aVars = $oTwigContext->GetDefaultVars();
|
IssueLog::Error('Failed to process the forgot password request for user "'.$sAuthUser.'" [reason='.get_class($e).']: '.$e->getMessage());
|
||||||
$oTwigContext->Render($this, 'forgotpwdsent.html.twig', $aVars);
|
} catch (ForgotPasswordUserInputException $e) {
|
||||||
} catch (Exception $e) {
|
IssueLog::Info('Failed to process the forgot password request for user "'.$sAuthUser.'" [reason='.get_class($e).']: '.$e->getMessage());
|
||||||
$this->DisplayForgotPwdForm(true, $e->getMessage());
|
} catch (\Throwable $e) {
|
||||||
|
IssueLog::Error('Unexpected error while processing the forgot password request for user "'.$sAuthUser.'": '.$e->getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$oTwigContext = new LoginTwigRenderer();
|
||||||
|
$aVars = $oTwigContext->GetDefaultVars();
|
||||||
|
$oTwigContext->Render($this, 'forgotpwdsent.html.twig', $aVars);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function DisplayResetPwdForm($sErrorMessage = null)
|
public function DisplayResetPwdForm($sErrorMessage = null)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ interface iNewsroomProvider
|
|||||||
* @param User $oUser The user for who to check if the provider is applicable.
|
* @param User $oUser The user for who to check if the provider is applicable.
|
||||||
* return bool
|
* return bool
|
||||||
*/
|
*/
|
||||||
public function IsApplicable(User $oUser = null);
|
public function IsApplicable(?User $oUser = null);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The human readable (localized) label for this provider
|
* The human readable (localized) label for this provider
|
||||||
@@ -139,7 +139,7 @@ abstract class NewsroomProviderBase implements iNewsroomProvider
|
|||||||
*/
|
*/
|
||||||
abstract public function GetViewAllURL();
|
abstract public function GetViewAllURL();
|
||||||
|
|
||||||
public function IsApplicable(User $oUser = null)
|
public function IsApplicable(?User $oUser = null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ abstract class Query extends cmdbAbstractObject
|
|||||||
* @return string|null
|
* @return string|null
|
||||||
* @since 3.1.0
|
* @since 3.1.0
|
||||||
*/
|
*/
|
||||||
abstract public function GetExportUrl(array $aValues = null): ?string;
|
abstract public function GetExportUrl(?array $aValues = null): ?string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update last export information.
|
* Update last export information.
|
||||||
@@ -227,7 +227,7 @@ class QueryOQL extends Query
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
public function GetExportUrl(array $aValues = null): ?string
|
public function GetExportUrl(?array $aValues = null): ?string
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
// retrieve attributes
|
// retrieve attributes
|
||||||
|
|||||||
@@ -181,6 +181,9 @@ class utils
|
|||||||
|
|
||||||
protected static function LoadParamFile($sParamFile)
|
protected static function LoadParamFile($sParamFile)
|
||||||
{
|
{
|
||||||
|
if (utils::RealPath($sParamFile, APPROOT) !== false) {
|
||||||
|
throw new Exception("File '".utils::HtmlEntities($sParamFile)."' should be outside iTop");
|
||||||
|
}
|
||||||
if (!file_exists($sParamFile)) {
|
if (!file_exists($sParamFile)) {
|
||||||
throw new Exception("Could not find the parameter file: '".utils::HtmlEntities($sParamFile)."'");
|
throw new Exception("Could not find the parameter file: '".utils::HtmlEntities($sParamFile)."'");
|
||||||
}
|
}
|
||||||
@@ -1284,7 +1287,7 @@ class utils
|
|||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function ExecITopScript(string $sScriptName, array $aArguments, string $sAuthUser = null, string $sAuthPwd = null)
|
public static function ExecITopScript(string $sScriptName, array $aArguments, ?string $sAuthUser = null, ?string $sAuthPwd = null)
|
||||||
{
|
{
|
||||||
$aDisabled = explode(', ', ini_get('disable_functions'));
|
$aDisabled = explode(', ', ini_get('disable_functions'));
|
||||||
if (in_array('exec', $aDisabled)) {
|
if (in_array('exec', $aDisabled)) {
|
||||||
@@ -1374,7 +1377,7 @@ class utils
|
|||||||
* @return string A path to a folder into which any module can store cache data
|
* @return string A path to a folder into which any module can store cache data
|
||||||
* The corresponding folder is created or cleaned upon code compilation
|
* The corresponding folder is created or cleaned upon code compilation
|
||||||
*/
|
*/
|
||||||
public static function GetCachePath(string $sEnvironment = null): string
|
public static function GetCachePath(?string $sEnvironment = null): string
|
||||||
{
|
{
|
||||||
if (is_null($sEnvironment)) {
|
if (is_null($sEnvironment)) {
|
||||||
$sEnvironment = MetaModel::GetEnvironment();
|
$sEnvironment = MetaModel::GetEnvironment();
|
||||||
@@ -1900,6 +1903,12 @@ SQL;
|
|||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function QuoteForPHP(string $sValue): string
|
||||||
|
{
|
||||||
|
$sEscaped = str_replace(['\\', "'"], ['\\\\', "\\'"], $sValue);
|
||||||
|
return "'$sEscaped'";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a standard list of character sets
|
* Get a standard list of character sets
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
"symfony/mailer": "^6.4",
|
"symfony/mailer": "^6.4",
|
||||||
"symfony/security-csrf": "^6.4",
|
"symfony/security-csrf": "^6.4",
|
||||||
"symfony/twig-bundle": "~6.4.0",
|
"symfony/twig-bundle": "~6.4.0",
|
||||||
|
"symfony/validator" : "^6.4",
|
||||||
"symfony/yaml": "~6.4.0",
|
"symfony/yaml": "~6.4.0",
|
||||||
"tecnickcom/tcpdf": "^6.6.0",
|
"tecnickcom/tcpdf": "^6.6.0",
|
||||||
"thenetworg/oauth2-azure": "^2.0"
|
"thenetworg/oauth2-azure": "^2.0"
|
||||||
|
|||||||
510
composer.lock
generated
510
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -199,7 +199,7 @@ class CellStatus_SearchIssue extends CellStatus_Issue
|
|||||||
* @param null $sAllowedValues : used for additional message that provides allowed values $sAllowedValues for current class
|
* @param null $sAllowedValues : used for additional message that provides allowed values $sAllowedValues for current class
|
||||||
* @param string|null $sAllowedValuesSearch : used to search all allowed values
|
* @param string|null $sAllowedValuesSearch : used to search all allowed values
|
||||||
*/
|
*/
|
||||||
public function __construct($sSerializedSearch, $sReason, $sClass = null, $sAllowedValues = null, string $sAllowedValuesSearch = null)
|
public function __construct($sSerializedSearch, $sReason, $sClass = null, $sAllowedValues = null, ?string $sAllowedValuesSearch = null)
|
||||||
{
|
{
|
||||||
parent::__construct(null, null, $sReason);
|
parent::__construct(null, null, $sReason);
|
||||||
$this->sSerializedSearch = $sSerializedSearch;
|
$this->sSerializedSearch = $sSerializedSearch;
|
||||||
@@ -876,7 +876,7 @@ class BulkChange
|
|||||||
return $aResults;
|
return $aResults;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function CreateObject(&$aResult, $iRow, $aRowData, CMDBChange $oChange = null)
|
protected function CreateObject(&$aResult, $iRow, $aRowData, ?CMDBChange $oChange = null)
|
||||||
{
|
{
|
||||||
$oTargetObj = MetaModel::NewObject($this->m_sClass);
|
$oTargetObj = MetaModel::NewObject($this->m_sClass);
|
||||||
|
|
||||||
@@ -965,7 +965,7 @@ class BulkChange
|
|||||||
* @throws \MySQLException
|
* @throws \MySQLException
|
||||||
* @throws \MySQLHasGoneAwayException
|
* @throws \MySQLHasGoneAwayException
|
||||||
*/
|
*/
|
||||||
protected function UpdateObject(&$aResult, $iRow, $oTargetObj, $aRowData, CMDBChange $oChange = null)
|
protected function UpdateObject(&$aResult, $iRow, $oTargetObj, $aRowData, ?CMDBChange $oChange = null)
|
||||||
{
|
{
|
||||||
$aResult[$iRow] = $this->PrepareObject($oTargetObj, $aRowData, $aErrors);
|
$aResult[$iRow] = $this->PrepareObject($oTargetObj, $aRowData, $aErrors);
|
||||||
|
|
||||||
@@ -1008,7 +1008,7 @@ class BulkChange
|
|||||||
*
|
*
|
||||||
* @throws \BulkChangeException
|
* @throws \BulkChangeException
|
||||||
*/
|
*/
|
||||||
protected function UpdateMissingObject(&$aResult, $iRow, $oTargetObj, CMDBChange $oChange = null)
|
protected function UpdateMissingObject(&$aResult, $iRow, $oTargetObj, ?CMDBChange $oChange = null)
|
||||||
{
|
{
|
||||||
$aResult[$iRow] = $this->PrepareMissingObject($oTargetObj, $aErrors);
|
$aResult[$iRow] = $this->PrepareMissingObject($oTargetObj, $aErrors);
|
||||||
|
|
||||||
@@ -1043,7 +1043,7 @@ class BulkChange
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Process(CMDBChange $oChange = null)
|
public function Process(?CMDBChange $oChange = null)
|
||||||
{
|
{
|
||||||
if ($oChange) {
|
if ($oChange) {
|
||||||
CMDBObject::SetCurrentChange($oChange);
|
CMDBObject::SetCurrentChange($oChange);
|
||||||
|
|||||||
@@ -1954,11 +1954,6 @@ class Config
|
|||||||
*/
|
*/
|
||||||
protected $m_sDefaultLanguage;
|
protected $m_sDefaultLanguage;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Type of login process allowed: form|basic|url|external
|
|
||||||
*/
|
|
||||||
protected $m_sAllowedLoginTypes;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string Name of the PHP variable in which external authentication information is passed by the web server
|
* @var string Name of the PHP variable in which external authentication information is passed by the web server
|
||||||
*/
|
*/
|
||||||
@@ -2032,7 +2027,6 @@ class Config
|
|||||||
$this->m_iFastReloadInterval = DEFAULT_FAST_RELOAD_INTERVAL;
|
$this->m_iFastReloadInterval = DEFAULT_FAST_RELOAD_INTERVAL;
|
||||||
$this->m_bSecureConnectionRequired = DEFAULT_SECURE_CONNECTION_REQUIRED;
|
$this->m_bSecureConnectionRequired = DEFAULT_SECURE_CONNECTION_REQUIRED;
|
||||||
$this->m_sDefaultLanguage = 'EN US';
|
$this->m_sDefaultLanguage = 'EN US';
|
||||||
$this->m_sAllowedLoginTypes = DEFAULT_ALLOWED_LOGIN_TYPES;
|
|
||||||
$this->m_sExtAuthVariable = DEFAULT_EXT_AUTH_VARIABLE;
|
$this->m_sExtAuthVariable = DEFAULT_EXT_AUTH_VARIABLE;
|
||||||
$this->m_aCharsets = [];
|
$this->m_aCharsets = [];
|
||||||
$this->m_bQueryCacheEnabled = DEFAULT_QUERY_CACHE_ENABLED;
|
$this->m_bQueryCacheEnabled = DEFAULT_QUERY_CACHE_ENABLED;
|
||||||
@@ -2179,7 +2173,6 @@ class Config
|
|||||||
$this->m_aModuleSettings = isset($MyModuleSettings) ? $MyModuleSettings : [];
|
$this->m_aModuleSettings = isset($MyModuleSettings) ? $MyModuleSettings : [];
|
||||||
|
|
||||||
$this->m_sDefaultLanguage = isset($MySettings['default_language']) ? trim($MySettings['default_language']) : 'EN US';
|
$this->m_sDefaultLanguage = isset($MySettings['default_language']) ? trim($MySettings['default_language']) : 'EN US';
|
||||||
$this->m_sAllowedLoginTypes = isset($MySettings['allowed_login_types']) ? trim($MySettings['allowed_login_types']) : DEFAULT_ALLOWED_LOGIN_TYPES;
|
|
||||||
$this->m_sExtAuthVariable = isset($MySettings['ext_auth_variable']) ? trim($MySettings['ext_auth_variable']) : DEFAULT_EXT_AUTH_VARIABLE;
|
$this->m_sExtAuthVariable = isset($MySettings['ext_auth_variable']) ? trim($MySettings['ext_auth_variable']) : DEFAULT_EXT_AUTH_VARIABLE;
|
||||||
$this->m_sEncryptionKey = isset($MySettings['encryption_key']) ? trim($MySettings['encryption_key']) : $this->m_sEncryptionKey;
|
$this->m_sEncryptionKey = isset($MySettings['encryption_key']) ? trim($MySettings['encryption_key']) : $this->m_sEncryptionKey;
|
||||||
$this->m_sEncryptionLibrary = isset($MySettings['encryption_library']) ? trim($MySettings['encryption_library']) : $this->m_sEncryptionLibrary;
|
$this->m_sEncryptionLibrary = isset($MySettings['encryption_library']) ? trim($MySettings['encryption_library']) : $this->m_sEncryptionLibrary;
|
||||||
@@ -2339,7 +2332,7 @@ class Config
|
|||||||
|
|
||||||
public function GetAllowedLoginTypes()
|
public function GetAllowedLoginTypes()
|
||||||
{
|
{
|
||||||
return explode('|', $this->m_sAllowedLoginTypes);
|
return explode('|', $this->m_aSettings['allowed_login_types']['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetExternalAuthenticationVariable()
|
public function GetExternalAuthenticationVariable()
|
||||||
@@ -2417,7 +2410,7 @@ class Config
|
|||||||
|
|
||||||
public function SetAllowedLoginTypes($aAllowedLoginTypes)
|
public function SetAllowedLoginTypes($aAllowedLoginTypes)
|
||||||
{
|
{
|
||||||
$this->m_sAllowedLoginTypes = implode('|', $aAllowedLoginTypes);
|
$this->Set('allowed_login_types', implode('|', $aAllowedLoginTypes));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2494,7 +2487,6 @@ class Config
|
|||||||
$aSettings['fast_reload_interval'] = $this->m_iFastReloadInterval;
|
$aSettings['fast_reload_interval'] = $this->m_iFastReloadInterval;
|
||||||
$aSettings['secure_connection_required'] = $this->m_bSecureConnectionRequired;
|
$aSettings['secure_connection_required'] = $this->m_bSecureConnectionRequired;
|
||||||
$aSettings['default_language'] = $this->m_sDefaultLanguage;
|
$aSettings['default_language'] = $this->m_sDefaultLanguage;
|
||||||
$aSettings['allowed_login_types'] = $this->m_sAllowedLoginTypes;
|
|
||||||
$aSettings['ext_auth_variable'] = $this->m_sExtAuthVariable;
|
$aSettings['ext_auth_variable'] = $this->m_sExtAuthVariable;
|
||||||
$aSettings['encryption_key'] = $this->m_sEncryptionKey;
|
$aSettings['encryption_key'] = $this->m_sEncryptionKey;
|
||||||
$aSettings['encryption_library'] = $this->m_sEncryptionLibrary;
|
$aSettings['encryption_library'] = $this->m_sEncryptionLibrary;
|
||||||
@@ -2598,7 +2590,6 @@ class Config
|
|||||||
// Old fashioned remaining values
|
// Old fashioned remaining values
|
||||||
$aOtherValues = [
|
$aOtherValues = [
|
||||||
'default_language' => $this->m_sDefaultLanguage,
|
'default_language' => $this->m_sDefaultLanguage,
|
||||||
'allowed_login_types' => $this->m_sAllowedLoginTypes,
|
|
||||||
'ext_auth_variable' => $this->m_sExtAuthVariable,
|
'ext_auth_variable' => $this->m_sExtAuthVariable,
|
||||||
'encryption_key' => $this->m_sEncryptionKey,
|
'encryption_key' => $this->m_sEncryptionKey,
|
||||||
'encryption_library' => $this->m_sEncryptionLibrary,
|
'encryption_library' => $this->m_sEncryptionLibrary,
|
||||||
|
|||||||
@@ -2567,7 +2567,7 @@ abstract class DBObject implements iDisplay
|
|||||||
*
|
*
|
||||||
* @see \RestUtils::FindObjectFromKey for the same check in the REST endpoint
|
* @see \RestUtils::FindObjectFromKey for the same check in the REST endpoint
|
||||||
*/
|
*/
|
||||||
final public function CheckChangedExtKeysValues(callable $oIsObjectLoadableCallback = null)
|
final public function CheckChangedExtKeysValues(?callable $oIsObjectLoadableCallback = null)
|
||||||
{
|
{
|
||||||
if (is_null($oIsObjectLoadableCallback)) {
|
if (is_null($oIsObjectLoadableCallback)) {
|
||||||
$oIsObjectLoadableCallback = function ($sClass, $sId) {
|
$oIsObjectLoadableCallback = function ($sClass, $sId) {
|
||||||
@@ -3727,7 +3727,7 @@ abstract class DBObject implements iDisplay
|
|||||||
* @throws \MySQLException
|
* @throws \MySQLException
|
||||||
* @throws \OQLException
|
* @throws \OQLException
|
||||||
*/
|
*/
|
||||||
private function ActivateOnObjectUpdateTriggers(?DBObject $oObject, array $aAttributes = null): void
|
private function ActivateOnObjectUpdateTriggers(?DBObject $oObject, ?array $aAttributes = null): void
|
||||||
{
|
{
|
||||||
if (is_null($oObject)) {
|
if (is_null($oObject)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ abstract class DBSearch
|
|||||||
*
|
*
|
||||||
* @throws OQLException
|
* @throws OQLException
|
||||||
*/
|
*/
|
||||||
public static function FromOQL($sQuery, $aParams = null, ModelReflection $oMetaModel = null)
|
public static function FromOQL($sQuery, $aParams = null, ?ModelReflection $oMetaModel = null)
|
||||||
{
|
{
|
||||||
if (empty($sQuery)) {
|
if (empty($sQuery)) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class DBUnionSearch extends DBSearch
|
|||||||
public function AllowAllData($bAllowAllData = true)
|
public function AllowAllData($bAllowAllData = true)
|
||||||
{
|
{
|
||||||
foreach ($this->aSearches as $oSearch) {
|
foreach ($this->aSearches as $oSearch) {
|
||||||
$oSearch->AllowAllData();
|
$oSearch->AllowAllData($bAllowAllData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ use utils;
|
|||||||
/**
|
/**
|
||||||
* Class \Combodo\iTop\DesignDocument
|
* Class \Combodo\iTop\DesignDocument
|
||||||
*
|
*
|
||||||
* A design document is the DOM tree that modelize behaviors. One of its
|
* A design document is the DOM tree that models behaviors. One of its
|
||||||
* characteristics is that it can be altered by the mean of the same kind of document.
|
* characteristics is that it can be altered by the mean of the same kind of document.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -453,7 +453,7 @@ class DesignElement extends \DOMElement
|
|||||||
* @throws Exception
|
* @throws Exception
|
||||||
* @since 3.1.2 3.2.0 N°6974
|
* @since 3.1.2 3.2.0 N°6974
|
||||||
*/
|
*/
|
||||||
public static function _FindNode(DOMNode $oParent, DesignElement $oRefNode, string $sSearchId = null): ?DesignElement
|
public static function _FindNode(DOMNode $oParent, DesignElement $oRefNode, ?string $sSearchId = null): ?DesignElement
|
||||||
{
|
{
|
||||||
$oNodes = self::_FindNodes($oParent, $oRefNode, $sSearchId);
|
$oNodes = self::_FindNodes($oParent, $oRefNode, $sSearchId);
|
||||||
if ($oNodes instanceof DOMNodeList) {
|
if ($oNodes instanceof DOMNodeList) {
|
||||||
@@ -477,7 +477,7 @@ class DesignElement extends \DOMElement
|
|||||||
* @return \DOMNodeList|false|mixed
|
* @return \DOMNodeList|false|mixed
|
||||||
* @since 3.1.2 3.2.0 N°6974
|
* @since 3.1.2 3.2.0 N°6974
|
||||||
*/
|
*/
|
||||||
public static function _FindNodes(DOMNode $oParent, DesignElement $oRefNode, string $sSearchId = null)
|
public static function _FindNodes(DOMNode $oParent, DesignElement $oRefNode, ?string $sSearchId = null)
|
||||||
{
|
{
|
||||||
if ($oParent instanceof DOMDocument) {
|
if ($oParent instanceof DOMDocument) {
|
||||||
$oDoc = $oParent->firstChild->ownerDocument;
|
$oDoc = $oParent->firstChild->ownerDocument;
|
||||||
|
|||||||
@@ -632,7 +632,7 @@ class DisplayableGroupNode extends DisplayableNode
|
|||||||
$this->aObjects = [];
|
$this->aObjects = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function AddObject(DBObject $oObj = null)
|
public function AddObject(?DBObject $oObj = null)
|
||||||
{
|
{
|
||||||
if (is_object($oObj)) {
|
if (is_object($oObj)) {
|
||||||
$sPrevClass = $this->GetObjectClass();
|
$sPrevClass = $this->GetObjectClass();
|
||||||
|
|||||||
@@ -259,13 +259,18 @@ class InlineImage extends DBObject
|
|||||||
* that refer to an InlineImage (detected via the attribute data-img-id="") so that
|
* that refer to an InlineImage (detected via the attribute data-img-id="") so that
|
||||||
* the URL is consistent with the current URL of the application.
|
* the URL is consistent with the current URL of the application.
|
||||||
*
|
*
|
||||||
* @param string $sHtml The HTML fragment to process
|
N°8681 * @param string|null $sHtml The HTML fragment to process
|
||||||
*
|
*
|
||||||
* @return string The modified HTML
|
* @return string The modified HTML
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
|
*
|
||||||
|
* @since 3.3.0 N°8681 Add type hint for parameters and return value
|
||||||
*/
|
*/
|
||||||
public static function FixUrls($sHtml)
|
public static function FixUrls(string|null $sHtml): string
|
||||||
{
|
{
|
||||||
|
// N°8681 - Ensure to have a string value
|
||||||
|
$sHtml = $sHtml ?? '';
|
||||||
|
|
||||||
$aNeedles = [];
|
$aNeedles = [];
|
||||||
$aReplacements = [];
|
$aReplacements = [];
|
||||||
// Find img tags with an attribute data-img-id
|
// Find img tags with an attribute data-img-id
|
||||||
@@ -389,7 +394,7 @@ JS
|
|||||||
* Resize an image so that it fits the maximum width/height defined in the config file
|
* Resize an image so that it fits the maximum width/height defined in the config file
|
||||||
* @param ormDocument $oImage The original image stored as an array (content / mimetype / filename)
|
* @param ormDocument $oImage The original image stored as an array (content / mimetype / filename)
|
||||||
* @return ormDocument The resampled image (or the original one if it already fit)
|
* @return ormDocument The resampled image (or the original one if it already fit)
|
||||||
* @deprecated Replaced by ormDocument::ResizeImageToFit
|
* @deprecated since 3.3.0 Replaced by ormDocument::ResizeImageToFit
|
||||||
*/
|
*/
|
||||||
public static function ResizeImageToFit(ormDocument $oImage, &$aDimensions = null)
|
public static function ResizeImageToFit(ormDocument $oImage, &$aDimensions = null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use Combodo\iTop\Application\EventRegister\ApplicationEvents;
|
||||||
use Combodo\iTop\Core\Kpi\KpiLogData;
|
use Combodo\iTop\Core\Kpi\KpiLogData;
|
||||||
|
use Combodo\iTop\Service\Events\EventService;
|
||||||
|
use Combodo\iTop\Service\Events\iEventServiceSetup;
|
||||||
use Combodo\iTop\Service\Module\ModuleService;
|
use Combodo\iTop\Service\Module\ModuleService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Measures operations duration, memory usage, etc. (and some other KPIs)
|
* Measures operations duration, memory usage, etc. (and some other KPIs)
|
||||||
*/
|
*/
|
||||||
|
class ExecutionKPI implements iEventServiceSetup
|
||||||
class ExecutionKPI
|
|
||||||
{
|
{
|
||||||
protected static $m_bEnabled_Duration = false;
|
protected static $m_bEnabled_Duration = false;
|
||||||
protected static $m_bEnabled_Memory = false;
|
protected static $m_bEnabled_Memory = false;
|
||||||
@@ -23,15 +25,18 @@ class ExecutionKPI
|
|||||||
|
|
||||||
protected static $m_aStats = []; // Recurrent operations
|
protected static $m_aStats = []; // Recurrent operations
|
||||||
protected static $m_aExecData = []; // One shot operations
|
protected static $m_aExecData = []; // One shot operations
|
||||||
/**
|
/** @var true */
|
||||||
* @var array[ExecutionKPI]
|
private static bool $bMetamodelStarted = false;
|
||||||
*/
|
|
||||||
protected static $m_aExecutionStack = []; // embedded execution stats
|
|
||||||
|
|
||||||
|
private static ?float $fLastReportTime = null;
|
||||||
|
private static ?float $iLastReportMemory = null;
|
||||||
|
|
||||||
|
// For stats
|
||||||
protected $m_fStarted = null;
|
protected $m_fStarted = null;
|
||||||
protected $m_fChildrenDuration = 0; // Count embedded
|
|
||||||
protected $m_iInitialMemory = null;
|
protected $m_iInitialMemory = null;
|
||||||
|
|
||||||
|
private static array $aBootstrapOperations = [];
|
||||||
|
|
||||||
public static function EnableDuration($iLevel)
|
public static function EnableDuration($iLevel)
|
||||||
{
|
{
|
||||||
if ($iLevel > 0) {
|
if ($iLevel > 0) {
|
||||||
@@ -71,6 +76,7 @@ class ExecutionKPI
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +103,7 @@ class ExecutionKPI
|
|||||||
$sFor = self::$m_sAllowedUser == '*' ? 'EVERYBODY' : "'".trim(self::$m_sAllowedUser)."'";
|
$sFor = self::$m_sAllowedUser == '*' ? 'EVERYBODY' : "'".trim(self::$m_sAllowedUser)."'";
|
||||||
$sSlowQueries = '';
|
$sSlowQueries = '';
|
||||||
if (self::$m_fSlowQueries > 0) {
|
if (self::$m_fSlowQueries > 0) {
|
||||||
$sSlowQueries = ". Slow Queries: ".self::$m_fSlowQueries."s";
|
$sSlowQueries = '. Slow Queries: '.self::$m_fSlowQueries.'s';
|
||||||
}
|
}
|
||||||
|
|
||||||
$aExtensions = [];
|
$aExtensions = [];
|
||||||
@@ -127,7 +133,7 @@ class ExecutionKPI
|
|||||||
$sRequest .= ' operation: '.$_POST['operation'];
|
$sRequest .= ' operation: '.$_POST['operation'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$fStop = MyHelpers::getmicrotime();
|
$fStop = microtime(true);
|
||||||
if (($fStop - $fItopStarted) > self::$m_fSlowQueries) {
|
if (($fStop - $fItopStarted) > self::$m_fSlowQueries) {
|
||||||
// Invoke extensions to log the KPI operation
|
// Invoke extensions to log the KPI operation
|
||||||
/** @var \iKPILoggerExtension $oExtensionInstance */
|
/** @var \iKPILoggerExtension $oExtensionInstance */
|
||||||
@@ -151,17 +157,17 @@ class ExecutionKPI
|
|||||||
|
|
||||||
$sTableStyle = 'background-color: #ccc; margin: 10px;';
|
$sTableStyle = 'background-color: #ccc; margin: 10px;';
|
||||||
|
|
||||||
$sHtml = "<hr/>";
|
$sHtml = '<hr/>';
|
||||||
$sHtml .= "<div style=\"background-color: grey; padding: 10px;\">";
|
$sHtml .= "<div style=\"background-color: grey; padding: 10px;\">";
|
||||||
$sHtml .= "<h3><a name=\"".md5($sExecId)."\">KPIs</a> - $sRequest</h3>";
|
$sHtml .= "<h3><a name=\"".md5($sExecId)."\">KPIs</a> - $sRequest</h3>";
|
||||||
$oStarted = DateTime::createFromFormat('U.u', $fItopStarted);
|
$oStarted = DateTime::createFromFormat('U.u', $fItopStarted);
|
||||||
$sHtml .= '<p>'.$oStarted->format('Y-m-d H:i:s.u').'</p>';
|
$sHtml .= '<p>'.$oStarted->format('Y-m-d H:i:s.u').'</p>';
|
||||||
$sHtml .= "<p>log_kpi_user_id: ".UserRights::GetUserId()."</p>";
|
$sHtml .= '<p>log_kpi_user_id: '.UserRights::GetUserId().'</p>';
|
||||||
$sHtml .= "<div>";
|
$sHtml .= '<div>';
|
||||||
$sHtml .= "<table border=\"1\" style=\"$sTableStyle\">";
|
$sHtml .= "<table border=\"1\" style=\"$sTableStyle\">";
|
||||||
$sHtml .= "<thead>";
|
$sHtml .= '<thead>';
|
||||||
$sHtml .= " <th>Operation</th><th>Begin</th><th>End</th><th>Duration</th><th>Memory start</th><th>Memory end</th><th>Memory peak</th>";
|
$sHtml .= ' <th>Operation</th><th>Begin</th><th>End</th><th>Duration</th><th>Memory start</th><th>Memory end</th><th>Memory peak</th>';
|
||||||
$sHtml .= "</thead>";
|
$sHtml .= '</thead>';
|
||||||
foreach (self::$m_aExecData as $aOpStats) {
|
foreach (self::$m_aExecData as $aOpStats) {
|
||||||
$sOperation = $aOpStats['op'];
|
$sOperation = $aOpStats['op'];
|
||||||
$sBegin = round($aOpStats['time_begin'], 3);
|
$sBegin = round($aOpStats['time_begin'], 3);
|
||||||
@@ -180,12 +186,12 @@ class ExecutionKPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$sHtml .= "<tr>";
|
$sHtml .= '<tr>';
|
||||||
$sHtml .= " <td>$sOperation</td><td>$sBegin</td><td>$sEnd</td><td>$sDuration</td><td>$sMemBegin</td><td>$sMemEnd</td><td>$sMemPeak</td>";
|
$sHtml .= " <td>$sOperation</td><td>$sBegin</td><td>$sEnd</td><td>$sDuration</td><td>$sMemBegin</td><td>$sMemEnd</td><td>$sMemPeak</td>";
|
||||||
$sHtml .= "</tr>";
|
$sHtml .= '</tr>';
|
||||||
}
|
}
|
||||||
$sHtml .= "</table>";
|
$sHtml .= '</table>';
|
||||||
$sHtml .= "</div>";
|
$sHtml .= '</div>';
|
||||||
|
|
||||||
$aConsolidatedStats = [];
|
$aConsolidatedStats = [];
|
||||||
foreach (self::$m_aStats as $sOperation => $aOpStats) {
|
foreach (self::$m_aStats as $sOperation => $aOpStats) {
|
||||||
@@ -208,20 +214,20 @@ class ExecutionKPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$aConsolidatedStats[$sOperation] = [
|
$aConsolidatedStats[$sOperation] = [
|
||||||
'count' => $iTotalOp,
|
'count' => $iTotalOp,
|
||||||
'duration' => $fTotalOp,
|
'duration' => $fTotalOp,
|
||||||
'min' => $fMinOp,
|
'min' => $fMinOp,
|
||||||
'max' => $fMaxOp,
|
'max' => $fMaxOp,
|
||||||
'avg' => $fTotalOp / $iTotalOp,
|
'avg' => $fTotalOp / $iTotalOp,
|
||||||
'max_args' => $sMaxOpArguments,
|
'max_args' => $sMaxOpArguments,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$sHtml .= "<div>";
|
$sHtml .= '<div>';
|
||||||
$sHtml .= "<table border=\"1\" style=\"$sTableStyle\">";
|
$sHtml .= "<table border=\"1\" style=\"$sTableStyle\">";
|
||||||
$sHtml .= "<thead>";
|
$sHtml .= '<thead>';
|
||||||
$sHtml .= " <th>Operation</th><th>Count</th><th>Duration</th><th>Min</th><th>Max</th><th>Avg</th>";
|
$sHtml .= ' <th>Operation</th><th>Count</th><th>Duration</th><th>Min</th><th>Max</th><th>Avg</th>';
|
||||||
$sHtml .= "</thead>";
|
$sHtml .= '</thead>';
|
||||||
foreach ($aConsolidatedStats as $sOperation => $aOpStats) {
|
foreach ($aConsolidatedStats as $sOperation => $aOpStats) {
|
||||||
$sOperation = '<a href="#'.md5($sExecId.$sOperation).'">'.$sOperation.'</a>';
|
$sOperation = '<a href="#'.md5($sExecId.$sOperation).'">'.$sOperation.'</a>';
|
||||||
$sCount = $aOpStats['count'];
|
$sCount = $aOpStats['count'];
|
||||||
@@ -230,14 +236,14 @@ class ExecutionKPI
|
|||||||
$sMax = '<a href="#'.md5($sExecId.$aOpStats['max_args']).'">'.round($aOpStats['max'], 3).'</a>';
|
$sMax = '<a href="#'.md5($sExecId.$aOpStats['max_args']).'">'.round($aOpStats['max'], 3).'</a>';
|
||||||
$sAvg = round($aOpStats['avg'], 3);
|
$sAvg = round($aOpStats['avg'], 3);
|
||||||
|
|
||||||
$sHtml .= "<tr>";
|
$sHtml .= '<tr>';
|
||||||
$sHtml .= " <td>$sOperation</td><td>$sCount</td><td>$sDuration</td><td>$sMin</td><td>$sMax</td><td>$sAvg</td>";
|
$sHtml .= " <td>$sOperation</td><td>$sCount</td><td>$sDuration</td><td>$sMin</td><td>$sMax</td><td>$sAvg</td>";
|
||||||
$sHtml .= "</tr>";
|
$sHtml .= '</tr>';
|
||||||
}
|
}
|
||||||
$sHtml .= "</table>";
|
$sHtml .= '</table>';
|
||||||
$sHtml .= "</div>";
|
$sHtml .= '</div>';
|
||||||
|
|
||||||
$sHtml .= "</div>";
|
$sHtml .= '</div>';
|
||||||
|
|
||||||
$sHtml .= "<p><a href=\"#end-".md5($sExecId)."\">Next page stats</a></p>";
|
$sHtml .= "<p><a href=\"#end-".md5($sExecId)."\">Next page stats</a></p>";
|
||||||
|
|
||||||
@@ -287,18 +293,18 @@ class ExecutionKPI
|
|||||||
$sOperationHtml = '<a name="'.md5($sExecId.$sOperation).'">'.$sOperation.'</a>';
|
$sOperationHtml = '<a name="'.md5($sExecId.$sOperation).'">'.$sOperation.'</a>';
|
||||||
$sHtml .= "<h4>$sOperationHtml</h4>";
|
$sHtml .= "<h4>$sOperationHtml</h4>";
|
||||||
$sHtml .= "<table border=\"1\" style=\"$sTableStyle\">";
|
$sHtml .= "<table border=\"1\" style=\"$sTableStyle\">";
|
||||||
$sHtml .= "<thead>";
|
$sHtml .= '<thead>';
|
||||||
$sHtml .= " <th>Operation details (+ blame caller if log_kpi_duration = 2)</th><th>Count</th><th>Duration</th><th>Min</th><th>Max</th>";
|
$sHtml .= ' <th>Operation details (+ blame caller if log_kpi_duration = 2)</th><th>Count</th><th>Duration</th><th>Min</th><th>Max</th>';
|
||||||
$sHtml .= "</thead>";
|
$sHtml .= '</thead>';
|
||||||
$bDisplayHeader = false;
|
$bDisplayHeader = false;
|
||||||
}
|
}
|
||||||
$sHtml .= "<tr>";
|
$sHtml .= '<tr>';
|
||||||
$sHtml .= " <td>$sHtmlArguments</td><td>$iCountInter</td><td>$sTotalInter</td><td>$sMinInter</td><td>$sMaxInter</td>";
|
$sHtml .= " <td>$sHtmlArguments</td><td>$iCountInter</td><td>$sTotalInter</td><td>$sMinInter</td><td>$sMaxInter</td>";
|
||||||
$sHtml .= "</tr>";
|
$sHtml .= '</tr>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!$bDisplayHeader) {
|
if (!$bDisplayHeader) {
|
||||||
$sHtml .= "</table>";
|
$sHtml .= '</table>';
|
||||||
$sHtml .= "<p><a href=\"#".md5($sExecId)."\">Back to page stats</a></p>";
|
$sHtml .= "<p><a href=\"#".md5($sExecId)."\">Back to page stats</a></p>";
|
||||||
}
|
}
|
||||||
self::Report($sHtml);
|
self::Report($sHtml);
|
||||||
@@ -333,39 +339,50 @@ class ExecutionKPI
|
|||||||
|
|
||||||
$aNewEntry = null;
|
$aNewEntry = null;
|
||||||
|
|
||||||
$fStarted = $this->m_fStarted;
|
if (is_null(static::$fLastReportTime)) {
|
||||||
$fStopped = $this->m_fStarted;
|
static::$fLastReportTime = $fItopStarted;
|
||||||
if (self::$m_bEnabled_Duration) {
|
|
||||||
$fStopped = MyHelpers::getmicrotime();
|
|
||||||
$aNewEntry = [
|
|
||||||
'op' => $sOperationDesc,
|
|
||||||
'time_begin' => $this->m_fStarted - $fItopStarted,
|
|
||||||
'time_end' => $fStopped - $fItopStarted,
|
|
||||||
];
|
|
||||||
// Reset for the next operation (if the object is recycled)
|
|
||||||
$this->m_fStarted = $fStopped;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$iInitialMemory = is_null($this->m_iInitialMemory) ? 0 : $this->m_iInitialMemory;
|
if (is_null(static::$iLastReportMemory)) {
|
||||||
$iCurrentMemory = 0;
|
global $iItopInitialMemory;
|
||||||
$iPeakMemory = 0;
|
static::$iLastReportMemory = $iItopInitialMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
$fStarted = static::$fLastReportTime;
|
||||||
|
$fStopped = microtime(true);
|
||||||
|
if (self::$m_bEnabled_Duration) {
|
||||||
|
$aNewEntry = [
|
||||||
|
'op' => $sOperationDesc,
|
||||||
|
'time_begin' => $fStarted - $fItopStarted,
|
||||||
|
'time_end' => $fStopped - $fItopStarted,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
static::$fLastReportTime = $fStopped;
|
||||||
|
|
||||||
|
$iInitialMemory = static::$iLastReportMemory;
|
||||||
|
$iCurrentMemory = $iInitialMemory;
|
||||||
|
$iPeakMemory = $iInitialMemory;
|
||||||
if (self::$m_bEnabled_Memory) {
|
if (self::$m_bEnabled_Memory) {
|
||||||
$iCurrentMemory = self::memory_get_usage();
|
$iCurrentMemory = self::memory_get_usage();
|
||||||
if (is_null($aNewEntry)) {
|
if (is_null($aNewEntry)) {
|
||||||
$aNewEntry = ['op' => $sOperationDesc];
|
$aNewEntry = ['op' => $sOperationDesc];
|
||||||
}
|
}
|
||||||
$aNewEntry['mem_begin'] = $this->m_iInitialMemory;
|
$aNewEntry['mem_begin'] = $iInitialMemory;
|
||||||
$aNewEntry['mem_end'] = $iCurrentMemory;
|
$aNewEntry['mem_end'] = $iCurrentMemory;
|
||||||
$iPeakMemory = self::memory_get_peak_usage();
|
$iPeakMemory = self::memory_get_peak_usage();
|
||||||
$aNewEntry['mem_peak'] = $iPeakMemory;
|
$aNewEntry['mem_peak'] = $iPeakMemory;
|
||||||
// Reset for the next operation (if the object is recycled)
|
// Reset for the next operation (if the object is recycled)
|
||||||
$this->m_iInitialMemory = $iCurrentMemory;
|
static::$iLastReportMemory = $iCurrentMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self::$m_bEnabled_Duration || self::$m_bEnabled_Memory) {
|
if (self::$m_bEnabled_Duration || self::$m_bEnabled_Memory) {
|
||||||
// Invoke extensions to log the KPI operation
|
$aCallstack = ['callstack' => $this->GetCallStack()];
|
||||||
/** @var \iKPILoggerExtension $oExtensionInstance */
|
if (static::$bMetamodelStarted) {
|
||||||
foreach (MetaModel::EnumPlugins('iKPILoggerExtension') as $oExtensionInstance) {
|
foreach (static::$aBootstrapOperations as $oLog) {
|
||||||
|
$this->LogOperation($oLog);
|
||||||
|
}
|
||||||
|
static::$aBootstrapOperations = [];
|
||||||
|
// Invoke extensions to log the KPI operation
|
||||||
$sExtension = ModuleService::GetInstance()->GetModuleNameFromCallStack(1);
|
$sExtension = ModuleService::GetInstance()->GetModuleNameFromCallStack(1);
|
||||||
$oKPILogData = new KpiLogData(
|
$oKPILogData = new KpiLogData(
|
||||||
KpiLogData::TYPE_REPORT,
|
KpiLogData::TYPE_REPORT,
|
||||||
@@ -376,9 +393,24 @@ class ExecutionKPI
|
|||||||
$sExtension,
|
$sExtension,
|
||||||
$iInitialMemory,
|
$iInitialMemory,
|
||||||
$iCurrentMemory,
|
$iCurrentMemory,
|
||||||
$iPeakMemory
|
$iPeakMemory,
|
||||||
|
$aCallstack
|
||||||
);
|
);
|
||||||
$oExtensionInstance->LogOperation($oKPILogData);
|
$this->LogOperation($oKPILogData);
|
||||||
|
} else {
|
||||||
|
$oKPILogData = new KpiLogData(
|
||||||
|
KpiLogData::TYPE_REPORT,
|
||||||
|
'Step',
|
||||||
|
$sOperationDesc,
|
||||||
|
$fStarted,
|
||||||
|
$fStopped,
|
||||||
|
'',
|
||||||
|
$iInitialMemory,
|
||||||
|
$iCurrentMemory,
|
||||||
|
$iPeakMemory,
|
||||||
|
$aCallstack
|
||||||
|
);
|
||||||
|
static::$aBootstrapOperations[] = $oKPILogData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,13 +420,21 @@ class ExecutionKPI
|
|||||||
$this->ResetCounters();
|
$this->ResetCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function LogOperation(KpiLogData $oKPILogData): void
|
||||||
|
{
|
||||||
|
/** @var \iKPILoggerExtension $oExtensionInstance */
|
||||||
|
foreach (MetaModel::EnumPlugins('iKPILoggerExtension') as $oExtensionInstance) {
|
||||||
|
$oExtensionInstance->LogOperation($oKPILogData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute statistics for a call to an extension
|
* Compute statistics for a call to an extension
|
||||||
* Note: not working in dev mode (with links to env-production)
|
* Note: not working in dev mode (with links to env-production)
|
||||||
*
|
*
|
||||||
* @param object|string $object object called
|
* @param object|string $object object called
|
||||||
* @param string $sMethod method called on the object
|
* @param string $sMethod method called on the object
|
||||||
* @param string $sMessage additional message
|
* @param string $sMessage additional message
|
||||||
*
|
*
|
||||||
* @return bool true if an extension was found for this object::method
|
* @return bool true if an extension was found for this object::method
|
||||||
* @throws \ReflectionException
|
* @throws \ReflectionException
|
||||||
@@ -423,21 +463,23 @@ class ExecutionKPI
|
|||||||
|
|
||||||
$fDuration = 0;
|
$fDuration = 0;
|
||||||
if (self::$m_bEnabled_Duration) {
|
if (self::$m_bEnabled_Duration) {
|
||||||
$fStopped = MyHelpers::getmicrotime();
|
$fStopped = microtime(true);
|
||||||
$fDuration = $fStopped - $this->m_fStarted;
|
$fDuration = $fStopped - $this->m_fStarted;
|
||||||
$aCallstack = [];
|
$aCallstack = [];
|
||||||
if (self::$m_bGenerateLegacyReport) {
|
if (self::$m_bGenerateLegacyReport) {
|
||||||
if (self::$m_bBlameCaller) {
|
if (self::$m_bBlameCaller) {
|
||||||
$aCallstack = MyHelpers::get_callstack(1);
|
$aCallstack = MyHelpers::get_callstack(1);
|
||||||
self::$m_aStats[$sOperation][$sArguments][] = [
|
self::$m_aStats[$sOperation][$sArguments][] = [
|
||||||
'time' => $fDuration,
|
'time' => $fDuration,
|
||||||
'callers' => $aCallstack,
|
'callers' => $aCallstack,
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
self::$m_aStats[$sOperation][$sArguments][] = [
|
self::$m_aStats[$sOperation][$sArguments][] = [
|
||||||
'time' => $fDuration,
|
'time' => $fDuration,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$aCallstack = ['callstack' => $this->GetCallStack()];
|
||||||
}
|
}
|
||||||
|
|
||||||
$iInitialMemory = is_null($this->m_iInitialMemory) ? 0 : $this->m_iInitialMemory;
|
$iInitialMemory = is_null($this->m_iInitialMemory) ? 0 : $this->m_iInitialMemory;
|
||||||
@@ -448,33 +490,45 @@ class ExecutionKPI
|
|||||||
$iPeakMemory = self::memory_get_peak_usage();
|
$iPeakMemory = self::memory_get_peak_usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoke extensions to log the KPI operation
|
if (static::$bMetamodelStarted) {
|
||||||
/** @var \iKPILoggerExtension $oExtensionInstance */
|
foreach (static::$aBootstrapOperations as $oLog) {
|
||||||
foreach (MetaModel::EnumPlugins('iKPILoggerExtension') as $oExtensionInstance) {
|
$this->LogOperation($oLog);
|
||||||
//$sExtension = ModuleService::GetInstance()->GetModuleNameFromCallStack(1);
|
}
|
||||||
$sExtension = '';
|
static::$aBootstrapOperations = [];
|
||||||
$oKPILogData = new KpiLogData(
|
$oKPILogData = new KpiLogData(
|
||||||
KpiLogData::TYPE_STATS,
|
KpiLogData::TYPE_STATS,
|
||||||
$sOperation,
|
$sOperation,
|
||||||
$sArguments,
|
$sArguments,
|
||||||
$this->m_fStarted,
|
$this->m_fStarted,
|
||||||
$fStopped,
|
$fStopped,
|
||||||
$sExtension,
|
'',
|
||||||
$iInitialMemory,
|
$iInitialMemory,
|
||||||
$iCurrentMemory,
|
$iCurrentMemory,
|
||||||
$iPeakMemory,
|
$iPeakMemory,
|
||||||
$aCallstack
|
$aCallstack
|
||||||
);
|
);
|
||||||
$oExtensionInstance->LogOperation($oKPILogData);
|
$this->LogOperation($oKPILogData);
|
||||||
|
} else {
|
||||||
|
$oKPILogData = new KpiLogData(
|
||||||
|
KpiLogData::TYPE_STATS,
|
||||||
|
$sOperation,
|
||||||
|
$sArguments,
|
||||||
|
$this->m_fStarted,
|
||||||
|
$fStopped,
|
||||||
|
'',
|
||||||
|
$iInitialMemory,
|
||||||
|
$iCurrentMemory,
|
||||||
|
$iPeakMemory,
|
||||||
|
$aCallstack
|
||||||
|
);
|
||||||
|
static::$aBootstrapOperations[] = $oKPILogData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function ResetCounters()
|
protected function ResetCounters()
|
||||||
{
|
{
|
||||||
if (self::$m_bEnabled_Duration) {
|
$this->m_fStarted = microtime(true);
|
||||||
$this->m_fStarted = microtime(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self::$m_bEnabled_Memory) {
|
if (self::$m_bEnabled_Memory) {
|
||||||
$this->m_iInitialMemory = self::memory_get_usage();
|
$this->m_iInitialMemory = self::memory_get_usage();
|
||||||
@@ -503,7 +557,33 @@ class ExecutionKPI
|
|||||||
if (function_exists('memory_get_peak_usage')) {
|
if (function_exists('memory_get_peak_usage')) {
|
||||||
return memory_get_peak_usage($bRealUsage);
|
return memory_get_peak_usage($bRealUsage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PHP > 5.2.1 - this verb depends on a compilation option
|
// PHP > 5.2.1 - this verb depends on a compilation option
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ModuleHandlerApiInterface methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static function OnMetaModelStarted()
|
||||||
|
{
|
||||||
|
static::$bMetamodelStarted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function RegisterEventsAndListeners()
|
||||||
|
{
|
||||||
|
EventService::RegisterListener(ApplicationEvents::APPLICATION_EVENT_METAMODEL_STARTED, [$this, 'OnMetaModelStarted']);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function GetCallStack(): string
|
||||||
|
{
|
||||||
|
$aCallStack = MyHelpers::get_callstack(2);
|
||||||
|
$sCallStack = "Call stack:\n";
|
||||||
|
foreach ($aCallStack as $index => $aLine) {
|
||||||
|
$sCallStack .= "#$index ".$aLine['File'].'('.$aLine['Line'].'): '.$aLine['Function']."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sCallStack;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -691,6 +691,28 @@ abstract class LogAPI
|
|||||||
static::$m_oMockMetaModelConfig = $oMetaModelConfig;
|
static::$m_oMockMetaModelConfig = $oMetaModelConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function Exception(string $sMessage, throwable $oException, string $sChannel = null, array $aContext = []): void
|
||||||
|
{
|
||||||
|
$aErrorLogs = [];
|
||||||
|
$aErrorLogs[] = static::PrepareErrorLog($sMessage, $oException, $aContext);
|
||||||
|
$oException = $oException->getPrevious();
|
||||||
|
while ($oException !== null) {
|
||||||
|
$aErrorLogs[] = static::PrepareErrorLog($oException->getMessage(), $oException, $aContext, true);
|
||||||
|
$oException = $oException->getPrevious();
|
||||||
|
}
|
||||||
|
$aErrorLogs = array_reverse($aErrorLogs);
|
||||||
|
foreach ($aErrorLogs as $aErrorLog) {
|
||||||
|
static::Error($aErrorLog['message'], $sChannel, $aErrorLog['context']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function PrepareErrorLog(string $sMessage, throwable $oException, array $aContext, bool $isPrevious = false): array
|
||||||
|
{
|
||||||
|
$aContext['Error Message'] = $oException->getMessage();
|
||||||
|
$aContext['Stack Trace'] = $oException->getTraceAsString();
|
||||||
|
return ['message' => ($isPrevious ? "Previous " : '')."Exception: $sMessage", 'context' => $aContext];
|
||||||
|
}
|
||||||
|
|
||||||
public static function Error($sMessage, $sChannel = null, $aContext = [])
|
public static function Error($sMessage, $sChannel = null, $aContext = [])
|
||||||
{
|
{
|
||||||
static::Log(self::LEVEL_ERROR, $sMessage, $sChannel, $aContext);
|
static::Log(self::LEVEL_ERROR, $sMessage, $sChannel, $aContext);
|
||||||
|
|||||||
@@ -55,6 +55,11 @@ abstract class ModelReflection
|
|||||||
abstract public function GetFiltersList($sClass);
|
abstract public function GetFiltersList($sClass);
|
||||||
abstract public function IsValidFilterCode($sClass, $sFilterCode);
|
abstract public function IsValidFilterCode($sClass, $sFilterCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 3.3.0
|
||||||
|
*/
|
||||||
|
abstract public function IsAbstract($sClass): bool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $sOQL
|
* @param string $sOQL
|
||||||
*
|
*
|
||||||
@@ -148,7 +153,7 @@ class ModelReflectionRuntime extends ModelReflection
|
|||||||
$sAttributeClass = get_class($oAttDef);
|
$sAttributeClass = get_class($oAttDef);
|
||||||
if ($aScope != null) {
|
if ($aScope != null) {
|
||||||
foreach ($aScope as $sScopeClass) {
|
foreach ($aScope as $sScopeClass) {
|
||||||
if (($sAttributeClass == $sScopeClass) || is_subclass_of($sAttributeClass, $sScopeClass)) {
|
if (is_a($sAttributeClass, $sScopeClass, true)) {
|
||||||
$aAttributes[$sAttCode] = $sAttributeClass;
|
$aAttributes[$sAttCode] = $sAttributeClass;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -230,6 +235,11 @@ class ModelReflectionRuntime extends ModelReflection
|
|||||||
return MetaModel::IsValidFilterCode($sClass, $sFilterCode);
|
return MetaModel::IsValidFilterCode($sClass, $sFilterCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function IsAbstract($sClass): bool
|
||||||
|
{
|
||||||
|
return MetaModel::IsAbstract($sClass);
|
||||||
|
}
|
||||||
|
|
||||||
public function GetQuery($sOQL)
|
public function GetQuery($sOQL)
|
||||||
{
|
{
|
||||||
return new QueryReflectionRuntime($sOQL, $this);
|
return new QueryReflectionRuntime($sOQL, $this);
|
||||||
|
|||||||
@@ -1656,7 +1656,7 @@ class PHP_ParserGenerator_Data
|
|||||||
function emit_code($out, PHP_ParserGenerator_Rule $rp, &$lineno)
|
function emit_code($out, PHP_ParserGenerator_Rule $rp, &$lineno)
|
||||||
{
|
{
|
||||||
$linecnt = 0;
|
$linecnt = 0;
|
||||||
|
|
||||||
/* Generate code to do the reduce action */
|
/* Generate code to do the reduce action */
|
||||||
if ($rp->code) {
|
if ($rp->code) {
|
||||||
$this->tplt_linedir($out, $rp->line, $this->filename);
|
$this->tplt_linedir($out, $rp->line, $this->filename);
|
||||||
|
|||||||
@@ -2103,12 +2103,18 @@ class VariableExpression extends UnaryExpression
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Evaluate the value of the expression
|
* Evaluate the value of the expression
|
||||||
|
*
|
||||||
* @param array $aArgs
|
* @param array $aArgs
|
||||||
* @throws \Exception if terms cannot be evaluated as scalars
|
*
|
||||||
*/
|
* @return mixed
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
*/
|
||||||
public function Evaluate(array $aArgs)
|
public function Evaluate(array $aArgs)
|
||||||
{
|
{
|
||||||
throw new Exception('not implemented yet');
|
if (!isset($aArgs[$this->m_sName])) {
|
||||||
|
throw new MissingQueryArgument('Missing variable expression argument', array('expecting'=>$this->m_sName));
|
||||||
|
}
|
||||||
|
return $aArgs[$this->m_sName];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1084,7 +1084,7 @@ static public $yy_action = array(
|
|||||||
function yy_find_shift_action($iLookAhead)
|
function yy_find_shift_action($iLookAhead)
|
||||||
{
|
{
|
||||||
$stateno = $this->yystack[$this->yyidx]->stateno;
|
$stateno = $this->yystack[$this->yyidx]->stateno;
|
||||||
|
|
||||||
/* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
|
/* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
|
||||||
if (!isset(self::$yy_shift_ofst[$stateno])) {
|
if (!isset(self::$yy_shift_ofst[$stateno])) {
|
||||||
// no shift actions
|
// no shift actions
|
||||||
@@ -1767,7 +1767,7 @@ throw new OQLParserParseFailureException($this->m_sSourceQuery, $this->m_iLine,
|
|||||||
function yy_syntax_error($yymajor, $TOKEN)
|
function yy_syntax_error($yymajor, $TOKEN)
|
||||||
{
|
{
|
||||||
#line 25 "..\oql-parser.y"
|
#line 25 "..\oql-parser.y"
|
||||||
|
|
||||||
throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
|
throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
|
||||||
#line 1779 "..\oql-parser.php"
|
#line 1779 "..\oql-parser.php"
|
||||||
}
|
}
|
||||||
@@ -1806,7 +1806,7 @@ throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $
|
|||||||
// $yyact; /* The parser action. */
|
// $yyact; /* The parser action. */
|
||||||
// $yyendofinput; /* True if we are at the end of input */
|
// $yyendofinput; /* True if we are at the end of input */
|
||||||
$yyerrorhit = 0; /* True if yymajor has invoked an error */
|
$yyerrorhit = 0; /* True if yymajor has invoked an error */
|
||||||
|
|
||||||
/* (re)initialize the parser, if necessary */
|
/* (re)initialize the parser, if necessary */
|
||||||
if ($this->yyidx === null || $this->yyidx < 0) {
|
if ($this->yyidx === null || $this->yyidx < 0) {
|
||||||
/* if ($yymajor == 0) return; // not sure why this was here... */
|
/* if ($yymajor == 0) return; // not sure why this was here... */
|
||||||
@@ -1819,7 +1819,7 @@ throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $
|
|||||||
array_push($this->yystack, $x);
|
array_push($this->yystack, $x);
|
||||||
}
|
}
|
||||||
$yyendofinput = ($yymajor==0);
|
$yyendofinput = ($yymajor==0);
|
||||||
|
|
||||||
if (self::$yyTraceFILE) {
|
if (self::$yyTraceFILE) {
|
||||||
fprintf(
|
fprintf(
|
||||||
self::$yyTraceFILE,
|
self::$yyTraceFILE,
|
||||||
@@ -1828,7 +1828,7 @@ throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $
|
|||||||
self::$yyTokenName[$yymajor]
|
self::$yyTokenName[$yymajor]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
$yyact = $this->yy_find_shift_action($yymajor);
|
$yyact = $this->yy_find_shift_action($yymajor);
|
||||||
if ($yymajor < self::YYERRORSYMBOL
|
if ($yymajor < self::YYERRORSYMBOL
|
||||||
@@ -2002,7 +2002,7 @@ class OQLParser extends OQLParserRaw
|
|||||||
$this->m_sSourceQuery = $sQuery;
|
$this->m_sSourceQuery = $sQuery;
|
||||||
// no constructor - parent::__construct();
|
// no constructor - parent::__construct();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function doParse($token, $value, $iCurrPosition = 0)
|
public function doParse($token, $value, $iCurrPosition = 0)
|
||||||
{
|
{
|
||||||
$this->m_iColPrev = $this->m_iCol;
|
$this->m_iColPrev = $this->m_iCol;
|
||||||
@@ -2016,7 +2016,7 @@ class OQLParser extends OQLParserRaw
|
|||||||
$this->doParse(0, 0);
|
$this->doParse(0, 0);
|
||||||
return $this->my_result;
|
return $this->my_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
// Bug in the original destructor, causing an infinite loop !
|
// Bug in the original destructor, causing an infinite loop !
|
||||||
|
|||||||
@@ -72,9 +72,15 @@ class OQLException extends CoreException
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$sExpectations = '{'.implode(', ', $this->m_aExpecting).'}';
|
$sMessage = "$sIssue - found '{$this->m_sUnexpected}' at $iCol in '$sInput'";
|
||||||
|
if (count($this->m_aExpecting) < 30) {
|
||||||
|
$sExpectations = '{'.implode(', ', $this->m_aExpecting).'}';
|
||||||
|
$sMessage .= ', expecting '.json_encode($sExpectations);
|
||||||
|
}
|
||||||
$sSuggest = self::FindClosestString($this->m_sUnexpected, $this->m_aExpecting);
|
$sSuggest = self::FindClosestString($this->m_sUnexpected, $this->m_aExpecting);
|
||||||
$sMessage = "$sIssue - found '{$this->m_sUnexpected}' at $iCol in '$sInput', expecting $sExpectations, I would suggest to use '$sSuggest'";
|
if (strlen($sSuggest) > 0) {
|
||||||
|
$sMessage .= ", I would suggest to use ".json_encode($sSuggest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure everything is assigned properly
|
// make sure everything is assigned properly
|
||||||
@@ -155,5 +161,3 @@ class OQLException extends CoreException
|
|||||||
return $sRet;
|
return $sRet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
|
||||||
|
|||||||
@@ -57,15 +57,15 @@ class OqlName
|
|||||||
{
|
{
|
||||||
return $this->m_iPos;
|
return $this->m_iPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
return $this->m_sValue;
|
return $this->m_sValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Store hexadecimal values as strings so that we can support 64-bit values
|
* Store hexadecimal values as strings so that we can support 64-bit values
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -77,12 +77,12 @@ class OqlHexValue
|
|||||||
{
|
{
|
||||||
$this->m_sValue = $sValue;
|
$this->m_sValue = $sValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
return $this->m_sValue;
|
return $this->m_sValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class OqlJoinSpec
|
class OqlJoinSpec
|
||||||
@@ -109,6 +109,7 @@ class OqlJoinSpec
|
|||||||
{
|
{
|
||||||
return $this->m_oClass->GetValue();
|
return $this->m_oClass->GetValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetClassAlias()
|
public function GetClassAlias()
|
||||||
{
|
{
|
||||||
return $this->m_oClassAlias->GetValue();
|
return $this->m_oClassAlias->GetValue();
|
||||||
@@ -118,6 +119,7 @@ class OqlJoinSpec
|
|||||||
{
|
{
|
||||||
return $this->m_oClass;
|
return $this->m_oClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetClassAliasDetails()
|
public function GetClassAliasDetails()
|
||||||
{
|
{
|
||||||
return $this->m_oClassAlias;
|
return $this->m_oClassAlias;
|
||||||
@@ -127,10 +129,12 @@ class OqlJoinSpec
|
|||||||
{
|
{
|
||||||
return $this->m_oLeftField;
|
return $this->m_oLeftField;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetRightField()
|
public function GetRightField()
|
||||||
{
|
{
|
||||||
return $this->m_oRightField;
|
return $this->m_oRightField;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetOperator()
|
public function GetOperator()
|
||||||
{
|
{
|
||||||
return $this->m_sOperator;
|
return $this->m_sOperator;
|
||||||
@@ -146,8 +150,9 @@ interface CheckableExpression
|
|||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
* @param array $aAliases Aliases to class names (for the current query)
|
* @param array $aAliases Aliases to class names (for the current query)
|
||||||
* @param string $sSourceQuery For the reporting
|
* @param string $sSourceQuery For the reporting
|
||||||
|
*
|
||||||
* @throws OqlNormalizeException
|
* @throws OqlNormalizeException
|
||||||
*/
|
*/
|
||||||
public function Check(ModelReflection $oModelReflection, $aAliases, $sSourceQuery);
|
public function Check(ModelReflection $oModelReflection, $aAliases, $sSourceQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,13 +173,11 @@ class MatchOqlExpression extends MatchExpression implements CheckableExpression
|
|||||||
$this->m_oRightExpr->Check($oModelReflection, $aAliases, $sSourceQuery);
|
$this->m_oRightExpr->Check($oModelReflection, $aAliases, $sSourceQuery);
|
||||||
|
|
||||||
// Only field MATCHES scalar is allowed
|
// Only field MATCHES scalar is allowed
|
||||||
if (!$this->m_oLeftExpr instanceof FieldExpression)
|
if (!$this->m_oLeftExpr instanceof FieldExpression) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Only "field MATCHES string" syntax is allowed', $sSourceQuery, new OqlName($this->m_oLeftExpr->RenderExpression(true), 0));
|
throw new OqlNormalizeException('Only "field MATCHES string" syntax is allowed', $sSourceQuery, new OqlName($this->m_oLeftExpr->RenderExpression(true), 0));
|
||||||
}
|
}
|
||||||
// Only field MATCHES scalar is allowed
|
// Only field MATCHES scalar is allowed
|
||||||
if (!$this->m_oRightExpr instanceof ScalarExpression && !$this->m_oRightExpr instanceof VariableOqlExpression)
|
if (!$this->m_oRightExpr instanceof ScalarExpression && !$this->m_oRightExpr instanceof VariableOqlExpression) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Only "field MATCHES string" syntax is allowed', $sSourceQuery, new OqlName($this->m_oRightExpr->RenderExpression(true), 0));
|
throw new OqlNormalizeException('Only "field MATCHES string" syntax is allowed', $sSourceQuery, new OqlName($this->m_oRightExpr->RenderExpression(true), 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -198,7 +201,7 @@ class NestedQueryOqlExpression extends NestedQueryExpression implements Checkabl
|
|||||||
*
|
*
|
||||||
* @param OQLObjectQuery $oOQLObjectQuery
|
* @param OQLObjectQuery $oOQLObjectQuery
|
||||||
*/
|
*/
|
||||||
public function __construct($oOQLObjectQuery )
|
public function __construct($oOQLObjectQuery)
|
||||||
{
|
{
|
||||||
parent::__construct($oOQLObjectQuery->ToDBSearch(""));
|
parent::__construct($oOQLObjectQuery->ToDBSearch(""));
|
||||||
$this->m_oOQLObjectQuery = $oOQLObjectQuery;
|
$this->m_oOQLObjectQuery = $oOQLObjectQuery;
|
||||||
@@ -232,8 +235,7 @@ class FieldOqlExpression extends FieldExpression implements CheckableExpression
|
|||||||
|
|
||||||
public function __construct($oName, $oParent = null)
|
public function __construct($oName, $oParent = null)
|
||||||
{
|
{
|
||||||
if (is_null($oParent))
|
if (is_null($oParent)) {
|
||||||
{
|
|
||||||
$oParent = new OqlName('', 0);
|
$oParent = new OqlName('', 0);
|
||||||
}
|
}
|
||||||
$this->m_oParent = $oParent;
|
$this->m_oParent = $oParent;
|
||||||
@@ -256,37 +258,28 @@ class FieldOqlExpression extends FieldExpression implements CheckableExpression
|
|||||||
{
|
{
|
||||||
$sClassAlias = $this->GetParent();
|
$sClassAlias = $this->GetParent();
|
||||||
$sFltCode = $this->GetName();
|
$sFltCode = $this->GetName();
|
||||||
if (empty($sClassAlias))
|
if (empty($sClassAlias)) {
|
||||||
{
|
|
||||||
// Try to find an alias
|
// Try to find an alias
|
||||||
// Build an array of field => array of aliases
|
// Build an array of field => array of aliases
|
||||||
$aFieldClasses = array();
|
$aFieldClasses = array();
|
||||||
foreach($aAliases as $sAlias => $sReal)
|
foreach ($aAliases as $sAlias => $sReal) {
|
||||||
{
|
foreach ($oModelReflection->GetFiltersList($sReal) as $sAnFltCode) {
|
||||||
foreach($oModelReflection->GetFiltersList($sReal) as $sAnFltCode)
|
|
||||||
{
|
|
||||||
$aFieldClasses[$sAnFltCode][] = $sAlias;
|
$aFieldClasses[$sAnFltCode][] = $sAlias;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!array_key_exists($sFltCode, $aFieldClasses))
|
if (!array_key_exists($sFltCode, $aFieldClasses)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown filter code', $sSourceQuery, $this->GetNameDetails(), array_keys($aFieldClasses));
|
throw new OqlNormalizeException('Unknown filter code', $sSourceQuery, $this->GetNameDetails(), array_keys($aFieldClasses));
|
||||||
}
|
}
|
||||||
if (count($aFieldClasses[$sFltCode]) > 1)
|
if (count($aFieldClasses[$sFltCode]) > 1) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Ambiguous filter code', $sSourceQuery, $this->GetNameDetails());
|
throw new OqlNormalizeException('Ambiguous filter code', $sSourceQuery, $this->GetNameDetails());
|
||||||
}
|
}
|
||||||
$sClassAlias = $aFieldClasses[$sFltCode][0];
|
$sClassAlias = $aFieldClasses[$sFltCode][0];
|
||||||
}
|
} else {
|
||||||
else
|
if (!array_key_exists($sClassAlias, $aAliases)) {
|
||||||
{
|
|
||||||
if (!array_key_exists($sClassAlias, $aAliases))
|
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown class [alias]', $sSourceQuery, $this->GetParentDetails(), array_keys($aAliases));
|
throw new OqlNormalizeException('Unknown class [alias]', $sSourceQuery, $this->GetParentDetails(), array_keys($aAliases));
|
||||||
}
|
}
|
||||||
$sClass = $aAliases[$sClassAlias];
|
$sClass = $aAliases[$sClassAlias];
|
||||||
if (!$oModelReflection->IsValidFilterCode($sClass, $sFltCode))
|
if (!$oModelReflection->IsValidFilterCode($sClass, $sFltCode)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown filter code', $sSourceQuery, $this->GetNameDetails(), $oModelReflection->GetFiltersList($sClass));
|
throw new OqlNormalizeException('Unknown filter code', $sSourceQuery, $this->GetNameDetails(), $oModelReflection->GetFiltersList($sClass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,8 +298,7 @@ class ListOqlExpression extends ListExpression implements CheckableExpression
|
|||||||
{
|
{
|
||||||
public function Check(ModelReflection $oModelReflection, $aAliases, $sSourceQuery)
|
public function Check(ModelReflection $oModelReflection, $aAliases, $sSourceQuery)
|
||||||
{
|
{
|
||||||
foreach ($this->GetItems() as $oItemExpression)
|
foreach ($this->GetItems() as $oItemExpression) {
|
||||||
{
|
|
||||||
$oItemExpression->Check($oModelReflection, $aAliases, $sSourceQuery);
|
$oItemExpression->Check($oModelReflection, $aAliases, $sSourceQuery);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -316,8 +308,7 @@ class FunctionOqlExpression extends FunctionExpression implements CheckableExpre
|
|||||||
{
|
{
|
||||||
public function Check(ModelReflection $oModelReflection, $aAliases, $sSourceQuery)
|
public function Check(ModelReflection $oModelReflection, $aAliases, $sSourceQuery)
|
||||||
{
|
{
|
||||||
foreach ($this->GetArgs() as $oArgExpression)
|
foreach ($this->GetArgs() as $oArgExpression) {
|
||||||
{
|
|
||||||
$oArgExpression->Check($oModelReflection, $aAliases, $sSourceQuery);
|
$oArgExpression->Check($oModelReflection, $aAliases, $sSourceQuery);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -350,6 +341,7 @@ abstract class OqlQuery
|
|||||||
* Determine the class
|
* Determine the class
|
||||||
*
|
*
|
||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
@@ -392,6 +384,7 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
* Determine the class
|
* Determine the class
|
||||||
*
|
*
|
||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
@@ -415,6 +408,7 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
{
|
{
|
||||||
return $this->m_oClass;
|
return $this->m_oClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetClassAliasDetails()
|
public function GetClassAliasDetails()
|
||||||
{
|
{
|
||||||
return $this->m_oClassAlias;
|
return $this->m_oClassAlias;
|
||||||
@@ -424,6 +418,7 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
{
|
{
|
||||||
return $this->m_aJoins;
|
return $this->m_aJoins;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetCondition()
|
public function GetCondition()
|
||||||
{
|
{
|
||||||
return $this->m_oCondition;
|
return $this->m_oCondition;
|
||||||
@@ -432,44 +427,37 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
/**
|
/**
|
||||||
* Recursively check the validity of the expression with regard to the data model
|
* Recursively check the validity of the expression with regard to the data model
|
||||||
* and the query in which it is used
|
* and the query in which it is used
|
||||||
*
|
*
|
||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
|
*
|
||||||
* @throws OqlNormalizeException
|
* @throws OqlNormalizeException
|
||||||
*/
|
*/
|
||||||
public function Check(ModelReflection $oModelReflection, $sSourceQuery, $aParentAliases = array())
|
public function Check(ModelReflection $oModelReflection, $sSourceQuery, $aParentAliases = array())
|
||||||
{
|
{
|
||||||
$sClass = $this->GetClass($oModelReflection);
|
$sClass = $this->GetClass($oModelReflection);
|
||||||
$sClassAlias = $this->GetClassAlias();
|
$sClassAlias = $this->GetClassAlias();
|
||||||
|
|
||||||
if (!$oModelReflection->IsValidClass($sClass))
|
if (!$oModelReflection->IsValidClass($sClass)) {
|
||||||
{
|
|
||||||
throw new UnknownClassOqlException($sSourceQuery, $this->GetClassDetails(), $oModelReflection->GetClasses());
|
throw new UnknownClassOqlException($sSourceQuery, $this->GetClassDetails(), $oModelReflection->GetClasses());
|
||||||
}
|
}
|
||||||
|
|
||||||
$aAliases = array_merge(array($sClassAlias => $sClass),$aParentAliases);
|
$aAliases = array_merge(array($sClassAlias => $sClass), $aParentAliases);
|
||||||
|
|
||||||
$aJoinSpecs = $this->GetJoins();
|
$aJoinSpecs = $this->GetJoins();
|
||||||
if (is_array($aJoinSpecs))
|
if (is_array($aJoinSpecs)) {
|
||||||
{
|
foreach ($aJoinSpecs as $oJoinSpec) {
|
||||||
foreach ($aJoinSpecs as $oJoinSpec)
|
|
||||||
{
|
|
||||||
$sJoinClass = $oJoinSpec->GetClass();
|
$sJoinClass = $oJoinSpec->GetClass();
|
||||||
$sJoinClassAlias = $oJoinSpec->GetClassAlias();
|
$sJoinClassAlias = $oJoinSpec->GetClassAlias();
|
||||||
if (!$oModelReflection->IsValidClass($sJoinClass))
|
if (!$oModelReflection->IsValidClass($sJoinClass)) {
|
||||||
{
|
|
||||||
throw new UnknownClassOqlException($sSourceQuery, $oJoinSpec->GetClassDetails(), $oModelReflection->GetClasses());
|
throw new UnknownClassOqlException($sSourceQuery, $oJoinSpec->GetClassDetails(), $oModelReflection->GetClasses());
|
||||||
}
|
}
|
||||||
if (array_key_exists($sJoinClassAlias, $aAliases))
|
if (array_key_exists($sJoinClassAlias, $aAliases)) {
|
||||||
{
|
if ($sJoinClassAlias != $sJoinClass) {
|
||||||
if ($sJoinClassAlias != $sJoinClass)
|
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Duplicate class alias', $sSourceQuery, $oJoinSpec->GetClassAliasDetails());
|
throw new OqlNormalizeException('Duplicate class alias', $sSourceQuery, $oJoinSpec->GetClassAliasDetails());
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Duplicate class name', $sSourceQuery, $oJoinSpec->GetClassDetails());
|
throw new OqlNormalizeException('Duplicate class name', $sSourceQuery, $oJoinSpec->GetClassDetails());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assumption: ext key on the left only !!!
|
// Assumption: ext key on the left only !!!
|
||||||
// normalization should take care of this
|
// normalization should take care of this
|
||||||
@@ -480,85 +468,74 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
$oRightField = $oJoinSpec->GetRightField();
|
$oRightField = $oJoinSpec->GetRightField();
|
||||||
$sToClass = $oRightField->GetParent();
|
$sToClass = $oRightField->GetParent();
|
||||||
$sPKeyDescriptor = $oRightField->GetName();
|
$sPKeyDescriptor = $oRightField->GetName();
|
||||||
if ($sPKeyDescriptor != 'id')
|
if ($sPKeyDescriptor != 'id') {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Wrong format for Join clause (right hand), expecting an id', $sSourceQuery, $oRightField->GetNameDetails(), array('id'));
|
throw new OqlNormalizeException('Wrong format for Join clause (right hand), expecting an id', $sSourceQuery, $oRightField->GetNameDetails(), array('id'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$aAliases[$sJoinClassAlias] = $sJoinClass;
|
$aAliases[$sJoinClassAlias] = $sJoinClass;
|
||||||
|
|
||||||
if (!array_key_exists($sFromClass, $aAliases))
|
if (!array_key_exists($sFromClass, $aAliases)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown class in join condition (left expression)', $sSourceQuery, $oLeftField->GetParentDetails(), array_keys($aAliases));
|
throw new OqlNormalizeException('Unknown class in join condition (left expression)', $sSourceQuery, $oLeftField->GetParentDetails(), array_keys($aAliases));
|
||||||
}
|
}
|
||||||
if (!array_key_exists($sToClass, $aAliases))
|
if (!array_key_exists($sToClass, $aAliases)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown class in join condition (right expression)', $sSourceQuery, $oRightField->GetParentDetails(), array_keys($aAliases));
|
throw new OqlNormalizeException('Unknown class in join condition (right expression)', $sSourceQuery, $oRightField->GetParentDetails(), array_keys($aAliases));
|
||||||
}
|
}
|
||||||
$aExtKeys = $oModelReflection->ListAttributes($aAliases[$sFromClass], \Combodo\iTop\Core\AttributeDefinition\AttributeExternalKey::class);
|
$aExtKeys = $oModelReflection->ListAttributes($aAliases[$sFromClass], \Combodo\iTop\Core\AttributeDefinition\AttributeExternalKey::class);
|
||||||
$aObjKeys = $oModelReflection->ListAttributes($aAliases[$sFromClass], \Combodo\iTop\Core\AttributeDefinition\AttributeObjectKey::class);
|
$aObjKeys = $oModelReflection->ListAttributes($aAliases[$sFromClass], \Combodo\iTop\Core\AttributeDefinition\AttributeObjectKey::class);
|
||||||
$aAllKeys = array_merge($aExtKeys, $aObjKeys);
|
$aAllKeys = array_merge($aExtKeys, $aObjKeys);
|
||||||
if (!array_key_exists($sExtKeyAttCode, $aAllKeys))
|
if (!array_key_exists($sExtKeyAttCode, $aAllKeys)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown key in join condition (left expression)', $sSourceQuery, $oLeftField->GetNameDetails(), array_keys($aAllKeys));
|
throw new OqlNormalizeException('Unknown key in join condition (left expression)', $sSourceQuery, $oLeftField->GetNameDetails(), array_keys($aAllKeys));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($sFromClass == $sJoinClassAlias)
|
if ($sFromClass == $sJoinClassAlias) {
|
||||||
{
|
|
||||||
if (array_key_exists($sExtKeyAttCode, $aExtKeys)) // Skip that check for object keys
|
if (array_key_exists($sExtKeyAttCode, $aExtKeys)) // Skip that check for object keys
|
||||||
{
|
{
|
||||||
$sTargetClass = $oModelReflection->GetAttributeProperty($aAliases[$sFromClass], $sExtKeyAttCode, 'targetclass');
|
$sTargetClass = $oModelReflection->GetAttributeProperty($aAliases[$sFromClass], $sExtKeyAttCode, 'targetclass');
|
||||||
if(!$oModelReflection->IsSameFamilyBranch($aAliases[$sToClass], $sTargetClass))
|
if (!$oModelReflection->IsSameFamilyBranch($aAliases[$sToClass], $sTargetClass)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException("The joined class ($aAliases[$sFromClass]) is not compatible with the external key, which is pointing to $sTargetClass", $sSourceQuery, $oLeftField->GetNameDetails());
|
throw new OqlNormalizeException("The joined class ($aAliases[$sFromClass]) is not compatible with the external key, which is pointing to $sTargetClass", $sSourceQuery, $oLeftField->GetNameDetails());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$sOperator = $oJoinSpec->GetOperator();
|
$sOperator = $oJoinSpec->GetOperator();
|
||||||
switch($sOperator)
|
switch ($sOperator) {
|
||||||
{
|
|
||||||
case '=':
|
case '=':
|
||||||
$iOperatorCode = TREE_OPERATOR_EQUALS;
|
$iOperatorCode = TREE_OPERATOR_EQUALS;
|
||||||
break;
|
break;
|
||||||
case 'BELOW':
|
case 'BELOW':
|
||||||
$iOperatorCode = TREE_OPERATOR_BELOW;
|
$iOperatorCode = TREE_OPERATOR_BELOW;
|
||||||
break;
|
break;
|
||||||
case 'BELOW_STRICT':
|
case 'BELOW_STRICT':
|
||||||
$iOperatorCode = TREE_OPERATOR_BELOW_STRICT;
|
$iOperatorCode = TREE_OPERATOR_BELOW_STRICT;
|
||||||
break;
|
break;
|
||||||
case 'NOT_BELOW':
|
case 'NOT_BELOW':
|
||||||
$iOperatorCode = TREE_OPERATOR_NOT_BELOW;
|
$iOperatorCode = TREE_OPERATOR_NOT_BELOW;
|
||||||
break;
|
break;
|
||||||
case 'NOT_BELOW_STRICT':
|
case 'NOT_BELOW_STRICT':
|
||||||
$iOperatorCode = TREE_OPERATOR_NOT_BELOW_STRICT;
|
$iOperatorCode = TREE_OPERATOR_NOT_BELOW_STRICT;
|
||||||
break;
|
break;
|
||||||
case 'ABOVE':
|
case 'ABOVE':
|
||||||
$iOperatorCode = TREE_OPERATOR_ABOVE;
|
$iOperatorCode = TREE_OPERATOR_ABOVE;
|
||||||
break;
|
break;
|
||||||
case 'ABOVE_STRICT':
|
case 'ABOVE_STRICT':
|
||||||
$iOperatorCode = TREE_OPERATOR_ABOVE_STRICT;
|
$iOperatorCode = TREE_OPERATOR_ABOVE_STRICT;
|
||||||
break;
|
break;
|
||||||
case 'NOT_ABOVE':
|
case 'NOT_ABOVE':
|
||||||
$iOperatorCode = TREE_OPERATOR_NOT_ABOVE;
|
$iOperatorCode = TREE_OPERATOR_NOT_ABOVE;
|
||||||
break;
|
break;
|
||||||
case 'NOT_ABOVE_STRICT':
|
case 'NOT_ABOVE_STRICT':
|
||||||
$iOperatorCode = TREE_OPERATOR_NOT_ABOVE_STRICT;
|
$iOperatorCode = TREE_OPERATOR_NOT_ABOVE_STRICT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (array_key_exists($sExtKeyAttCode, $aExtKeys)) // Skip that check for object keys
|
if (array_key_exists($sExtKeyAttCode, $aExtKeys)) // Skip that check for object keys
|
||||||
{
|
{
|
||||||
$sTargetClass = $oModelReflection->GetAttributeProperty($aAliases[$sFromClass], $sExtKeyAttCode, 'targetclass');
|
$sTargetClass = $oModelReflection->GetAttributeProperty($aAliases[$sFromClass], $sExtKeyAttCode, 'targetclass');
|
||||||
if(!$oModelReflection->IsSameFamilyBranch($aAliases[$sToClass], $sTargetClass))
|
if (!$oModelReflection->IsSameFamilyBranch($aAliases[$sToClass], $sTargetClass)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException("The joined class ($aAliases[$sToClass]) is not compatible with the external key, which is pointing to $sTargetClass", $sSourceQuery, $oLeftField->GetNameDetails());
|
throw new OqlNormalizeException("The joined class ($aAliases[$sToClass]) is not compatible with the external key, which is pointing to $sTargetClass", $sSourceQuery, $oLeftField->GetNameDetails());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$aAttList = $oModelReflection->ListAttributes($aAliases[$sFromClass]);
|
$aAttList = $oModelReflection->ListAttributes($aAliases[$sFromClass]);
|
||||||
$sAttType = $aAttList[$sExtKeyAttCode];
|
$sAttType = $aAttList[$sExtKeyAttCode];
|
||||||
if(($iOperatorCode != TREE_OPERATOR_EQUALS) && !is_subclass_of($sAttType, \Combodo\iTop\Core\AttributeDefinition\AttributeHierarchicalKey::class) && ($sAttType != \Combodo\iTop\Core\AttributeDefinition\AttributeHierarchicalKey::class))
|
if (($iOperatorCode != TREE_OPERATOR_EQUALS) && !is_a($sAttType, \Combodo\iTop\Core\AttributeDefinition\AttributeHierarchicalKey::class, true)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException("The specified tree operator $sOperator is not applicable to the key", $sSourceQuery, $oLeftField->GetNameDetails());
|
throw new OqlNormalizeException("The specified tree operator $sOperator is not applicable to the key", $sSourceQuery, $oLeftField->GetNameDetails());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -567,26 +544,23 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
|
|
||||||
// Check the select information
|
// Check the select information
|
||||||
//
|
//
|
||||||
foreach ($this->GetSelectedClasses() as $oClassDetails)
|
foreach ($this->GetSelectedClasses() as $oClassDetails) {
|
||||||
{
|
|
||||||
$sClassToSelect = $oClassDetails->GetValue();
|
$sClassToSelect = $oClassDetails->GetValue();
|
||||||
if (!array_key_exists($sClassToSelect, $aAliases))
|
if (!array_key_exists($sClassToSelect, $aAliases)) {
|
||||||
{
|
|
||||||
throw new OqlNormalizeException('Unknown class [alias]', $sSourceQuery, $oClassDetails, array_keys($aAliases));
|
throw new OqlNormalizeException('Unknown class [alias]', $sSourceQuery, $oClassDetails, array_keys($aAliases));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the condition tree
|
// Check the condition tree
|
||||||
//
|
//
|
||||||
if ($this->m_oCondition instanceof Expression)
|
if ($this->m_oCondition instanceof Expression) {
|
||||||
{
|
|
||||||
$this->m_oCondition->Check($oModelReflection, $aAliases, $sSourceQuery);
|
$this->m_oCondition->Check($oModelReflection, $aAliases, $sSourceQuery);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make the relevant DBSearch instance (FromOQL)
|
* Make the relevant DBSearch instance (FromOQL)
|
||||||
*/
|
*/
|
||||||
public function ToDBSearch($sQuery)
|
public function ToDBSearch($sQuery)
|
||||||
{
|
{
|
||||||
$sClass = $this->GetClass(new ModelReflectionRuntime());
|
$sClass = $this->GetClass(new ModelReflectionRuntime());
|
||||||
@@ -594,6 +568,7 @@ class OqlObjectQuery extends OqlQuery
|
|||||||
|
|
||||||
$oSearch = new DBObjectSearch($sClass, $sClassAlias);
|
$oSearch = new DBObjectSearch($sClass, $sClassAlias);
|
||||||
$oSearch->InitFromOqlQuery($this, $sQuery);
|
$oSearch->InitFromOqlQuery($this, $sQuery);
|
||||||
|
|
||||||
return $oSearch;
|
return $oSearch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -606,19 +581,15 @@ class OqlUnionQuery extends OqlQuery
|
|||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->aQueries[] = $oLeftQuery;
|
$this->aQueries[] = $oLeftQuery;
|
||||||
if ($oRightQueryOrUnion instanceof OqlUnionQuery)
|
if ($oRightQueryOrUnion instanceof OqlUnionQuery) {
|
||||||
{
|
foreach ($oRightQueryOrUnion->GetQueries() as $oSingleQuery) {
|
||||||
foreach ($oRightQueryOrUnion->GetQueries() as $oSingleQuery)
|
|
||||||
{
|
|
||||||
$this->aQueries[] = $oSingleQuery;
|
$this->aQueries[] = $oSingleQuery;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->aQueries[] = $oRightQueryOrUnion;
|
$this->aQueries[] = $oRightQueryOrUnion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetQueries()
|
public function GetQueries()
|
||||||
{
|
{
|
||||||
return $this->aQueries;
|
return $this->aQueries;
|
||||||
@@ -627,66 +598,54 @@ class OqlUnionQuery extends OqlQuery
|
|||||||
/**
|
/**
|
||||||
* Check the validity of the expression with regard to the data model
|
* Check the validity of the expression with regard to the data model
|
||||||
* and the query in which it is used
|
* and the query in which it is used
|
||||||
*
|
*
|
||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
|
*
|
||||||
* @throws OqlNormalizeException
|
* @throws OqlNormalizeException
|
||||||
*/
|
*/
|
||||||
public function Check(ModelReflection $oModelReflection, $sSourceQuery)
|
public function Check(ModelReflection $oModelReflection, $sSourceQuery)
|
||||||
{
|
{
|
||||||
$aColumnToClasses = array();
|
$aColumnToClasses = array();
|
||||||
foreach ($this->aQueries as $iQuery => $oQuery)
|
foreach ($this->aQueries as $iQuery => $oQuery) {
|
||||||
{
|
|
||||||
$oQuery->Check($oModelReflection, $sSourceQuery);
|
$oQuery->Check($oModelReflection, $sSourceQuery);
|
||||||
|
|
||||||
$aAliasToClass = array($oQuery->GetClassAlias() => $oQuery->GetClass($oModelReflection));
|
$aAliasToClass = array($oQuery->GetClassAlias() => $oQuery->GetClass($oModelReflection));
|
||||||
$aJoinSpecs = $oQuery->GetJoins();
|
$aJoinSpecs = $oQuery->GetJoins();
|
||||||
if (is_array($aJoinSpecs))
|
if (is_array($aJoinSpecs)) {
|
||||||
{
|
foreach ($aJoinSpecs as $oJoinSpec) {
|
||||||
foreach ($aJoinSpecs as $oJoinSpec)
|
|
||||||
{
|
|
||||||
$aAliasToClass[$oJoinSpec->GetClassAlias()] = $oJoinSpec->GetClass();
|
$aAliasToClass[$oJoinSpec->GetClassAlias()] = $oJoinSpec->GetClass();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$aSelectedClasses = $oQuery->GetSelectedClasses();
|
$aSelectedClasses = $oQuery->GetSelectedClasses();
|
||||||
if ($iQuery != 0)
|
if ($iQuery != 0) {
|
||||||
{
|
if (count($aSelectedClasses) < count($aColumnToClasses)) {
|
||||||
if (count($aSelectedClasses) < count($aColumnToClasses))
|
|
||||||
{
|
|
||||||
$oLastClass = end($aSelectedClasses);
|
$oLastClass = end($aSelectedClasses);
|
||||||
throw new OqlNormalizeException('Too few selected classes in the subquery', $sSourceQuery, $oLastClass);
|
throw new OqlNormalizeException('Too few selected classes in the subquery', $sSourceQuery, $oLastClass);
|
||||||
}
|
}
|
||||||
if (count($aSelectedClasses) > count($aColumnToClasses))
|
if (count($aSelectedClasses) > count($aColumnToClasses)) {
|
||||||
{
|
|
||||||
$oLastClass = end($aSelectedClasses);
|
$oLastClass = end($aSelectedClasses);
|
||||||
throw new OqlNormalizeException('Too many selected classes in the subquery', $sSourceQuery, $oLastClass);
|
throw new OqlNormalizeException('Too many selected classes in the subquery', $sSourceQuery, $oLastClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($aSelectedClasses as $iColumn => $oClassDetails)
|
foreach ($aSelectedClasses as $iColumn => $oClassDetails) {
|
||||||
{
|
|
||||||
$sAlias = $oClassDetails->GetValue();
|
$sAlias = $oClassDetails->GetValue();
|
||||||
$sClass = $aAliasToClass[$sAlias];
|
$sClass = $aAliasToClass[$sAlias];
|
||||||
$aColumnToClasses[$iColumn][] = array(
|
$aColumnToClasses[$iColumn][] = array(
|
||||||
'alias' => $sAlias,
|
'alias' => $sAlias,
|
||||||
'class' => $sClass,
|
'class' => $sClass,
|
||||||
'class_name' => $oClassDetails,
|
'class_name' => $oClassDetails,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($aColumnToClasses as $iColumn => $aClasses)
|
foreach ($aColumnToClasses as $iColumn => $aClasses) {
|
||||||
{
|
|
||||||
$sRootClass = null;
|
$sRootClass = null;
|
||||||
foreach ($aClasses as $iQuery => $aData)
|
foreach ($aClasses as $iQuery => $aData) {
|
||||||
{
|
if ($iQuery == 0) {
|
||||||
if ($iQuery == 0)
|
|
||||||
{
|
|
||||||
// Establish the reference
|
// Establish the reference
|
||||||
$sRootClass = $oModelReflection->GetRootClass($aData['class']);
|
$sRootClass = $oModelReflection->GetRootClass($aData['class']);
|
||||||
}
|
} else {
|
||||||
else
|
if ($oModelReflection->GetRootClass($aData['class']) != $sRootClass) {
|
||||||
{
|
|
||||||
if ($oModelReflection->GetRootClass($aData['class']) != $sRootClass)
|
|
||||||
{
|
|
||||||
$aSubclasses = $oModelReflection->EnumChildClasses($sRootClass, ENUM_CHILD_CLASSES_ALL);
|
$aSubclasses = $oModelReflection->EnumChildClasses($sRootClass, ENUM_CHILD_CLASSES_ALL);
|
||||||
throw new OqlNormalizeException('Incompatible classes: could not find a common ancestor', $sSourceQuery, $aData['class_name'], $aSubclasses);
|
throw new OqlNormalizeException('Incompatible classes: could not find a common ancestor', $sSourceQuery, $aData['class_name'], $aSubclasses);
|
||||||
}
|
}
|
||||||
@@ -699,21 +658,21 @@ class OqlUnionQuery extends OqlQuery
|
|||||||
* Determine the class
|
* Determine the class
|
||||||
*
|
*
|
||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function GetClass(ModelReflection $oModelReflection)
|
public function GetClass(ModelReflection $oModelReflection)
|
||||||
{
|
{
|
||||||
$aFirstColClasses = array();
|
$aFirstColClasses = array();
|
||||||
foreach ($this->aQueries as $iQuery => $oQuery)
|
foreach ($this->aQueries as $iQuery => $oQuery) {
|
||||||
{
|
|
||||||
$aFirstColClasses[] = $oQuery->GetClass($oModelReflection);
|
$aFirstColClasses[] = $oQuery->GetClass($oModelReflection);
|
||||||
}
|
}
|
||||||
$sClass = self::GetLowestCommonAncestor($oModelReflection, $aFirstColClasses);
|
$sClass = self::GetLowestCommonAncestor($oModelReflection, $aFirstColClasses);
|
||||||
if (is_null($sClass))
|
if (is_null($sClass)) {
|
||||||
{
|
|
||||||
throw new Exception('Could not determine the class of the union query. This issue should have been detected earlier by calling OqlQuery::Check()');
|
throw new Exception('Could not determine the class of the union query. This issue should have been detected earlier by calling OqlQuery::Check()');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sClass;
|
return $sClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -726,6 +685,7 @@ class OqlUnionQuery extends OqlQuery
|
|||||||
public function GetClassAlias()
|
public function GetClassAlias()
|
||||||
{
|
{
|
||||||
$sAlias = $this->aQueries[0]->GetClassAlias();
|
$sAlias = $this->aQueries[0]->GetClassAlias();
|
||||||
|
|
||||||
return $sAlias;
|
return $sAlias;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -735,29 +695,25 @@ class OqlUnionQuery extends OqlQuery
|
|||||||
*
|
*
|
||||||
* @param ModelReflection $oModelReflection MetaModel to consider
|
* @param ModelReflection $oModelReflection MetaModel to consider
|
||||||
* @param array $aClasses Flat list of classes
|
* @param array $aClasses Flat list of classes
|
||||||
|
*
|
||||||
* @return string the lowest common ancestor amongst classes, null if none has been found
|
* @return string the lowest common ancestor amongst classes, null if none has been found
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public static function GetLowestCommonAncestor(ModelReflection $oModelReflection, $aClasses)
|
public static function GetLowestCommonAncestor(ModelReflection $oModelReflection, $aClasses)
|
||||||
{
|
{
|
||||||
$sAncestor = null;
|
$sAncestor = null;
|
||||||
foreach($aClasses as $sClass)
|
foreach ($aClasses as $sClass) {
|
||||||
{
|
if (is_null($sAncestor)) {
|
||||||
if (is_null($sAncestor))
|
|
||||||
{
|
|
||||||
// first loop
|
// first loop
|
||||||
$sAncestor = $sClass;
|
$sAncestor = $sClass;
|
||||||
}
|
} elseif ($oModelReflection->GetRootClass($sClass) != $oModelReflection->GetRootClass($sAncestor)) {
|
||||||
elseif ($oModelReflection->GetRootClass($sClass) != $oModelReflection->GetRootClass($sAncestor))
|
|
||||||
{
|
|
||||||
$sAncestor = null;
|
$sAncestor = null;
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$sAncestor = self::LowestCommonAncestor($oModelReflection, $sAncestor, $sClass);
|
$sAncestor = self::LowestCommonAncestor($oModelReflection, $sAncestor, $sClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sAncestor;
|
return $sAncestor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -766,37 +722,32 @@ class OqlUnionQuery extends OqlQuery
|
|||||||
*/
|
*/
|
||||||
protected static function LowestCommonAncestor(ModelReflection $oModelReflection, $sClassA, $sClassB)
|
protected static function LowestCommonAncestor(ModelReflection $oModelReflection, $sClassA, $sClassB)
|
||||||
{
|
{
|
||||||
if ($sClassA == $sClassB)
|
if ($sClassA == $sClassB) {
|
||||||
{
|
|
||||||
$sRet = $sClassA;
|
$sRet = $sClassA;
|
||||||
}
|
} elseif (in_array($sClassA, $oModelReflection->EnumChildClasses($sClassB))) {
|
||||||
elseif (in_array($sClassA, $oModelReflection->EnumChildClasses($sClassB)))
|
|
||||||
{
|
|
||||||
$sRet = $sClassB;
|
$sRet = $sClassB;
|
||||||
}
|
} elseif (in_array($sClassB, $oModelReflection->EnumChildClasses($sClassA))) {
|
||||||
elseif (in_array($sClassB, $oModelReflection->EnumChildClasses($sClassA)))
|
|
||||||
{
|
|
||||||
$sRet = $sClassA;
|
$sRet = $sClassA;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// Recurse
|
// Recurse
|
||||||
$sRet = self::LowestCommonAncestor($oModelReflection, $sClassA, $oModelReflection->GetParentClass($sClassB));
|
$sRet = self::LowestCommonAncestor($oModelReflection, $sClassA, $oModelReflection->GetParentClass($sClassB));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sRet;
|
return $sRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make the relevant DBSearch instance (FromOQL)
|
* Make the relevant DBSearch instance (FromOQL)
|
||||||
*/
|
*/
|
||||||
public function ToDBSearch($sQuery)
|
public function ToDBSearch($sQuery)
|
||||||
{
|
{
|
||||||
$aSearches = array();
|
$aSearches = array();
|
||||||
foreach ($this->aQueries as $oQuery)
|
foreach ($this->aQueries as $oQuery) {
|
||||||
{
|
|
||||||
$aSearches[] = $oQuery->ToDBSearch($sQuery);
|
$aSearches[] = $oQuery->ToDBSearch($sQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
$oSearch = new DBUnionSearch($aSearches);
|
$oSearch = new DBUnionSearch($aSearches);
|
||||||
|
|
||||||
return $oSearch;
|
return $oSearch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ class ormCaseLog
|
|||||||
/**
|
/**
|
||||||
* Produces an HTML representation, aimed at being used within the iTop framework
|
* Produces an HTML representation, aimed at being used within the iTop framework
|
||||||
*/
|
*/
|
||||||
public function GetAsHTML(WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
|
public function GetAsHTML(?WebPage $oP = null, $bEditMode = false, $aTransfoHandler = null)
|
||||||
{
|
{
|
||||||
$bPrintableVersion = (utils::ReadParam('printable', '0') == '1');
|
$bPrintableVersion = (utils::ReadParam('printable', '0') == '1');
|
||||||
|
|
||||||
|
|||||||
@@ -362,8 +362,7 @@ class ormDocument
|
|||||||
throw new Exception("Invalid id ($id) for class '$sClass' - the object does not exist or you are not allowed to view it");
|
throw new Exception("Invalid id ($id) for class '$sClass' - the object does not exist or you are not allowed to view it");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (($sSecretField != null) && ($oObj->Get($sSecretField) != $sSecretValue)) {
|
if (($sSecretField != null) && !hash_equals($oObj->Get($sSecretField), $sSecretValue)) {
|
||||||
usleep(200);
|
|
||||||
throw new Exception("Invalid secret for class '$sClass' - the object does not exist or you are not allowed to view it");
|
throw new Exception("Invalid secret for class '$sClass' - the object does not exist or you are not allowed to view it");
|
||||||
}
|
}
|
||||||
/** @var \ormDocument $oDocument */
|
/** @var \ormDocument $oDocument */
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator
|
|||||||
* @param DBObjectSet|null $oOriginalSet
|
* @param DBObjectSet|null $oOriginalSet
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function __construct($sHostClass, $sAttCode, DBObjectSet $oOriginalSet = null)
|
public function __construct($sHostClass, $sAttCode, ?DBObjectSet $oOriginalSet = null)
|
||||||
{
|
{
|
||||||
$this->sHostClass = $sHostClass;
|
$this->sHostClass = $sHostClass;
|
||||||
$this->sAttCode = $sAttCode;
|
$this->sAttCode = $sAttCode;
|
||||||
|
|||||||
@@ -98,9 +98,9 @@ class ormPassword
|
|||||||
$bResult = false;
|
$bResult = false;
|
||||||
$aInfo = password_get_info($this->m_sHashed);
|
$aInfo = password_get_info($this->m_sHashed);
|
||||||
if (is_null($aInfo["algo"]) || $aInfo["algo"] === 0) {
|
if (is_null($aInfo["algo"]) || $aInfo["algo"] === 0) {
|
||||||
//unknown, assume it's a legacy password
|
// - Unknown algorithm, assume it's a legacy password
|
||||||
$sHashedPwd = $this->ComputeHash($sClearTextPassword);
|
$sHashedPwd = $this->ComputeHash($sClearTextPassword);
|
||||||
$bResult = ($this->m_sHashed == $sHashedPwd);
|
$bResult = hash_equals($this->m_sHashed, $sHashedPwd);
|
||||||
} else {
|
} else {
|
||||||
$bResult = password_verify($sClearTextPassword, $this->m_sHashed);
|
$bResult = password_verify($sClearTextPassword, $this->m_sHashed);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -415,12 +415,7 @@ abstract class User extends cmdbAbstractObject
|
|||||||
$this->m_aCheckIssues[] = Dict::S('Class:User/Error:CurrentProfilesHaveInsufficientRights');
|
$this->m_aCheckIssues[] = Dict::S('Class:User/Error:CurrentProfilesHaveInsufficientRights');
|
||||||
}
|
}
|
||||||
$oAddon->ResetCache();
|
$oAddon->ResetCache();
|
||||||
|
Session::Set('profile_list', $aCurrentProfiles);
|
||||||
if (is_null($aCurrentProfiles)) {
|
|
||||||
Session::IsSet('profile_list');
|
|
||||||
} else {
|
|
||||||
Session::Set('profile_list', $aCurrentProfiles);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Prevent an administrator to remove their own admin profile
|
// Prevent an administrator to remove their own admin profile
|
||||||
if (UserRights::IsAdministrator($this)) {
|
if (UserRights::IsAdministrator($this)) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
$ibo-field--spacing-top--with-same-block: $ibo-spacing-500 !default;
|
$ibo-field--spacing-top--with-same-block: $ibo-spacing-500 !default;
|
||||||
|
|
||||||
.ibo-field + .ibo-field {
|
.ibo-field + .ibo-field:not(:empty) {
|
||||||
margin-top: $ibo-field--spacing-top--with-same-block;
|
margin-top: $ibo-field--spacing-top--with-same-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,4 +6,72 @@
|
|||||||
.ibo-prop-header {
|
.ibo-prop-header {
|
||||||
@extend %ibo-font-size-150;
|
@extend %ibo-font-size-150;
|
||||||
padding-bottom: 14px;
|
padding-bottom: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.help-text{
|
||||||
|
padding: 1px 5px;
|
||||||
|
background-color: #d7e3f8;
|
||||||
|
border: 1px solid #c6e7f5;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin: 5px 0;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-error ul{
|
||||||
|
padding: 1px 5px;
|
||||||
|
background-color: #f8d7da;
|
||||||
|
border: 1px solid #f5c6cb;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin: 5px 0;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subform{
|
||||||
|
background-color: #efefef;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-buttons{
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form select{
|
||||||
|
padding: 0;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form select option{
|
||||||
|
height: 30px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.turbo-refreshing{
|
||||||
|
opacity: .5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ibo-field legend{
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
collection-entry-element {
|
||||||
|
margin-top: 8px;
|
||||||
|
display: block;
|
||||||
|
padding: 10px 10px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
.ts-control{
|
||||||
|
height: auto;
|
||||||
|
min-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ibo-form-actions > .ibo-button > span{
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ibo-form textarea{
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,9 +72,12 @@ $ibo-panel--icon--spacing--as-medallion--is-sticking: $ibo-panel--icon--spacing-
|
|||||||
$ibo-panel--icon--bottom--as-medallion--is-sticking: -12px !default;
|
$ibo-panel--icon--bottom--as-medallion--is-sticking: -12px !default;
|
||||||
$ibo-panel--icon--border--as-medallion--is-sticking: 1px $ibo-panel--base-border-style $ibo-panel--base-border-color !default;
|
$ibo-panel--icon--border--as-medallion--is-sticking: 1px $ibo-panel--base-border-style $ibo-panel--base-border-color !default;
|
||||||
|
|
||||||
$ibo-panel--icon-background--size--must-contain: contain !default;
|
$ibo-panel--icon-background--size--must-contain: contain !default; // deprecated, to be removed in favor of $ibo-panel--icon-img--size--must-contain
|
||||||
$ibo-panel--icon-background--size--must-cover: cover !default;
|
$ibo-panel--icon-background--size--must-cover: cover !default; // deprecated, to be removed in favor of $ibo-panel--icon-img--size--must-cover
|
||||||
$ibo-panel--icon-background--size--must-zoomout: 66.67% !default;
|
$ibo-panel--icon-background--size--must-zoomout: 66.67% !default; // deprecated, to be removed in favor of $ibo-panel--icon-img--size--must-zoomout
|
||||||
|
$ibo-panel--icon-img--size--must-contain: $ibo-panel--icon-background--size--must-contain !default; // TODO remove when dealing with N°9317
|
||||||
|
$ibo-panel--icon-img--size--must-cover: $ibo-panel--icon-background--size--must-cover !default; // TODO remove when dealing with N°9317
|
||||||
|
$ibo-panel--icon-img--size--must-zoomout: $ibo-panel--icon-background--size--must-zoomout !default; // TODO remove when dealing with N°9317
|
||||||
|
|
||||||
$ibo-panel--title--font-size--is-sticking: $ibo-font-size-150 !default;
|
$ibo-panel--title--font-size--is-sticking: $ibo-font-size-150 !default;
|
||||||
$ibo-panel--title--color: $ibo-color-grey-900 !default;
|
$ibo-panel--title--color: $ibo-color-grey-900 !default;
|
||||||
@@ -179,24 +182,25 @@ $ibo-panel--is-selectable--body--after--font-size: $ibo-font-size-700 !default;
|
|||||||
min-height: $ibo-panel--icon--size;
|
min-height: $ibo-panel--icon--size;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-panel--icon-background {
|
.ibo-panel--icon-img, .ibo-panel--icon-background { // second class is deprecated, remove it when dealing with N°9317
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-size: $ibo-panel--icon-background--size--must-contain;
|
background-size: $ibo-panel--icon-img--size--must-contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-panel--icon-background--must-contain {
|
.ibo-panel--icon-img--must-contain, .ibo-panel--icon-background--must-contain { // second class is deprecated, remove it when dealing with N°9317
|
||||||
background-size: $ibo-panel--icon-background--size--must-contain;
|
background-size: $ibo-panel--icon-img--size--must-contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-panel--icon-background--must-cover {
|
.ibo-panel--icon-img--must-cover, .ibo-panel--icon-background--must-cover { // second class is deprecated, remove it when dealing with N°9317
|
||||||
background-size: $ibo-panel--icon-background--size--must-cover;
|
background-size: $ibo-panel--icon-img--size--must-cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-panel--icon-background--must-zoomout {
|
.ibo-panel--icon-img--must-zoomout, .ibo-panel--icon-background--must-zoomout { // second class is deprecated, remove it when dealing with N°9317
|
||||||
background-size: $ibo-panel--icon-background--size--must-zoomout;
|
width: $ibo-panel--icon-img--size--must-zoomout;
|
||||||
|
height: $ibo-panel--icon-img--size--must-zoomout;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-panel--title {
|
.ibo-panel--title {
|
||||||
|
|||||||
@@ -11,9 +11,12 @@ $ibo-title--icon--size: 90px !default;
|
|||||||
$ibo-title--icon--size-2: 80px !default;
|
$ibo-title--icon--size-2: 80px !default;
|
||||||
$ibo-title--icon--size-3: 70px !default;
|
$ibo-title--icon--size-3: 70px !default;
|
||||||
|
|
||||||
$ibo-title--icon-background--size--must-contain: contain !default;
|
$ibo-title--icon-background--size--must-contain: contain !default; // deprecated, to be removed in favor of $ibo-title--icon-img--size--must-contain
|
||||||
$ibo-title--icon-background--size--must-cover: cover !default;
|
$ibo-title--icon-background--size--must-cover: cover !default; // deprecated, to be removed in favor of $ibo-title--icon-img--size--must-cover
|
||||||
$ibo-title--icon-background--size--must-zoomout: 66.67% !default;
|
$ibo-title--icon-background--size--must-zoomout: 66.67% !default; // deprecated, to be removed in favor of $ibo-title--icon-img--size--must-zoomout
|
||||||
|
$ibo-title--icon-img--size--must-contain: $ibo-title--icon-background--size--must-contain !default; // TODO remove when dealing with N°9317
|
||||||
|
$ibo-title--icon-img--size--must-cover: $ibo-title--icon-background--size--must-cover !default; // TODO remove when dealing with N°9317
|
||||||
|
$ibo-title--icon-img--size--must-zoomout: $ibo-title--icon-background--size--must-zoomout !default; // TODO remove when dealing with N°9317
|
||||||
|
|
||||||
|
|
||||||
.ibo-title {
|
.ibo-title {
|
||||||
@@ -44,24 +47,23 @@ $ibo-title--icon-background--size--must-zoomout: 66.67% !default;
|
|||||||
min-height: $ibo-title--icon--size-3;
|
min-height: $ibo-title--icon--size-3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-title--icon-background {
|
.ibo-title--icon-img, .ibo-title--icon-background { // second class is deprecated, remove it when dealing with N°9317
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-position: center;
|
object-position: center;
|
||||||
background-repeat: no-repeat;
|
background-size: $ibo-title--icon-img--size--must-contain;
|
||||||
background-size: $ibo-title--icon-background--size--must-contain;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-title--icon-background--must-contain {
|
.ibo-title--icon-img--must-contain, .ibo-title--icon-background--must-contain { // second class is deprecated, remove it when dealing with N°9317
|
||||||
background-size: $ibo-title--icon-background--size--must-contain;
|
background-size: $ibo-title--icon-img--size--must-contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-title--icon-background--must-cover {
|
.ibo-title--icon-img--must-cover, .ibo-title--icon-background--must-cover { // second class is deprecated, remove it when dealing with N°9317
|
||||||
background-size: $ibo-title--icon-background--size--must-cover;
|
background-size: $ibo-title--icon-img--size--must-cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-title--icon-background--must-zoomout {
|
.ibo-title--icon-img--must-zoomout, .ibo-title--icon-background--must-zoomout { // second class is deprecated, remove it when dealing with N°9317
|
||||||
background-size: $ibo-title--icon-background--size--must-zoomout;
|
background-size: $ibo-title--icon-img--size--must-zoomout;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ibo-title--for-object-details {
|
.ibo-title--for-object-details {
|
||||||
|
|||||||
@@ -5,9 +5,11 @@
|
|||||||
|
|
||||||
$ibo-multi-column--margin-x: -$ibo-spacing-500 !default; /* This is to compensate columns padding and make the whole multicolumn align with the parent borders (cf. Bootstrap rows / cols) */
|
$ibo-multi-column--margin-x: -$ibo-spacing-500 !default; /* This is to compensate columns padding and make the whole multicolumn align with the parent borders (cf. Bootstrap rows / cols) */
|
||||||
$ibo-multi-column--margin-y: $ibo-spacing-0 !default;
|
$ibo-multi-column--margin-y: $ibo-spacing-0 !default;
|
||||||
|
$ibo-multi-column--row-gap: $ibo-spacing-800 !default;
|
||||||
|
|
||||||
.ibo-multi-column {
|
.ibo-multi-column {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
margin: $ibo-multi-column--margin-y $ibo-multi-column--margin-x;
|
margin: $ibo-multi-column--margin-y $ibo-multi-column--margin-x;
|
||||||
|
row-gap: $ibo-multi-column--row-gap;
|
||||||
}
|
}
|
||||||
2
css/backoffice/vendors/_selectize.scss
vendored
2
css/backoffice/vendors/_selectize.scss
vendored
@@ -29,7 +29,7 @@ $ibo-vendors-selectize--element--active--background: $ibo-color-blue-100 !defaul
|
|||||||
$ibo-vendors-selectize--element--active--color: $ibo-color-grey-900 !default;
|
$ibo-vendors-selectize--element--active--color: $ibo-color-grey-900 !default;
|
||||||
|
|
||||||
$ibo-vendors-selectize--dropdown--background-color: $ibo-vendors-selectize-input--background-color !default;
|
$ibo-vendors-selectize--dropdown--background-color: $ibo-vendors-selectize-input--background-color !default;
|
||||||
$ibo-vendors-selectize--dropdown--color: $ibo-vendors-selectize-input--color!default;
|
$ibo-vendors-selectize--dropdown--color: $ibo-vendors-selectize-input--color !default;
|
||||||
|
|
||||||
$ibo-vendors-selectize--header--padding-x: 8px !default;
|
$ibo-vendors-selectize--header--padding-x: 8px !default;
|
||||||
$ibo-vendors-selectize--header--padding-y: 5px !default;
|
$ibo-vendors-selectize--header--padding-y: 5px !default;
|
||||||
|
|||||||
3
css/backoffice/vendors/_tomselect.scss
vendored
Normal file
3
css/backoffice/vendors/_tomselect.scss
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
@import "../../../node_modules/tom-select/dist/scss/tom-select.scss";
|
||||||
|
|
||||||
|
$select-color-item-active-border: $ibo-input--focus--border-color;
|
||||||
0
data/.compilation-symlinks
Normal file
0
data/.compilation-symlinks
Normal file
@@ -2,7 +2,7 @@
|
|||||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
||||||
<module_parameters>
|
<module_parameters>
|
||||||
<parameters id="authent-local" _delta="define">
|
<parameters id="authent-local" _delta="define">
|
||||||
<password_validation.pattern>^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$</password_validation.pattern>
|
<password_validation.pattern>^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{12,}$</password_validation.pattern>
|
||||||
<password_validation.message type="hash"/>
|
<password_validation.message type="hash"/>
|
||||||
</parameters>
|
</parameters>
|
||||||
</module_parameters>
|
</module_parameters>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Heslo nemůže uživatel změnit.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Heslo nemůže uživatel změnit.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Heslo bylo obnoveno',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Heslo bylo obnoveno',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Termín, kdy bylo heslo změneno',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Termín, kdy bylo heslo změneno',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Heslo musí obsahovat minimálně 8 znaků a musí obsahovat minimálně jedno velké písmeno, jedno malé písmeno, jedno číslo a speciální znak.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Heslo musí obsahovat minimálně 12 znaků a musí obsahovat minimálně jedno velké písmeno, jedno malé písmeno, jedno číslo a speciální znak.',
|
||||||
'UserLocal:password:expiration' => 'Níže uvedená pole vyžadují rozšíření',
|
'UserLocal:password:expiration' => 'Níže uvedená pole vyžadují rozšíření',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Nastavení exspirace "Jednorázového hesla" nelze u vlastního účtu uživatele.',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Nastavení exspirace "Jednorázového hesla" nelze u vlastního účtu uživatele.',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Letzte Passworterneuerung',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Letzte Passworterneuerung',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Letztes Änderungsdatum',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Letztes Änderungsdatum',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort entspricht nicht dem in den Konfigurationsregeln hinterlegten RegEx-Ausdruck',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort muss mindestens 12 Zeichen lang sein und Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten.',
|
||||||
'UserLocal:password:expiration' => 'Die folgenden Felder benötigen eine '.ITOP_APPLICATION_SHORT.' Erweiterung',
|
'UserLocal:password:expiration' => 'Die folgenden Felder benötigen eine '.ITOP_APPLICATION_SHORT.' Erweiterung',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Das setzen des Passwortablaufs auf "Einmalpasswort" ist für den eigenen Benutzer nicht erlaubt.',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Das setzen des Passwortablaufs auf "Einmalpasswort" ist für den eigenen Benutzer nicht erlaubt.',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ Dict::Add('EN US', 'English', 'English', [
|
|||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
|
||||||
|
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.',
|
||||||
'UserLocal:password:expiration' => 'The fields below require an extension',
|
'UserLocal:password:expiration' => 'The fields below require an extension',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ Dict::Add('EN GB', 'British English', 'British English', [
|
|||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
|
||||||
|
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.',
|
||||||
'UserLocal:password:expiration' => 'The fields below require an extension',
|
'UserLocal:password:expiration' => 'The fields below require an extension',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'El usuario no puede cambiar la contraseña.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'El usuario no puede cambiar la contraseña.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Renovación de contraseña',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Renovación de contraseña',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Cuando fue el último cambio de contraseña',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Cuando fue el último cambio de contraseña',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La contraseña debe ser de al menos 8 caracteres e incluír mayúsculas, minúsculas, números y caracteres especiales.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La contraseña debe ser de al menos 12 caracteres e incluir mayúsculas, minúsculas, números y caracteres especiales.',
|
||||||
'UserLocal:password:expiration' => 'El siguiente campo requiere una extensión',
|
'UserLocal:password:expiration' => 'El siguiente campo requiere una extensión',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Configurar expiración de contraseña para "ontraseña de un solo uso" no está permitido para su propio Usuario',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Configurar expiración de contraseña para "ontraseña de un solo uso" no está permitido para su propio Usuario',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Dict::Add('FR FR', 'French', 'Français', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Mot de passe changé le',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Mot de passe changé le',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Dernière date à laquelle le mot de passe a été changé',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Dernière date à laquelle le mot de passe a été changé',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Le mot de passe doit contenir au moins 8 caractères, avec minuscule, majuscule, nombre et caractère spécial.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Le mot de passe doit contenir au moins 12 caractères, avec minuscule, majuscule, nombre et caractère spécial.',
|
||||||
'UserLocal:password:expiration' => 'Les champs ci-dessous nécessitent une extension',
|
'UserLocal:password:expiration' => 'Les champs ci-dessous nécessitent une extension',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Impossible de mettre "Usage unique" comme validité du mot de passe pour son propre utilisateur.',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Impossible de mettre "Usage unique" comme validité du mot de passe pour son propre utilisateur.',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'A felhasználó nem változtathat jelszót.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'A felhasználó nem változtathat jelszót.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Jelszó megújítás ideje',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Jelszó megújítás ideje',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'A jelszó legutóbbi módosításának időpontja',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'A jelszó legutóbbi módosításának időpontja',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'A jelszónak legalább 8 karakterből kell állnia, és tartalmaznia kell nagybetűket, kisbetűket, numerikus és speciális karaktereket.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'A jelszónak legalább 12 karakterből kell állnia, és tartalmaznia kell nagybetűket, kisbetűket, numerikus és speciális karaktereket.',
|
||||||
'UserLocal:password:expiration' => 'Az alábbi mezőkhöz egy bővítmény szükséges',
|
'UserLocal:password:expiration' => 'Az alábbi mezőkhöz egy bővítmény szükséges',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'A jelszó lejárati idejének beállítása "Egyszeri jelszóra" nem engedélyezett a saját Felhasználó számára.',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'A jelszó lejárati idejének beállítása "Egyszeri jelszóra" nem engedélyezett a saját Felhasználó számára.',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'La password non può essere cambiata dall\'utente.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'La password non può essere cambiata dall\'utente.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Rinnovo della password',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Rinnovo della password',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Quando è stata cambiata l\'ultima volta la password',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Quando è stata cambiata l\'ultima volta la password',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La password deve essere di almeno 8 caratteri e includere lettere maiuscole, minuscole, numeri e caratteri speciali.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'La password deve essere di almeno 12 caratteri e includere lettere maiuscole, minuscole, numeri e caratteri speciali.',
|
||||||
'UserLocal:password:expiration' => 'I campi sottostanti richiedono un\'estensione',
|
'UserLocal:password:expiration' => 'I campi sottostanti richiedono un\'estensione',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Impostare la scadenza della password su "Password monouso" non è consentito per il proprio utente',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Impostare la scadenza della password su "Password monouso" non è consentito per il proprio utente',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'De gebruiker kan dit wachtwoord niet veranderen.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'De gebruiker kan dit wachtwoord niet veranderen.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Wachtwoord laatst aangepast',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Wachtwoord laatst aangepast',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Tijdstip waarop het wachtwoord het laatst aangepast werd.',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Tijdstip waarop het wachtwoord het laatst aangepast werd.',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Het wachtwoord bestaat uit minstens 8 tekens en bestaat uit een mix van minstens 1 hoofdletter, kleine letter, cijfer en speciaal teken.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Het wachtwoord bestaat uit minstens 12 tekens en bestaat uit een mix van minstens 1 hoofdletter, kleine letter, cijfer en speciaal teken.',
|
||||||
'UserLocal:password:expiration' => 'De velden hieronder vereisen een extensie.',
|
'UserLocal:password:expiration' => 'De velden hieronder vereisen een extensie.',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Je kan geen eenmalig wachtwoord instellen voor je eigen gebruiker.',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Je kan geen eenmalig wachtwoord instellen voor je eigen gebruiker.',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Hasło nie może być zmienione przez użytkownika.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Hasło nie może być zmienione przez użytkownika.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Odnowienie hasła',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Odnowienie hasła',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Kiedy ostatnio zmieniano hasło',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Kiedy ostatnio zmieniano hasło',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Hasło musi mieć co najmniej 8 znaków i zawierać duże, małe litery, cyfry i znaki specjalne.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Hasło musi mieć co najmniej 12 znaków i zawierać duże, małe litery, cyfry i znaki specjalne.',
|
||||||
'UserLocal:password:expiration' => 'Poniższe pola wymagają rozszerzenia',
|
'UserLocal:password:expiration' => 'Poniższe pola wymagają rozszerzenia',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Ustawienie wygaśnięcia hasła "Hasło jednorazowe" nie jest dozwolone dla własnego użytkownika',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Ustawienie wygaśnięcia hasła "Hasło jednorazowe" nie jest dozwolone dla własnego użytkownika',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Дата изменения пароля',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Дата изменения пароля',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'Когда пароль был изменен в последний раз',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'Когда пароль был изменен в последний раз',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Пароль должен содержать не менее 8 символов и включать прописные, строчные, числовые и специальные символы.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Пароль должен содержать не менее 12 символов и включать прописные, строчные, числовые и специальные символы.',
|
||||||
'UserLocal:password:expiration' => 'Поля требуют наличия доп. расширения',
|
'UserLocal:password:expiration' => 'Поля требуют наличия доп. расширения',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on~~',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed~~',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.~~',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.~~',
|
||||||
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
'UserLocal:password:expiration' => 'The fields below require an extension~~',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
|||||||
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
|
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新',
|
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新',
|
||||||
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
|
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
|
||||||
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少8个字符, 包含大小写, 数字和特殊字符.',
|
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少12个字符, 包含大小写, 数字和特殊字符.',
|
||||||
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
|
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
|
||||||
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -10,22 +10,87 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
use Combodo\iTop\Core\MetaModel\HierarchicalKey;
|
use Combodo\iTop\Core\MetaModel\HierarchicalKey;
|
||||||
|
use Combodo\iTop\DBTools\Enum\BinExitCode;
|
||||||
|
use Combodo\iTop\DBTools\Exception\AuthenticationException;
|
||||||
|
|
||||||
require_once('../../../approot.inc.php');
|
// env-xxx folders
|
||||||
|
if (file_exists(__DIR__.'/../../../approot.inc.php')) {
|
||||||
|
require_once __DIR__.'/../../../approot.inc.php';
|
||||||
|
}
|
||||||
|
// datamodel/2.x and data/xxx-modules folders
|
||||||
|
elseif (file_exists(__DIR__.'/../../../../approot.inc.php')) {
|
||||||
|
require_once __DIR__.'/../../../../approot.inc.php';
|
||||||
|
}
|
||||||
require_once APPROOT.'application/startup.inc.php';
|
require_once APPROOT.'application/startup.inc.php';
|
||||||
|
|
||||||
foreach (MetaModel::GetClasses() as $sClass) {
|
// Prepare output page
|
||||||
if (!MetaModel::HasTable($sClass)) {
|
$sPageTitle = "Database maintenance tools - Report";
|
||||||
continue;
|
$bIsModeCLI = utils::IsModeCLI();
|
||||||
}
|
if ($bIsModeCLI) {
|
||||||
|
$oP = new CLIPage($sPageTitle);
|
||||||
|
|
||||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
SetupUtils::CheckPhpAndExtensionsForCli($oP, BinExitCode::FATAL->value);
|
||||||
// Check (once) all the attributes that are hierarchical keys
|
} else {
|
||||||
if ((MetaModel::GetAttributeOrigin($sClass, $sAttCode) == $sClass) && $oAttDef->IsHierarchicalKey()) {
|
$oP = new WebPage($sPageTitle);
|
||||||
echo "Rebuild hierarchical key $sAttCode from $sClass.\n";
|
|
||||||
HierarchicalKey::Rebuild($sClass, $sAttCode, $oAttDef);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "Done\n";
|
// Authentication logic
|
||||||
|
try {
|
||||||
|
utils::UseParamFile();
|
||||||
|
|
||||||
|
if ($bIsModeCLI) {
|
||||||
|
$sAuthUser = utils::ReadParam('auth_user', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||||
|
$sAuthPwd = utils::ReadParam('auth_pwd', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||||
|
if (utils::IsNullOrEmptyString($sAuthUser) || utils::IsNullOrEmptyString($sAuthPwd)) {
|
||||||
|
throw new AuthenticationException("Access credentials not provided, usage: php rebuildhk.php --auth_user=<login> --auth_pwd=<password> [--param_file=<file_path>]");
|
||||||
|
}
|
||||||
|
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd)) {
|
||||||
|
UserRights::Login($sAuthUser);
|
||||||
|
} else {
|
||||||
|
throw new AuthenticationException("Access wrong credentials ('$sAuthUser')");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Check user rights and prompt if needed
|
||||||
|
LoginWebPage::DoLoginEx(null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!UserRights::IsAdministrator()) {
|
||||||
|
throw new AuthenticationException("Access restricted to administrators");
|
||||||
|
}
|
||||||
|
} catch (AuthenticationException $oException) {
|
||||||
|
$oP->p($oException->getMessage());
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::ERROR->value);
|
||||||
|
} catch (Exception $oException) {
|
||||||
|
$oP->p("Error: ".$oException->GetMessage());
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::FATAL->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Business logic
|
||||||
|
try {
|
||||||
|
foreach (MetaModel::GetClasses() as $sClass) {
|
||||||
|
if (!MetaModel::HasTable($sClass)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||||
|
// Check (once) all the attributes that are hierarchical keys
|
||||||
|
if ((MetaModel::GetAttributeOrigin($sClass, $sAttCode) == $sClass) && $oAttDef->IsHierarchicalKey()) {
|
||||||
|
$oP->p("Rebuild hierarchical key $sAttCode from $sClass.");
|
||||||
|
HierarchicalKey::Rebuild($sClass, $sAttCode, $oAttDef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$oP->p("Done");
|
||||||
|
$oP->output();
|
||||||
|
} catch (AuthenticationException $oException) {
|
||||||
|
$oP->p($oException->getMessage());
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::ERROR->value);
|
||||||
|
} catch (Exception $oException) {
|
||||||
|
$oP->p("Error: ".$oException->GetMessage());
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::FATAL->value);
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,22 +5,93 @@
|
|||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use Combodo\iTop\DBTools\Enum\BinExitCode;
|
||||||
|
use Combodo\iTop\DBTools\Exception\AuthenticationException;
|
||||||
use Combodo\iTop\DBTools\Service\DBAnalyzerUtils;
|
use Combodo\iTop\DBTools\Service\DBAnalyzerUtils;
|
||||||
|
|
||||||
require_once('../../../approot.inc.php');
|
// env-xxx folders
|
||||||
require_once(APPROOT.'application/startup.inc.php');
|
if (file_exists(__DIR__.'/../../../approot.inc.php')) {
|
||||||
|
require_once __DIR__.'/../../../approot.inc.php';
|
||||||
require_once('../db_analyzer.class.inc.php');
|
}
|
||||||
require_once('../src/Service/DBAnalyzerUtils.php');
|
// datamodel/2.x and data/xxx-modules folders
|
||||||
|
elseif (file_exists(__DIR__.'/../../../../approot.inc.php')) {
|
||||||
$oDBAnalyzer = new DatabaseAnalyzer(0);
|
require_once __DIR__.'/../../../../approot.inc.php';
|
||||||
$aResults = $oDBAnalyzer->CheckIntegrity([]);
|
|
||||||
|
|
||||||
if (empty($aResults)) {
|
|
||||||
echo "Database OK\n";
|
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$sReportFile = DBAnalyzerUtils::GenerateReport($aResults);
|
require_once APPROOT.'application/startup.inc.php';
|
||||||
|
require_once APPROOT.'application/loginwebpage.class.inc.php';
|
||||||
|
|
||||||
echo "Report generated: {$sReportFile}.log\n";
|
require_once __DIR__.'/../db_analyzer.class.inc.php';
|
||||||
|
|
||||||
|
// Prepare output page
|
||||||
|
$sPageTitle = "Database maintenance tools - Report";
|
||||||
|
$bIsModeCLI = utils::IsModeCLI();
|
||||||
|
if ($bIsModeCLI) {
|
||||||
|
$oP = new CLIPage($sPageTitle);
|
||||||
|
|
||||||
|
SetupUtils::CheckPhpAndExtensionsForCli($oP, BinExitCode::FATAL->value);
|
||||||
|
} else {
|
||||||
|
$oP = new WebPage($sPageTitle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Authentication logic
|
||||||
|
try {
|
||||||
|
utils::UseParamFile();
|
||||||
|
|
||||||
|
if ($bIsModeCLI) {
|
||||||
|
$sAuthUser = utils::ReadParam('auth_user', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||||
|
$sAuthPwd = utils::ReadParam('auth_pwd', null, true, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||||
|
if (utils::IsNullOrEmptyString($sAuthUser) || utils::IsNullOrEmptyString($sAuthPwd)) {
|
||||||
|
throw new AuthenticationException("Access credentials not provided, usage: php report.php --auth_user=<login> --auth_pwd=<password> [--param_file=<file_path>]");
|
||||||
|
}
|
||||||
|
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd)) {
|
||||||
|
UserRights::Login($sAuthUser);
|
||||||
|
} else {
|
||||||
|
throw new AuthenticationException("Access wrong credentials ('$sAuthUser')");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Check user rights and prompt if needed
|
||||||
|
LoginWebPage::DoLoginEx(null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!UserRights::IsAdministrator()) {
|
||||||
|
throw new AuthenticationException("Access restricted to administrators");
|
||||||
|
}
|
||||||
|
} catch (AuthenticationException $oException) {
|
||||||
|
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||||
|
$oP->p($sExceptionMessage);
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::ERROR->value);
|
||||||
|
} catch (Exception $oException) {
|
||||||
|
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||||
|
$oP->p("Error: ".$sExceptionMessage);
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::FATAL->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Business logic
|
||||||
|
try {
|
||||||
|
$oDBAnalyzer = new DatabaseAnalyzer(0);
|
||||||
|
$aResults = $oDBAnalyzer->CheckIntegrity([]);
|
||||||
|
|
||||||
|
if (empty($aResults)) {
|
||||||
|
$oP->p("Database OK");
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::SUCCESS->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sReportFile = DBAnalyzerUtils::GenerateReport($aResults);
|
||||||
|
|
||||||
|
$oP->p("Report generated: {$sReportFile}.log");
|
||||||
|
$oP->output();
|
||||||
|
} catch (AuthenticationException $oException) {
|
||||||
|
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||||
|
$oP->p($sExceptionMessage);
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::ERROR->value);
|
||||||
|
} catch (Exception $oException) {
|
||||||
|
$sExceptionMessage = $oP instanceof WebPage ? utils::EscapeHtml($oException->getMessage()) : $oException->getMessage();
|
||||||
|
$oP->p("Error: ".$sExceptionMessage);
|
||||||
|
$oP->output();
|
||||||
|
exit(BinExitCode::FATAL->value);
|
||||||
|
}
|
||||||
|
|||||||
9
datamodels/2.x/combodo-db-tools/composer.json
Normal file
9
datamodels/2.x/combodo-db-tools/composer.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "combodo/combodo-db-tools",
|
||||||
|
"license": "AGPL-3.0-only",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Combodo\\iTop\\DBTools\\": "src/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
datamodels/2.x/combodo-db-tools/composer.lock
generated
Normal file
18
datamodels/2.x/combodo-db-tools/composer.lock
generated
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"content-hash": "38292b9b3a56c6c8776285a17c58034e",
|
||||||
|
"packages": [],
|
||||||
|
"packages-dev": [],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"stability-flags": {},
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": {},
|
||||||
|
"platform-dev": {},
|
||||||
|
"plugin-api-version": "2.6.0"
|
||||||
|
}
|
||||||
@@ -30,7 +30,7 @@ SetupWebPage::AddModule(
|
|||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
'label' => 'Database maintenance tools',
|
'label' => 'Database maintenance tools',
|
||||||
'category' => 'business',
|
'category' => 'Application management',
|
||||||
|
|
||||||
// Setup
|
// Setup
|
||||||
//
|
//
|
||||||
@@ -43,6 +43,7 @@ SetupWebPage::AddModule(
|
|||||||
// Components
|
// Components
|
||||||
//
|
//
|
||||||
'datamodel' => [
|
'datamodel' => [
|
||||||
|
'vendor/autoload.php',
|
||||||
'src/Service/DBToolsUtils.php',
|
'src/Service/DBToolsUtils.php',
|
||||||
'src/Service/DBAnalyzerUtils.php',
|
'src/Service/DBAnalyzerUtils.php',
|
||||||
],
|
],
|
||||||
|
|||||||
18
datamodels/2.x/combodo-db-tools/src/Enum/BinExitCode.php
Normal file
18
datamodels/2.x/combodo-db-tools/src/Enum/BinExitCode.php
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Combodo\iTop\DBTools\Enum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum for the exit codes of the bin scripts
|
||||||
|
*/
|
||||||
|
enum BinExitCode: int
|
||||||
|
{
|
||||||
|
case SUCCESS = 0;
|
||||||
|
case ERROR = -1;
|
||||||
|
case FATAL = -2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Combodo\iTop\DBTools\Exception;
|
||||||
|
|
||||||
|
class AuthenticationException extends \Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
22
datamodels/2.x/combodo-db-tools/vendor/autoload.php
vendored
Normal file
22
datamodels/2.x/combodo-db-tools/vendor/autoload.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload.php @generated by Composer
|
||||||
|
|
||||||
|
if (PHP_VERSION_ID < 50600) {
|
||||||
|
if (!headers_sent()) {
|
||||||
|
header('HTTP/1.1 500 Internal Server Error');
|
||||||
|
}
|
||||||
|
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
|
||||||
|
if (!ini_get('display_errors')) {
|
||||||
|
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||||
|
fwrite(STDERR, $err);
|
||||||
|
} elseif (!headers_sent()) {
|
||||||
|
echo $err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException($err);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once __DIR__ . '/composer/autoload_real.php';
|
||||||
|
|
||||||
|
return ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e::getLoader();
|
||||||
579
datamodels/2.x/combodo-db-tools/vendor/composer/ClassLoader.php
vendored
Normal file
579
datamodels/2.x/combodo-db-tools/vendor/composer/ClassLoader.php
vendored
Normal file
@@ -0,0 +1,579 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||||
|
*
|
||||||
|
* $loader = new \Composer\Autoload\ClassLoader();
|
||||||
|
*
|
||||||
|
* // register classes with namespaces
|
||||||
|
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||||
|
* $loader->add('Symfony', __DIR__.'/framework');
|
||||||
|
*
|
||||||
|
* // activate the autoloader
|
||||||
|
* $loader->register();
|
||||||
|
*
|
||||||
|
* // to enable searching the include path (eg. for PEAR packages)
|
||||||
|
* $loader->setUseIncludePath(true);
|
||||||
|
*
|
||||||
|
* In this example, if you try to use a class in the Symfony\Component
|
||||||
|
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||||
|
* the autoloader will first look for the class under the component/
|
||||||
|
* directory, and it will then fallback to the framework/ directory if not
|
||||||
|
* found before giving up.
|
||||||
|
*
|
||||||
|
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||||
|
*
|
||||||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
* @see https://www.php-fig.org/psr/psr-0/
|
||||||
|
* @see https://www.php-fig.org/psr/psr-4/
|
||||||
|
*/
|
||||||
|
class ClassLoader
|
||||||
|
{
|
||||||
|
/** @var \Closure(string):void */
|
||||||
|
private static $includeFile;
|
||||||
|
|
||||||
|
/** @var string|null */
|
||||||
|
private $vendorDir;
|
||||||
|
|
||||||
|
// PSR-4
|
||||||
|
/**
|
||||||
|
* @var array<string, array<string, int>>
|
||||||
|
*/
|
||||||
|
private $prefixLengthsPsr4 = array();
|
||||||
|
/**
|
||||||
|
* @var array<string, list<string>>
|
||||||
|
*/
|
||||||
|
private $prefixDirsPsr4 = array();
|
||||||
|
/**
|
||||||
|
* @var list<string>
|
||||||
|
*/
|
||||||
|
private $fallbackDirsPsr4 = array();
|
||||||
|
|
||||||
|
// PSR-0
|
||||||
|
/**
|
||||||
|
* List of PSR-0 prefixes
|
||||||
|
*
|
||||||
|
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
|
||||||
|
*
|
||||||
|
* @var array<string, array<string, list<string>>>
|
||||||
|
*/
|
||||||
|
private $prefixesPsr0 = array();
|
||||||
|
/**
|
||||||
|
* @var list<string>
|
||||||
|
*/
|
||||||
|
private $fallbackDirsPsr0 = array();
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
private $useIncludePath = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, string>
|
||||||
|
*/
|
||||||
|
private $classMap = array();
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
private $classMapAuthoritative = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, bool>
|
||||||
|
*/
|
||||||
|
private $missingClasses = array();
|
||||||
|
|
||||||
|
/** @var string|null */
|
||||||
|
private $apcuPrefix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, self>
|
||||||
|
*/
|
||||||
|
private static $registeredLoaders = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|null $vendorDir
|
||||||
|
*/
|
||||||
|
public function __construct($vendorDir = null)
|
||||||
|
{
|
||||||
|
$this->vendorDir = $vendorDir;
|
||||||
|
self::initializeIncludeClosure();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, list<string>>
|
||||||
|
*/
|
||||||
|
public function getPrefixes()
|
||||||
|
{
|
||||||
|
if (!empty($this->prefixesPsr0)) {
|
||||||
|
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
|
||||||
|
}
|
||||||
|
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, list<string>>
|
||||||
|
*/
|
||||||
|
public function getPrefixesPsr4()
|
||||||
|
{
|
||||||
|
return $this->prefixDirsPsr4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list<string>
|
||||||
|
*/
|
||||||
|
public function getFallbackDirs()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirsPsr0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list<string>
|
||||||
|
*/
|
||||||
|
public function getFallbackDirsPsr4()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirsPsr4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, string> Array of classname => path
|
||||||
|
*/
|
||||||
|
public function getClassMap()
|
||||||
|
{
|
||||||
|
return $this->classMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, string> $classMap Class to filename map
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function addClassMap(array $classMap)
|
||||||
|
{
|
||||||
|
if ($this->classMap) {
|
||||||
|
$this->classMap = array_merge($this->classMap, $classMap);
|
||||||
|
} else {
|
||||||
|
$this->classMap = $classMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-0 directories for a given prefix, either
|
||||||
|
* appending or prepending to the ones previously set for this prefix.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix
|
||||||
|
* @param list<string>|string $paths The PSR-0 root directories
|
||||||
|
* @param bool $prepend Whether to prepend the directories
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function add($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
|
if (!$prefix) {
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->fallbackDirsPsr0
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
|
$this->fallbackDirsPsr0,
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$first = $prefix[0];
|
||||||
|
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = $paths;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($prepend) {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->prefixesPsr0[$first][$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
|
$this->prefixesPsr0[$first][$prefix],
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-4 directories for a given namespace, either
|
||||||
|
* appending or prepending to the ones previously set for this namespace.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
|
* @param bool $prepend Whether to prepend the directories
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function addPsr4($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
|
if (!$prefix) {
|
||||||
|
// Register directories for the root namespace.
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->fallbackDirsPsr4
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
|
$this->fallbackDirsPsr4,
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||||
|
// Register directories for a new namespace.
|
||||||
|
$length = strlen($prefix);
|
||||||
|
if ('\\' !== $prefix[$length - 1]) {
|
||||||
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
|
}
|
||||||
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
|
$this->prefixDirsPsr4[$prefix] = $paths;
|
||||||
|
} elseif ($prepend) {
|
||||||
|
// Prepend directories for an already registered namespace.
|
||||||
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->prefixDirsPsr4[$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Append directories for an already registered namespace.
|
||||||
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
|
$this->prefixDirsPsr4[$prefix],
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-0 directories for a given prefix,
|
||||||
|
* replacing any others previously set for this prefix.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix
|
||||||
|
* @param list<string>|string $paths The PSR-0 base directories
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function set($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirsPsr0 = (array) $paths;
|
||||||
|
} else {
|
||||||
|
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-4 directories for a given namespace,
|
||||||
|
* replacing any others previously set for this namespace.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setPsr4($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirsPsr4 = (array) $paths;
|
||||||
|
} else {
|
||||||
|
$length = strlen($prefix);
|
||||||
|
if ('\\' !== $prefix[$length - 1]) {
|
||||||
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
|
}
|
||||||
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
|
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns on searching the include path for class files.
|
||||||
|
*
|
||||||
|
* @param bool $useIncludePath
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setUseIncludePath($useIncludePath)
|
||||||
|
{
|
||||||
|
$this->useIncludePath = $useIncludePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can be used to check if the autoloader uses the include path to check
|
||||||
|
* for classes.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getUseIncludePath()
|
||||||
|
{
|
||||||
|
return $this->useIncludePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns off searching the prefix and fallback directories for classes
|
||||||
|
* that have not been registered with the class map.
|
||||||
|
*
|
||||||
|
* @param bool $classMapAuthoritative
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||||
|
{
|
||||||
|
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should class lookup fail if not found in the current class map?
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isClassMapAuthoritative()
|
||||||
|
{
|
||||||
|
return $this->classMapAuthoritative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||||
|
*
|
||||||
|
* @param string|null $apcuPrefix
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setApcuPrefix($apcuPrefix)
|
||||||
|
{
|
||||||
|
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getApcuPrefix()
|
||||||
|
{
|
||||||
|
return $this->apcuPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers this instance as an autoloader.
|
||||||
|
*
|
||||||
|
* @param bool $prepend Whether to prepend the autoloader or not
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function register($prepend = false)
|
||||||
|
{
|
||||||
|
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||||
|
|
||||||
|
if (null === $this->vendorDir) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($prepend) {
|
||||||
|
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
|
||||||
|
} else {
|
||||||
|
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||||
|
self::$registeredLoaders[$this->vendorDir] = $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters this instance as an autoloader.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unregister()
|
||||||
|
{
|
||||||
|
spl_autoload_unregister(array($this, 'loadClass'));
|
||||||
|
|
||||||
|
if (null !== $this->vendorDir) {
|
||||||
|
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the given class or interface.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
* @return true|null True if loaded, null otherwise
|
||||||
|
*/
|
||||||
|
public function loadClass($class)
|
||||||
|
{
|
||||||
|
if ($file = $this->findFile($class)) {
|
||||||
|
$includeFile = self::$includeFile;
|
||||||
|
$includeFile($file);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the path to the file where the class is defined.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
*
|
||||||
|
* @return string|false The path if found, false otherwise
|
||||||
|
*/
|
||||||
|
public function findFile($class)
|
||||||
|
{
|
||||||
|
// class map lookup
|
||||||
|
if (isset($this->classMap[$class])) {
|
||||||
|
return $this->classMap[$class];
|
||||||
|
}
|
||||||
|
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (null !== $this->apcuPrefix) {
|
||||||
|
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||||
|
if ($hit) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = $this->findFileWithExtension($class, '.php');
|
||||||
|
|
||||||
|
// Search for Hack files if we are running on HHVM
|
||||||
|
if (false === $file && defined('HHVM_VERSION')) {
|
||||||
|
$file = $this->findFileWithExtension($class, '.hh');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $this->apcuPrefix) {
|
||||||
|
apcu_add($this->apcuPrefix.$class, $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false === $file) {
|
||||||
|
// Remember that this class does not exist.
|
||||||
|
$this->missingClasses[$class] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currently registered loaders keyed by their corresponding vendor directories.
|
||||||
|
*
|
||||||
|
* @return array<string, self>
|
||||||
|
*/
|
||||||
|
public static function getRegisteredLoaders()
|
||||||
|
{
|
||||||
|
return self::$registeredLoaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $class
|
||||||
|
* @param string $ext
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
private function findFileWithExtension($class, $ext)
|
||||||
|
{
|
||||||
|
// PSR-4 lookup
|
||||||
|
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||||
|
|
||||||
|
$first = $class[0];
|
||||||
|
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||||
|
$subPath = $class;
|
||||||
|
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||||
|
$subPath = substr($subPath, 0, $lastPos);
|
||||||
|
$search = $subPath . '\\';
|
||||||
|
if (isset($this->prefixDirsPsr4[$search])) {
|
||||||
|
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||||
|
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||||
|
if (file_exists($file = $dir . $pathEnd)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-4 fallback dirs
|
||||||
|
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 lookup
|
||||||
|
if (false !== $pos = strrpos($class, '\\')) {
|
||||||
|
// namespaced class name
|
||||||
|
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||||
|
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||||
|
} else {
|
||||||
|
// PEAR-like class name
|
||||||
|
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->prefixesPsr0[$first])) {
|
||||||
|
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||||
|
if (0 === strpos($class, $prefix)) {
|
||||||
|
foreach ($dirs as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 fallback dirs
|
||||||
|
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 include paths.
|
||||||
|
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function initializeIncludeClosure()
|
||||||
|
{
|
||||||
|
if (self::$includeFile !== null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope isolated include.
|
||||||
|
*
|
||||||
|
* Prevents access to $this/self from included files.
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
self::$includeFile = \Closure::bind(static function($file) {
|
||||||
|
include $file;
|
||||||
|
}, null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
378
datamodels/2.x/combodo-db-tools/vendor/composer/InstalledVersions.php
vendored
Normal file
378
datamodels/2.x/combodo-db-tools/vendor/composer/InstalledVersions.php
vendored
Normal file
@@ -0,0 +1,378 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer;
|
||||||
|
|
||||||
|
use Composer\Autoload\ClassLoader;
|
||||||
|
use Composer\Semver\VersionParser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is copied in every Composer installed project and available to all
|
||||||
|
*
|
||||||
|
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
||||||
|
*
|
||||||
|
* To require its presence, you can require `composer-runtime-api ^2.0`
|
||||||
|
*
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
class InstalledVersions
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var mixed[]|null
|
||||||
|
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
|
||||||
|
*/
|
||||||
|
private static $installed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private static $installedIsLocalDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool|null
|
||||||
|
*/
|
||||||
|
private static $canGetVendors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array[]
|
||||||
|
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
private static $installedByVendor = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
||||||
|
*
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackages()
|
||||||
|
{
|
||||||
|
$packages = array();
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
$packages[] = array_keys($installed['versions']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 === \count($packages)) {
|
||||||
|
return $packages[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names with a specific type e.g. 'library'
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackagesByType($type)
|
||||||
|
{
|
||||||
|
$packagesByType = array();
|
||||||
|
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
foreach ($installed['versions'] as $name => $package) {
|
||||||
|
if (isset($package['type']) && $package['type'] === $type) {
|
||||||
|
$packagesByType[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $packagesByType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given package is installed
|
||||||
|
*
|
||||||
|
* This also returns true if the package name is provided or replaced by another package
|
||||||
|
*
|
||||||
|
* @param string $packageName
|
||||||
|
* @param bool $includeDevRequirements
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isInstalled($packageName, $includeDevRequirements = true)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (isset($installed['versions'][$packageName])) {
|
||||||
|
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given package satisfies a version constraint
|
||||||
|
*
|
||||||
|
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
||||||
|
*
|
||||||
|
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
||||||
|
*
|
||||||
|
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
||||||
|
* @param string $packageName
|
||||||
|
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||||
|
{
|
||||||
|
$constraint = $parser->parseConstraints((string) $constraint);
|
||||||
|
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||||
|
|
||||||
|
return $provided->matches($constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a version constraint representing all the range(s) which are installed for a given package
|
||||||
|
*
|
||||||
|
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
||||||
|
* whether a given version of a package is installed, and not just whether it exists
|
||||||
|
*
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string Version constraint usable with composer/semver
|
||||||
|
*/
|
||||||
|
public static function getVersionRanges($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ranges = array();
|
||||||
|
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||||
|
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
||||||
|
}
|
||||||
|
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
||||||
|
}
|
||||||
|
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
||||||
|
}
|
||||||
|
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(' || ', $ranges);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||||
|
*/
|
||||||
|
public static function getVersion($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['version'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||||
|
*/
|
||||||
|
public static function getPrettyVersion($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['pretty_version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
||||||
|
*/
|
||||||
|
public static function getReference($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['reference'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['reference'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||||
|
*/
|
||||||
|
public static function getInstallPath($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
|
||||||
|
*/
|
||||||
|
public static function getRootPackage()
|
||||||
|
{
|
||||||
|
$installed = self::getInstalled();
|
||||||
|
|
||||||
|
return $installed[0]['root'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw installed.php data for custom implementations
|
||||||
|
*
|
||||||
|
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
|
||||||
|
*/
|
||||||
|
public static function getRawData()
|
||||||
|
{
|
||||||
|
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
// only require the installed.php file if this file is loaded from its dumped location,
|
||||||
|
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||||
|
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||||
|
self::$installed = include __DIR__ . '/installed.php';
|
||||||
|
} else {
|
||||||
|
self::$installed = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$installed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||||
|
*
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
public static function getAllRawData()
|
||||||
|
{
|
||||||
|
return self::getInstalled();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets you reload the static array from another file
|
||||||
|
*
|
||||||
|
* This is only useful for complex integrations in which a project needs to use
|
||||||
|
* this class but then also needs to execute another project's autoloader in process,
|
||||||
|
* and wants to ensure both projects have access to their version of installed.php.
|
||||||
|
*
|
||||||
|
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
||||||
|
* the data it needs from this class, then call reload() with
|
||||||
|
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
||||||
|
* the project in which it runs can then also use this class safely, without
|
||||||
|
* interference between PHPUnit's dependencies and the project's dependencies.
|
||||||
|
*
|
||||||
|
* @param array[] $data A vendor/composer/installed.php data set
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
|
||||||
|
*/
|
||||||
|
public static function reload($data)
|
||||||
|
{
|
||||||
|
self::$installed = $data;
|
||||||
|
self::$installedByVendor = array();
|
||||||
|
|
||||||
|
// when using reload, we disable the duplicate protection to ensure that self::$installed data is
|
||||||
|
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
|
||||||
|
// so we have to assume it does not, and that may result in duplicate data being returned when listing
|
||||||
|
// all installed packages for example
|
||||||
|
self::$installedIsLocalDir = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
private static function getInstalled()
|
||||||
|
{
|
||||||
|
if (null === self::$canGetVendors) {
|
||||||
|
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
||||||
|
}
|
||||||
|
|
||||||
|
$installed = array();
|
||||||
|
$copiedLocalDir = false;
|
||||||
|
|
||||||
|
if (self::$canGetVendors) {
|
||||||
|
$selfDir = strtr(__DIR__, '\\', '/');
|
||||||
|
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||||
|
$vendorDir = strtr($vendorDir, '\\', '/');
|
||||||
|
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||||
|
$installed[] = self::$installedByVendor[$vendorDir];
|
||||||
|
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||||
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||||
|
$required = require $vendorDir.'/composer/installed.php';
|
||||||
|
self::$installedByVendor[$vendorDir] = $required;
|
||||||
|
$installed[] = $required;
|
||||||
|
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
|
||||||
|
self::$installed = $required;
|
||||||
|
self::$installedIsLocalDir = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
|
||||||
|
$copiedLocalDir = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
// only require the installed.php file if this file is loaded from its dumped location,
|
||||||
|
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||||
|
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||||
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||||
|
$required = require __DIR__ . '/installed.php';
|
||||||
|
self::$installed = $required;
|
||||||
|
} else {
|
||||||
|
self::$installed = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::$installed !== array() && !$copiedLocalDir) {
|
||||||
|
$installed[] = self::$installed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed;
|
||||||
|
}
|
||||||
|
}
|
||||||
21
datamodels/2.x/combodo-db-tools/vendor/composer/LICENSE
vendored
Normal file
21
datamodels/2.x/combodo-db-tools/vendor/composer/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
15
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_classmap.php
vendored
Normal file
15
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_classmap.php
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_classmap.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Combodo\\iTop\\DBTools\\Enum\\BinExitCode' => $baseDir . '/src/Enum/BinExitCode.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Exception\\AuthenticationException' => $baseDir . '/src/Exception/AuthenticationException.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Service\\BinUtils' => $baseDir . '/src/Service/BinUtils.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Service\\DBAnalyzerUtils' => $baseDir . '/src/Service/DBAnalyzerUtils.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Service\\DBToolsUtils' => $baseDir . '/src/Service/DBToolsUtils.php',
|
||||||
|
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||||
|
);
|
||||||
9
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_namespaces.php
vendored
Normal file
9
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_namespaces.php
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_namespaces.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
);
|
||||||
10
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_psr4.php
vendored
Normal file
10
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_psr4.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_psr4.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Combodo\\iTop\\DBTools\\' => array($baseDir . '/src'),
|
||||||
|
);
|
||||||
37
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_real.php
vendored
Normal file
37
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_real.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_real.php @generated by Composer
|
||||||
|
|
||||||
|
class ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e
|
||||||
|
{
|
||||||
|
private static $loader;
|
||||||
|
|
||||||
|
public static function loadClassLoader($class)
|
||||||
|
{
|
||||||
|
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||||
|
require __DIR__ . '/ClassLoader.php';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Composer\Autoload\ClassLoader
|
||||||
|
*/
|
||||||
|
public static function getLoader()
|
||||||
|
{
|
||||||
|
if (null !== self::$loader) {
|
||||||
|
return self::$loader;
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register(array('ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e', 'loadClassLoader'), true, true);
|
||||||
|
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||||
|
spl_autoload_unregister(array('ComposerAutoloaderInit38292b9b3a56c6c8776285a17c58034e', 'loadClassLoader'));
|
||||||
|
|
||||||
|
require __DIR__ . '/autoload_static.php';
|
||||||
|
call_user_func(\Composer\Autoload\ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::getInitializer($loader));
|
||||||
|
|
||||||
|
$loader->setClassMapAuthoritative(true);
|
||||||
|
$loader->register(true);
|
||||||
|
|
||||||
|
return $loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
41
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_static.php
vendored
Normal file
41
datamodels/2.x/combodo-db-tools/vendor/composer/autoload_static.php
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_static.php @generated by Composer
|
||||||
|
|
||||||
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
|
class ComposerStaticInit38292b9b3a56c6c8776285a17c58034e
|
||||||
|
{
|
||||||
|
public static $prefixLengthsPsr4 = array (
|
||||||
|
'C' =>
|
||||||
|
array (
|
||||||
|
'Combodo\\iTop\\DBTools\\' => 21,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $prefixDirsPsr4 = array (
|
||||||
|
'Combodo\\iTop\\DBTools\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/../..' . '/src',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $classMap = array (
|
||||||
|
'Combodo\\iTop\\DBTools\\Enum\\BinExitCode' => __DIR__ . '/../..' . '/src/Enum/BinExitCode.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Exception\\AuthenticationException' => __DIR__ . '/../..' . '/src/Exception/AuthenticationException.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Service\\BinUtils' => __DIR__ . '/../..' . '/src/Service/BinUtils.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Service\\DBAnalyzerUtils' => __DIR__ . '/../..' . '/src/Service/DBAnalyzerUtils.php',
|
||||||
|
'Combodo\\iTop\\DBTools\\Service\\DBToolsUtils' => __DIR__ . '/../..' . '/src/Service/DBToolsUtils.php',
|
||||||
|
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static function getInitializer(ClassLoader $loader)
|
||||||
|
{
|
||||||
|
return \Closure::bind(function () use ($loader) {
|
||||||
|
$loader->prefixLengthsPsr4 = ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::$prefixLengthsPsr4;
|
||||||
|
$loader->prefixDirsPsr4 = ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::$prefixDirsPsr4;
|
||||||
|
$loader->classMap = ComposerStaticInit38292b9b3a56c6c8776285a17c58034e::$classMap;
|
||||||
|
|
||||||
|
}, null, ClassLoader::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
5
datamodels/2.x/combodo-db-tools/vendor/composer/installed.json
vendored
Normal file
5
datamodels/2.x/combodo-db-tools/vendor/composer/installed.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"packages": [],
|
||||||
|
"dev": true,
|
||||||
|
"dev-package-names": []
|
||||||
|
}
|
||||||
23
datamodels/2.x/combodo-db-tools/vendor/composer/installed.php
vendored
Normal file
23
datamodels/2.x/combodo-db-tools/vendor/composer/installed.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php return array(
|
||||||
|
'root' => array(
|
||||||
|
'name' => 'combodo/combodo-db-tools',
|
||||||
|
'pretty_version' => '1.0.0+no-version-set',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => null,
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../../',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev' => true,
|
||||||
|
),
|
||||||
|
'versions' => array(
|
||||||
|
'combodo/combodo-db-tools' => array(
|
||||||
|
'pretty_version' => '1.0.0+no-version-set',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => null,
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../../',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
@@ -71,6 +71,19 @@
|
|||||||
<module>itop-virtualization-mgmt</module>
|
<module>itop-virtualization-mgmt</module>
|
||||||
</modules>
|
</modules>
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
|
<sub_options>
|
||||||
|
<options type="array">
|
||||||
|
<choice>
|
||||||
|
<extension_code>itop-container-mgmt</extension_code>
|
||||||
|
<title>Containerization</title>
|
||||||
|
<description><![CDATA[Manage Container Images, Applications and Hosts]]></description>
|
||||||
|
<modules type="array">
|
||||||
|
<module>itop-container-mgmt</module>
|
||||||
|
</modules>
|
||||||
|
<default>false</default>
|
||||||
|
</choice>
|
||||||
|
</options>
|
||||||
|
</sub_options>
|
||||||
</choice>
|
</choice>
|
||||||
</options>
|
</options>
|
||||||
</step>
|
</step>
|
||||||
|
|||||||
@@ -199,15 +199,15 @@ function RaiseAlarm($sMessage)
|
|||||||
//////////
|
//////////
|
||||||
// Main
|
// Main
|
||||||
|
|
||||||
try {
|
|
||||||
utils::UseParamFile();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
echo "Error: ".$e->GetMessage()."\n";
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (utils::IsModeCLI()) {
|
if (utils::IsModeCLI()) {
|
||||||
SetupUtils::CheckPhpAndExtensionsForCli(new CLIPage('Check backup utility'));
|
try {
|
||||||
|
utils::UseParamFile();
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo 'Error: '.$e->GetMessage()."\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$oP = new CLIPage('Check backup utility');
|
||||||
|
SetupUtils::CheckPhpAndExtensionsForCli($oP);
|
||||||
|
|
||||||
echo date('Y-m-d H:i:s')." - running check-backup utility\n";
|
echo date('Y-m-d H:i:s')." - running check-backup utility\n";
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -88,16 +88,15 @@ if (utils::IsModeCLI()) {
|
|||||||
$oP = new CLIPage(GetOperationName());
|
$oP = new CLIPage(GetOperationName());
|
||||||
|
|
||||||
SetupUtils::CheckPhpAndExtensionsForCli($oP);
|
SetupUtils::CheckPhpAndExtensionsForCli($oP);
|
||||||
|
try {
|
||||||
|
utils::UseParamFile();
|
||||||
|
} catch (Exception $e) {
|
||||||
|
ExitError($oP, $e->GetMessage());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$oP = new WebPage(GetOperationName());
|
$oP = new WebPage(GetOperationName());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
utils::UseParamFile();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
ExitError($oP, $e->GetMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
ExecuteMainOperation($oP);
|
ExecuteMainOperation($oP);
|
||||||
|
|
||||||
$oP->output();
|
$oP->output();
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class DBRestore extends DBBackup
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
private $sDBUser;
|
private $sDBUser;
|
||||||
|
|
||||||
public function __construct(\Config $oConfig = null)
|
public function __construct(?\Config $oConfig = null)
|
||||||
{
|
{
|
||||||
parent::__construct($oConfig);
|
parent::__construct($oConfig);
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +1,205 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Set>
|
<Set>
|
||||||
<Brand alias="Brand" id="1">
|
<Brand alias="Brand" id="1">
|
||||||
<name>Acer</name>
|
<name>Acer</name>
|
||||||
</Brand>
|
<logo><mimetype>image/svg+xml</mimetype><filename>icon-acer.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmc6c3ZnIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOnN2Zz0iaH
|
||||||
<Brand alias="Brand" id="2">
|
R0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgaWQ9ImFjZXIiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iODMiIGhlaWdodD0iODMiIHZpZXdCb3g9IjAgMCA4MyA4MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgc29kaXBvZGk6ZG9jbmFtZT0iaWNvbi1hY2VyLnN2ZyIgaW5rc2NhcGU6dmVyc2lvbj0iMS40LjMgKDBkMTVmNzUwNDIsIDIwMjUtMTItMjUpIj48c3ZnOmRlZnMgaWQ9ImRlZnMxIi8+PHNvZGlwb2RpOm5hbWVkdmlldyBpZD0ibmFtZWR2
|
||||||
<name>Apple</name>
|
aWV3MSIgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYm9yZGVyb3BhY2l0eT0iMC4yNSIgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9IjAiIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIgc2hvd2d1aWRlcz0idHJ1ZSIgaW5rc2NhcGU6em9vbT0iMTAuNDgzMDcxIiBpbmtzY2FwZTpjeD0iNzUuNzg4ODYiIGlua3NjYXBlOmN5PSIzNS
|
||||||
</Brand>
|
42NzY1NjgiIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMjU2MCIgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTM2MCIgaW5rc2NhcGU6d2luZG93LXg9IjAiIGlua3NjYXBlOndpbmRvdy15PSIwIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJhY2VyIj48c29kaXBvZGk6Z3VpZGUgcG9zaXRpb249IjQwLjMwNzkxOSw0MS4yMjAyMTQiIG9yaWVudGF0aW9uPSIwLC0xIiBpZD0iZ3VpZGUxIiBpbmtzY2FwZTpsb2NrZWQ9
|
||||||
<Brand alias="Brand" id="3">
|
ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+Cjxzdmc6cGF0aCBpZD0iYWNlci1sb2dvIiBzdHlsZT0iZmlsbDojODBjMzQzIiBkPSJtIDgyLjg1LDMyLjc2MDg5MyBjIC0wLjI5LC0wLjQyIC0wLjYyLC0wLjcgLTIuMDQsLTAuODEgLTAuMzcsLTAuMDMgLTEuNiwtMC4wNyAtMy42NiwtMC4wNyAtNS40MiwwIC05LjEsMS42NSAtMTAuOTgsNC45MSAwLjUyLC0zLjI4IC0yLjY3LC00LjkyIC05LjU1LC00LjkyIC04LjA5LDAgLTEzLjE0LDMuMjcgLTE1LjE1LDkuOD
|
||||||
<name>Asus</name>
|
EgLTAuNzQsMS45MSAtMC44Miw0LjAyIC0wLjIzLDUuOTggbCAtMS45MSwwLjEzIGMgLTEuNDksMC4xMSAtMy40NiwwLjIyIC00LjY2LDAuMjIgLTIuOTYsMCAtNC44LC0wLjUgLTUuNTEsLTEuNSAtMC42NCwtMC45IC0wLjU3LC0yLjU2IDAuMTcsLTQuOTggMS4yMywtNC4wMiA0LjI5LC01LjgyIDkuMTgsLTUuODIgMi41MywwIDUsMC4yNyA1LDAuMjcgMC4zLC0wLjA1IDAuNTEsLTAuMzMgMC40NiwtMC42NCAwLC0wLjAxIDAsLTAuMDIgLTAuMDEsLTAuMDMgbCAtMC4w
|
||||||
</Brand>
|
NSwtMC4zOCAtMC4xNywtMS4zNSBjIC0wLjExLC0wLjg5IC0wLjc3LC0xLjQxIC0xLjk3LC0xLjU3IC0xLjEsLTAuMDcgLTEuOTEsLTAuMTMgLTMuMTIsLTAuMTMgaCAtMC4wNyBjIC02LjM5LDAuMDEgLTEwLjg0LDIuMTIgLTEzLjM2LDYuMzIgMC45MiwtNC4yMSAtMi4wNCwtNi4zMiAtOC44NywtNi4zMiAtMi43MywtMC4wNSAtNS40NiwwLjA2IC04LjE4LDAuMzMgLTEuMDMsLTAuMDMgLTEuOTYsMC42MSAtMi4zMywxLjU3IGwgLTAuNTQsMS43MyBjIC0wLjEsMC4zMi
|
||||||
<Brand alias="Brand" id="4">
|
AwLjA1LDAuNDggMC40NiwwLjQ4IGggMC4wMSBjIDAuMywtMC4wNCAxLjQ2LC0wLjE1IDMuNDQsLTAuMzEgMi42MiwtMC4yMSA0LjU1LC0wLjMyIDUuODMsLTAuMzIgMy43NywwIDUuMzUsMC45NSA0Ljc2LDIuODQgLTAuMTEsMC40IC0wLjQ0LDAuNzEgLTAuODUsMC43OCAtMy41NiwwLjU5IC02LjM5LDEuMDIgLTguNDgsMS4yOCAtNS44OSwwLjc1IC05LjI5LDIuNTkgLTEwLjIsNS41MiAtMS4yNSw0LjAzIDEuODksNi4wNCA5LjQ0LDYuMDQgMy4xNywwLjA0IDYuMzQs
|
||||||
<name>Cisco</name>
|
LTAuMTggOS40OCwtMC42NSAxLjQ3LC0wLjI1IDIuMjIsLTAuNjMgMi41MSwtMS41OCBsIDEuNDEsLTQuNDkgYyAtMC4xNSw0LjQ5IDIuOTksNi43NSA5LjQxLDYuNzUgMi4yMywwLjA0IDQuNDUsLTAuMDYgNi42NiwtMC4zMSAxLjMyLC0wLjIzIDEuOTUsLTAuNTIgMi4yNCwtMS41MSBsIDAuMjgsLTEuNDEgYyAxLjM3LDIuMTQgNC4zNywzLjIxIDkuMDEsMy4yMSA0Ljg5LDAgNy43NCwtMC4xNCA4LjU1LC0wLjQxIDAuNTcsLTAuMTIgMS4wNCwtMC41MiAxLjI1LC0xLj
|
||||||
</Brand>
|
A2IDAuMDMsLTAuMDkgMC4wNSwtMC4xOSAwLjA2LC0wLjI4IGwgMC41OSwtMS45MSBjIDAuMSwtMC4zMyAtMC4wNSwtMC40OSAtMC40NSwtMC40OCBsIC0zLjEzLDAuMTUgYyAtMi4wOSwwLjEyIC0zLjcyLDAuMTggLTQuOSwwLjE3IC0xLjU0LDAuMDggLTMuMDgsLTAuMDcgLTQuNTgsLTAuNDYgLTEuMiwtMC40MSAtMS45NCwtMS42MSAtMS43NywtMi44NiBsIDkuOTEsLTEuMjcgYyA0LjQ0LC0wLjU3IDcuNDIsLTEuOTQgOC45MiwtNC4xMiBsIC0zLjM3LDExLjczIGMg
|
||||||
<Brand alias="Brand" id="5">
|
LTAuMDcsMC4xOCAtMC4wNCwwLjM4IDAuMDcsMC41MyAwLjE4LDAuMTcgMC40MSwwLjI1IDAuNjUsMC4yMiBoIDQuMSBjIDAuNDcsMC4wNyAwLjkzLC0wLjIyIDEuMDYsLTAuNjggbCAzLjYyLC0xMi42NyBjIDAuNDgsLTEuNjcgMiwtMi40OCA0LjY3LC0yLjQ4IDIuNDEsMCA0LjIyLDAuMDIgNS4zOCwwLjA3IDAuMDMsMCAwLjA2LDAgMC4wOSwwIDAuMzksMCAwLjc0LC0wLjI2IDAuODQsLTAuNjMgbCAwLjYzLC0xLjc0IGMgMC4xNSwtMC4zIDAuMTIsLTAuNjMgLTAuMD
|
||||||
<name>Dell</name>
|
UsLTAuODkgbSAtNjYuMTIsMTUuMjQgYyAtMS44MywwLjIzIC0zLjY4LDAuMzMgLTUuNTIsMC4zIC00LjE3LDAgLTUuOTksLTAuODQgLTUuNDYsLTIuNTMgMC4zOCwtMS4yMSAxLjQ3LC0xLjk0IDMuMjgsLTIuMTkgbCA5LjQ4LC0xLjI4IHogbSA0My44MywtMTAuMjcgYyAtMC40LDEuMyAtMi4yNSwyLjE5IC01LjU2LDIuNjcgbCAtNy45LDEuMTMgMC4yLC0wLjY1IGMgMC4zOSwtMS43NCAxLjM3LC0zLjI4IDIuNzksLTQuMzcgMS4yLC0wLjc3IDMuMTUsLTEuMTYgNS44NiwtMS4xNiAzLjU2LDAgNS4xLDAuOCA0LjYxLDIuMzgiLz4KPC9zdmc6c3ZnPgo=</data><downloads_count>0</downloads_count></logo>
|
||||||
</Brand>
|
<finalclass>Brand</finalclass>
|
||||||
<Brand alias="Brand" id="6">
|
<friendlyname>Acer</friendlyname>
|
||||||
<name>HP Inc</name>
|
</Brand>
|
||||||
</Brand>
|
<Brand alias="Brand" id="2">
|
||||||
<Brand alias="Brand" id="7">
|
<name>Apple</name>
|
||||||
<name>HPE</name>
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-mac-os.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwODgzZDkiIGQ9Ik0zNi4yMzIsMjMuOTg1YzAtNS44NjUsNC43NjYtOC41MSw0Ljk2Ni04LjYzNmMtMi41OTYtMy45OTMtNi43OS00LjQ2Ny
|
||||||
</Brand>
|
04LjM2Mi00LjQ2OCBjLTMuNjQzLDAtNi44NjMsMi4wMjItOC41ODUsMi4wMjJjLTEuNzk3LDAtNC40MTgtMi4xMjEtNy4zNjMtMi4wMjJjLTMuODQzLDAuMDc1LTcuMzYzLDIuMzQ2LTkuMzM0LDUuNjkxIGMtMS4zOTcsMi4zOTYtMS45NDcsNS4yMTctMS44OTYsOC4wODdjMC4wMDIsMC4xMTMsMC4wMTcsMC4yMjgsMC4wMiwwLjM0MUgzNi4zMkMzNi4yNzksMjQuNjcxLDM2LjI0MywyNC4zMzcsMzYuMjMyLDIzLjk4NXoiLz48cGF0aCBmaWxsPSIjMDg4M2Q5IiBkPSJN
|
||||||
<Brand alias="Brand" id="8">
|
MzAuNTY1LDcuMDYzQzMyLjI2MSw1LjE5MSwzMy4yMSwyLjYyMSwzMy4wNiwwYy0yLjM0NiwwLTUuMDY2LDEuMzcyLTYuNzg4LDMuMzk0IGMtMS4zNDgsMS42NzItMi43OTUsNC4yOTMtMi4yNzEsNi45MTNDMjYuNDIyLDEwLjYwNywyOS4wNDMsOS4wODUsMzAuNTY1LDcuMDYzeiIvPjxwYXRoIGZpbGw9IiMwMzcwYzgiIGQ9Ik0xNy41MTEsNDVjMi43NzEsMCwzLjc5NC0xLjg0OCw3LjQxMy0xLjg0OGMzLjM3LDAsNC40MTgsMS44NDgsNy4zMzgsMS44NDggYzMuMDcsMCw1LjA5Mi0yLjc5NSw2LjkxMy01LjU2N2MyLjI5NS0zLjIxOCwzLjA3LTYuMjg4LDMuMTY5LTYuNDE0Yy0wLjA5NCwwLTUuMjg3LTIuMTEyLTYuMDI2LTguMDE5SDUuNjc4IGMwLjE1Nyw1LjMxMSwyLjIyOCwxMC43OSw0LjY3MSwxNC4zMDlDMTIuMjcsNDIuMDU1LDE0LjQ0MSw0NSwxNy41MTEsNDV6Ii8+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
<name>IBM</name>
|
<finalclass>Brand</finalclass>
|
||||||
</Brand>
|
<friendlyname>Apple</friendlyname>
|
||||||
<Brand alias="Brand" id="9">
|
</Brand>
|
||||||
<name>Lenovo</name>
|
<Brand alias="Brand" id="3">
|
||||||
</Brand>
|
<name>Asus</name>
|
||||||
<Brand alias="Brand" id="10">
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-asus.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sbnM9Imh0dHA6Ly93
|
||||||
<name>Razer</name>
|
d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwLDAsMjU2LDI1NiIgd2lkdGg9IjY0cHgiIGhlaWdodD0iNjRweCIgZmlsbC1ydWxlPSJub256ZXJvIiB2ZXJzaW9uPSIxLjEiIGlkPSJzdmcxMyIgc29kaXBvZGk6ZG9jbmFtZT0iaWNvbnM4LWFzdXMgKDEpLnN2ZyIgaW5rc2NhcGU6dmVyc2lvbj0iMS40LjMgKDBkMTVmNzUwNDIsIDIwMjUtMTItMjUpIj48c29kaXBvZGk6bmFtZWR2aWV3IGlkPS
|
||||||
</Brand>
|
JuYW1lZHZpZXcxMyIgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYm9yZGVyb3BhY2l0eT0iMC4yNSIgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9IjAiIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIgaW5rc2NhcGU6em9vbT0iMTcuMTg3NSIgaW5rc2NhcGU6Y3g9IjMxLjk3MDkwOSIgaW5rc2NhcGU6Y3k9IjMyIiBpbmtzY2FwZTp3
|
||||||
<Brand alias="Brand" id="11">
|
aW5kb3ctd2lkdGg9IjI1NjAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNjAiIGlua3NjYXBlOndpbmRvdy14PSIwIiBpbmtzY2FwZTp3aW5kb3cteT0iMCIgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzEzIi8+PGRlZnMgaWQ9ImRlZnMxMCI+PHJhZGlhbEdyYWRpZW50IGN4PSIzNC42MjUiIGN5PSIzMS44NzUiIHI9IjIzLjIwNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjb2xvci0xIj
|
||||||
<name>Samsung</name>
|
48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmNGU5YzMiIGlkPSJzdG9wMSIvPjxzdG9wIG9mZnNldD0iMC4yMTkiIHN0b3AtY29sb3I9IiNmOGVlY2QiIGlkPSJzdG9wMiIvPjxzdG9wIG9mZnNldD0iMC42NDQiIHN0b3AtY29sb3I9IiNmZGY0ZGMiIGlkPSJzdG9wMyIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZjZlMSIgaWQ9InN0b3A0Ii8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQgeDE9IjAuMzY1IiB5MT0iMzIuNSIgeDI9
|
||||||
</Brand>
|
IjY0IiB5Mj0iMzIuNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjb2xvci0yIj48c3RvcCBvZmZzZXQ9IjAuMDUzIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBpZD0ic3RvcDUiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDAwMDAiIGlkPSJzdG9wNiIvPjwvbGluZWFyR3JhZGllbnQ+PHJhZGlhbEdyYWRpZW50IGN4PSIzNC42MjUiIGN5PSIzMS44NzUiIHI9IjIzLjIwNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPS
|
||||||
<Brand alias="Brand" id="12">
|
Jjb2xvci0zIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmNGU5YzMiIGlkPSJzdG9wNyIvPjxzdG9wIG9mZnNldD0iMC4yMTkiIHN0b3AtY29sb3I9IiNmOGVlY2QiIGlkPSJzdG9wOCIvPjxzdG9wIG9mZnNldD0iMC42NDQiIHN0b3AtY29sb3I9IiNmZGY0ZGMiIGlkPSJzdG9wOSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZjZlMSIgaWQ9InN0b3AxMCIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVs
|
||||||
<name>Sony</name>
|
ZT0ibm9uemVybyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIGZvbnQtZmFtaWx5PSJub25lIiBmb250LXdlaWdodD0ibm9uZSIgZm9udC1zaXplPSJub25lIiB0ZXh0LWFuY2hvcj0ibm9uZSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiIGlkPSJnMT
|
||||||
</Brand>
|
MiPjxnIHRyYW5zZm9ybT0ic2NhbGUoNCw0KSIgaWQ9ImcxMiI+PHBhdGggZD0iTTYuMTU2LDI5LjI0M2wtNS43MjMsOS45MTljLTAuMTkyLDAuMzMzIDAuMDQ4LDAuNzUgMC40MzMsMC43NWgyLjc2NGMwLjM1NiwwIDAuNjg2LC0wLjE5IDAuODY1LC0wLjQ5OGw1LjYyOSwtOS43MDF6TTYuMjk5LDI5LjAwNWMwLDAgMC44MTUsLTEuNDg2IDEuNjI1LC0yLjkyYzAuMzU0LC0wLjYyOCAxLjAxOSwtMS4wMTQgMS43NCwtMS4wMTRjMS40MDgsMC4wMDEgMy43NTcsMC4wMDMg
|
||||||
<Brand alias="Brand" id="13">
|
NS4wODYsMC4wMDRjMC41NTIsMCAwLjk5NSwwLjQ0OCAwLjk5NSwxLjAwMXYyLjYxYzAsMCAwLjMyMywtMS4zODYgMC44OTEsLTIuMDQzYzAuNTM0LC0wLjYxOSAxLjI0NiwtMS40NzggMi44NzIsLTEuNTkyaDEwLjk2M2MwLjU1MiwwIDEsMC40NDggMSwxdjEuOTU1YzAsMC41NTIgLTAuNDQ4LDEgLTEsMXpNNjQsMjguMDA4di0xLjk1OGMwLC0wLjU1MiAtMC40NDgsLTEgLTEsLTFoLTExLjhjLTEuNjIyLDAuMTE0IC0yLjMzNywwLjk3MiAtMi44NzIsMS41OTJjLTAuNT
|
||||||
<name>Toshiba</name>
|
Y5LDAuNjU3IC0wLjg5LDIuMDQzIC0wLjg5LDIuMDQzdjAuMzE4bDE1LjU2MiwwLjAwNWMwLjU1MiwwIDEsLTAuNDQ4IDEsLTF6TTMzLjA5NSwyNS4wN2gxLjU3OGMwLjU1MiwwIDEsMC40NDggMSwxdjIuOTM1aC0zLjU3OHYtMi45MzVjMCwtMC41NTIgMC40NDgsLTEgMSwtMXpNNDQuODM5LDI1LjA3aDEuNTc0YzAuNTUyLDAgMSwwLjQ0OCAxLDF2Mi45MzVoLTMuNTc0di0yLjkzNWMwLC0wLjU1MiAwLjQ0NywtMSAxLC0xek00Ny40MTMsMzAuNDI1bC0zLjUxNCwtMC4y
|
||||||
</Brand>
|
MzN2NC41NjZjMCwwIC0wLjAxLDEuMzE0IC0xLjE1OCwxLjMxNGMtMS4xMzgsMCAtNi4wMzksMCAtNi4wMzksMGMwLDAgLTEuMDIzLC0wLjA5MyAtMS4wMjMsLTEuMzAzYzAsLTEuMjA3IDAsLTUuMTk2IDAsLTUuMTk2bC0zLjU0OSwtMC4yODV2Ny4wMDFjMC41NzQsMy4zNTkgMy4zMTEsMy42MTcgMy4zMTEsMy42MTdjMCwwIDAuMjc4LDAuMDIyIDAuMzI0LDAuMDI2aDguMTU2YzAsMCAzLjQ5MSwtMC4zMTEgMy40OTEsLTQuMDIzYzAuMDAxLC0zLjcxMyAwLjAwMSwtNS
|
||||||
|
40ODQgMC4wMDEsLTUuNDg0ek0xMy4xMTEsMzkuOTE0aDE1LjczYzIuOTE0LC0wLjY0NyAzLjIxOCwtMy41NzcgMy4yMTgsLTMuNTc3YzAuMTM2LC0wLjg3MSAwLjA1NywtMS41NzQgMC4wNTcsLTEuNTc0Yy0wLjA4OCwtMC41ODggLTEuMDk0LC0zLjE3OCAtMy4yODEsLTMuNDA1Yy0xLjMwNCwtMC4xMzQgLTEyLjkxLC0xLjE1NSAtMTIuOTEsLTEuMTU1YzAuMjI1LDEuMjg4IDAuNzQ4LDEuOTM4IDEuMDk0LDIuMzExYzAuODA1LDAuODU3IDIuMDg3LDEuMDk5IDIuMDg3
|
||||||
|
LDEuMDk5YzAuMzA5LDAuMDMzIDguOTQ1LDAuODI0IDguOTQ1LDAuODI0YzAuMjc0LDAuMDE3IDAuNzk3LDAuMDkzIDAuNzksMC44NDljMCwwLjA5MSAtMC4wNzUsMC43NTcgLTAuNzM4LDAuNzU3aC0xMi4wMTRjLTAuMjc2LDAgLTAuNSwtMC4yMjQgLTAuNSwtMC41di01LjM3M2wtMy40NzgsLTAuMjgxdjkuMDI3YzAsMC41NSAwLjQ0OCwwLjk5OCAxLDAuOTk4ek00Ny40NDQsMzcuMDE3YzAuMDAxLC0wLjU1MiAwLjQ0OCwtMC45OTggMSwtMC45OThoMTEuNDI5YzAuMj
|
||||||
|
g2LDAgMC41OTUsLTAuMTg3IDAuNTk1LC0wLjE4N2MwLjEzLC0wLjEyOSAwLjIzNSwtMC4zNjQgMC4yMzUsLTAuNTkxYzAsLTAuNzUzIC0wLjU2MSwtMC43ODYgLTAuODQzLC0wLjgwM2MwLDAgLTguNzMyLC0wLjgwOCAtOS4wMzYsLTAuODM0YzAsMCAtMS4yMTEsLTAuMjA3IC0yLjAxNywtMS4wNjhjLTAuMzUxLC0wLjM2OSAtMC44MTUsLTAuNzcxIC0xLjE2MSwtMi4wOTljMCwwIDExLjY3MSwwLjc2MyAxMi45NjgsMC44OTdjMi4xODksMC4yMzIgMy4yMTUsMi42MzIgMy4zMDgsMy40M2MwLDAgMC4wOTMsMC43MjIgLTAuMDIsMS42MDdjMCwwIC0wLjQ1NCwzLjM3NCAtMy42NjQsMy41NzloLTExLjc5N2MtMC41NTMsMCAtMS4wMDEsLTAuNDQ5IC0xLC0xLjAwMnoiIGZpbGw9InVybCgjY29sb3ItMikiIGlkPSJwYXRoMTEiLz48L2c+PC9nPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Asus</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="4">
|
||||||
|
<name>Cisco</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icon-cisco.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sbnM9Imh0dHA6Ly93d
|
||||||
|
3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgd2lkdGg9IjEwOCIgaGVpZ2h0PSIxMDgiIHZpZXdCb3g9IjAgMCAxMDggMTA4IiByb2xlPSJpbWciIHZlcnNpb24
|
||||||
|
9IjEuMSIgaWQ9InN2ZzExIiBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLWNpc2NvLnN2ZyIgaW5rc2NhcGU6dmVyc2lvbj0iMS40LjMgKDBkMTVmNzUwNDIsIDIwMjUtMTItMjUpIj48c29kaXBvZGk6bmFtZWR2aWV3IGlkPSJuYW1lZHZpZXcxMSIgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYm9yZGVyb3BhY2l0eT0iMC4yNSIgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiIGlua3NjYXBlO
|
||||||
|
nBhZ2VjaGVja2VyYm9hcmQ9IjAiIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIgc2hvd2d1aWRlcz0idHJ1ZSIgaW5rc2NhcGU6em9vbT0iNi44MjI5NjAyIiBpbmtzY2FwZTpjeD0iNDguODc5MDc4IiBpbmtzY2FwZTpjeT0iNTEuNzM3MDc1IiBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjI1NjAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNjAiIGlua3NjYXBlOndpbmRvdy14PSIwIiBpbmtzY2FwZTp3aW5kb3cteT0iMCIgaW5rc2NhcGU6d2luZG93LW1heGl
|
||||||
|
taXplZD0iMSIgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMTEiPjxzb2RpcG9kaTpndWlkZSBwb3NpdGlvbj0iMTYuOTM5NTg3LDUzLjM3NjMwMyIgb3JpZW50YXRpb249IjAsLTEiIGlkPSJndWlkZTExIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+PHRpdGxlIGlkPSJmdy1jLWhlYWRlcl9fbG9nby10aXRsZSI+Q2lzY28uY29tIEZyYW5jZTwvdGl0bGU+PGRlZnMgaWQ9ImRlZnMxIj48cGF0aCBkPSJtIDAsMjIuNzY5IGEgM
|
||||||
|
i4zNDgsMi4zNDggMCAwIDAgMy45MzUsMS41NDUgYyAwLjQzNCwtMC40MDMgMC43LC0wLjk1NSAwLjc0NCwtMS41NDUgdiAtNS4yIGEgMi4zNCwyLjM0IDAgMCAwIC00LjY3OSwwIHYgNS4yIiBpZD0iYmFyX3Nob3J0IiBjbGFzcz0iYmFyIi8+PHBhdGggZD0ibSAxMi45NSwyMi43NjkgYSAyLjM0OSwyLjM0OSAwIDAgMCAyLjM0LDIuMTcxIDIuMzQ2LDIuMzQ2IDAgMCAwIDIuMzM5LC0yLjE3MSBWIDExLjExMiBhIDIuMzQxLDIuMzQxIDAgMCAwIC00LjY3OSwwIFYgMjI
|
||||||
|
uNzciIGlkPSJiYXJfdGFsbCIgY2xhc3M9ImJhciIvPjxwYXRoIGQ9Im0gMjUuODMyLDI3LjQ2NCBhIDIuMzQ1LDIuMzQ1IDAgMCAwIDQuNjc4LDAgViAyLjI0OSBhIDIuMzQyLDIuMzQyIDAgMCAwIC00LjY3OCwwIHYgMjUuMjE1IiBpZD0iYmFyX2dyYW5kZSIgY2xhc3M9ImJhciIvPjxwYXRoIGQ9Im0gMjQuMDI2LDU2LjI3NyB2IC01LjAwMiBsIC0wLjA5OCwwLjA0MyBhIDkuMjUzLDkuMjUzIDAgMCAxIC0zLjYwNSwwLjkxNSA1LjMwMyw1LjMwMyAwIDAgMSAtMy42M
|
||||||
|
ywtMS4wNyA0LjY0NCw0LjY0NCAwIDAgMSAtMS41OCwtMi4yNDQgNS4zOTUsNS4zOTUgMCAwIDEgLTAuMTA2LC0zIDQuNiw0LjYgMCAwIDEgMS42MDksLTIuNTY2IDQuODIzLDQuODIzIDAgMCAxIDIuNTI4LC0xLjA5IDguMzMyLDguMzMyIDAgMCAxIDQuNzc0LDAuODk1IGwgMC4xMDgsMC4wNTYgdiAtNS4wMyBsIC0wLjIyOCwtMC4wNjEgYSAxMi43OCwxMi43OCAwIDAgMCAtNC41NTIsLTAuNTk2IDEwLjUzNCwxMC41MzQgMCAwIDAgLTQuMDY1LDAuOTMgOS4yOSw5LjI
|
||||||
|
5IDAgMCAwIC0zLjMyOSwyLjU3MiAxMC4wMTQsMTAuMDE0IDAgMCAwIC0wLjE4MiwxMi4xOCA5LjU0Niw5LjU0NiAwIDAgMCA1LjI5MiwzLjQwMyBjIDIuMjExLDAuNTM4IDQuNTI4LDAuNDU2IDYuNjk3LC0wLjIzNCBsIDAuMzY3LC0wLjEwMSIgaWQ9ImNpc2NvX2MiLz48L2RlZnM+PGcgZmlsbD0iIzAyYzhmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBpZD0iZzExIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wOTQ2Njg1OSwyNi4yMzQ5NDYpIj48dXNlIGhyZWY9IiNja
|
||||||
|
XNjb19jIiBpZD0idXNlMSIvPjx1c2UgaHJlZj0iI2Npc2NvX2MiIHg9IjQ5LjUiIGlkPSJ1c2UyIi8+PHBhdGggZD0ibSA0MS42OSw1Mi4xMjUgLTAuMDE5LDQuMzA4IDAuMzE1LDAuMDU0IGMgMC45ODksMC4xODUgMS45ODcsMC4zMTMgMi45OSwwLjM4NSBhIDE4LjEsMTguMSAwIDAgMCAyLjY0MiwwLjA1MSBjIDAuODQyLC0wLjA2IDEuNjc1LC0wLjIxOCAyLjQ4LC0wLjQ2OCBhIDYuODYyLDYuODYyIDAgMCAwIDIuNTczLC0xLjM3MSA1LjE5LDUuMTkgMCAwIDAgMS4
|
||||||
|
0OTgsLTIuMTQ4IDUuOTEyLDUuOTEyIDAgMCAwIC0wLjAzLC00LjMyNCA0Ljg1Miw0Ljg1MiAwIDAgMCAtMS4zNDMsLTEuODYyIDUuNTY4LDUuNTY4IDAgMCAwIC0xLjk3LC0xLjE0NyBsIC0zLjI1LC0xLjIwNiBhIDEuNzQyLDEuNzQyIDAgMCAxIC0wLjg4NywtMC44NDUgMS4xMDcsMS4xMDcgMCAwIDEgMC4wMzYsLTAuOTg2IDEuMjksMS4yOSAwIDAgMSAwLjIxNywtMC4yOTEgMS43NSwxLjc1IDAgMCAxIDAuNDgsLTAuMzQ3IGMgMC4zNjMsLTAuMTggMC43NTUsLTAuM
|
||||||
|
jkzIDEuMTU4LC0wLjMzNyBhIDYuNzYsNi43NiAwIDAgMSAyLjA3MiwwLjAyMiBjIDAuODEsMC4wODggMS42MTMsMC4yMzEgMi40MDIsMC40MyBsIDAuMTY4LDAuMDM3IHYgLTMuOTc0IGwgLTAuMzEsLTAuMDY3IGEgMjEuMTQsMjEuMTQgMCAwIDAgLTIuNDQ0LC0wLjQzNSAxMi41NDUsMTIuNTQ1IDAgMCAwIC0zLjIxMywtMC4wMTQgNi45NDUsNi45NDUgMCAwIDAgLTMuNjk5LDEuNDg4IDQuOTA4LDQuOTA4IDAgMCAwIC0xLjU4LDIuMTc4IDUuOTg0LDUuOTg0IDAgMCA
|
||||||
|
wIC0wLjAwMyw0LjA1IGMgMC4yNDIsMC42NSAwLjYzLDEuMjM3IDEuMTM2LDEuNzE0IDAuNDM3LDAuNDIyIDAuOTMyLDAuNzggMS40NywxLjA2NSAwLjcwOCwwLjM4IDEuNDU4LDAuNjc1IDIuMjM1LDAuODc4IDAuMjU3LDAuMDc3IDAuNTEyLDAuMTU4IDAuNzY2LDAuMjQzIGwgMC4zODUsMC4xNDEgMC4xMSwwLjA0NSBjIDAuMzgsMC4xMzYgMC43MjYsMC4zNSAxLjAxOCwwLjYyOCAwLjIwMiwwLjE5IDAuMzU4LDAuNDIzIDAuNDU1LDAuNjgzIDAuMDYsMC4yMzcgMC4wN
|
||||||
|
jEsMC40ODUgMC4wMDMsMC43MjMgYSAxLjUzNiwxLjUzNiAwIDAgMSAtMC43NDQsMC44OTIgMy42OTEsMy42OTEgMCAwIDEgLTEuMjM5LDAuMzg3IDksOSAwIDAgMSAtMS45MiwwLjA5NyAyMS45NzMsMjEuOTczIDAgMCAxIC0yLjUwNywtMC4zMzQgYyAtMC40MzMsLTAuMDkgLTAuODY0LC0wLjE5IC0xLjI5MSwtMC4zMDMgeiBtIC0xMS4xNDQsNC40ODIgaCA0LjczIFYgMzcuODQ2IGggLTQuNzMgeiBNIDg1LjMwNSw0My4zODYgYSA0LjkzNCw0LjkzNCAwIDEgMSA2LjE
|
||||||
|
1Nyw3LjcxMSA0LjkzNCw0LjkzNCAwIDAgMSAtNi4xNTcsLTcuNzEgbSAtNi44NjcsMy44NDggYSA5Ljg3LDkuODcgMCAwIDAgMTIuMDAyLDkuNDg1IDkuNjI5LDkuNjI5IDAgMCAwIDMuMTU3LC0xNy43MjkgOS45MzQsOS45MzQgMCAwIDAgLTE1LjE2LDguMjQ0IiBpZD0icGF0aDIiLz48dXNlIGhyZWY9IiNiYXJfc2hvcnQiIHg9IjAiIGlkPSJ1c2UzIi8+PHVzZSBocmVmPSIjYmFyX3RhbGwiIHg9IjAiIGlkPSJ1c2U0Ii8+PHVzZSBocmVmPSIjYmFyX2dyYW5kZSIge
|
||||||
|
D0iMCIgaWQ9InVzZTUiLz48dXNlIGhyZWY9IiNiYXJfdGFsbCIgeD0iMjUuODc1IiBpZD0idXNlNiIvPjx1c2UgaHJlZj0iI2Jhcl9zaG9ydCIgeD0iNTEuNzUiIGlkPSJ1c2U3Ii8+PHVzZSBocmVmPSIjYmFyX3RhbGwiIHg9IjUxLjc1IiBpZD0idXNlOCIvPjx1c2UgaHJlZj0iI2Jhcl9ncmFuZGUiIHg9IjUxLjc1IiBpZD0idXNlOSIvPjx1c2UgaHJlZj0iI2Jhcl90YWxsIiB4PSI3Ny42MjUiIGlkPSJ1c2UxMCIvPjx1c2UgaHJlZj0iI2Jhcl9zaG9ydCIgeD0iMTAzLjM3NSIgaWQ9InVzZTExIi8+PC9nPjxtZXRhZGF0YSBpZD0ibWV0YWRhdGExMSI+PHJkZjpSREY+PGNjOldvcmsgcmRmOmFib3V0PSIiPjxkYzp0aXRsZT5DaXNjby5jb20gRnJhbmNlPC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Cisco</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="5">
|
||||||
|
<name>Dell</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-dell.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwMjg4ZDEiIGQ9Ik0yNCw0QzEyLjk1Niw0LDQsMTIuOTU2LDQsMjRzOC45NTYsMjAsMjAsMjBzMjAtOC45NTYsMjAtMjBTMzUuMDQ0LDQsMjQs
|
||||||
|
NHogTTI0LDQxYy05LjM5MSwwLTE3LTcuNjA5LTE3LTE3UzE0LjYwOSw3LDI0LDdzMTcsNy42MDksMTcsMTdTMzMuMzkxLDQxLDI0LDQxeiIvPjxwYXRoIGZpbGw9IiMwMjg4ZDEiIGQ9Ik0zNS42NDEsMjUuNTYzbDIuODQsMC4wMDRsLTAuMDA0LDIuMzk1bC01LjY5MS0wLjAxMmwwLjAxMi04LjE3MmwyLjg1NSwwLjAwNEwzNS42NDEsMjUuNTYzeiBNMjYuMzQsMjUuMTAybC00LjY5OSwzLjY4NGwtNC4yODUtMy4zNzljLTAuNjIxLDEuNDg0LTIuMTA5LDIuNTItMy44Mz
|
||||||
|
YsMi41MTZsLTMuNjY0LTAuMDA0bDAuMDA4LTguMTcybDMuNjY4LDAuMDA0YzEuOTI2LDAuMDA0LDMuMzA5LDEuMjIzLDMuODI4LDIuNTMxbDQuMjk3LTMuMzY3bDEuNTg2LDEuMjVsLTMuOTM0LDMuMDg2bDAuNzU0LDAuNTk0bDMuOTM0LTMuMDg2bDEuNTksMS4yNTRsLTMuOTM0LDMuMDgybDAuNzUsMC41OTRsMy45NDEtMy4wODJsMC4wMDQtMi44MzZsMi44NTIsMC4wMDRsLTAuMDA4LDUuNzgxbDIuODQsMC4wMDRsLTAuMDA0LDIuMzkxbC01LjY5MS0wLjAwOEwyNi4zNCwyNS4xMDJ6IE0xNS4wMTIsMjMuODRjMC0xLjExMy0wLjczLTEuNzQyLTEuNzctMS43NDJoLTAuNjM3bC0wLjAwNCwzLjQ3N2gwLjYyMUMxNC4xODQsMjUuNTc0LDE1LjAxMiwyNS4wNTEsMTUuMDEyLDIzLjg0Ii8+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Dell</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="6">
|
||||||
|
<name>HP Inc</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-hp.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yNCA0QTIwIDIwIDAgMSAwIDI0IDQ0QTIwIDIwIDAgMSAwIDI0IDRaIi8+PHBhdGggZmlsbD0iIzE5NzZkMiIgZD0iTTI0LDQzLj
|
||||||
|
k5N2MtMC4xOTksMC0wLjY1MiwwLjAwNi0wLjg1LDBsNC0xMC45OTloNS42MjVjMC45ODcsMCwyLjA3MS0wLjc1OSwyLjQwOS0xLjY4Nmw0Ljc0OC0xMi42ODdjMC43MjUtMS45OTUtMC40MTctMy42MjYtMi41MzktMy42MjZoLTcuODA0bC02LjUxOCwxOC4yNTdoLTAuMDAybC0zLjcxMiwxMC4xOThDMTAuNTUsNDEuMzYxLDQsMzMuNDQ1LDQsMjMuOTk5YzAtOS4xNzQsNi4xNzgtMTYuOTA1LDE0LjYtMTkuMjYxbC0zLjgzLDEwLjUyNmgtMC4wMDFMOC4xNSwzMi45OTho
|
||||||
|
NC4yMzlsNS41NzYtMTQuOTk5aDMuMTg1bC01LjU3NiwxNC45OTlsMy45MTksMC4wMDFsNS40MzgtMTQuMzc0YzAuNzI2LTEuOTk1LTAuNDE2LTMuNjI2LTIuNTM2LTMuNjI2SDE5LjE1bDMuOTUxLTEwLjk3OEMyMy4zOTksNC4wMDgsMjMuNjk5LDQsMjQsNGMxMS4wNDYsMCwyMCw4Ljk1MywyMCwxOS45OTlTMzUuMDQ2LDQzLjk5NywyNCw0My45OTd6IE0zNi4xNSwxNy45OTloLTMuMTg1bC00LjUwOSwxMS45OTloMy4xODVMMzYuMTUsMTcuOTk5eiIvPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>HP Inc</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="7">
|
||||||
|
<name>HPE</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icon-hpe.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sbnM9Imh0dHA6Ly93d3c
|
||||||
|
udzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIGlkPSJrYXRtYW5fMSIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA2MzAgNjMwIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLWhwZS5zdmciIHdpZHRoPSI2MzAiIGhlaWdodD0iNjMwIiBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQuMyAoMGQxNWY3NTA0MiwgMjAyNS0xMi0yNSkiPjxkZWZzIGlkPSJkZWZzM
|
||||||
|
iIvPjxzb2RpcG9kaTpuYW1lZHZpZXcgaWQ9Im5hbWVkdmlldzIiIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIgYm9yZGVyY29sb3I9IiMwMDAwMDAiIGJvcmRlcm9wYWNpdHk9IjAuMjUiIGlua3NjYXBlOnNob3dwYWdlc2hhZG93PSIyIiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIwIiBpbmtzY2FwZTpkZXNrY29sb3I9IiNkMWQxZDEiIHNob3dndWlkZXM9InRydWUiIGlua3NjYXBlOnpvb209IjAuNjkwNTUxNSIgaW5rc2N
|
||||||
|
hcGU6Y3g9Ii0yMTcuOTQxNzUiIGlua3NjYXBlOmN5PSIyNzUuMTQyNCIgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIyNTYwIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMzYwIiBpbmtzY2FwZTp3aW5kb3cteD0iMCIgaW5rc2NhcGU6d2luZG93LXk9IjAiIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImthdG1hbl8xIj48c29kaXBvZGk6Z3VpZGUgcG9zaXRpb249IjE5Ny42NjI0NCwzMTQuNDg4NDgiIG9yaWVudGF0a
|
||||||
|
W9uPSIwLC0xIiBpZD0iZ3VpZGUyIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9InN0eWxlMSI+Cgkuc3Qwe2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MzY7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwM0E4ODM7c3Ryb2tlLXdpZHRoOjM2O30KPC9zdHlsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0ibSAxOC41MTE5ODcsNDA1LjkzMDEyIHYgLTE4MCBtIDE
|
||||||
|
1NC4wMDAwMDMsMTgwIHYgLTE4MCBtIC0xNTQuMDAwMDAzLDg5IEggMTU1LjUxMTk5IG0gOTUsOTEgdiAtMTgwIG0gMCwxOCBoIDEwMiBjIDI3LjYsMCA1MCwyMi40IDUwLDUwIDAsMjcuNiAtMjIuNCw1MCAtNTAsNTAgaCAtMTAyIG0gMjIyLC02NyB2IC0zMyBoIDE1OCIgaWQ9InBhdGgxIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Im0gNjMwLjUxMTk5LDM4Ny45MzAxMiBoIC0xNTggdiAtNzYgaCAxNTgiIGlkPSJwYXRoMiIvPgo8L3N2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>HPE</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="8">
|
||||||
|
<name>IBM</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-ibm.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMzZjUxYjUiIGQ9Ik00OCAxNkw0OCAxNCA0MC40NjkgMTQgMzkuODA5IDE2ek0zMyAzMUwzMyAyOSAyOSAyOSAyNyAyOSAyNyAzMXpNMzkuNzY2I
|
||||||
|
DI4TDQwLjUxIDI2IDM0LjUxIDI2IDM1LjI2NiAyOHpNMjkgMjZIMzNWMjhIMjl6TTI5IDIzSDMzVjI1SDI5ek00MiAyOUw0MiAzMSA0OCAzMSA0OCAyOSA0NiAyOXpNMzYuMTgxIDE5TDM1LjUyMSAxNyAyNyAxNyAyNyAxOSAyOSAxOXpNMzcuMTcgMjJMMzYuNTEgMjAgMjkgMjAgMjkgMjJ6TTMzLjM3OCAyM0wzNC4xMzMgMjUgNDAuODgzIDI1IDQxLjYyOCAyM3pNNDIgMjNINDZWMjVINDJ6TTI3IDMySDMzVjM0SDI3ek0zNS4xOTEgMTZMMzQuNTMxIDE0IDI3IDE0IDI
|
||||||
|
3IDE2ek0zNi43NzYgMzJMMzcuNTMxIDM0IDM4LjI3NiAzMnpNNDIgMzJINDhWMzRINDJ6TTM5LjQ3OSAxN0wzOC44MTkgMTkgNDYgMTkgNDggMTkgNDggMTd6TTM5LjM5MyAyOUwzNS42NDMgMjkgMzYuMzk4IDMxIDM4LjY0OCAzMXpNNDIgMjZINDZWMjhINDJ6TTM4LjQ5IDIwTDM3LjgzIDIyIDQ2IDIyIDQ2IDIwek0wIDE0SDhWMTZIMHpNMCAxN0g4VjE5SDB6TTIgMjBINlYyMkgyek0yIDIzSDZWMjVIMnpNMiAyNkg2VjI4SDJ6TTAgMjlIOFYzMUgwek0wIDMySDhWM
|
||||||
|
zRIMHpNMTAgMTdIMThWMTlIMTB6TTI0Ljk3NyAxNmMtLjkxMy0xLjIwOC0yLjM0Ny0yLTMuOTc3LTJIMTB2Mmg3LjAyM0gyNC45Nzd6Ii8+PHBhdGggZmlsbD0iIzNmNTFiNSIgZD0iTTI1LjU3OCAxN2gtOS4xMzFDMTYuMTcxIDE3LjYxMyAxNiAxOC4yODMgMTYgMTloMTBDMjYgMTguMjg4IDI1Ljg0NiAxNy42MTMgMjUuNTc4IDE3ek0yMy45NzUgMjNIMTJ2MmgxMS45NzNjLS44MzMtLjYyLTEuODU0LTEtMi45NzMtMUMyMi4xMTkgMjQgMjMuMTQyIDIzLjYyMSAyMy4
|
||||||
|
5NzUgMjN6TTE3LjAyMyAzMkgxMHYyaDExYzEuNjMgMCAzLjA2NS0uNzkyIDMuOTc3LTJIMTcuMDIzek0xOCAyOWgtMi02djJoNi40NDdIMThoNy41NzhDMjUuODQ2IDMwLjM4NyAyNiAyOS43MTIgMjYgMjlIMTh6TTIxIDIwYzAgMCAwIC4wODMgMCAxcy0xIDEtMSAxaDQuOTc5Yy40NDEtLjU4NC43Ny0xLjI1Ny45MjEtMkgyMXpNMTIgMjBIMTdWMjJIMTJ6Ii8+PGc+PHBhdGggZmlsbD0iIzNmNTFiNSIgZD0iTTIxIDI4aDQuODg1Yy0uMTU2LS43MzgtLjQ2Ny0xLjQxOC0uOTA3LTJIMjBjMCAwIDEgLjE2NyAxIDFTMjEgMjggMjEgMjh6TTEyIDI2SDE3VjI4SDEyeiIvPjwvZz48L3N2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>IBM</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="9">
|
||||||
|
<name>Lenovo</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-lenovo.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxyZWN0IHdpZHRoPSI0OCIgaGVpZ2h0PSIxNiIgeT0iMTYiIGZpbGw9IiNmZjE3NDQiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTEuOTM1LDI2LjA2MmMwLjM3LD
|
||||||
|
AuMzQxLDAuNzgyLDAuNDUsMS4yMjcsMC40NzhjMC42NDUsMC4wMzksMS4yMTctMC4xNTYsMS43MjQtMC41NDYgYzAuMTI0LTAuMDk2LDAuMTYzLTAuMTI2LDAuMTYzLTAuMTI2czAuNzc3LDAuNjA5LDEuMDk3LDAuODU1Yy0wLjI2MSwwLjMwOS0wLjU2NywwLjUyMS0wLjkwMSwwLjY5MiBjLTEuMTAzLDAuNTY1LTIuMjQ5LDAuNjg3LTMuNDI0LDAuMjY0Yy0xLjM0Ni0wLjQ4NS0yLjEzMS0xLjY5My0yLjA1OS0zLjExN2MwLjA3My0xLjQ0MSwxLjAwNS0yLjYwOCwyLjM5
|
||||||
|
Mi0yLjk0NCBjMS4wNjQtMC4yNTcsMi4wODQtMC4xNDMsMi45OCwwLjUzOWMwLjY1MSwwLjQ5NiwxLjAwMSwxLjI4LDEuMTQ3LDIuMDY4YzAsMC0yLjU5NSwxLjExLTMuNzk1LDEuNjA2IEMxMi4zMTMsMjUuOTAzLDEyLjE0MSwyNS45NzUsMTEuOTM1LDI2LjA2MnogTTExLjQ3MiwyNC45MjhjMC45NjktMC40MDEsMS45MzUtMC44MDEsMi45MDEtMS4yMDEgYy0wLjMzNC0wLjcyMi0xLjA5Ni0xLjAxNy0xLjg2Ni0wLjc0OEMxMS43NTgsMjMuMjQsMTEuMjgsMjQuMTI0LD
|
||||||
|
ExLjQ3MiwyNC45Mjh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTI3LjA3NiwyNy45MzRjLTEuNjMyLTAuMDE3LTIuOTU2LTEuMDY4LTMuMjYxLTIuNmMtMC4zNy0xLjg1MiwwLjk2OS0zLjYzMywyLjg2LTMuODA4IGMxLjI4MS0wLjExOCwyLjM3MywwLjI1NCwzLjE1NSwxLjNjMS40NTEsMS45NDEsMC4yMiw0Ljc1Ny0yLjE5Myw1LjA1NUMyNy40NSwyNy45MDUsMjcuMjYzLDI3LjkxNywyNy4wNzYsMjcuOTM0eiBNMjcuMTEsMjYuNDM0IGMwLjkyOSwwLjAwMiwxLjYy
|
||||||
|
Mi0wLjcyMywxLjYyOC0xLjcwNGMwLjAwNi0wLjk3LTAuNzI0LTEuNzQyLTEuNjQ5LTEuNzQ1Yy0wLjkzNi0wLjAwMy0xLjYzMSwwLjczNC0xLjYyOCwxLjcyNiBDMjUuNDY1LDI1LjY3NSwyNi4xODksMjYuNDMyLDI3LjExLDI2LjQzNHoiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNDAuNjI0LDI3LjkzNGMtMS42MzItMC4wMTctMi45NTYtMS4wNjgtMy4yNjEtMi42Yy0wLjM3LTEuODUyLDAuOTY5LTMuNjMzLDIuODYtMy44MDggYzEuMjgxLTAuMTE4LDIuMzczLDAuMj
|
||||||
|
U0LDMuMTU1LDEuM2MxLjQ1MSwxLjk0MSwwLjIyLDQuNzU3LTIuMTkzLDUuMDU1QzQwLjk5OCwyNy45MDUsNDAuODExLDI3LjkxNyw0MC42MjQsMjcuOTM0eiBNNDAuNjU4LDI2LjQzNGMwLjkyOSwwLjAwMiwxLjYyMy0wLjcyMywxLjYyOC0xLjcwNGMwLjAwNi0wLjk3LTAuNzI0LTEuNzQyLTEuNjQ5LTEuNzQ1Yy0wLjkzNi0wLjAwMy0xLjYzMSwwLjczNC0xLjYyOCwxLjcyNiBDMzkuMDEzLDI1LjY3NSwzOS43MzcsMjYuNDMyLDQwLjY1OCwyNi40MzR6Ii8+PHBhdGgg
|
||||||
|
ZmlsbD0iI2ZmZiIgZD0iTTIxLjM3NywyNy45ODdjMC0wLjA5NSwwLjAwMS0yLjU4NywwLTMuNjYzYy0wLjAwMS0wLjc1OS0wLjYwNS0xLjMyNy0xLjQxNC0xLjMzMSBjLTAuNzk0LTAuMDA1LTEuMzgzLDAuNTYtMS4zODQsMS4zMzJjLTAuMDAxLDEuMDc2LDAsMy42NzksMCwzLjY3OWwtMS43NDEsMC4wMDJsMC4wMDctNi4zNzhjMCwwLDEuMTY4LTAuMDE4LDEuNzIyLTAuMDE4IGMwLDAuMjY0LTAuMDA2LDAuODMyLTAuMDA2LDAuODMyczAuMTM4LTAuMTI4LDAuMTgxLT
|
||||||
|
AuMTcxYzEuMTU3LTEuMTc0LDMuMjI2LTAuOTczLDQuMDMxLDAuMzkxIGMwLjIyMywwLjM3OCwwLjMzOCwwLjc4OSwwLjM0LDEuMjIzYzAuMDA4LDEuMjY0LDAuMDAzLDQuMTA0LDAuMDAzLDQuMTA0UzIxLjk2NCwyNy45ODcsMjEuMzc3LDI3Ljk4N3oiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMzAuMTY0LDIxLjYwOGMwLjY0MiwwLDEuOTY0LDAuMDE1LDEuOTY0LDAuMDE1czEuNDc4LDQuMDI0LDEuNTI2LDQuMTQ5IGMwLjExNS0wLjMxMSwxLjIwOC0zLjI5LDEuNTIx
|
||||||
|
LTQuMTc0YzAuNjQ2LDAuMDE4LDEuMjg4LDAuMDEsMS45NywwLjAxYy0wLjAyOSwwLjA4NC0yLjU2Miw2LjM5OC0yLjU2Miw2LjM5OGwtMS44NzYtMC4wMDMgQzMxLjkwNSwyNi4wNDIsMzAuMTkxLDIxLjY5MiwzMC4xNjQsMjEuNjA4eiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik01Ljc2NywyNi4zOTNjMC4xMDQsMCwzLjg2OCwwLjAxMSwzLjg2OCwwLjAxMWwtMC4wMDIsMS41ODFMNCwyNy45ODl2LTguMDczaDEuNzcgQzUuNzcsMTkuOTE2LDUuNzY3LDI2LjI4NCw1Ljc2NywyNi4zOTN6Ii8+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Lenovo</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="10">
|
||||||
|
<name>Razer</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-razer.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiM2NGRkMTciIGQ9Ik0yNiwyMGMwLjEsMCwwLjIsMCwwLjMsMGMwLjMtMC4xLDAuNS0wLjMsMC42LTAuNWMwLjEtMC4yLDAuMS0wLjUsMC4xLTA
|
||||||
|
uOGMtMC4yLTAuNi0xLTEuOC0yLTIuNCBjMCwwLjcsMCwxLjMsMCwxLjljMCwwLjUsMCwxLDAsMS4yYzAuMSwwLjIsMC4zLDAuNCwwLjUsMC42QzI1LjcsMjAsMjUuOCwyMCwyNiwyMCBNMjkuNCwyM2MwLjcsMCwxLjYtMC4xLDIuMy0wLjUgYy0wLjUtMC4zLTEtMC42LTEuNS0wLjljLTAuNC0wLjMtMC45LTAuNi0xLjEtMC42YzAsMC0wLjEsMC0wLjEsMGMtMC4yLDAtMC40LDAuMS0wLjYsMC4yYy0wLjIsMC4xLTAuNCwwLjQtMC40LDAuNiBjLTAuMSwwLjUsMC4zLDEuM
|
||||||
|
SwwLjgsMS4yQzI5LDIzLDI5LjIsMjMsMjkuNCwyMyBNMjMsMjQuOWMwLjUtMC4yLDEtMC40LDEuNS0wLjZjMC41LTAuMiwxLTAuNCwxLjItMC41YzAuMi0wLjIsMC4zLTAuNCwwLjMtMC43IGMwLTAuMy0wLjEtMC41LTAuMy0wLjdDMjUuNiwyMi4xLDI1LjMsMjIsMjUsMjJjLTAuMiwwLTAuNSwwLjEtMC43LDAuM0MyMy45LDIyLjYsMjMuMiwyMy44LDIzLDI0LjkgTTQxLjUsMSBjLTAuNywwLTEuNCwwLjUtMS41LDEuM2MwLDAsMCwwLDAsMEMzOS43LDIuMSwzOS40LDI
|
||||||
|
sMzksMmMtMS43LDAtMi45LDAuMi0zLjYsMC43QzM0LjUsMy4yLDM0LDQuMSwzNCw1YzAsMC4xLDAsMC4xLDAsMC4yIEMzMy42LDUuMSwzMy4xLDUsMzIuNyw1Yy0xLjMsMC0yLjQsMC43LTMuMSwyQzI5LjIsNy43LDI5LDguNCwyOSw5LjJjMCwyLjYsMi4yLDQuNiw0LjUsNi42YzIuNywyLjQsMy45LDMuOCwzLjMsNC44IGMtMC4yLDAuNC0wLjQsMC40LTAuNCwwLjRjLTAuMSwwLTAuMiwwLTAuMywwYy0wLjEsMC0wLjMsMC0wLjUtMC4xYzAtMC42LTAuMS0xLjEtMC4yL
|
||||||
|
TEuNmMtMC4yLTAuNi0wLjUtMS4yLTEtMS43IGMtMC40LTAuNS0xLTAuNy0xLjUtMC45Yy0wLjEsMC0wLjItMC4xLTAuNC0wLjFjLTAuMywwLTAuNywwLjItMC44LDAuNWMtMC4zLDAuNC0wLjIsMC45LDAuMiwxLjNjMC4yLDAuMiwwLjQsMC40LDAuNSwwLjYgYzAuMSwwLjIsMC4xLDAuMywwLjEsMC41Yy0wLjItMC4xLTAuNS0wLjMtMC43LTAuNGMtMC44LTAuNS0xLjQtMC45LTEuOS0xYzAtMC4xLTAuMS0wLjItMC4xLTAuM2MtMC41LTEuNS0yLjEtMy43LTQuMy00LjU
|
||||||
|
gYy0xLTMuNS0zLjMtNC4zLTUuMS00LjNjLTQuNiwwLTUuNCw0LjktNiw4LjVjLTAuMiwxLjQtMC43LDQtMS4zLDQuNWMwLTAuMi0wLjEtMC41LTAuMS0xQzEzLDE5LjksMTIuNywxNywxMCwxNyBjLTEuNiwwLTIuNCwxLjEtMi44LDEuN2MtMC4yLTAuMi0wLjMtMC40LTAuNC0wLjZjLTAuMy0wLjYtMS0xLjEtMS43LTEuMUM1LjEsMTYuOSw1LDE2LjcsNSwxNi41QzUsMTUuNyw0LjMsMTUsMy41LDE1IGMtMC43LDAtMS4yLDAuNC0xLjQsMS4xQzEuNCwxNi4zLDEsMTYuO
|
||||||
|
CwxLDE3LjVDMSwxOC4zLDEuNywxOSwyLjUsMTljMC4xLDAsMC4yLDAsMC4zLDBDMi45LDE5LjEsMywxOS4xLDMsMTkuMiBjMCwwLjIsMC4xLDAuNSwwLjIsMC43YzEsMS45LDIuNSwyLjcsMywyLjlDNi42LDIyLjksNywyMyw3LjQsMjNjMC43LDAsMS4zLTAuMiwxLjgtMC41QzkuNSwyNCwxMC4zLDI2LDEzLDI2IGM0LjEsMCw0LjktNC42LDUuNC03LjljMC42LTMuNCwxLTUuMSwyLTUuMWMwLjMsMCwwLjcsMCwxLjEsMC45Yy0wLjQsMC4yLTAuNywwLjUtMSwwLjhjLTA
|
||||||
|
uNSwwLjUtMC44LDEuMS0xLDEuNyBjLTAuMiwwLjYtMC4xLDEuMi0wLjEsMS43YzAuMSwwLjUsMC41LDAuOCwwLjksMC45YzAsMCwwLDAsMC4xLDBjMC41LDAsMC45LTAuMywxLTAuOGMwLjEtMC4zLDAuMi0wLjYsMC4zLTAuOCBjMC4xLTAuMSwwLjItMC4yLDAuMy0wLjNjMCwwLjMsMCwwLjYsMCwwLjljMCwwLjksMCwxLjUsMC4xLDJjLTEsMS0yLjIsMy0yLjIsNS4yYy0xLjMsMC45LTIuMiwxLjktMi43LDNjLTAuNSwxLjItMC41LDIuNSwwLjEsMy43IGMwLjgsMS45L
|
||||||
|
DIuNSwyLjksNC45LDIuOWMxLjgsMCwzLjgtMC41LDUuNy0xLjFjMS43LTAuNSwzLjMtMC45LDQuMy0wLjljMC4yLDAsMC40LDAsMC42LDAuMWMtMC4yLDAuMS0wLjUsMC4zLTEsMC42IGMtMS4xLDAuNi0zLjYsMi0yLjUsNC41YzAuNywxLjYsMi41LDEuOCwzLjYsMS44bDAuMSwwYzAsMCwwLDAsMCwwYy0wLjEsMC4yLTAuMiwwLjMtMC40LDAuNmMtMC40LDAuNC0wLjYsMC44LTAuNiwxLjMgYy0wLjEsMC0wLjMsMC4xLTAuNSwwLjFjLTAuOCwwLTEuNSwwLjctMS41LDE
|
||||||
|
uNWMwLDAuNywwLjQsMS4yLDEuMSwxLjRjMC4yLDAuNiwwLjgsMS4xLDEuNCwxLjFjMC44LDAsMS41LTAuNywxLjUtMS41bDAtMC4zIGMwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMmMwLjUsMCwwLjktMC4yLDEuMi0wLjZjMS43LTEuNywxLjYtMy4zLDEuNi00LjFjMC0xLjMtMC45LTIuNC0yLTIuOWMxLjMtMC45LDIuNy0yLjUsMS42LTQuOCBjLTAuOC0xLjctMi4yLTIuNi00LjQtMi42Yy0xLjcsMC0zLjUsMC41LTUuMywxYy0xLjgsMC41LTMuNCwwLjktNC42LDAuOWMtM
|
||||||
|
SwwLTEuMS0wLjMtMS4yLTAuNUMyMSwzMC4xLDIxLDI5LjksMjEsMjkuOCBjMC4xLTAuMiwwLjMtMC41LDAuOC0wLjljMC40LDAuNCwwLjksMC42LDEuMywwLjhjMC40LDAuMiwwLjksMC4zLDEuNCwwLjNjMC4yLDAsMC40LDAsMC42LTAuMWMwLjYtMC4xLDEuMi0wLjQsMS42LTAuNyBjMC40LTAuMywwLjYtMC44LDAuNC0xLjJjLTAuMS0wLjQtMC41LTAuNi0wLjktMC42Yy0wLjEsMC0wLjEsMC0wLjIsMGMtMC4yLDAtMC40LDAuMS0wLjYsMC4xYy0wLjEsMC0wLjIsMC0
|
||||||
|
wLjIsMCBjLTAuMiwwLTAuMy0wLjEtMC40LTAuMmMwLjItMC4xLDAuNS0wLjIsMC43LTAuM2MxLTAuNCwxLjYtMC42LDItMWMwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMmMwLjEsMCwwLjMsMC4xLDAuNCwwLjEgQzI4LjYsMjYsMjksMjYsMjkuNCwyNmMwLjksMCwyLjktMC4xLDQuNS0xLjRjMC44LDAuMiwxLjUsMC40LDIuMiwwLjRjMC40LDAsMC45LTAuMSwxLjMtMC4yYzEuMi0wLjMsMi4zLTEuMSwyLjktMi4zIGMyLjItMy45LTEuMy03LjEtNC4yLTkuN0MzNC45LDExL
|
||||||
|
jcsMzMsMTAsMzMsOS4xYzAsMCwwLDAsMC0wLjFjMC4yLDAuMSwwLjQsMC4xLDAuOCwwLjNjMC42LDAuMiwxLjUsMC42LDIuNCwwLjYgYzEuMSwwLDEuOS0wLjUsMi41LTEuNWMwLjYtMSwwLjQtMS45LDAuMS0yLjVjMC4xLDAsMC4yLDAsMC4zLDBjMC42LDAsMS4yLTAuMywxLjYtMC44QzQxLjMsNS4xLDQyLDUsNDIuNSw1QzQzLjMsNSw0NCw0LjMsNDQsMy41IGMwLTAuNy0wLjQtMS4yLTEuMS0xLjRDNDIuNywxLjQsNDIuMiwxLDQxLjUsMUw0MS41LDF6Ii8+PHBhdGg
|
||||||
|
gZD0iTTEzLDI1Yy0yLjYsMC0yLjgtMi41LTIuOS0zLjhjMC0wLjMtMC4xLTAuOS0wLjItMS4xYy0wLjEsMC4xLTAuMSwwLjItMC4yLDAuM2MtMC4xLDAuMS0wLjIsMC4zLTAuMywwLjUgYy0wLjYsMS0xLjksMS40LTIuOSwxYy0wLjgtMC4zLTEuOC0xLjEtMi41LTIuNGMtMC4yLTAuNSwwLTEuMSwwLjQtMS4zYzAuNS0wLjIsMS4xLDAsMS4zLDAuNGMwLjQsMC43LDEsMS4zLDEuNCwxLjQgYzAuMiwwLjEsMC40LDAsMC41LTAuMmMwLjEtMC4xLDAuMi0wLjMsMC4yLTAuN
|
||||||
|
GMwLjMtMC42LDAuOC0xLjQsMi0xLjRjMS44LDAsMiwxLjksMi4xLDNjMC4yLDEuOCwwLjQsMiwwLjksMiBjMS41LDAsMS45LTIuMSwyLjUtNS40YzAuNi0zLjQsMS4zLTcuNiw1LTcuNmMyLjcsMCwzLjgsMS45LDQuMiw0LjFjMi4xLDAuNCwzLjcsMi43LDQuMSw0YzAuMiwwLjgsMC4yLDEuNi0wLjIsMi4zcy0xLDEuMi0xLjcsMS41IGMtMC44LDAuMi0xLjYsMC4yLTIuMy0wLjJjLTAuNy0wLjQtMS4yLTEtMS41LTEuN0MyMywxOS42LDIzLDE5LjEsMjMsMTguMmMwLTM
|
||||||
|
uNy0wLjQtNi4yLTIuNi02LjJjLTEuOSwwLTIuNCwyLjQtMyw2IEMxNi45LDIxLjMsMTYuMywyNSwxMywyNXogTTI1LDE2LjNjMCwwLjcsMCwxLjMsMCwxLjljMCwwLjUsMCwxLDAsMS4yYzAuMSwwLjIsMC4zLDAuNCwwLjUsMC42YzAuMiwwLjEsMC41LDAuMSwwLjgsMC4xIGMwLjMtMC4xLDAuNS0wLjMsMC42LTAuNWMwLjEtMC4yLDAuMS0wLjUsMC4xLTAuOEMyNi44LDE4LjEsMjYsMTYuOSwyNSwxNi4zeiIvPjxwYXRoIGQ9Ik0yNCAxNmMtLjMtLjEtLjctLjEtMS4xL
|
||||||
|
S4xLS40IDAtLjcuMS0xLjEuMi0uMy4xLS42LjQtLjkuNy0uMy4zLS40LjctLjUgMS4xLS4xLS40LS4xLS45IDAtMS40LjEtLjUuNC0uOS43LTEuMy40LS40LjgtLjcgMS4yLS45LjUtLjIuOS0uNCAxLjUtLjVsLjEgMGMuNi0uMSAxLjEuMyAxLjIuOFMyNSAxNS45IDI0LjUgMTZDMjQuMyAxNiAyNC4xIDE2IDI0IDE2ek0zLjUgMTguMWMtLjEgMC0uMSAwLS4yIDBDMy4xIDE4IDIuOCAxOCAyLjUgMTggMi4yIDE4IDIgMTcuOCAyIDE3LjVTMi4yIDE3IDIuNSAxN2MuNSA
|
||||||
|
wIC44IDAgMS4yLjJDNCAxNy4zIDQuMSAxNy42IDQgMTcuOCAzLjkgMTggMy43IDE4LjEgMy41IDE4LjF6Ii8+PHBhdGggZD0iTTQuNSAxOWMtLjEgMC0uMSAwLS4yLS4xLS4xIDAtMS4zLS43LTEuMy0yLjRDMyAxNi4yIDMuMiAxNiAzLjUgMTZTNCAxNi4yIDQgMTYuNWMwIDEuMS43IDEuNS43IDEuNi4yLjEuMy40LjIuN0M0LjkgMTguOSA0LjcgMTkgNC41IDE5ek0zNCA0M2MtLjMgMC0uNS0uMS0uNy0uMy0uNC0uNC0uNC0xIDAtMS40LjctLjcuNy0xLjQuNy0xLjggM
|
||||||
|
C0uMi0uMi0uMy0uNC0uNC0uMiAwLS40IDAtLjctLjEtMS0uMS0yLjMtLjItMi44LTEuMi0uNy0xLjcgMS0yLjYgMi4xLTMuMiAxLjctLjkgMS45LTEuMiAxLjYtMS44LS42LTEuMy0yLjgtLjgtNi4yLjEtMy43IDEtNy44IDIuMi05LjMtMS4zLS40LTEtLjUtMi0uMS0yLjkuNS0xLjIgMS42LTIuMSAyLjgtMi44LS4zLTIuMSAxLTQuMyAyLTUuMSAxLjItMS4xIDMuMS0xIDQuMi4yIDEuMSAxLjIgMSAzLjEtLjIgNC4yLS4zLjMtLjguNS0xLjcuOS0uNi4zLTEuNS42LTI
|
||||||
|
uMyAxLS4xLjEtLjIuMi0uMy4yLS4xIDAtLjEuMS0uMi4xLTEgLjYtMiAxLjMtMi4zIDIuMS0uMi40LS4yLjkuMSAxLjQuOCAxLjcgMy4zIDEuMiA3IC4yIDMuNC0uOSA3LjItMiA4LjYgMSAxIDIuMy0xLjIgMy42LTIuNSA0LjMtLjMuMi0uOC40LTEgLjYuMyAwIC42LjEuOS4xLjMgMCAuNiAwIC44LjEgMS4yLjIgMi4xIDEuMiAyLjEgMi4zIDAgLjYuMSAyLTEuMyAzLjNDMzQuNSA0Mi45IDM0LjMgNDMgMzQgNDN6TTI1IDIyYy0uMiAwLS41LjEtLjcuMy0uNC40LTEuM
|
||||||
|
iAxLjUtMS4zIDIuNi41LS4yIDEtLjQgMS41LS42LjUtLjIgMS0uNCAxLjItLjUuNC0uMy40LTEgMC0xLjRDMjUuNSAyMi4xIDI1LjMgMjIgMjUgMjJ6Ii8+PHBhdGggZD0iTTIzLjIgMjYuMWMwIC4zLjIuNy4zIDEgLjIuMy4zLjYuNi45LjIuMy42LjQgMSAuNS40LjEuOC4xIDEuMiAwLS40LjItLjguNS0xLjIuNS0uNS4xLTEgMC0xLjUtLjItLjUtLjItLjktLjUtMS4zLS44LS40LS40LS43LS43LTEtMS4ybC0uMS0uMWMtLjMtLjUtLjEtMS4xLjQtMS40LjUtLjMgMS4
|
||||||
|
xLS4xIDEuNC40QzIzLjIgMjUuOCAyMy4yIDI1LjkgMjMuMiAyNi4xek0zMi41IDQ1Yy0uMyAwLS41LS4yLS41LS41bDAtLjVjMC0uMiAwLS40IDAtLjYgMC0uMy4zLS41LjUtLjUuMyAwIC41LjIuNS41IDAgLjIgMCAuMyAwIC41bDAgLjVDMzMgNDQuOCAzMi44IDQ1IDMyLjUgNDV6Ii8+PHBhdGggZD0iTTMxLjUgNDRjLS4zIDAtLjUtLjItLjUtLjVzLjItLjUuNS0uNWMxLjEgMCAxLjUtLjcgMS42LS43LjEtLjIuNC0uMy43LS4yLjIuMS4zLjQuMi43QzMzLjkgNDIuO
|
||||||
|
CAzMy4zIDQ0IDMxLjUgNDR6TTI5LjQgMjVjLS40IDAtLjcgMC0xLS4xLTEuNi0uMy0yLjctMS45LTIuNC0zLjUuMi0uOC42LTEuNSAxLjMtMS45LjctLjQgMS41LS42IDIuMy0uNS40LjEuOC4zIDEuNy45LjYuNCAxLjQuOCAyLjIgMS4yIDAgMCAwIDAgMCAwIC4yIDAgLjMgMCAuNS4xLjEuMS4yLjEuMy4yLjkuNCAxLjguNiAyLjQuNC40LS4xLjgtLjQgMS4xLS45IDEtMS43LS44LTMuNS0zLjUtNkMzMiAxMy4xIDMwIDExLjMgMzAgOS4yYzAtLjYuMS0xLjIuNC0xLjd
|
||||||
|
DMzEuMSA2LjMgMzIgNiAzMi43IDZjLjggMCAxLjYuMyAyLjMuNi4yLjEuNi4yLjguMyAwIDAgMCAwIDAgMC0uMi0uMi0uMy0uNC0uNS0uN0MzNS4xIDUuOCAzNSA1LjQgMzUgNWMwLS42LjMtMS4xLjktMS41QzM2LjYgMy4xIDM4LjEgMyAzOSAzYy42IDAgMSAuNCAxIDFzLS40IDEtMSAxYy0uOCAwLTEuNi4xLTIgLjIgMCAwIDAgMCAwIDAgLjEuMi4yLjQuMy41QzM3LjggNi4yIDM4LjMgNyAzNy44IDhjLS45IDEuNi0yLjUuOS0zLjYuNEMzMy43IDguMiAzMy4xIDggM
|
||||||
|
zIuNyA4Yy0uMSAwLS4zIDAtLjYuNEMzMiA4LjYgMzIgOC45IDMyIDkuMWMwIDEuMyAxLjggMi45IDMuNSA0LjQgMi43IDIuNCA1LjcgNS4yIDQgOC40LS41IDEtMS4zIDEuNi0yLjMgMS45LTEuMS4zLTIuMy4xLTMuNC0uNEMzMi42IDI0LjYgMzAuOCAyNSAyOS40IDI1ek0yOSAyMWMtLjIgMC0uNC4xLS42LjItLjIuMS0uNC40LS40LjYtLjEuNS4zIDEuMS44IDEuMi41LjEgMS45LjEgMi45LS41LS41LS4zLTEtLjYtMS41LS45LS40LS4zLS45LS42LTEuMS0uNkMyOS4
|
||||||
|
xIDIxIDI5LjEgMjEgMjkgMjF6Ii8+PHBhdGggZD0iTTMyLjYgMjEuN2MuMi0uMi40LS42LjYtLjkuMi0uMy4zLS43LjMtMS4xIDAtLjQgMC0uNy0uMi0xLjEtLjEtLjQtLjQtLjctLjgtMSAuNC4yLjguMyAxLjIuNy4zLjMuNi44LjggMS4zLjEuNS4yIDEgLjIgMS41IDAgLjUtLjEgMS0uMyAxLjVsMCAuMWMtLjIuNS0uOC44LTEuMy42cy0uOC0uOC0uNi0xLjNDMzIuNCAyMS45IDMyLjUgMjEuOCAzMi42IDIxLjd6TTQwLjggNC4xYy0uMiAwLS40LS4yLS41LS40IDAtL
|
||||||
|
jMuMS0uNS40LS42LjEgMCAuMi0uMi4yLS42QzQxIDIuMiA0MS4yIDIgNDEuNSAyUzQyIDIuMiA0MiAyLjVDNDIgMy4zIDQxLjUgNCA0MC44IDQuMSA0MC45IDQuMSA0MC45IDQuMSA0MC44IDQuMXoiLz48cGF0aCBkPSJNMzksNC41Yy0wLjIsMC0wLjQtMC4yLTAuNS0wLjRjLTAuMS0wLjMsMC4xLTAuNSwwLjQtMC42QzM5LDMuNSw0MSwzLDQyLjUsM0M0Mi44LDMsNDMsMy4yLDQzLDMuNVM0Mi44LDQsNDIuNSw0IGMtMS40LDAtMy40LDAuNS0zLjQsMC41QzM5LjEsNC41LDM5LDQuNSwzOSw0LjV6Ii8+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Razer</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="11">
|
||||||
|
<name>Samsung</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-samsung.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwZDQ3YTEiIGQ9Ik00Ny45NywxOS44MjZjMC42NTQsMy43NDctOS41NDcsOC42NTUtMjIuNzg4LDEwLjk2Yy0xMy4yMzgsMi4zMDYtMjQuN
|
||||||
|
SwxLjEzNi0yNS4xNTMtMi42MTMgYy0wLjY1My0zLjc0Nyw5LjU1MS04LjY1NCwyMi43OS0xMC45NThDMzYuMDU5LDE0LjkwNyw0Ny4zMTgsMTYuMDc4LDQ3Ljk3LDE5LjgyNnoiLz48cG9seWdvbiBmaWxsPSIjZmFmYWZhIiBwb2ludHM9IjM1LjUxLDI1LjM4OCAzNS40NDIsMjEuNDkyIDM2LjY3MSwyMS40OTIgMzYuNjcxLDI2LjQwMyAzNC45MDUsMjYuNDAzIDMzLjY3OCwyMi4zNzMgMzMuNjUyLDIyLjM3MyAzMy43MiwyNi40MDMgMzIuNDk5LDI2LjQwMyAzMi40OTk
|
||||||
|
sMjEuNDkyIDM0LjM0MiwyMS40OTIgMzUuNDgzLDI1LjM4OCIvPjxwb2x5Z29uIGZpbGw9IiNmYWZhZmEiIHBvaW50cz0iMTMuMTc3LDIxLjk1MiAxMi40OTcsMjYuNDU1IDExLjE1NywyNi40NTUgMTIuMDc2LDIxLjQ5MiAxNC4yODQsMjEuNDkyIDE1LjIwMSwyNi40NTUgMTMuODY1LDI2LjQ1NSAxMy4yMDQsMjEuOTUyIi8+PHBvbHlnb24gZmlsbD0iI2ZhZmFmYSIgcG9pbnRzPSIxOC45NjQsMjUuMjg2IDE5LjU3NywyMS40OTIgMjEuNjAxLDIxLjQ5MiAyMS43MDgsM
|
||||||
|
jYuNDU1IDIwLjQ2OCwyNi40NTUgMjAuNDM1LDIxLjk5MyAyMC40MDksMjEuOTkzIDE5LjU4LDI2LjQ1NSAxOC4zMjEsMjYuNDU1IDE3LjQ5LDIxLjk5MyAxNy40NjQsMjEuOTkzIDE3LjQzMywyNi40NTUgMTYuMTksMjYuNDU1IDE2LjMsMjEuNDkyIDE4LjMyNSwyMS40OTIgMTguOTM3LDI1LjI4NiIvPjxwYXRoIGZpbGw9IiNmYWZhZmEiIGQ9Ik05LjA2NywyNS4wNTVjMC4wNDksMC4xMiwwLjAzNCwwLjI3NSwwLjAxMSwwLjM2OGMtMC4wNDIsMC4xNjUtMC4xNTQsMC4
|
||||||
|
zMzMtMC40ODMsMC4zMzMgYy0wLjMxMiwwLTAuNS0wLjE3OS0wLjUtMC40NXYtMC40OEg2Ljc2M0w2Ljc2MiwyNS4yMWMwLDEuMTA2LDAuODcxLDEuNDQxLDEuODA1LDEuNDQxYzAuODk4LDAsMS42MzctMC4zMDcsMS43NTQtMS4xMzQgYzAuMDYxLTAuNDI5LDAuMDE1LTAuNzA5LTAuMDA1LTAuODE2Yy0wLjIwOS0xLjAzOS0yLjA5My0xLjM0OS0yLjIzMy0xLjkzYy0wLjAyNC0wLjA5OS0wLjAxNy0wLjIwNS0wLjAwNS0wLjI2MiBjMC4wMzUtMC4xNTgsMC4xNDMtMC4zM
|
||||||
|
zIsMC40NTMtMC4zMzJjMC4yOSwwLDAuNDYxLDAuMTgsMC40NjEsMC40NWMwLDAuMDkxLDAsMC4zMDcsMCwwLjMwN2gxLjIzN3YtMC4zNDggYzAtMS4wODEtMC45Ny0xLjI1LTEuNjczLTEuMjVjLTAuODgzLDAtMS42MDQsMC4yOTItMS43MzYsMS4wOTljLTAuMDM2LDAuMjIzLTAuMDQxLDAuNDIyLDAuMDExLDAuNjcxIEM3LjA0OSwyNC4xMTgsOC44MTEsMjQuNDEyLDkuMDY3LDI1LjA1NXoiLz48cGF0aCBmaWxsPSIjZmFmYWZhIiBkPSJNMjUuMjA0LDI1LjA0NmMwLjA
|
||||||
|
0OSwwLjExOSwwLjAzMywwLjI3LDAuMDExLDAuMzYzYy0wLjA0MSwwLjE2NS0wLjE1MiwwLjMzLTAuNDc5LDAuMzMgYy0wLjMwNywwLTAuNDk0LTAuMTc5LTAuNDk0LTAuNDQ0bC0wLjAwMS0wLjQ3NmgtMS4zMThsLTAuMDAyLDAuMzc5YzAsMS4wOTUsMC44NjMsMS40MjYsMS43ODcsMS40MjYgYzAuODg4LDAsMS42Mi0wLjMwMywxLjczNi0xLjEyMmMwLjA2MS0wLjQyNiwwLjAxOC0wLjcwMi0wLjAwNC0wLjgwN2MtMC4yMDgtMS4wMjktMi4wNzMtMS4zMzYtMi4yMTEtM
|
||||||
|
S45MTIgYy0wLjAyNC0wLjA5OS0wLjAxNy0wLjIwMy0wLjAwNS0wLjI1N2MwLjAzNi0wLjE2LDAuMTQyLTAuMzI5LDAuNDQ5LTAuMzI5YzAuMjg4LDAsMC40NTUsMC4xNzUsMC40NTUsMC40NDQgYzAsMC4wOSwwLDAuMzA0LDAsMC4zMDRoMS4yMjh2LTAuMzQ1YzAtMS4wNy0wLjk2Mi0xLjIzNy0xLjY1OS0xLjIzN2MtMC44NzMsMC0xLjU4OCwwLjI4OC0xLjcxNywxLjA5IGMtMC4wMzYsMC4yMi0wLjA0LDAuNDE1LDAuMDEyLDAuNjYzQzIzLjIwNiwyNC4xMTgsMjQuOTU
|
||||||
|
xLDI0LjQxLDI1LjIwNCwyNS4wNDZ6Ii8+PHBhdGggZmlsbD0iI2ZhZmFmYSIgZD0iTTI5LjM3MiwyNS43MTNjMC4zNDQsMCwwLjQ1MS0wLjIzOCwwLjQ3NS0wLjM2YzAuMDEtMC4wNTQsMC4wMTMtMC4xMjUsMC4wMTItMC4xOVYyMS40OWgxLjI1NSB2My41NmMwLjAwMywwLjA5MS0wLjAwNiwwLjI3OS0wLjAxMSwwLjMyNWMtMC4wODgsMC45MjctMC44MjEsMS4yMjctMS43MzIsMS4yMjdjLTAuOTEzLDAtMS42NDYtMC4zMDEtMS43MzMtMS4yMjcgYy0wLjAwNC0wLjA0N
|
||||||
|
y0wLjAxMy0wLjIzNS0wLjAxMS0wLjMyNXYtMy41NmgxLjI1NHYzLjY3MmMwLDAuMDY0LDAuMDAyLDAuMTM3LDAuMDEyLDAuMTkgQzI4LjkyMSwyNS40NzMsMjkuMDI1LDI1LjcxMywyOS4zNzIsMjUuNzEzeiIvPjxwYXRoIGZpbGw9IiNmYWZhZmEiIGQ9Ik0zOS43MjUsMjUuNjZjMC4zNTksMCwwLjQ4NS0wLjIyNywwLjUwOC0wLjM1OWMwLjAwOS0wLjA1NywwLjAxMi0wLjEyNiwwLjAxMS0wLjE4OXYtMC43MiBoLTAuNTA5di0wLjcyNGgxLjc2VjI1Yy0wLjAwMSwwLjA
|
||||||
|
5My0wLjAwMywwLjE2Mi0wLjAxOCwwLjMyN2MtMC4wODIsMC45MDMtMC44NjYsMS4yMjUtMS43NDUsMS4yMjUgYy0wLjg4MSwwLTEuNjYzLTAuMzIyLTEuNzQ3LTEuMjI1Yy0wLjAxNC0wLjE2Ni0wLjAxNi0wLjIzNC0wLjAxOC0wLjMyN2wwLjAwMS0yLjA4OWMwLTAuMDg4LDAuMDExLTAuMjQ0LDAuMDIxLTAuMzI3IGMwLjExLTAuOTI4LDAuODYyLTEuMjI2LDEuNzQzLTEuMjI2YzAuODgsMCwxLjY1MSwwLjI5NywxLjc0MiwxLjIyNmMwLjAxNiwwLjE1OCwwLjAxMSwwL
|
||||||
|
jMyNywwLjAxMSwwLjMyN3YwLjE2NmgtMS4yNTF2LTAuMjc4IGMwLjAwMSwwLjAwMS0wLjAwMi0wLjExOC0wLjAxNi0wLjE4OWMtMC4wMjEtMC4xMS0wLjExNi0wLjM2Mi0wLjQ5NS0wLjM2MmMtMC4zNjIsMC0wLjQ2NywwLjIzOC0wLjQ5NCwwLjM2MiBjLTAuMDE1LDAuMDY1LTAuMDIxLDAuMTU0LTAuMDIxLDAuMjM0djIuMjdjLTAuMDAxLDAuMDYzLDAuMDAzLDAuMTMyLDAuMDEzLDAuMTg5QzM5LjI0MSwyNS40MzMsMzkuMzY2LDI1LjY2LDM5LjcyNSwyNS42NnoiLz48L3N2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Samsung</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="12">
|
||||||
|
<name>Sony</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icon-sony.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmc6c3ZnIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOnN2Zz0iaH
|
||||||
|
R0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjgwIDEyODAiIHZlcnNpb249IjEuMSIgaWQ9InN2ZzEiIHNvZGlwb2RpOmRvY25hbWU9Imljb24tc29ueS5zdmciIGlua3NjYXBlOnZlcnNpb249IjEuNC4zICgwZDE1Zjc1MDQyLCAyMDI1LTEyLTI1KSIgd2lkdGg9IjEyODAiIGhlaWdodD0iMTI4MCI+PHNvZGlwb2RpOm5hbWVkdmlldyBpZD0ibmFtZWR2aWV3MSIgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYm9y
|
||||||
|
ZGVyb3BhY2l0eT0iMC4yNSIgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9IjAiIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIgaW5rc2NhcGU6em9vbT0iMC42MzQxODYzOSIgaW5rc2NhcGU6Y3g9Ii00NjIuNzk3NjkiIGlua3NjYXBlOmN5PSIyMjUuNDg1NzYiIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMjU2MCIgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTM2MC
|
||||||
|
IgaW5rc2NhcGU6d2luZG93LXg9IjAiIGlua3NjYXBlOndpbmRvdy15PSIwIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJnNCIgc2hvd2d1aWRlcz0idHJ1ZSI+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSIxNzMuMzcxMDgsNjQxLjg5MDI0IiBvcmllbnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMSIgaW5rc2NhcGU6bG9ja2VkPSJmYWxzZSIvPjwvc29kaXBvZGk6bmFtZWR2aWV3Pjxzdmc6ZGVmcyBpZD0iZGVmczEi
|
||||||
|
Lz48c3ZnOmcgaWQ9IkxheWVyXzIiPjxzdmc6ZyBpZD0iZzQiIGlua3NjYXBlOmxhYmVsPSJsb2dvIj48c3ZnOnBhdGggZD0ibSA0NTYuMDEyOSw3NTEuNzQ2ODcgYyAtNDYuNDEyNzksMCAtODkuNDIwNzksLTEzLjgyMzk5IC0xMTguMDkyNzksLTM5LjYwMzE5IGEgOTYuODk1OTg5LDk2Ljg5NTk4OSAwIDAgMSAtMzIuMTI3OTksLTczLjE5MDM5IDk4LjMyOTU4OCw5OC4zMjk1ODggMCAwIDEgMzIuMTI3OTksLTcyLjkzNDQgYyAyNi42MjQsLTI0LjE5MTk5IDczLjcyOC
|
||||||
|
wtMzkuNTUxOTkgMTE4LjA5Mjc5LC0zOS41NTE5OSA0OS4wNzUxOSwwIDg4LjM3MTE5LDEyLjM2NDggMTE4LjM5OTk5LDM5LjYwMzE5IGEgOTcuNDA3OTg5LDk3LjQwNzk4OSAwIDAgMSAzMS42OTI3OSw3Mi44ODMyIDEwMS41Mjk1OSwxMDEuNTI5NTkgMCAwIDEgLTMxLjY5Mjc5LDczLjE5MDM5IGMgLTI3Ljk4MDgsMjUuOTMyOCAtNzEuOTEwNCwzOS42MDMxOSAtMTE4LjM5OTk5LDM5LjYwMzE5IHYgLTI5LjY0NDc5IGMgMjQuNjAxNiwwIDQ3LjQzNjc5LC04LjQ5OTIg
|
||||||
|
NjMuMzg1NTksLTI0LjM3MTIgMTUuOTQ4OCwtMTUuODcyIDIzLjE5MzYsLTM1LjEyMzIgMjMuMTkzNiwtNTguODc5OTkgMCwtMjIuNjgxNiAtNy45NjE2LC00My44Nzg0IC0yMy4xOTM2LC01OC44OCAtMTUuNzQ0LC0xNS40ODc5OSAtMzkuMTE2NzksLTI0LjIxNzU5IC02My4zODU1OSwtMjQuMjE3NTkgLTI0LjI2ODgsMCAtNDcuNzQzOTksOC42NTI4IC02My40ODc5OSwyNC4yMTc1OSAtMTUuMTgwOCwxNS4wMjcyIC0yMy4wNCwzNi4zMDA4IC0yMy4wNCw1OC44OCBhID
|
||||||
|
gyLjM1NTE5LDgyLjM1NTE5IDAgMCAwIDIzLjA0LDU4Ljg3OTk5IGMgMTUuNzQ0LDE1LjY5MjggMzkuMDY1NTksMjQuMzcxMiA2My40ODc5OSwyNC4zNzEyIHogTSAxMTcuMTIwMTQsNTI2LjQ2NjkgYyAtMjQuODA2MzkyLDAgLTUyLjk5MTk4OSw0LjY1OTIgLTc2Ljc5OTk4NiwxNS4zNiBDIDE4LjA5OTM1NSw1NTEuNzU5NyAxLjU3NWUtNCw1NjcuNzA4NDkgMS41NzVlLTQsNTk0LjE1MzI5IGEgNTQuMjIwNzk0LDU0LjIyMDc5NCAwIDAgMCAxNC43MTk5OTg1LDM3LjI3
|
||||||
|
MzYgYyA2LjQyNTU5OSw1LjkzOTIgMTYuNzkzNTk5LDE2LjAyNTYgNDMuODc4Mzk2LDIxLjk2NDggMTIuMTA4Nzk4LDIuNTU5OTkgMzcuOTkwMzk1LDYuNjgxNTkgNjMuNzY5NTg4LDkuMzk1MTkgMjUuNzc5MiwyLjcxMzYgNTAuNzY0OCw1LjEyIDYxLjAwNDgsNy44NTkyIDguMTQwOCwyLjA3MzYgMjEuODM2NzksNC44ODk2IDIxLjgzNjc5LDIwLjI0OTYgMCwxNS4zNiAtMTQuNDEyNzksMTkuOTY4IC0xNi45MjE1OSwyMC45NjY0IC0yLjUwODgsMC45OTg0IC0xOS44MT
|
||||||
|
Q0LDguOTM0NCAtNTAuODkyOCw4LjkzNDQgYSAyMTYuNDIyMzcsMjE2LjQyMjM3IDAgMCAxIC02MC41OTUxOSwtMTAuNDE5MiBjIC0xMS41OTY3OTksLTQuMTQ3MiAtMjMuNzU2Nzk3LC05LjYgLTM1LjA5NzU5NiwtMjMuNDQ5NiBhIDQwLjI2ODc5NSw0MC4yNjg3OTUgMCAwIDEgLTcuMjk1OTk5LC0yMi4yMjA4IEggNi4yNDY1NTY3IHYgNzguODQ3OTkgSCAzNy41Mjk3NTQgdiAtMTAuNjc1MTkgYSA0LjQ1NDM5OTUsNC40NTQzOTk1IDAgMCAxIDYuNzU4NCwtMy44NCAy
|
||||||
|
NDYuNDI1NTcsMjQ2LjQyNTU3IDAgMCAwIDQ1Ljc3Mjc5NCwxNC43OTY3OSBjIDE2LjQzNTIwMiwzLjQzMDQgMjcuMDU5MTkyLDUuOTEzNiA0Ny40ODc5OTIsNS45MTM2IGEgMjAyLjYyMzk4LDIwMi42MjM5OCAwIDAgMCA2My42NDE2LC04Ljk4NTYgMTExLjA3ODM5LDExMS4wNzgzOSAwIDAgMCAzNy44MTExOSwtMTguNjYyMzkgNTEuODE0Mzk0LDUxLjgxNDM5NCAwIDAgMCAyMC4yNDk1OSwtNDEuNDk3NiA1OC4wNjA3OTMsNTguMDYwNzkzIDAgMCAwIC0xNi4zNTgzOS
|
||||||
|
wtNDAuODA2MzkgNzIuMDEyNzkyLDcyLjAxMjc5MiAwIDAgMCAtMjAuMTcyOCwtMTMuNzk4NCAxNDguNjA3OTgsMTQ4LjYwNzk4IDAgMCAwIC0yNC44ODMxOSwtOC42Nzg0IGMgLTE2LjIzMDQsLTMuOTY4IC01Mi42ODQ4LC04LjkzNDQgLTcwLjExODQsLTEwLjY3NTIgLTE4LjI3ODM5LC0xLjg5NDQgLTQ5Ljk5Njc5LC00LjUzMTIgLTYyLjY2ODc4OSwtOC40NDggLTMuODM5OTk5LC0xLjIwMzIgLTExLjY3MzU5OSwtNC45MTUyIC0xMS42NzM1OTksLTE0LjAwMzIgMCwt
|
||||||
|
Ni40NzY4IDMuNTg0LC0xMS45NTUyIDEwLjY0OTU5OSwtMTYuMzg0IEMgNzUuMjY0MTUsNTYwLjc3MDkgOTcuOTQ1NzQ3LDU1Ni4zOTMzIDEyMS42MDAxNCw1NTYuMzkzMyBhIDE2Ni45ODg3OCwxNjYuOTg4NzggMCAwIDEgNjYuNzEzNiwxMy4wMzAzOSA3Mi44NTc1OTEsNzIuODU3NTkxIDAgMCAxIDE1Ljg3MTk5LDkuNDcyIDQ3LjcxODM5NCw0Ny43MTgzOTQgMCAwIDEgMTUuNjQxNiwyNi4xNjMyIGggMjUuMjY3MiBWIDUzNi40MjUzIGggLTI4LjE2IHYgNy45NjE2IG
|
||||||
|
MgMCwyLjU2IC0yLjU2LDUuOTM5MiAtNy42OCwzLjE0ODggLTEyLjY5NzU5LC02LjYwNDggLTQ4LjM4Mzk5LC0yMC44ODk2IC05Mi4xMzQzOSwtMjEuMDY4OCB6IG0gNjE4LjIxNDMzLDEyLjU5NTIgMTM3LjYyNTU4LDEyNC4xODU1OCAtMS40MDgsLTgzLjYwOTU5IGMgLTAuMTUzNiwtMTAuOTgyNCAtMi4xNTA0LC0xNS41NjQ3OSAtMTQuMDI4OCwtMTUuNTY0NzkgaCAtMjUuODU1OTkgdiAtMjUuMDExMiBoIDExNy43NTk5OCB2IDI1LjAxMTIgaCAtMjUuMjY3MTkgYyAt
|
||||||
|
MTIuMDgzMiwwIC0xMi44LDMuODkxMTkgLTEzLjAwNDgsMTUuNTY0NzkgbCAyLjEyNDgsMTU5Ljc2OTU5IGggLTQwLjMyIEwgNzE0LjQxOTI3LDU5Ny45NDIwOSB2IDEwMC4zNzc1OSBjIDAuMTI4LDEwLjkzMTIgMC42NCwxNi4wNzY4IDExLjg3ODQsMTYuMDc2OCBoIDI4LjE2IHYgMjUuMDExMiBIIDYzOS4wMjcyOCB2IC0yNS4wMTEyIGggMjcuMDMzNiBjIDEwLjA4NjM5LDAgOS42NzY3OSwtOS42MjU2IDkuNjc2NzksLTE2LjY0IFYgNTgwLjU4NTI5IGMgMCwtNy42OC
|
||||||
|
AtMS4wNzUyLC0xNi40ODYzOSAtMTYuODk1OTksLTE2LjQ4NjM5IGggLTIxLjkxMzYgViA1MzkuMDYyMSBaIE0gMTA4My43NzYsNzE0LjM0NTI4IGEgNTUuODU5MTkzLDU1Ljg1OTE5MyAwIDAgMCA2Ljk2MzIsLTAuNDM1MiA4LjYyNzE5OSw4LjYyNzE5OSAwIDAgMCA1LjQyNzIsLTQuODEyOCAyOC4wMDYzOTcsMjguMDA2Mzk3IDAgMCAwIDAuNTM3NiwtNS40MDE2IHYgLTM5LjU1MiBjIDAsLTEuMzMxMiAwLC0xLjM1NjggLTEuNjg5NiwtMy40NTYgLTEuNjg5NiwtMi4w
|
||||||
|
OTkyIC03Mi4wODk2LC04MS45MTk5OSAtNzUuMjg5NiwtODUuNTAzOTkgLTMuOTkzNiwtNC4zNTIgLTExLjAwOCwtMTEuMDg0NzkgLTIxLjY4MzIsLTExLjA4NDc5IGggLTI0LjQ0Nzk2IHYgLTI1LjAzNjggaCAxMzcuOTgzOTYgdiAyNC45ODU2IGggLTE2LjY0IGMgLTMuODQsMCAtNi40LDMuNjYwNzkgLTMuMTIzMiw3LjY3OTk5IDAsMCA0Ni40Mzg0LDU1LjU1MiA0Ni44NzM2LDU2LjE0MDggMC40MzUyLDAuNTg4OCAwLjgxOTIsMC43MTY4IDEuNDA4LDAuMTc5MiAwLj
|
||||||
|
U4ODgsLTAuNTM3NiA0Ny41OTA0LC01NS44MDggNDcuOTQ4OCwtNTYuMzIgYSA0Ljc4NzE5OTQsNC43ODcxOTk0IDAgMCAwIC00LjA5NiwtNy42Nzk5OSBoIC0xNy4wNzUyIFYgNTM5LjA2MjEgSCAxMjgwIHYgMjUuMDM2OCBoIC0yNS4yNjcyIGMgLTkuMTY0OCwwIC0xMi44LDEuNjg5NTkgLTE5Ljc4ODgsOS40NzE5OSBsIC03Ni4xNiw4Ni44ODYzOSBhIDUuMzc1OTk5NCw1LjM3NTk5OTQgMCAwIDAgLTAuOTIxNiwzLjY4NjQgdiAzOS41MjY0IGEgMjguMTU5OTk3LDI4
|
||||||
|
LjE1OTk5NyAwIDAgMCAwLjU2MzIsNS40MDE2IDguNTI0Nzk5LDguNTI0Nzk5IDAgMCAwIDUuNDAxNiw0LjgxMjggNTAuNjExMTk0LDUwLjYxMTE5NCAwIDAgMCA2LjkxMiwwLjQzNTIgaCAyNS44MzA0IHYgMjUuMDM2OCBoIC0xMzcuMjY3MiB2IC0yNS4wMzY4IHoiIGlkPSJwYXRoMSIgZmlsbD0iIzAwMDAwMCIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjU2Ii8+PC9zdmc6Zz48L3N2ZzpnPjwvc3ZnOnN2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Sony</friendlyname>
|
||||||
|
</Brand>
|
||||||
|
<Brand alias="Brand" id="13">
|
||||||
|
<name>Toshiba</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>logo-toshiba.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmc6c3ZnIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOnN2Zz0
|
||||||
|
iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSI4MDAiIGhlaWdodD0iODAwIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA4MDAgODAwLjAxOTY5IiBpZD0ic3ZnMSIgc29kaXBvZGk6ZG9jbmFtZT0ibG9nby10b3NoaWJhLnN2ZyIgaW5rc2NhcGU6dmVyc2lvbj0iMS40LjMgKDBkMTVmNzUwNDIsIDIwMjUtMTItMjUpIj48c3ZnOmRlZnMgaWQ9ImRlZnMxIi8+PHNvZGlwb2RpOm5hbWVkdmlldyBpZD0ibmFtZWR2a
|
||||||
|
WV3MSIgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYm9yZGVyb3BhY2l0eT0iMC4yNSIgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9IjAiIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIgc2hvd2d1aWRlcz0idHJ1ZSIgaW5rc2NhcGU6em9vbT0iMS41MzgxMjUiIGlua3NjYXBlOmN4PSIzNzguNzA3ODQiIGlua3NjYXBlOmN5PSIyODg
|
||||||
|
uMDEzIiBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjI1NjAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNjAiIGlua3NjYXBlOndpbmRvdy14PSIwIiBpbmtzY2FwZTp3aW5kb3cteT0iMCIgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSI+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSIyMjcuMzE3MTYsMzk5LjM4NTQyIiBvcmllbnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMSIgaW5rc2NhcGU6bG9ja2VkPSJmY
|
||||||
|
WxzZSIvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxzdmc6cGF0aCBmaWxsPSIjZTYxZTFlIiBkPSJtIDc2Ni4xMDAxNiw0NTkuNzEzNiBoIDM0LjU1IGwgLTM1LjY1LC0xMTcuNjYgLTQ5LjEsLTAuMDAyIC0zNS42NSwxMTcuNjYgaCAzNC41NiBsIDYuMywtMjEuNzggaCAzOC42NiBsIDYuMzMsMjEuNzggbSAtMzcuNTEsLTQ3Ljk0MyAxMS43NiwtNDAuNjUxIGggMC4yIGwgMTEuNzYsNDAuNjUxIHogbSAtNTU1LjQ2LDUwLjA1NSBjIDM1LjQ4LDAgNTIuNjMsLTYuMjU
|
||||||
|
gNTUuMDYsLTM4LjI2NSAwLjU4LC03LjYxOCAwLjY5LC0xNS40MzkgMC42OSwtMjIuNjg5IDAuMDEsLTcuMjI1IC0wLjExLC0xNS4wNTQgLTAuNjksLTIyLjY3MSAtMi40MywtMzIuMDI1IC0xOS41OCwtMzguMjY1IC01NS4wNiwtMzguMjY1IC0zNS40OCwwIC01Mi42Miw2LjI0IC01NS4wNCwzOC4yNjUgLTAuNTksNy42MTcgLTAuNzEsMTUuNDQ2IC0wLjcxLDIyLjY3MSAwLjAxLDcuMjUgMC4xMiwxNS4wNzEgMC43MSwyMi42ODkgMi40MiwzMi4wMTUgMTkuNTYsMzguMjY1IDU1LjA0LDM4LjI2NSBtIC0yMi4zMSwtNjAuOTU0IGMgMCwtNi40NjEgMC4xNiwtMTAuMjggMC4zLC0xMy4xMTQgMC45LC0xOC4xNjEgOC4wNywtMjAuMjc4IDIyLjAxLC0yMC4yNzggMTMuOTUsMCAyMS4xMiwyLjExNyAyMi4wMSwyMC4yNzggMC4xNCwyLjgzMyAwLjMxLDYuNjUyIDAuMzEsMTMuMTE0IDAsNi40ODIgLTAuMTcsMTAuMzA4IC0wLjMxLDEzLjEzNSAtMC44OSwxOC4xNjQgLTguMDYsMjAuMjg1IC0yMi4wMSwyMC4yODUgLTEzLjk0LDAgLTIxLjExLC0yLjEyMSAtMjIuMDEsLTIwLjI4NSAtMC4xNCwtMi44MjcgLTAuMywtNi42NTMgLTAuMywtMTMuMTM1IHogTSAwLjY1MDE1ODIyLDM0Mi4xMDU2IHYgMjkuMzMxIEggMzUuODIyMTU4IHYgODguMzI3IGggMzUuMTg1IHYgLTg4LjMyNyBoIDM1LjE3MzAwMiB2IC0yOS4zMzEgSCAwLjY1MDE1ODIyIE0gNTQwLjUwMDE2LDQ1OS43MTM2IHYgLTExNy42NjIgaCAtMzMuMzkgdiAxMTcuNjYyIGggMzMuMzkgbSAtMTM0LjM1LC03NC43MDMgdiAtNDIuOTU5IGggLTMzLjIgdiAxMTcuNjYyIGggMzMuMiB2IC00NS4zNzIgaCAzOC41OCB2IDQ1LjM3MiBoIDMzLjE5IHYgLTExNy42NjIgaCAtMzMuMTkgdiA0Mi45NTkgaCAtMzguNTggbSAyNDQuMTcsMTMuMjA2IGMgMTQuNzksLTMuNzgxIDE5LjEzLC0xMi42MTYgMTkuMTMsLTI1LjM4NiAwLC0yNS44NTkgLTE2LjI3LC0zMC43OCAtMzkuNCwtMzAuNzggaCAtNTkuOTUgdiAxMTcuNjYgaCA2Mi45MiBjIDI4Ljk3LDAgMzguNzEsLTEyLjQ4IDM4LjcxLC0zMS42NzUgMCwtMTMuMzgzIC0zLjA2LC0yNS4xOTEgLTIxLjQxLC0yOS44MjIgbSAtNDcuMDMsMTMuMTY5IGggMjMuMDIgYyA5LjMsMCAxMS4yNCw0LjA3NCAxMS4yNCwxMC43IDAsNi42MzIgLTMuNjQsMTAuNzE3IC0xMS4yNCwxMC43MTcgaCAtMjMuMDIgeiBtIDAsLTQyLjQyNSBoIDIzLjAyIGMgNi4wMSwwIDkuNzMsMi44NTEgOS43Myw5LjcwOCAwLDUuODc4IC0zLjY4LDkuNDk2IC05LjczLDkuNDk2IGggLTIzLjAyIHogbSAtMzU1LjA2LDUyLjE0MyBoIDMxLjY1IGMgMC4wMyw1LjcwOCAwLjc2LDkuNTIzIDMuNTMsMTEuNjMgMy4xNSwyLjM3NCA1Ljk3LDMuMTU4IDE1LjMyLDMuMTU4IDksMCAxOC44NiwwIDE4Ljg2LC0xMS4wODUgMCwtOC43NDIgLTUuNTEsLTEwLjczNyAtMTUuNjgsLTExLjI3OSAtMjUuMjIsLTEuMzM2IC0zNC4zNCwtMi4wNDkgLTQzLjczLC05LjAyNSAtNi40LC00Ljc1NyAtOS43MiwtMTQuMDE4IC05LjcyLC0yNi41NDIgMCwtMjEuMjk3IDcuNDMsLTI4Ljc2OCAxOC4xNSwtMzMuOTgxIDExLjA2LC01LjM4MSA1NC40NywtNS4zODEgNjYuMTUsMCAxNC42OSw2Ljc2OCAxNS4xMiwyMS40MiAxNS4xMiwzNS4wMTEgaCAtMzEuNTcgYyAtMC4wNiwtNi45MjkgLTEuNjIsLTguODg2IC0yLjg5LC0xMC4xNzUgLTMuMjgsLTIuOTA4IC03Ljk1LC0zLjUyMiAtMTQuNjksLTMuNTIyIC04LjE2LDAgLTE3LjYsMC4zNjggLTE3LjYsMTAuMjc3IDAsNy41NiAzLjI3LDEwLjcyIDExLjg1LDExLjI3NiAxMS43OSwwLjc1NCAzNS4wMiwxLjQ5NyA0My4zLDYuMzgzIDExLjYxLDYuODY3IDE0LjYyLDE2LjE1OSAxNC42MiwzMS4zMTkgMCwyMS45MDggLTcuODQsMjguMzM4IC0xOC43NSwzMy4xNTggLTEyLjU5LDUuNTYgLTU0LjY0LDUuNTYgLTY4LjMxLC0wLjQzIC0xNS4zLC02LjY3IC0xNS42MSwtMTkuOTY0IC0xNS42MSwtMzYuMTczIiBpZD0icGF0aDEiLz4KPC9zdmc6c3ZnPgo=</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>Brand</finalclass>
|
||||||
|
<friendlyname>Toshiba</friendlyname>
|
||||||
|
</Brand>
|
||||||
</Set>
|
</Set>
|
||||||
|
|
||||||
|
|||||||
@@ -1,48 +1,116 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Set>
|
<Set>
|
||||||
<OSFamily alias="OSFamily" id="1">
|
<OSFamily alias="OSFamily" id="1">
|
||||||
<name>Arch</name>
|
<name>Arch</name>
|
||||||
<finalclass>OS Family</finalclass>
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-arch-linux.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iMCwwLDI1NiwyNTYiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIGZpbGwtcnVsZT0ibm9uemVybyI+PGcgZmlsbD0iIzAwODhjYyIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgZm9udC1mYW1pbHk9Im5vbmUiIGZvbnQtd2VpZ2h0PSJub25lIiBmb250LXNpemU9Im5vbmUiIHRleHQtYW5jaG9yPSJub25lIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PGcgdHJhbnNmb3JtPSJzY2FsZSg1LjMzMzMzLDUuMzMzMzMpIj48cGF0aCBkPSJNMjguNDY1LDM4LjYxMWMwLjQxOSwtMS4xMDUgMC42NjQsLTIuMzY1IDAuNjY0LC0zLjcxNGMwLC00LjEzMyAtMi4yMTEsLTcuNDk0IC00LjkyOSwtNy40OTRjLTIuNzQxLDAgLTQuOTUxLDMuMzYxIC00Ljk1MSw3LjQ5NGMwLDEuMzI2IDAuMjIxLDIuNTg2IDAuNjQxLDMuNjY5Yy05LjA0MSwwLjk1MSAtMTUuNDA3LDQuNzMxIC0xNy45OTMsNi40MzJjNC4zNTUsLTYuMjc4IDguOTA5LC0xMy42MzggMTMuMjYyLC0yMi4xMDVjMS4wODMsLTIuMTAxIDIuMTAxLC00LjE3OCAzLjA1LC02LjIxMWMwLjM3NSwwLjI0MyAwLjc1MSwwLjUwOSAxLjE3MSwwLjc3NWMxLjk0NSwxLjIxNSAzLjc1OSwxLjg3OSA1LjA4NCwyLjIzM2MtMC45NzMsLTAuNzMgLTIuMDMzLC0xLjYxMyAtMy4xMTYsLTIuNjk3Yy0wLjgxNywtMC44MTcgLTEuNTQ3LC0xLjYzNyAtMi4xNjcsLTIuNDMzYzEuODM1LC00LjAyMiAzLjQyNywtNy44OTEgNC44MTksLTExLjU2YzIuMzIsNi4xNDQgNS4yMTcsMTIuODQyIDguODQxLDE5Ljg5M2MyLjM0Myw0LjUzMSA0LjczMSw4Ljc1NCA3LjExNywxMi42NDRjLTAuNjg1LC0wLjM3NSAtMS40MzcsLTAuNzMgLTIuMjMzLC0xLjAzOWMtMS4zNzEsLTAuNTMgLTIuNjUyLC0wLjg2MiAtMy43NTksLTEuMDZjMS41MDMsMC43NTEgMy4yNSwxLjc0NyA1LjA4NCwzLjA3M2MxLjE5NCwwLjg4NSAyLjI1NCwxLjc2OSAzLjE2MSwyLjYzMWMwLjAyMSwwLjAyMSAwLjAyMSwwLjAyMSAwLjA0NSwwLjA0NWMxLjI2LDIuMDU2IDIuNTY1LDMuOTU3IDMuODQ2LDUuODEzYy0yLjU0MSwtMS42ODEgLTguNzk2LC01LjM5NSAtMTcuNjM3LC02LjM4OXoiLz48L2c+PC9nPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
|
||||||
<friendlyname>Arch</friendlyname>
|
<finalclass>OS Family</finalclass>
|
||||||
</OSFamily>
|
<friendlyname>Arch</friendlyname>
|
||||||
<OSFamily alias="OSFamily" id="2">
|
</OSFamily>
|
||||||
<name>Debian</name>
|
<OSFamily alias="OSFamily" id="2">
|
||||||
<finalclass>OS Family</finalclass>
|
<name>Debian</name>
|
||||||
<friendlyname>Debian</friendlyname>
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-debian.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNFOTFFNjMiIGQ9Ik0yNi43NjMsMjQuNTQ4Yy0wLjYxNCwwLjAxLDAuMTE3LDAuMzE3LDAuOTE4LDAuNDRjMC4yMi0wLjE3MiwwLjQxOS0wLj
|
||||||
</OSFamily>
|
M0OCwwLjYtMC41MTVDMjcuNzgxLDI0LjU5MiwyNy4yNzQsMjQuNTk0LDI2Ljc2MywyNC41NDggTTMwLjA1NCwyMy43MjdjMC4zNjQtMC41LDAuNjMxLTEuMDU1LDAuNzIzLTEuNjI0Yy0wLjA4MiwwLjQwNS0wLjMwMywwLjc1NS0wLjUxLDEuMTI4Yy0xLjE0NiwwLjcyMS0wLjEwOC0wLjQzLDAtMC44NjVDMjkuMDM1LDIzLjkxMywzMC4wOTgsMjMuMjkzLDMwLjA1NCwyMy43MjcgTTMxLjI2OSwyMC41NjhjMC4wNzMtMS4xMDUtMC4yMTktMC43NTYtMC4zMTctMC4zMzZD
|
||||||
<OSFamily alias="OSFamily" id="3">
|
MzEuMDY4LDIwLjI5NCwzMS4xNTYsMjEuMDEzLDMxLjI2OSwyMC41NjggTTI0LjQzOSw1LjQ3OGMwLjMyNywwLjA1OCwwLjcwNiwwLjEwNCwwLjY1MywwLjE4M0MyNS40NDksNS41ODIsMjUuNTMxLDUuNTEsMjQuNDM5LDUuNDc4IE0yNS4wOTMsNS42NmwtMC4yMzIsMC4wNDdsMC4yMTUtMC4wMTdMMjUuMDkzLDUuNjYgTTM1LjI5NCwyMC45ODZjMC4wMzgsMC45OTEtMC4yOSwxLjQ3Mi0wLjU4NSwyLjMyMmwtMC41MjksMC4yNjZjLTAuNDM1LDAuODQxLDAuMDQxLDAuNT
|
||||||
<name>Oracle Linux</name>
|
M1LTAuMjY4LDEuMjAyYy0wLjY3OSwwLjYwMy0yLjA1NSwxLjg4My0yLjQ5NiwyLjAwNGMtMC4zMjEtMC4wMDksMC4yMTgtMC4zODIsMC4yODktMC41MjZjLTAuOTA2LDAuNjItMC43MjgsMC45MzQtMi4xMTMsMS4zMTNsLTAuMDQxLTAuMDljLTMuNDE5LDEuNjA3LTguMTY2LTEuNTc2LTguMTAzLTUuOTI4Yy0wLjAzNywwLjI3NS0wLjEwNCwwLjIwOS0wLjE4LDAuMzJjLTAuMTc1LTIuMjM3LDEuMDMzLTQuNDg2LDMuMDczLTUuNDAzYzEuOTk1LTAuOTg3LDQuMzM1LTAu
|
||||||
<finalclass>OS Family</finalclass>
|
NTgsNS43NjMsMC43NWMtMC43ODUtMS4wMjgtMi4zNDgtMi4xMTktNC4xOTktMi4wMTdjLTEuODE0LDAuMDI5LTMuNTEsMS4xODItNC4wNzcsMi40MzRjLTAuOTI5LDAuNTg1LTEuMDM4LDIuMjU2LTEuNDQxLDIuNTYzYy0wLjU0NSw0LjAwMywxLjAyNCw1LjczMywzLjY4LDcuNzY4YzAuNDE3LDAuMjgyLDAuMTE4LDAuMzI2LDAuMTc1LDAuNTQxYy0wLjg4My0wLjQxMi0xLjY5LTEuMDM3LTIuMzU0LTEuODAxYzAuMzUzLDAuNTE3LDAuNzMzLDEuMDE3LDEuMjIzLDEuND
|
||||||
<friendlyname>Oracle Linux</friendlyname>
|
FjLTAuODMxLTAuMjc5LTEuOTQyLTIuMDEzLTIuMjY3LTIuMDg0YzEuNDM1LDIuNTY3LDUuODE4LDQuNTAyLDguMTEzLDMuNTQxYy0xLjA2MiwwLjA0LTIuNDEyLDAuMDIxLTMuNjA0LTAuNDJjLTAuNTAxLTAuMjU3LTEuMTgzLTAuNzkxLTEuMDYyLTAuODkzYzMuMTMzLDEuMTcxLDYuMzY5LDAuODg3LDkuMDc4LTEuMjg2YzAuNjg5LTAuNTM3LDEuNDQzLTEuNDQ5LDEuNjYyLTEuNDY0Yy0wLjMyNywwLjQ5MywwLjA1NywwLjIzOS0wLjE5NywwLjY3NGMwLjY4OC0xLjEw
|
||||||
</OSFamily>
|
OS0wLjI5OS0wLjQ0OSwwLjcxMS0xLjkxM2wwLjM3MywwLjUxMmMtMC4xMzktMC45MTcsMS4xNDMtMi4wMzMsMS4wMTItMy40ODljMC4yOTEtMC40NDUsMC4zMjYsMC40NzgsMC4wMTUsMS41MDJjMC40MzQtMS4xMzYsMC4xMTMtMS4zMTcsMC4yMjQtMi4yNTRjMC4xMjEsMC4zMTUsMC4yNzksMC42NDgsMC4zNTksMC45ODFjLTAuMjgxLTEuMDk3LDAuMjg5LTEuODQ4LDAuNDMzLTIuNDg1Yy0wLjE0Mi0wLjA2My0wLjQzNSwwLjQ4NS0wLjUwMy0wLjgxMmMwLjAxLTAuNT
|
||||||
<OSFamily alias="OSFamily" id="4">
|
YyLDAuMTU2LTAuMjk1LDAuMjE0LTAuNDM1Yy0wLjExMS0wLjA2NC0wLjQtMC40OTYtMC41NzctMS4zMjNjMC4xMjctMC4xOTMsMC4zNDIsMC41MDYsMC41MTYsMC41MzNjLTAuMTEyLTAuNjU1LTAuMzA0LTEuMTU5LTAuMzEzLTEuNjY1Yy0wLjUxLTEuMDYxLTAuMTgxLDAuMTQzLTAuNTkyLTAuNDU4Yy0wLjU0My0xLjY4NywwLjQ0OS0wLjM5LDAuNTE0LTEuMTU2YzAuODIsMS4xODgsMS4yODksMy4wMjksMS41MDQsMy43OTJjLTAuMTY0LTAuOTMtMC40MjgtMS44MzIt
|
||||||
<name>Red Hat</name>
|
MC43NTItMi43MDRjMC4yNDksMC4xMDgtMC40MDEtMS45MTEsMC4zMjQtMC41NzVjLTAuNzcyLTIuODQ4LTMuMzE0LTUuNTExLTUuNjUtNi43NmMwLjI4NiwwLjI2MiwwLjY0NiwwLjU5MSwwLjUxNywwLjY0MmMtMS4xNjMtMC42OS0wLjk1OS0wLjc0NS0xLjEyNC0xLjA0MWMtMC45NDYtMC4zODMtMS4wMSwwLjAzNC0xLjYzNiwwYy0xLjc4Ni0wLjk0My0yLjEyOS0wLjg0NS0zLjc3Mi0xLjQzN2wwLjA3OCwwLjM0OWMtMS4xODQtMC4zOTQtMS4zNzksMC4xNDYtMi42NT
|
||||||
<finalclass>OS Family</finalclass>
|
csMC4wMDJjLTAuMDc4LTAuMDYyLDAuNDEtMC4yMTksMC44MTEtMC4yNzhjLTEuMTQzLDAuMTUtMS4wOS0wLjIyOC0yLjIwOCwwLjA0MmMwLjI3Ny0wLjE5NywwLjU2Ni0wLjMyMiwwLjg2MS0wLjQ4NmMtMC45MzIsMC4wNTktMi4yMjYsMC41NDItMS44MjUsMC4xMDNjLTEuNTIxLDAuNjc2LTQuMjIsMS42My01LjczNSwzLjA1MWwtMC4wNDctMC4zMjJjLTAuNjk0LDAuODM1LTMuMDI4LDIuNDkyLTMuMjE1LDMuNTdsLTAuMTg1LDAuMDQzYy0wLjM2MSwwLjYxMy0wLjU5
|
||||||
<friendlyname>Red Hat</friendlyname>
|
NSwxLjMwNS0wLjg4MSwxLjkzNWMtMC40NzQsMC44MDYtMC42OTIsMC4zMTEtMC42MjYsMC40MzZjLTAuOTI5LDEuODgzLTEuMzksMy40NjctMS43OSw0Ljc2OGMwLjI4NCwwLjQyNCwwLjAwNywyLjU1OCwwLjExMyw0LjI2NGMtMC40NjcsOC40MjksNS45MTYsMTYuNjA5LDEyLjg5MSwxOC41YzEuMDIzLDAuMzY1LDIuNTQyLDAuMzU0LDMuODM2LDAuMzljLTEuNTI1LTAuNDM4LTEuNzIyLTAuMjMyLTMuMjA5LTAuNzQ5Yy0xLjA3NC0wLjUwNi0xLjMwOC0xLjA4Mi0yLj
|
||||||
</OSFamily>
|
A2Ni0xLjc0bDAuMywwLjUzYy0xLjQ5LTAuNTI2LTAuODY3LTAuNjUyLTIuMDc4LTEuMDM0bDAuMzIxLTAuNDI0Yy0wLjQ4Mi0wLjAzMi0xLjI3OS0wLjgxMS0xLjQ5Ny0xLjI0MWwtMC41MjgsMC4wMjFjLTAuNjM0LTAuNzgzLTAuOTcyLTEuMzQ4LTAuOTQ4LTEuNzg1bC0wLjE3LDAuMzA1Yy0wLjE5NC0wLjMzMi0yLjMzNS0yLjkzNy0xLjIyNC0yLjMzYy0wLjIwNy0wLjE4OC0wLjQ4MS0wLjMwNy0wLjc3OS0wLjg1bDAuMjI3LTAuMjU4Yy0wLjUzNS0wLjY4Ni0wLjk4
|
||||||
<OSFamily alias="OSFamily" id="5">
|
My0xLjU2OC0wLjk0OS0xLjg2YzAuMjg0LDAuMzg0LDAuNDgyLDAuNDU0LDAuNjc5LDAuNTIyYy0xLjM1MS0zLjM0OS0xLjQyNi0wLjE4Ny0yLjQ0OC0zLjQwOWwwLjIxNi0wLjAxOWMtMC4xNjYtMC4yNDYtMC4yNjUtMC41MjEtMC4zOTktMC43ODVsMC4wOTQtMC45MzhjLTAuOTcyLTEuMTI1LTAuMjcyLTQuNzgxLTAuMTMyLTYuNzgzYzAuMDk3LTAuODE2LDAuODExLTEuNjg0LDEuMzU0LTMuMDQ1bC0wLjMzMi0wLjA1NWMwLjYzMi0xLjEwNCwzLjYxMi00LjQzMyw0Lj
|
||||||
<name>Ubuntu</name>
|
k5LTQuMjZjMC42NjktMC44NDEtMC4xMzItMC4wMDItMC4yNjMtMC4yMTVjMS40NjktMS41MiwxLjkzLTEuMDczLDIuOTItMS4zNDljMS4wNjgtMC42MzMtMC45MTcsMC4yNTEtMC40MS0wLjIzOWMxLjg0OC0wLjQ3MywxLjMxLTEuMDczLDMuNzE4LTEuMzExYzAuMjU0LDAuMTQ1LTAuNTksMC4yMjMtMC44LDAuNDFjMS41MzgtMC43NTMsNC44Ny0wLjU4NCw3LjAzNCwwLjQxN2MyLjUxMSwxLjE3Myw1LjMzLDQuNjQyLDUuNDQzLDcuOTA0bDAuMTI2LDAuMDM1Yy0wLjA2
|
||||||
<finalclass>OS Family</finalclass>
|
MywxLjI5OCwwLjE5OCwyLjc5OC0wLjI1Nyw0LjE3NUwzNS4yOTQsMjAuOTg2IE0yMC4wNzIsMjUuMzg5bC0wLjA4NiwwLjQzMWMwLjQwMywwLjU0NywwLjcyNCwxLjE0MiwxLjIzNywxLjU2N0MyMC44NTMsMjYuNjY0LDIwLjU3NywyNi4zNjQsMjAuMDcyLDI1LjM4OSBNMjEuMDIzLDI1LjM1M2MtMC4yMTMtMC4yMzctMC4zNC0wLjUxOC0wLjQ4LTAuODAyYzAuMTM1LDAuNDk1LDAuNDExLDAuOTIyLDAuNjY5LDEuMzU3TDIxLjAyMywyNS4zNTMgTTM3Ljg3NywyMS42OD
|
||||||
<friendlyname>Ubuntu</friendlyname>
|
hsLTAuMDg4LDAuMjI2Yy0wLjE2NiwxLjE3NC0wLjUyMywyLjMzMi0xLjA2OCwzLjQxMkMzNy4zMjQsMjQuMTg5LDM3LjcxNCwyMi45NDcsMzcuODc3LDIxLjY4OCBNMjQuNTYsNS4xODVDMjQuOTc0LDUuMDMxLDI1LjU3OSw1LjEwMSwyNi4wMTksNWMtMC41NzMsMC4wNDgtMS4xNDQsMC4wNzktMS43MDYsMC4xNTFMMjQuNTYsNS4xODUgTTEwLjAwNywxMi45MjNjMC4wOTUsMC44ODItMC42NjcsMS4yMjksMC4xNjcsMC42NDRDMTAuNjIzLDEyLjU2MiwxMCwxMy4yODYsMTAuMDA3LDEyLjkyMyBNOS4wMjgsMTcuMDE2YzAuMTkxLTAuNTkyLDAuMjI2LTAuOTQzLDAuMy0xLjI4NUM4Ljc5NywxNi40MSw5LjA4NCwxNi41NTMsOS4wMjgsMTcuMDE2Ii8+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
</OSFamily>
|
<finalclass>OS Family</finalclass>
|
||||||
<OSFamily alias="OSFamily" id="6">
|
<friendlyname>Debian</friendlyname>
|
||||||
<name>Ubuntu server</name>
|
</OSFamily>
|
||||||
<finalclass>OS Family</finalclass>
|
<OSFamily alias="OSFamily" id="3">
|
||||||
<friendlyname>Ubuntu server</friendlyname>
|
<name>Oracle Linux</name>
|
||||||
</OSFamily>
|
<logo><mimetype>image/svg+xml</mimetype><filename>icon-oracle-linux.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sbnM9Imh0dH
|
||||||
<OSFamily alias="OSFamily" id="7">
|
A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjMxIDIzMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQiIHZlcnNpb249IjEuMSIgaWQ9InN2ZzQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSIyMzEiIGhlaWdodD0iMjMxIiBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLW9yYWNsZS1saW51eC5zdmciIGlua3NjYXBlOnZlcnNpb249IjEuNC4zICgwZDE1Zjc1MDQyLCAy
|
||||||
<name>vCenter Server</name>
|
MDI1LTEyLTI1KSI+PHNvZGlwb2RpOm5hbWVkdmlldyBpZD0ibmFtZWR2aWV3MSIgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYm9yZGVyb3BhY2l0eT0iMC4yNSIgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9IjAiIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIgc2hvd2d1aWRlcz0idHJ1ZSIgaW5rc2NhcGU6em9vbT0iNy41MzMyOD
|
||||||
<finalclass>OS Family</finalclass>
|
kxIiBpbmtzY2FwZTpjeD0iMTA3LjA1ODE1IiBpbmtzY2FwZTpjeT0iOTAuNzk2OTkzIiBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjI1NjAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNjAiIGlua3NjYXBlOndpbmRvdy14PSIwIiBpbmtzY2FwZTp3aW5kb3cteT0iMCIgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCI+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSI0MS43NjM1ODksMTE1LjQ2OCIgb3JpZW50
|
||||||
<friendlyname>vCenter Server</friendlyname>
|
YXRpb249IjAsLTEiIGlkPSJndWlkZTEiIGlua3NjYXBlOmxvY2tlZD0iZmFsc2UiLz48L3NvZGlwb2RpOm5hbWVkdmlldz48ZGVmcyBpZD0iZGVmczgiPjxyZWN0IHg9Ii0xMzguMjQ2NDEiIHk9IjgxLjU2NzIzOCIgd2lkdGg9IjM4Mi4zNjc0IiBoZWlnaHQ9IjI0MC4yMTE1NiIgaWQ9InJlY3Q0OTUiLz48cmVjdCB4PSItMTcuNjEyNjIzIiB5PSIxMDQuMzU4OTgiIHdpZHRoPSIxNzEuMDUyMzgiIGhlaWdodD0iMTk3LjMxNDQ0IiBpZD0icmVjdDI5MSIvPjwvZGVmcz
|
||||||
</OSFamily>
|
48ZyBpZD0iZzE0MDciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuNjEzMjE1NDIsNzYuODM1NTMzKSI+PHBhdGggZD0ibSA5OS41OSwxOS41MiBoIDE1LjI0IEwgMTA2Ljc4LDYuNTIgOTEuOTgsMzAgaCAtNi43MyBsIDE4LC0yOC4xNyBhIDQuMjksNC4yOSAwIDAgMSA3LC0wLjA1IEwgMTI4LjMsMzAgaCAtNi43MyBsIC0zLjE3LC01LjI1IGggLTE1LjQyIGwgLTMuMzYsLTUuMjMgbSA2OS45Myw1LjIzIFYgMC4yOCBoIC01LjcyIHYgMjYuODggYSAyLjc2LDIuNzYgMCAw
|
||||||
<OSFamily alias="OSFamily" id="8">
|
IDAgMC44NSwyIDIuODksMi44OSAwIDAgMCAyLjA4LDAuODcgaCAyNiBsIDMuMzksLTUuMjUgaCAtMjYuNjMgbSAtOTQuNTQsLTQuNCBhIDEwLjA1LDEwLjA1IDAgMCAwIDAsLTIwLjEgaCAtMjUgViAzMCBoIDUuNzEgViA1LjU0IGggMTguOTQgYSA0LjgxLDQuODEgMCAwIDEgMCw5LjYyIEggNTguNTIgTCA3NS41OCwzMCBoIDguMjkgTCA3Mi40MSwyMC4zOCBoIDIuNTcgTSAxNC44NiwzMCBoIDE3LjI3IGEgMTQuODYsMTQuODYgMCAwIDAgMCwtMjkuNzEgSCAxNC44Ni
|
||||||
<name>Windows</name>
|
BhIDE0Ljg2LDE0Ljg2IDAgMSAwIDAsMjkuNzEgbSAxNi44OCwtNS4yMyBoIC0xNi41IGEgOS42Miw5LjYyIDAgMCAxIDAsLTE5LjIzIGggMTYuNSBhIDkuNjIsOS42MiAwIDEgMSAwLDE5LjIzIE0gMTQwLjIzLDMwIGggMTcuNjMgbCAzLjM0LC01LjIzIGggLTIwLjU4IGEgOS42Miw5LjYyIDAgMSAxIDAsLTE5LjIzIGggMTYuNzUgbCAzLjM4LC01LjI1IGggLTIwLjUyIGEgMTQuODYsMTQuODYgMCAxIDAgMCwyOS43MSBtIDY5Ljg3LC01LjIzIGEgOS42Miw5LjYyIDAg
|
||||||
<finalclass>OS Family</finalclass>
|
MCAxIC05LjI2LC03IGggMjQuNDIgbCAzLjM2LC01LjI0IGggLTI3Ljc4IGEgOS42MSw5LjYxIDAgMCAxIDkuMjYsLTcgaCAxNi43NiBsIDMuMzUsLTUuMjUgaCAtMjAuNSBhIDE0Ljg2LDE0Ljg2IDAgMCAwIDAsMjkuNzEgaCAxNy42MyBsIDMuMzUsLTUuMjMgaCAtMjAuNiIgc3R5bGU9ImZpbGw6I2M3NDYzNCIgaWQ9InBhdGgyIi8+PHBhdGggaWQ9InJlY3Q3NDkiIHN0eWxlPSJmaWxsOiNjNzQ2MzQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjUuMjUxOTtzdH
|
||||||
<friendlyname>Windows</friendlyname>
|
Jva2UtbGluZWNhcDpzcXVhcmU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIgZD0ibSAyNS4zOTE1MTcsNDcuOTMwODcxIGggNC45ODA4NjMgdiAzLjgzMDAyNSBoIC00Ljk4MDg2MyB6IG0gNjEuNTAwOCwxOC41NTcwNjEgLTcuMjQsLTEwLjI0MDAwMiBoIDQuOTYgbCA0LjY0LDcuMDgwMDAyIGggMC4yNCBsIDQuNzYsLTcuMDgwMDAyIGggNC43MiBsIC03LjI4LDEwLjE2MDAwMiA3LjY0LDEwLjg4IGggLTQuOTYgbCAtNS4wOCwtNy43MiBoIC0wLjI0IGwg
|
||||||
</OSFamily>
|
LTUuMTIsNy43MiBoIC00LjcyIHogbSAtMjEuNTk5OTk4LDExLjI4IHEgLTYuNjgsMCAtNi42OCwtNy4yNCBWIDU2LjI0NzkzIGggNC4xMiB2IDEzLjc2MDAwMiBxIDAsMi4zNiAxLjA0LDMuMzIgMS4wOCwwLjkyIDMuMTIsMC45MiAxLjQsMCAyLjYsLTAuNjggMS4yLC0wLjcyIDEuODgsLTIgMC43MiwtMS4yOCAwLjcyLC0yLjk2IFYgNTYuMjQ3OTMgaCA0LjEyIHYgMjEuMDQwMDAyIGggLTMuMzIgbCAtMC40LC0yLjggaCAtMC4yOCBxIC0xLjE2LDEuNiAtMi45MiwyLj
|
||||||
<OSFamily alias="OSFamily" id="9">
|
Q0IC0xLjc2LDAuODQgLTQsMC44NCB6IE0gMzUuODEyMzIsNTYuMjQ3OTMgaCAzLjMyMDAwMSBsIDAuNCwyLjgwMDAwMiBoIDAuMjggcSAxLjEyLC0xLjYwMDAwMiAyLjg4LC0yLjQ0MDAwMiAxLjgsLTAuODQgNC4wNCwtMC44NCA2LjY4LDAgNi42OCw3LjI0MDAwMiB2IDE0LjI4IGggLTQuMTIgdiAtMTMuNzYgcSAwLC0yLjM2IC0xLjA4LC0zLjI4IC0xLjA0LC0wLjk2IC0zLjA4LC0wLjk2IC0xLjQsMCAtMi42LDAuNzIgLTEuMiwwLjY4IC0xLjkyLDEuOTYgLTAuNjgsMS4yOCAtMC42OCwyLjk2IHYgMTIuMzYgSCAzNS44MTIzMiBaIE0gMy42MTIzOSw0Ny45MzA4NzEgaCA0LjQ0IHYgMjUuNTE3MDYxIGggMTQuMjggdiAzLjg0IGggLTE4LjcyIHogTSAyNi4yNTY3NjgsNTkuNDYzOTUgViA3Ny4yODc5MzIgSCAzMC4zNzIzOCBWIDU2LjI3NTQ2NCBoIC02LjM4NzYxMiB2IDEuODI1NjgxIHoiLz48L2c+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
<name>Windows server</name>
|
<finalclass>OS Family</finalclass>
|
||||||
<finalclass>OS Family</finalclass>
|
<friendlyname>Oracle Linux</friendlyname>
|
||||||
<friendlyname>Windows server</friendlyname>
|
</OSFamily>
|
||||||
</OSFamily>
|
<OSFamily alias="OSFamily" id="4">
|
||||||
|
<name>Red Hat</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-red-hat.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMzNzQ3NEYiIGQ9Ik0yNy44MTMsMzQuODg4Yy0wLjMxOSwwLjM1My0wLjc1NSwwLjM3OC0xLjI4NCwwLjA3NWMtMC40OTctMC4yODItMS4yN
|
||||||
|
zYtMC4yODItMS41MS0wLjAwMSBjLTAuMjY5LDAuMzIzLTAuMDc1LDAuNjgxLDAuMzY3LDAuNjgxYzAuMjA3LDAsMC42MDQsMC4xMzcsMC44NzQsMC4zMDNjMC4yNzEsMC4xNjcsMC42NTMsMC4zMDMsMC44NDcsMC4zMDMgYzAuNDc1LDAuMDAyLDEuMjM0LTAuNzgyLDEuMjM0LTEuMjczQzI4LjM0MiwzNC41MDYsMjguMTgyLDM0LjQ4LDI3LjgxMywzNC44ODh6IE00MywyNS45NzFjMCwzLjIyMS0wLjUzNSw1LjYwMi0xLjg4Nyw4LjM4NiBjLTAuOTgsMi4wMjItMC44NDY
|
||||||
|
sMS45Mi0yLjI3MiwxLjc0Yy0xLjI5My0wLjE2My0yLjk4OS0wLjAyNi00LjA3NSwwLjMzMWMtMC40ODQsMC4xNi0wLjYxNywwLjI4My0wLjY4MSwwLjY0MyBjLTAuMDY1LDAuMzc5LTAuMjA2LDAuNDkzLTAuOTc5LDAuNzkzYy0wLjY1MiwwLjI1My0wLjk3NywxLjAzMy0xLjY4NiwxLjcyOGMtMC41NDMsMC41My0xLjEyMSwxLjAzLTEuMjg4LDEuMTEzIEMyOS43NDIsNDAuODk0LDI5LDQxLjA2OSwyOSw0MC45NzRjMC0wLjA3MSwwLjk4Ni0yLjI1MSwyLjM1Ny00LjIxO
|
||||||
|
GMwLjQ5LTAuNzA0LDAuNjYxLTEuMTA0LDAuNzA5LTEuNjYxIGMwLjAzNi0wLjQwNSwwLjIxMS0xLjIyOSwwLjM4OS0xLjgzYzAuMTc5LTAuNjAzLDAuMjg5LTEuMTMsMC4yNDYtMS4xNzNzLTAuMzcsMC4wMjUtMC43MjYsMC4xNDggYy0wLjc3OSwwLjI3NS0xLjI5MywwLjI4Ni0yLjE3NywwLjA1MWMtMC41NjMtMC4xNTEtMC43NzEtMC4xMzktMS4zNDQsMC4wOGMtMC42MzksMC4yNDYtMC43MTksMC4yNDYtMS4zMTMsMC4wMDYgYy0wLjU5NS0wLjIzNy0wLjcyNS0wLjI
|
||||||
|
zNy0yLjE0NiwwLjAxNGMtMi42NTUsMC40NjYtMy41MTMsMC4yMDYtNS4yODQtMS42MDljLTEuMDk4LTEuMTI1LTEuNTA4LTEuMzcyLTEuNzE3LTEuMDMgYy0wLjA1MSwwLjA4My0wLjI1MywwLjE1MS0wLjQ0NiwwLjE1MWMtMC4yNTgsMC0wLjQ4NC0wLjIwMy0wLjg0MS0wLjc2Yy0wLjI2Ny0wLjQxNS0wLjY3Ny0wLjg5My0wLjkwOS0xLjA1OCBjLTEuMjc0LTAuOTA2LTIuNzE1LTAuMjUtMi43MTUsMS4yNGMwLDAuNjE0LDEuMjI4LDIuNDY1LDEuODQ3LDIuNzg2YzAuO
|
||||||
|
DE4LDAuNDIzLDAuMzU3LDEuMDU3LTAuNjcxLDAuOTE5IGMtMC41MzItMC4wNzItMC43NjctMC4yMzEtMS40ODItMS4wMDNjLTAuNzY0LTAuODI2LTAuOTA3LTAuOTE2LTEuNDQzLTAuOTE0Yy0wLjMyOCwwLjAwMi0wLjg3NSwwLjEzMS0xLjIxNSwwLjI4NCBjLTAuODc3LDAuMzk5LTIuMDIyLDAuNjItMy4yMjEsMC42Mkg1Ljg2NUw1LjYzLDMxLjE0NkM1LjA5MywyOS4xNzEsNSwyOC40LDUsMjUuOTcxYzAtMS44NTcsMC4wNzEtMi44MjEsMC4yNzktMy43NzkgYzEuMTI
|
||||||
|
0LTUuMTcyLDMuOTg0LTkuMzUzLDguMzIzLTEyLjE2OWMyLjEyOC0xLjM4Miw0LjA4NC0yLjE5Miw2LjU3OS0yLjcyOWMxLjc4My0wLjM4Myw1Ljc3Ni0wLjM5NCw3LjUxLTAuMDIxIGM1LjkwMiwxLjI3MywxMC43OTQsNC45OTYsMTMuMzM5LDEwLjE2QzQyLjQ1NywyMC4zMjUsNDMsMjIuNjc3LDQzLDI1Ljk3MXoiLz48cGF0aCBmaWxsPSIjRkYzRDAwIiBkPSJNMzguMDgyLDIyLjMxMmMtMC43MTEtMC41MzktMi41MjktMS4zMjctMy4wNjMtMS4zMjdjLTAuMTQ2LDAtM
|
||||||
|
C40LDAuMjczLTAuNTk4LDAuNjQzIGMtMC4yOTcsMC41NTktMS4xMzEsMS4zMjItMS40NDQsMS4zMjJjLTAuMDU4LDAsMC4xMDEtMC4zODQsMC4zNS0wLjg1MmMwLjExLTAuMjA1LDAuMjA0LTAuNDIzLDAuMjgtMC42MzEgYzAuMTA5LTAuMzAzLDAuMTc4LTAuNTg0LDAuMTc4LTAuNzc2YzAtMC45NTgtMC42NzYtMy4xMTctMS40OTctNS4wNDljLTAuNDM1LTEuMDI0LTAuOTExLTEuOTg1LTEuMzUxLTIuNjY5IGMtMC4yMTUtMC4zMzUtMC4zOTMtMC41ODktMC41NTktMC4
|
||||||
|
3OTJjLTAuMjktMC4zNTEtMC41NTktMC41NTQtMC45NzUtMC43NzljLTAuMjgzLTAuMTUyLTAuNTgtMC4yNy0wLjg5MS0wLjM1NiBjLTAuMDA2LDAtMC4wMTItMC4wMDMtMC4wMTYtMC4wMDNjLTAuMDczLTAuMDIxLTAuMTQ1LTAuMDM5LTAuMjE5LTAuMDU1Yy0wLjAxMi0wLjAwMy0wLjAyMy0wLjAwNS0wLjAzNS0wLjAwOSBjLTAuMDctMC4wMTQtMC4xMzktMC4wMjYtMC4yMTItMC4wMzljLTAuMDE1LTAuMDAzLTAuMDI4LTAuMDAzLTAuMDQ0LTAuMDA2Yy0wLjA3Mi0wL
|
||||||
|
jAxMi0wLjE0Mi0wLjAyMS0wLjIxNS0wLjAzIGMtMC4wMTItMC4wMDEtMC4wMjUtMC4wMDEtMC4wMzctMC4wMDNjLTAuMTYtMC4wMTYtMC4zMjUtMC4wMjctMC40OTUtMC4wMjdjLTAuMDE3LDAtMC4wMzYsMC0wLjA1MywwIGMtMC4xMiwwLTAuMjM5LDAuMDA2LTAuMzYyLDAuMDE0Yy0wLjAzOSwwLjAwMS0wLjA3NiwwLjAwNC0wLjExNCwwLjAwNWMtMC4xMzIsMC4wMTEtMC4yNjcsMC4wMjQtMC40MDIsMC4wNDIgYy0wLjA0OCwwLjAwNi0wLjA5NSwwLjAxMy0wLjE0NCw
|
||||||
|
wLjAxOWMtMC4xMzQsMC4wMTktMC4yNywwLjA0MS0wLjQwOCwwLjA2OGMtMC4wNTUsMC4wMS0wLjExMiwwLjAyNC0wLjE3LDAuMDM2IGMtMC4xMDYsMC4wMjItMC4yMTgsMC4wNDgtMC4zMjksMC4wNzVjLTAuMDQzLDAuMDEtMC4wODMsMC4wMTctMC4xMjYsMC4wMjdjLTEuMDYzLDAuMjcyLTEuNTU4LDAuMzE5LTIuNTY2LDAuMjQ1IGMtNC4xMTctMC4yOTctMy45NTEtMC4zLTQuNjMsMC4wNDdjLTAuMzY4LDAuMTg4LTAuNjI4LDAuMzktMC44NDgsMC43M2MtMC4yOTgsM
|
||||||
|
C40NjItMC41MiwxLjE3Mi0wLjgyOSwyLjQ1MSBjLTAuNTgyLDIuNDAzLTAuNTk1LDMuMTQ2LTAuMDY4LDMuNzczYzAuNTM2LDAuNjM5LDIuMjY1LDEuNDMxLDMuOTksMS44MjdjMi4wNjMsMC40NzQsMy40NjksMC44OTIsMy44NTksMS4xNDkgYzAuMDk3LDAuMDYzLDAuMjA1LDAuMTc4LDAuMzAxLDAuMzEzYzAuMDkxLDAuMTI1LDAuMTcsMC4yNjYsMC4yMTgsMC4zOTRjMC40MzQsMS4xNTcsMC42NjcsMS42MjcsMC45MzEsMS44NjQgYzAuMDY1LDAuMDYsMC4xMjUsMC4
|
||||||
|
xMzEsMC4xNzQsMC4xOTdjMC4wNjYsMC4wOTIsMC4xMDcsMC4xODMsMC4xMDcsMC4yMzljMCwxLjA5Ny03LjgwMy0xLjMzMy05LjgxNC0zLjA1NCBjLTAuNTM4LTAuNDYyLTAuODM3LTAuODQ2LTAuOTY1LTEuMjg4Yy0wLjA3Ny0wLjI3NC0wLjA4Ny0wLjU3MS0wLjA0Ni0wLjkyMmwwLjAyNC0wLjIxMWwwLjA2My0wLjUzNGgtMC4wMDF2LTAuMDAybC0xLjk5OCwwLjA2NiBjLTEuNjg4LDAuMDU2LTIuMTA5LDAuMTE4LTIuNzE1LDAuNDEyYy0yLjA4NiwxLjAwNS0xLjk4N
|
||||||
|
SwyLjY5LDAuMjg4LDQuODVjMS42MzQsMS41NTQsNC4xMTMsMy4wODUsNi44NTMsNC4zMzQgYzIuODI4LDEuMjkzLDUuOTM2LDIuMjgzLDguNjgxLDIuNjg2YzEuMTg4LDAuMTc1LDIuNzEyLDAuMjM3LDQuMTEzLDAuMTkzYzAuNzkxLTAuMDI0LDEuNTQzLTAuMDg0LDIuMTctMC4xOCBjMy4zNjUtMC41MTMsNS42OTUtMS44ODYsNi42NjgtMy45MzRjMC4xMDUtMC4yMjIsMC4xODktMC40MzgsMC4yNTgtMC42NTJDMzkuODE4LDI0LjY1NCwzOS4zNzcsMjMuMjk3LDM4LjA
|
||||||
|
4MiwyMi4zMTJ6IE0yMi4xMjIsMTYuMDE1Yy0xLjQzOCwwLjE1OS0yLjE0MSwwLjM1NS0yLjQwMywwLjY3MWMtMC4xMDEsMC4xMjEtMC4yMDQsMC4xODgtMC4zMjcsMC4xOTdjLTAuMjQ5LDAuMDE3LTAuNTctMC4yMTUtMS4wODktMC43NDIgYy0wLjM2MS0wLjM3MS0wLjU2Ny0wLjYzNy0wLjY2Ny0wLjg2N2MtMC4wNS0wLjExNS0wLjA3My0wLjIyNi0wLjA3My0wLjMzMmMwLTAuMDYxLDAuMDA0LTAuMTIsMC4wMS0wLjE3OCBjMC4wMDEtMC4wMDgsMC4wMDMtMC4wMTYsM
|
||||||
|
C4wMDMtMC4wMjNjMC4wMDctMC4wNDcsMC4wMTYtMC4wOTMsMC4wMjgtMC4xMzljMC4wMDEtMC4wMDksMC4wMDMtMC4wMTUsMC4wMDUtMC4wMjMgYzAuMDE0LTAuMDQ4LDAuMDI5LTAuMDk0LDAuMDQ5LTAuMTM3YzAuMDAzLTAuMDA3LDAuMDA1LTAuMDEzLDAuMDEtMC4wMTljMC4wMTctMC4wMzIsMC4wMzItMC4wNjMsMC4wNTEtMC4wOTMgYzAuMDA3LTAuMDEzLDAuMDE1LTAuMDI0LDAuMDIzLTAuMDM1YzAuMDE0LTAuMDI0LDAuMDMyLTAuMDQ2LDAuMDUtMC4wNjdjMC4
|
||||||
|
wMDctMC4wMDksMC4wMTUtMC4wMTcsMC4wMjMtMC4wMjcgYzAuMDI1LTAuMDI0LDAuMDUxLTAuMDQ3LDAuMDc3LTAuMDY1YzAuMDEyLTAuMDA3LDAuMDIzLTAuMDE1LDAuMDM2LTAuMDJjMC4wMTktMC4wMTQsMC4wMzgtMC4wMjEsMC4wNTgtMC4wMyBjMC4wMTItMC4wMDYsMC4wMjUtMC4wMTEsMC4wMzctMC4wMTVjMC4wMjktMC4wMDgsMC4wNTctMC4wMTYsMC4wODgtMC4wMTljMC4wMDMsMCwwLjAwNi0wLjAwMSwwLjAxLTAuMDAxIGMwLjAzMi0wLjAwMywwLjA2NC0wL
|
||||||
|
jAwMiwwLjA5NywwLjAwM2MwLjAwNywwLjAwMSwwLjAxNSwwLjAwMywwLjAyMywwLjAwNGMwLjAyNiwwLjAwNiwwLjA1MywwLjAxMiwwLjA3OSwwLjAyMSBjMC4wMDcsMC4wMDMsMC4wMTQsMC4wMDYsMC4wMjEsMC4wMDljMC4wMzEsMC4wMTQsMC4wNjIsMC4wMzEsMC4wOTEsMC4wNTFjMC4wMDIsMC4wMDIsMC4wMDQsMC4wMDMsMC4wMDcsMC4wMDYgYzAuMDM2LDAuMDIzLDAuMDcxLDAuMDUsMC4xMDQsMC4wODNjMC42NjgsMC42NTMsMC45LDAuNzE0LDIuMzk0LDAuNjE
|
||||||
|
1YzAuNTQ2LTAuMDM3LDEuMDEyLTAuMDM4LDEuMzk0LTAuMDA3IGMwLjcwOSwwLjA2LDEuMTMxLDAuMjMsMS4yNCwwLjUxNWMwLjAzOCwwLjA5OSwwLjA1LDAuMTgsMC4wMjUsMC4yNUMyMy41MjIsMTUuODA5LDIzLjEyMiwxNS45MDQsMjIuMTIyLDE2LjAxNXogTTI5LjAwMSwxMy4zOCBjLTAuMDEsMC4wMDctMC4wMTksMC4wMTMtMC4wMzEsMC4wMTljMCwwLjAwMS0wLjAwMywwLjAwMy0wLjAwNiwwLjAwNGMtMC41MTEsMC4yNjktMS4zMjUsMC40MjktMi4xNzEsMC4zN
|
||||||
|
TggYy0wLjM0NC0wLjAyNy0wLjUyNi0wLjA4Ny0wLjU0My0wLjE2NGMtMC4wMTItMC4wNTIsMC4wNTUtMC4xMTEsMC4xOTctMC4xNzFjMC4wNy0wLjAzLDAuMTUzLTAuMDYxLDAuMjU2LTAuMDg5IGMwLjU4NC0wLjE2OSwwLjkxLTAuNjA4LDAuNTk0LTAuODA1Yy0wLjMzNy0wLjIxMi0xLjQ5Mi0wLjM0NS0yLjAwNC0wLjIzMWMtMC4yMTcsMC4wNDktMC4zNDIsMC4wNTEtMC4zNzQsMC4wMTMgYy0wLjAwMS0wLjAwMS0wLjAwNC0wLjAwMy0wLjAwNS0wLjAwNmMtMC4wMDk
|
||||||
|
tMC4wMTUtMC4wMDQtMC4wMzUsMC4wMTEtMC4wNjJjMC4wMTItMC4wMTYsMC4wMjYtMC4wMzEsMC4wNDctMC4wNDggYzAsMCwwLjAwMSwwLDAuMDAyLDBjMC4wMTktMC4wMTgsMC4wNDUtMC4wMzIsMC4wNzItMC4wNDZjMC4wMDItMC4wMDMsMC4wMDYtMC4wMDMsMC4wMS0wLjAwNmMwLjAyNy0wLjAxNCwwLjA1Ny0wLjAyNywwLjA5Mi0wLjA0MSBjMC4wMDUtMC4wMDIsMC4wMDgtMC4wMDMsMC4wMTEtMC4wMDVjMC4wMzctMC4wMTQsMC4wNzctMC4wMjgsMC4xMjEtMC4wN
|
||||||
|
DJjMC4wMDEsMCwwLjAwMy0wLjAwMiwwLjAwNS0wLjAwMiBjMC4yNzYtMC4wOSwwLjY4Mi0wLjE2NCwxLjEtMC4yMTNjMC4wMDgtMC4wMDMsMC4wMTQtMC4wMDMsMC4wMjEtMC4wMDNjMC4wNjEtMC4wMDksMC4xMjMtMC4wMTQsMC4xODYtMC4wMiBjMC4wMDktMC4wMDIsMC4wMTktMC4wMDIsMC4wMjctMC4wMDNjMC4wNjEtMC4wMDQsMC4xMTktMC4wMDksMC4xOC0wLjAxM2MwLjAwOSwwLDAuMDE5LTAuMDAyLDAuMDI3LTAuMDAyIGMwLjA2NS0wLjAwMywwLjEzMS0wLjAwNywwLjE5My0wLjAwOWMwLjAwNCwwLDAuMDA2LDAsMC4wMDYsMGMwLjIwNi0wLjAwOCwwLjQtMC4wMDIsMC41NzEsMC4wMTIgYzAuOTQ4LDAuMDg2LDEuNzE2LDAuNDIxLDEuODY4LDAuODEzYzAuMDE1LDAuMDQsMC4wMjQsMC4wOCwwLjAyNywwLjEyM0MyOS41MSwxMi45NzksMjkuMzIsMTMuMjAxLDI5LjAwMSwxMy4zOHoiLz48L3N2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>OS Family</finalclass>
|
||||||
|
<friendlyname>Red Hat</friendlyname>
|
||||||
|
</OSFamily>
|
||||||
|
<OSFamily alias="OSFamily" id="5">
|
||||||
|
<name>Ubuntu</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-ubuntu.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik00MCwyNGMwLDguOC03LjIsMTYtMTYsMTZTOCwzMi44LDgsMjRTMTUuMiw4LDI0LDhTNDAsMTUuMiw0MCwyNHoiLz48cGF0aC
|
||||||
|
BmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMjRjMCAzLjMtMi43IDYtNiA2LTMuMyAwLTYtMi43LTYtNnMyLjctNiA2LTZDMjcuMyAxOCAzMCAyMC43IDMwIDI0ek0xMiAyMS41YzEuNCAwIDIuNSAxLjEgMi41IDIuNXMtMS4xIDIuNS0yLjUgMi41UzkuNSAyNS40IDkuNSAyNCAxMC42IDIxLjUgMTIgMjEuNU0xMiAyMC41Yy0xLjkgMC0zLjUgMS42LTMuNSAzLjVzMS42IDMuNSAzLjUgMy41IDMuNS0xLjYgMy41LTMuNVMxMy45IDIwLjUgMTIgMjAuNXpNMzAgMzEuNWMxLjQg
|
||||||
|
MCAyLjUgMS4xIDIuNSAyLjVzLTEuMSAyLjUtMi41IDIuNS0yLjUtMS4xLTIuNS0yLjVTMjguNiAzMS41IDMwIDMxLjVNMzAgMzAuNWMtMS45IDAtMy41IDEuNi0zLjUgMy41czEuNiAzLjUgMy41IDMuNSAzLjUtMS42IDMuNS0zLjVTMzEuOSAzMC41IDMwIDMwLjV6Ii8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTI0LDRDMTMsNCw0LDEzLDQsMjRzOSwyMCwyMCwyMHMyMC05LDIwLTIwUzM1LDQsMjQsNHogTTMyLjUsMzRjMCwxLjQtMS4xLDIuNS0yLjUsMi41IHMtMi
|
||||||
|
41LTEuMS0yLjUtMi41YzAtMC4yLDAtMC41LDAuMS0wLjdDMjYuNSwzMy44LDI1LjMsMzQsMjQsMzRjLTUuMSwwLTkuMi0zLjgtOS45LTguN2MtMC40LDAuNy0xLjIsMS4yLTIuMSwxLjIgYy0xLjQsMC0yLjUtMS4xLTIuNS0yLjVzMS4xLTIuNSwyLjUtMi41YzAuOSwwLDEuNywwLjUsMi4xLDEuMmMwLjctNC45LDQuOC04LjcsOS45LTguN2MxLjMsMCwyLjUsMC4yLDMuNiwwLjcgYy0wLjEtMC4yLTAuMS0wLjQtMC4xLTAuN2MwLTEuNCwxLjEtMi41LDIuNS0yLjVzMi41
|
||||||
|
LDEuMSwyLjUsMi41YzAsMS4yLTAuOCwyLjItMiwyLjRDMzIuNywxOC4zLDM0LDIxLDM0LDI0cy0xLjMsNS43LTMuNSw3LjYgQzMxLjcsMzEuOCwzMi41LDMyLjgsMzIuNSwzNHoiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMTEuNWMxLjQgMCAyLjUgMS4xIDIuNSAyLjUgMCAxLjQtMS4xIDIuNS0yLjUgMi41cy0yLjUtMS4xLTIuNS0yLjVDMjcuNSAxMi42IDI4LjYgMTEuNSAzMCAxMS41TTMwIDEwLjVjLTEuOSAwLTMuNSAxLjYtMy41IDMuNXMxLjYgMy41ID
|
||||||
|
MuNSAzLjUgMy41LTEuNiAzLjUtMy41UzMxLjkgMTAuNSAzMCAxMC41ek0yNCAyNGMtMi42LTQuMS01LjItOC4xLTcuOC0xMi4yIi8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTE5LjEgMTAuN0gyMS4xVjI1LjFIMTkuMXoiIHRyYW5zZm9ybT0icm90YXRlKC0zMi40NjcgMjAuMTI3IDE3LjkxMSkiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQgMjNIMzguNFYyNUgyNHoiLz48Zz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQsMjRjLTIuNyw0LTUuMyw4LTgsMTIiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMTIuOCAyOUgyNy4yMDAwMDAwMDAwMDAwMDNWMzFIMTIuOHoiIHRyYW5zZm9ybT0icm90YXRlKC01Ni4zMTIgMTkuOTk4IDMwLjAwNikiLz48L2c+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>OS Family</finalclass>
|
||||||
|
<friendlyname>Ubuntu</friendlyname>
|
||||||
|
</OSFamily>
|
||||||
|
<OSFamily alias="OSFamily" id="6">
|
||||||
|
<name>Ubuntu server</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-ubuntu.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik00MCwyNGMwLDguOC03LjIsMTYtMTYsMTZTOCwzMi44LDgsMjRTMTUuMiw4LDI0LDhTNDAsMTUuMiw0MCwyNHoiLz48cGF0aC
|
||||||
|
BmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMjRjMCAzLjMtMi43IDYtNiA2LTMuMyAwLTYtMi43LTYtNnMyLjctNiA2LTZDMjcuMyAxOCAzMCAyMC43IDMwIDI0ek0xMiAyMS41YzEuNCAwIDIuNSAxLjEgMi41IDIuNXMtMS4xIDIuNS0yLjUgMi41UzkuNSAyNS40IDkuNSAyNCAxMC42IDIxLjUgMTIgMjEuNU0xMiAyMC41Yy0xLjkgMC0zLjUgMS42LTMuNSAzLjVzMS42IDMuNSAzLjUgMy41IDMuNS0xLjYgMy41LTMuNVMxMy45IDIwLjUgMTIgMjAuNXpNMzAgMzEuNWMxLjQg
|
||||||
|
MCAyLjUgMS4xIDIuNSAyLjVzLTEuMSAyLjUtMi41IDIuNS0yLjUtMS4xLTIuNS0yLjVTMjguNiAzMS41IDMwIDMxLjVNMzAgMzAuNWMtMS45IDAtMy41IDEuNi0zLjUgMy41czEuNiAzLjUgMy41IDMuNSAzLjUtMS42IDMuNS0zLjVTMzEuOSAzMC41IDMwIDMwLjV6Ii8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTI0LDRDMTMsNCw0LDEzLDQsMjRzOSwyMCwyMCwyMHMyMC05LDIwLTIwUzM1LDQsMjQsNHogTTMyLjUsMzRjMCwxLjQtMS4xLDIuNS0yLjUsMi41IHMtMi
|
||||||
|
41LTEuMS0yLjUtMi41YzAtMC4yLDAtMC41LDAuMS0wLjdDMjYuNSwzMy44LDI1LjMsMzQsMjQsMzRjLTUuMSwwLTkuMi0zLjgtOS45LTguN2MtMC40LDAuNy0xLjIsMS4yLTIuMSwxLjIgYy0xLjQsMC0yLjUtMS4xLTIuNS0yLjVzMS4xLTIuNSwyLjUtMi41YzAuOSwwLDEuNywwLjUsMi4xLDEuMmMwLjctNC45LDQuOC04LjcsOS45LTguN2MxLjMsMCwyLjUsMC4yLDMuNiwwLjcgYy0wLjEtMC4yLTAuMS0wLjQtMC4xLTAuN2MwLTEuNCwxLjEtMi41LDIuNS0yLjVzMi41
|
||||||
|
LDEuMSwyLjUsMi41YzAsMS4yLTAuOCwyLjItMiwyLjRDMzIuNywxOC4zLDM0LDIxLDM0LDI0cy0xLjMsNS43LTMuNSw3LjYgQzMxLjcsMzEuOCwzMi41LDMyLjgsMzIuNSwzNHoiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMTEuNWMxLjQgMCAyLjUgMS4xIDIuNSAyLjUgMCAxLjQtMS4xIDIuNS0yLjUgMi41cy0yLjUtMS4xLTIuNS0yLjVDMjcuNSAxMi42IDI4LjYgMTEuNSAzMCAxMS41TTMwIDEwLjVjLTEuOSAwLTMuNSAxLjYtMy41IDMuNXMxLjYgMy41ID
|
||||||
|
MuNSAzLjUgMy41LTEuNiAzLjUtMy41UzMxLjkgMTAuNSAzMCAxMC41ek0yNCAyNGMtMi42LTQuMS01LjItOC4xLTcuOC0xMi4yIi8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTE5LjEgMTAuN0gyMS4xVjI1LjFIMTkuMXoiIHRyYW5zZm9ybT0icm90YXRlKC0zMi40NjcgMjAuMTI3IDE3LjkxMSkiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQgMjNIMzguNFYyNUgyNHoiLz48Zz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQsMjRjLTIuNyw0LTUuMyw4LTgsMTIiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMTIuOCAyOUgyNy4yMDAwMDAwMDAwMDAwMDNWMzFIMTIuOHoiIHRyYW5zZm9ybT0icm90YXRlKC01Ni4zMTIgMTkuOTk4IDMwLjAwNikiLz48L2c+PC9zdmc+Cg==</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>OS Family</finalclass>
|
||||||
|
<friendlyname>Ubuntu server</friendlyname>
|
||||||
|
</OSFamily>
|
||||||
|
<OSFamily alias="OSFamily" id="7">
|
||||||
|
<name>vCenter Server</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-vmware.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNTAgNTAiIHdpZHRoPSI1MHB4IiBoZWlnaHQ9IjUwcHgiPjxwYXRoIGQ9Ik0gNDIuNDE0MDYzIDE1IEMgMzguODI0MjE5IDE1IDM2LjU3NDIxOSAxNy41IDM2LjU3NDIxOSAxNy41IEMgMzUuMzc4OTA2IDE1Ljk0MTQwNiAzMy43MzA0NjkgMTUuMDAzOTA2IDMwLjk0MTQwNiAxNS4wMDM5MDYgQyAyNy45OTYwOTQgMTUuMDAzOTA2IDI2LjA0Mjk2OSAxNy41IDI2LjA0Mjk2OSAxNy41IEMgMjQuODQ3NjU2IDE1Ljk0MTQwNiAyMi42ODc1IDE1IDIxIDE1IEMgMTguMzkwNjI1IDE1IDE2LjMyMDMxMyAxNi4xNTIzNDQgMTUuMDU0Njg4IDE5LjA1ODU5NCBMIDEwLjgyMDMxMyAyOC4zMjAzMTMgTCA2LjAzMTI1IDE2LjU1ODU5NCBDIDUuNDI1NzgxIDE1LjIyNjU2MyAzLjkzMzU5NCAxNC42MjUgMi41NDI5NjkgMTUuMjQ2MDk0IEMgMS4xNDg0MzggMTUuODcxMDk0IDAuNjM2NzE5IDE3LjQyNTc4MSAxLjI2NTYyNSAxOC43NTc4MTMgTCA3LjExMzI4MSAzMS45NDUzMTMgQyA4LjAzMTI1IDMzLjk0OTIxOSA5LjAwMzkwNiAzNSAxMC44MjAzMTMgMzUgQyAxMi43NjU2MjUgMzUgMTMuNjA5Mzc1IDMzLjg1NTQ2OSAxNC41MzEyNSAzMS45NDUzMTMgQyAxNC41MzEyNSAzMS45NDUzMTMgMTguNTExNzE5IDIzLjA2MjUgMTkgMjIgQyAxOS40ODgyODEgMjAuOTM3NSAyMC4zMDA3ODEgMjAgMjEuNSAyMCBDIDIyLjg3NSAyMCAyNCAyMS4xMjUgMjQgMjIuNSBMIDI0IDMyLjM3NSBDIDI0IDMzLjgyMDMxMyAyNS4wODU5MzggMzUgMjYuNTIzNDM4IDM1IEMgMjcuOTU3MDMxIDM1IDI5IDMzLjgyMDMxMyAyOSAzMi4zNzUgTCAyOSAyMi41IEMgMjkgMjEuMTI1IDMwLjEyNSAyMCAzMS41IDIwIEMgMzIuODc1IDIwIDM0IDIxLjEyNSAzNCAyMi41IEwgMzQgMzIuNSBDIDM0IDMzLjg3NSAzNS4xMjUgMzUgMzYuNSAzNSBDIDM3Ljg3NSAzNSAzOSAzMy44NzUgMzkgMzIuNSBMIDM5IDIyLjUgQyAzOSAyMS4xMjUgNDAuMTI1IDIwIDQxLjUgMjAgQyA0Mi44NzUgMjAgNDQgMjEuMTI1IDQ0IDIyLjUgTCA0NCAzMi41IEMgNDQgMzMuODc1IDQ1LjEyNSAzNSA0Ni41IDM1IEMgNDcuODc1IDM1IDQ5IDMzLjg3NSA0OSAzMi41IEwgNDkgMjEuMzU1NDY5IEMgNDkgMTcuNjE3MTg4IDQ2LjAxMTcxOSAxNSA0Mi40MTQwNjMgMTUgWiIvPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>OS Family</finalclass>
|
||||||
|
<friendlyname>vCenter Server</friendlyname>
|
||||||
|
</OSFamily>
|
||||||
|
<OSFamily alias="OSFamily" id="8">
|
||||||
|
<name>Windows</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-windows.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik02LDZoMTd2MTdINlY2eiIvPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik0yNS4wNDIsMjIuOTU4VjZINDJ2MTYuOTU4SDI1LjA0MnoiLz48cGF0aCBmaWxsPSIjMTk3NmQyIiBkPSJNNiwyNWgxN3YxN0g2VjI1eiIvPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik0yNSw0MlYyNWgxN3YxN0gyNXoiLz48L3N2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>OS Family</finalclass>
|
||||||
|
<friendlyname>Windows</friendlyname>
|
||||||
|
</OSFamily>
|
||||||
|
<OSFamily alias="OSFamily" id="9">
|
||||||
|
<name>Windows server</name>
|
||||||
|
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-windows-server.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwMGIwZmYiIGQ9Ik0yMCAyNS4wMjZMNS4wMTEgMjUgNS4wMTIgMzcuNzQ0IDIwIDM5LjgxOHpNMjIgMjUuMDNMMjIgNDAuMDk1IDQyLjk5NSA0MyA0MyAyNS4wNjZ6TTIwIDguMjU2TDUgMTAuMzggNS4wMTQgMjMgMjAgMjN6TTIyIDcuOTczTDIyIDIzIDQyLjk5NSAyMyA0Mi45OTUgNXoiLz48L3N2Zz4K</data><downloads_count>0</downloads_count></logo>
|
||||||
|
<finalclass>OS Family</finalclass>
|
||||||
|
<friendlyname>Windows server</friendlyname>
|
||||||
|
</OSFamily>
|
||||||
</Set>
|
</Set>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -323,18 +323,38 @@
|
|||||||
<value id="production">
|
<value id="production">
|
||||||
<code>production</code>
|
<code>production</code>
|
||||||
<rank>30</rank>
|
<rank>30</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-active-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-active-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
<value id="implementation">
|
<value id="implementation">
|
||||||
<code>implementation</code>
|
<code>implementation</code>
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-inactive-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-inactive-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
<value id="stock">
|
<value id="stock">
|
||||||
<code>stock</code>
|
<code>stock</code>
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-neutral-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-neutral-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
<value id="obsolete">
|
<value id="obsolete">
|
||||||
<code>obsolete</code>
|
<code>obsolete</code>
|
||||||
<rank>40</rank>
|
<rank>40</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-frozen-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-frozen-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
</values>
|
</values>
|
||||||
<sql>status</sql>
|
<sql>status</sql>
|
||||||
@@ -4395,6 +4415,11 @@
|
|||||||
<extkey_attcode>osfamily_id</extkey_attcode>
|
<extkey_attcode>osfamily_id</extkey_attcode>
|
||||||
<target_attcode>name</target_attcode>
|
<target_attcode>name</target_attcode>
|
||||||
</field>
|
</field>
|
||||||
|
<field id="ospatches_list" xsi:type="AttributeLinkedSet">
|
||||||
|
<linked_class>OSPatch</linked_class>
|
||||||
|
<ext_key_to_me>osversion_id</ext_key_to_me>
|
||||||
|
<edit_mode>in_place</edit_mode>
|
||||||
|
</field>
|
||||||
</fields>
|
</fields>
|
||||||
<methods/>
|
<methods/>
|
||||||
<presentation>
|
<presentation>
|
||||||
@@ -4406,6 +4431,9 @@
|
|||||||
<item id="osfamily_id">
|
<item id="osfamily_id">
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
</item>
|
</item>
|
||||||
|
<item id="ospatches_list">
|
||||||
|
<rank>30</rank>
|
||||||
|
</item>
|
||||||
</items>
|
</items>
|
||||||
</details>
|
</details>
|
||||||
<search>
|
<search>
|
||||||
@@ -4441,6 +4469,9 @@
|
|||||||
<attribute id="name"/>
|
<attribute id="name"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</naming>
|
</naming>
|
||||||
|
<fields_semantic>
|
||||||
|
<image_attribute>logo</image_attribute>
|
||||||
|
</fields_semantic>
|
||||||
<style>
|
<style>
|
||||||
<icon/>
|
<icon/>
|
||||||
</style>
|
</style>
|
||||||
@@ -4450,7 +4481,20 @@
|
|||||||
</attributes>
|
</attributes>
|
||||||
</reconciliation>
|
</reconciliation>
|
||||||
</properties>
|
</properties>
|
||||||
<fields/>
|
<fields>
|
||||||
|
<field id="logo" xsi:type="AttributeImage">
|
||||||
|
<display_max_width>96</display_max_width>
|
||||||
|
<display_max_height>96</display_max_height>
|
||||||
|
<storage_max_width>128</storage_max_width>
|
||||||
|
<storage_max_height>128</storage_max_height>
|
||||||
|
<is_null_allowed>true</is_null_allowed>
|
||||||
|
</field>
|
||||||
|
<field id="osversions_list" xsi:type="AttributeLinkedSet">
|
||||||
|
<linked_class>OSVersion</linked_class>
|
||||||
|
<ext_key_to_me>osfamily_id</ext_key_to_me>
|
||||||
|
<edit_mode>in_place</edit_mode>
|
||||||
|
</field>
|
||||||
|
</fields>
|
||||||
<methods/>
|
<methods/>
|
||||||
<presentation>
|
<presentation>
|
||||||
<details>
|
<details>
|
||||||
@@ -4458,6 +4502,12 @@
|
|||||||
<item id="name">
|
<item id="name">
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
</item>
|
</item>
|
||||||
|
<item id="logo">
|
||||||
|
<rank>20</rank>
|
||||||
|
</item>
|
||||||
|
<item id="osversions_list">
|
||||||
|
<rank>30</rank>
|
||||||
|
</item>
|
||||||
</items>
|
</items>
|
||||||
</details>
|
</details>
|
||||||
<search>
|
<search>
|
||||||
@@ -4472,6 +4522,9 @@
|
|||||||
<item id="name">
|
<item id="name">
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
</item>
|
</item>
|
||||||
|
<item id="logo">
|
||||||
|
<rank>20</rank>
|
||||||
|
</item>
|
||||||
</items>
|
</items>
|
||||||
</list>
|
</list>
|
||||||
</presentation>
|
</presentation>
|
||||||
@@ -4526,6 +4579,16 @@
|
|||||||
<count_max>0</count_max>
|
<count_max>0</count_max>
|
||||||
<duplicates/>
|
<duplicates/>
|
||||||
</field>
|
</field>
|
||||||
|
<field id="models_list" xsi:type="AttributeLinkedSet">
|
||||||
|
<linked_class>Model</linked_class>
|
||||||
|
<ext_key_to_me>brand_id</ext_key_to_me>
|
||||||
|
<edit_mode>in_place</edit_mode>
|
||||||
|
</field>
|
||||||
|
<field id="iosversions_list" xsi:type="AttributeLinkedSet">
|
||||||
|
<linked_class>IOSVersion</linked_class>
|
||||||
|
<ext_key_to_me>brand_id</ext_key_to_me>
|
||||||
|
<edit_mode>in_place</edit_mode>
|
||||||
|
</field>
|
||||||
</fields>
|
</fields>
|
||||||
<methods/>
|
<methods/>
|
||||||
<presentation>
|
<presentation>
|
||||||
@@ -4537,9 +4600,15 @@
|
|||||||
<item id="logo">
|
<item id="logo">
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
</item>
|
</item>
|
||||||
<item id="physicaldevices_list">
|
<item id="models_list">
|
||||||
<rank>30</rank>
|
<rank>30</rank>
|
||||||
</item>
|
</item>
|
||||||
|
<item id="physicaldevices_list">
|
||||||
|
<rank>40</rank>
|
||||||
|
</item>
|
||||||
|
<item id="iosversions_list">
|
||||||
|
<rank>50</rank>
|
||||||
|
</item>
|
||||||
</items>
|
</items>
|
||||||
</details>
|
</details>
|
||||||
<search>
|
<search>
|
||||||
@@ -4554,6 +4623,9 @@
|
|||||||
<item id="name">
|
<item id="name">
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
</item>
|
</item>
|
||||||
|
<item id="logo">
|
||||||
|
<rank>20</rank>
|
||||||
|
</item>
|
||||||
</items>
|
</items>
|
||||||
</list>
|
</list>
|
||||||
<summary>
|
<summary>
|
||||||
@@ -4854,6 +4926,11 @@
|
|||||||
<extkey_attcode>brand_id</extkey_attcode>
|
<extkey_attcode>brand_id</extkey_attcode>
|
||||||
<target_attcode>name</target_attcode>
|
<target_attcode>name</target_attcode>
|
||||||
</field>
|
</field>
|
||||||
|
<field id="networkdevices_list" xsi:type="AttributeLinkedSet">
|
||||||
|
<linked_class>NetworkDevice</linked_class>
|
||||||
|
<ext_key_to_me>iosversion_id</ext_key_to_me>
|
||||||
|
<edit_mode>add_only</edit_mode>
|
||||||
|
</field>
|
||||||
</fields>
|
</fields>
|
||||||
<methods/>
|
<methods/>
|
||||||
<presentation>
|
<presentation>
|
||||||
@@ -4865,6 +4942,9 @@
|
|||||||
<item id="brand_id">
|
<item id="brand_id">
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
</item>
|
</item>
|
||||||
|
<item id="networkdevices_list">
|
||||||
|
<rank>30</rank>
|
||||||
|
</item>
|
||||||
</items>
|
</items>
|
||||||
</details>
|
</details>
|
||||||
<search>
|
<search>
|
||||||
@@ -6897,14 +6977,29 @@
|
|||||||
<value id="production">
|
<value id="production">
|
||||||
<code>production</code>
|
<code>production</code>
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-active-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-active-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
<value id="implementation">
|
<value id="implementation">
|
||||||
<code>implementation</code>
|
<code>implementation</code>
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-inactive-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-inactive-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
<value id="obsolete">
|
<value id="obsolete">
|
||||||
<code>obsolete</code>
|
<code>obsolete</code>
|
||||||
<rank>30</rank>
|
<rank>30</rank>
|
||||||
|
<style>
|
||||||
|
<main_color>$ibo-lifecycle-frozen-state-primary-color</main_color>
|
||||||
|
<complementary_color>$ibo-lifecycle-frozen-state-secondary-color</complementary_color>
|
||||||
|
<decoration_classes/>
|
||||||
|
</style>
|
||||||
</value>
|
</value>
|
||||||
</values>
|
</values>
|
||||||
<sql>status</sql>
|
<sql>status</sql>
|
||||||
|
|||||||
@@ -1073,6 +1073,8 @@ Dict::Add('EN US', 'English', 'English', [
|
|||||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||||
'Class:OSVersion/Attribute:osfamily_name' => 'OS family name',
|
'Class:OSVersion/Attribute:osfamily_name' => 'OS family name',
|
||||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||||
|
'Class:OSVersion/Attribute:ospatches_list' => 'OS patches',
|
||||||
|
'Class:OSVersion/Attribute:ospatches_list+' => 'All the OS patches for this OS version',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1082,6 +1084,8 @@ Dict::Add('EN US', 'English', 'English', [
|
|||||||
Dict::Add('EN US', 'English', 'English', [
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
'Class:OSFamily' => 'OS Family',
|
'Class:OSFamily' => 'OS Family',
|
||||||
'Class:OSFamily+' => '',
|
'Class:OSFamily+' => '',
|
||||||
|
'Class:OSFamily/Attribute:osversions_list' => 'OS versions',
|
||||||
|
'Class:OSFamily/Attribute:osversions_list+' => 'All the OS versions for this OS family',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1091,8 +1095,12 @@ Dict::Add('EN US', 'English', 'English', [
|
|||||||
Dict::Add('EN US', 'English', 'English', [
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
'Class:Brand' => 'Brand',
|
'Class:Brand' => 'Brand',
|
||||||
'Class:Brand+' => '',
|
'Class:Brand+' => '',
|
||||||
|
'Class:Brand/Attribute:iosversions_list' => 'IOS versions',
|
||||||
|
'Class:Brand/Attribute:iosversions_list+' => 'All the IOS versions from this brand',
|
||||||
'Class:Brand/Attribute:logo' => 'Logo',
|
'Class:Brand/Attribute:logo' => 'Logo',
|
||||||
'Class:Brand/Attribute:logo+' => '',
|
'Class:Brand/Attribute:logo+' => '',
|
||||||
|
'Class:Brand/Attribute:models_list' => 'Models',
|
||||||
|
'Class:Brand/Attribute:models_list+' => 'All models for this brand',
|
||||||
'Class:Brand/Attribute:physicaldevices_list' => 'Physical devices',
|
'Class:Brand/Attribute:physicaldevices_list' => 'Physical devices',
|
||||||
'Class:Brand/Attribute:physicaldevices_list+' => 'All the physical devices corresponding to this brand',
|
'Class:Brand/Attribute:physicaldevices_list+' => 'All the physical devices corresponding to this brand',
|
||||||
'Class:Brand/UniquenessRule:name+' => 'The name must be unique',
|
'Class:Brand/UniquenessRule:name+' => 'The name must be unique',
|
||||||
@@ -1104,7 +1112,7 @@ Dict::Add('EN US', 'English', 'English', [
|
|||||||
//
|
//
|
||||||
|
|
||||||
Dict::Add('EN US', 'English', 'English', [
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
'Class:Model' => 'Model',
|
'Class:Model' => 'Device Model',
|
||||||
'Class:Model+' => '',
|
'Class:Model+' => '',
|
||||||
'Class:Model/ComplementaryName' => '%1$s - %2$s',
|
'Class:Model/ComplementaryName' => '%1$s - %2$s',
|
||||||
'Class:Model/Attribute:brand_id' => 'Brand',
|
'Class:Model/Attribute:brand_id' => 'Brand',
|
||||||
@@ -1179,6 +1187,8 @@ Dict::Add('EN US', 'English', 'English', [
|
|||||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||||
'Class:IOSVersion/Attribute:brand_name' => 'Brand name',
|
'Class:IOSVersion/Attribute:brand_name' => 'Brand name',
|
||||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||||
|
'Class:IOSVersion/Attribute:networkdevices_list' => 'Network devices',
|
||||||
|
'Class:IOSVersion/Attribute:networkdevices_list+' => 'All the network devices running this IOS version',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1203,6 +1203,8 @@ Dict::Add('FR FR', 'French', 'Français', [
|
|||||||
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
'Class:OSVersion/Attribute:osfamily_id+' => '',
|
||||||
'Class:OSVersion/Attribute:osfamily_name' => 'Nom Famille OS',
|
'Class:OSVersion/Attribute:osfamily_name' => 'Nom Famille OS',
|
||||||
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
'Class:OSVersion/Attribute:osfamily_name+' => '',
|
||||||
|
'Class:OSVersion/Attribute:ospatches_list' => 'Patchs OS',
|
||||||
|
'Class:OSVersion/Attribute:ospatches_list+' => 'Tous les patchs de cette version OS',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1212,6 +1214,8 @@ Dict::Add('FR FR', 'French', 'Français', [
|
|||||||
Dict::Add('FR FR', 'French', 'Français', [
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
'Class:OSFamily' => 'Famille OS',
|
'Class:OSFamily' => 'Famille OS',
|
||||||
'Class:OSFamily+' => '',
|
'Class:OSFamily+' => '',
|
||||||
|
'Class:OSFamily/Attribute:osversions_list' => 'Versions OS',
|
||||||
|
'Class:OSFamily/Attribute:osversions_list+' => 'Toutes les versions OS pour cette famille',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1221,8 +1225,12 @@ Dict::Add('FR FR', 'French', 'Français', [
|
|||||||
Dict::Add('FR FR', 'French', 'Français', [
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
'Class:Brand' => 'Marque',
|
'Class:Brand' => 'Marque',
|
||||||
'Class:Brand+' => '',
|
'Class:Brand+' => '',
|
||||||
|
'Class:Brand/Attribute:iosversions_list' => 'Versions IOS',
|
||||||
|
'Class:Brand/Attribute:iosversions_list+' => 'Toutes les versions IOS pour cette marque',
|
||||||
'Class:Brand/Attribute:logo' => 'Logo',
|
'Class:Brand/Attribute:logo' => 'Logo',
|
||||||
'Class:Brand/Attribute:logo+' => '',
|
'Class:Brand/Attribute:logo+' => '',
|
||||||
|
'Class:Brand/Attribute:models_list' => 'Modèles',
|
||||||
|
'Class:Brand/Attribute:models_list+' => 'Tous les modèles pour cette marque',
|
||||||
'Class:Brand/Attribute:physicaldevices_list' => 'Matériels',
|
'Class:Brand/Attribute:physicaldevices_list' => 'Matériels',
|
||||||
'Class:Brand/Attribute:physicaldevices_list+' => 'Tous les matériels correspondant à cette marque',
|
'Class:Brand/Attribute:physicaldevices_list+' => 'Tous les matériels correspondant à cette marque',
|
||||||
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Create:Button+' => 'Créer un %4$s',
|
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Create:Button+' => 'Créer un %4$s',
|
||||||
@@ -1240,7 +1248,7 @@ Dict::Add('FR FR', 'French', 'Français', [
|
|||||||
//
|
//
|
||||||
|
|
||||||
Dict::Add('FR FR', 'French', 'Français', [
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
'Class:Model' => 'Modèle',
|
'Class:Model' => 'Modèle de matériel',
|
||||||
'Class:Model+' => '',
|
'Class:Model+' => '',
|
||||||
'Class:Model/ComplementaryName' => '%1$s - %2$s',
|
'Class:Model/ComplementaryName' => '%1$s - %2$s',
|
||||||
'Class:Model/Attribute:brand_id' => 'Marque',
|
'Class:Model/Attribute:brand_id' => 'Marque',
|
||||||
@@ -1327,6 +1335,8 @@ Dict::Add('FR FR', 'French', 'Français', [
|
|||||||
'Class:IOSVersion/Attribute:brand_id+' => '',
|
'Class:IOSVersion/Attribute:brand_id+' => '',
|
||||||
'Class:IOSVersion/Attribute:brand_name' => 'Nom Marque',
|
'Class:IOSVersion/Attribute:brand_name' => 'Nom Marque',
|
||||||
'Class:IOSVersion/Attribute:brand_name+' => '',
|
'Class:IOSVersion/Attribute:brand_name+' => '',
|
||||||
|
'Class:IOSVersion/Attribute:networkdevices_list' => 'Equipements réseaux',
|
||||||
|
'Class:IOSVersion/Attribute:networkdevices_list+' => 'Tous les équipements réseaux utilisant cette version IOS',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ class ConfigEditorController extends Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct(MODULESROOT.static::MODULE_NAME.'/templates', static::MODULE_NAME);
|
parent::__construct(MODULESROOT.static::MODULE_NAME.'/templates', static::MODULE_NAME);
|
||||||
|
$this->SetDebugAllowed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function OperationEdit(): void
|
public function OperationEdit(): void
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Set>
|
||||||
|
<ContainerImageType alias="ContainerImageType" id="1">
|
||||||
|
<name>Docker Hardened Image</name>
|
||||||
|
</ContainerImageType>
|
||||||
|
<ContainerImageType alias="ContainerImageType" id="2">
|
||||||
|
<name>Docker Official Image</name>
|
||||||
|
</ContainerImageType>
|
||||||
|
<ContainerImageType alias="ContainerImageType" id="3">
|
||||||
|
<name>Verified Publisher</name>
|
||||||
|
</ContainerImageType>
|
||||||
|
</Set>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Set>
|
||||||
|
<ContainerType alias="ContainerType" id="1">
|
||||||
|
<name>AWS - Elastic Container Service</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="2">
|
||||||
|
<name>AWS - Elastic Kubernetes Service</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="3">
|
||||||
|
<name>Azure Kubernetes Service</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="4">
|
||||||
|
<name>Docker Swarm</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="5">
|
||||||
|
<name>Google Kubernetes Engine</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="6">
|
||||||
|
<name>Kubernetes</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="7">
|
||||||
|
<name>Nomad</name>
|
||||||
|
</ContainerType>
|
||||||
|
<ContainerType alias="ContainerType" id="8">
|
||||||
|
<name>OpenShift</name>
|
||||||
|
</ContainerType>
|
||||||
|
</Set>
|
||||||
1280
datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
Normal file
1280
datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,156 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Localized data
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2013 XXXXX
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fieldsets for Container classes
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Container:baseinfo' => 'General',
|
||||||
|
'Container:moreinfo' => 'Container specifics',
|
||||||
|
'Container:otherinfo' => 'Dates and description',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Image
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerImage/Name' => '%1$s %2$s',
|
||||||
|
'Class:ContainerImage/ComplementaryName' => '%1$s - %2$s',
|
||||||
|
'Class:ContainerImage' => 'Container Image',
|
||||||
|
'Class:ContainerImage+' => 'The image of a software ready to be launched as a container',
|
||||||
|
'Class:ContainerImage/Attribute:name' => 'Name',
|
||||||
|
'Class:ContainerImage/Attribute:name+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:version' => 'Version',
|
||||||
|
'Class:ContainerImage/Attribute:version+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:description' => 'Description',
|
||||||
|
'Class:ContainerImage/Attribute:description+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:publisher' => 'Publisher',
|
||||||
|
'Class:ContainerImage/Attribute:publisher+' => 'Publisher of the image. Eg. php, nginx, ...',
|
||||||
|
'Class:ContainerImage/Attribute:image' => 'Image',
|
||||||
|
'Class:ContainerImage/Attribute:image+' => 'Detailed information to retrieve the image on the appropriate hosting platform',
|
||||||
|
'Class:ContainerImage/Attribute:type_id' => 'Type',
|
||||||
|
'Class:ContainerImage/Attribute:type_id+' => 'Type d\image',
|
||||||
|
'Class:ContainerImage/Attribute:software_id' => 'Software',
|
||||||
|
'Class:ContainerImage/Attribute:software_id+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:containerapplications_list' => 'Containerized Applications',
|
||||||
|
'Class:ContainerImage/Attribute:containerapplications_list+' => 'Applications to which this image contributes',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Application
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerApplication/Name' => '%1$s',
|
||||||
|
'Class:ContainerApplication/ComplementaryName' => '%1$s',
|
||||||
|
'Class:ContainerApplication' => 'Containerized Application',
|
||||||
|
'Class:ContainerApplication+' => 'An application deployed on a Container Platform',
|
||||||
|
'Class:ContainerApplication/Attribute:descriptor' => 'Deployment file',
|
||||||
|
'Class:ContainerApplication/Attribute:descriptor+' => 'File describing how to deploy the application on the container platform (e.g., Docker Compose, Helm Chart, etc.)',
|
||||||
|
'Class:ContainerApplication/Attribute:containervirtualhost_id' => 'Container Host',
|
||||||
|
'Class:ContainerApplication/Attribute:containervirtualhost_id+' => 'Container Platform on which the application is running',
|
||||||
|
'Class:ContainerApplication/Attribute:containertype_id' => 'Container type',
|
||||||
|
'Class:ContainerApplication/Attribute:containertype_id+' => 'Technology used for containerization',
|
||||||
|
'Class:ContainerApplication/Attribute:containerimages_list' => 'Container images',
|
||||||
|
'Class:ContainerApplication/Attribute:containerimages_list+' => 'Software images used to build the containerized application',
|
||||||
|
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class: lnkContainerApplicationToImage
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:lnkContainerApplicationToImage' => 'Link Container Application / Image',
|
||||||
|
'Class:lnkContainerApplicationToImage+' => '',
|
||||||
|
'Class:lnkContainerApplicationToImage/Name' => '%1$s / %2$s',
|
||||||
|
'Class:lnkContainerApplicationToImage/Name+' => '',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id' => 'Containerized Application',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id+' => 'Application which uses this image',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id' => 'Container Image',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id+' => 'Software image used to build the containerized application',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Virtual Host
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerVirtualHost/Name' => '%1$s',
|
||||||
|
'Class:ContainerVirtualHost/ComplementaryName' => '',
|
||||||
|
'Class:ContainerVirtualHost' => 'Container Platform',
|
||||||
|
'Class:ContainerVirtualHost+' => 'Platform on which applications run as containers',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containertype_id' => 'Container Type',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containertype_id+' => 'Technology used to deliver containerization',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:status' => 'Status',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:status+' => 'Status of the container platform',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containerapplications_list' => 'Applications',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containerapplications_list+' => 'Applications running on this container environment',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Host
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerHost/Name' => '%1$s',
|
||||||
|
'Class:ContainerHost/ComplementaryName' => '%1$s-%2$s',
|
||||||
|
'Class:ContainerHost' => 'Container Host',
|
||||||
|
'Class:ContainerHost+' => 'Host dedicated to containers. It is the basic element of a Container Platform',
|
||||||
|
'Class:ContainerHost/Attribute:containercluster_id' => 'Container Cluster',
|
||||||
|
'Class:ContainerHost/Attribute:containercluster_id+' => '',
|
||||||
|
'Class:ContainerHost/Attribute:role' => 'Role',
|
||||||
|
'Class:ContainerHost/Attribute:role+' => 'Role of the host within its cluster: Master or Worker. Standalone when not part of a cluster.',
|
||||||
|
'Class:ContainerHost/Attribute:system_id' => 'System',
|
||||||
|
'Class:ContainerHost/Attribute:system_id+' => 'The system can be a Server, a Virtual Machine, a Cloud, ...',
|
||||||
|
'Class:ContainerHost/Attribute:role/Value:master' => 'Master',
|
||||||
|
'Class:ContainerHost/Attribute:role/Value:worker' => 'Worker',
|
||||||
|
'Class:ContainerHost/Attribute:role/Value:standalone' => 'Standalone',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Cluster
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerCluster/Name' => '%1$s',
|
||||||
|
'Class:ContainerCluster/ComplementaryName' => '',
|
||||||
|
'Class:ContainerCluster' => 'Container Cluster',
|
||||||
|
'Class:ContainerCluster+' => 'A Container Platform made of a cluster of Container Hosts',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy' => 'Configuration of the redundancy',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy/disabled' => 'The cluster is up if all its hosts are up',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy/count' => 'The cluster is up if at least %1$s hosts are up',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy/percent' => 'The cluster is up if at least %1$s %% of the hosts are up',
|
||||||
|
'Class:ContainerCluster/Attribute:containerhosts_list' => 'Container Hosts',
|
||||||
|
'Class:ContainerCluster/Attribute:containerhosts_list+' => 'Hosts part of this cluster',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Type
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerType/Name' => '%1$s',
|
||||||
|
'Class:ContainerType/ComplementaryName' => '',
|
||||||
|
'Class:ContainerType' => 'Container Type',
|
||||||
|
'Class:ContainerType+' => 'Technology used to deliver containerization',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Type
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('EN US', 'English', 'English', [
|
||||||
|
'Class:ContainerImageType/Name' => '%1$s',
|
||||||
|
'Class:ContainerImageType/ComplementaryName' => '',
|
||||||
|
'Class:ContainerImageType' => 'Container Image Type',
|
||||||
|
'Class:ContainerImageType+' => 'Typology of container images',
|
||||||
|
]);
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Localized data
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2013 XXXXX
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fieldsets for Container classes
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Container:baseinfo' => 'Informations générales',
|
||||||
|
'Container:moreinfo' => 'Spécificités de la conteneurisation',
|
||||||
|
'Container:otherinfo' => 'Dates et description',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Image
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerImage/Name' => '%1$s %2$s',
|
||||||
|
'Class:ContainerImage/ComplementaryName' => '%1$s - %2$s',
|
||||||
|
'Class:ContainerImage' => 'Image pour Conteneur',
|
||||||
|
'Class:ContainerImage+' => 'L\'image d\'un logiciel, constituant d\'une Application Conteneurisée',
|
||||||
|
'Class:ContainerImage/Attribute:name' => 'Nom',
|
||||||
|
'Class:ContainerImage/Attribute:name+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:version' => 'Version',
|
||||||
|
'Class:ContainerImage/Attribute:version+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:description' => 'Description',
|
||||||
|
'Class:ContainerImage/Attribute:description+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:publisher' => 'Editeur',
|
||||||
|
'Class:ContainerImage/Attribute:publisher+' => 'Fournisseur de l\image',
|
||||||
|
'Class:ContainerImage/Attribute:image' => 'Image',
|
||||||
|
'Class:ContainerImage/Attribute:image+' => 'Détail permettant de récupérer l\'image sur la plateforme d\'hébergement appropriée',
|
||||||
|
'Class:ContainerImage/Attribute:type_id' => 'Type',
|
||||||
|
'Class:ContainerImage/Attribute:type_id+' => 'Type d\image',
|
||||||
|
'Class:ContainerImage/Attribute:software_id' => 'Logiciel',
|
||||||
|
'Class:ContainerImage/Attribute:software_id+' => '',
|
||||||
|
'Class:ContainerImage/Attribute:containerapplications_list' => 'Applications conteneurisées',
|
||||||
|
'Class:ContainerImage/Attribute:containerapplications_list+' => 'Les applications qui utilisent cette image',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Application
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerApplication/Name' => '%1$s',
|
||||||
|
'Class:ContainerApplication/ComplementaryName' => '%1$s',
|
||||||
|
'Class:ContainerApplication' => 'Application Conteneurisée',
|
||||||
|
'Class:ContainerApplication+' => 'Une application déployée sur une Plateforme de Conteneurisation',
|
||||||
|
'Class:ContainerApplication/Attribute:descriptor' => 'Fichier de déploiement',
|
||||||
|
'Class:ContainerApplication/Attribute:descriptor+' => 'Fichier décrivant la manière de déployer l\'application sur la plateforme de conteneurisation (par exemple, Docker Compose, Helm Chart, etc.)',
|
||||||
|
'Class:ContainerApplication/Attribute:containervirtualhost_id' => 'Hôte',
|
||||||
|
'Class:ContainerApplication/Attribute:containervirtualhost_id+' => 'Plateforme de conteneurisation sur laquelle cette application est déployée',
|
||||||
|
'Class:ContainerApplication/Attribute:containertype_id' => 'Type de conteneur',
|
||||||
|
'Class:ContainerApplication/Attribute:containertype_id+' => 'Typologie de plateforme de conteneurisation',
|
||||||
|
'Class:ContainerApplication/Attribute:containerimages_list' => 'Images',
|
||||||
|
'Class:ContainerApplication/Attribute:containerimages_list+' => 'Images des conteneurs constitutifs de cette application',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class: lnkContainerApplicationToImage
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:lnkContainerApplicationToImage' => 'Lien Application / Image pour Conteneur',
|
||||||
|
'Class:lnkContainerApplicationToImage+' => '',
|
||||||
|
'Class:lnkContainerApplicationToImage/Name' => '%1$s / %2$s',
|
||||||
|
'Class:lnkContainerApplicationToImage/Name+' => '',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id' => 'Application conteneurisée',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerapplication_id+' => 'Application qui utilise cette image',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id' => 'Image pour conteneur',
|
||||||
|
'Class:lnkContainerApplicationToImage/Attribute:containerimage_id+' => 'Une image qui contribue à l\'application',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Virtual Host
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerVirtualHost/Name' => '%1$s',
|
||||||
|
'Class:ContainerVirtualHost/ComplementaryName' => '',
|
||||||
|
'Class:ContainerVirtualHost' => 'Plateforme de Conteneurisation',
|
||||||
|
'Class:ContainerVirtualHost+' => 'Plateforme sur laquelle des applications s\'exécutent dans des conteneurs',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containertype_id' => 'Type de plateforme',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containertype_id+' => 'Technologie de conteneurisation utilisée',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:status' => 'État',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:status+' => 'État de la plateforme de conteneurisation',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containerapplications_list' => 'Applications',
|
||||||
|
'Class:ContainerVirtualHost/Attribute:containerapplications_list+' => 'Applications qui sont déployées sur cette plateforme',
|
||||||
|
'ContainerVirtualHost:baseinfo' => 'Informations générales',
|
||||||
|
'ContainerVirtualHost:moreinfo' => 'Spécificités de la conteneurisation',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Host
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerHost/Name' => '%1$s',
|
||||||
|
'Class:ContainerHost/ComplementaryName' => '%1$s-%2$s',
|
||||||
|
'Class:ContainerHost' => 'Hôte pour Conteneurs',
|
||||||
|
'Class:ContainerHost+' => 'Logiciel hôte dédié à l\'exécution de conteneurs. C\'est l\'élément de base d\'une Plateforme de Conteneurisation',
|
||||||
|
'Class:ContainerHost/Attribute:containercluster_id' => 'Grappe pour conteneurs',
|
||||||
|
'Class:ContainerHost/Attribute:containercluster_id+' => 'Grappe d\'hôtes pour conteneurs',
|
||||||
|
'Class:ContainerHost/Attribute:role' => 'Rôle',
|
||||||
|
'Class:ContainerHost/Attribute:role+' => 'Rôle de cet hôte au sein de la grappe : Maître ou Esclave. Autonome en l\'absence de grappe',
|
||||||
|
'Class:ContainerHost/Attribute:role/Value:master' => 'Maître',
|
||||||
|
'Class:ContainerHost/Attribute:role/Value:worker' => 'Esclave',
|
||||||
|
'Class:ContainerHost/Attribute:role/Value:standalone' => 'Autonome',
|
||||||
|
'Class:ContainerHost/Attribute:system_id' => 'Système',
|
||||||
|
'Class:ContainerHost/Attribute:system_id+' => 'Le système sur lequel cet hôte tourne. Cela peut être un Serveur, une Machine Virtuelle ou un Nuage',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Cluster
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerCluster/Name' => '%1$s',
|
||||||
|
'Class:ContainerCluster/ComplementaryName' => '',
|
||||||
|
'Class:ContainerCluster' => 'Grappe pour Conteneurs',
|
||||||
|
'Class:ContainerCluster+' => 'Plateforme de Conteneurisation constitué d\'une grappe d\'Hôtes pour Conteneurs',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy' => 'Configuration de la redondance',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy/disabled' => 'La grappe est opérationnelle si tous les hôtes qui la composent sont opérationnels',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy/count' => 'Nombre minimal d\'hôtes pour que la grappe soit opérationnelle : %1$s',
|
||||||
|
'Class:ContainerCluster/Attribute:redundancy/percent' => 'Pourcentage minimal d\'hôtes pour que la grappe soit opérationnelle : %1$s %%',
|
||||||
|
'Class:ContainerCluster/Attribute:containerhosts_list' => 'Hôtes pour conteneurs',
|
||||||
|
'Class:ContainerCluster/Attribute:containerhosts_list+' => 'Hôtes composant cette grappe',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Type
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerType/Name' => '%1$s',
|
||||||
|
'Class:ContainerType/ComplementaryName' => '',
|
||||||
|
'Class:ContainerType' => 'Type de conteneurisation',
|
||||||
|
'Class:ContainerType+' => 'Technologie de conteneurisation',
|
||||||
|
]);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class Container Image Type
|
||||||
|
//
|
||||||
|
|
||||||
|
Dict::Add('FR FR', 'French', 'Français', [
|
||||||
|
'Class:ContainerImageType/Name' => '%1$s',
|
||||||
|
'Class:ContainerImageType/ComplementaryName' => '',
|
||||||
|
'Class:ContainerImageType' => 'Type d\'image',
|
||||||
|
'Class:ContainerImageType+' => 'Typologie d\'images pour container',
|
||||||
|
]);
|
||||||
@@ -0,0 +1,346 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 48 48"
|
||||||
|
width="48px"
|
||||||
|
height="48px"
|
||||||
|
version="1.1"
|
||||||
|
id="svg17"
|
||||||
|
sodipodi:docname="icons8-desktop-container-alt(2).svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs17">
|
||||||
|
<linearGradient
|
||||||
|
id="z~0a6SjB_MRO4U5XcH~qfa"
|
||||||
|
x1="24"
|
||||||
|
x2="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.50425665,0,0,0.52649101,23.048596,23.922275)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#21ad64"
|
||||||
|
id="stop1-3" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#088242"
|
||||||
|
id="stop2-6" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
x2="24"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="color-1">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#f44f5a"
|
||||||
|
id="stop1-7" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#e52030"
|
||||||
|
id="stop2-5" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview17"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="8"
|
||||||
|
inkscape:cx="-14"
|
||||||
|
inkscape:cy="22"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1360"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg17"
|
||||||
|
showguides="true">
|
||||||
|
<sodipodi:guide
|
||||||
|
position="8.6248555,32.468683"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide17"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="18.623701,39.409067"
|
||||||
|
orientation="0,-1"
|
||||||
|
id="guide18"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="14.939875,32.189707"
|
||||||
|
orientation="0,-1"
|
||||||
|
id="guide19"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="-48.5,14.5625"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide20"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="10.092844,11.552042"
|
||||||
|
orientation="0,-1"
|
||||||
|
id="guide21"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<radialGradient
|
||||||
|
id="JbJPDQpzlQgFl0pQhERgYa"
|
||||||
|
cx="232.47"
|
||||||
|
cy="544.051"
|
||||||
|
r="86.245"
|
||||||
|
gradientTransform="matrix(0.7455679,0,0,-0.93789676,-130.40909,581.4208)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset=".323"
|
||||||
|
stop-color="#23d9d6"
|
||||||
|
id="stop1" />
|
||||||
|
<stop
|
||||||
|
offset=".427"
|
||||||
|
stop-color="#23d4d7"
|
||||||
|
id="stop2" />
|
||||||
|
<stop
|
||||||
|
offset=".542"
|
||||||
|
stop-color="#21c7dc"
|
||||||
|
id="stop3" />
|
||||||
|
<stop
|
||||||
|
offset=".664"
|
||||||
|
stop-color="#1fb0e2"
|
||||||
|
id="stop4" />
|
||||||
|
<stop
|
||||||
|
offset=".789"
|
||||||
|
stop-color="#1c91ec"
|
||||||
|
id="stop5" />
|
||||||
|
<stop
|
||||||
|
offset=".917"
|
||||||
|
stop-color="#1969f8"
|
||||||
|
id="stop6" />
|
||||||
|
<stop
|
||||||
|
offset=".944"
|
||||||
|
stop-color="#1860fb"
|
||||||
|
id="stop7" />
|
||||||
|
</radialGradient>
|
||||||
|
<path
|
||||||
|
fill="url(#JbJPDQpzlQgFl0pQhERgYa)"
|
||||||
|
d="M 7.7397454,6 H 35.575672 c 0.96121,0 1.739746,0.7785361 1.739746,1.7397454 V 35.575672 c 0,0.96121 -0.778536,1.739746 -1.739746,1.739746 H 7.7397454 C 6.7785361,37.315418 6,36.536882 6,35.575672 V 7.7397454 C 6,6.7785361 6.7785361,6 7.7397454,6 Z"
|
||||||
|
id="path7"
|
||||||
|
style="fill:url(#JbJPDQpzlQgFl0pQhERgYa);stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#184f85"
|
||||||
|
d="M 37.315418,35.575672 V 32.096181 H 6 v 3.479491 c 0,0.96121 0.7785361,1.739746 1.7397454,1.739746 H 35.575672 c 0.96121,0 1.739746,-0.778536 1.739746,-1.739746 z"
|
||||||
|
id="path8"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 8.1746818,36.445545 c -0.7193848,0 -1.3048091,-0.585424 -1.3048091,-1.304809 v -0.869873 c 0,-0.719385 0.5854243,-1.304809 1.3048091,-1.304809 h 0.8698727 c 0.7193847,0 1.3048095,0.585424 1.3048095,1.304809 v 0.869873 c 0,0.719385 -0.5854248,1.304809 -1.3048095,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path9"
|
||||||
|
style="display:inline;stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 8.1746818,36.010609 c -0.4792999,0 -0.8698727,-0.390573 -0.8698727,-0.869873 v -0.869873 c 0,-0.4793 0.3905728,-0.869873 0.8698727,-0.869873 h 0.8698727 c 0.4792999,0 0.8698727,0.390573 0.8698727,0.869873 v 0.869873 c 0,0.4793 -0.3905728,0.869873 -0.8698727,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path10"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="M 9.0445545,35.575672 H 8.1746818 c -0.2400849,0 -0.4349364,-0.194851 -0.4349364,-0.434936 v -0.869873 c 0,-0.240085 0.1948515,-0.434936 0.4349364,-0.434936 h 0.8698727 c 0.2400849,0 0.4349363,0.194851 0.4349363,0.434936 v 0.869873 c 0,0.240085 -0.1948514,0.434936 -0.4349363,0.434936 z"
|
||||||
|
id="path11"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 12.442916,36.457287 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -0.869873 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 0.869873 c 0.719384,0 1.304809,0.585424 1.304809,1.304809 v 0.869873 c 0,0.719385 -0.585425,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path9-5"
|
||||||
|
style="display:inline;stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 12.442916,36.022351 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -0.869873 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 0.869873 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 0.869873 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path10-9"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="m 13.312789,35.587414 h -0.869873 c -0.240085,0 -0.434936,-0.194851 -0.434936,-0.434936 v -0.869873 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 0.869873 c 0.240085,0 0.434936,0.194851 0.434936,0.434936 v 0.869873 c 0,0.240085 -0.194851,0.434936 -0.434936,0.434936 z"
|
||||||
|
id="path11-2"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 16.812935,36.440821 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -0.869873 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 0.869873 c 0.719384,0 1.304809,0.585424 1.304809,1.304809 v 0.869873 c 0,0.719385 -0.585425,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path9-8"
|
||||||
|
style="display:inline;stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 16.812935,36.005885 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -0.869873 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 0.869873 c 0.4793,0 0.869872,0.390573 0.869872,0.869873 v 0.869873 c 0,0.4793 -0.390572,0.869873 -0.869872,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path10-97"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="m 17.682808,35.570948 h -0.869873 c -0.240085,0 -0.434936,-0.194851 -0.434936,-0.434936 v -0.869873 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 0.869873 c 0.240085,0 0.434936,0.194851 0.434936,0.434936 v 0.869873 c 0,0.240085 -0.194851,0.434936 -0.434936,0.434936 z"
|
||||||
|
id="path11-3"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 21.172333,36.463025 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -0.869873 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 0.869872 c 0.719385,0 1.30481,0.585424 1.30481,1.304809 v 0.869873 c 0,0.719385 -0.585425,1.304809 -1.30481,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path9-1"
|
||||||
|
style="display:inline;stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 21.172333,36.028089 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -0.869873 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 0.869872 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 0.869873 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path10-2"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="m 22.042205,35.593152 h -0.869872 c -0.240085,0 -0.434937,-0.194851 -0.434937,-0.434936 v -0.869873 c 0,-0.240085 0.194852,-0.434936 0.434937,-0.434936 h 0.869872 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 0.869873 c 0,0.240085 -0.194852,0.434936 -0.434937,0.434936 z"
|
||||||
|
id="path11-9"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 9.9144272,13.828854 c -0.7193847,0 -1.3048091,-0.585424 -1.3048091,-1.304809 V 9.9144272 c 0,-0.7193847 0.5854244,-1.3048091 1.3048091,-1.3048091 h 2.6096178 c 0.719385,0 1.304809,0.5854244 1.304809,1.3048091 v 2.6096178 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path12"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 9.9144272,13.393918 c -0.4792999,0 -0.8698727,-0.390573 -0.8698727,-0.869873 V 9.9144272 c 0,-0.4792999 0.3905728,-0.8698727 0.8698727,-0.8698727 h 2.6096178 c 0.4793,0 0.869873,0.3905728 0.869873,0.8698727 v 2.6096178 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path13"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="M 12.524045,12.958982 H 9.9144272 c -0.2400849,0 -0.4349364,-0.194852 -0.4349364,-0.434937 V 9.9144272 c 0,-0.2400849 0.1948515,-0.4349364 0.4349364,-0.4349364 h 2.6096178 c 0.240085,0 0.434937,0.1948515 0.434937,0.4349364 v 2.6096178 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||||
|
id="path14"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 9.925223,21.049076 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -2.609618 c 0,-0.719385 0.585424,-1.304809 1.304809,-1.304809 h 2.609618 c 0.719385,0 1.304809,0.585424 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path12-7"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 9.925223,20.61414 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.609618 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path13-0"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="M 12.534841,20.179204 H 9.925223 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.609618 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||||
|
id="path14-9"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<g
|
||||||
|
id="g17">
|
||||||
|
<path
|
||||||
|
d="m 9.9239547,28.13042 c -0.719385,0 -1.304809,-0.585424 -1.304809,-1.304809 v -2.609618 c 0,-0.719384 0.585424,-1.304809 1.304809,-1.304809 h 2.6096183 c 0.719385,0 1.304809,0.585425 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path12-6"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 9.9239547,27.695484 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.6096183 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path13-06"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="M 12.533573,27.260548 H 9.9239547 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.6096183 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||||
|
id="path14-2"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g18"
|
||||||
|
transform="translate(1.8119612,-8.374796)">
|
||||||
|
<path
|
||||||
|
d="M 15.304809,22.219236 C 14.585424,22.219236 14,21.633812 14,20.914427 V 18.304809 C 14,17.585424 14.585424,17 15.304809,17 h 2.609618 c 0.719385,0 1.304809,0.585424 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path12-1"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 15.304809,21.7843 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.609618 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path13-8"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="m 17.914427,21.349364 h -2.609618 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.609618 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||||
|
id="path14-7"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d="m 17.084265,21.042459 c -0.719384,0 -1.304809,-0.585424 -1.304809,-1.304809 v -2.609618 c 0,-0.719385 0.585425,-1.304809 1.304809,-1.304809 h 2.609618 c 0.719385,0 1.304809,0.585424 1.304809,1.304809 v 2.609618 c 0,0.719385 -0.585424,1.304809 -1.304809,1.304809 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path12-2"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
d="m 17.084265,20.607523 c -0.4793,0 -0.869873,-0.390573 -0.869873,-0.869873 v -2.609618 c 0,-0.4793 0.390573,-0.869873 0.869873,-0.869873 h 2.609618 c 0.4793,0 0.869873,0.390573 0.869873,0.869873 v 2.609618 c 0,0.4793 -0.390573,0.869873 -0.869873,0.869873 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path13-02"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<path
|
||||||
|
fill="#ffffff"
|
||||||
|
d="m 19.693883,20.172587 h -2.609618 c -0.240085,0 -0.434936,-0.194852 -0.434936,-0.434937 v -2.609618 c 0,-0.240085 0.194851,-0.434936 0.434936,-0.434936 h 2.609618 c 0.240085,0 0.434937,0.194851 0.434937,0.434936 v 2.609618 c 0,0.240085 -0.194852,0.434937 -0.434937,0.434937 z"
|
||||||
|
id="path14-3"
|
||||||
|
style="stroke-width:0.869873" />
|
||||||
|
<g
|
||||||
|
fill="none"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
stroke="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke-linecap="butt"
|
||||||
|
stroke-linejoin="miter"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
stroke-dasharray="none"
|
||||||
|
stroke-dashoffset="0"
|
||||||
|
font-family="none"
|
||||||
|
font-weight="none"
|
||||||
|
font-size="none"
|
||||||
|
text-anchor="none"
|
||||||
|
style="display:inline;mix-blend-mode:normal"
|
||||||
|
id="g9"
|
||||||
|
transform="matrix(0.09476897,0,0,0.09902703,23.025816,23.874812)">
|
||||||
|
<g
|
||||||
|
transform="scale(5.33333)"
|
||||||
|
id="g8">
|
||||||
|
<path
|
||||||
|
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||||
|
fill="#b41530"
|
||||||
|
id="path2-3" />
|
||||||
|
<path
|
||||||
|
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||||
|
fill="url(#color-1)"
|
||||||
|
id="path3-5"
|
||||||
|
style="fill:url(#color-1)" />
|
||||||
|
<path
|
||||||
|
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path4-6" />
|
||||||
|
<path
|
||||||
|
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path5" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle5-2" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle6-9" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle7-1" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle8" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLa" x1="33.5" x2="33.5" y1="21.279" y2="14.16" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset=".168" stop-color="#c9cdcf"/><stop offset=".423" stop-color="#dcdee0"/><stop offset=".477" stop-color="#e1e2e4"/><stop offset=".859" stop-color="#e4e4e6"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLa)" d="M37,38c-0.132,0-0.266-0.025-0.394-0.081l-4.575-1.961C30.189,35.169,29,33.365,29,31.362V25 c0-0.553,0.447-1,1-1s1,0.447,1,1v6.362c0,1.201,0.714,2.284,1.818,2.758l4.575,1.961c0.508,0.218,0.743,0.806,0.525,1.313 C37.757,37.773,37.388,38,37,38z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLb" x1="-533.666" x2="-536.399" y1="13.398" y2="8.258" gradientTransform="rotate(180 -249 23.945)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bef0"/><stop offset="1" stop-color="#0a85d9"/></linearGradient><circle cx="37" cy="37" r="3" fill="url(#IW_Sf1PHIv01Y0HkR8iXLb)"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLc" x1="14.5" x2="14.5" y1="21.279" y2="14.16" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset=".194" stop-color="#c9cdcf"/><stop offset=".503" stop-color="#e1e2e4"/><stop offset=".859" stop-color="#e4e4e6"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLc)" d="M11,38c-0.388,0-0.757-0.227-0.919-0.606c-0.218-0.507,0.018-1.095,0.525-1.313l4.575-1.961 C16.286,33.646,17,32.563,17,31.362V25c0-0.553,0.447-1,1-1s1,0.447,1,1v6.362c0,2.003-1.189,3.807-3.031,4.596l-4.575,1.961 C11.266,37.975,11.132,38,11,38z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLd" x1="24" x2="24" y1="21.279" y2="14.16" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset=".149" stop-color="#c9cdcf"/><stop offset=".318" stop-color="#d2d5d7"/><stop offset=".494" stop-color="#e1e2e4"/><stop offset=".859" stop-color="#e4e4e6"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLd)" d="M24,41c-0.553,0-1-0.447-1-1V24c0-0.553,0.447-1,1-1s1,0.447,1,1v16 C25,40.553,24.553,41,24,41z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLe" x1="16.832" x2="30.197" y1="42.119" y2="16.983" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2aa4f4"/><stop offset="1" stop-color="#007ad9"/></linearGradient><path fill="url(#IW_Sf1PHIv01Y0HkR8iXLe)" d="M34.183,9.034C31.992,5.422,28.034,3,23.5,3c-6.087,0-11.152,4.353-12.266,10.115 C7.696,13.718,5,16.79,5,20.5c0,4.142,3.358,7.5,7.5,7.5c0.007,0,0.014-0.001,0.021-0.001V28H33.5c5.247,0,9.5-4.253,9.5-9.5 C43,13.484,39.11,9.386,34.183,9.034z"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLf" x1="22.666" x2="25.399" y1="9.398" y2="4.258" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bef0"/><stop offset="1" stop-color="#0a85d9"/></linearGradient><circle cx="24" cy="41" r="3" fill="url(#IW_Sf1PHIv01Y0HkR8iXLf)"/><linearGradient id="IW_Sf1PHIv01Y0HkR8iXLg" x1="9.666" x2="12.399" y1="13.398" y2="8.258" gradientTransform="matrix(1 0 0 -1 0 47.89)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bef0"/><stop offset="1" stop-color="#0a85d9"/></linearGradient><circle cx="11" cy="37" r="3" fill="url(#IW_Sf1PHIv01Y0HkR8iXLg)"/></svg>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,524 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 240 240"
|
||||||
|
width="240px"
|
||||||
|
height="240px"
|
||||||
|
version="1.1"
|
||||||
|
id="svg48"
|
||||||
|
sodipodi:docname="icons8-farm-container(2).svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview50"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="4.0187236"
|
||||||
|
inkscape:cx="89.456264"
|
||||||
|
inkscape:cy="163.73358"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1360"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg48"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:deskcolor="#d1d1d1" />
|
||||||
|
<defs
|
||||||
|
id="defs27">
|
||||||
|
<linearGradient
|
||||||
|
id="linear0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="37.685921"
|
||||||
|
y1="19.14217"
|
||||||
|
x2="130.956497"
|
||||||
|
y2="148.210251"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(16.470589%,64.313728%,95.686275%);stop-opacity:1;"
|
||||||
|
id="stop2" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(0%,47.843137%,85.09804%);stop-opacity:1;"
|
||||||
|
id="stop4" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="radial0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cx="86"
|
||||||
|
cy="132.583328"
|
||||||
|
fx="86"
|
||||||
|
fy="132.583328"
|
||||||
|
r="10.75"
|
||||||
|
gradientTransform="scale(4.999995)">
|
||||||
|
<stop
|
||||||
|
offset="0.582"
|
||||||
|
style="stop-color:rgb(0%,0%,0%);stop-opacity:0.2;"
|
||||||
|
id="stop7" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"
|
||||||
|
id="stop9" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="39.416672"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="39.416672"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(11.372549%,34.901962%,70.19608%);stop-opacity:1;"
|
||||||
|
id="stop12" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(9.803922%,35.686275%,73.725492%);stop-opacity:1;"
|
||||||
|
id="stop14" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear2"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="68.083328"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="68.083328"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(11.372549%,34.901962%,70.19608%);stop-opacity:1;"
|
||||||
|
id="stop17" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(9.803922%,35.686275%,73.725492%);stop-opacity:1;"
|
||||||
|
id="stop19" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear3"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="96.75"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="96.75"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(11.372549%,34.901962%,70.19608%);stop-opacity:1;"
|
||||||
|
id="stop22" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(9.803922%,35.686275%,73.725492%);stop-opacity:1;"
|
||||||
|
id="stop24" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear0-3"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="37.685921"
|
||||||
|
y1="19.14217"
|
||||||
|
x2="130.9565"
|
||||||
|
y2="148.21025"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(69.803923%,16.470589%,95.686275%);stop-opacity:1;"
|
||||||
|
id="stop2-6" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(52.549022%,0%,85.09804%);stop-opacity:1;"
|
||||||
|
id="stop4-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="radial0-5"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cx="86"
|
||||||
|
cy="132.58333"
|
||||||
|
fx="86"
|
||||||
|
fy="132.58333"
|
||||||
|
r="10.75"
|
||||||
|
gradientTransform="scale(4.999995)">
|
||||||
|
<stop
|
||||||
|
offset="0.582"
|
||||||
|
style="stop-color:rgb(0%,0%,0%);stop-opacity:0.2;"
|
||||||
|
id="stop7-3" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"
|
||||||
|
id="stop9-5" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear1-6"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="39.416672"
|
||||||
|
x2="121.83333"
|
||||||
|
y2="39.416672"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(46.27451%,8.627451%,56.078434%);stop-opacity:1;"
|
||||||
|
id="stop12-2" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(44.313726%,5.490196%,62.352943%);stop-opacity:1;"
|
||||||
|
id="stop14-9" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear2-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="68.083328"
|
||||||
|
x2="121.83333"
|
||||||
|
y2="68.083328"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(46.27451%,8.627451%,56.078434%);stop-opacity:1;"
|
||||||
|
id="stop17-2" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(44.313726%,5.490196%,62.352943%);stop-opacity:1;"
|
||||||
|
id="stop19-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear3-0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="96.75"
|
||||||
|
x2="121.83333"
|
||||||
|
y2="96.75"
|
||||||
|
gradientTransform="scale(1.395349)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:rgb(46.27451%,8.627451%,56.078434%);stop-opacity:1;"
|
||||||
|
id="stop22-9" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(44.313726%,5.490196%,62.352943%);stop-opacity:1;"
|
||||||
|
id="stop24-3" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="radial0-2"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cx="86"
|
||||||
|
cy="132.58333"
|
||||||
|
fx="86"
|
||||||
|
fy="132.58333"
|
||||||
|
r="10.75"
|
||||||
|
gradientTransform="scale(4.999995)">
|
||||||
|
<stop
|
||||||
|
offset="0.582"
|
||||||
|
style="stop-color:rgb(0%,0%,0%);stop-opacity:0.2;"
|
||||||
|
id="stop7-37" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:rgb(0%,0%,0%);stop-opacity:0;"
|
||||||
|
id="stop9-59" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear0"
|
||||||
|
id="linearGradient251"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="37.685921"
|
||||||
|
y1="19.14217"
|
||||||
|
x2="130.956497"
|
||||||
|
y2="148.210251" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear1"
|
||||||
|
id="linearGradient253"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="39.416672"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="39.416672" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear2"
|
||||||
|
id="linearGradient255"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="68.083328"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="68.083328" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear3"
|
||||||
|
id="linearGradient257"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="96.75"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="96.75" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear0"
|
||||||
|
id="linearGradient269"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="37.685921"
|
||||||
|
y1="19.14217"
|
||||||
|
x2="130.956497"
|
||||||
|
y2="148.210251" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear1"
|
||||||
|
id="linearGradient271"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="39.416672"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="39.416672" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear2"
|
||||||
|
id="linearGradient273"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="68.083328"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="68.083328" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear3"
|
||||||
|
id="linearGradient275"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1.395349)"
|
||||||
|
x1="50.166672"
|
||||||
|
y1="96.75"
|
||||||
|
x2="121.833328"
|
||||||
|
y2="96.75" />
|
||||||
|
<linearGradient
|
||||||
|
x1="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
x2="24"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="color-1">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#f44f5a"
|
||||||
|
id="stop1-7" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#e52030"
|
||||||
|
id="stop2-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="z~0a6SjB_MRO4U5XcH~qfa-3"
|
||||||
|
x1="24"
|
||||||
|
x2="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-38,-2)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#21ad64"
|
||||||
|
id="stop1-1" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#088242"
|
||||||
|
id="stop2-9" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="surface37962620"
|
||||||
|
transform="matrix(0.70082968,0,0,0.70082968,-9.1125191,8.1014159)">
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient269);fill-rule:nonzero;stroke:none"
|
||||||
|
d="M 180,20 H 60 c -5.523438,0 -10,4.476562 -10,10 v 180 c 0,5.52344 4.476562,10 10,10 h 120 c 5.52344,0 10,-4.47656 10,-10 V 30 c 0,-5.523438 -4.47656,-10 -10,-10 z m 0,0"
|
||||||
|
id="path29" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#radial0);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 135,185 c 0,8.28516 -6.71484,15 -15,15 -8.28516,0 -15,-6.71484 -15,-15 0,-8.28516 6.71484,-15 15,-15 8.28516,0 15,6.71484 15,15 z m 0,0"
|
||||||
|
id="path31" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 130,185 c 0,5.52344 -4.47656,10 -10,10 -5.52344,0 -10,-4.47656 -10,-10 0,-5.52344 4.47656,-10 10,-10 5.52344,0 10,4.47656 10,10 z m 0,0"
|
||||||
|
id="path33" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient271);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,70 h -95 C 71.121094,70 70,68.878906 70,67.5 v -25 C 70,41.121094 71.121094,40 72.5,40 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.378906 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path35" />
|
||||||
|
<path
|
||||||
|
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,55 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||||
|
id="path37" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient273);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,110 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 C 70,81.121094 71.121094,80 72.5,80 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path39" />
|
||||||
|
<path
|
||||||
|
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,95 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||||
|
id="path41" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient275);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,150 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 c 0,-1.37891 1.121094,-2.5 2.5,-2.5 h 95 c 1.37891,0 2.5,1.12109 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path43" />
|
||||||
|
<path
|
||||||
|
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,135 c 0,2.76172 -2.23828,5 -5,5 -2.76172,0 -5,-2.23828 -5,-5 0,-2.76172 2.23828,-5 5,-5 2.76172,0 5,2.23828 5,5 z m 0,0"
|
||||||
|
id="path45" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="surface39050914"
|
||||||
|
transform="matrix(0.70448581,0,0,0.70448581,24.194376,16.874754)">
|
||||||
|
<path
|
||||||
|
style="fill:url(#linear0-3);fill-rule:nonzero;stroke:none"
|
||||||
|
d="M 180,20 H 60 c -5.523438,0 -10,4.476562 -10,10 v 180 c 0,5.52344 4.476562,10 10,10 h 120 c 5.52344,0 10,-4.47656 10,-10 V 30 c 0,-5.523438 -4.47656,-10 -10,-10 z m 0,0"
|
||||||
|
id="path29-6" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#radial0-5);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 135,185 c 0,8.28516 -6.71484,15 -15,15 -8.28516,0 -15,-6.71484 -15,-15 0,-8.28516 6.71484,-15 15,-15 8.28516,0 15,6.71484 15,15 z m 0,0"
|
||||||
|
id="path31-0" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 130,185 c 0,5.52344 -4.47656,10 -10,10 -5.52344,0 -10,-4.47656 -10,-10 0,-5.52344 4.47656,-10 10,-10 5.52344,0 10,4.47656 10,10 z m 0,0"
|
||||||
|
id="path33-6" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linear1-6);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,70 h -95 C 71.121094,70 70,68.878906 70,67.5 v -25 C 70,41.121094 71.121094,40 72.5,40 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.378906 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path35-2" />
|
||||||
|
<path
|
||||||
|
style="fill:#f530ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,55 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||||
|
id="path37-6" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linear2-1);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,110 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 C 70,81.121094 71.121094,80 72.5,80 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path39-1" />
|
||||||
|
<path
|
||||||
|
style="fill:#f530ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,95 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||||
|
id="path41-8" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linear3-0);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,150 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 c 0,-1.37891 1.121094,-2.5 2.5,-2.5 h 95 c 1.37891,0 2.5,1.12109 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path43-7" />
|
||||||
|
<path
|
||||||
|
style="fill:#f530ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,135 c 0,2.76172 -2.23828,5 -5,5 -2.76172,0 -5,-2.23828 -5,-5 0,-2.76172 2.23828,-5 5,-5 2.76172,0 5,2.23828 5,5 z m 0,0"
|
||||||
|
id="path45-9" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="surface37962620-2"
|
||||||
|
transform="matrix(0.70082968,0,0,0.70082968,64.946318,26.356156)">
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient251);fill-rule:nonzero;stroke:none"
|
||||||
|
d="M 180,20 H 60 c -5.523438,0 -10,4.476562 -10,10 v 180 c 0,5.52344 4.476562,10 10,10 h 120 c 5.52344,0 10,-4.47656 10,-10 V 30 c 0,-5.523438 -4.47656,-10 -10,-10 z m 0,0"
|
||||||
|
id="path29-9" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#radial0-2);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 135,185 c 0,8.28516 -6.71484,15 -15,15 -8.28516,0 -15,-6.71484 -15,-15 0,-8.28516 6.71484,-15 15,-15 8.28516,0 15,6.71484 15,15 z m 0,0"
|
||||||
|
id="path31-3" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 130,185 c 0,5.52344 -4.47656,10 -10,10 -5.52344,0 -10,-4.47656 -10,-10 0,-5.52344 4.47656,-10 10,-10 5.52344,0 10,4.47656 10,10 z m 0,0"
|
||||||
|
id="path33-1" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient253);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,70 h -95 C 71.121094,70 70,68.878906 70,67.5 v -25 C 70,41.121094 71.121094,40 72.5,40 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.378906 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path35-9" />
|
||||||
|
<path
|
||||||
|
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,55 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||||
|
id="path37-4" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient255);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,110 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 C 70,81.121094 71.121094,80 72.5,80 h 95 c 1.37891,0 2.5,1.121094 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path39-7" />
|
||||||
|
<path
|
||||||
|
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,95 c 0,2.761719 -2.23828,5 -5,5 -2.76172,0 -5,-2.238281 -5,-5 0,-2.761719 2.23828,-5 5,-5 2.76172,0 5,2.238281 5,5 z m 0,0"
|
||||||
|
id="path41-84" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient257);fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 167.5,150 h -95 c -1.378906,0 -2.5,-1.12109 -2.5,-2.5 v -25 c 0,-1.37891 1.121094,-2.5 2.5,-2.5 h 95 c 1.37891,0 2.5,1.12109 2.5,2.5 v 25 c 0,1.37891 -1.12109,2.5 -2.5,2.5 z m 0,0"
|
||||||
|
id="path43-5" />
|
||||||
|
<path
|
||||||
|
style="fill:#4fe6ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 160,135 c 0,2.76172 -2.23828,5 -5,5 -2.76172,0 -5,-2.23828 -5,-5 0,-2.76172 2.23828,-5 5,-5 2.76172,0 5,2.23828 5,5 z m 0,0"
|
||||||
|
id="path45-0" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
fill="none"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
stroke="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke-linecap="butt"
|
||||||
|
stroke-linejoin="miter"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
stroke-dasharray="none"
|
||||||
|
stroke-dashoffset="0"
|
||||||
|
font-family="none"
|
||||||
|
font-weight="none"
|
||||||
|
font-size="none"
|
||||||
|
text-anchor="none"
|
||||||
|
style="display:inline;mix-blend-mode:normal"
|
||||||
|
id="g9"
|
||||||
|
transform="matrix(0.52119415,0,0,0.5446121,102.47174,115.50098)">
|
||||||
|
<g
|
||||||
|
transform="scale(5.33333)"
|
||||||
|
id="g8">
|
||||||
|
<path
|
||||||
|
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||||
|
fill="#b41530"
|
||||||
|
id="path2-3" />
|
||||||
|
<path
|
||||||
|
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||||
|
fill="url(#color-1)"
|
||||||
|
id="path3-5"
|
||||||
|
style="fill:url(#color-1)" />
|
||||||
|
<path
|
||||||
|
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path4-6" />
|
||||||
|
<path
|
||||||
|
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path5" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle5-2" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle6-9" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle7-1" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle8" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,275 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 48 48"
|
||||||
|
width="240px"
|
||||||
|
height="240px"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1633"
|
||||||
|
sodipodi:docname="icons8-server-container(2).svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
inkscape:export-filename="icons8-hypervisor.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs1637">
|
||||||
|
<linearGradient
|
||||||
|
x1="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
x2="24"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="color-1">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#f44f5a"
|
||||||
|
id="stop1-7" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#e52030"
|
||||||
|
id="stop2-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="z~0a6SjB_MRO4U5XcH~qfa-3"
|
||||||
|
x1="24"
|
||||||
|
x2="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-38,-2)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#21ad64"
|
||||||
|
id="stop1-1" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#088242"
|
||||||
|
id="stop2-9" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1635"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="2.8416667"
|
||||||
|
inkscape:cx="124.04692"
|
||||||
|
inkscape:cy="133.72434"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1360"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg1633"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:deskcolor="#d1d1d1" />
|
||||||
|
<linearGradient
|
||||||
|
id="H5zWGZDzzYRltSZyl6Krha"
|
||||||
|
x1="10.517"
|
||||||
|
x2="36.546"
|
||||||
|
y1="5.342"
|
||||||
|
y2="41.361"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#2aa4f4"
|
||||||
|
id="stop1590" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#007ad9"
|
||||||
|
id="stop1592" />
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
fill="url(#H5zWGZDzzYRltSZyl6Krha)"
|
||||||
|
d="M 32.725418,5.8345643 H 13.76154 c -0.873128,0 -1.580323,0.7071946 -1.580323,1.5803232 V 35.860705 c 0,0.873128 0.707195,1.580323 1.580323,1.580323 h 18.963878 c 0.873129,0 1.580324,-0.707195 1.580324,-1.580323 V 7.4148875 c 0,-0.8731286 -0.707195,-1.5803232 -1.580324,-1.5803232 z"
|
||||||
|
id="path1595"
|
||||||
|
style="fill:url(#H5zWGZDzzYRltSZyl6Krha);stroke-width:0.790162" />
|
||||||
|
<radialGradient
|
||||||
|
id="H5zWGZDzzYRltSZyl6Krhb"
|
||||||
|
cx="24"
|
||||||
|
cy="37"
|
||||||
|
r="3"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||||
|
<stop
|
||||||
|
offset=".582"
|
||||||
|
stop-opacity=".2"
|
||||||
|
id="stop1597" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-opacity="0"
|
||||||
|
id="stop1599" />
|
||||||
|
</radialGradient>
|
||||||
|
<circle
|
||||||
|
cx="23.243479"
|
||||||
|
cy="31.909897"
|
||||||
|
r="2.3704848"
|
||||||
|
fill="url(#H5zWGZDzzYRltSZyl6Krhb)"
|
||||||
|
id="circle1602"
|
||||||
|
style="fill:url(#H5zWGZDzzYRltSZyl6Krhb);stroke-width:0.790162" />
|
||||||
|
<circle
|
||||||
|
cx="23.243479"
|
||||||
|
cy="31.909897"
|
||||||
|
r="1.5803232"
|
||||||
|
fill="#ffffff"
|
||||||
|
id="circle1604"
|
||||||
|
style="stroke-width:0.790162" />
|
||||||
|
<linearGradient
|
||||||
|
id="H5zWGZDzzYRltSZyl6Krhc"
|
||||||
|
x1="14"
|
||||||
|
x2="34"
|
||||||
|
y1="11"
|
||||||
|
y2="11"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#1d59b3"
|
||||||
|
id="stop1606" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#195bbc"
|
||||||
|
id="stop1608" />
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
fill="url(#H5zWGZDzzYRltSZyl6Krhc)"
|
||||||
|
d="m 30.750014,13.73618 h -15.01307 c -0.218084,0 -0.395081,-0.176996 -0.395081,-0.395081 V 9.3902915 c 0,-0.2180846 0.176997,-0.3950808 0.395081,-0.3950808 h 15.01307 c 0.218085,0 0.395081,0.1769962 0.395081,0.3950808 v 3.9508075 c 0,0.218085 -0.176996,0.395081 -0.395081,0.395081 z"
|
||||||
|
id="path1611"
|
||||||
|
style="fill:url(#H5zWGZDzzYRltSZyl6Krhc);stroke-width:0.790162" />
|
||||||
|
<circle
|
||||||
|
cx="28.774611"
|
||||||
|
cy="11.365695"
|
||||||
|
r="0.79016161"
|
||||||
|
fill="#50e6ff"
|
||||||
|
id="circle1613"
|
||||||
|
style="stroke-width:0.790162" />
|
||||||
|
<linearGradient
|
||||||
|
id="H5zWGZDzzYRltSZyl6Krhd"
|
||||||
|
x1="14"
|
||||||
|
x2="34"
|
||||||
|
y1="19"
|
||||||
|
y2="19"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#1d59b3"
|
||||||
|
id="stop1615" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#195bbc"
|
||||||
|
id="stop1617" />
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
fill="url(#H5zWGZDzzYRltSZyl6Krhd)"
|
||||||
|
d="m 30.750014,20.057473 h -15.01307 c -0.218084,0 -0.395081,-0.176997 -0.395081,-0.395081 v -3.950808 c 0,-0.218085 0.176997,-0.395081 0.395081,-0.395081 h 15.01307 c 0.218085,0 0.395081,0.176996 0.395081,0.395081 v 3.950808 c 0,0.218084 -0.176996,0.395081 -0.395081,0.395081 z"
|
||||||
|
id="path1620"
|
||||||
|
style="fill:url(#H5zWGZDzzYRltSZyl6Krhd);stroke-width:0.790162" />
|
||||||
|
<circle
|
||||||
|
cx="28.774611"
|
||||||
|
cy="17.686989"
|
||||||
|
r="0.79016161"
|
||||||
|
fill="#50e6ff"
|
||||||
|
id="circle1622"
|
||||||
|
style="stroke-width:0.790162" />
|
||||||
|
<linearGradient
|
||||||
|
id="H5zWGZDzzYRltSZyl6Krhe"
|
||||||
|
x1="14"
|
||||||
|
x2="34"
|
||||||
|
y1="27"
|
||||||
|
y2="27"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.79016159,0,0,0.79016159,4.2796009,2.6739179)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#1d59b3"
|
||||||
|
id="stop1624" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#195bbc"
|
||||||
|
id="stop1626" />
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
fill="url(#H5zWGZDzzYRltSZyl6Krhe)"
|
||||||
|
d="m 30.750014,26.378765 h -15.01307 c -0.218084,0 -0.395081,-0.176996 -0.395081,-0.39508 v -3.950808 c 0,-0.218085 0.176997,-0.395081 0.395081,-0.395081 h 15.01307 c 0.218085,0 0.395081,0.176996 0.395081,0.395081 v 3.950808 c 0,0.218084 -0.176996,0.39508 -0.395081,0.39508 z"
|
||||||
|
id="path1629"
|
||||||
|
style="fill:url(#H5zWGZDzzYRltSZyl6Krhe);stroke-width:0.790162" />
|
||||||
|
<circle
|
||||||
|
cx="28.774611"
|
||||||
|
cy="24.008282"
|
||||||
|
r="0.79016161"
|
||||||
|
fill="#50e6ff"
|
||||||
|
id="circle1631"
|
||||||
|
style="stroke-width:0.790162" />
|
||||||
|
<g
|
||||||
|
fill="none"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
stroke="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke-linecap="butt"
|
||||||
|
stroke-linejoin="miter"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
stroke-dasharray="none"
|
||||||
|
stroke-dashoffset="0"
|
||||||
|
font-family="none"
|
||||||
|
font-weight="none"
|
||||||
|
font-size="none"
|
||||||
|
text-anchor="none"
|
||||||
|
style="display:inline;mix-blend-mode:normal"
|
||||||
|
id="g9"
|
||||||
|
transform="matrix(0.10423883,0,0,0.10892242,19.519126,22.252121)">
|
||||||
|
<g
|
||||||
|
transform="scale(5.33333)"
|
||||||
|
id="g8">
|
||||||
|
<path
|
||||||
|
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||||
|
fill="#b41530"
|
||||||
|
id="path2-3" />
|
||||||
|
<path
|
||||||
|
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||||
|
fill="url(#color-1)"
|
||||||
|
id="path3-5"
|
||||||
|
style="fill:url(#color-1)" />
|
||||||
|
<path
|
||||||
|
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path4-6" />
|
||||||
|
<path
|
||||||
|
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path5" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle5-2" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle6-9" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle7-1" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle8" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.4 KiB |
@@ -0,0 +1,336 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 48 48"
|
||||||
|
width="240px"
|
||||||
|
height="240px"
|
||||||
|
version="1.1"
|
||||||
|
id="svg320"
|
||||||
|
sodipodi:docname="icons8-software-container.svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs324">
|
||||||
|
<linearGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmng"
|
||||||
|
x1="12.496"
|
||||||
|
x2="15.03"
|
||||||
|
y1="26.719999"
|
||||||
|
y2="21.954"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#737b80"
|
||||||
|
id="stop449" />
|
||||||
|
<stop
|
||||||
|
offset=".473"
|
||||||
|
stop-color="#686f74"
|
||||||
|
id="stop451" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#575c61"
|
||||||
|
id="stop453" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmnf"
|
||||||
|
x1="32.495998"
|
||||||
|
x2="35.028999"
|
||||||
|
y1="26.719999"
|
||||||
|
y2="21.954"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#737b80"
|
||||||
|
id="stop440" />
|
||||||
|
<stop
|
||||||
|
offset=".473"
|
||||||
|
stop-color="#686f74"
|
||||||
|
id="stop442" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#575c61"
|
||||||
|
id="stop444" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmne"
|
||||||
|
x1="22.496"
|
||||||
|
x2="25.028999"
|
||||||
|
y1="26.719999"
|
||||||
|
y2="21.954"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#737b80"
|
||||||
|
id="stop431" />
|
||||||
|
<stop
|
||||||
|
offset=".473"
|
||||||
|
stop-color="#686f74"
|
||||||
|
id="stop433" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#575c61"
|
||||||
|
id="stop435" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmnd"
|
||||||
|
cx="14"
|
||||||
|
cy="23.889999"
|
||||||
|
r="4"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset=".696"
|
||||||
|
stop-opacity=".2"
|
||||||
|
id="stop424" />
|
||||||
|
<stop
|
||||||
|
offset=".959"
|
||||||
|
stop-opacity="0"
|
||||||
|
id="stop426" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmnc"
|
||||||
|
cx="24"
|
||||||
|
cy="23.889999"
|
||||||
|
r="4"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset=".696"
|
||||||
|
stop-opacity=".2"
|
||||||
|
id="stop417" />
|
||||||
|
<stop
|
||||||
|
offset=".959"
|
||||||
|
stop-opacity="0"
|
||||||
|
id="stop419" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmnb"
|
||||||
|
cx="34"
|
||||||
|
cy="23.889999"
|
||||||
|
r="4"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset=".696"
|
||||||
|
stop-opacity=".2"
|
||||||
|
id="stop410" />
|
||||||
|
<stop
|
||||||
|
offset=".959"
|
||||||
|
stop-opacity="0"
|
||||||
|
id="stop412" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="M0KIpv9F9DO9XPHmZgcmna"
|
||||||
|
x1="10.302"
|
||||||
|
x2="32.533001"
|
||||||
|
y1="49.653"
|
||||||
|
y2="7.8410001"
|
||||||
|
gradientTransform="matrix(0.42119248,0,0,-0.42119248,25.421635,46.097652)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#fcfcfc"
|
||||||
|
id="stop403" />
|
||||||
|
<stop
|
||||||
|
offset=".95"
|
||||||
|
stop-color="#c3c9cd"
|
||||||
|
id="stop405" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="24"
|
||||||
|
y1="4.4889998"
|
||||||
|
x2="24"
|
||||||
|
y2="45.143002"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="color-1">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#f44f5a"
|
||||||
|
id="stop1-7" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#e52030"
|
||||||
|
id="stop2-5" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview322"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.4208334"
|
||||||
|
inkscape:cx="-122.81525"
|
||||||
|
inkscape:cy="44.340175"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1360"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg320"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:deskcolor="#d1d1d1" />
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_1_"
|
||||||
|
x1="23.855"
|
||||||
|
x2="23.983"
|
||||||
|
y1="4.908"
|
||||||
|
y2="17.227"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.83754239,0,0,0.83754239,1.9089261,1.7931334)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#7dd8f3"
|
||||||
|
id="stop291" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#45b0d0"
|
||||||
|
id="stop293" />
|
||||||
|
</linearGradient>
|
||||||
|
<circle
|
||||||
|
cx="22.009941"
|
||||||
|
cy="17.622683"
|
||||||
|
r="12.563135"
|
||||||
|
fill="url(#SVGID_1_)"
|
||||||
|
id="circle296"
|
||||||
|
style="fill:url(#SVGID_1_);stroke-width:0.837541" />
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_2_"
|
||||||
|
x1="18.175"
|
||||||
|
x2="29.825"
|
||||||
|
y1="19.021"
|
||||||
|
y2="19.021"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.83754239,0,0,0.83754239,1.9089261,1.7931334)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#3079d6"
|
||||||
|
id="stop298" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#297cd2"
|
||||||
|
id="stop300" />
|
||||||
|
</linearGradient>
|
||||||
|
<circle
|
||||||
|
cx="22.009941"
|
||||||
|
cy="17.706436"
|
||||||
|
r="4.8577456"
|
||||||
|
fill="url(#SVGID_2_)"
|
||||||
|
id="circle303"
|
||||||
|
style="fill:url(#SVGID_2_);stroke-width:0.837541" />
|
||||||
|
<circle
|
||||||
|
cx="22.009941"
|
||||||
|
cy="17.706436"
|
||||||
|
r="1.9263473"
|
||||||
|
fill="#ffffff"
|
||||||
|
id="circle305"
|
||||||
|
style="stroke-width:0.837541" />
|
||||||
|
<path
|
||||||
|
d="m 9.4468073,17.622683 c 0,6.951602 5.6115347,12.563137 12.5631357,12.563137 6.951601,0 12.563135,-5.611535 12.563135,-12.563137 0,-0.251262 0,-0.502525 0,-0.753787 H 9.4468073 c 0,0.251262 0,0.502525 0,0.753787 z"
|
||||||
|
opacity="0.05"
|
||||||
|
id="path307"
|
||||||
|
style="stroke-width:0.837541" />
|
||||||
|
<path
|
||||||
|
d="m 9.4468073,17.622683 c 0,6.951602 5.6115347,12.563137 12.5631357,12.563137 6.951601,0 12.563135,-5.611535 12.563135,-12.563137 0,-0.08376 0,-0.167507 0,-0.335016 H 9.4468073 c 0,0.08376 0,0.167509 0,0.335016 z"
|
||||||
|
opacity="0.07"
|
||||||
|
id="path309"
|
||||||
|
style="stroke-width:0.837541" />
|
||||||
|
<linearGradient
|
||||||
|
id="SVGID_3_"
|
||||||
|
x1="16.786"
|
||||||
|
x2="30.174"
|
||||||
|
y1="-440.286"
|
||||||
|
y2="-472.232"
|
||||||
|
gradientTransform="matrix(0.83754239,0,0,-0.83754239,1.9089261,-354.99993)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#eba84b"
|
||||||
|
id="stop311" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#d97218"
|
||||||
|
id="stop313" />
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
fill="url(#SVGID_3_)"
|
||||||
|
d="M 36.248163,38.644997 H 7.7717222 c -0.5025255,0 -0.8375424,-0.418771 -0.8375424,-0.837543 V 18.543981 c 0,-0.502525 0.3350169,-0.837544 0.8375424,-0.837544 H 36.248163 c 0.502526,0 0.837542,0.335019 0.837542,0.837544 v 19.263473 c 0,0.418772 -0.418771,0.837543 -0.837542,0.837543 z"
|
||||||
|
id="path316"
|
||||||
|
style="fill:url(#SVGID_3_);stroke-width:0.837541" />
|
||||||
|
<path
|
||||||
|
fill="#633412"
|
||||||
|
d="m 18.659773,21.056608 h 6.700339 c 0.502526,0 0.837542,0.335017 0.837542,0.837542 v 0 c 0,0.502525 -0.335016,0.837542 -0.837542,0.837542 h -6.700339 c -0.502525,0 -0.837541,-0.335017 -0.837541,-0.837542 v 0 c 0,-0.502525 0.335016,-0.837542 0.837541,-0.837542 z"
|
||||||
|
id="path318"
|
||||||
|
style="stroke-width:0.837541" />
|
||||||
|
<g
|
||||||
|
fill="none"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
stroke="none"
|
||||||
|
stroke-width="1"
|
||||||
|
stroke-linecap="butt"
|
||||||
|
stroke-linejoin="miter"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
stroke-dasharray="none"
|
||||||
|
stroke-dashoffset="0"
|
||||||
|
font-family="none"
|
||||||
|
font-weight="none"
|
||||||
|
font-size="none"
|
||||||
|
text-anchor="none"
|
||||||
|
style="display:inline;mix-blend-mode:normal"
|
||||||
|
id="g9"
|
||||||
|
transform="matrix(0.10423883,0,0,0.10892242,19.968987,23.126292)">
|
||||||
|
<g
|
||||||
|
transform="scale(5.33333)"
|
||||||
|
id="g8">
|
||||||
|
<path
|
||||||
|
d="m 1,12 h 46 v 25 c 0,0.552 -0.448,1 -1,1 H 2 C 1.448,38 1,37.552 1,37 Z"
|
||||||
|
fill="#b41530"
|
||||||
|
id="path2-3" />
|
||||||
|
<path
|
||||||
|
d="m 44,10 c -0.552,0 -1,0.448 -1,1 v 1 H 5 V 11 C 5,10.448 4.552,10 4,10 H 2 c -0.552,0 -1,0.448 -1,1 v 26 c 0,0.552 0.448,1 1,1 h 44 c 0.552,0 1,-0.448 1,-1 V 12 11 c 0,-0.552 -0.448,-1 -1,-1 z m -31,4 h 2 V 36 H 13 Z M 11,36 H 9 V 14 h 2 z m 6,-22 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 v 22 h -2 z m 4,0 h 2 V 36 H 37 Z M 5,14 H 7 V 36 H 5 Z M 43,36 H 41 V 14 h 2 z"
|
||||||
|
fill="url(#color-1)"
|
||||||
|
id="path3-5"
|
||||||
|
style="fill:url(#color-1)" />
|
||||||
|
<path
|
||||||
|
d="m 13.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 13.224,38 13,37.776 13,37.5 v -1 C 13,36.224 13.224,36 13.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path4-6" />
|
||||||
|
<path
|
||||||
|
d="m 30.5,36 h 4 c 0.276,0 0.5,0.224 0.5,0.5 v 1 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 C 30.224,38 30,37.776 30,37.5 v -1 C 30,36.224 30.224,36 30.5,36 Z"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="path5" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle5-2" />
|
||||||
|
<circle
|
||||||
|
cx="45"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle6-9" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="12"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle7-1" />
|
||||||
|
<circle
|
||||||
|
cx="3"
|
||||||
|
cy="36"
|
||||||
|
r="1"
|
||||||
|
fill="#a3102a"
|
||||||
|
id="circle8" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.7 KiB |
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
//
|
||||||
|
// iTop module definition file
|
||||||
|
//
|
||||||
|
|
||||||
|
SetupWebPage::AddModule(
|
||||||
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
|
'itop-container-mgmt/3.3.0',
|
||||||
|
[
|
||||||
|
// Identification
|
||||||
|
//
|
||||||
|
'label' => 'Container management',
|
||||||
|
'category' => 'business',
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
//
|
||||||
|
'dependencies' => [
|
||||||
|
'itop-virtualization-mgmt/3.3.0',
|
||||||
|
],
|
||||||
|
'mandatory' => false,
|
||||||
|
'visible' => true,
|
||||||
|
|
||||||
|
// Components
|
||||||
|
//
|
||||||
|
'datamodel' => [
|
||||||
|
|
||||||
|
],
|
||||||
|
'webservice' => [
|
||||||
|
|
||||||
|
],
|
||||||
|
'data.struct' => [
|
||||||
|
// add your 'structure' definition XML files here,
|
||||||
|
'data/en_us.data.itop-container-type.xml',
|
||||||
|
'data/en_us.data.itop-container-image-type.xml',
|
||||||
|
],
|
||||||
|
'data.sample' => [
|
||||||
|
// add your sample data XML files here,
|
||||||
|
],
|
||||||
|
|
||||||
|
// Documentation
|
||||||
|
//
|
||||||
|
'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any
|
||||||
|
'doc.more_information' => '', // hyperlink to more information, if any
|
||||||
|
|
||||||
|
// Default settings
|
||||||
|
//
|
||||||
|
'settings' => [
|
||||||
|
// Module specific settings go here, if any
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user