diff --git a/README.md b/README.md
index 646e98b9c..a2cbe914b 100644
--- a/README.md
+++ b/README.md
@@ -140,13 +140,13 @@ TODO
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
+ *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder)
+ *First Build*: 30th April, 2015
-+ *Last Build*: 22nd January, 2023
++ *Last Build*: 29th January, 2023
+ *Version*: 3.1.13
+ *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt
-+ *Line count*: **357633**
++ *Line count*: **360674**
+ *Field count*: **2009**
-+ *File count*: **2304**
++ *File count*: **2314**
+ *Folder count*: **408**
> This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com).
diff --git a/admin/README.txt b/admin/README.txt
index 646e98b9c..a2cbe914b 100644
--- a/admin/README.txt
+++ b/admin/README.txt
@@ -140,13 +140,13 @@ TODO
+ *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io)
+ *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder)
+ *First Build*: 30th April, 2015
-+ *Last Build*: 22nd January, 2023
++ *Last Build*: 29th January, 2023
+ *Version*: 3.1.13
+ *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved.
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt
-+ *Line count*: **357633**
++ *Line count*: **360674**
+ *Field count*: **2009**
-+ *File count*: **2304**
++ *File count*: **2314**
+ *Folder count*: **408**
> This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](https://www.joomlacomponentbuilder.com).
diff --git a/admin/assets/js/search.js b/admin/assets/js/search.js
index 2ee64d300..1433d72ed 100644
--- a/admin/assets/js/search.js
+++ b/admin/assets/js/search.js
@@ -191,14 +191,14 @@ const getSelectedItem = async (table, row, field, line) => {
formData.append('regex_search', regexObject.checked ? 1 : 0);
// get search value
- if (mode == 1) {
- // calling URL
- postURL = UrlAjax + 'getSearchValue';
- } else {
+ if (mode == 2) {
// add the line value
formData.append('line_nr', line);
// calling URL
postURL = UrlAjax + 'getReplaceValue';
+ } else {
+ // calling URL
+ postURL = UrlAjax + 'getSearchValue';
}
let options = {
@@ -613,6 +613,12 @@ const buttonUpdateAllStyleDisplay = async (value) => {
* JS Function to execute (A) on search/replace text change , (B) on search options changes
*/
const startSearch = (field, forced = false) => {
+ // check mode
+ let mode = modeObject.querySelector('input[type=\'radio\']:checked').value;
+ if (mode == 0) {
+ // reset the search area
+ window.location.href = UrlSearch;
+ }
// check if we have an Enter click
if (field && typeof field.code !== 'undefined' && field.code === "Enter") {
forced = true;
diff --git a/admin/helpers/compiler.php b/admin/helpers/compiler.php
index 598318ded..2de5cedac 100644
--- a/admin/helpers/compiler.php
+++ b/admin/helpers/compiler.php
@@ -80,7 +80,7 @@ class Compiler extends Infusion
{
// to check the compiler speed
$this->time_start = microtime(true);
- CFactory::_('Counter')->start();
+ CFactory::_('Utilities.Counter')->start();
// first we run the parent constructors
if (parent::__construct())
{
@@ -104,9 +104,9 @@ class Compiler extends Infusion
if (CFactory::_('Config')->remove_site_folder && CFactory::_('Config')->remove_site_edit_folder)
{
// first remove the files and folders
- $this->removeFolder($this->componentPath . '/site');
+ CFactory::_('Utilities.Folder')->remove(CFactory::_('Utilities.Paths')->component_path . '/site');
// clear form component xml
- $xmlPath = $this->componentPath . '/'
+ $xmlPath = CFactory::_('Utilities.Paths')->component_path . '/'
. CFactory::_('Content')->get('component') . '.xml';
$componentXML = FileHelper::getContent($xmlPath);
$textToSite = GetHelper::between(
@@ -120,7 +120,7 @@ class Compiler extends Infusion
'' . $textToSiteLang
. ""), array('', ''), (string) $componentXML
);
- $this->writeFile($xmlPath, $componentXML);
+ CFactory::_('Utilities.File')->write($xmlPath, $componentXML);
}
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
@@ -363,7 +363,7 @@ class Compiler extends Infusion
// end the timer here
$this->time_end = microtime(true);
$this->secondsCompiled = $this->time_end - $this->time_start;
- CFactory::_('Counter')->end();
+ CFactory::_('Utilities.Counter')->end();
// completed the compilation
return true;
@@ -380,15 +380,13 @@ class Compiler extends Infusion
*/
protected function updateFiles()
{
- if (isset($this->newFiles['static'])
- && ArrayHelper::check($this->newFiles['static'])
- && isset($this->newFiles['dynamic'])
- && ArrayHelper::check($this->newFiles['dynamic']))
+ if (CFactory::_('Utilities.Files')->exists('static')
+ && CFactory::_('Utilities.Files')->exists('dynamic'))
{
// get the bom file
$bom = FileHelper::getContent(CFactory::_('Config')->bom_path);
// first we do the static files
- foreach ($this->newFiles['static'] as $static)
+ foreach (CFactory::_('Utilities.Files')->get('static') as $static)
{
if (File::exists($static['path']))
{
@@ -398,7 +396,7 @@ class Compiler extends Infusion
}
}
// now we do the dynamic files
- foreach ($this->newFiles['dynamic'] as $view => $files)
+ foreach (CFactory::_('Utilities.Files')->get('dynamic') as $view => $files)
{
if (CFactory::_('Content')->exist_($view)
&& ArrayHelper::check(
@@ -423,17 +421,14 @@ class Compiler extends Infusion
CFactory::_('Content')->remove_($view);
}
// free up some memory
- unset($this->newFiles['dynamic']);
+ CFactory::_('Utilities.Files')->remove('dynamic');
// do modules if found
if (CFactory::_('Joomlamodule.Data')->exists())
{
foreach (CFactory::_('Joomlamodule.Data')->get() as $module)
{
if (ObjectHelper::check($module)
- && isset($this->newFiles[$module->key])
- && ArrayHelper::check(
- $this->newFiles[$module->key]
- ))
+ && CFactory::_('Utilities.Files')->exists($module->key))
{
// move field or rule if needed
if (isset($module->fields_rules_paths)
@@ -489,7 +484,7 @@ class Compiler extends Infusion
}
}
// update the module files
- foreach ($this->newFiles[$module->key] as $module_file)
+ foreach (CFactory::_('Utilities.Files')->get($module->key) as $module_file)
{
if (File::exists($module_file['path']))
{
@@ -500,7 +495,7 @@ class Compiler extends Infusion
}
}
// free up some memory
- unset($this->newFiles[$module->key]);
+ CFactory::_('Utilities.Files')->remove($module->key);
CFactory::_('Content')->remove_($module->key);
}
}
@@ -511,10 +506,7 @@ class Compiler extends Infusion
foreach (CFactory::_('Joomlaplugin.Data')->get() as $plugin)
{
if (ObjectHelper::check($plugin)
- && isset($this->newFiles[$plugin->key])
- && ArrayHelper::check(
- $this->newFiles[$plugin->key]
- ))
+ && CFactory::_('Utilities.Files')->exists($plugin->key))
{
// move field or rule if needed
if (isset($plugin->fields_rules_paths)
@@ -570,7 +562,7 @@ class Compiler extends Infusion
}
}
// update the plugin files
- foreach ($this->newFiles[$plugin->key] as $plugin_file)
+ foreach (CFactory::_('Utilities.Files')->get($plugin->key) as $plugin_file)
{
if (File::exists($plugin_file['path']))
{
@@ -581,7 +573,7 @@ class Compiler extends Infusion
}
}
// free up some memory
- unset($this->newFiles[$plugin->key]);
+ CFactory::_('Utilities.Files')->remove($plugin->key);
CFactory::_('Content')->remove_($plugin->key);
}
}
@@ -592,13 +584,10 @@ class Compiler extends Infusion
foreach (CFactory::_('Power')->active as $power)
{
if (ObjectHelper::check($power)
- && isset($this->newFiles[$power->key])
- && ArrayHelper::check(
- $this->newFiles[$power->key]
- ))
+ && CFactory::_('Utilities.Files')->exists($power->key))
{
// update the power files
- foreach ($this->newFiles[$power->key] as $power_file)
+ foreach (CFactory::_('Utilities.Files')->get($power->key) as $power_file)
{
if (File::exists($power_file['path']))
{
@@ -609,7 +598,7 @@ class Compiler extends Infusion
}
}
// free up some memory
- unset($this->newFiles[$power->key]);
+ CFactory::_('Utilities.Files')->remove($power->key);
CFactory::_('Content')->remove_($power->key);
}
}
@@ -681,9 +670,9 @@ class Compiler extends Infusion
&$view)
);
// add answer back to file
- $this->writeFile($path, $answer);
+ CFactory::_('Utilities.File')->write($path, $answer);
// count the file lines
- CFactory::_('Counter')->line += substr_count((string) $answer, PHP_EOL);
+ CFactory::_('Utilities.Counter')->line += substr_count((string) $answer, PHP_EOL);
}
/**
@@ -699,7 +688,7 @@ class Compiler extends Infusion
&& isset($this->updateServerFileName)
&& $this->dynamicIntegration)
{
- $update_server_xml_path = $this->componentPath . '/'
+ $update_server_xml_path = CFactory::_('Utilities.Paths')->component_path . '/'
. $this->updateServerFileName . '.xml';
// make sure we have the correct file
if (File::exists($update_server_xml_path)
@@ -843,7 +832,7 @@ class Compiler extends Infusion
{
// do a final run to update the readme file
$two = 0;
- foreach ($this->newFiles['static'] as $static)
+ foreach (CFactory::_('Utilities.Files')->get('static') as $static)
{
if (('README.md' === $static['name']
|| 'README.txt' === $static['name'])
@@ -858,23 +847,23 @@ class Compiler extends Infusion
break;
}
}
- unset($this->newFiles['static']);
+ CFactory::_('Utilities.Files')->remove('static');
}
private function setReadMe($path)
{
// set readme data if not set already
if (!CFactory::_('Content')->exist('LINE_COUNT')
- || CFactory::_('Content')->get('LINE_COUNT') != CFactory::_('Counter')->line)
+ || CFactory::_('Content')->get('LINE_COUNT') != CFactory::_('Utilities.Counter')->line)
{
- CFactory::_('Counter')->set();
+ CFactory::_('Utilities.Counter')->set();
}
// get the file
$string = FileHelper::getContent($path);
// update the file
$answer = CFactory::_('Placeholder')->update($string, CFactory::_('Content')->active);
// add to zip array
- $this->writeFile($path, $answer);
+ CFactory::_('Utilities.File')->write($path, $answer);
}
/**
@@ -910,20 +899,21 @@ class Compiler extends Infusion
. CFactory::_('Config')->get('version', 3);
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
+ $component_path = CFactory::_('Utilities.Paths')->component_path;
// Trigger Event: jcb_ce_onBeforeUpdateRepo
CFactory::_('Event')->trigger(
'jcb_ce_onBeforeUpdateRepo',
- array(&$component_context, &$this->componentPath,
+ array(&$component_context, &$component_path,
&$repoFullPath, &$this->componentData)
);
// remove old data
- $this->removeFolder($repoFullPath, CFactory::_('Component')->get('toignore'));
+ CFactory::_('Utilities.Folder')->remove($repoFullPath, CFactory::_('Component')->get('toignore'));
// set the new data
- Folder::copy($this->componentPath, $repoFullPath, '', true);
+ Folder::copy(CFactory::_('Utilities.Paths')->component_path, $repoFullPath, '', true);
// Trigger Event: jcb_ce_onAfterUpdateRepo
CFactory::_('Event')->trigger(
'jcb_ce_onAfterUpdateRepo',
- array(&$component_context, &$this->componentPath,
+ array(&$component_context, &$component_path,
&$repoFullPath, &$this->componentData)
);
@@ -948,7 +938,7 @@ class Compiler extends Infusion
&$repoFullPath, &$module)
);
// remove old data
- $this->removeFolder(
+ CFactory::_('Utilities.Folder')->remove(
$repoFullPath, CFactory::_('Component')->get('toignore')
);
// set the new data
@@ -985,7 +975,7 @@ class Compiler extends Infusion
&$repoFullPath, &$plugin)
);
// remove old data
- $this->removeFolder(
+ CFactory::_('Utilities.Folder')->remove(
$repoFullPath, CFactory::_('Component')->get('toignore')
);
// set the new data
@@ -1007,22 +997,25 @@ class Compiler extends Infusion
private function zipComponent()
{
// Component Folder Name
- $this->filepath['component-folder'] = $this->componentFolderName;
+ $this->filepath['component-folder'] = CFactory::_('Utilities.Paths')->component_folder_name;
// the name of the zip file to create
$this->filepath['component'] = $this->tempPath . '/'
. $this->filepath['component-folder'] . '.zip';
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
+ $component_path = CFactory::_('Utilities.Paths')->component_path;
+ $component_sales_name = CFactory::_('Utilities.Paths')->component_sales_name;
+ $component_folder_name = CFactory::_('Utilities.Paths')->component_folder_name;
// Trigger Event: jcb_ce_onBeforeZipComponent
CFactory::_('Event')->trigger(
'jcb_ce_onBeforeZipComponent',
- array(&$component_context, &$this->componentPath,
+ array(&$component_context, &$component_path,
&$this->filepath['component'], &$this->tempPath,
- &$this->componentFolderName, &$this->componentData)
+ &$component_folder_name, &$this->componentData)
);
//create the zip file
if (FileHelper::zip(
- $this->componentPath, $this->filepath['component']
+ CFactory::_('Utilities.Paths')->component_path, $this->filepath['component']
))
{
// now move to backup if zip was made and backup is required
@@ -1039,7 +1032,7 @@ class Compiler extends Infusion
// copy the zip to backup path
File::copy(
$this->filepath['component'],
- $this->backupPath . '/' . $this->componentBackupName
+ $this->backupPath . '/' . CFactory::_('Utilities.Paths')->component_backup_name
. '.zip'
);
}
@@ -1055,12 +1048,12 @@ class Compiler extends Infusion
'jcb_ce_onBeforeMoveToServer',
array(&$component_context,
&$this->filepath['component'], &$this->tempPath,
- &$this->componentSalesName, &$this->componentData)
+ &$component_sales_name, &$this->componentData)
);
// move to server
ComponentbuilderHelper::moveToServer(
$this->filepath['component'],
- $this->componentSalesName . '.zip',
+ $component_sales_name . '.zip',
(int) CFactory::_('Component')->get('sales_server'),
CFactory::_('Component')->get('sales_server_protocol')
);
@@ -1070,11 +1063,11 @@ class Compiler extends Infusion
CFactory::_('Event')->trigger(
'jcb_ce_onAfterZipComponent',
array(&$component_context, &$this->filepath['component'],
- &$this->tempPath, &$this->componentFolderName,
+ &$this->tempPath, &$component_folder_name,
&$this->componentData)
);
// remove the component folder since we are done
- if ($this->removeFolder($this->componentPath))
+ if (CFactory::_('Utilities.Folder')->remove(CFactory::_('Utilities.Paths')->component_path))
{
return true;
}
@@ -1170,7 +1163,7 @@ class Compiler extends Infusion
&$module)
);
// remove the module folder since we are done
- $this->removeFolder($module->folder_path);
+ CFactory::_('Utilities.Folder')->remove($module->folder_path);
}
}
}
@@ -1264,7 +1257,7 @@ class Compiler extends Infusion
&$plugin)
);
// remove the plugin folder since we are done
- $this->removeFolder($plugin->folder_path);
+ CFactory::_('Utilities.Folder')->remove($plugin->folder_path);
}
}
}
@@ -1288,7 +1281,7 @@ class Compiler extends Infusion
$target['hashtarget'][1]
))
{
- $file = $this->componentPath . '/' . $target['path'];
+ $file = CFactory::_('Utilities.Paths')->component_path . '/' . $target['path'];
$size = (int) $target['hashtarget'][0];
$hash = $target['hashtarget'][1];
$cut = $size - 1;
diff --git a/admin/helpers/compiler/a_Get.php b/admin/helpers/compiler/a_Get.php
index d6ed9f0bd..99abf9918 100644
--- a/admin/helpers/compiler/a_Get.php
+++ b/admin/helpers/compiler/a_Get.php
@@ -2681,70 +2681,38 @@ class Get
* get the module xml template
*
* @return string
- *
+ * @deprecated 3.3
*/
public function getModuleXMLTemplate(&$module)
{
- $xml = '';
- $xml .= PHP_EOL . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . $module->lang_prefix
- . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('BUILDDATE') . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHOR') . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHOREMAIL') . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHORWEBSITE') . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('COPYRIGHT') . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('LICENSE') . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . $module->module_version
- . '';
- $xml .= PHP_EOL . Indent::_(1) . '' . $module->lang_prefix
- . '_XML_DESCRIPTION';
- $xml .= Placefix::_h('MAINXML');
- $xml .= PHP_EOL . '';
-
- return $xml;
+ // set notice that we could not get a valid string from the target
+ $this->app->enqueueMessage(
+ JText::sprintf('
%s Warning
', __CLASS__), 'Error'
+ );
+ $this->app->enqueueMessage(
+ JText::sprintf(
+ 'Use of a deprecated method (%s)!', __METHOD__
+ ), 'Error'
+ );
}
/**
* get the module admin custom script field
*
* @return string
- *
+ * @deprecated 3.3
*/
public function getModAdminVvvvvvvdm($fieldScriptBucket)
{
- $form_field_class = array();
- $form_field_class[] = Placefix::_h('BOM') . PHP_EOL;
- $form_field_class[] = "//" . Line::_(__Line__, __Class__)
- . " No direct access to this file";
- $form_field_class[] = "defined('_JEXEC') or die('Restricted access');";
- $form_field_class[] = PHP_EOL . "use Joomla\CMS\Form\FormField;";
- $form_field_class[] = "use Joomla\CMS\Factory;";
- $form_field_class[] = PHP_EOL
- . "class JFormFieldModadminvvvvvvvdm extends FormField";
- $form_field_class[] = "{";
- $form_field_class[] = Indent::_(1)
- . "protected \$type = 'modadminvvvvvvvdm';";
- $form_field_class[] = PHP_EOL . Indent::_(1)
- . "protected function getLabel()";
- $form_field_class[] = Indent::_(1) . "{";
- $form_field_class[] = Indent::_(2) . "return;";
- $form_field_class[] = Indent::_(1) . "}";
- $form_field_class[] = PHP_EOL . Indent::_(1)
- . "protected function getInput()";
- $form_field_class[] = Indent::_(1) . "{";
- $form_field_class[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__)
- . " Get the document";
- $form_field_class[] = Indent::_(2)
- . "\$document = Factory::getDocument();";
- $form_field_class[] = implode(PHP_EOL, $fieldScriptBucket);
- $form_field_class[] = Indent::_(2) . "return; // noting for now :)";
- $form_field_class[] = Indent::_(1) . "}";
- $form_field_class[] = "}";
-
- return implode(PHP_EOL, $form_field_class);
+ // set notice that we could not get a valid string from the target
+ $this->app->enqueueMessage(
+ JText::sprintf('
%s Warning
', __CLASS__), 'Error'
+ );
+ $this->app->enqueueMessage(
+ JText::sprintf(
+ 'Use of a deprecated method (%s)!', __METHOD__
+ ), 'Error'
+ );
}
/**
@@ -2810,7 +2778,7 @@ class Get
{
$xml = '';
$xml .= PHP_EOL . '';
$xml .= PHP_EOL . Indent::_(1) . '' . $plugin->lang_prefix
. '';
diff --git a/admin/helpers/compiler/b_Structure.php b/admin/helpers/compiler/b_Structure.php
index 4970a6fb7..033aa2ae3 100644
--- a/admin/helpers/compiler/b_Structure.php
+++ b/admin/helpers/compiler/b_Structure.php
@@ -37,7 +37,7 @@ class Structure extends Get
* The folder counter
*
* @var int
- * @deprecated 3.3 Use CFactory::_('Counter')->folder;
+ * @deprecated 3.3 Use CFactory::_('Utilities.Counter')->folder;
*/
public $folderCount = 0;
@@ -45,7 +45,7 @@ class Structure extends Get
* The file counter
*
* @var int
- * @deprecated 3.3 Use CFactory::_('Counter')->file;
+ * @deprecated 3.3 Use CFactory::_('Utilities.Counter')->file;
*/
public $fileCount = 0;
@@ -62,7 +62,7 @@ class Structure extends Get
*
* @var int
* @deprecated 3.3
- * @deprecated 3.3 Use CFactory::_('Counter')->line;
+ * @deprecated 3.3 Use CFactory::_('Utilities.Counter')->line;
*/
public $lineCount = 0;
@@ -246,6 +246,7 @@ class Structure extends Get
* The template path
*
* @var string
+ * @deprecated 3.3 Use CFactory::_('Utilities.Paths')->template_path;
*/
public $templatePath;
@@ -253,6 +254,7 @@ class Structure extends Get
* The custom template path
*
* @var string
+ * @deprecated 3.3 Use CFactory::_('Utilities.Paths')->template_path_custom;
*/
public $templatePathCustom;
@@ -313,6 +315,7 @@ class Structure extends Get
* The Component Sales name
*
* @var string
+ * @deprecated 3.3 Use CFactory::_('Utilities.Paths')->component_sales_name;
*/
public $componentSalesName;
@@ -320,6 +323,7 @@ class Structure extends Get
* The Component Backup name
*
* @var string
+ * @deprecated 3.3 Use CFactory::_('Utilities.Paths')->component_backup_name;
*/
public $componentBackupName;
@@ -327,6 +331,7 @@ class Structure extends Get
* The Component Folder name
*
* @var string
+ * @deprecated 3.3 Use CFactory::_('Utilities.Paths')->component_folder_name;
*/
public $componentFolderName;
@@ -334,6 +339,7 @@ class Structure extends Get
* The Component path
*
* @var string
+ * @deprecated 3.3 Use CFactory::_('Utilities.Paths')->component_path;
*/
public $componentPath;
@@ -341,6 +347,7 @@ class Structure extends Get
* The Dynamic paths
*
* @var array
+ * @deprecated 3.3 Use CFactory::_('Registry')->get('dynamic_paths');
*/
public $dynamicPaths = array();
@@ -362,6 +369,7 @@ class Structure extends Get
* The new files
*
* @var array
+ * @deprecated 3.3 Use CFactory::_('Utilities.Files');
*/
public $newFiles = array();
@@ -422,38 +430,16 @@ class Structure extends Get
CFactory::_('Content')->set('EXSTRA_SITE_FILES', '');
// set incase no extra media files are loaded
CFactory::_('Content')->set('EXSTRA_MEDIA_FILES', '');
- // set the template path
- $this->templatePath = CFactory::_('Config')->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/joomla_'
- . CFactory::_('Config')->joomla_versions[CFactory::_('Config')->joomla_version]['folder_key'];
- // set some default names
- $this->componentSalesName = 'com_'
- . CFactory::_('Component')->get('sales_name') . '__J'
- . CFactory::_('Config')->joomla_version;
- $this->componentBackupName = 'com_'
- . CFactory::_('Component')->get('sales_name') . '_v' . str_replace(
- '.', '_', (string) CFactory::_('Component')->get('component_version')
- ) . '__J' . CFactory::_('Config')->joomla_version;
- $this->componentFolderName = 'com_'
- . CFactory::_('Component')->get('name_code') . '_v' . str_replace(
- '.', '_', (string) CFactory::_('Component')->get('component_version')
- ) . '__J' . CFactory::_('Config')->joomla_version;
- // set component folder path
- $this->componentPath = CFactory::_('Config')->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
- . $this->componentFolderName;
- // set the template path for custom
- $this->templatePathCustom = $this->params->get(
- 'custom_folder_path', JPATH_COMPONENT_ADMINISTRATOR . '/custom'
- );
// make sure there is no old build
- $this->removeFolder($this->componentPath);
+ CFactory::_('Utilities.Folder')->remove(CFactory::_('Utilities.Paths')->component_path);
// load the libraries files/folders and url's
- $this->setLibraries();
+ CFactory::_('Library.Builder')->run();
// load the powers files/folders
- $this->buildPowers();
+ CFactory::_('Power.Builder')->run();
// load the module files/folders and url's
- $this->buildModules();
+ CFactory::_('Joomlamodule.Builder')->run();
// load the plugin files/folders and url's
- $this->buildPlugins();
+ CFactory::_('Joomlaplugin.Builder')->run();
// set the Joomla Version Data
$this->joomlaVersionData = $this->setJoomlaVersionData();
// for plugin event TODO change event api signatures
@@ -491,1276 +477,55 @@ class Structure extends Get
* Build the Powers files, folders
*
* @return void
- *
+ * @deprecated 3.3 Use CFactory::_('Power.Builder')->run();
*/
private function buildPowers()
{
- if (ArrayHelper::check(CFactory::_('Power')->active))
- {
- // for plugin event TODO change event api signatures
- $this->powers = CFactory::_('Power')->active;
- $component_context = CFactory::_('Config')->component_context;
- // Trigger Event: jcb_ce_onBeforeSetModules
- CFactory::_('Event')->trigger(
- 'jcb_ce_onBeforeBuildPowers',
- array(&$component_context, &$this->powers)
- );
- // for plugin event TODO change event api signatures
- CFactory::_('Power')->active = $this->powers;
- // we track the creation of htaccess files
- $htaccess = array();
- foreach (CFactory::_('Power')->active as $power)
- {
- if (ObjectHelper::check($power)
- && isset($power->path)
- && StringHelper::check(
- $power->path
- ))
- {
- // activate dynamic folders
- $this->setDynamicFolders();
- // power path
- $power->full_path = $this->componentPath . '/'
- . $power->path;
- $power->full_path_jcb = $this->componentPath . '/'
- . $power->path_jcb;
- $power->full_path_parent = $this->componentPath . '/'
- . $power->path_parent;
- // set the power paths
- $this->dynamicPaths[$power->key] = $power->full_path_parent;
- // create the power folder if it does not exist
- // we do it like this to add html files to each part
- $this->createFolder($power->full_path_jcb);
- $this->createFolder($power->full_path_parent);
- $this->createFolder($power->full_path);
- // set power file
- $fileDetails = array('path' => $power->full_path . '/'
- . $power->file_name . '.php',
- 'name' => $power->file_name . '.php',
- 'zip' => $power->file_name . '.php');
- $bom = 'add_licensing_template == 2)
- {
- $bom = 'licensing_template;
- }
- $this->writeFile(
- $fileDetails['path'],
- $bom . PHP_EOL . Placefix::_h('POWERCODE')
- );
- $this->newFiles[$power->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- if (!isset($htaccess[$power->path_jcb]))
- {
- // set the htaccess data
- $data = '# Apache 2.4+' . PHP_EOL .
- '' . PHP_EOL .
- ' Require all denied' . PHP_EOL .
- '' . PHP_EOL . PHP_EOL .
- '# Apache 2.0-2.2' . PHP_EOL .
- '' . PHP_EOL .
- ' Deny from all' . PHP_EOL .
- '' . PHP_EOL;
- // now we must add the .htaccess file
- $fileDetails = array('path' => $power->full_path_jcb . '/.htaccess',
- 'name' => '.htaccess',
- 'zip' => '.htaccess');
- $this->writeFile(
- $fileDetails['path'], $data
- );
- $this->newFiles[$power->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // now we must add the htaccess.txt file where the zip package my not get the [.] files
- $fileDetails = array('path' => $power->full_path_jcb . '/htaccess.txt',
- 'name' => 'htaccess.txt',
- 'zip' => 'htaccess.txt');
- $this->writeFile(
- $fileDetails['path'], $data
- );
- $this->newFiles[$power->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // now we must add the web.config file
- $fileDetails = array('path' => $power->full_path_jcb . '/web.config',
- 'name' => 'web.config',
- 'zip' => 'web.config');
- $this->writeFile(
- $fileDetails['path'],
- '' . PHP_EOL .
- ' ' . PHP_EOL .
- ' ' . PHP_EOL .
- ' ' . PHP_EOL .
- ' ' . PHP_EOL .
- ' ' . PHP_EOL .
- '' . PHP_EOL
- );
- $this->newFiles[$power->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // we set these files only once
- $htaccess[$power->path_jcb] = true;
- }
- }
- }
- }
+ CFactory::_('Power.Builder')->run();
}
/**
* Build the Modules files, folders, url's and config
*
* @return void
- *
+ * @deprecated 3.3 Use CFactory::_('Joomlamodule.Builder')->run();
*/
private function buildModules()
{
- if (CFactory::_('Joomlamodule.Data')->exists())
- {
- // for plugin event TODO change event api signatures
- $component_context = CFactory::_('Config')->component_context;
- $modules = CFactory::_('Joomlamodule.Data')->get();
- // Trigger Event: jcb_ce_onBeforeSetModules
- CFactory::_('Event')->trigger(
- 'jcb_ce_onBeforeBuildModules',
- array(&$component_context, &$modules)
- );
- foreach ($modules as $module)
- {
- if (ObjectHelper::check($module)
- && isset($module->folder_name)
- && StringHelper::check(
- $module->folder_name
- ))
- {
- // module path
- $module->folder_path = CFactory::_('Config')->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
- . $module->folder_name;
- // set the module paths
- $this->dynamicPaths[$module->key] = $module->folder_path;
- // make sure there is no old build
- $this->removeFolder($module->folder_path);
- // creat the main module folder
- $this->createFolder($module->folder_path);
- // set main mod file
- $fileDetails = array('path' => $module->folder_path . '/'
- . $module->file_name . '.php',
- 'name' => $module->file_name . '.php',
- 'zip' => $module->file_name . '.php');
- $this->writeFile(
- $fileDetails['path'],
- 'newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // set custom_get
- if ($module->custom_get)
- {
- $fileDetails = array('path' => $module->folder_path
- . '/data.php',
- 'name' => 'data.php',
- 'zip' => 'data.php');
- $this->writeFile(
- $fileDetails['path'],
- 'official_name . ' Data'
- . PHP_EOL .
- ' */' . PHP_EOL .
- "class " . $module->class_data_name
- . ' extends \JObject' . PHP_EOL .
- "{" . Placefix::_h('DYNAMICGETS') . "}"
- . PHP_EOL
- );
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // set helper file
- if ($module->add_class_helper >= 1)
- {
- $fileDetails = array('path' => $module->folder_path
- . '/helper.php',
- 'name' => 'helper.php',
- 'zip' => 'helper.php');
- $this->writeFile(
- $fileDetails['path'],
- 'newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // set main xml file
- $fileDetails = array('path' => $module->folder_path . '/'
- . $module->file_name . '.xml',
- 'name' => $module->file_name . '.xml',
- 'zip' => $module->file_name . '.xml');
- $this->writeFile(
- $fileDetails['path'],
- $this->getModuleXMLTemplate($module)
- );
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // set tmpl folder
- $this->createFolder($module->folder_path . '/tmpl');
- // set default file
- $fileDetails = array('path' => $module->folder_path
- . '/tmpl/default.php',
- 'name' => 'default.php',
- 'zip' => 'tmpl/default.php');
- $this->writeFile(
- $fileDetails['path'],
- 'newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // set install script if needed
- if ($module->add_install_script)
- {
- $fileDetails = array('path' => $module->folder_path
- . '/script.php',
- 'name' => 'script.php',
- 'zip' => 'script.php');
- $this->writeFile(
- $fileDetails['path'],
- 'newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // set readme if found
- if ($module->addreadme)
- {
- $fileDetails = array('path' => $module->folder_path
- . '/README.md',
- 'name' => 'README.md',
- 'zip' => 'README.md');
- $this->writeFile($fileDetails['path'], $module->readme);
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // set the folders target path
- $target_path = '';
- if ($module->target_client === 'administrator')
- {
- $target_path = '/administrator';
- }
- // check if we have custom fields needed for scripts
- $module->add_scripts_field = false;
- $field_script_bucket = array();
- // add any css from the fields
- if (($css = CFactory::_('Customcode.Dispenser')->get(
- 'css_view', $module->key
- )) !== null
- && StringHelper::check($css))
- {
- // make sure this script does not have PHP
- if (strpos((string) $css, 'add_scripts_field = true;
- // create the css folder
- $this->createFolder($module->folder_path . '/css');
- // add the CSS file
- $fileDetails = array('path' => $module->folder_path
- . '/css/mod_admin.css',
- 'name' => 'mod_admin.css',
- 'zip' => 'mod_admin.css');
- $this->writeFile(
- $fileDetails['path'],
- Placefix::_h('BOM') . PHP_EOL
- . PHP_EOL . $css
- );
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // add the field script
- $field_script_bucket[] = Indent::_(2) . "//"
- . Line::_(__Line__, __Class__) . " Custom CSS";
- $field_script_bucket[] = Indent::_(2)
- . "\$document->addStyleSheet('" . $target_path
- . "/modules/" . $module->folder_name
- . "/css/mod_admin.css', ['version' => 'auto', 'relative' => true]);";
- }
- }
- // add any JavaScript from the fields
- if (($javascript = CFactory::_('Customcode.Dispenser')->get(
- 'view_footer', $module->key
- )) !== null
- && StringHelper::check($javascript))
- {
- // make sure this script does not have PHP
- if (strpos((string) $javascript, 'add_scripts_field = true;
- // add the JavaScript file
- $this->createFolder($module->folder_path . '/js');
- // add the CSS file
- $fileDetails = array('path' => $module->folder_path
- . '/js/mod_admin.js',
- 'name' => 'mod_admin.js',
- 'zip' => 'mod_admin.js');
- $this->writeFile(
- $fileDetails['path'],
- Placefix::_h('BOM') . PHP_EOL
- . PHP_EOL . $javascript
- );
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // add the field script
- $field_script_bucket[] = Indent::_(2) . "//"
- . Line::_(__Line__, __Class__) . " Custom JS";
- $field_script_bucket[] = Indent::_(2)
- . "\$document->addScript('" . $target_path
- . "/modules/" . $module->folder_name
- . "/js/mod_admin.js', ['version' => 'auto', 'relative' => true]);";
- }
- }
- // set fields folders if needed
- if ($module->add_scripts_field
- || (isset($module->fields_rules_paths)
- && $module->fields_rules_paths == 2))
- {
- // create fields folder
- $this->createFolder($module->folder_path . '/fields');
- // add the custom script field
- if ($module->add_scripts_field)
- {
- $fileDetails = array('path' => $module->folder_path
- . '/fields/modadminvvvvvvvdm.php',
- 'name' => 'modadminvvvvvvvdm.php',
- 'zip' => 'modadminvvvvvvvdm.php');
- $this->writeFile(
- $fileDetails['path'],
- $this->getModAdminVvvvvvvdm(
- $field_script_bucket
- )
- );
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- // set rules folders if needed
- if (isset($module->fields_rules_paths)
- && $module->fields_rules_paths == 2)
- {
- // create rules folder
- $this->createFolder($module->folder_path . '/rules');
- }
- // set forms folder if needed
- if (isset($module->form_files)
- && ArrayHelper::check(
- $module->form_files
- ))
- {
- // create forms folder
- $this->createFolder($module->folder_path . '/forms');
- // set the template files
- foreach ($module->form_files as $file => $fields)
- {
- // set file details
- $fileDetails = array('path' => $module->folder_path
- . '/forms/' . $file . '.xml',
- 'name' => $file . '.xml',
- 'zip' => 'forms/' . $file
- . '.xml');
- // build basic XML
- $xml = '';
- $xml .= PHP_EOL . '';
- // search if we must add the component path
- $add_component_path = false;
- foreach ($fields as $field_name => $fieldsets)
- {
- if (!$add_component_path)
- {
- foreach ($fieldsets as $fieldset => $field)
- {
- if (!$add_component_path
- && isset(
- $module->fieldsets_paths[$file
- . $field_name . $fieldset]
- )
- && $module->fieldsets_paths[$file
- . $field_name . $fieldset] == 1)
- {
- $add_component_path = true;
- }
- }
- }
- }
- // only add if part of the component field types path is required
- if ($add_component_path)
- {
- $xml .= PHP_EOL . '';
- // add xml to file
- $this->writeFile($fileDetails['path'], $xml);
- $this->newFiles[$module->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- // set SQL stuff if needed
- if ($module->add_sql || $module->add_sql_uninstall)
- {
- // create SQL folder
- $this->createFolder($module->folder_path . '/sql');
- // create mysql folder
- $this->createFolder(
- $module->folder_path . '/sql/mysql'
- );
- // now set the install file
- if ($module->add_sql)
- {
- $this->writeFile(
- $module->folder_path . '/sql/mysql/install.sql',
- $module->sql
- );
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // now set the uninstall file
- if ($module->add_sql_uninstall)
- {
- $this->writeFile(
- $module->folder_path
- . '/sql/mysql/uninstall.sql',
- $module->sql_uninstall
- );
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- // creat the language folder
- $this->createFolder($module->folder_path . '/language');
- // also create the lang tag folder
- $this->createFolder(
- $module->folder_path . '/language/' . CFactory::_('Config')->get('lang_tag', 'en-GB')
- );
- // check if this lib has files
- if (isset($module->files)
- && ArrayHelper::check($module->files))
- {
- // add to component files
- foreach ($module->files as $file)
- {
- // set the pathfinder
- $file['target_type'] = $module->target_type;
- $file['target_id'] = $module->id;
- CFactory::_('Component')->appendArray('files', $file);
- }
- }
- // check if this lib has folders
- if (isset($module->folders)
- && ArrayHelper::check($module->folders))
- {
- // add to component folders
- foreach ($module->folders as $folder)
- {
- // set the pathfinder
- $folder['target_type'] = $module->target_type;
- $folder['target_id'] = $module->id;
- CFactory::_('Component')->appendArray('folders', $folder);
- }
- }
- // check if this module has urls
- if (isset($module->urls)
- && ArrayHelper::check($module->urls))
- {
- // add to component urls
- foreach ($module->urls as $n => &$url)
- {
- // should we add the local folder
- if (isset($url['type']) && $url['type'] > 1
- && isset($url['url'])
- && StringHelper::check(
- $url['url']
- ))
- {
- // set file name
- $fileName = basename((string) $url['url']);
- // get the file contents
- $data = FileHelper::getContent(
- $url['url']
- );
- // build sub path
- if (strpos($fileName, '.js') !== false)
- {
- $path = '/js';
- }
- elseif (strpos($fileName, '.css') !== false)
- {
- $path = '/css';
- }
- else
- {
- $path = '';
- }
- // create sub media path if not set
- $this->createFolder(
- $module->folder_path . $path
- );
- // set the path to module file
- $url['path'] = $module->folder_path . $path
- . '/' . $fileName; // we need this for later
- // write data to path
- $this->writeFile($url['path'], $data);
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- }
- }
- }
- }
+ CFactory::_('Joomlamodule.Builder')->run();
}
/**
* Build the Plugins files, folders, url's and config
*
* @return void
- *
+ * @deprecated 3.3 Use CFactory::_('Joomlaplugin.Builder')->run();
*/
private function buildPlugins()
{
- if (CFactory::_('Joomlaplugin.Data')->exists())
- {
- // for plugin event TODO change event api signatures
- $component_context = CFactory::_('Config')->component_context;
- $plugins = CFactory::_('Joomlaplugin.Data')->get();
- // Trigger Event: jcb_ce_onBeforeSetPlugins
- CFactory::_('Event')->trigger(
- 'jcb_ce_onBeforeBuildPlugins',
- array(&$component_context, &$plugins)
- );
- foreach ($plugins as $plugin)
- {
- if (ObjectHelper::check($plugin)
- && isset($plugin->folder_name)
- && StringHelper::check(
- $plugin->folder_name
- ))
- {
- // plugin path
- $plugin->folder_path = CFactory::_('Config')->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
- . $plugin->folder_name;
- // set the plugin paths
- $this->dynamicPaths[$plugin->key] = $plugin->folder_path;
- // make sure there is no old build
- $this->removeFolder($plugin->folder_path);
- // creat the main component folder
- $this->createFolder($plugin->folder_path);
- // set main class file
- $fileDetails = array('path' => $plugin->folder_path . '/'
- . $plugin->file_name . '.php',
- 'name' => $plugin->file_name . '.php',
- 'zip' => $plugin->file_name . '.php');
- $this->writeFile(
- $fileDetails['path'],
- 'newFiles[$plugin->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // set main xml file
- $fileDetails = array('path' => $plugin->folder_path . '/'
- . $plugin->file_name . '.xml',
- 'name' => $plugin->file_name . '.xml',
- 'zip' => $plugin->file_name . '.xml');
- $this->writeFile(
- $fileDetails['path'],
- $this->getPluginXMLTemplate($plugin)
- );
- $this->newFiles[$plugin->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- // set install script if needed
- if ($plugin->add_install_script)
- {
- $fileDetails = array('path' => $plugin->folder_path
- . '/script.php',
- 'name' => 'script.php',
- 'zip' => 'script.php');
- $this->writeFile(
- $fileDetails['path'],
- 'newFiles[$plugin->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // set readme if found
- if ($plugin->addreadme)
- {
- $fileDetails = array('path' => $plugin->folder_path
- . '/README.md',
- 'name' => 'README.md',
- 'zip' => 'README.md');
- $this->writeFile($fileDetails['path'], $plugin->readme);
- $this->newFiles[$plugin->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // set fields & rules folders if needed
- if (isset($plugin->fields_rules_paths)
- && $plugin->fields_rules_paths == 2)
- {
- // create fields folder
- $this->createFolder($plugin->folder_path . '/fields');
- // create rules folder
- $this->createFolder($plugin->folder_path . '/rules');
- }
- // set forms folder if needed
- if (isset($plugin->form_files)
- && ArrayHelper::check(
- $plugin->form_files
- ))
- {
- // create forms folder
- $this->createFolder($plugin->folder_path . '/forms');
- // set the template files
- foreach ($plugin->form_files as $file => $fields)
- {
- // set file details
- $fileDetails = array('path' => $plugin->folder_path
- . '/forms/' . $file . '.xml',
- 'name' => $file . '.xml',
- 'zip' => 'forms/' . $file
- . '.xml');
- // biuld basic XML
- $xml = '';
- $xml .= PHP_EOL . '';
- // search if we must add the component path
- $add_component_path = false;
- foreach ($fields as $field_name => $fieldsets)
- {
- if (!$add_component_path)
- {
- foreach ($fieldsets as $fieldset => $field)
- {
- if (!$add_component_path
- && isset(
- $plugin->fieldsets_paths[$file
- . $field_name . $fieldset]
- )
- && $plugin->fieldsets_paths[$file
- . $field_name . $fieldset] == 1)
- {
- $add_component_path = true;
- }
- }
- }
- }
- // only add if part of the component field types path is required
- if ($add_component_path)
- {
- $xml .= PHP_EOL . '';
- // add xml to file
- $this->writeFile($fileDetails['path'], $xml);
- $this->newFiles[$plugin->key][] = $fileDetails;
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- // set SQL stuff if needed
- if ($plugin->add_sql || $plugin->add_sql_uninstall)
- {
- // create SQL folder
- $this->createFolder($plugin->folder_path . '/sql');
- // create mysql folder
- $this->createFolder(
- $plugin->folder_path . '/sql/mysql'
- );
- // now set the install file
- if ($plugin->add_sql)
- {
- $this->writeFile(
- $plugin->folder_path . '/sql/mysql/install.sql',
- $plugin->sql
- );
- // count the file created
- CFactory::_('Counter')->file++;
- }
- // now set the uninstall file
- if ($plugin->add_sql_uninstall)
- {
- $this->writeFile(
- $plugin->folder_path
- . '/sql/mysql/uninstall.sql',
- $plugin->sql_uninstall
- );
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- // creat the language folder path
- $this->createFolder($plugin->folder_path . '/language');
- // also creat the lang tag folder path
- $this->createFolder(
- $plugin->folder_path . '/language/' . CFactory::_('Config')->get('lang_tag', 'en-GB')
- );
- // check if this lib has files
- if (isset($plugin->files)
- && ArrayHelper::check($plugin->files))
- {
- // add to component files
- foreach ($plugin->files as $file)
- {
- // set the path finder
- $file['target_type'] = $plugin->target_type;
- $file['target_id'] = $plugin->id;
- CFactory::_('Component')->appendArray('files', $file);
- }
- }
- // check if this lib has folders
- if (isset($plugin->folders)
- && ArrayHelper::check($plugin->folders))
- {
- // add to component folders
- foreach ($plugin->folders as $folder)
- {
- // set the path finder
- $folder['target_type'] = $plugin->target_type;
- $folder['target_id'] = $plugin->id;
- CFactory::_('Component')->appendArray('folders', $folder);
- }
- }
- // check if this plugin has urls
- if (isset($plugin->urls)
- && ArrayHelper::check($plugin->urls))
- {
- // add to component urls
- foreach ($plugin->urls as $n => &$url)
- {
- // should we add the local folder
- if (isset($url['type']) && $url['type'] > 1
- && isset($url['url'])
- && StringHelper::check(
- $url['url']
- ))
- {
- // set file name
- $fileName = basename((string) $url['url']);
- // get the file contents
- $data = FileHelper::getContent(
- $url['url']
- );
- // build sub path
- if (strpos($fileName, '.js') !== false)
- {
- $path = '/js';
- }
- elseif (strpos($fileName, '.css') !== false)
- {
- $path = '/css';
- }
- else
- {
- $path = '';
- }
- // create sub media media folder path if not set
- $this->createFolder(
- $plugin->folder_path . $path
- );
- // set the path to plugin file
- $url['path'] = $plugin->folder_path . $path
- . '/' . $fileName; // we need this for later
- // write data to path
- $this->writeFile($url['path'], $data);
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- }
- }
- }
- }
+ CFactory::_('Joomlaplugin.Builder')->run();
}
/**
* Create Path if not exist
*
* @return void
+ * @deprecated 3.3 Use CFactory::_('Utilities.Folder')->create($path);
*/
private function createFolder($path)
{
- // check if the path exist
- if (!Folder::exists(
- $path
- ))
- {
- // create the path
- Folder::create(
- $path
- );
- // count the folder created
- CFactory::_('Counter')->folder++;
- // add index.html (boring I know)
- $this->indexHTML(
- $path, ''
- );
- }
+ CFactory::_('Utilities.Folder')->create($path);
}
/**
* Build the Libraries files, folders, url's and config
*
* @return void
- *
+ * @deprecated 3.3 Use CFactory::_('Library.Builder')->run();
*/
private function setLibraries()
{
- if (($libraries_ = CFactory::_('Registry')->get('builder.libraries')) !== null)
- {
- // for plugin event TODO change event api signatures
- $component_context = CFactory::_('Config')->component_context;
- // Trigger Event: jcb_ce_onBeforeSetLibraries
- CFactory::_('Event')->trigger(
- 'jcb_ce_onBeforeSetLibraries',
- array(&$component_context, &$libraries_)
- );
- // creat the main component folder
- if (!Folder::exists($this->componentPath))
- {
- Folder::create($this->componentPath);
- // count the folder created
- CFactory::_('Counter')->folder++;
- $this->indexHTML('');
- }
- // create media path if not set
- $this->createFolder($this->componentPath . '/media');
- foreach ($libraries_ as $id => &$library)
- {
- if (ObjectHelper::check($library))
- {
- // check if this lib has files
- if (isset($library->files)
- && ArrayHelper::check($library->files))
- {
- // add to component files
- foreach ($library->files as $file)
- {
- CFactory::_('Component')->appendArray('files', $file);
- }
- }
- // check if this lib has folders
- if (isset($library->folders)
- && ArrayHelper::check(
- $library->folders
- ))
- {
- // add to component folders
- foreach ($library->folders as $folder)
- {
- CFactory::_('Component')->appendArray('folders', $folder);
- }
- }
- // check if this lib has urls
- if (isset($library->urls)
- && ArrayHelper::check($library->urls))
- {
- // build media folder path
- $libFolder = strtolower(
- preg_replace(
- '/\s+/', '-',
- (string) StringHelper::safe(
- $library->name, 'filename', ' ', false
- )
- )
- );
- $mediaPath = '/media/' . $libFolder;
- // should we add the local folder
- $addLocalFolder = false;
- // add to component urls
- foreach ($library->urls as $n => &$url)
- {
- if (isset($url['type']) && $url['type'] > 1
- && isset($url['url'])
- && StringHelper::check(
- $url['url']
- ))
- {
- // create media/lib path if not set
- $this->createFolder(
- $this->componentPath . $mediaPath
- );
- // add local folder
- $addLocalFolder = true;
- // set file name
- $fileName = basename((string) $url['url']);
- // get the file contents
- $data = FileHelper::getContent(
- $url['url']
- );
- // build sub path
- if (strpos($fileName, '.js') !== false)
- {
- $path = '/js';
- }
- elseif (strpos($fileName, '.css') !== false)
- {
- $path = '/css';
- }
- else
- {
- $path = '';
- }
- // create sub media path if not set
- $this->createFolder(
- $this->componentPath . $mediaPath . $path
- );
- // set the path to library file
- $url['path'] = $mediaPath . $path . '/'
- . $fileName; // we need this for later
- // set full path
- $path = $this->componentPath . $url['path'];
- // write data to path
- $this->writeFile($path, $data);
- // count the file created
- CFactory::_('Counter')->file++;
- }
- }
- // only add if local
- if ($addLocalFolder)
- {
- // add folder to xml of media folders
- CFactory::_('Content')->add('EXSTRA_MEDIA_FOLDERS',
- PHP_EOL . Indent::_(2) . ""
- . $libFolder . "");
- }
- }
- // if config fields are found load into component config (avoiding duplicates)
- if (isset($library->how) && $library->how > 1
- && isset($library->config)
- && ArrayHelper::check($library->config))
- {
- foreach ($library->config as $cofig)
- {
- $found = array_filter(
- CFactory::_('Component')->get('config'),
- fn($item) => $item['field'] == $cofig['field']
- );
- // set the config data if not found
- if (!ArrayHelper::check($found))
- {
- CFactory::_('Component')->appendArray('config', $cofig);
- }
- }
- }
- // update the global value just in case for now
- CFactory::_('Registry')->set("builder.libraries.$id", $library);
- }
- }
- }
+ CFactory::_('Library.Builder')->run();
}
/**
@@ -1923,30 +688,30 @@ class Structure extends Get
))
{
// creat the main component folder
- if (!Folder::exists($this->componentPath))
+ if (!Folder::exists(CFactory::_('Utilities.Paths')->component_path))
{
- Folder::create($this->componentPath);
+ Folder::create(CFactory::_('Utilities.Paths')->component_path);
// count the folder created
- CFactory::_('Counter')->folder++;
- $this->indexHTML('');
+ CFactory::_('Utilities.Counter')->folder++;
+ CFactory::_('Utilities.File')->html('');
}
// now build all folders needed for this component
foreach ($this->joomlaVersionData->create as $main => $folders)
{
- $this->createFolder($this->componentPath . '/' . $main);
+ CFactory::_('Utilities.Folder')->create(CFactory::_('Utilities.Paths')->component_path . '/' . $main);
if (ObjectHelper::check($folders))
{
foreach ($folders as $sub => $subFolders)
{
- $this->createFolder(
- $this->componentPath . '/' . $main . '/' . $sub
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path . '/' . $main . '/' . $sub
);
if (ObjectHelper::check($subFolders))
{
foreach ($subFolders as $sub_2 => $subFolders_2)
{
- $this->createFolder(
- $this->componentPath . '/' . $main . '/'
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path . '/' . $main . '/'
. $sub . '/' . $sub_2
);
if (ObjectHelper::check(
@@ -1957,8 +722,8 @@ class Structure extends Get
$subFolders_2 as $sub_3 => $subFolders_3
)
{
- $this->createFolder(
- $this->componentPath . '/' . $main
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path . '/' . $main
. '/' . $sub . '/' . $sub_2 . '/'
. $sub_3
);
@@ -1971,8 +736,8 @@ class Structure extends Get
$subFolders_4
)
{
- $this->createFolder(
- $this->componentPath . '/'
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path . '/'
. $main . '/' . $sub . '/'
. $sub_2 . '/' . $sub_3
. '/' . $sub_4
@@ -1986,8 +751,8 @@ class Structure extends Get
=> $subFolders_5
)
{
- $this->createFolder(
- $this->componentPath
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path
. '/' . $main . '/'
. $sub . '/'
. $sub_2 . '/'
@@ -2005,8 +770,8 @@ class Structure extends Get
$subFolders_6
)
{
- $this->createFolder(
- $this->componentPath
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path
. '/'
. $main
. '/'
@@ -2034,8 +799,8 @@ class Structure extends Get
$subFolders_7
)
{
- $this->createFolder(
- $this->componentPath
+ CFactory::_('Utilities.Folder')->create(
+ CFactory::_('Utilities.Paths')->component_path
. '/'
. $main
. '/'
@@ -2155,7 +920,7 @@ class Structure extends Get
);
$path = str_replace(
$details->_target['type'] . '/',
- $this->dynamicPaths[$details->_target['key']] . '/',
+ CFactory::_('Registry')->get('dynamic_paths.' . $details->_target['key'], '') . '/',
(string) $details->path
);
}
@@ -2164,13 +929,13 @@ class Structure extends Get
// set destination path
$zipPath = str_replace('c0mp0n3nt/', '', (string) $details->path);
$path = str_replace(
- 'c0mp0n3nt/', $this->componentPath . '/', (string) $details->path
+ 'c0mp0n3nt/', CFactory::_('Utilities.Paths')->component_path . '/', (string) $details->path
);
}
// set the template folder path
$templatePath = (isset($details->custom) && $details->custom)
- ? (($details->custom !== 'full') ? $this->templatePathCustom
- . '/' : '') : $this->templatePath . '/';
+ ? (($details->custom !== 'full') ? CFactory::_('Utilities.Paths')->template_path_custom
+ . '/' : '') : CFactory::_('Utilities.Paths')->template_path . '/';
// set the final paths
$currentFullPath = (preg_match('/^[a-z]:/i', (string) $item)) ? $item
: $templatePath . '/' . $item;
@@ -2208,23 +973,29 @@ class Structure extends Get
// move the file to its place
File::copy($currentFullPath, $packageFullPath);
// count the file created
- CFactory::_('Counter')->file++;
+ CFactory::_('Utilities.Counter')->file++;
// store the new files
if (!in_array($ftem, $this->notNew))
{
if (isset($details->_target))
{
- $this->newFiles[$details->_target['key']][]
- = array('path' => $packageFullPath,
- 'name' => $new,
- 'zip' => $zipFullPath);
+ CFactory::_('Utilities.Files')->appendArray($details->_target['key'],
+ [
+ 'path' => $packageFullPath,
+ 'name' => $new,
+ 'zip' => $zipFullPath
+ ]
+ );
}
else
{
- $this->newFiles['static'][]
- = array('path' => $packageFullPath,
- 'name' => $new,
- 'zip' => $zipFullPath);
+ CFactory::_('Utilities.Files')->appendArray('static',
+ [
+ 'path' => $packageFullPath,
+ 'name' => $new,
+ 'zip' => $zipFullPath
+ ]
+ );
}
}
// ensure we update this file if needed
@@ -2261,7 +1032,7 @@ class Structure extends Get
$currentFullPath, $packageFullPath, '', true
);
// count the folder created
- CFactory::_('Counter')->folder++;
+ CFactory::_('Utilities.Counter')->folder++;
}
}
// only add if no target found since those belong to plugins and modules
@@ -2503,13 +1274,13 @@ class Structure extends Get
{
// check files exist
if (File::exists(
- $this->componentPath . '/admin/models/fields/'
+ CFactory::_('Utilities.Paths')->component_path . '/admin/models/fields/'
. $field['type_name'] . '.php'
))
{
// copy the custom field
File::copy(
- $this->componentPath . '/admin/models/fields/'
+ CFactory::_('Utilities.Paths')->component_path . '/admin/models/fields/'
. $field['type_name'] . '.php',
$path . '/fields/' . $field['type_name'] . '.php'
);
@@ -2530,14 +1301,14 @@ class Structure extends Get
{
// check files exist
if (File::exists(
- $this->componentPath . '/admin/models/rules/'
+ CFactory::_('Utilities.Paths')->component_path . '/admin/models/rules/'
. CFactory::_('Registry')->get('validation.linked.' . $field['field'])
. '.php'
))
{
// copy the custom field
File::copy(
- $this->componentPath . '/admin/models/rules/'
+ CFactory::_('Utilities.Paths')->component_path . '/admin/models/rules/'
. CFactory::_('Registry')->get('validation.linked.' . $field['field'])
. '.php', $path . '/rules/'
. CFactory::_('Registry')->get('validation.linked.' . $field['field'])
@@ -2780,7 +1551,7 @@ class Structure extends Get
{
$zipPath = str_replace('c0mp0n3nt/', '', (string) $path);
$path = str_replace(
- 'c0mp0n3nt/', $this->componentPath . '/', (string) $path
+ 'c0mp0n3nt/', CFactory::_('Utilities.Paths')->component_path . '/', (string) $path
);
}
else
@@ -2798,9 +1569,9 @@ class Structure extends Get
if (!Folder::exists($path))
{
Folder::create($path);
- $this->indexHTML($zipPath);
+ CFactory::_('Utilities.File')->html($zipPath);
// count the folder created
- CFactory::_('Counter')->folder++;
+ CFactory::_('Utilities.Counter')->folder++;
}
// do the file renaming
if ($details->rename)
@@ -2831,11 +1602,16 @@ class Structure extends Get
{
// move the file to its place
File::copy(
- $this->templatePath . '/' . $item,
+ CFactory::_('Utilities.Paths')->template_path . '/' . $item,
$path . '/' . $new
);
// count the file created
- CFactory::_('Counter')->file++;
+ CFactory::_('Utilities.Counter')->file++;
+ }
+ // we can't have dots in a file name (oops)
+ if (strpos($name, '.') !== false)
+ {
+ $name = preg_replace('/[\.]+/', '_', (string) $name);
}
// setup array for new file
$newFIle = array('path' => $path . '/' . $new,
@@ -2846,7 +1622,7 @@ class Structure extends Get
$newFIle['config'] = $config;
}
// store the new files
- $this->newFiles['dynamic'][$name][] = $newFIle;
+ CFactory::_('Utilities.Files')->appendArray('dynamic.' . $name, $newFIle);
// we have build atleast one
$build_status = true;
}
@@ -2866,7 +1642,7 @@ class Structure extends Get
private function setJoomlaVersionData()
{
// option to load other settings
- $custom_settings = $this->templatePath . '/settings_' . CFactory::_('Config')->component_code_name . '.json';
+ $custom_settings = CFactory::_('Utilities.Paths')->template_path . '/settings_' . CFactory::_('Config')->component_code_name . '.json';
// set the version data
if (File::exists($custom_settings))
{
@@ -2880,7 +1656,7 @@ class Structure extends Get
{
$version_data = json_decode(
(string) FileHelper::getContent(
- $this->templatePath . '/settings.json'
+ CFactory::_('Utilities.Paths')->template_path . '/settings.json'
)
);
}
@@ -3178,10 +1954,10 @@ class Structure extends Get
protected function setDynamicFolders()
{
// check if we should add the dynamic folder moving script to the installer script
- if (!$this->setMoveFolders)
+ if (!CFactory::_('Registry')->get('set_move_folders_install_script'))
{
// add the setDynamicF0ld3rs() method to the install scipt.php file
- $this->setMoveFolders = true;
+ CFactory::_('Registry')->set('set_move_folders_install_script', true);
// set message that this was done (will still add a tutorial link later)
$this->app->enqueueMessage(
JText::_(
@@ -3202,32 +1978,12 @@ class Structure extends Get
* @param string $path The path to place the index.html file in
*
* @return void
+ * @deprecated 3.3 Use CFactory::_('Utilities.File')->write($path, $root);
*
*/
private function indexHTML($path, $root = 'component')
{
- if ('component' === $root)
- {
- $root = $this->componentPath . '/';
- }
- // use path if exist
- if (strlen($path) > 0)
- {
- File::copy(
- $this->templatePath . '/index.html',
- $root . $path . '/index.html'
- );
- // count the file created
- CFactory::_('Counter')->file++;
- }
- else
- {
- File::copy(
- $this->templatePath . '/index.html', $root . '/index.html'
- );
- // count the file created
- CFactory::_('Counter')->file++;
- }
+ CFactory::_('Utilities.File')->write($path, $root);
}
/**
@@ -3254,11 +2010,11 @@ class Structure extends Get
* @param boolean $ignore The files and folders to ignore
*
* @return boolean True if all is removed
- *
+ * @deprecated 3.3 Use CFactory::_('Utilities.Folder')->remove($dir, $ignore);
*/
protected function removeFolder($dir, $ignore = false)
{
- return ComponentbuilderHelper::removeFolder($dir, $ignore);
+ return CFactory::_('Utilities.Folder')->remove($dir, $ignore);
}
}
diff --git a/admin/helpers/compiler/c_Fields.php b/admin/helpers/compiler/c_Fields.php
index 7f8f30bb8..5de6f89a0 100644
--- a/admin/helpers/compiler/c_Fields.php
+++ b/admin/helpers/compiler/c_Fields.php
@@ -658,7 +658,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'readonly="true"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if created is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created']))
@@ -681,7 +681,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . "filter=" . '"user_utc"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if created_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created_by']))
@@ -701,7 +701,7 @@ class Fields extends Structure
. '_CREATED_BY_DESC"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if published is not set
if (!isset($this->fieldsNames[$nameSingleCode]['published']))
@@ -728,7 +728,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(4) . "JTRASHED";
$fieldSet[] = Indent::_(2) . "";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if modified is not set
if (!isset($this->fieldsNames[$nameSingleCode]['modified']))
@@ -743,7 +743,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3)
. 'size="22" readonly="true" format="%Y-%m-%d %H:%M:%S" filter="user_utc" />';
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if modified_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['modified_by']))
@@ -761,7 +761,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'filter="unset"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// check if view has access
if (isset($this->accessBuilder[$nameSingleCode])
@@ -784,7 +784,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'required="false"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if ordering is not set
if (!isset($this->fieldsNames[$nameSingleCode]['ordering']))
@@ -807,7 +807,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'required="false"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if version is not set
if (!isset($this->fieldsNames[$nameSingleCode]['version']))
@@ -827,7 +827,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'filter="unset"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// check if metadata is added to this view
if (isset($this->metadataBuilder[$nameSingleCode])
@@ -851,7 +851,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'cols="30"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// metadesc
if (!isset($this->fieldsNames[$nameSingleCode]['metadesc']))
@@ -869,7 +869,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(3) . 'cols="30"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
}
// fix the permissions field "title" issue gh-629
@@ -896,7 +896,7 @@ class Fields extends Structure
. $nameSingleCode . '"';
$fieldSet[] = Indent::_(2) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
// setup needed field values for layout
$field_array = array();
$field_array['order_edit'] = 0;
@@ -957,7 +957,7 @@ class Fields extends Structure
. '';
$fieldSet[] = Indent::_(3) . '';
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// author
if (!isset($this->fieldsNames[$nameSingleCode]['author']))
@@ -972,7 +972,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(4) . 'size="20"';
$fieldSet[] = Indent::_(3) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// rights
if (!isset($this->fieldsNames[$nameSingleCode]['rights']))
@@ -987,7 +987,7 @@ class Fields extends Structure
$fieldSet[] = Indent::_(4) . 'cols="30" rows="2"';
$fieldSet[] = Indent::_(3) . "/>";
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
$fieldSet[] = Indent::_(2) . "";
$fieldSet[] = Indent::_(1) . "";
@@ -1084,7 +1084,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if created is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created']))
@@ -1106,7 +1106,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if created_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['created_by']))
@@ -1125,7 +1125,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if published is not set
if (!isset($this->fieldsNames[$nameSingleCode]['published']))
@@ -1143,7 +1143,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
foreach (
array('JPUBLISHED' => 1, 'JUNPUBLISHED' => 0, 'JARCHIVED' => 2,
'JTRASHED' => -2) as $text => $value
@@ -1175,7 +1175,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if modified_by is not set
if (!isset($this->fieldsNames[$nameSingleCode]['modified_by']))
@@ -1196,7 +1196,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// check if view has access
if (isset($this->accessBuilder[$nameSingleCode])
@@ -1221,7 +1221,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if ordering is not set
if (!isset($this->fieldsNames[$nameSingleCode]['ordering']))
@@ -1244,7 +1244,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// if version is not set
if (!isset($this->fieldsNames[$nameSingleCode]['version']))
@@ -1266,7 +1266,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// check if metadata is added to this view
if (isset($this->metadataBuilder[$nameSingleCode])
@@ -1294,7 +1294,7 @@ class Fields extends Structure
$fieldXML, $attributes
);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// metadesc
if (!isset($this->fieldsNames[$nameSingleCode]['metadesc']))
@@ -1311,7 +1311,7 @@ class Fields extends Structure
$fieldXML, $attributes
);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
}
// fix the permissions field "title" issue gh-629
@@ -1346,7 +1346,7 @@ class Fields extends Structure
$fieldXML = $fieldSetXML->addChild('field');
ComponentbuilderHelper::xmlAddAttributes($fieldXML, $attributes);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
// setup needed field values for layout
$field_array = array();
$field_array['order_edit'] = 0;
@@ -1409,7 +1409,7 @@ class Fields extends Structure
$robots, $attributes
);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
$options = array(
'JGLOBAL_USE_GLOBAL' => '',
'JGLOBAL_INDEX_FOLLOW' => 'index, follow',
@@ -1443,7 +1443,7 @@ class Fields extends Structure
$author, $attributes
);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
// rights
if (!isset($this->fieldsNames[$nameSingleCode]['rights']))
@@ -1467,7 +1467,7 @@ class Fields extends Structure
$rights, $attributes
);
// count the static field created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
}
}
}
@@ -1891,7 +1891,7 @@ class Fields extends Structure
&$optionArray, $custom = null, $taber = ''
) {
// count the dynamic fields created
- CFactory::_('Counter')->field++;
+ CFactory::_('Utilities.Counter')->field++;
// check what type of field builder to use
if (CFactory::_('Config')->get('field_builder_type', 2) == 1)
{
diff --git a/admin/helpers/compiler/e_Interpretation.php b/admin/helpers/compiler/e_Interpretation.php
index 2eca6b18a..c4434e0c1 100644
--- a/admin/helpers/compiler/e_Interpretation.php
+++ b/admin/helpers/compiler/e_Interpretation.php
@@ -1234,9 +1234,10 @@ class Interpretation extends Fields
}
// stop it from being added double
$addDynamicSQL = false;
- CFactory::_('Component')->appendArray('version_update', $update_);
// add dynamic SQL
$this->setUpdateXMLSQL($update_, $updateXML, $addDynamicSQL);
+
+ CFactory::_('Component')->appendArray('version_update', $update_);
}
/**
@@ -1249,7 +1250,7 @@ class Interpretation extends Fields
public function setUpdateXMLSQL(&$update, &$updateXML, &$addDynamicSQL)
{
// ensure version naming is correct
- $update['version'] = preg_replace('/[^0-9.]+/', '', (string) $update['version']);
+ $update['version'] = preg_replace('/[^0-9\.]+/', '', (string) $update['version']);
// setup SQL
if (StringHelper::check($update['mysql']))
{
@@ -1284,7 +1285,8 @@ class Interpretation extends Fields
$name = StringHelper::safe($update['version']);
$target = array('admin' => $name);
$this->buildDynamique($target, 'sql_update', $update['version']);
- CFactory::_('Content')->set_($name . '_' . $update['version'], 'UPDATE_VERSION_MYSQL',
+ $_name = preg_replace('/[\.]+/', '_', (string) $update['version']);
+ CFactory::_('Content')->set_($name . '_' . $_name, 'UPDATE_VERSION_MYSQL',
$update['mysql']
);
}
@@ -6294,7 +6296,7 @@ class Interpretation extends Fields
if (isset($folder['rename']) && 1 == $folder['rename'])
{
if ($_paths = FileHelper::getPaths(
- $this->componentPath . $path
+ CFactory::_('Utilities.Paths')->component_path . $path
))
{
$files[$path] = $_paths;
@@ -6304,7 +6306,7 @@ class Interpretation extends Fields
{
$path = $path . '/' . trim((string)$folder['folder'], '/');
if ($_paths = FileHelper::getPaths(
- $this->componentPath . $path
+ CFactory::_('Utilities.Paths')->component_path . $path
))
{
$files[$path] = $_paths;
@@ -7087,7 +7089,7 @@ class Interpretation extends Fields
public function getReplacementNames()
{
- foreach ($this->newFiles as $type => $files)
+ foreach (CFactory::_('Utilities.Files')->toArray() as $type => $files)
{
foreach ($files as $view => $file)
{
@@ -8512,7 +8514,7 @@ class Interpretation extends Fields
public function setMoveFolderScript()
{
- if ($this->setMoveFolders)
+ if (CFactory::_('Registry')->get('set_move_folders_install_script'))
{
// reset script
$script = array();
@@ -8530,7 +8532,7 @@ class Interpretation extends Fields
public function setMoveFolderMethod()
{
- if ($this->setMoveFolders)
+ if (CFactory::_('Registry')->get('set_move_folders_install_script'))
{
// reset script
$script = array();
@@ -22535,7 +22537,7 @@ class Interpretation extends Fields
$type = ComponentbuilderHelper::imageInfo($path);
if ($type)
{
- $imagePath = $this->componentPath . '/admin/assets/images';
+ $imagePath = CFactory::_('Utilities.Paths')->component_path . '/admin/assets/images';
// move the image to its place
File::copy(
JPATH_SITE . '/' . $path,
@@ -22757,7 +22759,7 @@ class Interpretation extends Fields
$this->iconBuilder
))
{
- $imagePath = $this->componentPath
+ $imagePath = CFactory::_('Utilities.Paths')->component_path
. '/admin/assets/images/icons';
foreach ($this->iconBuilder as $icon => $path)
{
@@ -27924,20 +27926,20 @@ function vdm_dkim() {
{
Folder::create($path);
// count the folder created
- CFactory::_('Counter')->folder++;
+ CFactory::_('Utilities.Counter')->folder++;
}
// add to language files (for now we add all to both TODO)
- $this->writeFile(
+ CFactory::_('Utilities.File')->write(
$path . $file_name,
implode(PHP_EOL, $lang)
);
- $this->writeFile(
+ CFactory::_('Utilities.File')->write(
$path . $tag . '.' . $module->file_name
. '.sys.ini',
implode(PHP_EOL, $lang)
);
// set the line counter
- CFactory::_('Counter')->line += count(
+ CFactory::_('Utilities.Counter')->line += count(
(array) $lang
);
unset($lang);
@@ -28316,14 +28318,14 @@ function vdm_dkim() {
{
Folder::create($path);
// count the folder created
- CFactory::_('Counter')->folder++;
+ CFactory::_('Utilities.Counter')->folder++;
}
// add to language file
- $this->writeFile(
+ CFactory::_('Utilities.File')->write(
$path . $file_name,
implode(PHP_EOL, $lang)
);
- $this->writeFile(
+ CFactory::_('Utilities.File')->write(
$path . $tag . '.plg_' . strtolower(
(string) $plugin->group
)
@@ -28332,7 +28334,7 @@ function vdm_dkim() {
implode(PHP_EOL, $lang)
);
// set the line counter
- CFactory::_('Counter')->line += count(
+ CFactory::_('Utilities.Counter')->line += count(
(array) $lang
);
unset($lang);
diff --git a/admin/helpers/compiler/f_Infusion.php b/admin/helpers/compiler/f_Infusion.php
index d26137175..18de73afc 100644
--- a/admin/helpers/compiler/f_Infusion.php
+++ b/admin/helpers/compiler/f_Infusion.php
@@ -172,7 +172,7 @@ class Infusion extends Interpretation
CFactory::_('Content')->set('GLOBALVERSION', CFactory::_('Content')->get('VERSION'));
// set the joomla target xml version
- CFactory::_('Content')->set('XMLVERSION', $this->joomlaVersions[CFactory::_('Config')->joomla_version]['xml_version']);
+ CFactory::_('Content')->set('XMLVERSION', CFactory::_('Config')->joomla_versions[CFactory::_('Config')->joomla_version]['xml_version']);
// Component_name
$name = CFactory::_('Component')->get('name');
@@ -2095,7 +2095,7 @@ class Infusion extends Interpretation
// remove old unused language strings
$this->purgeLanuageStrings($values, CFactory::_('Config')->component_id);
// path to INI file
- $getPAth = $this->templatePath . '/en-GB.com_admin.ini';
+ $getPAth = CFactory::_('Utilities.Paths')->template_path . '/en-GB.com_admin.ini';
// for plugin event TODO change event api signatures
$component_context = CFactory::_('Config')->component_context;
// Trigger Event: jcb_ce_onBeforeBuildAllLangFiles
@@ -2143,18 +2143,18 @@ class Infusion extends Interpretation
))
{
// build the path to place the lang file
- $path = $this->componentPath . '/' . $p . '/language/'
+ $path = CFactory::_('Utilities.Paths')->component_path . '/' . $p . '/language/'
. $tag . '/';
if (!Folder::exists($path))
{
Folder::create($path);
// count the folder created
- CFactory::_('Counter')->folder++;
+ CFactory::_('Utilities.Counter')->folder++;
}
// move the file to its place
File::copy($getPAth, $path . $file_name);
// count the file created
- CFactory::_('Counter')->file++;
+ CFactory::_('Utilities.Counter')->file++;
// add content to it
$lang = array_map(
fn($langstring, $placeholder) => $placeholder . '="' . $langstring . '"',
@@ -2162,11 +2162,11 @@ class Infusion extends Interpretation
array_keys($languageStrings)
);
// add to language file
- $this->writeFile(
+ CFactory::_('Utilities.File')->write(
$path . $file_name, implode(PHP_EOL, $lang)
);
// set the line counter
- CFactory::_('Counter')->line += count(
+ CFactory::_('Utilities.Counter')->line += count(
(array) $lang
);
unset($lang);
@@ -2199,7 +2199,7 @@ class Infusion extends Interpretation
= implode(PHP_EOL . Indent::_(2), $langXML['site']);
}
// build xml path
- $xmlPath = $this->componentPath . '/' . CFactory::_('Config')->component_code_name
+ $xmlPath = CFactory::_('Utilities.Paths')->component_path . '/' . CFactory::_('Config')->component_code_name
. '.xml';
// get the content in xml
$componentXML = FileHelper::getContent(
@@ -2208,7 +2208,7 @@ class Infusion extends Interpretation
// update the xml content
$componentXML = CFactory::_('Placeholder')->update($componentXML, $replace);
// store the values back to xml
- $this->writeFile($xmlPath, $componentXML);
+ CFactory::_('Utilities.File')->write($xmlPath, $componentXML);
}
}
}
diff --git a/admin/language/en-GB/en-GB.com_componentbuilder.ini b/admin/language/en-GB/en-GB.com_componentbuilder.ini
index 46a7109b5..d5a814154 100644
--- a/admin/language/en-GB/en-GB.com_componentbuilder.ini
+++ b/admin/language/en-GB/en-GB.com_componentbuilder.ini
@@ -1318,6 +1318,7 @@ COM_COMPONENTBUILDER_AUTHOR_NAME="Author Name"
COM_COMPONENTBUILDER_AUTHOR_WEBSITE="Author Website"
COM_COMPONENTBUILDER_AUTO_CHECKIN="Auto Check-in"
COM_COMPONENTBUILDER_AVAILABLE_LIBRARIES="Available Libraries"
+COM_COMPONENTBUILDER_A_METHOD_SETDYNAMICFZEROLDTHREERS_WAS_ADDED_TO_THE_INSTALL_BSCRIPTPHPB_OF_THIS_PACKAGE_TO_INSURE_THAT_THE_FOLDERS_ARE_COPIED_INTO_THE_CORRECT_PLACE_WHEN_THIS_COMPONENT_IS_INSTALLED="A method (setDynamicF0ld3rs) was added to the install script.php of this package to insure that the folder(s) are copied into the correct place when this component is installed!"
COM_COMPONENTBUILDER_A_S_SPAN_CLASSICONFLAG_SPANREPORT_BROKEN_PACKAGEA=" Report Broken Package"
COM_COMPONENTBUILDER_BACK="Back"
COM_COMPONENTBUILDER_BACKUP="Backup"
@@ -1651,6 +1652,7 @@ COM_COMPONENTBUILDER_CLASS_PROPERTY_VERSION_DESC="A count of the number of times
COM_COMPONENTBUILDER_CLASS_PROPERTY_VERSION_LABEL="Version"
COM_COMPONENTBUILDER_CLASS_PROPERTY_VISIBILITY_DESCRIPTION="The visibility of a function/method or property can be defined by prefixing the declaration with the keywords public, protected or private. You also have the option to make function/method or property static."
COM_COMPONENTBUILDER_CLASS_PROPERTY_VISIBILITY_LABEL="Visibility"
+COM_COMPONENTBUILDER_CLEAR="Clear"
COM_COMPONENTBUILDER_CLEAR_TMP="Clear tmp"
COM_COMPONENTBUILDER_CLONE="Clone"
COM_COMPONENTBUILDER_CLONE_FAILED="Clone failed!"
@@ -5602,6 +5604,7 @@ COM_COMPONENTBUILDER_HIDE_ONLY="Hide Only"
COM_COMPONENTBUILDER_HIDE_TOGGLE="Hide Toggle"
COM_COMPONENTBUILDER_HOW_TO_GET_A_S_FREE_KEYSA_FROM_VDM="How to get free keys from VDM."
COM_COMPONENTBUILDER_HR_HTHREECUSTOM_CODES_WARNINGHTHREE="
Custom Codes Warning
"
+COM_COMPONENTBUILDER_HR_HTHREEDYNAMIC_FOLDERS_WERE_DETECTEDHTHREE="
Dynamic folder(s) were detected.
"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_ERRORHTHREE="
External Code Error
"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_NOTICEHTHREE="
External Code Notice
"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_WARNINGHTHREE="
External Code Warning
"
diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql
index ffb554af7..496c32aae 100644
--- a/admin/sql/install.mysql.utf8.sql
+++ b/admin/sql/install.mysql.utf8.sql
@@ -1973,30 +1973,30 @@ INSERT INTO `#__componentbuilder_joomla_component` (`id`, `add_license`, `licens
INSERT INTO `#__componentbuilder_power` (`id`, `add_head`, `description`, `extends`, `extends_custom`, `guid`, `head`, `implements`, `implements_custom`, `load_selection`, `main_class_code`, `method_selection`, `name`, `namespace`, `power_version`, `property_selection`, `system_name`, `type`, `use_selection`, `params`, `published`, `created`, `modified`, `version`, `ordering`) VALUES
(1, '', 'Basic shared utilities, a legacy implementation\r\n\r\n@since 3.0.9', '', '', '79d765b3-7319-4988-9730-446c7f347020', '', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBNYWluIEFjdGl2ZSBMYW5ndWFnZQ0KCSAqIA0KCSAqIEB2YXIgICAgICBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyAkbGFuZ1RhZzsNCg0KCS8qKg0KCSAqIENoZWNrIGlmIGhhdmUgYSBzdHJpbmcgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGUgc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrU3RyaW5nKCRzdHJpbmcpOiBib29sDQoJew0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBTaG9ydGVuIGEgc3RyaW5nDQoJICoNCgkgKiBAaW5wdXQgICAgc3RyaW5nICAkc3RyaW5nIFRoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2hvcnRlbg0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6c2hvcnRlbigkc3RyaW5nLCAkbGVuZ3RoLCAkYWRkVGlwKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCA9IDQwLCAkYWRkVGlwID0gdHJ1ZSkNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCwgJGFkZFRpcCk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIHN0cmluZ3Mgc2FmZSAodmFyaW91cyB3YXlzKQ0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGF0IHlvdSB3b3VsZCBsaWtlIHRvIG1ha2Ugc2FmZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6c2FmZSgkc3RyaW5nLCAkdHlwZSwgJHNwYWNlciwgJHJlcGxhY2VOdW1iZXJzLCAka2VlcE9ubHlDaGFyYWN0ZXJzKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVTdHJpbmcoJHN0cmluZywgJHR5cGUgPSAnTCcsICRzcGFjZXIgPSAnXycsICRyZXBsYWNlTnVtYmVycyA9IHRydWUsICRrZWVwT25seUNoYXJhY3RlcnMgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnNhZmUoJHN0cmluZywgJHR5cGUsICRzcGFjZXIsICRyZXBsYWNlTnVtYmVycywgJGtlZXBPbmx5Q2hhcmFjdGVycyk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgbmFtZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBDbGFzc2Z1bmN0aW9uSGVscGVyOjpzYWZlKCRuYW1lKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVDbGFzc0Z1bmN0aW9uTmFtZSgkbmFtZSkNCgl7DQoJCXJldHVybiBDbGFzc2Z1bmN0aW9uSGVscGVyOjpzYWZlKCRuYW1lKTsNCgl9DQoNCgkvKioNCgkgKiBNYWtpbmcgZmllbGQgbmFtZXMgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgeW91IHdvdWxkIGxpa2UgdG8gbWFrZSBzYWZlDQoJICogQGlucHV0CWJvb2xlYW4gICAgICBUaGUgc3dpdGNoIHRvIHJldHVybiBhbiBBTEwgVVBQRVIgQ0FTRSBzdHJpbmcNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSBzdHJpbmcgdG8gdXNlIGluIHdoaXRlIHNwYWNlDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgRmllbGRIZWxwZXI6OnNhZmUoJHN0cmluZywgJGFsbGNhcCwgJHNwYWNlcik7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlRmllbGROYW1lKCRzdHJpbmcsICRhbGxjYXAgPSBmYWxzZSwgJHNwYWNlciA9ICdfJykNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gRmllbGRIZWxwZXI6OnNhZmUoJHN0cmluZywgJGFsbGNhcCwgJHNwYWNlcik7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGZpZWxkIHR5cGUgbmFtZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBUeXBlSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZVR5cGVOYW1lKCRzdHJpbmcpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIFR5cGVIZWxwZXI6OnNhZmUoJHN0cmluZyk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIG5hbWVzcGFjZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBOYW1lc3BhY2VIZWxwZXI6OnNhZmUoJHN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlTmFtZXNwYWNlKCRzdHJpbmcpDQoJew0KCQlyZXR1cm4gTmFtZXNwYWNlSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKiANCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyYW5zbGl0ZXJhdGUoJHN0cmluZykNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjp0cmFuc2xpdGVyYXRlKCRzdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKiANCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6aHRtbCgkdmFyLCAkY2hhcnNldCwgJHNob3J0ZW4sICRsZW5ndGgpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHRtbEVzY2FwZSgkdmFyLCAkY2hhcnNldCA9ICdVVEYtOCcsICRzaG9ydGVuID0gZmFsc2UsICRsZW5ndGggPSA0MCkNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpodG1sKCR2YXIsICRjaGFyc2V0LCAkc2hvcnRlbiwgJGxlbmd0aCk7DQoJfQ0KDQoJLyoqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqIA0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgU3RyaW5nSGVscGVyOjpudW1iZXJzKCRzdHJpbmcpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZU51bWJlcnMoJHN0cmluZykNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6Om51bWJlcnMoJHN0cmluZyk7DQoJfQ0KDQoJLyoqDQoJICogQ29udmVydCBhbiBpbnRlZ2VyIGludG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqIFRoYW5rcyB0byBUb20gTmljaG9sc29uIDxodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3RydmFsLnBocCM0MTk4OD4NCgkgKg0KCSAqIEBpbnB1dCAgICBpbnQgJHggYW4gaW50DQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgYSBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6bnVtYmVyKCR4KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG51bWJlclRvU3RyaW5nKCR4KQ0KCXsNCgkJcmV0dXJuIFN0cmluZ0hlbHBlcjo6bnVtYmVyKCR4KTsNCgl9DQoNCgkvKioNCgkgKiBSYW5kb20gS2V5DQoJICoNCgkgKiBAaW5wdXQgaW50ICRzaXplIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZw0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIGEgc3RyaW5nIG9mIHJhbmRvbSBjaGFyYWN0ZXJzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBTdHJpbmdIZWxwZXI6OnJhbmRvbSgkc2l6ZSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kb21rZXkoJHNpemUpOiBzdHJpbmcNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnJhbmRvbSgkc2l6ZSk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgeW91IGhhdmUgYSBqc29uIHN0cmluZw0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyAgVGhlIGpzb24gc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgSnNvbkhlbHBlcjo6Y2hlY2soJHN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0pzb24oJHN0cmluZyk6IGJvb2wNCgl7DQoJCXJldHVybiBKc29uSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBAc2luY2UgIDMuMC45DQoJICogDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBKc29uSGVscGVyOjpzdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IsICR0YWJsZSwgJGlkLCAkbmFtZSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBqc29uVG9TdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IgPSAiLCAiLCAkdGFibGUgPSBudWxsLCAkaWQgPSAnaWQnLCAkbmFtZSA9ICduYW1lJykNCgl7DQoJCXJldHVybiBKc29uSGVscGVyOjpzdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IsICR0YWJsZSwgJGlkLCAkbmFtZSk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgeW91IGhhdmUgYW4gYXJyYXkgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIG1peGVkICRhcnJheSAgICAgICAgICAgICAgVGhlIGFycmF5IHRvIGNoZWNrDQoJICogQGlucHV0ICAgIGJvb2wgICRyZW1vdmVFbXB0eVN0cmluZyAgU2hvdWxkIHdlIHJlbW92ZSBlbXB0eSB2YWx1ZXMNCgkgKg0KCSAqIEByZXR1cm5zIGludCAgbnVtYmVyIG9mIGl0ZW1zIGluIGFycmF5IG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEFycmF5SGVscGVyOjpjaGVjaygkYXJyYXksICRyZW1vdmVFbXB0eVN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0FycmF5KCRhcnJheSwgJHJlbW92ZUVtcHR5U3RyaW5nID0gZmFsc2UpOiBpbnQNCgl7DQoJCXJldHVybiBBcnJheUhlbHBlcjo6Y2hlY2soJGFycmF5LCAkcmVtb3ZlRW1wdHlTdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIE1lcmdlIGFuIGFycmF5IG9mIGFycmF5J3MNCgkgKg0KCSAqIEBpbnB1dCAgICBtaXhlZCAgJGFycmF5cyBUaGUgYXJyYXlzIHlvdSB3b3VsZCBsaWtlIHRvIG1lcmdlDQoJICoNCgkgKiBAcmV0dXJucyBtaXhlZCBhcnJheSBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBBcnJheUhlbHBlcjo6bWVyZ2UoJGFycmF5cyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtZXJnZUFycmF5cygkYXJyYXlzKQ0KCXsNCgkJcmV0dXJuIEFycmF5SGVscGVyOjptZXJnZSgkYXJyYXlzKTsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBpZiB5b3UgaGF2ZSBhbiBvYmplY3Qgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIG9iamVjdCAkb2JqZWN0ICBUaGUgb2JqZWN0IHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgT2JqZWN0SGVscGVyOjpjaGVjaygkb2JqZWN0KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrT2JqZWN0KCRvYmplY3QpOiBib29sDQoJew0KCQlyZXR1cm4gT2JqZWN0SGVscGVyOjpjaGVjaygkb2JqZWN0KTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYSBWYXJpYWJsZSANCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0YWJsZSAgICAgICAgVGhlIHRhYmxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSB2YXJpYWJsZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR3aGVyZSAgICAgICAgVGhlIHZhbHVlIHdoZXJlDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoZXJlU3RyaW5nICBUaGUgdGFyZ2V0L2ZpZWxkIHN0cmluZyB3aGVyZS9uYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoYXQgICAgICAgICBUaGUgcmV0dXJuIGZpZWxkDQoJICogQHBhcmFtICAgc3RyaW5nICAgJG9wZXJhdG9yICAgICBUaGUgb3BlcmF0b3IgYmV0d2VlbiAkd2hlcmVTdHJpbmcvZmllbGQgYW5kICR3aGVyZS92YWx1ZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRtYWluICAgICAgICAgVGhlIGNvbXBvbmVudCBpbiB3aGljaCB0aGUgdGFibGUgaXMgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIG1peCBzdHJpbmcvaW50L2Zsb2F0DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OnZhcigkdGFibGUsICR3aGVyZSwgJHdoZXJlU3RyaW5nLCAkd2hhdCwgJG9wZXJhdG9yLCAkbWFpbik7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWYXIoJHRhYmxlLCAkd2hlcmUgPSBudWxsLCAkd2hlcmVTdHJpbmcgPSAndXNlcicsICR3aGF0ID0gJ2lkJywgJG9wZXJhdG9yID0gJz0nLCAkbWFpbiA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIEdldEhlbHBlcjo6dmFyKCR0YWJsZSwgJHdoZXJlLCAkd2hlcmVTdHJpbmcsICR3aGF0LCAkb3BlcmF0b3IsICRtYWluKTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYXJyYXkgb2YgdmFyaWFibGVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkdGFibGUgICAgICAgIFRoZSB0YWJsZSBmcm9tIHdoaWNoIHRvIGdldCB0aGUgdmFyaWFibGVzDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoZXJlICAgICAgICBUaGUgdmFsdWUgd2hlcmUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkd2hlcmVTdHJpbmcgIFRoZSB0YXJnZXQvZmllbGQgc3RyaW5nIHdoZXJlL25hbWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkd2hhdCAgICAgICAgIFRoZSByZXR1cm4gZmllbGQNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkb3BlcmF0b3IgICAgIFRoZSBvcGVyYXRvciBiZXR3ZWVuICR3aGVyZVN0cmluZy9maWVsZCBhbmQgJHdoZXJlL3ZhbHVlDQoJICogQHBhcmFtICAgc3RyaW5nICAgJG1haW4gICAgICAgICBUaGUgY29tcG9uZW50IGluIHdoaWNoIHRoZSB0YWJsZSBpcyBmb3VuZA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICR1bmlxdWUgICAgICAgVGhlIHN3aXRjaCB0byByZXR1cm4gYSB1bmlxdWUgYXJyYXkNCgkgKg0KCSAqIEByZXR1cm4gIGFycmF5DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OnZhcnMoJHRhYmxlLCAkd2hlcmUsICR3aGVyZVN0cmluZywgJHdoYXQsICRvcGVyYXRvciwgJG1haW4sICR1bmlxdWUpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmFycygkdGFibGUsICR3aGVyZSA9IG51bGwsICR3aGVyZVN0cmluZyA9ICd1c2VyJywgJHdoYXQgPSAnaWQnLCAkb3BlcmF0b3IgPSAnSU4nLCAkbWFpbiA9IG51bGwsICR1bmlxdWUgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBHZXRIZWxwZXI6OnZhcnMoJHRhYmxlLCAkd2hlcmUsICR3aGVyZVN0cmluZywgJHdoYXQsICRvcGVyYXRvciwgJG1haW4sICR1bmlxdWUpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhbGwgc3RyaW5ncyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkY29udGVudCAgICBUaGUgY29udGVudCB0byBzZWFyY2gNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkc3RhcnQgICAgICAgIFRoZSBzdGFydGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICRlbmQgICAgICAgICBUaGUgZW5kaW5nIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuICBhcnJheSAgICAgICAgICBPbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OmFsbEJldHdlZW4oJGNvbnRlbnQsICRzdGFydCwgJGVuZCk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxCZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpDQoJew0KCQlyZXR1cm4gR2V0SGVscGVyOjphbGxCZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhIHN0cmluZyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICogDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJGNvbnRlbnQgICAgVGhlIGNvbnRlbnQgdG8gc2VhcmNoDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJHN0YXJ0ICAgICAgICBUaGUgc3RhcnRpbmcgdmFsdWUNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkZW5kICAgICAgICAgVGhlIGVuZGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICRkZWZhdWx0ICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpZiBub25lIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICAgICAgICAgT24gc3VjY2VzcyAvIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OmJldHdlZW4oJGNvbnRlbnQsICRzdGFydCwgJGVuZCwgJGRlZmF1bHQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QmV0d2VlbigkY29udGVudCwgJHN0YXJ0LCAkZW5kLCAkZGVmYXVsdCA9ICcnKQ0KCXsNCgkJcmV0dXJuIEdldEhlbHBlcjo6YmV0d2VlbigkY29udGVudCwgJHN0YXJ0LCAkZW5kLCAkZGVmYXVsdCk7DQoJfQ0KDQoJLyoqDQoJICogYmMgbWF0aCB3cmFwcGVyICh2ZXJ5IGJhc2ljIG5vdCBmb3IgYWNjb3VudGluZykNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0eXBlICAgIFRoZSB0eXBlIGJjIG1hdGgNCgkgKiBAcGFyYW0gICBpbnQgICAgICAkdmFsMSAgICBUaGUgZmlyc3QgdmFsdWUNCgkgKiBAcGFyYW0gICBpbnQgICAgICAkdmFsMiAgICBUaGUgc2Vjb25kIHZhbHVlDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0fGludA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgTWF0aEhlbHBlcjo6YmMoJHR5cGUsICR2YWwxLCAkdmFsMiwgJHNjYWxlKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjbWF0aCgkdHlwZSwgJHZhbDEsICR2YWwyLCAkc2NhbGUgPSAwKQ0KCXsNCgkJcmV0dXJuIE1hdGhIZWxwZXI6OmJjKCR0eXBlLCAkdmFsMSwgJHZhbDIsICRzY2FsZSk7DQoJfQ0KDQoJLyoqDQoJICogQmFzaWMgc3VtIG9mIGFuIGFycmF5IHdpdGggbW9yZSBwcmVjaXNpb24NCgkgKg0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGFycmF5ICAgIFRoZSB2YWx1ZXMgdG8gc3VtDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0fGludA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgTWF0aEhlbHBlcjo6c3VtKCRhcnJheSwgJHNjYWxlKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjc3VtKCRhcnJheSwgJHNjYWxlID0gNCkNCgl7DQoJCXJldHVybiBNYXRoSGVscGVyOjpzdW0oJGFycmF5LCAkc2NhbGUpOw0KCX0NCg0KICAgICAgICAvKioNCiAgICAgICAgICogY3JlYXRlIHBsdWdpbiBjbGFzcyBuYW1lDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSBncm91cCBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgbmFtZQ0KCSAqDQoJICogQHJldHVybiBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFBsdWdpbkhlbHBlcjo6c2FmZSgkbmFtZSwgJGdyb3VwKTsNCiAgICAgICAgICovDQogICAgICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUGx1Z2luQ2xhc3NOYW1lKCRncm91cCwgJG5hbWUpDQoJew0KCQlyZXR1cm4gUGx1Z2luSGVscGVyOjpzYWZlQ2xhc3NOYW1lKCRuYW1lLCAkZ3JvdXApOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybnMgYSBHVUlEdjQgc3RyaW5nDQoJICogDQoJICogVGhhbmtzIHRvIERhdmUgUGVhcnNvbiAoYW5kIG90aGVyKQ0KCSAqIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmNvbS1jcmVhdGUtZ3VpZC5waHAjMTE5MTY4IA0KCSAqDQoJICogVXNlcyB0aGUgYmVzdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbWV0aG9kDQoJICogZm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zIHdpdGggZmFsbGJhY2sgdG8gYW4gb2xkZXIsDQoJICogbGVzcyBzZWN1cmUgdmVyc2lvbi4NCgkgKg0KCSAqIEBwYXJhbSBib29sICR0cmltDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgR3VpZEhlbHBlcjo6Z2V0KCR0cmltKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdVSUQoJHRyaW0gPSB0cnVlKQ0KCXsNCgkJcmV0dXJuIEd1aWRIZWxwZXI6OmdldCgkdHJpbSk7DQoJfQ0KDQoJLyoqDQoJICogVmFsaWRhdGUgdGhlIEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyICggYW5kIGNoZWNrIGlmIHRhYmxlIGFscmVhZHkgaGFzIHRoaXMgaWRlbnRpZmllcikNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJGd1aWQNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZQ0KCSAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkaWQNCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgJGNvbXBvbmVudA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHdWlkSGVscGVyOjp2YWxpZCgkZ3VpZCwgJHRhYmxlLCAkaWQsICRjb21wb25lbnQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRHVUlEKCRndWlkLCAkdGFibGUgPSBudWxsLCAkaWQgPSAwLCAkY29tcG9uZW50ID0gbnVsbCkNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gR3VpZEhlbHBlcjo6dmFsaWQoJGd1aWQsICR0YWJsZSwgJGlkLCAkY29tcG9uZW50KTsNCgl9DQoNCgkvKioNCgkgKiBnZXQgdGhlIElURU0gb2YgYSBHVUlEIGJ5IHRhYmxlDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAkZ3VpZA0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICR0YWJsZQ0KCSAqIEBwYXJhbSBzdHJpbmcvYXJyYXkgICR3aGF0DQoJICogQHBhcmFtIHN0cmluZ3xudWxsICAgICRjb21wb25lbnQNCgkgKg0KCSAqIEByZXR1cm4gbWl4DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHdWlkSGVscGVyOjp2YWxpZCgkZ3VpZCwgJHRhYmxlLCAkaWQsICRjb21wb25lbnQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R1VJRCgkZ3VpZCwgJHRhYmxlLCAkd2hhdCA9ICdhLmlkJywgJGNvbXBvbmVudCA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIEd1aWRIZWxwZXI6Oml0ZW0oJGd1aWQsICR0YWJsZSwgJHdoYXQsICRjb21wb25lbnQpOw0KCX0NCg0KCS8qKg0KCSAqIFZhbGlkYXRlIHRoZSBHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcg0KCSAqDQoJICogVGhhbmtzIHRvIExld2llDQoJICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MTU0NTYvMTQyOTY3Nw0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZ3VpZA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEd1aWRIZWxwZXI6OnZhbGlkYXRlKCRndWlkKTsNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlR1VJRCgkZ3VpZCkNCgl7DQoJCXJldHVybiBHdWlkSGVscGVyOjp2YWxpZGF0ZSgkZ3VpZCk7DQoJfQ0KDQoJLyoqDQoJICogVGhlIHppcHBlciBtZXRob2QNCgkgKiANCgkgKiBAcGFyYW0gIHN0cmluZyAgICR3b3JraW5nRElSICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGl0ZW1zIG11c3QgYmUgemlwcGVkDQoJICogQHBhcmFtICBzdHJpbmcgICAkZmlsZXBhdGggICAgICAgICAgVGhlIHBhdGggdG8gd2hlcmUgdGhlIHppcCBmaWxlIG11c3QgYmUgcGxhY2VkDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OnppcCgkd29ya2luZ0RJUiwgJGZpbGVwYXRoKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcCgkd29ya2luZ0RJUiwgJiRmaWxlcGF0aCkNCgl7DQoJCXJldHVybiBGaWxlSGVscGVyOjp6aXAoJHdvcmtpbmdESVIsICRmaWxlcGF0aCk7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IHRoZSBjb250ZW50IG9mIGEgZmlsZQ0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICRwYXRoICAgVGhlIHBhdGggdG8gdGhlIGZpbGUNCgkgKiBAcGFyYW0gIHN0cmluZy9ib29sICAgJG5vbmUgICBUaGUgcmV0dXJuIHZhbHVlIGlmIG5vIGNvbnRlbnQgd2FzIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmdldENvbnRlbnQoJHBhdGgsICRub25lKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50cygkcGF0aCwgJG5vbmUgPSAnJykNCgl7DQoJCXJldHVybiBGaWxlSGVscGVyOjpnZXRDb250ZW50KCRwYXRoLCAkbm9uZSk7DQoJfQ0KDQoJLyoqDQoJICogV3JpdGUgYSBmaWxlIHRvIHRoZSBzZXJ2ZXINCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICAgVGhlIHBhdGggYW5kIGZpbGUgbmFtZSB3aGVyZSB0byBzYWZlIHRoZSBkYXRhDQoJICogQHBhcmFtICBzdHJpbmcgICAkZGF0YSAgICBUaGUgZGF0YSB0byBzYWZlDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OndyaXRlKCRwYXRoLCAkZGF0YSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3cml0ZUZpbGUoJHBhdGgsICRkYXRhKQ0KCXsNCgkJcmV0dXJuIEZpbGVIZWxwZXI6OndyaXRlKCRwYXRoLCAkZGF0YSk7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IGFsbCB0aGUgZmlsZSBwYXRocyBpbiBmb2xkZXIgYW5kIHN1YiBmb2xkZXJzDQoJICogDQoJICogQHBhcmFtICAgc3RyaW5nICAkZm9sZGVyICAgICBUaGUgbG9jYWwgcGF0aCB0byBwYXJzZQ0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGZpbGVUeXBlcyAgVGhlIHR5cGUgb2YgZmlsZXMgdG8gZ2V0DQoJICoNCgkgKiBAcmV0dXJuICB2b2lkDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmdldFBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsRmlsZVBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgPSBhcnJheSgnXC5waHAnLCAnXC5qcycsICdcLmNzcycsICdcLmxlc3MnKSwgJHJlY3Vyc2UgPSB0cnVlLCAkZnVsbCA9IHRydWUpDQoJew0KCQlyZXR1cm4gRmlsZUhlbHBlcjo6Z2V0UGF0aHMoJGZvbGRlciwgJGZpbGVUeXBlcyAsICRyZWN1cnNlLCAkZnVsbCk7DQoJfQ0KDQoJLyoqDQoJICogR2V0IHRoZSBmaWxlIHBhdGggb3IgdXJsDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICR0eXBlICAgICAgICAgICAgICBUaGUgKHVybC9wYXRoKSB0eXBlIHRvIHJldHVybg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHRhcmdldCAgICAgICAgICAgIFRoZSBQYXJhbXMgVGFyZ2V0IG5hbWUgKGlmIHNldCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRmaWxlVHlwZSAgICAgICAgICBUaGUga2luZCBvZiBmaWxlbmFtZSB0byBnZW5lcmF0ZSAoaWYgbm90IHNldCBubyBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkKQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGtleSAgICAgICAgICAgICAgIFRoZSBrZXkgdG8gYWRqdXN0IHRoZSBmaWxlbmFtZSAoaWYgbm90IHNldCBpZ25vcmVkKQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGRlZmF1bHQgICAgICAgICAgIFRoZSBkZWZhdWx0IHBhdGggaWYgbm90IHNldCBpbiBQYXJhbXMgKGZhbGxiYWNrIHBhdGgpDQoJICogQHBhcmFtICBib29sICAgICAkY3JlYXRlSWZOb3RTZXQgICAgVGhlIHN3aXRjaCB0byBjcmVhdGUgdGhlIGZvbGRlciBpZiBub3QgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZyAgICBPbiBzdWNjZXNzIHRoZSBwYXRoIG9yIHVybCBpcyByZXR1cm5lZCBiYXNlZCBvbiB0aGUgdHlwZSByZXF1ZXN0ZWQNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgRmlsZUhlbHBlcjo6Z2V0UGF0aCgkdHlwZSwgJHRhcmdldCwgJGZpbGVUeXBlLCAka2V5LCAkZGVmYXVsdCwgJGNyZWF0ZUlmTm90U2V0KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVQYXRoKCR0eXBlID0gJ3BhdGgnLCAkdGFyZ2V0ID0gJ2ZpbGVwYXRoJywgJGZpbGVUeXBlID0gbnVsbCwgJGtleSA9ICcnLCAkZGVmYXVsdCA9ICcnLCAkY3JlYXRlSWZOb3RTZXQgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBGaWxlSGVscGVyOjpnZXRQYXRoKCR0eXBlLCAkdGFyZ2V0LCAkZmlsZVR5cGUsICRrZXksICRkZWZhdWx0LCAkY3JlYXRlSWZOb3RTZXQpOw0KCX0NCg0KCS8qKg0KCSAqIENoZWNrIGlmIGZpbGUgZXhpc3QNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICBUaGUgdXJsL3BhdGggdG8gY2hlY2sNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgICAgICBJZiBleGlzdCB0cnVlDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmV4aXN0cygkcGF0aCk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cmxFeGlzdHMoJHBhdGgpDQoJew0KCQlyZXR1cm4gRmlsZUhlbHBlcjo6ZXhpc3RzKCRwYXRoKTsNCgl9DQoNCgkvKioNCgkgKiBTZXQgdGhlIGNvbXBvbmVudCBvcHRpb24NCgkgKg0KCSAqIEBwYXJhbSAgIFN0cmluZ3xudWxsICAgICAgICRvcHRpb24gICAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRDb21wb25lbnRPcHRpb24oJG9wdGlvbiA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJaWYgKGVtcHR5KCRvcHRpb24pKQ0KCQl7DQoJCQlpZiAoZW1wdHkoSGVscGVyOjokb3B0aW9uKSAmJiBwcm9wZXJ0eV9leGlzdHMoX19DTEFTU19fLCAnQ29tcG9uZW50Q29kZU5hbWUnKSkNCgkJCXsNCgkJCQlIZWxwZXI6OiRvcHRpb24gPSAnY29tXycgLiBzZWxmOjokQ29tcG9uZW50Q29kZU5hbWU7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlIZWxwZXI6OiRvcHRpb24gPSAkb3B0aW9uOw0KCQl9DQoJfQ0K', '{}', 'Utilities', 'VDM\\Joomla\\Utilities', '1.0.0', '{}', 'Utilities', 'trait', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"},\"use_selection1\":{\"use\":\"4b225c51-d293-48e4-b3f6-5136cf5c3f18\",\"as\":\"default\"},\"use_selection2\":{\"use\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\",\"as\":\"default\"},\"use_selection3\":{\"use\":\"91004529-94a9-4590-b842-e7c6b624ecf5\",\"as\":\"default\"},\"use_selection4\":{\"use\":\"152c8793-8b75-4715-996a-257b9f65451c\",\"as\":\"default\"},\"use_selection5\":{\"use\":\"db87c339-5bb6-4291-a7ef-2c48ea1b06bc\",\"as\":\"default\"},\"use_selection6\":{\"use\":\"9c513baf-b279-43fd-ae29-a585c8cbc4f0\",\"as\":\"default\"},\"use_selection7\":{\"use\":\"a223b31e-ea1d-4cdf-92ae-5f9becffaff0\",\"as\":\"default\"},\"use_selection8\":{\"use\":\"9ef0eb24-aae4-4f5a-99af-d724db44808f\",\"as\":\"default\"},\"use_selection9\":{\"use\":\"a8935cbe-7701-40dc-bfd5-675f2d600954\",\"as\":\"default\"},\"use_selection10\":{\"use\":\"30c5b4c2-f75f-4d15-869a-f8bfedd87358\",\"as\":\"default\"},\"use_selection11\":{\"use\":\"ce8cf834-6bac-44fb-941c-861f7e046cc0\",\"as\":\"default\"},\"use_selection12\":{\"use\":\"3cf76fbf-fd95-4a33-878e-7aff6d36b7f6\",\"as\":\"default\"},\"use_selection13\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2021-11-06 13:25:19', '2022-09-20 11:53:22', 77, 1),
(5, 1, '', '', '', 'db4a1e4d-be59-4e87-8b4d-c40512752232', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwIGFzIEJhc2VIdHRwOw0KdXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwRmFjdG9yeTsNCnVzZSBKb29tbGFcUmVnaXN0cnlcUmVnaXN0cnk7', '', '', '{\"load_selection0\":{\"load\":\"aa253bac-f4b4-41b4-8ace-071a73fc4d96\"},\"load_selection1\":{\"load\":\"c65aaf1f-817c-49a2-8202-282e3904f5b1\"},\"load_selection2\":{\"load\":\"51195163-1e87-4251-b755-a03c376798a6\"},\"load_selection3\":{\"load\":\"ef011ee1-64f0-4048-b013-777473b727dd\"},\"load_selection4\":{\"load\":\"c4a188de-ad78-4a6d-9d5b-01866846d701\"}}', 'CS8qKg0KCSAqIE9wdGlvbnMgZm9yIHRoZSBHaXRlYSBvYmplY3QuDQoJICoNCgkgKiBAdmFyICAgIGFycmF5DQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgJG9wdGlvbnM7DQoNCgkvKioNCgkgKiBUaGUgSFRUUCBjbGllbnQgb2JqZWN0IHRvIHVzZSBpbiBzZW5kaW5nIEhUVFAgcmVxdWVzdHMuDQoJICoNCgkgKiBAdmFyICAgIEJhc2VIdHRwDQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgJGNsaWVudDsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yLg0KCSAqDQoJICogQHBhcmFtICAgUmVnaXN0cnkgICRvcHRpb25zICBHaXRlYSBvcHRpb25zIG9iamVjdC4NCgkgKiBAcGFyYW0gICBIdHRwICAgICAgJGNsaWVudCAgIFRoZSBIVFRQIGNsaWVudCBvYmplY3QuDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVnaXN0cnkgJG9wdGlvbnMgPSBudWxsLCBCYXNlSHR0cCAkY2xpZW50ID0gbnVsbCkNCgl7DQoJCSR0aGlzLT5vcHRpb25zID0gJG9wdGlvbnMgPzogbmV3IFJlZ2lzdHJ5Ow0KDQoJCS8vIFNldHVwIHRoZSBkZWZhdWx0IHVzZXIgYWdlbnQgaWYgbm90IGFscmVhZHkgc2V0Lg0KCQlpZiAoISR0aGlzLT5nZXRPcHRpb24oJ3VzZXJBZ2VudCcpKQ0KCQl7DQoJCQkkdGhpcy0+c2V0T3B0aW9uKCd1c2VyQWdlbnQnLCAnSkdpdGVhLzEuMCcpOw0KCQl9DQoNCgkJLy8gU2V0dXAgdGhlIGRlZmF1bHQgQVBJIHVybCBpZiBub3QgYWxyZWFkeSBzZXQuDQoJCWlmICghJHRoaXMtPmdldE9wdGlvbignYXBpLnVybCcpKQ0KCQl7DQoJCQkkdGhpcy0+c2V0T3B0aW9uKCdhcGkudXJsJywgJ1tbW2dpdGVhX2FwaV91cmxdXV0nKTsNCgkJfQ0KDQoJCSR0aGlzLT5jbGllbnQgPSAkY2xpZW50ID86IChuZXcgSHR0cEZhY3RvcnkpLT5nZXRIdHRwKCR0aGlzLT5vcHRpb25zKTsNCgl9DQoNCgkvKioNCgkgKiBNYWdpYyBtZXRob2QgdG8gbGF6aWx5IGNyZWF0ZSBBUEkgb2JqZWN0cw0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkbmFtZSAgTmFtZSBvZiBwcm9wZXJ0eSB0byByZXRyaWV2ZQ0KCSAqDQoJICogQHJldHVybiAgQWJzdHJhY3RHaXRlYU9iamVjdCAgR2l0ZWEgQVBJIG9iamVjdCAoaXNzdWVzLCBwdWxscywgZXRjKS4NCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqIEB0aHJvd3MgIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gSWYgJG5hbWUgaXMgbm90IGEgdmFsaWQgc3ViIGNsYXNzLg0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2dldCgkbmFtZSkNCgl7DQoJCSRjbGFzcyA9ICdcXFZETVxcR2l0ZWFcXFBhY2thZ2VcXCcgLiB1Y2ZpcnN0KCRuYW1lKTsNCg0KCQlpZiAoY2xhc3NfZXhpc3RzKCRjbGFzcykpDQoJCXsNCgkJCWlmIChpc3NldCgkdGhpcy0+JG5hbWUpID09IGZhbHNlKQ0KCQkJew0KCQkJCSR0aGlzLT4kbmFtZSA9IG5ldyAkY2xhc3MoJHRoaXMtPm9wdGlvbnMsICR0aGlzLT5jbGllbnQpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gJHRoaXMtPiRuYW1lOw0KCQl9DQoNCgkJdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQXJndW1lbnQgJXMgcHJvZHVjZWQgYW4gaW52YWxpZCBjbGFzcyBuYW1lOiAlcycsICRuYW1lLCAkY2xhc3MpKTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYW4gb3B0aW9uIGZyb20gdGhlIEdpdGVhIGluc3RhbmNlLg0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAka2V5ICBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uIHRvIGdldC4NCgkgKg0KCSAqIEByZXR1cm4gIG1peGVkICBUaGUgb3B0aW9uIHZhbHVlLg0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbigka2V5KQ0KCXsNCgkJcmV0dXJuIGlzc2V0KCR0aGlzLT5vcHRpb25zWyRrZXldKSA/ICR0aGlzLT5vcHRpb25zWyRrZXldIDogbnVsbDsNCgl9DQoNCgkvKioNCgkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgR2l0ZWEgaW5zdGFuY2UuDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRrZXkgICAgVGhlIG5hbWUgb2YgdGhlIG9wdGlvbiB0byBzZXQuDQoJICogQHBhcmFtICAgbWl4ZWQgICAkdmFsdWUgIFRoZSBvcHRpb24gdmFsdWUgdG8gc2V0Lg0KCSAqDQoJICogQHJldHVybiAgR2l0ZWEgIFRoaXMgb2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKCRrZXksICR2YWx1ZSkNCgl7DQoJCSR0aGlzLT5vcHRpb25zWyRrZXldID0gJHZhbHVlOw0KDQoJCXJldHVybiAkdGhpczsNCgl9DQo=', '{}', 'Gitea', 'VDM\\Gitea\\Gitea', '1.0.0', '{}', 'Gitea', 'class', '{}', '', 1, '2021-12-03 14:18:38', '2022-09-20 10:09:29', 28, 4),
-(6, 1, '', '', '', 'aa253bac-f4b4-41b4-8ace-071a73fc4d96', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwIGFzIEJhc2VIdHRwOw0KdXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwRmFjdG9yeTsNCnVzZSBKb29tbGFcQ01TXEh0dHBcUmVzcG9uc2U7DQp1c2UgSm9vbWxhXFJlZ2lzdHJ5XFJlZ2lzdHJ5Ow0KdXNlIEpvb21sYVxVcmlcVXJpOw==', '', '', '{}', 'CS8qKg0KCSAqIE9wdGlvbnMgZm9yIHRoZSBHaXRlYSBvYmplY3QuDQoJICoNCgkgKiBAdmFyICAgIFJlZ2lzdHJ5DQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgJG9wdGlvbnM7DQoNCgkvKioNCgkgKiBUaGUgSFRUUCBjbGllbnQgb2JqZWN0IHRvIHVzZSBpbiBzZW5kaW5nIEhUVFAgcmVxdWVzdHMuDQoJICoNCgkgKiBAdmFyICAgIEJhc2VIdHRwDQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgJGNsaWVudDsNCg0KCS8qKg0KCSAqIFRoZSBwYWNrYWdlIHRoZSBvYmplY3QgcmVzaWRlcyBpbg0KCSAqDQoJICogQHZhciAgICBzdHJpbmcNCgkgKiBAc2luY2UgIDEuMA0KCSAqLw0KCXByb3RlY3RlZCAkcGFja2FnZSA9ICcnOw0KDQoJLyoqDQoJICogQ29uc3RydWN0b3IuDQoJICoNCgkgKiBAcGFyYW0gICBSZWdpc3RyeSAgJG9wdGlvbnMgIEdpdGVhIG9wdGlvbnMgb2JqZWN0Lg0KCSAqIEBwYXJhbSAgIEJhc2VIdHRwICAkY2xpZW50ICAgVGhlIEhUVFAgY2xpZW50IG9iamVjdC4NCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdpc3RyeSAkb3B0aW9ucyA9IG51bGwsIEJhc2VIdHRwICRjbGllbnQgPSBudWxsKQ0KCXsNCgkJJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9ucyA/OiBuZXcgUmVnaXN0cnk7DQoJCSR0aGlzLT5jbGllbnQgID0gJGNsaWVudCA/OiAobmV3IEh0dHBGYWN0b3J5KS0+Z2V0SHR0cCgkdGhpcy0+b3B0aW9ucyk7DQoNCgkJJHRoaXMtPnBhY2thZ2UgPSBzdGF0aWM6OmNsYXNzOw0KCQkkdGhpcy0+cGFja2FnZSA9IHN1YnN0cigkdGhpcy0+cGFja2FnZSwgc3RycnBvcygkdGhpcy0+cGFja2FnZSwgJ1xcJykgKyAxKTsNCgl9DQoNCgkvKioNCgkgKiBNZXRob2QgdG8gYnVpbGQgYW5kIHJldHVybiBhIGZ1bGwgcmVxdWVzdCBVUkwgZm9yIHRoZSByZXF1ZXN0LiAgVGhpcyBtZXRob2Qgd2lsbA0KCSAqIGFkZCBhcHByb3ByaWF0ZSBwYWdpbmF0aW9uIGRldGFpbHMgaWYgbmVjZXNzYXJ5IGFuZCBhbHNvIHByZXBlbmQgdGhlIEFQSSB1cmwNCgkgKiB0byBoYXZlIGEgY29tcGxldGUgVVJMIGZvciB0aGUgcmVxdWVzdC4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRwYXRoICAgVVJMIHRvIGluZmxlY3QNCgkgKiBAcGFyYW0gICBpbnRlZ2VyICAkcGFnZSAgIFBhZ2UgdG8gcmVxdWVzdA0KCSAqIEBwYXJhbSAgIGludGVnZXIgICRsaW1pdCAgTnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuIHBlciBwYWdlDQoJICoNCgkgKiBAcmV0dXJuICBVcmkNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFVybCgkcGF0aCwgJHBhZ2UgPSAwLCAkbGltaXQgPSAwKQ0KCXsNCgkJLy8gR2V0IGEgbmV3IFVyaSBvYmplY3QgZm9jdXNpbmcgdGhlIGFwaSB1cmwgYW5kIGdpdmVuIHBhdGguDQoJCSR1cmkgPSBuZXcgVXJpKCR0aGlzLT5vcHRpb25zLT5nZXQoJ2FwaS51cmwnKSAuICRwYXRoKTsNCg0KCQlpZiAoJHRoaXMtPm9wdGlvbnMtPmdldCgnYWNjZXNzLnRva2VuJywgZmFsc2UpKQ0KCQl7DQoJCQkvLyBVc2Ugb0F1dGggYXV0aGVudGljYXRpb24NCgkJCSRoZWFkZXJzID0gJHRoaXMtPmNsaWVudC0+Z2V0T3B0aW9uKCdoZWFkZXJzJywgYXJyYXkoKSk7DQoNCgkJCWlmICghaXNzZXQoJGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSkpDQoJCQl7DQoJCQkJJGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9ICd0b2tlbiAnIC4gJHRoaXMtPm9wdGlvbnMtPmdldCgnYWNjZXNzLnRva2VuJyk7DQoJCQkJJHRoaXMtPmNsaWVudC0+c2V0T3B0aW9uKCdoZWFkZXJzJywgJGhlYWRlcnMpOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy8gVXNlIGJhc2ljIGF1dGhlbnRpY2F0aW9uDQoJCQlpZiAoJHRoaXMtPm9wdGlvbnMtPmdldCgnYXBpLnVzZXJuYW1lJywgZmFsc2UpKQ0KCQkJew0KCQkJCSR1cmktPnNldFVzZXIoJHRoaXMtPm9wdGlvbnMtPmdldCgnYXBpLnVzZXJuYW1lJykpOw0KCQkJfQ0KDQoJCQlpZiAoJHRoaXMtPm9wdGlvbnMtPmdldCgnYXBpLnBhc3N3b3JkJywgZmFsc2UpKQ0KCQkJew0KCQkJCSR1cmktPnNldFBhc3MoJHRoaXMtPm9wdGlvbnMtPmdldCgnYXBpLnBhc3N3b3JkJykpOw0KCQkJfQ0KCQl9DQoNCgkJLy8gSWYgd2UgaGF2ZSBhIGRlZmluZWQgcGFnZSBudW1iZXIgYWRkIGl0IHRvIHRoZSBKVXJpIG9iamVjdC4NCgkJaWYgKCRwYWdlID4gMCkNCgkJew0KCQkJJHVyaS0+c2V0VmFyKCdwYWdlJywgKGludCkgJHBhZ2UpOw0KCQl9DQoNCgkJLy8gSWYgd2UgaGF2ZSBhIGRlZmluZWQgaXRlbXMgcGVyIHBhZ2UgYWRkIGl0IHRvIHRoZSBKVXJpIG9iamVjdC4NCgkJaWYgKCRsaW1pdCA+IDApDQoJCXsNCgkJCSR1cmktPnNldFZhcignbGltaXQnLCAoaW50KSAkbGltaXQpOw0KCQl9DQoNCgkJcmV0dXJuICR1cmk7DQoJfQ0KDQoJLyoqDQoJICogUHJvY2VzcyB0aGUgcmVzcG9uc2UgYW5kIGRlY29kZSBpdC4NCgkgKg0KCSAqIEBwYXJhbSAgIFJlc3BvbnNlICAkcmVzcG9uc2UgICAgICBUaGUgcmVzcG9uc2UuDQoJICogQHBhcmFtICAgaW50ZWdlciAgICRleHBlY3RlZENvZGUgIFRoZSBleHBlY3RlZCAiZ29vZCIgY29kZS4NCgkgKg0KCSAqIEByZXR1cm4gIG1peGVkDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKiBAdGhyb3dzICBSdW50aW1lRXhjZXB0aW9uDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NSZXNwb25zZShSZXNwb25zZSAkcmVzcG9uc2UsICRleHBlY3RlZENvZGUgPSAyMDApDQoJew0KCQkvLyBWYWxpZGF0ZSB0aGUgcmVzcG9uc2UgY29kZS4NCgkJaWYgKCRyZXNwb25zZS0+Y29kZSAhPSAkZXhwZWN0ZWRDb2RlKQ0KCQl7DQoJCQkvLyBEZWNvZGUgdGhlIGVycm9yIHJlc3BvbnNlIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uDQoJCQkkZXJyb3IgICA9IGpzb25fZGVjb2RlKChzdHJpbmcpICRyZXNwb25zZS0+Ym9keSk7DQoJCQkkbWVzc2FnZSA9IGlzc2V0KCRlcnJvci0+bWVzc2FnZSkgPyAkZXJyb3ItPm1lc3NhZ2UgOiAnSW52YWxpZCByZXNwb25zZSByZWNlaXZlZCBmcm9tIEdpdGVhLic7DQoNCgkJCXRocm93IG5ldyBcRG9tYWluRXhjZXB0aW9uKCRtZXNzYWdlLCAkcmVzcG9uc2UtPmNvZGUpOw0KCQl9DQoNCgkJaWYgKEpzb25IZWxwZXI6OmNoZWNrKCRyZXNwb25zZS0+Ym9keSkpDQoJCXsNCgkJCSRib2R5ID0ganNvbl9kZWNvZGUoKHN0cmluZykgJHJlc3BvbnNlLT5ib2R5KTsNCg0KCQkJaWYgKGlzc2V0KCRib2R5LT5jb250ZW50X2Jhc2U2NCkpDQoJCQl7DQoJCQkJJGJvZHktPmNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKChzdHJpbmcpICRib2R5LT5jb250ZW50X2Jhc2U2NCk7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkYm9keSA9ICRyZXNwb25zZS0+Ym9keTsNCgkJfQ0KDQoJCXJldHVybiAkYm9keTsNCgl9DQo=', '{}', 'AbstractGiteaObject', 'VDM\\Gitea\\AbstractGiteaObject', '1.0.0', '{}', 'Abstract Gitea Object', 'abstract class', '{\"use_selection0\":{\"use\":\"4b225c51-d293-48e4-b3f6-5136cf5c3f18\",\"as\":\"default\"}}', '', 1, '2021-12-03 16:00:26', '2023-02-02 15:45:30', 22, 4),
+(6, 1, '', '', '', 'aa253bac-f4b4-41b4-8ace-071a73fc4d96', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwIGFzIEJhc2VIdHRwOw0KdXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwRmFjdG9yeTsNCnVzZSBKb29tbGFcQ01TXEh0dHBcUmVzcG9uc2U7DQp1c2UgSm9vbWxhXFJlZ2lzdHJ5XFJlZ2lzdHJ5Ow0KdXNlIEpvb21sYVxVcmlcVXJpOw==', '', '', '{}', 'CS8qKg0KCSAqIE9wdGlvbnMgZm9yIHRoZSBHaXRlYSBvYmplY3QuDQoJICoNCgkgKiBAdmFyICAgIFJlZ2lzdHJ5DQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgJG9wdGlvbnM7DQoNCgkvKioNCgkgKiBUaGUgSFRUUCBjbGllbnQgb2JqZWN0IHRvIHVzZSBpbiBzZW5kaW5nIEhUVFAgcmVxdWVzdHMuDQoJICoNCgkgKiBAdmFyICAgIEJhc2VIdHRwDQoJICogQHNpbmNlICAxLjANCgkgKi8NCglwcm90ZWN0ZWQgJGNsaWVudDsNCg0KCS8qKg0KCSAqIFRoZSBwYWNrYWdlIHRoZSBvYmplY3QgcmVzaWRlcyBpbg0KCSAqDQoJICogQHZhciAgICBzdHJpbmcNCgkgKiBAc2luY2UgIDEuMA0KCSAqLw0KCXByb3RlY3RlZCAkcGFja2FnZSA9ICcnOw0KDQoJLyoqDQoJICogQ29uc3RydWN0b3IuDQoJICoNCgkgKiBAcGFyYW0gICBSZWdpc3RyeSAgJG9wdGlvbnMgIEdpdGVhIG9wdGlvbnMgb2JqZWN0Lg0KCSAqIEBwYXJhbSAgIEJhc2VIdHRwICAkY2xpZW50ICAgVGhlIEhUVFAgY2xpZW50IG9iamVjdC4NCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdpc3RyeSAkb3B0aW9ucyA9IG51bGwsIEJhc2VIdHRwICRjbGllbnQgPSBudWxsKQ0KCXsNCgkJJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9ucyA/OiBuZXcgUmVnaXN0cnk7DQoJCSR0aGlzLT5jbGllbnQgID0gJGNsaWVudCA/OiAobmV3IEh0dHBGYWN0b3J5KS0+Z2V0SHR0cCgkdGhpcy0+b3B0aW9ucyk7DQoNCgkJJHRoaXMtPnBhY2thZ2UgPSBzdGF0aWM6OmNsYXNzOw0KCQkkdGhpcy0+cGFja2FnZSA9IHN1YnN0cigkdGhpcy0+cGFja2FnZSwgc3RycnBvcygkdGhpcy0+cGFja2FnZSwgJ1xcJykgKyAxKTsNCgl9DQoNCgkvKioNCgkgKiBNZXRob2QgdG8gYnVpbGQgYW5kIHJldHVybiBhIGZ1bGwgcmVxdWVzdCBVUkwgZm9yIHRoZSByZXF1ZXN0LiAgVGhpcyBtZXRob2Qgd2lsbA0KCSAqIGFkZCBhcHByb3ByaWF0ZSBwYWdpbmF0aW9uIGRldGFpbHMgaWYgbmVjZXNzYXJ5IGFuZCBhbHNvIHByZXBlbmQgdGhlIEFQSSB1cmwNCgkgKiB0byBoYXZlIGEgY29tcGxldGUgVVJMIGZvciB0aGUgcmVxdWVzdC4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRwYXRoICAgVVJMIHRvIGluZmxlY3QNCgkgKiBAcGFyYW0gICBpbnRlZ2VyICAkcGFnZSAgIFBhZ2UgdG8gcmVxdWVzdA0KCSAqIEBwYXJhbSAgIGludGVnZXIgICRsaW1pdCAgTnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuIHBlciBwYWdlDQoJICoNCgkgKiBAcmV0dXJuICBVcmkNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFVybCgkcGF0aCwgJHBhZ2UgPSAwLCAkbGltaXQgPSAwKQ0KCXsNCgkJLy8gR2V0IGEgbmV3IFVyaSBvYmplY3QgZm9jdXNpbmcgdGhlIGFwaSB1cmwgYW5kIGdpdmVuIHBhdGguDQoJCSR1cmkgPSBuZXcgVXJpKCR0aGlzLT5vcHRpb25zLT5nZXQoJ2FwaS51cmwnKSAuICRwYXRoKTsNCg0KCQlpZiAoJHRoaXMtPm9wdGlvbnMtPmdldCgnYWNjZXNzLnRva2VuJywgZmFsc2UpKQ0KCQl7DQoJCQkvLyBVc2Ugb0F1dGggYXV0aGVudGljYXRpb24NCgkJCSRoZWFkZXJzID0gJHRoaXMtPmNsaWVudC0+Z2V0T3B0aW9uKCdoZWFkZXJzJywgW10pOw0KDQoJCQlpZiAoIWlzc2V0KCRoZWFkZXJzWydBdXRob3JpemF0aW9uJ10pKQ0KCQkJew0KCQkJCSRoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAndG9rZW4gJyAuICR0aGlzLT5vcHRpb25zLT5nZXQoJ2FjY2Vzcy50b2tlbicpOw0KCQkJCSR0aGlzLT5jbGllbnQtPnNldE9wdGlvbignaGVhZGVycycsICRoZWFkZXJzKTsNCgkJCX0NCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIFVzZSBiYXNpYyBhdXRoZW50aWNhdGlvbg0KCQkJaWYgKCR0aGlzLT5vcHRpb25zLT5nZXQoJ2FwaS51c2VybmFtZScsIGZhbHNlKSkNCgkJCXsNCgkJCQkkdXJpLT5zZXRVc2VyKCR0aGlzLT5vcHRpb25zLT5nZXQoJ2FwaS51c2VybmFtZScpKTsNCgkJCX0NCg0KCQkJaWYgKCR0aGlzLT5vcHRpb25zLT5nZXQoJ2FwaS5wYXNzd29yZCcsIGZhbHNlKSkNCgkJCXsNCgkJCQkkdXJpLT5zZXRQYXNzKCR0aGlzLT5vcHRpb25zLT5nZXQoJ2FwaS5wYXNzd29yZCcpKTsNCgkJCX0NCgkJfQ0KDQoJCS8vIElmIHdlIGhhdmUgYSBkZWZpbmVkIHBhZ2UgbnVtYmVyIGFkZCBpdCB0byB0aGUgSlVyaSBvYmplY3QuDQoJCWlmICgkcGFnZSA+IDApDQoJCXsNCgkJCSR1cmktPnNldFZhcigncGFnZScsIChpbnQpICRwYWdlKTsNCgkJfQ0KDQoJCS8vIElmIHdlIGhhdmUgYSBkZWZpbmVkIGl0ZW1zIHBlciBwYWdlIGFkZCBpdCB0byB0aGUgSlVyaSBvYmplY3QuDQoJCWlmICgkbGltaXQgPiAwKQ0KCQl7DQoJCQkkdXJpLT5zZXRWYXIoJ2xpbWl0JywgKGludCkgJGxpbWl0KTsNCgkJfQ0KDQoJCXJldHVybiAkdXJpOw0KCX0NCg0KCS8qKg0KCSAqIFByb2Nlc3MgdGhlIHJlc3BvbnNlIGFuZCBkZWNvZGUgaXQuDQoJICoNCgkgKiBAcGFyYW0gICBSZXNwb25zZSAgJHJlc3BvbnNlICAgICAgVGhlIHJlc3BvbnNlLg0KCSAqIEBwYXJhbSAgIGludGVnZXIgICAkZXhwZWN0ZWRDb2RlICBUaGUgZXhwZWN0ZWQgImdvb2QiIGNvZGUuDQoJICoNCgkgKiBAcmV0dXJuICBtaXhlZA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICogQHRocm93cyAgUnVudGltZUV4Y2VwdGlvbg0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzUmVzcG9uc2UoUmVzcG9uc2UgJHJlc3BvbnNlLCAkZXhwZWN0ZWRDb2RlID0gMjAwKQ0KCXsNCgkJLy8gVmFsaWRhdGUgdGhlIHJlc3BvbnNlIGNvZGUuDQoJCWlmICgkcmVzcG9uc2UtPmNvZGUgIT0gJGV4cGVjdGVkQ29kZSkNCgkJew0KCQkJLy8gRGVjb2RlIHRoZSBlcnJvciByZXNwb25zZSBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLg0KCQkJJGVycm9yICAgPSBqc29uX2RlY29kZSgoc3RyaW5nKSAkcmVzcG9uc2UtPmJvZHkpOw0KCQkJJG1lc3NhZ2UgPSBpc3NldCgkZXJyb3ItPm1lc3NhZ2UpID8gJGVycm9yLT5tZXNzYWdlIDogJ0ludmFsaWQgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBHaXRlYS4nOw0KDQoJCQl0aHJvdyBuZXcgXERvbWFpbkV4Y2VwdGlvbigkbWVzc2FnZSwgJHJlc3BvbnNlLT5jb2RlKTsNCgkJfQ0KDQoJCWlmIChKc29uSGVscGVyOjpjaGVjaygkcmVzcG9uc2UtPmJvZHkpKQ0KCQl7DQoJCQkkYm9keSA9IGpzb25fZGVjb2RlKChzdHJpbmcpICRyZXNwb25zZS0+Ym9keSk7DQoNCgkJCWlmIChpc3NldCgkYm9keS0+Y29udGVudF9iYXNlNjQpKQ0KCQkJew0KCQkJCSRib2R5LT5jb250ZW50ID0gYmFzZTY0X2RlY29kZSgoc3RyaW5nKSAkYm9keS0+Y29udGVudF9iYXNlNjQpOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGJvZHkgPSAkcmVzcG9uc2UtPmJvZHk7DQoJCX0NCg0KCQlyZXR1cm4gJGJvZHk7DQoJfQ0K', '{}', 'AbstractGiteaObject', 'VDM\\Gitea\\AbstractGiteaObject', '1.0.0', '{}', 'Abstract Gitea Object', 'abstract class', '{\"use_selection0\":{\"use\":\"4b225c51-d293-48e4-b3f6-5136cf5c3f18\",\"as\":\"default\"}}', '', 1, '2021-12-03 16:00:26', '2023-02-02 15:45:30', 22, 4),
(7, 1, '', 'aa253bac-f4b4-41b4-8ace-071a73fc4d96', '', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwIGFzIEJhc2VIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIENvbnN0cnVjdG9yLg0KCSAqDQoJICogQHBhcmFtICAgUmVnaXN0cnkgICRvcHRpb25zICBHaXRlYSBvcHRpb25zIG9iamVjdC4NCgkgKiBAcGFyYW0gICBIdHRwICAgICAgJGNsaWVudCAgIFRoZSBIVFRQIGNsaWVudCBvYmplY3QuDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVnaXN0cnkgJG9wdGlvbnMgPSBudWxsLCBCYXNlSHR0cCAkY2xpZW50ID0gbnVsbCkNCgl7DQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG9wdGlvbnMsICRjbGllbnQpOw0KDQoJCSR0aGlzLT5wYWNrYWdlID0gc3RhdGljOjpjbGFzczsNCgkJJHRoaXMtPnBhY2thZ2UgPSBzdWJzdHIoJHRoaXMtPnBhY2thZ2UsIHN0cnJwb3MoJHRoaXMtPnBhY2thZ2UsICdcXCcpICsgMSk7DQoJfQ0KDQoJLyoqDQoJICogTWFnaWMgbWV0aG9kIHRvIGxhemlseSBjcmVhdGUgQVBJIG9iamVjdHMNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG5hbWUgIE5hbWUgb2YgcHJvcGVydHkgdG8gcmV0cmlldmUNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqIEB0aHJvd3MgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbg0KCSAqDQoJICogQHJldHVybiAgQWJzdHJhY3RQYWNrYWdlICBHaXRlYSBBUEkgcGFja2FnZSBvYmplY3QuDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fZ2V0KCRuYW1lKQ0KCXsNCgkJJGNsYXNzID0gJ1xcVkRNXFxHaXRlYVxcUGFja2FnZVxcJyAuICR0aGlzLT5wYWNrYWdlIC4gJ1xcJyAuIHVjZmlyc3QoJG5hbWUpOw0KDQoJCWlmIChjbGFzc19leGlzdHMoJGNsYXNzKSA9PSBmYWxzZSkNCgkJew0KCQkJdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oDQoJCQkJc3ByaW50ZigNCgkJCQkJJ0FyZ3VtZW50ICUxJHMgcHJvZHVjZWQgYW4gaW52YWxpZCBjbGFzcyBuYW1lOiAlMiRzIGluIHBhY2thZ2UgJTMkcycsDQoJCQkJCSRuYW1lLCAkY2xhc3MsICR0aGlzLT5wYWNrYWdlDQoJCQkJKQ0KCQkJKTsNCgkJfQ0KDQoJCWlmIChpc3NldCgkdGhpcy0+JG5hbWUpID09IGZhbHNlKQ0KCQl7DQoJCQkkdGhpcy0+JG5hbWUgPSBuZXcgJGNsYXNzKCR0aGlzLT5vcHRpb25zLCAkdGhpcy0+Y2xpZW50KTsNCgkJfQ0KDQoJCXJldHVybiAkdGhpcy0+JG5hbWU7DQoJfQ0K', '{}', 'AbstractPackage', 'VDM\\Gitea\\AbstractPackage', '1.0.0', '{}', 'Abstract Gitea Package', 'abstract class', '{}', '', 1, '2021-12-03 16:03:06', '2023-02-02 15:45:48', 17, 4),
(8, 1, '', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', '51195163-1e87-4251-b755-a03c376798a6', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIExpc3QgeW91ciByZXBvc2l0b3JpZXMuDQoJICoNCgkgKiBMaXN0IHJlcG9zaXRvcmllcyBmb3IgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci4NCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldExpc3RPd24oKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHVyaSA9ICR0aGlzLT5mZXRjaFVybCgnL3VzZXIvcmVwb3MnKTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgkdGhpcy0+Y2xpZW50LT5nZXQoJHVyaSkpOw0KCX0NCg0KCS8qKg0KCSAqIExpc3QgdXNlciByZXBvc2l0b3JpZXMuDQoJICoNCgkgKiBMaXN0IHB1YmxpYyByZXBvc2l0b3JpZXMgZm9yIHRoZSBzcGVjaWZpZWQgdXNlci4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHVzZXIgICAgICAgVGhlIHVzZXIgbmFtZS4NCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldExpc3RVc2VyKCR1c2VyKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHVyaSA9ICR0aGlzLT5mZXRjaFVybCgnL3VzZXJzLycgLiAkdXNlciAuICcvcmVwb3MnKTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgkdGhpcy0+Y2xpZW50LT5nZXQoJHVyaSkpOw0KCX0NCg0KCS8qKg0KCSAqIExpc3Qgb3JnYW5pemF0aW9uIHJlcG9zaXRvcmllcy4NCgkgKg0KCSAqIExpc3QgcmVwb3NpdG9yaWVzIGZvciB0aGUgc3BlY2lmaWVkIG9yZy4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG9yZyAgIFRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24uDQoJICoNCgkgKiBAcmV0dXJuICBvYmplY3QNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRMaXN0T3JnKCRvcmcpDQoJew0KCQkvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXRoLg0KCQkkdXJpID0gJHRoaXMtPmZldGNoVXJsKCcvb3Jncy8nIC4gJG9yZyAuICcvcmVwb3MnKTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgkdGhpcy0+Y2xpZW50LT5nZXQoJHVyaSkpOw0KCX0NCg0KCS8qKg0KCSAqIENyZWF0ZS4NCgkgKg0KCSAqIENyZWF0ZSBhIG5ldyByZXBvc2l0b3J5IGZvciB0aGUgYXV0aGVudGljYXRlZCB1c2VyIG9yIGFuIG9yZ2FuaXphdGlvbi4gT0F1dGggdXNlcnMgbXVzdCBzdXBwbHkgcmVwbyBzY29wZS4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRuYW1lICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgbmFtZS4NCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkb3JnICAgICAgICAgICAgICAgIFRoZSBvcmdhbml6YXRpb24gbmFtZSAoaWYgbmVlZGVkKS4NCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkZGVzY3JpcHRpb24gICAgICAgIFRoZSByZXBvc2l0b3J5IGRlc2NyaXB0aW9uLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRyZWFkbWUgICAgICAgICAgICAgUmVhZG1lIG9mIHRoZSByZXBvc2l0b3J5IHRvIGNyZWF0ZS4NCgkgKiBAcGFyYW0gICBib29sZWFuICAkcHJpdmF0ZSAgICAgICAgICAgIFNldCB0cnVlIHRvIGNyZWF0ZSBhIHByaXZhdGUgcmVwb3NpdG9yeSwgZmFsc2UgdG8gY3JlYXRlIGEgcHVibGljIG9uZS4NCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkZGVmYXVsdEJyYW5jaCAgICAgIERlZmF1bHRCcmFuY2ggb2YgdGhlIHJlcG9zaXRvcnkgKHVzZWQgd2hlbiBpbml0aWFsaXplcyBhbmQgaW4gdGVtcGxhdGUpLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRsaWNlbnNlICAgICAgICAgICAgTGljZW5zZSB0byB1c2UuDQoJICogQHBhcmFtICAgYm9vbGVhbiAgJGF1dG9Jbml0ICAgICAgICAgICBXaGV0aGVyIHRoZSByZXBvc2l0b3J5IHNob3VsZCBhdXRvIGluaXQuDQoJICogQHBhcmFtICAgYm9vbGVhbiAgJHRlbXBsYXRlICAgICAgICAgICBXaGV0aGVyIHRoZSByZXBvc2l0b3J5IGlzIHRlbXBsYXRlLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRnaXRpZ25vcmVzICAgICAgICAgR2l0aWdub3JlcyB0byB1c2UuDQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsgSm9vbWxhLCBKZXRCcmFpbnMgXSBhbmQgbXVjaCBtb3JlLi4uDQoJICogQHBhcmFtICAgc3RyaW5nICAgJGlzc3VlTGFiZWxzICAgICAgICBMYWJlbC1TZXQgdG8gdXNlLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0cnVzdE1vZGVsICAgICAgICAgVHJ1c3RNb2RlbCBvZiB0aGUgcmVwb3NpdG9yeS4NCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogWyBkZWZhdWx0LCBjb2xsYWJvcmF0b3IsIGNvbW1pdHRlciwgY29sbGFib3JhdG9yY29tbWl0dGVyIF0NCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSgkbmFtZSwgJG9yZyA9ICcnLCAkZGVzY3JpcHRpb24gPSAnJywgJHJlYWRtZSA9ICdEZWZhdWx0JywgJHByaXZhdGUgPSBmYWxzZSwgJGRlZmF1bHRCcmFuY2ggPSAnbWFzdGVyJywNCgkJJGxpY2Vuc2UgPSAnR1BMLTIuMC1vci1sYXRlcicsICRhdXRvSW5pdCA9IHRydWUsICR0ZW1wbGF0ZSA9IGZhbHNlLCAkdHJ1c3RNb2RlbCA9ICdkZWZhdWx0JywgJGdpdGlnbm9yZXMgPSAnJywgJGlzc3VlTGFiZWxzID0gJycNCgkpDQoJew0KCQkkcGF0aCA9ICgkb3JnKQ0KCQkJLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgYW4gb3JnYW5pemF0aW9uDQoJCQk/ICcvb3Jncy8nIC4gJG9yZyAuICcvcmVwb3MnDQoJCQkvLyBDcmVhdGUgYSByZXBvc2l0b3J5IGZvciBhIHVzZXINCgkJCTogJy91c2VyL3JlcG9zJzsNCg0KCQkkZGF0YSA9IFsNCgkJCSduYW1lJyAgICAgICAgICAgICAgID0+ICRuYW1lLA0KCQkJJ2Rlc2NyaXB0aW9uJyAgICAgICAgPT4gJGRlc2NyaXB0aW9uLA0KCQkJJ3JlYWRtZScgICAgICAgICAgICAgPT4gJHJlYWRtZSwNCgkJCSdwcml2YXRlJyAgICAgICAgICAgID0+ICRwcml2YXRlLA0KCQkJJ2F1dG9faW5pdCcgICAgICAgICAgPT4gJGF1dG9Jbml0LA0KCQkJJ2RlZmF1bHRfYnJhbmNoJyAgICAgPT4gJGRlZmF1bHRCcmFuY2gsDQoJCQknaXNzdWVfbGFiZWxzJyAgICAgICA9PiAkaXNzdWVMYWJlbHMsDQoJCQknbGljZW5zZScgICAgICAgICAgICA9PiAkbGljZW5zZSwNCgkJCSd0ZW1wbGF0ZScgICAgICAgICAgID0+ICR0ZW1wbGF0ZSwNCgkJCSdnaXRpZ25vcmVzJyAgICAgICAgID0+ICRnaXRpZ25vcmVzLA0KCQkJJ3RydXN0X21vZGVsJyAgICAgICAgPT4gJHRydXN0TW9kZWwNCgkJXTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPnBvc3QoJHRoaXMtPmZldGNoVXJsKCRwYXRoKSwganNvbl9lbmNvZGUoJGRhdGEpKSwNCgkJCTIwMQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIEdldC4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG93bmVyICBSZXBvc2l0b3J5IG93bmVyLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHJlcG8gICBSZXBvc2l0b3J5IG5hbWUuDQoJICoNCgkgKiBAcmV0dXJuICBvYmplY3QNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXQoJG93bmVyLCAkcmVwbykNCgl7DQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSRwYXRoID0gJy9yZXBvcy8nIC4gJG93bmVyIC4gJy8nIC4gJHJlcG87DQoNCgkJLy8gU2VuZCB0aGUgcmVxdWVzdC4NCgkJcmV0dXJuICR0aGlzLT5wcm9jZXNzUmVzcG9uc2UoDQoJCQkkdGhpcy0+Y2xpZW50LT5nZXQoJHRoaXMtPmZldGNoVXJsKCRwYXRoKSkNCgkJKTsNCgl9DQoNCgkvKioNCgkgKiBMaXN0IGNvbnRyaWJ1dG9ycy4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRvd25lciAgUmVwb3NpdG9yeSBvd25lci4NCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkcmVwbyAgIFJlcG9zaXRvcnkgbmFtZS4NCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldExpc3RDb250cmlidXRvcnMoJG93bmVyLCAkcmVwbykNCgl7DQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSR1cmkgPSAkdGhpcy0+ZmV0Y2hVcmwoJy9yZXBvcy8nIC4gJG93bmVyIC4gJy8nIC4gJHJlcG8gLiAnL2NvbnRyaWJ1dG9ycycpOw0KDQoJCS8vIFNlbmQgdGhlIHJlcXVlc3QuDQoJCXJldHVybiAkdGhpcy0+cHJvY2Vzc1Jlc3BvbnNlKCR0aGlzLT5jbGllbnQtPmdldCgkdXJpKSk7DQoJfQ0KDQoJLyoqDQoJICogTGlzdCBsYW5ndWFnZXMuDQoJICoNCgkgKiBMaXN0IGxhbmd1YWdlcyBmb3IgdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5LiBUaGUgdmFsdWUgb24gdGhlIHJpZ2h0IG9mIGEgbGFuZ3VhZ2UgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBjb2RlDQoJICogd3JpdHRlbiBpbiB0aGF0IGxhbmd1YWdlLg0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkb3duZXIgIFJlcG9zaXRvcnkgb3duZXIuDQoJICogQHBhcmFtICAgc3RyaW5nICAkcmVwbyAgIFJlcG9zaXRvcnkgbmFtZS4NCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldExpc3RMYW5ndWFnZXMoJG93bmVyLCAkcmVwbykNCgl7DQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSRwYXRoID0gJy9yZXBvcy8nIC4gJG93bmVyIC4gJy8nIC4gJHJlcG8gLiAnL2xhbmd1YWdlcyc7DQoNCgkJLy8gU2VuZCB0aGUgcmVxdWVzdC4NCgkJcmV0dXJuICR0aGlzLT5wcm9jZXNzUmVzcG9uc2UoDQoJCQkkdGhpcy0+Y2xpZW50LT5nZXQoJHRoaXMtPmZldGNoVXJsKCRwYXRoKSkNCgkJKTsNCgl9DQoNCgkvKioNCgkgKiBMaXN0IFRlYW1zDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgUmVwb3NpdG9yeSBvd25lci4NCgkgKiBAcGFyYW0gICBzdHJpbmcgICRyZXBvICAgUmVwb3NpdG9yeSBuYW1lLg0KCSAqDQoJICogQHJldHVybiAgb2JqZWN0DQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0TGlzdFRlYW1zKCRvd25lciwgJHJlcG8pDQoJew0KCQkvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXRoLg0KCQkkcGF0aCA9ICcvcmVwb3MvJyAuICRvd25lciAuICcvJyAuICRyZXBvIC4gJy90ZWFtcyc7DQoNCgkJLy8gU2VuZCB0aGUgcmVxdWVzdC4NCgkJcmV0dXJuICR0aGlzLT5wcm9jZXNzUmVzcG9uc2UoDQoJCQkkdGhpcy0+Y2xpZW50LT5nZXQoJHRoaXMtPmZldGNoVXJsKCRwYXRoKSkNCgkJKTsNCgl9DQoNCgkvKioNCgkgKiBMaXN0IFRhZ3MuDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkb3duZXIgIFJlcG9zaXRvcnkgb3duZXIuDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHJlcG8gICBSZXBvc2l0b3J5IG5hbWUuDQoJICogQHBhcmFtICAgaW50ZWdlciAgJHBhZ2UgICBQYWdlIHRvIHJlcXVlc3QNCgkgKiBAcGFyYW0gICBpbnRlZ2VyICAkbGltaXQgIE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybiBwZXIgcGFnZQ0KCSAqDQoJICogQHJldHVybiAgb2JqZWN0DQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0TGlzdFRhZ3MoJG93bmVyLCAkcmVwbywgJHBhZ2UgPSAwLCAkbGltaXQgPSAwKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHBhdGggPSAnL3JlcG9zLycgLiAkb3duZXIgLiAnLycgLiAkcmVwbyAuICcvdGFncyc7DQoNCgkJLy8gU2VuZCB0aGUgcmVxdWVzdC4NCgkJcmV0dXJuICR0aGlzLT5wcm9jZXNzUmVzcG9uc2UoDQoJCQkkdGhpcy0+Y2xpZW50LT5nZXQoJHRoaXMtPmZldGNoVXJsKCRwYXRoLCAkcGFnZSwgJGxpbWl0KSkNCgkJKTsNCgl9DQoNCgkvKioNCgkgKiBEZWxldGUgYSBSZXBvc2l0b3J5Lg0KCSAqDQoJICogRGVsZXRpbmcgYSByZXBvc2l0b3J5IHJlcXVpcmVzIGFkbWluIGFjY2Vzcy4gSWYgT0F1dGggaXMgdXNlZCwgdGhlIGRlbGV0ZV9yZXBvIHNjb3BlIGlzIHJlcXVpcmVkLg0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkb3duZXIgIFJlcG9zaXRvcnkgb3duZXIuDQoJICogQHBhcmFtICAgc3RyaW5nICAkcmVwbyAgIFJlcG9zaXRvcnkgbmFtZS4NCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGRlbGV0ZSgkb3duZXIsICRyZXBvKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHBhdGggPSAnL3JlcG9zLycgLiAkb3duZXIgLiAnLycgLiAkcmVwbzsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmRlbGV0ZSgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg==', '{}', 'Repo', 'VDM\\Gitea\\Package.Repo', '1.0.0', '{}', 'Gitea Repo', 'class', '{}', '', 1, '2021-12-03 16:37:20', '2022-07-09 10:28:45', 13, 4),
(9, 1, '', '', '', '011813ba-8dd2-4beb-98f9-50ab3f3665d1', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwIGFzIEJhc2VIdHRwOw0KdXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwRmFjdG9yeTsNCnVzZSBKb29tbGFcUmVnaXN0cnlcUmVnaXN0cnk7', '', '', '{\"load_selection0\":{\"load\":\"aa253bac-f4b4-41b4-8ace-071a73fc4d96\"},\"load_selection1\":{\"load\":\"c65aaf1f-817c-49a2-8202-282e3904f5b1\"},\"load_selection2\":{\"load\":\"51195163-1e87-4251-b755-a03c376798a6\"}}', 'CS8qKg0KCSAqIE9wdGlvbnMgZm9yIHRoZSBbW1tBcGldXV0gb2JqZWN0Lg0KCSAqDQoJICogQHZhciAgICBhcnJheQ0KCSAqIEBzaW5jZSAgMS4wDQoJICovDQoJcHJvdGVjdGVkICRvcHRpb25zOw0KDQoJLyoqDQoJICogVGhlIEhUVFAgY2xpZW50IG9iamVjdCB0byB1c2UgaW4gc2VuZGluZyBIVFRQIHJlcXVlc3RzLg0KCSAqDQoJICogQHZhciAgICBCYXNlSHR0cA0KCSAqIEBzaW5jZSAgMS4wDQoJICovDQoJcHJvdGVjdGVkICRjbGllbnQ7DQoNCgkvKioNCgkgKiBDb25zdHJ1Y3Rvci4NCgkgKg0KCSAqIEBwYXJhbSAgIFJlZ2lzdHJ5ICAkb3B0aW9ucyAgW1tbQXBpXV1dIG9wdGlvbnMgb2JqZWN0Lg0KCSAqIEBwYXJhbSAgIEh0dHAgICAgICAkY2xpZW50ICAgVGhlIEhUVFAgY2xpZW50IG9iamVjdC4NCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdpc3RyeSAkb3B0aW9ucyA9IG51bGwsIEJhc2VIdHRwICRjbGllbnQgPSBudWxsKQ0KCXsNCgkJJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9ucyA/OiBuZXcgUmVnaXN0cnk7DQoNCgkJLy8gU2V0dXAgdGhlIGRlZmF1bHQgdXNlciBhZ2VudCBpZiBub3QgYWxyZWFkeSBzZXQuDQoJCWlmICghJHRoaXMtPmdldE9wdGlvbigndXNlckFnZW50JykpDQoJCXsNCgkJCSR0aGlzLT5zZXRPcHRpb24oJ3VzZXJBZ2VudCcsICdKW1tbQXBpXV1dLzEuMCcpOw0KCQl9DQoNCgkJLy8gU2V0dXAgdGhlIGRlZmF1bHQgQVBJIHVybCBpZiBub3QgYWxyZWFkeSBzZXQuDQoJCWlmICghJHRoaXMtPmdldE9wdGlvbignYXBpLnVybCcpKQ0KCQl7DQoJCQkkdGhpcy0+c2V0T3B0aW9uKCdhcGkudXJsJywgJ1tbW3Jvb3RfYXBpX3VybF1dXScpOw0KCQl9DQoNCgkJJHRoaXMtPmNsaWVudCA9ICRjbGllbnQgPzogKG5ldyBIdHRwRmFjdG9yeSktPmdldEh0dHAoJHRoaXMtPm9wdGlvbnMpOw0KCX0NCg0KCS8qKg0KCSAqIE1hZ2ljIG1ldGhvZCB0byBsYXppbHkgY3JlYXRlIEFQSSBvYmplY3RzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRuYW1lICBOYW1lIG9mIHByb3BlcnR5IHRvIHJldHJpZXZlDQoJICoNCgkgKiBAcmV0dXJuICBBYnN0cmFjdFtbW0FwaV1dXU9iamVjdCAgW1tbQXBpXV1dIEFQSSBvYmplY3QgKGlzc3VlcywgcHVsbHMsIGV0YykuDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKiBAdGhyb3dzICBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIElmICRuYW1lIGlzIG5vdCBhIHZhbGlkIHN1YiBjbGFzcy4NCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19nZXQoJG5hbWUpDQoJew0KCQkkY2xhc3MgPSAnXFxbW1tDT01QQU5ZXV1dXFxbW1tBcGldXV1cXFBhY2thZ2VcXCcgLiB1Y2ZpcnN0KCRuYW1lKTsNCg0KCQlpZiAoY2xhc3NfZXhpc3RzKCRjbGFzcykpDQoJCXsNCgkJCWlmIChpc3NldCgkdGhpcy0+JG5hbWUpID09IGZhbHNlKQ0KCQkJew0KCQkJCSR0aGlzLT4kbmFtZSA9IG5ldyAkY2xhc3MoJHRoaXMtPm9wdGlvbnMsICR0aGlzLT5jbGllbnQpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gJHRoaXMtPiRuYW1lOw0KCQl9DQoNCgkJdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQXJndW1lbnQgJXMgcHJvZHVjZWQgYW4gaW52YWxpZCBjbGFzcyBuYW1lOiAlcycsICRuYW1lLCAkY2xhc3MpKTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYW4gb3B0aW9uIGZyb20gdGhlIFtbW0FwaV1dXSBpbnN0YW5jZS4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGtleSAgVGhlIG5hbWUgb2YgdGhlIG9wdGlvbiB0byBnZXQuDQoJICoNCgkgKiBAcmV0dXJuICBtaXhlZCAgVGhlIG9wdGlvbiB2YWx1ZS4NCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oJGtleSkNCgl7DQoJCXJldHVybiBpc3NldCgkdGhpcy0+b3B0aW9uc1ska2V5XSkgPyAkdGhpcy0+b3B0aW9uc1ska2V5XSA6IG51bGw7DQoJfQ0KDQoJLyoqDQoJICogU2V0IGFuIG9wdGlvbiBmb3IgdGhlIFtbW0FwaV1dXSBpbnN0YW5jZS4NCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGtleSAgICBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uIHRvIHNldC4NCgkgKiBAcGFyYW0gICBtaXhlZCAgICR2YWx1ZSAgVGhlIG9wdGlvbiB2YWx1ZSB0byBzZXQuDQoJICoNCgkgKiBAcmV0dXJuICBbW1tBcGldXV0gIFRoaXMgb2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuDQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKCRrZXksICR2YWx1ZSkNCgl7DQoJCSR0aGlzLT5vcHRpb25zWyRrZXldID0gJHZhbHVlOw0KDQoJCXJldHVybiAkdGhpczsNCgl9DQo=', '{}', '[[[Api]]]', '[[[COMPANY]]]\\[[[Api]]]\\[[[Api]]]', '1.0.0', '{}', 'API', 'class', '{}', '', 1, '2022-01-05 00:44:15', '2022-09-20 10:09:49', 6, 4),
(10, 1, 'Control the naming of a field\r\n\r\n@since 3.0.9', '', '', '9ef0eb24-aae4-4f5a-99af-d724db44808f', 'dXNlIEpvb21sYVxDTVNcQ29tcG9uZW50XENvbXBvbmVudEhlbHBlcjs=', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBmaWVsZCBidWlsZGVyIHN3aXRjaA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljICRidWlsZGVyID0gZmFsc2U7DQoNCgkvKioNCgkgKiBNYWtpbmcgZmllbGQgbmFtZXMgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgc3RyaW5nIHlvdSB3b3VsZCBsaWtlIHRvIG1ha2Ugc2FmZQ0KCSAqIEBpbnB1dAlib29sZWFuICAgICAgVGhlIHN3aXRjaCB0byByZXR1cm4gYW4gQUxMIFVQUEVSIENBU0Ugc3RyaW5nDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgc3RyaW5nIHRvIHVzZSBpbiB3aGl0ZSBzcGFjZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlKCRzdHJpbmcsICRhbGxjYXAgPSBmYWxzZSwgJHNwYWNlciA9ICdfJykNCgl7DQoJCS8vIGdldCBnbG9iYWwgdmFsdWUNCgkJaWYgKHNlbGY6OiRidWlsZGVyID09PSBmYWxzZSkNCgkJew0KCQkJc2VsZjo6JGJ1aWxkZXIgPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJ2ZpZWxkX25hbWVfYnVpbGRlcicsIDEpOw0KCQl9DQoNCgkJLy8gdXNlIHRoZSBuZXcgY29udmVudGlvbg0KCQlpZiAoMiA9PSBzZWxmOjokYnVpbGRlcikNCgkJew0KCQkJLy8gMG5seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgc3RyaW5nDQoJCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKSkNCgkJCXsNCgkJCQkvLyBjaGVjayB0aGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm90IGEgbnVtYmVyDQoJCQkJaWYgKGlzX251bWVyaWMoc3Vic3RyKChzdHJpbmcpJHN0cmluZywgMCwgMSkpKQ0KCQkJCXsNCgkJCQkJJHN0cmluZyA9IFN0cmluZ0hlbHBlcjo6bnVtYmVycygkc3RyaW5nKTsNCgkJCQl9DQoNCgkJCQkvLyByZW1vdmUgYWxsIG90aGVyIHN0cmFuZ2UgY2hhcmFjdGVycw0KCQkJCSRzdHJpbmcgPSB0cmltKChzdHJpbmcpICRzdHJpbmcpOw0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy8nLiRzcGFjZXIuJysvJywgJyAnLCAkc3RyaW5nKTsNCgkJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcvXHMrLycsICcgJywgJHN0cmluZyk7DQoNCgkJCQkvLyBUcmFuc2xpdGVyYXRlIHN0cmluZw0KCQkJCSRzdHJpbmcgPSBTdHJpbmdIZWxwZXI6OnRyYW5zbGl0ZXJhdGUoJHN0cmluZyk7DQoNCgkJCQkvLyByZW1vdmUgYWxsIGFuZCBrZWVwIG9ubHkgY2hhcmFjdGVycyBhbmQgbnVtYmVycw0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOSBdLyIsICcnLCAoc3RyaW5nKSAkc3RyaW5nKTsNCg0KCQkJCS8vIHJlcGxhY2Ugd2hpdGUgc3BhY2Ugd2l0aCB1bmRlcnNjb3JlIChTQUZFU1QgT1BUSU9OKQ0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgKHN0cmluZykgJHNwYWNlciwgJHN0cmluZyk7DQoNCgkJCQkvLyByZXR1cm4gYWxsIGNhcHMNCgkJCQlpZiAoJGFsbGNhcCkNCgkJCQl7DQoJCQkJCXJldHVybiBzdHJ0b3VwcGVyKCRzdHJpbmcpOw0KCQkJCX0NCg0KCQkJCS8vIGRlZmF1bHQgaXMgdG8gcmV0dXJuIGxvd2VyDQoJCQkJcmV0dXJuIHN0cnRvbG93ZXIoJHN0cmluZyk7DQoJCQl9DQoJCQkvLyBub3QgYSBzdHJpbmcNCgkJCXJldHVybiAnJzsNCgkJfQ0KDQoJCS8vIHJldHVybiBhbGwgY2Fwcw0KCQlpZiAoJGFsbGNhcCkNCgkJew0KCQkJcmV0dXJuIFN0cmluZ0hlbHBlcjo6c2FmZSgkc3RyaW5nLCAnVScpOw0KCQl9DQoNCgkJLy8gdXNlIHRoZSBkZWZhdWx0IChvcmlnaW5hbCBiZWhhdmlvci9jb252ZW50aW9uKQ0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCX0NCg==', '{}', 'FieldHelper', 'VDM\\Joomla\\Utilities.String.FieldHelper', '1.0.0', '{}', 'String Field Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"},\"use_selection1\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-08 20:46:56', '2023-01-14 18:06:18', 22, 5),
-(11, '', 'The json checker\r\n\r\n@since 3.0.9', '', '', '4b225c51-d293-48e4-b3f6-5136cf5c3f18', '', '', '', '{\"load_selection0\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"},\"load_selection1\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection2\":{\"load\":\"db87c339-5bb6-4291-a7ef-2c48ea1b06bc\"}}', 'CS8qKg0KCSAqIENoZWNrIGlmIHlvdSBoYXZlIGEganNvbiBzdHJpbmcNCgkgKg0KCSAqIEBpbnB1dCAgICBzdHJpbmcgICRzdHJpbmcgIFRoZSBqc29uIHN0cmluZyB0byBjaGVjaw0KCSAqDQoJICogQHJldHVybnMgYm9vbCB0cnVlIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVjaygkc3RyaW5nKTogYm9vbA0KCXsNCgkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJHN0cmluZykpDQoJCXsNCgkJCWpzb25fZGVjb2RlKChzdHJpbmcpICRzdHJpbmcpOw0KCQkJcmV0dXJuIChqc29uX2xhc3RfZXJyb3IoKSA9PT0gSlNPTl9FUlJPUl9OT05FKTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBDb252ZXJ0IGEganNvbiBvYmplY3QgdG8gYSBzdHJpbmcNCgkgKg0KCSAqIEBpbnB1dCAgICBzdHJpbmcgICR2YWx1ZSAgVGhlIGpzb24gc3RyaW5nIHRvIGNvbnZlcnQNCgkgKg0KCSAqIEByZXR1cm5zIGEgc3RyaW5nDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RyaW5nKCR2YWx1ZSwgJHNlcGFyYXRvciA9ICIsICIsICR0YWJsZSA9IG51bGwsICRpZCA9ICdpZCcsICRuYW1lID0gJ25hbWUnKQ0KCXsNCgkJLy8gZG8gc29tZSB0YWJsZSBmb290IHdvcmsNCgkJJGV4dGVybmFsID0gZmFsc2U7DQoJCWlmIChpc19zdHJpbmcoJHRhYmxlKSAmJiBzdHJwb3MoKHN0cmluZykgJHRhYmxlLCAnI19fJykgIT09IGZhbHNlKQ0KCQl7DQoJCQkkZXh0ZXJuYWwgPSB0cnVlOw0KCQkJJHRhYmxlID0gc3RyX3JlcGxhY2UoJyNfXycsICcnLCAoc3RyaW5nKSAkdGFibGUpOw0KCQl9DQoNCgkJLy8gY2hlY2sgaWYgc3RyaW5nIGlzIEpTT04NCgkJJHJlc3VsdCA9IGpzb25fZGVjb2RlKChzdHJpbmcpICR2YWx1ZSwgdHJ1ZSk7DQoJCWlmIChqc29uX2xhc3RfZXJyb3IoKSA9PT0gSlNPTl9FUlJPUl9OT05FKQ0KCQl7DQoJCQkvLyBpcyBKU09ODQoJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCRyZXN1bHQpKQ0KCQkJew0KCQkJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCR0YWJsZSkpDQoJCQkJew0KCQkJCQkkbmFtZXMgPSBhcnJheSgpOw0KCQkJCQlmb3JlYWNoICgkcmVzdWx0IGFzICR2YWwpDQoJCQkJCXsNCgkJCQkJCWlmICgkZXh0ZXJuYWwpDQoJCQkJCQl7DQoJCQkJCQkJaWYgKCRfbmFtZSA9IEdldEhlbHBlcjo6dmFyKG51bGwsICR2YWwsICRpZCwgJG5hbWUsICc9JywgJHRhYmxlKSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRuYW1lc1tdID0gJF9uYW1lOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQlpZiAoJF9uYW1lID0gR2V0SGVscGVyOjp2YXIoJHRhYmxlLCAkdmFsLCAkaWQsICRuYW1lKSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRuYW1lc1tdID0gJF9uYW1lOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCRuYW1lcykpDQoJCQkJCXsNCgkJCQkJCXJldHVybiAoc3RyaW5nKSBpbXBsb2RlKCRzZXBhcmF0b3IsICRuYW1lcyk7DQoJCQkJCX0JDQoJCQkJfQ0KCQkJCXJldHVybiAoc3RyaW5nKSBpbXBsb2RlKCRzZXBhcmF0b3IsICRyZXN1bHQpOw0KCQkJfQ0KCQkJcmV0dXJuIChzdHJpbmcpIGpzb25fZGVjb2RlKChzdHJpbmcpICR2YWx1ZSk7DQoJCX0NCgkJcmV0dXJuICR2YWx1ZTsNCgl9DQo=', '{}', 'JsonHelper', 'VDM\\Joomla\\Utilities.JsonHelper', '1.0.0', '{}', 'Utilities Json Helper', 'abstract class', '{}', '', 1, '2022-03-08 21:03:54', '2023-01-14 18:11:18', 22, 6),
-(12, 1, 'Some string tricks\r\n\r\n@since 3.0.9', '', '', '1f28cb53-60d9-4db1-b517-3c7dc6b429ef', 'dXNlIEpvb21sYVxDTVNcRmlsdGVyXElucHV0RmlsdGVyOw0KdXNlIEpvb21sYVxDTVNcTGFuZ3VhZ2VcTGFuZ3VhZ2U7', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"}}', 'CS8qKg0KCSAqIFRoZSBNYWluIEFjdGl2ZSBMYW5ndWFnZQ0KCSAqIA0KCSAqIEB2YXIgICAgICBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyAkbGFuZ1RhZzsNCg0KCS8qKg0KCSAqIENoZWNrIGlmIHdlIGhhdmUgYSBzdHJpbmcgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGUgc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrKCRzdHJpbmcpOiBib29sDQoJew0KCQlyZXR1cm4gaXNfc3RyaW5nKCRzdHJpbmcpICYmIHN0cmxlbigkc3RyaW5nKSA+IDA7DQoJfQ0KDQoJLyoqDQoJICogU2hvcnRlbiBhIHN0cmluZw0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBzaG9ydGVuDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCA9IDQwLCAkYWRkVGlwID0gdHJ1ZSkNCgl7DQoJCWlmIChzZWxmOjpjaGVjaygkc3RyaW5nKSkNCgkJew0KCQkJJGluaXRpYWwgPSBzdHJsZW4oKHN0cmluZykgJHN0cmluZyk7DQoJCQkkd29yZHMgPSBwcmVnX3NwbGl0KCcvKFtcc1xuXHJdKykvJywgKHN0cmluZykgJHN0cmluZywgbnVsbCwgUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTsNCgkJCSR3b3Jkc19jb3VudCA9IGNvdW50KChhcnJheSkkd29yZHMpOw0KDQoJCQkkd29yZF9sZW5ndGggPSAwOw0KCQkJJGxhc3Rfd29yZCA9IDA7DQoJCQlmb3IgKDsgJGxhc3Rfd29yZCA8ICR3b3Jkc19jb3VudDsgKyskbGFzdF93b3JkKQ0KCQkJew0KCQkJCSR3b3JkX2xlbmd0aCArPSBzdHJsZW4oJHdvcmRzWyRsYXN0X3dvcmRdKTsNCgkJCQlpZiAoJHdvcmRfbGVuZ3RoID4gJGxlbmd0aCkNCgkJCQl7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCg0KCQkJJG5ld1N0cmluZwk9IGltcGxvZGUoYXJyYXlfc2xpY2UoJHdvcmRzLCAwLCAkbGFzdF93b3JkKSk7DQoJCQkkZmluYWwJPSBzdHJsZW4oJG5ld1N0cmluZyk7DQoJCQlpZiAoJGluaXRpYWwgIT09ICRmaW5hbCAmJiAkYWRkVGlwKQ0KCQkJew0KCQkJCSR0aXRsZSA9IHNlbGY6OnNob3J0ZW4oJHN0cmluZywgNDAwICwgZmFsc2UpOw0KCQkJCXJldHVybiAnPHNwYW4gY2xhc3M9Imhhc1RpcCIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIiBzdHlsZT0iY3Vyc29yOmhlbHAiPicgLiB0cmltKCRuZXdTdHJpbmcpIC4gJy4uLjwvc3Bhbj4nOw0KCQkJfQ0KCQkJZWxzZWlmICgkaW5pdGlhbCAhPT0gJGZpbmFsICYmICEkYWRkVGlwKQ0KCQkJew0KCQkJCXJldHVybiB0cmltKCRuZXdTdHJpbmcpIC4gJy4uLic7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRzdHJpbmc7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIHN0cmluZ3Mgc2FmZSAodmFyaW91cyB3YXlzKQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZSgkc3RyaW5nLCAkdHlwZSA9ICdMJywgJHNwYWNlciA9ICdfJywgJHJlcGxhY2VOdW1iZXJzID0gdHJ1ZSwgJGtlZXBPbmx5Q2hhcmFjdGVycyA9IHRydWUpDQoJew0KCQlpZiAoJHJlcGxhY2VOdW1iZXJzID09PSB0cnVlKQ0KCQl7DQoJCQkvLyByZW1vdmUgYWxsIG51bWJlcnMgYW5kIHJlcGxhY2Ugd2l0aCBFbmdsaXNoIHRleHQgdmVyc2lvbiAod29ya3Mgd2VsbCBvbmx5IHVwIHRvIG1pbGxpb25zKQ0KCQkJJHN0cmluZyA9IHNlbGY6Om51bWJlcnMoJHN0cmluZyk7DQoJCX0NCgkJLy8gMG5seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgc3RyaW5nDQoJCWlmIChzZWxmOjpjaGVjaygkc3RyaW5nKSkNCgkJew0KCQkJLy8gY3JlYXRlIGZpbGUgbmFtZSB3aXRob3V0IHRoZSBleHRlbnNpb24gdGhhdCBpcyBzYWZlDQoJCQlpZiAoJHR5cGUgPT09ICdmaWxlbmFtZScpDQoJCQl7DQoJCQkJLy8gbWFrZSBzdXJlIFZETSBpcyBub3QgaW4gdGhlIHN0cmluZw0KCQkJCSRzdHJpbmcgPSBzdHJfcmVwbGFjZSgnVkRNJywgJ3ZEbScsIChzdHJpbmcpICRzdHJpbmcpOw0KCQkJCS8vIFJlbW92ZSBhbnl0aGluZyB3aGljaCBpc24ndCBhIHdvcmQsIHdoaXRlc3BhY2UsIG51bWJlcg0KCQkJCS8vIG9yIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhcmFjdGVycyAtXygpDQoJCQkJLy8gSWYgeW91IGRvbid0IG5lZWQgdG8gaGFuZGxlIG11bHRpLWJ5dGUgY2hhcmFjdGVycw0KCQkJCS8vIHlvdSBjYW4gdXNlIHByZWdfcmVwbGFjZSByYXRoZXIgdGhhbiBtYl9lcmVnX3JlcGxhY2UNCgkJCQkvLyBUaGFua3MgQMWBdWthc3ogUnlzaWFrIQ0KCQkJCS8vICRzdHJpbmcgPSBtYl9lcmVnX3JlcGxhY2UoIihbXlx3XHNcZFwtX1woXCldKSIsICcnLCAkc3RyaW5nKTsNCgkJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCIoW15cd1xzXGRcLV9cKFwpXSkiLCAnJywgJHN0cmluZyk7DQoNCgkJCQkvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMDIxNzI5LzE0Mjk2NzcNCgkJCQlyZXR1cm4gcHJlZ19yZXBsYWNlKCcvXHMrLycsICcgJywgKHN0cmluZykgJHN0cmluZyk7DQoJCQl9DQoJCQkvLyByZW1vdmUgYWxsIG90aGVyIGNoYXJhY3RlcnMNCgkJCSRzdHJpbmcgPSB0cmltKChzdHJpbmcpICRzdHJpbmcpOw0KCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnLycuJHNwYWNlci4nKy8nLCAnICcsICRzdHJpbmcpOw0KCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAnICcsICRzdHJpbmcpOw0KCQkJLy8gVHJhbnNsaXRlcmF0ZSBzdHJpbmcNCgkJCSRzdHJpbmcgPSBzZWxmOjp0cmFuc2xpdGVyYXRlKCRzdHJpbmcpOw0KCQkJLy8gcmVtb3ZlIGFsbCBhbmQga2VlcCBvbmx5IGNoYXJhY3RlcnMNCgkJCWlmICgka2VlcE9ubHlDaGFyYWN0ZXJzKQ0KCQkJew0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEteiBdLyIsICcnLCAoc3RyaW5nKSAkc3RyaW5nKTsNCgkJCX0NCgkJCS8vIGtlZXAgYm90aCBudW1iZXJzIGFuZCBjaGFyYWN0ZXJzDQoJCQllbHNlDQoJCQl7DQoJCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgJycsIChzdHJpbmcpICRzdHJpbmcpOw0KCQkJfQ0KCQkJLy8gc2VsZWN0IGZpbmFsIGFkYXB0YXRpb25zDQoJCQlpZiAoJHR5cGUgPT09ICdMJyB8fCAkdHlwZSA9PT0gJ3N0cnRvbG93ZXInKQ0KCQkJew0KCQkJCS8vIHJlcGxhY2Ugd2hpdGUgc3BhY2Ugd2l0aCB1bmRlcnNjb3JlDQoJCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAoc3RyaW5nKSAkc3BhY2VyLCAoc3RyaW5nKSAkc3RyaW5nKTsNCgkJCQkvLyBkZWZhdWx0IGlzIHRvIHJldHVybiBsb3dlcg0KCQkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ1cnKQ0KCQkJew0KCQkJCS8vIHJldHVybiBhIHN0cmluZyB3aXRoIGFsbCBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIHVwcGVyY2FzZShubyB1bmRlcnNjb3JlKQ0KCQkJCXJldHVybiB1Y3dvcmRzKHN0cnRvbG93ZXIoJHN0cmluZykpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ3cnIHx8ICR0eXBlID09PSAnd29yZCcpDQoJCQl7DQoJCQkJLy8gcmV0dXJuIGEgc3RyaW5nIHdpdGggYWxsIGxvd2VyY2FzZShubyB1bmRlcnNjb3JlKQ0KCQkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ1d3JyB8fCAkdHlwZSA9PT0gJ1dvcmQnKQ0KCQkJew0KCQkJCS8vIHJldHVybiBhIHN0cmluZyB3aXRoIGZpcnN0IGxldHRlciBvZiB0aGUgZmlyc3Qgd29yZCB1cHBlcmNhc2UgYW5kIGFsbCB0aGUgcmVzdCBsb3dlcmNhc2Uobm8gdW5kZXJzY29yZSkNCgkJCQlyZXR1cm4gdWNmaXJzdChzdHJ0b2xvd2VyKCRzdHJpbmcpKTsNCgkJCX0NCgkJCWVsc2VpZiAoJHR5cGUgPT09ICdXVycgfHwgJHR5cGUgPT09ICdXT1JEJykNCgkJCXsNCgkJCQkvLyByZXR1cm4gYSBzdHJpbmcgd2l0aCBhbGwgdGhlIHVwcGVyY2FzZShubyB1bmRlcnNjb3JlKQ0KCQkJCXJldHVybiBzdHJ0b3VwcGVyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ1UnIHx8ICR0eXBlID09PSAnc3RydG91cHBlcicpDQoJCQl7DQoJCQkJCS8vIHJlcGxhY2Ugd2hpdGUgc3BhY2Ugd2l0aCB1bmRlcnNjb3JlDQoJCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgKHN0cmluZykgJHNwYWNlciwgJHN0cmluZyk7DQoJCQkJCS8vIHJldHVybiBhbGwgdXBwZXINCgkJCQkJcmV0dXJuIHN0cnRvdXBwZXIoJHN0cmluZyk7DQoJCQl9DQoJCQllbHNlaWYgKCR0eXBlID09PSAnRicgfHwgJHR5cGUgPT09ICd1Y2ZpcnN0JykNCgkJCXsNCgkJCQkJLy8gcmVwbGFjZSB3aGl0ZSBzcGFjZSB3aXRoIHVuZGVyc2NvcmUNCgkJCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAoc3RyaW5nKSAkc3BhY2VyLCAkc3RyaW5nKTsNCgkJCQkJLy8gcmV0dXJuIHdpdGggZmlyc3QgY2hhcmFjdGVyIHRvIHVwcGVyDQoJCQkJCXJldHVybiB1Y2ZpcnN0KHN0cnRvbG93ZXIoJHN0cmluZykpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ2NBJyB8fCAkdHlwZSA9PT0gJ2NBbWVsJyB8fCAkdHlwZSA9PT0gJ2NhbWVsY2FzZScpDQoJCQl7DQoJCQkJLy8gY29udmVydCBhbGwgd29yZHMgdG8gZmlyc3QgbGV0dGVyIHVwcGVyY2FzZQ0KCQkJCSRzdHJpbmcgPSB1Y3dvcmRzKHN0cnRvbG93ZXIoJHN0cmluZykpOw0KCQkJCS8vIHJlbW92ZSB3aGl0ZSBzcGFjZQ0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgJycsICRzdHJpbmcpOw0KCQkJCS8vIG5vdyByZXR1cm4gZmlyc3QgbGV0dGVyIGxvd2VyY2FzZQ0KCQkJCXJldHVybiBsY2ZpcnN0KCRzdHJpbmcpOw0KCQkJfQ0KCQkJLy8gcmV0dXJuIHN0cmluZw0KCQkJcmV0dXJuICRzdHJpbmc7DQoJCX0NCgkJLy8gbm90IGEgc3RyaW5nDQoJCXJldHVybiAnJzsNCgl9DQoNCgkvKioNCgkgKiBDb252ZXJ0IG5vbmUgRW5nbGlzaCBzdHJpbmdzIHRvIGNvZGUgdXNhYmxlIHN0cmluZw0KCSAqDQoJICogQGlucHV0CWFuIHN0cmluZw0KCSAqDQoJICogQHJldHVybnMgYSBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmFuc2xpdGVyYXRlKCRzdHJpbmcpDQoJew0KCQkvLyBzZXQgdGFnIG9ubHkgb25jZQ0KCQlpZiAoIXNlbGY6OmNoZWNrKHNlbGY6OiRsYW5nVGFnKSkNCgkJew0KCQkJLy8gZ2V0IGdsb2JhbCB2YWx1ZQ0KCQkJc2VsZjo6JGxhbmdUYWcgPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJ2xhbmd1YWdlJywgJ2VuLUdCJyk7DQoJCX0NCg0KCQkvLyBUcmFuc2xpdGVyYXRlIG9uIHRoZSBsYW5ndWFnZSByZXF1ZXN0ZWQNCgkJJGxhbmcgPSBMYW5ndWFnZTo6Z2V0SW5zdGFuY2Uoc2VsZjo6JGxhbmdUYWcpOw0KDQoJCXJldHVybiAkbGFuZy0+dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBtYWtlIHN1cmUgYSBzdHJpbmcgaXMgSFRNTCBzYXZlDQoJICoNCgkgKiBAaW5wdXQJYW4gaHRtbCBzdHJpbmcNCgkgKg0KCSAqIEByZXR1cm5zIGEgc3RyaW5nDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHRtbCgkdmFyLCAkY2hhcnNldCA9ICdVVEYtOCcsICRzaG9ydGVuID0gZmFsc2UsICRsZW5ndGggPSA0MCwgJGFkZFRpcCA9IHRydWUpDQoJew0KCQlpZiAoc2VsZjo6Y2hlY2soJHZhcikpDQoJCXsNCgkJCSRmaWx0ZXIgPSBuZXcgSW5wdXRGaWx0ZXIoKTsNCgkJCSRzdHJpbmcgPSAkZmlsdGVyLT5jbGVhbigNCgkJCQlodG1sX2VudGl0eV9kZWNvZGUoDQoJCQkJCWh0bWxlbnRpdGllcygNCgkJCQkJCShzdHJpbmcpICR2YXIsDQoJCQkJCQlFTlRfQ09NUEFULA0KCQkJCQkJJGNoYXJzZXQNCgkJCQkJKQ0KCQkJCSksDQoJCQkJJ0hUTUwnDQoJCQkpOw0KCQkJaWYgKCRzaG9ydGVuKQ0KCQkJew0KCQkJCXJldHVybiBzZWxmOjpzaG9ydGVuKCRzdHJpbmcsICRsZW5ndGgsICRhZGRUaXApOw0KCQkJfQ0KCQkJcmV0dXJuICRzdHJpbmc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCgl9DQoNCgkvKioNCgkgKiBDb252ZXJ0IGFsbCBpbnQgaW4gYSBzdHJpbmcgdG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqDQoJICogQGlucHV0CWFuIHN0cmluZyB3aXRoIG51bWJlcnMNCgkgKg0KCSAqIEByZXR1cm5zIGEgc3RyaW5nDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbnVtYmVycygkc3RyaW5nKQ0KCXsNCgkJLy8gc2V0IG51bWJlcnMgYXJyYXkNCgkJJG51bWJlcnMgPSBbXTsNCgkJJHNlYXJjaF9yZXBsYWNlPSBbXTsNCg0KCQkvLyBmaXJzdCBnZXQgYWxsIG51bWJlcnMNCgkJcHJlZ19tYXRjaF9hbGwoJyFcZCshJywgKHN0cmluZykgJHN0cmluZywgJG51bWJlcnMpOw0KDQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYW55IG51bWJlcnMNCgkJaWYgKGlzc2V0KCRudW1iZXJzWzBdKSAmJiBBcnJheUhlbHBlcjo6Y2hlY2soJG51bWJlcnNbMF0pKQ0KCQl7DQoJCQlmb3JlYWNoICgkbnVtYmVyc1swXSBhcyAkbnVtYmVyKQ0KCQkJew0KCQkJCSRzZWFyY2hfcmVwbGFjZVskbnVtYmVyXSA9IHNlbGY6Om51bWJlcigoaW50KSRudW1iZXIpOw0KCQkJfQ0KDQoJCQkvLyBub3cgcmVwbGFjZSBudW1iZXJzIGluIHN0cmluZw0KCQkJJHN0cmluZyA9IHN0cl9yZXBsYWNlKGFycmF5X2tleXMoJHNlYXJjaF9yZXBsYWNlKSwgYXJyYXlfdmFsdWVzKCRzZWFyY2hfcmVwbGFjZSksIChzdHJpbmcpICRzdHJpbmcpOw0KDQoJCQkvLyBjaGVjayBpZiB3ZSBtaXNzZWQgYW55LCBzdHJhbmdlIGlmIHdlIGRpZC4NCgkJCXJldHVybiBzZWxmOjpudW1iZXJzKCRzdHJpbmcpOw0KCQl9DQoNCgkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgd2l0aCBubyBudW1iZXJzIHJlbWFpbmluZy4NCgkJcmV0dXJuICRzdHJpbmc7DQoJfQ0KDQoJLyoqDQoJICogQ29udmVydCBhbiBpbnRlZ2VyIGludG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqIFRoYW5rcyB0byBUb20gTmljaG9sc29uIDxodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3RydmFsLnBocCM0MTk4OD4NCgkgKg0KCSAqIEBpbnB1dAlhbiBpbnQNCgkgKiBAcmV0dXJucyBhIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG51bWJlcigkeCkNCgl7DQoJCSRud29yZHMgPSBhcnJheSggInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwNCgkJCSJlaWdodCIsICJuaW5lIiwgInRlbiIsICJlbGV2ZW4iLCAidHdlbHZlIiwgInRoaXJ0ZWVuIiwNCgkJCSJmb3VydGVlbiIsICJmaWZ0ZWVuIiwgInNpeHRlZW4iLCAic2V2ZW50ZWVuIiwgImVpZ2h0ZWVuIiwNCgkJCSJuaW5ldGVlbiIsICJ0d2VudHkiLCAzMCA9PiAidGhpcnR5IiwgNDAgPT4gImZvcnR5IiwNCgkJCTUwID0+ICJmaWZ0eSIsIDYwID0+ICJzaXh0eSIsIDcwID0+ICJzZXZlbnR5IiwgODAgPT4gImVpZ2h0eSIsDQoJCQk5MCA9PiAibmluZXR5IiApOw0KDQoJCWlmKCFpc19udW1lcmljKCR4KSkNCgkJew0KCQkJJHcgPSAkeDsNCgkJfQ0KCQllbHNlaWYoZm1vZCgkeCwgMSkgIT0gMCkNCgkJew0KCQkJJHcgPSAkeDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCWlmKCR4IDwgMCkNCgkJCXsNCgkJCQkkdyA9ICdtaW51cyAnOw0KCQkJCSR4ID0gLSR4Ow0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSR3ID0gJyc7DQoJCQkJLy8gLi4uIG5vdyAkeCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLg0KCQkJfQ0KDQoJCQlpZigkeCA8IDIxKSAgIC8vIDAgdG8gMjANCgkJCXsNCgkJCQkkdyAuPSAkbndvcmRzWyR4XTsNCgkJCX0NCgkJCWVsc2VpZigkeCA8IDEwMCkgIC8vIDIxIHRvIDk5DQoJCQl7IA0KCQkJCSR3IC49ICRud29yZHNbMTAgKiBmbG9vcigkeC8xMCldOw0KCQkJCSRyID0gZm1vZCgkeCwgMTApOw0KCQkJCWlmKCRyID4gMCkNCgkJCQl7DQoJCQkJCSR3IC49ICcgJyAuICRud29yZHNbJHJdOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZigkeCA8IDEwMDApICAvLyAxMDAgdG8gOTk5DQoJCQl7DQoJCQkJJHcgLj0gJG53b3Jkc1tmbG9vcigkeC8xMDApXSAuJyBodW5kcmVkJzsNCgkJCQkkciA9IGZtb2QoJHgsIDEwMCk7DQoJCQkJaWYoJHIgPiAwKQ0KCQkJCXsNCgkJCQkJJHcgLj0gJyBhbmQgJy4gc2VsZjo6bnVtYmVyKCRyKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlaWYoJHggPCAxMDAwMDAwKSAgLy8gMTAwMCB0byA5OTk5OTkNCgkJCXsNCgkJCQkkdyAuPSBzZWxmOjpudW1iZXIoZmxvb3IoJHgvMTAwMCkpIC4nIHRob3VzYW5kJzsNCgkJCQkkciA9IGZtb2QoJHgsIDEwMDApOw0KCQkJCWlmKCRyID4gMCkNCgkJCQl7DQoJCQkJCSR3IC49ICcgJzsNCgkJCQkJaWYoJHIgPCAxMDApDQoJCQkJCXsNCgkJCQkJCSR3IC49ICdhbmQgJzsNCgkJCQkJfQ0KCQkJCQkkdyAuPSBzZWxmOjpudW1iZXIoJHIpOw0KCQkJCX0NCgkJCX0gDQoJCQllbHNlIC8vICBtaWxsaW9ucw0KCQkJeyAgICANCgkJCQkkdyAuPSBzZWxmOjpudW1iZXIoZmxvb3IoJHgvMTAwMDAwMCkpIC4nIG1pbGxpb24nOw0KCQkJCSRyID0gZm1vZCgkeCwgMTAwMDAwMCk7DQoJCQkJaWYoJHIgPiAwKQ0KCQkJCXsNCgkJCQkJJHcgLj0gJyAnOw0KCQkJCQlpZigkciA8IDEwMCkNCgkJCQkJew0KCQkJCQkJJHcgLj0gJ2FuZCAnOw0KCQkJCQl9DQoJCQkJCSR3IC49IHNlbGY6Om51bWJlcigkcik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiAkdzsNCgl9DQoNCgkvKioNCgkgKiBSYW5kb20gS2V5DQoJICoNCgkgKiBAcmV0dXJucyBhIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbSgkc2l6ZSk6IHN0cmluZw0KCXsNCgkJJGJhZyA9ICJhYmNlZmdoaWprbm9wcXJzdHV3eHl6QUJDRERFRkdISUpLTExNTU5PUFFSU1RVVlZXWFlaYWJjZGRlZmdoaWprbGxtbW5vcHFyc3R1dnZ3eHl6QUJDRUZHSElKS05PUFFSU1RVV1hZWiI7DQoJCSRrZXkgPSBhcnJheSgpOw0KCQkkYmFnc2l6ZSA9IHN0cmxlbigkYmFnKSAtIDE7DQoNCgkJZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspDQoJCXsNCgkJCSRnZXQgPSByYW5kKDAsICRiYWdzaXplKTsNCgkJCSRrZXlbXSA9ICRiYWdbJGdldF07DQoJCX0NCg0KCQlyZXR1cm4gaW1wbG9kZSgka2V5KTsNCgl9DQo=', '{}', 'StringHelper', 'VDM\\Joomla\\Utilities.StringHelper', '1.0.0', '{}', 'Utilities String Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-08 21:35:37', '2023-01-31 12:08:09', 31, 7),
-(13, '', 'Some array tricks helper\r\n\r\n@since 3.0.9', '', '', '0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a', '', '', '', '{}', 'CS8qKg0KCSAqIENoZWNrIGlmIGhhdmUgYW4gYXJyYXkgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0CWFycmF5ICAgVGhlIGFycmF5IHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBpbnR8ZmFsc2UgIG51bWJlciBvZiBpdGVtcyBpbiBhcnJheSBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjIuMA0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2soJGFycmF5LCAkcmVtb3ZlRW1wdHlTdHJpbmcgPSBmYWxzZSkNCgl7DQoJCWlmIChpc19hcnJheSgkYXJyYXkpICYmICgkbnIgPSBjb3VudCgoYXJyYXkpJGFycmF5KSkgPiAwKQ0KCQl7DQoJCQkvLyBhbHNvIG1ha2Ugc3VyZSB0aGUgZW1wdHkgc3RyaW5ncyBhcmUgcmVtb3ZlZA0KCQkJaWYgKCRyZW1vdmVFbXB0eVN0cmluZykNCgkJCXsNCgkJCQkkYXJyYXkgPSBhcnJheV9maWx0ZXIoJGFycmF5KTsNCg0KCQkJCWlmIChlbXB0eSgkYXJyYXkpKQ0KCQkJCXsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCg0KCQkJCXJldHVybiBjb3VudCgkYXJyYXkpOw0KCQkJfQ0KDQoJCQlyZXR1cm4gJG5yOw0KCQl9DQoNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIE1lcmdlIGFuIGFycmF5IG9mIGFycmF5J3MNCgkgKg0KCSAqIEBpbnB1dAlhcnJheSAgIFRoZSBhcnJheXMgeW91IHdvdWxkIGxpa2UgdG8gbWVyZ2UNCgkgKg0KCSAqIEByZXR1cm5zIGFycmF5fG51bGwgIG1lcmdlZCBhcnJheSBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWVyZ2UoJGFycmF5cyk6ID9hcnJheQ0KCXsNCgkJaWYoc2VsZjo6Y2hlY2soJGFycmF5cykpDQoJCXsNCgkJCSRtZXJnZWQgPSBbXTsNCgkJCWZvcmVhY2ggKCRhcnJheXMgYXMgJGFycmF5KQ0KCQkJew0KCQkJCWlmIChzZWxmOjpjaGVjaygkYXJyYXkpKQ0KCQkJCXsNCgkJCQkJJG1lcmdlZCA9IGFycmF5X21lcmdlKCRtZXJnZWQsICRhcnJheSk7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuICRtZXJnZWQ7DQoJCX0NCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgYXJyYXlzIGludGVyc2VjdA0KCSAqDQoJICogQGlucHV0CWFycmF5ICAgVGhlIGZpcnN0IGFycmF5DQoJICogQGlucHV0CWFycmF5ICAgVGhlIHNlY29uZCBhcnJheQ0KCSAqDQoJICogQHJldHVybnMgYm9vbCAgdHJ1ZSBpZiBpbnRlcnNlY3QgZWxzZSBmYWxzZQ0KCSAqIA0KCSAqIEBzaW5jZSAgMy4xLjENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGludGVyc2VjdCgkYV9hcnJheSwgJGJfYXJyYXkpOiBib29sDQoJew0KCQkvLyBmbGlwIHRoZSBzZWNvbmQgYXJyYXkNCgkJJGJfYXJyYXkgPSBhcnJheV9mbGlwKCRiX2FycmF5KTsNCg0KCQkvLyBsb29wIHRoZSBmaXJzdCBhcnJheQ0KCQlmb3JlYWNoICgkYV9hcnJheSBhcyAkdikNCgkJew0KCQkJaWYgKGlzc2V0KCRiX2FycmF5WyR2XSkpDQoJCQl7DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg==', '{}', 'ArrayHelper', 'VDM\\Joomla\\Utilities.ArrayHelper', '1.0.0', '{}', 'Utilities Array Helper', 'abstract class', '{}', '', 1, '2022-03-08 22:53:52', '2023-01-18 22:09:16', 20, 8),
+(11, '', 'The json checker\r\n\r\n@since 3.0.9', '', '', '4b225c51-d293-48e4-b3f6-5136cf5c3f18', '', '', '', '{\"load_selection0\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"},\"load_selection1\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection2\":{\"load\":\"db87c339-5bb6-4291-a7ef-2c48ea1b06bc\"}}', 'CS8qKg0KCSAqIENoZWNrIGlmIHlvdSBoYXZlIGEganNvbiBzdHJpbmcNCgkgKg0KCSAqIEBpbnB1dCAgICBzdHJpbmcgICRzdHJpbmcgIFRoZSBqc29uIHN0cmluZyB0byBjaGVjaw0KCSAqDQoJICogQHJldHVybnMgYm9vbCB0cnVlIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVjaygkc3RyaW5nKTogYm9vbA0KCXsNCgkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJHN0cmluZykpDQoJCXsNCgkJCWpzb25fZGVjb2RlKChzdHJpbmcpICRzdHJpbmcpOw0KCQkJcmV0dXJuIChqc29uX2xhc3RfZXJyb3IoKSA9PT0gSlNPTl9FUlJPUl9OT05FKTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBDb252ZXJ0IGEganNvbiBvYmplY3QgdG8gYSBzdHJpbmcNCgkgKg0KCSAqIEBpbnB1dCAgICBzdHJpbmcgICR2YWx1ZSAgVGhlIGpzb24gc3RyaW5nIHRvIGNvbnZlcnQNCgkgKg0KCSAqIEByZXR1cm5zIGEgc3RyaW5nDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RyaW5nKCR2YWx1ZSwgJHNlcGFyYXRvciA9ICIsICIsICR0YWJsZSA9IG51bGwsICRpZCA9ICdpZCcsICRuYW1lID0gJ25hbWUnKQ0KCXsNCgkJLy8gZG8gc29tZSB0YWJsZSBmb290IHdvcmsNCgkJJGV4dGVybmFsID0gZmFsc2U7DQoJCWlmIChpc19zdHJpbmcoJHRhYmxlKSAmJiBzdHJwb3MoKHN0cmluZykgJHRhYmxlLCAnI19fJykgIT09IGZhbHNlKQ0KCQl7DQoJCQkkZXh0ZXJuYWwgPSB0cnVlOw0KCQkJJHRhYmxlID0gc3RyX3JlcGxhY2UoJyNfXycsICcnLCAoc3RyaW5nKSAkdGFibGUpOw0KCQl9DQoNCgkJLy8gY2hlY2sgaWYgc3RyaW5nIGlzIEpTT04NCgkJJHJlc3VsdCA9IGpzb25fZGVjb2RlKChzdHJpbmcpICR2YWx1ZSwgdHJ1ZSk7DQoJCWlmIChqc29uX2xhc3RfZXJyb3IoKSA9PT0gSlNPTl9FUlJPUl9OT05FKQ0KCQl7DQoJCQkvLyBpcyBKU09ODQoJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCRyZXN1bHQpKQ0KCQkJew0KCQkJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCR0YWJsZSkpDQoJCQkJew0KCQkJCQkkbmFtZXMgPSBbXTsNCgkJCQkJZm9yZWFjaCAoJHJlc3VsdCBhcyAkdmFsKQ0KCQkJCQl7DQoJCQkJCQlpZiAoJGV4dGVybmFsKQ0KCQkJCQkJew0KCQkJCQkJCWlmICgkX25hbWUgPSBHZXRIZWxwZXI6OnZhcihudWxsLCAkdmFsLCAkaWQsICRuYW1lLCAnPScsICR0YWJsZSkpDQoJCQkJCQkJew0KCQkJCQkJCQkkbmFtZXNbXSA9ICRfbmFtZTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJaWYgKCRfbmFtZSA9IEdldEhlbHBlcjo6dmFyKCR0YWJsZSwgJHZhbCwgJGlkLCAkbmFtZSkpDQoJCQkJCQkJew0KCQkJCQkJCQkkbmFtZXNbXSA9ICRfbmFtZTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJaWYgKEFycmF5SGVscGVyOjpjaGVjaygkbmFtZXMpKQ0KCQkJCQl7DQoJCQkJCQlyZXR1cm4gKHN0cmluZykgaW1wbG9kZSgkc2VwYXJhdG9yLCAkbmFtZXMpOw0KCQkJCQl9CQ0KCQkJCX0NCgkJCQlyZXR1cm4gKHN0cmluZykgaW1wbG9kZSgkc2VwYXJhdG9yLCAkcmVzdWx0KTsNCgkJCX0NCgkJCXJldHVybiAoc3RyaW5nKSBqc29uX2RlY29kZSgoc3RyaW5nKSAkdmFsdWUpOw0KCQl9DQoJCXJldHVybiAkdmFsdWU7DQoJfQ0K', '{}', 'JsonHelper', 'VDM\\Joomla\\Utilities.JsonHelper', '1.0.0', '{}', 'Utilities Json Helper', 'abstract class', '{}', '', 1, '2022-03-08 21:03:54', '2023-01-14 18:11:18', 22, 6),
+(12, 1, 'Some string tricks\r\n\r\n@since 3.0.9', '', '', '1f28cb53-60d9-4db1-b517-3c7dc6b429ef', 'dXNlIEpvb21sYVxDTVNcRmlsdGVyXElucHV0RmlsdGVyOw0KdXNlIEpvb21sYVxDTVNcTGFuZ3VhZ2VcTGFuZ3VhZ2U7', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"}}', 'CS8qKg0KCSAqIFRoZSBNYWluIEFjdGl2ZSBMYW5ndWFnZQ0KCSAqIA0KCSAqIEB2YXIgICAgICBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyAkbGFuZ1RhZzsNCg0KCS8qKg0KCSAqIENoZWNrIGlmIHdlIGhhdmUgYSBzdHJpbmcgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGUgc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrKCRzdHJpbmcpOiBib29sDQoJew0KCQlyZXR1cm4gaXNfc3RyaW5nKCRzdHJpbmcpICYmIHN0cmxlbigkc3RyaW5nKSA+IDA7DQoJfQ0KDQoJLyoqDQoJICogU2hvcnRlbiBhIHN0cmluZw0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBzaG9ydGVuDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCA9IDQwLCAkYWRkVGlwID0gdHJ1ZSkNCgl7DQoJCWlmIChzZWxmOjpjaGVjaygkc3RyaW5nKSkNCgkJew0KCQkJJGluaXRpYWwgPSBzdHJsZW4oKHN0cmluZykgJHN0cmluZyk7DQoJCQkkd29yZHMgPSBwcmVnX3NwbGl0KCcvKFtcc1xuXHJdKykvJywgKHN0cmluZykgJHN0cmluZywgbnVsbCwgUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTsNCgkJCSR3b3Jkc19jb3VudCA9IGNvdW50KChhcnJheSkkd29yZHMpOw0KDQoJCQkkd29yZF9sZW5ndGggPSAwOw0KCQkJJGxhc3Rfd29yZCA9IDA7DQoJCQlmb3IgKDsgJGxhc3Rfd29yZCA8ICR3b3Jkc19jb3VudDsgKyskbGFzdF93b3JkKQ0KCQkJew0KCQkJCSR3b3JkX2xlbmd0aCArPSBzdHJsZW4oJHdvcmRzWyRsYXN0X3dvcmRdKTsNCgkJCQlpZiAoJHdvcmRfbGVuZ3RoID4gJGxlbmd0aCkNCgkJCQl7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCg0KCQkJJG5ld1N0cmluZwk9IGltcGxvZGUoYXJyYXlfc2xpY2UoJHdvcmRzLCAwLCAkbGFzdF93b3JkKSk7DQoJCQkkZmluYWwJPSBzdHJsZW4oJG5ld1N0cmluZyk7DQoJCQlpZiAoJGluaXRpYWwgIT09ICRmaW5hbCAmJiAkYWRkVGlwKQ0KCQkJew0KCQkJCSR0aXRsZSA9IHNlbGY6OnNob3J0ZW4oJHN0cmluZywgNDAwICwgZmFsc2UpOw0KCQkJCXJldHVybiAnPHNwYW4gY2xhc3M9Imhhc1RpcCIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIiBzdHlsZT0iY3Vyc29yOmhlbHAiPicgLiB0cmltKCRuZXdTdHJpbmcpIC4gJy4uLjwvc3Bhbj4nOw0KCQkJfQ0KCQkJZWxzZWlmICgkaW5pdGlhbCAhPT0gJGZpbmFsICYmICEkYWRkVGlwKQ0KCQkJew0KCQkJCXJldHVybiB0cmltKCRuZXdTdHJpbmcpIC4gJy4uLic7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRzdHJpbmc7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIHN0cmluZ3Mgc2FmZSAodmFyaW91cyB3YXlzKQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZSgkc3RyaW5nLCAkdHlwZSA9ICdMJywgJHNwYWNlciA9ICdfJywgJHJlcGxhY2VOdW1iZXJzID0gdHJ1ZSwgJGtlZXBPbmx5Q2hhcmFjdGVycyA9IHRydWUpDQoJew0KCQlpZiAoJHJlcGxhY2VOdW1iZXJzID09PSB0cnVlKQ0KCQl7DQoJCQkvLyByZW1vdmUgYWxsIG51bWJlcnMgYW5kIHJlcGxhY2Ugd2l0aCBFbmdsaXNoIHRleHQgdmVyc2lvbiAod29ya3Mgd2VsbCBvbmx5IHVwIHRvIG1pbGxpb25zKQ0KCQkJJHN0cmluZyA9IHNlbGY6Om51bWJlcnMoJHN0cmluZyk7DQoJCX0NCgkJLy8gMG5seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgc3RyaW5nDQoJCWlmIChzZWxmOjpjaGVjaygkc3RyaW5nKSkNCgkJew0KCQkJLy8gY3JlYXRlIGZpbGUgbmFtZSB3aXRob3V0IHRoZSBleHRlbnNpb24gdGhhdCBpcyBzYWZlDQoJCQlpZiAoJHR5cGUgPT09ICdmaWxlbmFtZScpDQoJCQl7DQoJCQkJLy8gbWFrZSBzdXJlIFZETSBpcyBub3QgaW4gdGhlIHN0cmluZw0KCQkJCSRzdHJpbmcgPSBzdHJfcmVwbGFjZSgnVkRNJywgJ3ZEbScsIChzdHJpbmcpICRzdHJpbmcpOw0KCQkJCS8vIFJlbW92ZSBhbnl0aGluZyB3aGljaCBpc24ndCBhIHdvcmQsIHdoaXRlc3BhY2UsIG51bWJlcg0KCQkJCS8vIG9yIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhcmFjdGVycyAtXygpDQoJCQkJLy8gSWYgeW91IGRvbid0IG5lZWQgdG8gaGFuZGxlIG11bHRpLWJ5dGUgY2hhcmFjdGVycw0KCQkJCS8vIHlvdSBjYW4gdXNlIHByZWdfcmVwbGFjZSByYXRoZXIgdGhhbiBtYl9lcmVnX3JlcGxhY2UNCgkJCQkvLyBUaGFua3MgQMWBdWthc3ogUnlzaWFrIQ0KCQkJCS8vICRzdHJpbmcgPSBtYl9lcmVnX3JlcGxhY2UoIihbXlx3XHNcZFwtX1woXCldKSIsICcnLCAkc3RyaW5nKTsNCgkJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCIoW15cd1xzXGRcLV9cKFwpXSkiLCAnJywgJHN0cmluZyk7DQoNCgkJCQkvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMDIxNzI5LzE0Mjk2NzcNCgkJCQlyZXR1cm4gcHJlZ19yZXBsYWNlKCcvXHMrLycsICcgJywgKHN0cmluZykgJHN0cmluZyk7DQoJCQl9DQoJCQkvLyByZW1vdmUgYWxsIG90aGVyIGNoYXJhY3RlcnMNCgkJCSRzdHJpbmcgPSB0cmltKChzdHJpbmcpICRzdHJpbmcpOw0KCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnLycuJHNwYWNlci4nKy8nLCAnICcsICRzdHJpbmcpOw0KCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAnICcsICRzdHJpbmcpOw0KCQkJLy8gVHJhbnNsaXRlcmF0ZSBzdHJpbmcNCgkJCSRzdHJpbmcgPSBzZWxmOjp0cmFuc2xpdGVyYXRlKCRzdHJpbmcpOw0KCQkJLy8gcmVtb3ZlIGFsbCBhbmQga2VlcCBvbmx5IGNoYXJhY3RlcnMNCgkJCWlmICgka2VlcE9ubHlDaGFyYWN0ZXJzKQ0KCQkJew0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoIi9bXkEtWmEteiBdLyIsICcnLCAoc3RyaW5nKSAkc3RyaW5nKTsNCgkJCX0NCgkJCS8vIGtlZXAgYm90aCBudW1iZXJzIGFuZCBjaGFyYWN0ZXJzDQoJCQllbHNlDQoJCQl7DQoJCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05IF0vIiwgJycsIChzdHJpbmcpICRzdHJpbmcpOw0KCQkJfQ0KCQkJLy8gc2VsZWN0IGZpbmFsIGFkYXB0YXRpb25zDQoJCQlpZiAoJHR5cGUgPT09ICdMJyB8fCAkdHlwZSA9PT0gJ3N0cnRvbG93ZXInKQ0KCQkJew0KCQkJCS8vIHJlcGxhY2Ugd2hpdGUgc3BhY2Ugd2l0aCB1bmRlcnNjb3JlDQoJCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAoc3RyaW5nKSAkc3BhY2VyLCAoc3RyaW5nKSAkc3RyaW5nKTsNCgkJCQkvLyBkZWZhdWx0IGlzIHRvIHJldHVybiBsb3dlcg0KCQkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ1cnKQ0KCQkJew0KCQkJCS8vIHJldHVybiBhIHN0cmluZyB3aXRoIGFsbCBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIHVwcGVyY2FzZShubyB1bmRlcnNjb3JlKQ0KCQkJCXJldHVybiB1Y3dvcmRzKHN0cnRvbG93ZXIoJHN0cmluZykpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ3cnIHx8ICR0eXBlID09PSAnd29yZCcpDQoJCQl7DQoJCQkJLy8gcmV0dXJuIGEgc3RyaW5nIHdpdGggYWxsIGxvd2VyY2FzZShubyB1bmRlcnNjb3JlKQ0KCQkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ1d3JyB8fCAkdHlwZSA9PT0gJ1dvcmQnKQ0KCQkJew0KCQkJCS8vIHJldHVybiBhIHN0cmluZyB3aXRoIGZpcnN0IGxldHRlciBvZiB0aGUgZmlyc3Qgd29yZCB1cHBlcmNhc2UgYW5kIGFsbCB0aGUgcmVzdCBsb3dlcmNhc2Uobm8gdW5kZXJzY29yZSkNCgkJCQlyZXR1cm4gdWNmaXJzdChzdHJ0b2xvd2VyKCRzdHJpbmcpKTsNCgkJCX0NCgkJCWVsc2VpZiAoJHR5cGUgPT09ICdXVycgfHwgJHR5cGUgPT09ICdXT1JEJykNCgkJCXsNCgkJCQkvLyByZXR1cm4gYSBzdHJpbmcgd2l0aCBhbGwgdGhlIHVwcGVyY2FzZShubyB1bmRlcnNjb3JlKQ0KCQkJCXJldHVybiBzdHJ0b3VwcGVyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ1UnIHx8ICR0eXBlID09PSAnc3RydG91cHBlcicpDQoJCQl7DQoJCQkJCS8vIHJlcGxhY2Ugd2hpdGUgc3BhY2Ugd2l0aCB1bmRlcnNjb3JlDQoJCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgKHN0cmluZykgJHNwYWNlciwgJHN0cmluZyk7DQoJCQkJCS8vIHJldHVybiBhbGwgdXBwZXINCgkJCQkJcmV0dXJuIHN0cnRvdXBwZXIoJHN0cmluZyk7DQoJCQl9DQoJCQllbHNlaWYgKCR0eXBlID09PSAnRicgfHwgJHR5cGUgPT09ICd1Y2ZpcnN0JykNCgkJCXsNCgkJCQkJLy8gcmVwbGFjZSB3aGl0ZSBzcGFjZSB3aXRoIHVuZGVyc2NvcmUNCgkJCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAoc3RyaW5nKSAkc3BhY2VyLCAkc3RyaW5nKTsNCgkJCQkJLy8gcmV0dXJuIHdpdGggZmlyc3QgY2hhcmFjdGVyIHRvIHVwcGVyDQoJCQkJCXJldHVybiB1Y2ZpcnN0KHN0cnRvbG93ZXIoJHN0cmluZykpOw0KCQkJfQ0KCQkJZWxzZWlmICgkdHlwZSA9PT0gJ2NBJyB8fCAkdHlwZSA9PT0gJ2NBbWVsJyB8fCAkdHlwZSA9PT0gJ2NhbWVsY2FzZScpDQoJCQl7DQoJCQkJLy8gY29udmVydCBhbGwgd29yZHMgdG8gZmlyc3QgbGV0dGVyIHVwcGVyY2FzZQ0KCQkJCSRzdHJpbmcgPSB1Y3dvcmRzKHN0cnRvbG93ZXIoJHN0cmluZykpOw0KCQkJCS8vIHJlbW92ZSB3aGl0ZSBzcGFjZQ0KCQkJCSRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgJycsICRzdHJpbmcpOw0KCQkJCS8vIG5vdyByZXR1cm4gZmlyc3QgbGV0dGVyIGxvd2VyY2FzZQ0KCQkJCXJldHVybiBsY2ZpcnN0KCRzdHJpbmcpOw0KCQkJfQ0KCQkJLy8gcmV0dXJuIHN0cmluZw0KCQkJcmV0dXJuICRzdHJpbmc7DQoJCX0NCgkJLy8gbm90IGEgc3RyaW5nDQoJCXJldHVybiAnJzsNCgl9DQoNCgkvKioNCgkgKiBDb252ZXJ0IG5vbmUgRW5nbGlzaCBzdHJpbmdzIHRvIGNvZGUgdXNhYmxlIHN0cmluZw0KCSAqDQoJICogQGlucHV0CWFuIHN0cmluZw0KCSAqDQoJICogQHJldHVybnMgYSBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmFuc2xpdGVyYXRlKCRzdHJpbmcpDQoJew0KCQkvLyBzZXQgdGFnIG9ubHkgb25jZQ0KCQlpZiAoIXNlbGY6OmNoZWNrKHNlbGY6OiRsYW5nVGFnKSkNCgkJew0KCQkJLy8gZ2V0IGdsb2JhbCB2YWx1ZQ0KCQkJc2VsZjo6JGxhbmdUYWcgPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJ2xhbmd1YWdlJywgJ2VuLUdCJyk7DQoJCX0NCg0KCQkvLyBUcmFuc2xpdGVyYXRlIG9uIHRoZSBsYW5ndWFnZSByZXF1ZXN0ZWQNCgkJJGxhbmcgPSBMYW5ndWFnZTo6Z2V0SW5zdGFuY2Uoc2VsZjo6JGxhbmdUYWcpOw0KDQoJCXJldHVybiAkbGFuZy0+dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBtYWtlIHN1cmUgYSBzdHJpbmcgaXMgSFRNTCBzYXZlDQoJICoNCgkgKiBAaW5wdXQJYW4gaHRtbCBzdHJpbmcNCgkgKg0KCSAqIEByZXR1cm5zIGEgc3RyaW5nDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHRtbCgkdmFyLCAkY2hhcnNldCA9ICdVVEYtOCcsICRzaG9ydGVuID0gZmFsc2UsICRsZW5ndGggPSA0MCwgJGFkZFRpcCA9IHRydWUpDQoJew0KCQlpZiAoc2VsZjo6Y2hlY2soJHZhcikpDQoJCXsNCgkJCSRmaWx0ZXIgPSBuZXcgSW5wdXRGaWx0ZXIoKTsNCgkJCSRzdHJpbmcgPSAkZmlsdGVyLT5jbGVhbigNCgkJCQlodG1sX2VudGl0eV9kZWNvZGUoDQoJCQkJCWh0bWxlbnRpdGllcygNCgkJCQkJCShzdHJpbmcpICR2YXIsDQoJCQkJCQlFTlRfQ09NUEFULA0KCQkJCQkJJGNoYXJzZXQNCgkJCQkJKQ0KCQkJCSksDQoJCQkJJ0hUTUwnDQoJCQkpOw0KCQkJaWYgKCRzaG9ydGVuKQ0KCQkJew0KCQkJCXJldHVybiBzZWxmOjpzaG9ydGVuKCRzdHJpbmcsICRsZW5ndGgsICRhZGRUaXApOw0KCQkJfQ0KCQkJcmV0dXJuICRzdHJpbmc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCgl9DQoNCgkvKioNCgkgKiBDb252ZXJ0IGFsbCBpbnQgaW4gYSBzdHJpbmcgdG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqDQoJICogQGlucHV0CWFuIHN0cmluZyB3aXRoIG51bWJlcnMNCgkgKg0KCSAqIEByZXR1cm5zIGEgc3RyaW5nDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbnVtYmVycygkc3RyaW5nKQ0KCXsNCgkJLy8gc2V0IG51bWJlcnMgYXJyYXkNCgkJJG51bWJlcnMgPSBbXTsNCgkJJHNlYXJjaF9yZXBsYWNlPSBbXTsNCg0KCQkvLyBmaXJzdCBnZXQgYWxsIG51bWJlcnMNCgkJcHJlZ19tYXRjaF9hbGwoJyFcZCshJywgKHN0cmluZykgJHN0cmluZywgJG51bWJlcnMpOw0KDQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYW55IG51bWJlcnMNCgkJaWYgKGlzc2V0KCRudW1iZXJzWzBdKSAmJiBBcnJheUhlbHBlcjo6Y2hlY2soJG51bWJlcnNbMF0pKQ0KCQl7DQoJCQlmb3JlYWNoICgkbnVtYmVyc1swXSBhcyAkbnVtYmVyKQ0KCQkJew0KCQkJCSRzZWFyY2hfcmVwbGFjZVskbnVtYmVyXSA9IHNlbGY6Om51bWJlcigoaW50KSRudW1iZXIpOw0KCQkJfQ0KDQoJCQkvLyBub3cgcmVwbGFjZSBudW1iZXJzIGluIHN0cmluZw0KCQkJJHN0cmluZyA9IHN0cl9yZXBsYWNlKGFycmF5X2tleXMoJHNlYXJjaF9yZXBsYWNlKSwgYXJyYXlfdmFsdWVzKCRzZWFyY2hfcmVwbGFjZSksIChzdHJpbmcpICRzdHJpbmcpOw0KDQoJCQkvLyBjaGVjayBpZiB3ZSBtaXNzZWQgYW55LCBzdHJhbmdlIGlmIHdlIGRpZC4NCgkJCXJldHVybiBzZWxmOjpudW1iZXJzKCRzdHJpbmcpOw0KCQl9DQoNCgkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgd2l0aCBubyBudW1iZXJzIHJlbWFpbmluZy4NCgkJcmV0dXJuICRzdHJpbmc7DQoJfQ0KDQoJLyoqDQoJICogQ29udmVydCBhbiBpbnRlZ2VyIGludG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqIFRoYW5rcyB0byBUb20gTmljaG9sc29uIDxodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3RydmFsLnBocCM0MTk4OD4NCgkgKg0KCSAqIEBpbnB1dAlhbiBpbnQNCgkgKiBAcmV0dXJucyBhIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG51bWJlcigkeCkNCgl7DQoJCSRud29yZHMgPSBhcnJheSggInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwNCgkJCSJlaWdodCIsICJuaW5lIiwgInRlbiIsICJlbGV2ZW4iLCAidHdlbHZlIiwgInRoaXJ0ZWVuIiwNCgkJCSJmb3VydGVlbiIsICJmaWZ0ZWVuIiwgInNpeHRlZW4iLCAic2V2ZW50ZWVuIiwgImVpZ2h0ZWVuIiwNCgkJCSJuaW5ldGVlbiIsICJ0d2VudHkiLCAzMCA9PiAidGhpcnR5IiwgNDAgPT4gImZvcnR5IiwNCgkJCTUwID0+ICJmaWZ0eSIsIDYwID0+ICJzaXh0eSIsIDcwID0+ICJzZXZlbnR5IiwgODAgPT4gImVpZ2h0eSIsDQoJCQk5MCA9PiAibmluZXR5IiApOw0KDQoJCWlmKCFpc19udW1lcmljKCR4KSkNCgkJew0KCQkJJHcgPSAkeDsNCgkJfQ0KCQllbHNlaWYoZm1vZCgkeCwgMSkgIT0gMCkNCgkJew0KCQkJJHcgPSAkeDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCWlmKCR4IDwgMCkNCgkJCXsNCgkJCQkkdyA9ICdtaW51cyAnOw0KCQkJCSR4ID0gLSR4Ow0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSR3ID0gJyc7DQoJCQkJLy8gLi4uIG5vdyAkeCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLg0KCQkJfQ0KDQoJCQlpZigkeCA8IDIxKSAgIC8vIDAgdG8gMjANCgkJCXsNCgkJCQkkdyAuPSAkbndvcmRzWyR4XTsNCgkJCX0NCgkJCWVsc2VpZigkeCA8IDEwMCkgIC8vIDIxIHRvIDk5DQoJCQl7IA0KCQkJCSR3IC49ICRud29yZHNbMTAgKiBmbG9vcigkeC8xMCldOw0KCQkJCSRyID0gZm1vZCgkeCwgMTApOw0KCQkJCWlmKCRyID4gMCkNCgkJCQl7DQoJCQkJCSR3IC49ICcgJyAuICRud29yZHNbJHJdOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZigkeCA8IDEwMDApICAvLyAxMDAgdG8gOTk5DQoJCQl7DQoJCQkJJHcgLj0gJG53b3Jkc1tmbG9vcigkeC8xMDApXSAuJyBodW5kcmVkJzsNCgkJCQkkciA9IGZtb2QoJHgsIDEwMCk7DQoJCQkJaWYoJHIgPiAwKQ0KCQkJCXsNCgkJCQkJJHcgLj0gJyBhbmQgJy4gc2VsZjo6bnVtYmVyKCRyKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlaWYoJHggPCAxMDAwMDAwKSAgLy8gMTAwMCB0byA5OTk5OTkNCgkJCXsNCgkJCQkkdyAuPSBzZWxmOjpudW1iZXIoZmxvb3IoJHgvMTAwMCkpIC4nIHRob3VzYW5kJzsNCgkJCQkkciA9IGZtb2QoJHgsIDEwMDApOw0KCQkJCWlmKCRyID4gMCkNCgkJCQl7DQoJCQkJCSR3IC49ICcgJzsNCgkJCQkJaWYoJHIgPCAxMDApDQoJCQkJCXsNCgkJCQkJCSR3IC49ICdhbmQgJzsNCgkJCQkJfQ0KCQkJCQkkdyAuPSBzZWxmOjpudW1iZXIoJHIpOw0KCQkJCX0NCgkJCX0gDQoJCQllbHNlIC8vICBtaWxsaW9ucw0KCQkJeyAgICANCgkJCQkkdyAuPSBzZWxmOjpudW1iZXIoZmxvb3IoJHgvMTAwMDAwMCkpIC4nIG1pbGxpb24nOw0KCQkJCSRyID0gZm1vZCgkeCwgMTAwMDAwMCk7DQoJCQkJaWYoJHIgPiAwKQ0KCQkJCXsNCgkJCQkJJHcgLj0gJyAnOw0KCQkJCQlpZigkciA8IDEwMCkNCgkJCQkJew0KCQkJCQkJJHcgLj0gJ2FuZCAnOw0KCQkJCQl9DQoJCQkJCSR3IC49IHNlbGY6Om51bWJlcigkcik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiAkdzsNCgl9DQoNCgkvKioNCgkgKiBSYW5kb20gS2V5DQoJICoNCgkgKiBAcmV0dXJucyBhIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbSgkc2l6ZSk6IHN0cmluZw0KCXsNCgkJJGJhZyA9ICJhYmNlZmdoaWprbm9wcXJzdHV3eHl6QUJDRERFRkdISUpLTExNTU5PUFFSU1RVVlZXWFlaYWJjZGRlZmdoaWprbGxtbW5vcHFyc3R1dnZ3eHl6QUJDRUZHSElKS05PUFFSU1RVV1hZWiI7DQoJCSRrZXkgPSBbXTsNCgkJJGJhZ3NpemUgPSBzdHJsZW4oJGJhZykgLSAxOw0KDQoJCWZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKQ0KCQl7DQoJCQkkZ2V0ID0gcmFuZCgwLCAkYmFnc2l6ZSk7DQoJCQkka2V5W10gPSAkYmFnWyRnZXRdOw0KCQl9DQoNCgkJcmV0dXJuIGltcGxvZGUoJGtleSk7DQoJfQ0K', '{}', 'StringHelper', 'VDM\\Joomla\\Utilities.StringHelper', '1.0.0', '{}', 'Utilities String Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-08 21:35:37', '2023-01-31 12:08:09', 31, 7),
+(13, '', 'Some array tricks helper\r\n\r\n@since 3.0.9', '', '', '0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a', '', '', '', '{}', 'CS8qKg0KCSAqIENoZWNrIGlmIGhhdmUgYW4gYXJyYXkgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0CWFycmF5ICAgVGhlIGFycmF5IHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBpbnR8ZmFsc2UgIG51bWJlciBvZiBpdGVtcyBpbiBhcnJheSBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjIuMA0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2soJGFycmF5LCAkcmVtb3ZlRW1wdHlTdHJpbmcgPSBmYWxzZSkNCgl7DQoJCWlmIChpc19hcnJheSgkYXJyYXkpICYmICgkbnIgPSBjb3VudCgoYXJyYXkpICRhcnJheSkpID4gMCkNCgkJew0KCQkJLy8gYWxzbyBtYWtlIHN1cmUgdGhlIGVtcHR5IHN0cmluZ3MgYXJlIHJlbW92ZWQNCgkJCWlmICgkcmVtb3ZlRW1wdHlTdHJpbmcpDQoJCQl7DQoJCQkJJGFycmF5ID0gYXJyYXlfZmlsdGVyKCRhcnJheSk7DQoNCgkJCQlpZiAoJGFycmF5ID09PSBbXSkNCgkJCQl7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gY291bnQoJGFycmF5KTsNCgkJCX0NCg0KCQkJcmV0dXJuICRucjsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBNZXJnZSBhbiBhcnJheSBvZiBhcnJheSdzDQoJICoNCgkgKiBAaW5wdXQJYXJyYXkgICBUaGUgYXJyYXlzIHlvdSB3b3VsZCBsaWtlIHRvIG1lcmdlDQoJICoNCgkgKiBAcmV0dXJucyBhcnJheXxudWxsICBtZXJnZWQgYXJyYXkgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1lcmdlKCRhcnJheXMpOiA/YXJyYXkNCgl7DQoJCWlmKHNlbGY6OmNoZWNrKCRhcnJheXMpKQ0KCQl7DQoJCQkkbWVyZ2VkID0gW107DQoJCQlmb3JlYWNoICgkYXJyYXlzIGFzICRhcnJheSkNCgkJCXsNCgkJCQlpZiAoc2VsZjo6Y2hlY2soJGFycmF5KSkNCgkJCQl7DQoJCQkJCSRtZXJnZWQgPSBhcnJheV9tZXJnZSgkbWVyZ2VkLCAkYXJyYXkpOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiAkbWVyZ2VkOw0KCQl9DQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIENoZWNrIGlmIGFycmF5cyBpbnRlcnNlY3QNCgkgKg0KCSAqIEBpbnB1dAlhcnJheSAgIFRoZSBmaXJzdCBhcnJheQ0KCSAqIEBpbnB1dAlhcnJheSAgIFRoZSBzZWNvbmQgYXJyYXkNCgkgKg0KCSAqIEByZXR1cm5zIGJvb2wgIHRydWUgaWYgaW50ZXJzZWN0IGVsc2UgZmFsc2UNCgkgKiANCgkgKiBAc2luY2UgIDMuMS4xDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbnRlcnNlY3QoJGFfYXJyYXksICRiX2FycmF5KTogYm9vbA0KCXsNCgkJLy8gZmxpcCB0aGUgc2Vjb25kIGFycmF5DQoJCSRiX2FycmF5ID0gYXJyYXlfZmxpcCgkYl9hcnJheSk7DQoNCgkJLy8gbG9vcCB0aGUgZmlyc3QgYXJyYXkNCgkJZm9yZWFjaCAoJGFfYXJyYXkgYXMgJHYpDQoJCXsNCgkJCWlmIChpc3NldCgkYl9hcnJheVskdl0pKQ0KCQkJew0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQo=', '{}', 'ArrayHelper', 'VDM\\Joomla\\Utilities.ArrayHelper', '1.0.0', '{}', 'Utilities Array Helper', 'abstract class', '{}', '', 1, '2022-03-08 22:53:52', '2023-02-05 17:36:34', 21, 8),
(14, '', 'Control the naming of a namespace helper\r\n\r\n@since 3.0.9', '', '', 'ce8cf834-6bac-44fb-941c-861f7e046cc0', '', '', '', '{}', 'CS8qKg0KCSAqIE1ha2luZyBuYW1lc3BhY2Ugc2FmZQ0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgICRzdHJpbmcgICAgICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKiBAaW5wdXQgICAgYm9vbCAgICAgJHJlbW92ZU51bWJlcnMgICAgVGhlIHN3aXRjaCB0byByZW1vdmUgbnVtYmVycw0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlKHN0cmluZyAkc3RyaW5nLCBib29sICRyZW1vdmVOdW1iZXJzID0gdHJ1ZSk6IHN0cmluZw0KCXsNCgkJLy8gMG5seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgc3RyaW5nIHdpdGggbGVuZ3RoDQoJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCRzdHJpbmcpKQ0KCQl7DQoJCQkvLyBtYWtlIHN1cmUgaXQgaGFzIG5vdCBudW1iZXJzDQoJCQlpZiAoJHJlbW92ZU51bWJlcnMpDQoJCQl7DQoJCQkJJHN0cmluZyA9IFN0cmluZ0hlbHBlcjo6bnVtYmVycygkc3RyaW5nKTsNCgkJCX0NCg0KCQkJLy8gVHJhbnNsaXRlcmF0ZSBzdHJpbmcgVE9ETzogbG9vayBhZ2FpbiBhcyB0aGlzIG1ha2VzIGl0IGxvd2VyY2FzZQ0KCQkJLy8gJHN0cmluZyA9IFN0cmluZ0hlbHBlcjo6dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCg0KCQkJLy8gZmlyc3QgcmVtb3ZlIGFsbCBbXF0gYmFja3NsYXNoZXMNCgkJCSRzdHJpbmcgPSBzdHJfcmVwbGFjZSgnXFwnLCAnKycsIChzdHJpbmcpICRzdHJpbmcpOw0KDQoJCQkvLyByZW1vdmUgYWxsIGFuZCBrZWVwIG9ubHkgY2hhcmFjdGVycyBhbmQgW1xdIGJhY2tzbGFzaGVzIGluc2lkZSBvZiB0aGUgc3RyaW5nDQoJCQlpZiAoJHJlbW92ZU51bWJlcnMpDQoJCQl7DQoJCQkJJHN0cmluZyA9IHRyaW0oIHByZWdfcmVwbGFjZSgiL1teQS1aYS16XCtdLyIsICcnLCAkc3RyaW5nKSwgJysnKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc3RyaW5nID0gdHJpbSggcHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTlcK10vIiwgJycsICRzdHJpbmcpLCAnKycpOw0KCQkJfQ0KDQoJCQkvLyBwbGFjZSB0aGUgW1xdIGJhY2tzbGFzaGVzIGJhY2sNCgkJCXJldHVybiB0cmltKCBwcmVnX3JlcGxhY2UoIi9cKysvIiwgJ1xcJywgJHN0cmluZykpOw0KCQl9DQoNCgkJLy8gbm90IGEgc3RyaW5nDQoJCXJldHVybiAnJzsNCgl9DQo=', '{}', 'NamespaceHelper', 'VDM\\Joomla\\Utilities.String.NamespaceHelper', '1.0.0', '{}', 'String Namespace Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"}}', '', 1, '2022-03-08 23:27:57', '2023-01-14 18:04:48', 19, 5),
(15, 1, 'Control the naming of a field type\r\n\r\n@since 3.0.9', '', '', 'a8935cbe-7701-40dc-bfd5-675f2d600954', 'dXNlIEpvb21sYVxDTVNcQ29tcG9uZW50XENvbXBvbmVudEhlbHBlcjs=', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBmaWVsZCBidWlsZGVyIHN3aXRjaA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljICRidWlsZGVyID0gZmFsc2U7DQoNCgkvKioNCgkgKiBNYWtpbmcgZmllbGQgdHlwZSBuYW1lIHNhZmUNCgkgKg0KCSAqIEBwYXJhbSAgIFN0cmluZyAgICAgICRzdHJpbmcgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKiBAcGFyYW0gICBTdHJpbmcgICAgICAkb3B0aW9uICAgIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmUoJHN0cmluZywgJG9wdGlvbiA9IG51bGwpDQoJew0KCQkvLyBnZXQgZ2xvYmFsIHZhbHVlDQoJCWlmIChzZWxmOjokYnVpbGRlciA9PT0gZmFsc2UpDQoJCXsNCgkJCXNlbGY6OiRidWlsZGVyID0gSGVscGVyOjpnZXRQYXJhbXMoJG9wdGlvbiktPmdldCgndHlwZV9uYW1lX2J1aWxkZXInLCAxKTsNCgkJfQ0KDQoJCS8vIHVzZSB0aGUgbmV3IGNvbnZlbnRpb24NCgkJaWYgKDIgPT0gc2VsZjo6JGJ1aWxkZXIpDQoJCXsNCgkJCS8vIDBubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHN0cmluZw0KCQkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJHN0cmluZykpDQoJCQl7DQoJCQkJLy8gY2hlY2sgdGhhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIG5vdCBhIG51bWJlcg0KCQkJCWlmIChpc19udW1lcmljKHN1YnN0cigkc3RyaW5nLCAwLCAxKSkpDQoJCQkJew0KCQkJCQkkc3RyaW5nID0gU3RyaW5nSGVscGVyOjpudW1iZXJzKCRzdHJpbmcpOw0KCQkJCX0NCg0KCQkJCS8vIFRyYW5zbGl0ZXJhdGUgc3RyaW5nDQoJCQkJJHN0cmluZyA9IFN0cmluZ0hlbHBlcjo6dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCg0KCQkJCS8vIHJlbW92ZSBhbGwgYW5kIGtlZXAgb25seSBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzIGFuZCBwb2ludCAoVE9ETyBqdXN0IG9uZSBwb2ludCkNCgkJCQkkc3RyaW5nID0gdHJpbShwcmVnX3JlcGxhY2UoIi9bXkEtWmEtejAtOVwuXS8iLCAnJywgKHN0cmluZykgJHN0cmluZykpOw0KDQoJCQkJLy8gYmVzdCBpcyB0byByZXR1cm4gbG93ZXIgKGZvciBhbGwgc3RyaW5nIGVxdWFsaXR5IGluIGNvbXBpbGVyKQ0KCQkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHJpbmcpOw0KCQkJfQ0KCQkJLy8gbm90IGEgc3RyaW5nDQoJCQlyZXR1cm4gJyc7DQoJCX0NCg0KCQkvLyB1c2UgdGhlIGRlZmF1bHQgKG9yaWdpbmFsIGJlaGF2aW91ci9jb252ZW50aW9uKQ0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCX0NCg==', '{}', 'TypeHelper', 'VDM\\Joomla\\Utilities.String.TypeHelper', '1.0.0', '{}', 'String Type Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"},\"use_selection1\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-08 23:33:09', '2023-01-14 17:56:28', 16, 5),
-(16, '', 'Control the naming of a class and function\r\n\r\n@since 3.0.9', '', '', '30c5b4c2-f75f-4d15-869a-f8bfedd87358', '', '', '', '{}', 'CS8qKg0KCSAqIE1ha2luZyBjbGFzcyBvciBmdW5jdGlvbiBuYW1lIHNhZmUNCgkgKg0KCSAqIEBpbnB1dAlzdHJpbmcgICAgICAgVGhlIG5hbWUgeW91IHdvdWxkIGxpa2UgdG8gbWFrZSBzYWZlDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmUoJG5hbWUpDQoJew0KCQkvLyByZW1vdmUgbnVtYmVycyBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgbnVtYmVyDQoJCWlmIChpc19udW1lcmljKHN1YnN0cigoc3RyaW5nKSAkbmFtZSwgMCwgMSkpKQ0KCQl7DQoJCQkkbmFtZSA9IFN0cmluZ0hlbHBlcjo6bnVtYmVycygkbmFtZSk7DQoJCX0NCg0KCQkvLyByZW1vdmUgYWxsIHNwYWNlcyBhbmQgc3RyYW5nZSBjaGFyYWN0ZXJzDQoJCXJldHVybiB0cmltKHByZWdfcmVwbGFjZSgiL1teQS1aYS16MC05Xy1dLyIsICcnLCAoc3RyaW5nKSAkbmFtZSkpOw0KCX0NCg==', '{}', 'ClassfunctionHelper', 'VDM\\Joomla\\Utilities.String.ClassfunctionHelper', '1.0.0', '{}', 'String Classfunction Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"}}', '', 1, '2022-03-08 23:43:10', '2023-01-14 18:07:10', 16, 5),
+(16, '', 'Control the naming of a class and function\r\n\r\n@since 3.0.9', '', '', '30c5b4c2-f75f-4d15-869a-f8bfedd87358', '', '', '', '{}', 'CS8qKg0KCSAqIE1ha2luZyBjbGFzcyBvciBmdW5jdGlvbiBuYW1lIHNhZmUNCgkgKg0KCSAqIEBpbnB1dAlzdHJpbmcgICAgICAgVGhlIG5hbWUgeW91IHdvdWxkIGxpa2UgdG8gbWFrZSBzYWZlDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmUoJG5hbWUpOiBzdHJpbmcNCgl7DQoJCS8vIHJlbW92ZSBudW1iZXJzIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXINCgkJaWYgKGlzX251bWVyaWMoc3Vic3RyKChzdHJpbmcpICRuYW1lLCAwLCAxKSkpDQoJCXsNCgkJCSRuYW1lID0gU3RyaW5nSGVscGVyOjpudW1iZXJzKCRuYW1lKTsNCgkJfQ0KDQoJCS8vIHJlbW92ZSBhbGwgc3BhY2VzIGFuZCBzdHJhbmdlIGNoYXJhY3RlcnMNCgkJcmV0dXJuIHRyaW0ocHJlZ19yZXBsYWNlKCIvW15BLVphLXowLTlfLV0vIiwgJycsIChzdHJpbmcpICRuYW1lKSk7DQoJfQ0K', '{}', 'ClassfunctionHelper', 'VDM\\Joomla\\Utilities.String.ClassfunctionHelper', '1.0.0', '{}', 'String Classfunction Helper', 'abstract class', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"}}', '', 1, '2022-03-08 23:43:10', '2023-02-05 18:04:30', 17, 5),
(17, 1, 'Some easy get...\r\n\r\n@since 3.0.9', '', '', 'db87c339-5bb6-4291-a7ef-2c48ea1b06bc', 'dXNlIEpvb21sYVxDTVNcRmFjdG9yeTs=', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"}}', 'CS8qKg0KCSAqIEdldCBhIFZhcmlhYmxlIA0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICR0YWJsZSAgICAgICAgVGhlIHRhYmxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSB2YXJpYWJsZQ0KCSAqIEBwYXJhbSAgIG1peGVkICAgICAgICAkd2hlcmUgICAgICAgIFRoZSB2YWx1ZSB3aGVyZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICAgICAkd2hlcmVTdHJpbmcgIFRoZSB0YXJnZXQvZmllbGQgc3RyaW5nIHdoZXJlL25hbWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICAgJHdoYXQgICAgICAgICBUaGUgcmV0dXJuIGZpZWxkDQoJICogQHBhcmFtICAgc3RyaW5nICAgICAgICRvcGVyYXRvciAgICAgVGhlIG9wZXJhdG9yIGJldHdlZW4gJHdoZXJlU3RyaW5nL2ZpZWxkIGFuZCAkd2hlcmUvdmFsdWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICAgJG1haW4gICAgICAgICBUaGUgY29tcG9uZW50IGluIHdoaWNoIHRoZSB0YWJsZSBpcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgbWl4ZWQgc3RyaW5nL2ludC9mbG9hdA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhcig/c3RyaW5nICR0YWJsZSA9IG51bGwsICR3aGVyZSA9IG51bGwsDQoJCXN0cmluZyAkd2hlcmVTdHJpbmcgPSAndXNlcicsIHN0cmluZyAkd2hhdCA9ICdpZCcsDQoJCXN0cmluZyAkb3BlcmF0b3IgPSAnPScsID9zdHJpbmcgJG1haW4gPSBudWxsKQ0KCXsNCgkJaWYoZW1wdHkoJHdoZXJlKSkNCgkJew0KCQkJJHdoZXJlID0gRmFjdG9yeTo6Z2V0VXNlcigpLT5pZDsNCgkJfQ0KDQoJCWlmKGVtcHR5KCRtYWluKSkNCgkJew0KCQkJJG1haW4gPSBIZWxwZXI6OmdldENvZGUoKTsNCgkJfQ0KDQoJCS8vIEdldCBhIGRiIGNvbm5lY3Rpb24uDQoJCSRkYiA9IEZhY3Rvcnk6OmdldERibygpOw0KDQoJCS8vIENyZWF0ZSBhIG5ldyBxdWVyeSBvYmplY3QuDQoJCSRxdWVyeSA9ICRkYi0+Z2V0UXVlcnkodHJ1ZSk7DQoJCSRxdWVyeS0+c2VsZWN0KCRkYi0+cXVvdGVOYW1lKGFycmF5KCR3aGF0KSkpOw0KDQoJCWlmIChlbXB0eSgkdGFibGUpKQ0KCQl7DQoJCQkkcXVlcnktPmZyb20oJGRiLT5xdW90ZU5hbWUoJyNfXycgLiAkbWFpbikpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHF1ZXJ5LT5mcm9tKCRkYi0+cXVvdGVOYW1lKCcjX18nIC4gJG1haW4gLiAnXycgLiAkdGFibGUpKTsNCgkJfQ0KDQoJCWlmIChpc19udW1lcmljKCR3aGVyZSkpDQoJCXsNCgkJCSRxdWVyeS0+d2hlcmUoJGRiLT5xdW90ZU5hbWUoJHdoZXJlU3RyaW5nKSAuICcgJyAuICRvcGVyYXRvciAuICcgJyAuIChpbnQpICR3aGVyZSk7DQoJCX0NCgkJZWxzZWlmIChpc19zdHJpbmcoJHdoZXJlKSkNCgkJew0KCQkJJHF1ZXJ5LT53aGVyZSgkZGItPnF1b3RlTmFtZSgkd2hlcmVTdHJpbmcpIC4gJyAnIC4gJG9wZXJhdG9yIC4gJyAnIC4gJGRiLT5xdW90ZSgoc3RyaW5nKSR3aGVyZSkpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJJGRiLT5zZXRRdWVyeSgkcXVlcnkpOw0KCQkkZGItPmV4ZWN1dGUoKTsNCg0KCQlpZiAoJGRiLT5nZXROdW1Sb3dzKCkpDQoJCXsNCgkJCXJldHVybiAkZGItPmxvYWRSZXN1bHQoKTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYXJyYXkgb2YgdmFyaWFibGVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmd8bnVsbCAgJHRhYmxlICAgICAgICBUaGUgdGFibGUgZnJvbSB3aGljaCB0byBnZXQgdGhlIHZhcmlhYmxlcw0KCSAqIEBwYXJhbSAgIG1peGVkICAgICAgICAkd2hlcmUgICAgICAgIFRoZSB2YWx1ZSB3aGVyZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICAgICAkd2hlcmVTdHJpbmcgIFRoZSB0YXJnZXQvZmllbGQgc3RyaW5nIHdoZXJlL25hbWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICAgJHdoYXQgICAgICAgICBUaGUgcmV0dXJuIGZpZWxkDQoJICogQHBhcmFtICAgc3RyaW5nICAgICAgICRvcGVyYXRvciAgICAgVGhlIG9wZXJhdG9yIGJldHdlZW4gJHdoZXJlU3RyaW5nL2ZpZWxkIGFuZCAkd2hlcmUvdmFsdWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICAgJG1haW4gICAgICAgICBUaGUgY29tcG9uZW50IGluIHdoaWNoIHRoZSB0YWJsZSBpcyBmb3VuZA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICAgICAkdW5pcXVlICAgICAgIFRoZSBzd2l0Y2ggdG8gcmV0dXJuIGEgdW5pcXVlIGFycmF5DQoJICoNCgkgKiBAcmV0dXJuICBhcnJheXxudWxsDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFycyg/c3RyaW5nICR0YWJsZSA9IG51bGwsICR3aGVyZSA9IG51bGwsDQoJCXN0cmluZyAkd2hlcmVTdHJpbmcgPSAndXNlcicsIHN0cmluZyAkd2hhdCA9ICdpZCcsIHN0cmluZyAkb3BlcmF0b3IgPSAnSU4nLA0KCQk/c3RyaW5nICRtYWluID0gbnVsbCwgYm9vbCAkdW5pcXVlID0gdHJ1ZSk6ID9hcnJheQ0KCXsNCgkJaWYoZW1wdHkoJHdoZXJlKSkNCgkJew0KCQkJJHdoZXJlID0gRmFjdG9yeTo6Z2V0VXNlcigpLT5pZDsNCgkJfQ0KDQoJCWlmKGlzX251bGwoJG1haW4pKQ0KCQl7DQoJCQkkbWFpbiA9IEhlbHBlcjo6Z2V0Q29kZSgpOw0KCQl9DQoNCgkJaWYgKCFBcnJheUhlbHBlcjo6Y2hlY2soJHdoZXJlKSAmJiAkd2hlcmUgPiAwKQ0KCQl7DQoJCQkkd2hlcmUgPSBhcnJheSgkd2hlcmUpOw0KCQl9DQoNCgkJaWYgKEFycmF5SGVscGVyOjpjaGVjaygkd2hlcmUpKQ0KCQl7DQoJCQkvLyBwcmVwIG1haW4gPC0tIHdoeT8gd2VsbCBpZiAkbWFpbj0nJyBpcyBlbXB0eSB0aGVuICR0YWJsZSBjYW4gYmUgY2F0ZWdvcmllcyBvciB1c2Vycw0KCQkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJG1haW4pKQ0KCQkJew0KCQkJCSRtYWluID0gJ18nIC4gbHRyaW0oJG1haW4sICdfJyk7DQoJCQl9DQoNCgkJCS8vIEdldCBhIGRiIGNvbm5lY3Rpb24uDQoJCQkkZGIgPSBGYWN0b3J5OjpnZXREYm8oKTsNCg0KCQkJLy8gQ3JlYXRlIGEgbmV3IHF1ZXJ5IG9iamVjdC4NCgkJCSRxdWVyeSA9ICRkYi0+Z2V0UXVlcnkodHJ1ZSk7DQoJCQkkcXVlcnktPnNlbGVjdCgkZGItPnF1b3RlTmFtZShhcnJheSgkd2hhdCkpKTsNCg0KCQkJaWYgKGVtcHR5KCR0YWJsZSkpDQoJCQl7DQoJCQkJJHF1ZXJ5LT5mcm9tKCRkYi0+cXVvdGVOYW1lKCcjX18nIC4gJG1haW4pKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkcXVlcnktPmZyb20oJGRiLT5xdW90ZU5hbWUoJyNfJyAuICRtYWluIC4gJ18nIC4gJHRhYmxlKSk7DQoJCQl9DQoNCgkJCS8vIGFkZCBzdHJpbmdzIHRvIGFycmF5IHNlYXJjaA0KCQkJaWYgKCdJTl9TVFJJTkdTJyA9PT0gJG9wZXJhdG9yIHx8ICdOT1QgSU5fU1RSSU5HUycgPT09ICRvcGVyYXRvcikNCgkJCXsNCgkJCQkkcXVlcnktPndoZXJlKCRkYi0+cXVvdGVOYW1lKCR3aGVyZVN0cmluZykgLiAnICcgLiBzdHJfcmVwbGFjZSgnX1NUUklOR1MnLCAnJywgJG9wZXJhdG9yKSAuICcgKCInIC4gaW1wbG9kZSgnIiwiJywgJHdoZXJlKSAuICciKScpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRxdWVyeS0+d2hlcmUoJGRiLT5xdW90ZU5hbWUoJHdoZXJlU3RyaW5nKSAuICcgJyAuICRvcGVyYXRvciAuICcgKCcgLiBpbXBsb2RlKCcsJywgJHdoZXJlKSAuICcpJyk7DQoJCQl9DQoNCgkJCSRkYi0+c2V0UXVlcnkoJHF1ZXJ5KTsNCgkJCSRkYi0+ZXhlY3V0ZSgpOw0KDQoJCQlpZiAoJGRiLT5nZXROdW1Sb3dzKCkpDQoJCQl7DQoJCQkJaWYgKCR1bmlxdWUpDQoJCQkJew0KCQkJCQlyZXR1cm4gYXJyYXlfdW5pcXVlKCRkYi0+bG9hZENvbHVtbigpKTsNCgkJCQl9DQoJCQkJcmV0dXJuICRkYi0+bG9hZENvbHVtbigpOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIG51bGw7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IGFsbCBzdHJpbmdzIGJldHdlZW4gdHdvIG90aGVyIHN0cmluZ3MNCgkgKiANCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAkY29udGVudCAgICBUaGUgY29udGVudCB0byBzZWFyY2gNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAkc3RhcnQgICAgICBUaGUgc3RhcnRpbmcgdmFsdWUNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAkZW5kICAgICAgICBUaGUgZW5kaW5nIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuICBhcnJheXxudWxsICAgICAgICAgIE9uIHN1Y2Nlc3MNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbGxCZXR3ZWVuKHN0cmluZyAkY29udGVudCwgc3RyaW5nICRzdGFydCwgc3RyaW5nICRlbmQpOiA/YXJyYXkNCgl7DQoJCS8vIHJlc2V0IGJ1Y2tldA0KCQkkYnVja2V0ID0gW107DQoJCWZvciAoJGkgPSAwOyA7ICRpKyspDQoJCXsNCgkJCS8vIHNlYXJjaCBmb3Igc3RyaW5nDQoJCQkkZm91bmQgPSBzZWxmOjpiZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpOw0KDQoJCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZm91bmQpKQ0KCQkJew0KCQkJCS8vIGFkZCB0byBidWNrZXQNCgkJCQkkYnVja2V0W10gPSAkZm91bmQ7DQoNCgkJCQkvLyBidWlsZCByZW1vdmFsIHN0cmluZw0KCQkJCSRyZW1vdmUgPSAkc3RhcnQgLiAkZm91bmQgLiAkZW5kOw0KDQoJCQkJLy8gcmVtb3ZlIGZyb20gY29udGVudA0KCQkJCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoJHJlbW92ZSwgJycsICRjb250ZW50KTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlicmVhazsNCgkJCX0NCg0KCQkJLy8gc2FmZXR5IGNhdGNoDQoJCQlpZiAoJGkgPT0gNTAwKQ0KCQkJew0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCgkJLy8gb25seSByZXR1cm4gdW5pcXVlIGFycmF5IG9mIHZhbHVlcw0KCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCRidWNrZXQpKQ0KCQl7DQoJCQlyZXR1cm4gIGFycmF5X3VuaXF1ZSgkYnVja2V0KTsNCgkJfQ0KDQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhIHN0cmluZyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICogDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgJGNvbnRlbnQgICAgVGhlIGNvbnRlbnQgdG8gc2VhcmNoDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgJHN0YXJ0ICAgICAgVGhlIHN0YXJ0aW5nIHZhbHVlDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgJGVuZCAgICAgICAgVGhlIGVuZGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICRkZWZhdWx0ICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vbmUgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZyAgICAgICAgICBPbiBzdWNjZXNzIC8gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBiZXR3ZWVuKHN0cmluZyAkY29udGVudCwgc3RyaW5nICRzdGFydCwgc3RyaW5nICRlbmQsIHN0cmluZyAkZGVmYXVsdCA9ICcnKTogc3RyaW5nDQoJew0KCQkkYXJyYXkgPSBleHBsb2RlKCRzdGFydCwgJGNvbnRlbnQpOw0KCQlpZiAoaXNzZXQoJGFycmF5WzFdKSAmJiBzdHJwb3MoJGFycmF5WzFdLCAkZW5kKSAhPT0gZmFsc2UpDQoJCXsNCgkJCSRhcnJheSA9IGV4cGxvZGUoJGVuZCwgJGFycmF5WzFdKTsNCg0KCQkJLy8gcmV0dXJuIHN0cmluZyBmb3VuZCBiZXR3ZWVuDQoJCQlyZXR1cm4gJGFycmF5WzBdOw0KCQl9DQoNCgkJcmV0dXJuICRkZWZhdWx0Ow0KCX0NCg==', '{}', 'GetHelper', 'VDM\\Joomla\\Utilities.GetHelper', '1.0.0', '{}', 'Utilities GetHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-09 00:21:06', '2023-01-18 22:46:18', 26, 9),
(18, '', 'Some object tricks\r\n\r\n@since 3.0.9', '', '', '91004529-94a9-4590-b842-e7c6b624ecf5', '', '', '', '{}', 'CS8qKg0KCSAqIENoZWNrIGlmIGhhdmUgYW4gb2JqZWN0IHdpdGggYSBsZW5ndGgNCgkgKg0KCSAqIEBpbnB1dAlvYmplY3QgICBUaGUgb2JqZWN0IHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrKCRvYmplY3QpDQoJew0KCQlpZiAoaXNfb2JqZWN0KCRvYmplY3QpKQ0KCQl7DQoJCQlyZXR1cm4gY291bnQoKGFycmF5KSAkb2JqZWN0KSA+IDA7DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0K', '{}', 'ObjectHelper', 'VDM\\Joomla\\Utilities.ObjectHelper', '1.0.0', '{}', 'Utilities Object Helper', 'abstract class', '{}', '', 1, '2022-03-09 00:35:23', '2022-09-20 09:51:31', 15, 8),
(19, '', 'Basic Math Helper\r\n\r\n@since 3.0.9', '', '', '152c8793-8b75-4715-996a-257b9f65451c', '', '', '', '{}', 'CS8qKg0KCSAqIGJjIG1hdGggd3JhcHBlciAodmVyeSBiYXNpYyBub3QgZm9yIGFjY291bnRpbmcpDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkdHlwZSAgICBUaGUgdHlwZSBiYyBtYXRoDQoJICogQHBhcmFtICAgaW50ICAgICAgJHZhbDEgICAgVGhlIGZpcnN0IHZhbHVlDQoJICogQHBhcmFtICAgaW50ICAgICAgJHZhbDIgICAgVGhlIHNlY29uZCB2YWx1ZQ0KCSAqIEBwYXJhbSAgIGludCAgICAgICRzY2FsZSAgIFRoZSBzY2FsZSB2YWx1ZQ0KCSAqDQoJICogQHJldHVybiBpbnQNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBiYygkdHlwZSwgJHZhbDEsICR2YWwyLCAkc2NhbGUgPSAwKQ0KCXsNCgkJLy8gYnVpbGQgZnVuY3Rpb24gbmFtZQ0KCQkkZnVuY3Rpb24gPSAnYmMnIC4gJHR5cGU7DQoJCS8vIHVzZSB0aGUgYmNtYXRoIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZQ0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCRmdW5jdGlvbikpDQoJCXsNCgkJCXJldHVybiAkZnVuY3Rpb24oJHZhbDEsICR2YWwyLCAkc2NhbGUpOw0KCQl9DQoJCS8vIGlmIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IHdlIHVzZSArLSovIG9wZXJhdG9ycyAoZmFsbGJhY2sgLSBub3QgaWRlYWwpDQoJCXN3aXRjaCAoJHR5cGUpDQoJCXsNCgkJCS8vIE11bHRpcGx5IHR3byBudW1iZXJzDQoJCQljYXNlICdtdWwnOg0KCQkJCXJldHVybiAoc3RyaW5nKSByb3VuZCgkdmFsMSAqICR2YWwyLCAkc2NhbGUpOw0KCQkJCWJyZWFrOw0KCQkJLy8gRGl2aWRlIG9mIHR3byBudW1iZXJzDQoJCQljYXNlICdkaXYnOg0KCQkJCXJldHVybiAoc3RyaW5nKSByb3VuZCgkdmFsMSAvICR2YWwyLCAkc2NhbGUpOw0KCQkJCWJyZWFrOw0KCQkJLy8gQWRkaW5nIHR3byBudW1iZXJzDQoJCQljYXNlICdhZGQnOg0KCQkJCXJldHVybiAoc3RyaW5nKSByb3VuZCgkdmFsMSArICR2YWwyLCAkc2NhbGUpOw0KCQkJCWJyZWFrOw0KCQkJLy8gU3VidHJhY3Qgb25lIG51bWJlciBmcm9tIHRoZSBvdGhlcg0KCQkJY2FzZSAnc3ViJzoNCgkJCQlyZXR1cm4gKHN0cmluZykgcm91bmQoJHZhbDEgLSAkdmFsMiwgJHNjYWxlKTsNCgkJCQlicmVhazsNCgkJCS8vIFJhaXNlIGFuIGFyYml0cmFyeSBwcmVjaXNpb24gbnVtYmVyIHRvIGFub3RoZXINCgkJCWNhc2UgJ3Bvdyc6DQoJCQkJcmV0dXJuIChzdHJpbmcpIHJvdW5kKHBvdygkdmFsMSwgJHZhbDIpLCAkc2NhbGUpOw0KCQkJCWJyZWFrOw0KCQkJLy8gQ29tcGFyZSB0d28gYXJiaXRyYXJ5IHByZWNpc2lvbiBudW1iZXJzDQoJCQljYXNlICdjb21wJzoNCgkJCQlyZXR1cm4gKHJvdW5kKCR2YWwxLDIpID09IHJvdW5kKCR2YWwyLDIpKTsNCgkJCQlicmVhazsNCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogQmFzaWMgc3VtIG9mIGFuIGFycmF5IHdpdGggbW9yZSBwcmVjaXNpb24NCgkgKg0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGFycmF5ICAgIFRoZSB2YWx1ZXMgdG8gc3VtDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VtKCRhcnJheSwgJHNjYWxlID0gNCkNCgl7DQoJCS8vIHVzZSB0aGUgYmNhZGQgZnVuY3Rpb24gaWYgYXZhaWxhYmxlDQoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2JjYWRkJykpDQoJCXsNCgkJCS8vIHNldCB0aGUgc3RhcnQgdmFsdWUNCgkJCSR2YWx1ZSA9IDAuMDsNCgkJCS8vIGxvb3AgdGhlIHZhbHVlcyBhbmQgcnVuIGJjYWRkDQoJCQlmb3JlYWNoKCRhcnJheSBhcyAkdmFsKQ0KCQkJew0KCQkJCSR2YWx1ZSA9IGJjYWRkKCR2YWx1ZSwgKHN0cmluZykgJHZhbCwgJHNjYWxlKTsNCgkJCX0NCgkJCXJldHVybiAkdmFsdWU7DQoJCX0NCgkJLy8gZmFsbCBiYWNrIG9uIGFycmF5IHN1bQ0KCQlyZXR1cm4gYXJyYXlfc3VtKCRhcnJheSk7DQoJfQ0K', '{}', 'MathHelper', 'VDM\\Joomla\\Utilities.MathHelper', '1.0.0', '{}', 'Utilities Math Helper', 'abstract class', '{}', '', 1, '2022-03-09 13:05:39', '2023-01-31 13:10:26', 13, 9),
(20, '', 'Control the naming of a plugin\r\n\r\n@since 3.0.9', '', '', '3cf76fbf-fd95-4a33-878e-7aff6d36b7f6', '', '', '', '{}', 'CS8qKg0KCSAqIE1ha2luZyBwbHVnaW4gZm9sZGVyIG5hbWUgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAkY29kZU5hbWUgICBUaGUgbmFtZQ0KCSAqIEBpbnB1dAlzdHJpbmcgICAgJGdyb3VwICAgVGhlIGdyb3VwIG5hbWUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZUZvbGRlck5hbWUoc3RyaW5nICRjb2RlTmFtZSwgc3RyaW5nICRncm91cCk6IHN0cmluZw0KCXsNCgkJLy8gZWRpdG9ycy14dGQgZ3JvdXAgcGx1Z2lucyBtdXN0IGhhdmUgYSBjbGFzcyB3aXRoIHBsZ0J1dHRvbjxQbHVnaW5OYW1lPiBzdHJ1Y3R1cmUNCgkJaWYgKCRncm91cCA9PT0gJ2VkaXRvcnMteHRkJykNCgkJew0KCQkJJGdyb3VwID0gJ0J1dHRvbic7DQoJCX0NCg0KCQlyZXR1cm4gJ3BsZ18nIC4gc3RydG9sb3dlcigkZ3JvdXApIC4gJ18nIC4gc3RydG9sb3dlcigNCgkJCSRjb2RlTmFtZQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIE1ha2luZyBwbHVnaW4gY2xhc3MgbmFtZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICRjb2RlTmFtZSAgIFRoZSBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAkZ3JvdXAgICBUaGUgZ3JvdXAgbmFtZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlQ2xhc3NOYW1lKHN0cmluZyAkY29kZU5hbWUsIHN0cmluZyAkZ3JvdXApOiBzdHJpbmcNCgl7DQoJCS8vIGVkaXRvcnMteHRkIGdyb3VwIHBsdWdpbnMgbXVzdCBoYXZlIGEgY2xhc3Mgd2l0aCBwbGdCdXR0b248UGx1Z2luTmFtZT4gc3RydWN0dXJlDQoJCWlmICgkZ3JvdXAgPT09ICdlZGl0b3JzLXh0ZCcpDQoJCXsNCgkJCSRncm91cCA9ICdCdXR0b24nOw0KCQl9DQoNCgkJcmV0dXJuICdQbGcnIC4gdWNmaXJzdCgkZ3JvdXApIC4gdWNmaXJzdCgNCgkJCSRjb2RlTmFtZQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIE1ha2luZyBwbHVnaW4gaW5zdGFsbCBjbGFzcyBuYW1lIHNhZmUNCgkgKg0KCSAqIEBpbnB1dAlzdHJpbmcgICAgJGNvZGVOYW1lICAgVGhlIG5hbWUNCgkgKiBAaW5wdXQJc3RyaW5nICAgICRncm91cCAgIFRoZSBncm91cCBuYW1lDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVJbnN0YWxsQ2xhc3NOYW1lKHN0cmluZyAkY29kZU5hbWUsIHN0cmluZyAkZ3JvdXApOiBzdHJpbmcNCgl7DQoJCS8vIGVkaXRvcnMteHRkIGdyb3VwIHBsdWdpbnMgbXVzdCBoYXZlIGEgY2xhc3Mgd2l0aCBwbGdCdXR0b248UGx1Z2luTmFtZT4gc3RydWN0dXJlDQoJCWlmICgkZ3JvdXAgPT09ICdlZGl0b3JzLXh0ZCcpDQoJCXsNCgkJCSRncm91cCA9ICdCdXR0b24nOw0KCQl9DQoNCgkJcmV0dXJuICdwbGcnIC4gdWNmaXJzdCgkZ3JvdXApIC4gdWNmaXJzdCgNCgkJCSRjb2RlTmFtZQ0KCQkpIC4gJ0luc3RhbGxlclNjcmlwdCc7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGxhbmd1YWdlIHByZWZpeCBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICRjb2RlTmFtZSAgIFRoZSBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAkZ3JvdXAgICBUaGUgZ3JvdXAgbmFtZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlTGFuZ1ByZWZpeChzdHJpbmcgJGNvZGVOYW1lLCBzdHJpbmcgJGdyb3VwKTogc3RyaW5nDQoJew0KCQkvLyBlZGl0b3JzLXh0ZCBncm91cCBwbHVnaW5zIG11c3QgaGF2ZSBhIGNsYXNzIHdpdGggcGxnQnV0dG9uPFBsdWdpbk5hbWU+IHN0cnVjdHVyZQ0KCQlpZiAoJGdyb3VwID09PSAnZWRpdG9ycy14dGQnKQ0KCQl7DQoJCQkkZ3JvdXAgPSAnQnV0dG9uJzsNCgkJfQ0KDQoJCXJldHVybiAnUExHXycgLiBzdHJ0b3VwcGVyKCRncm91cCkgLiAnXycgLiBzdHJ0b3VwcGVyKA0KCQkJJGNvZGVOYW1lDQoJCSk7DQoJfQ0K', '{}', 'PluginHelper', 'VDM\\Joomla\\Utilities.String.PluginHelper', '1.0.0', '{}', 'String Plugin Helper', 'abstract class', '{}', '', 1, '2022-03-09 14:44:58', '2023-01-14 18:00:42', 16, 5),
(21, 1, 'Global Unique ID Helper\r\n\r\n@since 3.0.9', '', '', '9c513baf-b279-43fd-ae29-a585c8cbc4f0', 'dXNlIEpvb21sYVxDTVNcRmFjdG9yeTs=', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"}}', 'CS8qKg0KCSAqIFJldHVybnMgYSBHVUlEdjQgc3RyaW5nDQoJICogDQoJICogVGhhbmtzIHRvIERhdmUgUGVhcnNvbiAoYW5kIG90aGVyKQ0KCSAqIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmNvbS1jcmVhdGUtZ3VpZC5waHAjMTE5MTY4IA0KCSAqDQoJICogVXNlcyB0aGUgYmVzdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbWV0aG9kDQoJICogZm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zIHdpdGggZmFsbGJhY2sgdG8gYW4gb2xkZXIsDQoJICogbGVzcyBzZWN1cmUgdmVyc2lvbi4NCgkgKg0KCSAqIEBwYXJhbSBib29sICR0cmltDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KGJvb2wgJHRyaW0gPSB0cnVlKTogc3RyaW5nDQoJew0KCQkvLyBXaW5kb3dzDQoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2NvbV9jcmVhdGVfZ3VpZCcpKQ0KCQl7DQoJCQlpZiAoJHRyaW0pDQoJCQl7DQoJCQkJcmV0dXJuIHRyaW0oY29tX2NyZWF0ZV9ndWlkKCksICd7fScpOw0KCQkJfQ0KCQkJcmV0dXJuIGNvbV9jcmVhdGVfZ3VpZCgpOw0KCQl9DQoNCgkJLy8gc2V0IHRoZSBicmFjZXMgaWYgbmVlZGVkDQoJCSRsYnJhY2UgPSAkdHJpbSA/ICIiIDogY2hyKDEyMyk7ICAgIC8vICJ7Ig0KCQkkcmJyYWNlID0gJHRyaW0gPyAiIiA6IGNocigxMjUpOyAgICAvLyAifSINCg0KCQkvLyBPU1gvTGludXgNCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BlbnNzbF9yYW5kb21fcHNldWRvX2J5dGVzJykpDQoJCXsNCgkJCSRkYXRhID0gb3BlbnNzbF9yYW5kb21fcHNldWRvX2J5dGVzKDE2KTsNCgkJCSRkYXRhWzZdID0gY2hyKCBvcmQoJGRhdGFbNl0pICYgMHgwZiB8IDB4NDApOyAgICAvLyBzZXQgdmVyc2lvbiB0byAwMTAwDQoJCQkkZGF0YVs4XSA9IGNociggb3JkKCRkYXRhWzhdKSAmIDB4M2YgfCAweDgwKTsgICAgLy8gc2V0IGJpdHMgNi03IHRvIDEwDQoJCQlyZXR1cm4gJGxicmFjZSAuIHZzcHJpbnRmKCclcyVzLSVzLSVzLSVzLSVzJXMlcycsIHN0cl9zcGxpdChiaW4yaGV4KCRkYXRhKSwgNCkpIC4gJGxicmFjZTsNCgkJfQ0KDQoJCS8vIEZhbGxiYWNrIChQSFAgNC4yKykNCgkJbXRfc3JhbmQoKGRvdWJsZSkgbWljcm90aW1lKCkgKiAxMDAwMCk7DQoJCSRjaGFyaWQgPSBzdHJ0b2xvd2VyKCBtZDUoIHVuaXFpZCggcmFuZCgpLCB0cnVlKSkpOw0KCQkkaHlwaGVuID0gY2hyKDQ1KTsgICAgICAgICAgICAgICAgICAvLyAiLSINCgkJJGd1aWR2NCA9ICRsYnJhY2UuDQoJCQlzdWJzdHIoJGNoYXJpZCwgIDAsICA4KS4gJGh5cGhlbi4NCgkJCXN1YnN0cigkY2hhcmlkLCAgOCwgIDQpLiAkaHlwaGVuLg0KCQkJc3Vic3RyKCRjaGFyaWQsIDEyLCAgNCkuICRoeXBoZW4uDQoJCQlzdWJzdHIoJGNoYXJpZCwgMTYsICA0KS4gJGh5cGhlbi4NCgkJCXN1YnN0cigkY2hhcmlkLCAyMCwgMTIpLg0KCQkJJHJicmFjZTsNCgkJcmV0dXJuICRndWlkdjQ7DQoJfQ0KDQoJLyoqDQoJICogVmFsaWRhdGUgdGhlIEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyICggYW5kIGNoZWNrIGlmIHRhYmxlIGFscmVhZHkgaGFzIHRoaXMgaWRlbnRpZmllcikNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJGd1aWQNCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgICAgICAgJHRhYmxlDQoJICogQHBhcmFtIGludCAgICAgICAgICAgICRpZA0KCSAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkY29tcG9uZW50DQoJICoNCgkgKiBAcmV0dXJuIGJvb2wNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkKCRndWlkLCA/c3RyaW5nICR0YWJsZSA9IG51bGwsIGludCAkaWQgPSAwLCA/c3RyaW5nICRjb21wb25lbnQgPSBudWxsKTogYm9vbA0KCXsNCgkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIHN0cmluZw0KCQlpZiAoc2VsZjo6dmFsaWRhdGUoJGd1aWQpKQ0KCQl7DQoJCQkvLyBjaGVjayBpZiB0YWJsZSBhbHJlYWR5IGhhcyB0aGlzIGlkZW50aWZpZXINCgkJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCR0YWJsZSkpDQoJCQl7DQoJCQkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSBjb21wb25lbnQgY29kZSBuYW1lDQoJCQkJaWYgKCFpc19zdHJpbmcoJGNvbXBvbmVudCkpDQoJCQkJew0KCQkJCQkkY29tcG9uZW50ID0gKHN0cmluZykgSGVscGVyOjpnZXRDb2RlKCk7DQoJCQkJfQ0KCQkJCS8vIEdldCB0aGUgZGF0YWJhc2Ugb2JqZWN0IGFuZCBhIG5ldyBxdWVyeSBvYmplY3QuDQoJCQkJJGRiID0gRmFjdG9yeTo6Z2V0RGJvKCk7DQoJCQkJJHF1ZXJ5ID0gJGRiLT5nZXRRdWVyeSh0cnVlKTsNCgkJCQkkcXVlcnktPnNlbGVjdCgnQ09VTlQoKiknKQ0KCQkJCQktPmZyb20oJyNfXycgLiAoc3RyaW5nKSAkY29tcG9uZW50IC4gJ18nIC4gKHN0cmluZykgJHRhYmxlKQ0KCQkJCQktPndoZXJlKCRkYi0+cXVvdGVOYW1lKCdndWlkJykgLiAnID0gJyAuICRkYi0+cXVvdGUoJGd1aWQpKTsNCg0KCQkJCS8vIHJlbW92ZSB0aGlzIGl0ZW0gZnJvbSB0aGUgbGlzdA0KCQkJCWlmICgkaWQgPiAwKQ0KCQkJCXsNCgkJCQkJJHF1ZXJ5LT53aGVyZSgkZGItPnF1b3RlTmFtZSgnaWQnKSAuICcgPD4gJyAuIChpbnQpICRpZCk7DQoJCQkJfQ0KDQoJCQkJLy8gU2V0IGFuZCBxdWVyeSB0aGUgZGF0YWJhc2UuDQoJCQkJJGRiLT5zZXRRdWVyeSgkcXVlcnkpOw0KCQkJCSRkdXBsaWNhdGUgPSAoYm9vbCkgJGRiLT5sb2FkUmVzdWx0KCk7DQoNCgkJCQlpZiAoJGR1cGxpY2F0ZSkNCgkJCQl7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IHRoZSBpdGVtIGJ5IGd1aWQgaW4gYSB0YWJsZQ0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgJGd1aWQNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAkdGFibGUNCgkgKiBAcGFyYW0gc3RyaW5nfGFycmF5ICAkd2hhdA0KCSAqIEBwYXJhbSBzdHJpbmd8bnVsbCAgICAkY29tcG9uZW50DQoJICoNCgkgKiBAcmV0dXJuIG1peA0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXRlbSgkZ3VpZCwgJHRhYmxlLCAkd2hhdCA9ICdhLmlkJywgP3N0cmluZyAkY29tcG9uZW50ID0gbnVsbCkNCgl7DQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBzdHJpbmcNCgkJLy8gY2hlY2sgaWYgdGFibGUgYWxyZWFkeSBoYXMgdGhpcyBpZGVudGlmaWVyDQoJCWlmIChzZWxmOjp2YWxpZGF0ZSgkZ3VpZCkgJiYgU3RyaW5nSGVscGVyOjpjaGVjaygkdGFibGUpKQ0KCQl7DQoJCQkvLyBjaGVjayB0aGF0IHdlIGhhdmUgdGhlIGNvbXBvbmVudCBjb2RlIG5hbWUNCgkJCWlmICghaXNfc3RyaW5nKCRjb21wb25lbnQpKQ0KCQkJew0KCQkJCSRjb21wb25lbnQgPSAoc3RyaW5nKSBIZWxwZXI6OmdldENvZGUoKTsNCgkJCX0NCgkJCS8vIEdldCB0aGUgZGF0YWJhc2Ugb2JqZWN0IGFuZCBhIG5ldyBxdWVyeSBvYmplY3QuDQoJCQkkZGIgPSBGYWN0b3J5OjpnZXREYm8oKTsNCgkJCSRxdWVyeSA9ICRkYi0+Z2V0UXVlcnkodHJ1ZSk7DQoNCgkJCWlmIChBcnJheUhlbHBlcjo6Y2hlY2soJHdoYXQpKQ0KCQkJew0KCQkJCSRxdWVyeS0+c2VsZWN0KCRkYi0+cXVvdGVOYW1lKCR3aGF0KSk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHF1ZXJ5LT5zZWxlY3QoJHdoYXQpOw0KCQkJfQ0KDQoJCQkkcXVlcnktPmZyb20oJGRiLT5xdW90ZU5hbWUoJyNfXycgLiAoc3RyaW5nKSAkY29tcG9uZW50IC4gJ18nIC4gKHN0cmluZykgJHRhYmxlLCAnYScpKQ0KCQkJCS0+d2hlcmUoJGRiLT5xdW90ZU5hbWUoJ2EuZ3VpZCcpIC4gJyA9ICcgLiAkZGItPnF1b3RlKCRndWlkKSk7DQoNCgkJCS8vIFNldCBhbmQgcXVlcnkgdGhlIGRhdGFiYXNlLg0KCQkJJGRiLT5zZXRRdWVyeSgkcXVlcnkpOw0KCQkJJGRiLT5leGVjdXRlKCk7DQoNCgkJCWlmICgkZGItPmdldE51bVJvd3MoKSkNCgkJCXsNCgkJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCR3aGF0KSB8fCAkd2hhdCA9PT0gJ2EuKicpDQoJCQkJew0KCQkJCQlyZXR1cm4gJGRiLT5sb2FkT2JqZWN0KCk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXJldHVybiAkZGItPmxvYWRSZXN1bHQoKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIFZhbGlkYXRlIHRoZSBHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcg0KCSAqDQoJICogVGhhbmtzIHRvIExld2llDQoJICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MTU0NTYvMTQyOTY3Nw0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZ3VpZA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZSgkZ3VpZCkNCgl7DQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBzdHJpbmcNCgkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJGd1aWQpKQ0KCQl7DQoJCQlyZXR1cm4gcHJlZ19tYXRjaCgiL14oXHspP1thLWZcZF17OH0oLVthLWZcZF17NH0pezR9W2EtZlxkXXs4fSg/KDEpXH0pJC9pIiwgJGd1aWQpOw0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQo=', '{}', 'GuidHelper', 'VDM\\Joomla\\Utilities.GuidHelper', '1.0.0', '{}', 'Utilities GuidHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-12 01:27:10', '2023-01-14 20:50:52', 17, 9),
-(22, 1, 'File helper\r\n\r\n@since 3.0.9', '', '', 'a223b31e-ea1d-4cdf-92ae-5f9becffaff0', 'dXNlIEpvb21sYVxDTVNcVXJpXFVyaTsNCnVzZSBKb29tbGFcQ01TXEZhY3Rvcnk7DQp1c2UgSm9vbWxhXENNU1xMYW5ndWFnZVxUZXh0Ow0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxQYXRoOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGaWxlOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGb2xkZXI7DQp1c2UgSm9vbWxhXEFyY2hpdmVcQXJjaGl2ZTs=', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"},\"load_selection2\":{\"load\":\"91004529-94a9-4590-b842-e7c6b624ecf5\"}}', 'CS8qKg0KCSAqIFRyaWdnZXIgZXJyb3Igbm90aWNlIG9ubHkgb25jZQ0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyAkY3VybEVycm9yID0gZmFsc2U7DQoNCgkvKioNCgkgKiBUaGUgemlwcGVyIG1ldGhvZA0KCSAqIA0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHdvcmtpbmdEaXJlY3RvcnkgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaXRlbXMgbXVzdCBiZSB6aXBwZWQNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRmaWxlcGF0aCAgICAgICAgICBUaGUgcGF0aCB0byB3aGVyZSB0aGUgemlwIGZpbGUgbXVzdCBiZSBwbGFjZWQNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgdHJ1ZSAgIE9uIHN1Y2Nlc3MNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcCgkd29ya2luZ0RpcmVjdG9yeSwgJiRmaWxlcGF0aCkNCgl7DQoJCS8vIHN0b3JlIHRoZSBjdXJyZW50IGpvb21sYSB3b3JraW5nIGRpcmVjdG9yeQ0KCQkkam9vbWxhID0gZ2V0Y3dkKCk7DQoNCgkJLy8gd2UgYXJlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgY29tcG9uZW50IHRlbXAgZm9sZGVyDQoJCWNoZGlyKCR3b3JraW5nRGlyZWN0b3J5KTsNCg0KCQkvLyB0aGUgZnVsbCBmaWxlIHBhdGggb2YgdGhlIHppcCBmaWxlDQoJCSRmaWxlcGF0aCA9IFBhdGg6OmNsZWFuKCRmaWxlcGF0aCk7DQoNCgkJLy8gZGVsZXRlIGFuIGV4aXN0aW5nIHppcCBmaWxlIChvciB1c2UgYW4gZXhjbHVzaW9uIHBhcmFtZXRlciBpbiBGb2xkZXI6OmZpbGVzKCkNCgkJRmlsZTo6ZGVsZXRlKCRmaWxlcGF0aCk7DQoNCgkJLy8gZ2V0IGEgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdHJlZSAoYWxzbyB0aGUgaGlkZGVuIGZpbGVzKQ0KCQkkZmlsZXMgPSBGb2xkZXI6OmZpbGVzKCcuJywgJycsIHRydWUsIHRydWUsIGFycmF5KCcuc3ZuJywgJ0NWUycsICcuRFNfU3RvcmUnLCAnX19NQUNPU1gnKSwgYXJyYXkoJy4qficpKTsNCg0KCQkkemlwQXJyYXkgPSBhcnJheSgpOw0KCQkvLyBzZXR1cCB0aGUgemlwIGFycmF5DQoJCWZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkNCgkJew0KCQkJJHRtcCA9IGFycmF5KCk7DQoJCQkkdG1wWyduYW1lJ10gPSBzdHJfcmVwbGFjZSgnLi8nLCAnJywgKHN0cmluZykgJGZpbGUpOw0KCQkJJHRtcFsnZGF0YSddID0gc2VsZjo6Z2V0Q29udGVudCgkZmlsZSk7DQoJCQkkdG1wWyd0aW1lJ10gPSBmaWxlbXRpbWUoJGZpbGUpOw0KCQkJJHppcEFycmF5W10gPSAkdG1wOw0KCQl9DQoNCgkJLy8gY2hhbmdlIGJhY2sgdG8gam9vbWxhIHdvcmtpbmcgZGlyZWN0b3J5DQoJCWNoZGlyKCRqb29tbGEpOw0KDQoJCS8vIGdldCB0aGUgemlwIGFkYXB0ZXINCgkJJGFkYXB0ZXIgPSBuZXcgQXJjaGl2ZSgpOw0KCQkkemlwID0gJGFkYXB0ZXItPmdldEFkYXB0ZXIoJ3ppcCcpOw0KDQoJCS8vY3JlYXRlIHRoZSB6aXAgZmlsZQ0KCQlpZiAoJHppcC0+Y3JlYXRlKCRmaWxlcGF0aCwgJHppcEFycmF5KSkNCgkJew0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIGdldCB0aGUgY29udGVudCBvZiBhIGZpbGUNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkcGF0aCAgIFRoZSBwYXRoIHRvIHRoZSBmaWxlDQoJICogQHBhcmFtICBzdHJpbmcvYm9vbCAgICRub25lICAgVGhlIHJldHVybiB2YWx1ZSBpZiBubyBjb250ZW50IHdhcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nICAgT24gc3VjY2Vzcw0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGVudCgkcGF0aCwgJG5vbmUgPSAnJykNCgl7DQoJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCRwYXRoKSkNCgkJew0KCQkJLy8gdXNlIGJhc2ljIGZpbGUgZ2V0IGNvbnRlbnQgZm9yIG5vdw0KCQkJaWYgKCgkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCkpICE9PSBGQUxTRSkNCgkJCXsNCgkJCQlyZXR1cm4gJGNvbnRlbnQ7DQoJCQl9DQoJCQkvLyB1c2UgY3VybCBpZiBhdmFpbGFibGUNCgkJCWVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkNCgkJCXsNCgkJCQkvLyBzdGFydCBjdXJsDQoJCQkJJGNoID0gY3VybF9pbml0KCk7DQoJCQkJLy8gc2V0IHRoZSBvcHRpb25zDQoJCQkJJG9wdGlvbnMgPSBhcnJheSgpOw0KCQkJCSRvcHRpb25zW0NVUkxPUFRfVVJMXSA9ICRwYXRoOw0KCQkJCSRvcHRpb25zW0NVUkxPUFRfVVNFUkFHRU5UXSA9ICdNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA2LjE7IGVuLVVTOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjYgRmlyZWZveC8zLjYuMTInOw0KCQkJCSRvcHRpb25zW0NVUkxPUFRfUkVUVVJOVFJBTlNGRVJdID0gVFJVRTsNCgkJCQkkb3B0aW9uc1tDVVJMT1BUX1NTTF9WRVJJRllQRUVSXSA9IEZBTFNFOw0KCQkJCS8vIGxvYWQgdGhlIG9wdGlvbnMNCgkJCQljdXJsX3NldG9wdF9hcnJheSgkY2gsICRvcHRpb25zKTsNCgkJCQkvLyBnZXQgdGhlIGNvbnRlbnQNCgkJCQkkY29udGVudCA9IGN1cmxfZXhlYygkY2gpOw0KCQkJCS8vIGNsb3NlIHRoZSBjb25uZWN0aW9uDQoJCQkJY3VybF9jbG9zZSgkY2gpOw0KDQoJCQkJLy8gcmV0dXJuIGlmIGZvdW5kDQoJCQkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJGNvbnRlbnQpKQ0KCQkJCXsNCgkJCQkJcmV0dXJuICRjb250ZW50Ow0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZiAoIXNlbGY6OiRjdXJsRXJyb3IpDQoJCQl7DQoJCQkJLy8gc2V0IHRoZSBub3RpY2UNCgkJCQlGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbigpLT5lbnF1ZXVlTWVzc2FnZShUZXh0OjpfKCc8aDI+Q3VybCBOb3QgRm91bmQhPC9oMj48cD5QbGVhc2Ugc2V0dXAgY3VybCBvbiB5b3VyIHN5c3RlbSwgb3IgPGI+W1tbY29tcG9uZW50XV1dPC9iPiB3aWxsIG5vdCBmdW5jdGlvbiBjb3JyZWN0bHkhPC9wPicpLCAnRXJyb3InKTsNCgkJCQkvLyBsb2FkIHRoaXMgbm90aWNlIG9ubHkgb25jZQ0KCQkJCXNlbGY6OiRjdXJsRXJyb3IgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkbm9uZTsNCgl9DQoNCgkvKioNCgkgKiBXcml0ZSBhIGZpbGUgdG8gdGhlIHNlcnZlcg0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAkcGF0aCAgICBUaGUgcGF0aCBhbmQgZmlsZSBuYW1lIHdoZXJlIHRvIHNhZmUgdGhlIGRhdGENCgkgKiBAcGFyYW0gIHN0cmluZyAgICRkYXRhICAgIFRoZSBkYXRhIHRvIHNhZmUNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgdHJ1ZSAgIE9uIHN1Y2Nlc3MNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdyaXRlKCRwYXRoLCAkZGF0YSkNCgl7DQoJCSRrbGFhciA9IGZhbHNlOw0KCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZGF0YSkpDQoJCXsNCgkJCS8vIG9wZW4gdGhlIGZpbGUNCgkJCSRmaCA9IGZvcGVuKCRwYXRoLCAidyIpOw0KCQkJaWYgKCFpc19yZXNvdXJjZSgkZmgpKQ0KCQkJew0KCQkJCXJldHVybiAka2xhYXI7DQoJCQl9DQoJCQkvLyB3cml0ZSB0byB0aGUgZmlsZQ0KCQkJaWYgKGZ3cml0ZSgkZmgsICRkYXRhKSkNCgkJCXsNCgkJCQkvLyBoYXMgYmVlbiBkb25lDQoJCQkJJGtsYWFyID0gdHJ1ZTsNCgkJCX0NCgkJCS8vIGNsb3NlIGZpbGUuDQoJCQlmY2xvc2UoJGZoKTsNCgkJfQ0KCQlyZXR1cm4gJGtsYWFyOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhbGwgdGhlIGZpbGUgcGF0aHMgaW4gZm9sZGVyIGFuZCBzdWIgZm9sZGVycw0KCSAqIA0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGZvbGRlciAgICAgVGhlIGxvY2FsIHBhdGggdG8gcGFyc2UNCgkgKiBAcGFyYW0gICBhcnJheSAgICRmaWxlVHlwZXMgIFRoZSB0eXBlIG9mIGZpbGVzIHRvIGdldA0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGF0aHMoJGZvbGRlciwgJGZpbGVUeXBlcyA9IGFycmF5KCdcLnBocCcsICdcLmpzJywgJ1wuY3NzJywgJ1wubGVzcycpLCAkcmVjdXJzZSA9IHRydWUsICRmdWxsID0gdHJ1ZSkNCgl7DQoJCWlmIChGb2xkZXI6OmV4aXN0cygkZm9sZGVyKSkNCgkJew0KCQkJLy8gd2UgbXVzdCBmaXJzdCBzdG9yZSB0aGUgY3VycmVudCB3b2tpbmcgZGlyZWN0b3J5DQoJCQkkam9vbWxhID0gZ2V0Y3dkKCk7DQoJCQkvLyB3ZSBhcmUgY2hhbmdpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBjb21wb25lbnQgcGF0aA0KCQkJY2hkaXIoJGZvbGRlcik7DQoNCgkJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGZpbGUgdHlwZSBmaWx0ZXINCgkJCWlmIChBcnJheUhlbHBlcjo6Y2hlY2soJGZpbGVUeXBlcykpDQoJCQl7DQoJCQkJLy8gZ2V0IHRoZSBmaWxlcw0KCQkJCWZvcmVhY2ggKCRmaWxlVHlwZXMgYXMgJHR5cGUpDQoJCQkJew0KCQkJCQkvLyBnZXQgYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0cmVlDQoJCQkJCSRmaWxlc1tdID0gRm9sZGVyOjpmaWxlcygnLicsICR0eXBlLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2VpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZmlsZVR5cGVzKSkNCgkJCXsNCgkJCQkvLyBnZXQgYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0cmVlDQoJCQkJJGZpbGVzW10gPSBGb2xkZXI6OmZpbGVzKCcuJywgJGZpbGVUeXBlcywgJHJlY3Vyc2UsICRmdWxsKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvLyBnZXQgYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0cmVlDQoJCQkJJGZpbGVzW10gPSBGb2xkZXI6OmZpbGVzKCcuJywgJy4nLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCQkJfQ0KDQoJCQkvLyBjaGFuZ2UgYmFjayB0byBKb29tbGEgd29ya2luZyBkaXJlY3RvcnkNCgkJCWNoZGlyKCRqb29tbGEpOw0KDQoJCQkvLyByZXR1cm4gYXJyYXkgb2YgZmlsZXMNCgkJCXJldHVybiBhcnJheV9tYXAoIGZuKCRmaWxlKSA9PiBzdHJfcmVwbGFjZSgnLi8nLCAnLycsIChzdHJpbmcpICRmaWxlKSwgKGFycmF5KSBBcnJheUhlbHBlcjo6bWVyZ2UoJGZpbGVzKSk7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIEdldCB0aGUgZmlsZSBwYXRoIG9yIHVybA0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAkdHlwZSAgICAgICAgICAgICAgVGhlICh1cmwvcGF0aCkgdHlwZSB0byByZXR1cm4NCgkgKiBAcGFyYW0gIHN0cmluZyAgICR0YXJnZXQgICAgICAgICAgICBUaGUgUGFyYW1zIFRhcmdldCBuYW1lIChpZiBzZXQpDQoJICogQHBhcmFtICBzdHJpbmcgICAkZmlsZVR5cGUgICAgICAgICAgVGhlIGtpbmQgb2YgZmlsZW5hbWUgdG8gZ2VuZXJhdGUgKGlmIG5vdCBzZXQgbm8gZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRrZXkgICAgICAgICAgICAgICBUaGUga2V5IHRvIGFkanVzdCB0aGUgZmlsZW5hbWUgKGlmIG5vdCBzZXQgaWdub3JlZCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRkZWZhdWx0ICAgICAgICAgICBUaGUgZGVmYXVsdCBwYXRoIGlmIG5vdCBzZXQgaW4gUGFyYW1zIChmYWxsYmFjayBwYXRoKQ0KCSAqIEBwYXJhbSAgYm9vbCAgICAgJGNyZWF0ZUlmTm90U2V0ICAgIFRoZSBzd2l0Y2ggdG8gY3JlYXRlIHRoZSBmb2xkZXIgaWYgbm90IGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICAgT24gc3VjY2VzcyB0aGUgcGF0aCBvciB1cmwgaXMgcmV0dXJuZWQgYmFzZWQgb24gdGhlIHR5cGUgcmVxdWVzdGVkDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQYXRoKCR0eXBlID0gJ3BhdGgnLCAkdGFyZ2V0ID0gJ2ZpbGVwYXRoJywgJGZpbGVUeXBlID0gbnVsbCwgJGtleSA9ICcnLCAkZGVmYXVsdCA9ICcnLCAkY3JlYXRlSWZOb3RTZXQgPSB0cnVlKQ0KCXsNCgkJLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBoYXZlIGEgc3RyaW5nL3BhdGgNCgkJaWYoIVN0cmluZ0hlbHBlcjo6Y2hlY2soJGRlZmF1bHQpKQ0KCQl7DQoJCQkkZGVmYXVsdCA9IEpQQVRIX1NJVEUgLiAnL2ltYWdlcy8nOw0KCQl9DQoNCgkJLy8gZ2V0IHRoZSBnbG9iYWwgc2V0dGluZ3MNCgkJJGZpbGVQYXRoID0gSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0YXJnZXQsICRkZWZhdWx0KTsNCg0KCQkvLyBjaGVjayB0aGUgZmlsZSBwYXRoIChyZXZlcnQgdG8gZGVmYXVsdCBvbmx5IG9mIG5vdCBhIGhpZGRlbiBmaWxlIHBhdGgpDQoJCWlmICgnaGlkZGVuZmlsZXBhdGgnICE9PSAkdGFyZ2V0ICYmIHN0cnBvcygoc3RyaW5nKSAkZmlsZVBhdGgsIChzdHJpbmcpIEpQQVRIX1NJVEUpID09PSBmYWxzZSkNCgkJew0KCQkJJGZpbGVQYXRoID0gJGRlZmF1bHQ7DQoJCX0NCg0KCQkvLyBjcmVhdGUgdGhlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdA0KCQlpZiAoJGNyZWF0ZUlmTm90U2V0ICYmICFGb2xkZXI6OmV4aXN0cygkZmlsZVBhdGgpKQ0KCQl7DQoJCQlGb2xkZXI6OmNyZWF0ZSgkZmlsZVBhdGgpOw0KCQl9DQoNCgkJLy8gc2V0dXAgdGhlIGZpbGUgbmFtZQ0KCQkkZmlsZU5hbWUgPSAnJzsNCg0KCQkvLyBHZXQgYmFzaWMga2V5DQoJCSRiYXNpY2tleSA9ICdUaCFzX2lTX24wdF9zQWZlX2J1VF9iM3R0ZXJfdGhlbl9uMHRoaXVnJzsNCgkJLy8gZ2V0IHRoZSBjb21wb25lbnQgaGVscGVyDQoJCSRoZWxwZXIgPSBIZWxwZXI6OmdldCgpOw0KCQkvLyBjaGVjayBpZiBtZXRob2QgZXhpc3QgaW4gaGVscGVyIGNsYXNzDQoJCWlmICgkaGVscGVyICYmIEhlbHBlcjo6bWV0aG9kRXhpc3RzKCdnZXRDcnlwdEtleScpKSANCgkJew0KCQkJJGJhc2lja2V5ID0gJGhlbHBlcjo6Z2V0Q3J5cHRLZXkoJ2Jhc2ljJywgJGJhc2lja2V5KTsNCgkJfQ0KDQoJCS8vIGNoZWNrIHRoZSBrZXkNCgkJaWYgKCFTdHJpbmdIZWxwZXI6OmNoZWNrKCRrZXkpKQ0KCQl7DQoJCQkka2V5ID0gJ3ZEbSc7DQoJCX0NCg0KCQkvLyBzZXQgdGhlIGZpbGUgbmFtZQ0KCQlpZiAoU3RyaW5nSGVscGVyOjpjaGVjaygkZmlsZVR5cGUpKQ0KCQl7DQoJCQkvLyBzZXQgdGhlIG5hbWUNCgkJCSRmaWxlTmFtZSA9IHRyaW0oIG1kNSgkdHlwZSAuICR0YXJnZXQgLiAkYmFzaWNrZXkgLiAka2V5KSAuICcuJyAuIHRyaW0oJGZpbGVUeXBlLCAnLicpKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRmaWxlTmFtZSA9IHRyaW0oIG1kNSgkdHlwZSAuICR0YXJnZXQgLiAkYmFzaWNrZXkgLiAka2V5KSkgLiAnLnR4dCc7DQoJCX0NCg0KCQkvLyByZXR1cm4gdGhlIHVybA0KCQlpZiAoJ3VybCcgPT09ICR0eXBlKQ0KCQl7DQoJCQlpZiAoXHN0cnBvcygoc3RyaW5nKSAkZmlsZVBhdGgsIChzdHJpbmcpIEpQQVRIX1NJVEUpICE9PSBmYWxzZSkNCgkJCXsNCgkJCQkkZmlsZVBhdGggPSB0cmltKCBzdHJfcmVwbGFjZSggSlBBVEhfU0lURSwgJycsIChzdHJpbmcpICRmaWxlUGF0aCksICcvJyk7DQoNCgkJCQlyZXR1cm4gVXJpOjpyb290KCkgLiAkZmlsZVBhdGggLiAnLycgLiAkZmlsZU5hbWU7DQoJCQl9DQoNCgkJCS8vIHNpbmNlIHRoZSBwYXRoIGlzIGJlaGluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIHNpdGUsIHJldHVybiBvbmx5IHRoZSByb290IHVybCAobWF5IGJlIHVzZWQgdG8gYnVpbGQgdGhlIGxpbmspDQoJCQlyZXR1cm4gVXJpOjpyb290KCk7DQoJCX0NCg0KCQkvLyBzYW5pdGl6ZSB0aGUgcGF0aA0KCQlyZXR1cm4gJy8nIC4gdHJpbSgoc3RyaW5nKSAgJGZpbGVQYXRoLCAnLycgKSAuICcvJyAuICRmaWxlTmFtZTsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBpZiBmaWxlIGV4aXN0DQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRwYXRoICAgVGhlIHVybC9wYXRoIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJuICBib29sICAgICAgSWYgZXhpc3QgdHJ1ZQ0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXhpc3RzKCRwYXRoKQ0KCXsNCgkJJGV4aXN0cyA9IGZhbHNlOw0KCQkvLyBpZiB0aGlzIGlzIGEgbG9jYWwgcGF0aA0KCQlpZiAoc3RycG9zKCRwYXRoLCAnaHR0cDonKSA9PT0gZmFsc2UgJiYgc3RycG9zKCRwYXRoLCAnaHR0cHM6JykgPT09IGZhbHNlKQ0KCQl7DQoJCQlpZiAoZmlsZV9leGlzdHMoJHBhdGgpKQ0KCQkJew0KCQkJCSRleGlzdHMgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCS8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgY3VybA0KCQllbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykpDQoJCXsNCgkJCS8vIGluaXRpYXRlIGN1cmwNCgkJCSRjaCA9IGN1cmxfaW5pdCgkcGF0aCk7DQoJCQkvLyBDVVJMT1BUX05PQk9EWSAoZG8gbm90IHJldHVybiBib2R5KQ0KCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX05PQk9EWSwgdHJ1ZSk7DQoJCQkvLyBtYWtlIGNhbGwNCgkJCSRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsNCgkJCS8vIGNoZWNrIHJldHVybiB2YWx1ZQ0KCQkJaWYgKCRyZXN1bHQgIT09IGZhbHNlKQ0KCQkJew0KCQkJCS8vIGdldCB0aGUgaHR0cCBDT0RFDQoJCQkJJHN0YXR1c0NvZGUgPSBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IVFRQX0NPREUpOw0KCQkJCWlmICgkc3RhdHVzQ29kZSAhPT0gNDA0KQ0KCQkJCXsNCgkJCQkJJGV4aXN0cyA9IHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gY2xvc2UgdGhlIGNvbm5lY3Rpb24NCgkJCWN1cmxfY2xvc2UoJGNoKTsNCgkJfQ0KCQllbHNlaWYgKCRoZWFkZXJzID0gQGdldF9oZWFkZXJzKCRwYXRoKSkNCgkJew0KCQkJaWYoaXNzZXQoJGhlYWRlcnNbMF0pICYmIGlzX3N0cmluZygkaGVhZGVyc1swXSkgJiYgc3RycG9zKCRoZWFkZXJzWzBdLCc0MDQnKSA9PT0gZmFsc2UpDQoJCQl7DQoJCQkJJGV4aXN0cyA9IHRydWU7DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRleGlzdHM7DQoJfQ0K', '{}', 'FileHelper', 'VDM\\Joomla\\Utilities.FileHelper', '1.0.0', '{}', 'Utilities FileHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-12 02:09:18', '2023-02-02 15:57:19', 32, 9),
+(22, 1, 'File helper\r\n\r\n@since 3.0.9', '', '', 'a223b31e-ea1d-4cdf-92ae-5f9becffaff0', 'dXNlIEpvb21sYVxDTVNcVXJpXFVyaTsNCnVzZSBKb29tbGFcQ01TXEZhY3Rvcnk7DQp1c2UgSm9vbWxhXENNU1xMYW5ndWFnZVxUZXh0Ow0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxQYXRoOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGaWxlOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGb2xkZXI7DQp1c2UgSm9vbWxhXEFyY2hpdmVcQXJjaGl2ZTs=', '', '', '{\"load_selection0\":{\"load\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"},\"load_selection2\":{\"load\":\"91004529-94a9-4590-b842-e7c6b624ecf5\"}}', 'CS8qKg0KCSAqIFRyaWdnZXIgZXJyb3Igbm90aWNlIG9ubHkgb25jZQ0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyAkY3VybEVycm9yID0gZmFsc2U7DQoNCgkvKioNCgkgKiBUaGUgemlwcGVyIG1ldGhvZA0KCSAqIA0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHdvcmtpbmdEaXJlY3RvcnkgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaXRlbXMgbXVzdCBiZSB6aXBwZWQNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRmaWxlcGF0aCAgICAgICAgICBUaGUgcGF0aCB0byB3aGVyZSB0aGUgemlwIGZpbGUgbXVzdCBiZSBwbGFjZWQNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgdHJ1ZSAgIE9uIHN1Y2Nlc3MNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcCgkd29ya2luZ0RpcmVjdG9yeSwgJiRmaWxlcGF0aCk6IGJvb2wNCgl7DQoJCS8vIHN0b3JlIHRoZSBjdXJyZW50IGpvb21sYSB3b3JraW5nIGRpcmVjdG9yeQ0KCQkkam9vbWxhID0gZ2V0Y3dkKCk7DQoNCgkJLy8gd2UgYXJlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgY29tcG9uZW50IHRlbXAgZm9sZGVyDQoJCWNoZGlyKCR3b3JraW5nRGlyZWN0b3J5KTsNCg0KCQkvLyB0aGUgZnVsbCBmaWxlIHBhdGggb2YgdGhlIHppcCBmaWxlDQoJCSRmaWxlcGF0aCA9IFBhdGg6OmNsZWFuKCRmaWxlcGF0aCk7DQoNCgkJLy8gZGVsZXRlIGFuIGV4aXN0aW5nIHppcCBmaWxlIChvciB1c2UgYW4gZXhjbHVzaW9uIHBhcmFtZXRlciBpbiBGb2xkZXI6OmZpbGVzKCkNCgkJRmlsZTo6ZGVsZXRlKCRmaWxlcGF0aCk7DQoNCgkJLy8gZ2V0IGEgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdHJlZSAoYWxzbyB0aGUgaGlkZGVuIGZpbGVzKQ0KCQkkZmlsZXMgPSBGb2xkZXI6OmZpbGVzKCcuJywgJycsIHRydWUsIHRydWUsIGFycmF5KCcuc3ZuJywgJ0NWUycsICcuRFNfU3RvcmUnLCAnX19NQUNPU1gnKSwgYXJyYXkoJy4qficpKTsNCg0KCQkkemlwQXJyYXkgPSBbXTsNCgkJLy8gc2V0dXAgdGhlIHppcCBhcnJheQ0KCQlmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpDQoJCXsNCgkJCSR0bXAgPSBbXTsNCgkJCSR0bXBbJ25hbWUnXSA9IHN0cl9yZXBsYWNlKCcuLycsICcnLCAoc3RyaW5nKSAkZmlsZSk7DQoJCQkkdG1wWydkYXRhJ10gPSBzZWxmOjpnZXRDb250ZW50KCRmaWxlKTsNCgkJCSR0bXBbJ3RpbWUnXSA9IGZpbGVtdGltZSgkZmlsZSk7DQoJCQkkemlwQXJyYXlbXSA9ICR0bXA7DQoJCX0NCg0KCQkvLyBjaGFuZ2UgYmFjayB0byBqb29tbGEgd29ya2luZyBkaXJlY3RvcnkNCgkJY2hkaXIoJGpvb21sYSk7DQoNCgkJLy8gZ2V0IHRoZSB6aXAgYWRhcHRlcg0KCQkkemlwID0gKG5ldyBBcmNoaXZlKCkpLT5nZXRBZGFwdGVyKCd6aXAnKTsNCg0KCQkvL2NyZWF0ZSB0aGUgemlwIGZpbGUNCgkJcmV0dXJuIChib29sKSAkemlwLT5jcmVhdGUoJGZpbGVwYXRoLCAkemlwQXJyYXkpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCB0aGUgY29udGVudCBvZiBhIGZpbGUNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkcGF0aCAgIFRoZSBwYXRoIHRvIHRoZSBmaWxlDQoJICogQHBhcmFtICBzdHJpbmcvYm9vbCAgICRub25lICAgVGhlIHJldHVybiB2YWx1ZSBpZiBubyBjb250ZW50IHdhcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nICAgT24gc3VjY2Vzcw0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGVudCgkcGF0aCwgJG5vbmUgPSAnJykNCgl7DQoJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCRwYXRoKSkNCgkJew0KCQkJLy8gdXNlIGJhc2ljIGZpbGUgZ2V0IGNvbnRlbnQgZm9yIG5vdw0KCQkJaWYgKCgkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCkpICE9PSBGQUxTRSkNCgkJCXsNCgkJCQlyZXR1cm4gJGNvbnRlbnQ7DQoJCQl9DQoJCQkvLyB1c2UgY3VybCBpZiBhdmFpbGFibGUNCgkJCWVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkNCgkJCXsNCgkJCQkvLyBzdGFydCBjdXJsDQoJCQkJJGNoID0gY3VybF9pbml0KCk7DQoJCQkJLy8gc2V0IHRoZSBvcHRpb25zDQoJCQkJJG9wdGlvbnMgPSBbXTsNCgkJCQkkb3B0aW9uc1tDVVJMT1BUX1VSTF0gPSAkcGF0aDsNCgkJCQkkb3B0aW9uc1tDVVJMT1BUX1VTRVJBR0VOVF0gPSAnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNi4xOyBlbi1VUzsgcnY6MS45LjIuMTIpIEdlY2tvLzIwMTAxMDI2IEZpcmVmb3gvMy42LjEyJzsNCgkJCQkkb3B0aW9uc1tDVVJMT1BUX1JFVFVSTlRSQU5TRkVSXSA9IFRSVUU7DQoJCQkJJG9wdGlvbnNbQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUl0gPSBGQUxTRTsNCgkJCQkvLyBsb2FkIHRoZSBvcHRpb25zDQoJCQkJY3VybF9zZXRvcHRfYXJyYXkoJGNoLCAkb3B0aW9ucyk7DQoJCQkJLy8gZ2V0IHRoZSBjb250ZW50DQoJCQkJJGNvbnRlbnQgPSBjdXJsX2V4ZWMoJGNoKTsNCgkJCQkvLyBjbG9zZSB0aGUgY29ubmVjdGlvbg0KCQkJCWN1cmxfY2xvc2UoJGNoKTsNCg0KCQkJCS8vIHJldHVybiBpZiBmb3VuZA0KCQkJCWlmIChTdHJpbmdIZWxwZXI6OmNoZWNrKCRjb250ZW50KSkNCgkJCQl7DQoJCQkJCXJldHVybiAkY29udGVudDsNCgkJCQl9DQoJCQl9DQoJCQllbHNlaWYgKCFzZWxmOjokY3VybEVycm9yKQ0KCQkJew0KCQkJCS8vIHNldCB0aGUgbm90aWNlDQoJCQkJRmFjdG9yeTo6Z2V0QXBwbGljYXRpb24oKS0+ZW5xdWV1ZU1lc3NhZ2UoVGV4dDo6XygnPGgyPkN1cmwgTm90IEZvdW5kITwvaDI+PHA+UGxlYXNlIHNldHVwIGN1cmwgb24geW91ciBzeXN0ZW0sIG9yIDxiPltbW2NvbXBvbmVudF1dXTwvYj4gd2lsbCBub3QgZnVuY3Rpb24gY29ycmVjdGx5ITwvcD4nKSwgJ0Vycm9yJyk7DQoJCQkJLy8gbG9hZCB0aGlzIG5vdGljZSBvbmx5IG9uY2UNCgkJCQlzZWxmOjokY3VybEVycm9yID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJG5vbmU7DQoJfQ0KDQoJLyoqDQoJICogV3JpdGUgYSBmaWxlIHRvIHRoZSBzZXJ2ZXINCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICAgVGhlIHBhdGggYW5kIGZpbGUgbmFtZSB3aGVyZSB0byBzYWZlIHRoZSBkYXRhDQoJICogQHBhcmFtICBzdHJpbmcgICAkZGF0YSAgICBUaGUgZGF0YSB0byBzYWZlDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3cml0ZSgkcGF0aCwgJGRhdGEpDQoJew0KCQkka2xhYXIgPSBmYWxzZTsNCgkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJGRhdGEpKQ0KCQl7DQoJCQkvLyBvcGVuIHRoZSBmaWxlDQoJCQkkZmggPSBmb3BlbigkcGF0aCwgInciKTsNCgkJCWlmICghaXNfcmVzb3VyY2UoJGZoKSkNCgkJCXsNCgkJCQlyZXR1cm4gJGtsYWFyOw0KCQkJfQ0KCQkJLy8gd3JpdGUgdG8gdGhlIGZpbGUNCgkJCWlmIChmd3JpdGUoJGZoLCAkZGF0YSkpDQoJCQl7DQoJCQkJLy8gaGFzIGJlZW4gZG9uZQ0KCQkJCSRrbGFhciA9IHRydWU7DQoJCQl9DQoJCQkvLyBjbG9zZSBmaWxlLg0KCQkJZmNsb3NlKCRmaCk7DQoJCX0NCgkJcmV0dXJuICRrbGFhcjsNCgl9DQoNCgkvKioNCgkgKiBnZXQgYWxsIHRoZSBmaWxlIHBhdGhzIGluIGZvbGRlciBhbmQgc3ViIGZvbGRlcnMNCgkgKiANCgkgKiBAcGFyYW0gICBzdHJpbmcgICRmb2xkZXIgICAgIFRoZSBsb2NhbCBwYXRoIHRvIHBhcnNlDQoJICogQHBhcmFtICAgYXJyYXkgICAkZmlsZVR5cGVzICBUaGUgdHlwZSBvZiBmaWxlcyB0byBnZXQNCgkgKg0KCSAqIEByZXR1cm4gIHZvaWQNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgPSBhcnJheSgnXC5waHAnLCAnXC5qcycsICdcLmNzcycsICdcLmxlc3MnKSwgJHJlY3Vyc2UgPSB0cnVlLCAkZnVsbCA9IHRydWUpDQoJew0KCQlpZiAoRm9sZGVyOjpleGlzdHMoJGZvbGRlcikpDQoJCXsNCgkJCS8vIHdlIG11c3QgZmlyc3Qgc3RvcmUgdGhlIGN1cnJlbnQgd29raW5nIGRpcmVjdG9yeQ0KCQkJJGpvb21sYSA9IGdldGN3ZCgpOw0KCQkJLy8gd2UgYXJlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgY29tcG9uZW50IHBhdGgNCgkJCWNoZGlyKCRmb2xkZXIpOw0KDQoJCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBmaWxlIHR5cGUgZmlsdGVyDQoJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCRmaWxlVHlwZXMpKQ0KCQkJew0KCQkJCS8vIGdldCB0aGUgZmlsZXMNCgkJCQlmb3JlYWNoICgkZmlsZVR5cGVzIGFzICR0eXBlKQ0KCQkJCXsNCgkJCQkJLy8gZ2V0IGEgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdHJlZQ0KCQkJCQkkZmlsZXNbXSA9IEZvbGRlcjo6ZmlsZXMoJy4nLCAkdHlwZSwgJHJlY3Vyc2UsICRmdWxsKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJGZpbGVUeXBlcykpDQoJCQl7DQoJCQkJLy8gZ2V0IGEgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdHJlZQ0KCQkJCSRmaWxlc1tdID0gRm9sZGVyOjpmaWxlcygnLicsICRmaWxlVHlwZXMsICRyZWN1cnNlLCAkZnVsbCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJLy8gZ2V0IGEgbGlzdCBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdHJlZQ0KCQkJCSRmaWxlc1tdID0gRm9sZGVyOjpmaWxlcygnLicsICcuJywgJHJlY3Vyc2UsICRmdWxsKTsNCgkJCX0NCg0KCQkJLy8gY2hhbmdlIGJhY2sgdG8gSm9vbWxhIHdvcmtpbmcgZGlyZWN0b3J5DQoJCQljaGRpcigkam9vbWxhKTsNCg0KCQkJLy8gcmV0dXJuIGFycmF5IG9mIGZpbGVzDQoJCQlyZXR1cm4gYXJyYXlfbWFwKCBmbigkZmlsZSkgPT4gc3RyX3JlcGxhY2UoJy4vJywgJy8nLCAoc3RyaW5nKSAkZmlsZSksIChhcnJheSkgQXJyYXlIZWxwZXI6Om1lcmdlKCRmaWxlcykpOw0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgdGhlIGZpbGUgcGF0aCBvciB1cmwNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHR5cGUgICAgICAgICAgICAgIFRoZSAodXJsL3BhdGgpIHR5cGUgdG8gcmV0dXJuDQoJICogQHBhcmFtICBzdHJpbmcgICAkdGFyZ2V0ICAgICAgICAgICAgVGhlIFBhcmFtcyBUYXJnZXQgbmFtZSAoaWYgc2V0KQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGZpbGVUeXBlICAgICAgICAgIFRoZSBraW5kIG9mIGZpbGVuYW1lIHRvIGdlbmVyYXRlIChpZiBub3Qgc2V0IG5vIGZpbGUgbmFtZSBpcyBnZW5lcmF0ZWQpDQoJICogQHBhcmFtICBzdHJpbmcgICAka2V5ICAgICAgICAgICAgICAgVGhlIGtleSB0byBhZGp1c3QgdGhlIGZpbGVuYW1lIChpZiBub3Qgc2V0IGlnbm9yZWQpDQoJICogQHBhcmFtICBzdHJpbmcgICAkZGVmYXVsdCAgICAgICAgICAgVGhlIGRlZmF1bHQgcGF0aCBpZiBub3Qgc2V0IGluIFBhcmFtcyAoZmFsbGJhY2sgcGF0aCkNCgkgKiBAcGFyYW0gIGJvb2wgICAgICRjcmVhdGVJZk5vdFNldCAgICBUaGUgc3dpdGNoIHRvIGNyZWF0ZSB0aGUgZm9sZGVyIGlmIG5vdCBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nICAgIE9uIHN1Y2Nlc3MgdGhlIHBhdGggb3IgdXJsIGlzIHJldHVybmVkIGJhc2VkIG9uIHRoZSB0eXBlIHJlcXVlc3RlZA0KCSAqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGF0aCgkdHlwZSA9ICdwYXRoJywgJHRhcmdldCA9ICdmaWxlcGF0aCcsICRmaWxlVHlwZSA9IG51bGwsICRrZXkgPSAnJywgJGRlZmF1bHQgPSAnJywgJGNyZWF0ZUlmTm90U2V0ID0gdHJ1ZSkNCgl7DQoJCS8vIG1ha2Ugc3VyZSB0byBhbHdheXMgaGF2ZSBhIHN0cmluZy9wYXRoDQoJCWlmKCFTdHJpbmdIZWxwZXI6OmNoZWNrKCRkZWZhdWx0KSkNCgkJew0KCQkJJGRlZmF1bHQgPSBKUEFUSF9TSVRFIC4gJy9pbWFnZXMvJzsNCgkJfQ0KDQoJCS8vIGdldCB0aGUgZ2xvYmFsIHNldHRpbmdzDQoJCSRmaWxlUGF0aCA9IEhlbHBlcjo6Z2V0UGFyYW1zKCktPmdldCgkdGFyZ2V0LCAkZGVmYXVsdCk7DQoNCgkJLy8gY2hlY2sgdGhlIGZpbGUgcGF0aCAocmV2ZXJ0IHRvIGRlZmF1bHQgb25seSBvZiBub3QgYSBoaWRkZW4gZmlsZSBwYXRoKQ0KCQlpZiAoJ2hpZGRlbmZpbGVwYXRoJyAhPT0gJHRhcmdldCAmJiBzdHJwb3MoKHN0cmluZykgJGZpbGVQYXRoLCAoc3RyaW5nKSBKUEFUSF9TSVRFKSA9PT0gZmFsc2UpDQoJCXsNCgkJCSRmaWxlUGF0aCA9ICRkZWZhdWx0Ow0KCQl9DQoNCgkJLy8gY3JlYXRlIHRoZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QNCgkJaWYgKCRjcmVhdGVJZk5vdFNldCAmJiAhRm9sZGVyOjpleGlzdHMoJGZpbGVQYXRoKSkNCgkJew0KCQkJRm9sZGVyOjpjcmVhdGUoJGZpbGVQYXRoKTsNCgkJfQ0KDQoJCS8vIHNldHVwIHRoZSBmaWxlIG5hbWUNCgkJJGZpbGVOYW1lID0gJyc7DQoNCgkJLy8gR2V0IGJhc2ljIGtleQ0KCQkkYmFzaWNrZXkgPSAnVGghc19pU19uMHRfc0FmZV9idVRfYjN0dGVyX3RoZW5fbjB0aGl1Zyc7DQoJCS8vIGdldCB0aGUgY29tcG9uZW50IGhlbHBlcg0KCQkkaGVscGVyID0gSGVscGVyOjpnZXQoKTsNCgkJLy8gY2hlY2sgaWYgbWV0aG9kIGV4aXN0IGluIGhlbHBlciBjbGFzcw0KCQlpZiAoJGhlbHBlciAmJiBIZWxwZXI6Om1ldGhvZEV4aXN0cygnZ2V0Q3J5cHRLZXknKSkgDQoJCXsNCgkJCSRiYXNpY2tleSA9ICRoZWxwZXI6OmdldENyeXB0S2V5KCdiYXNpYycsICRiYXNpY2tleSk7DQoJCX0NCg0KCQkvLyBjaGVjayB0aGUga2V5DQoJCWlmICghU3RyaW5nSGVscGVyOjpjaGVjaygka2V5KSkNCgkJew0KCQkJJGtleSA9ICd2RG0nOw0KCQl9DQoNCgkJLy8gc2V0IHRoZSBmaWxlIG5hbWUNCgkJaWYgKFN0cmluZ0hlbHBlcjo6Y2hlY2soJGZpbGVUeXBlKSkNCgkJew0KCQkJLy8gc2V0IHRoZSBuYW1lDQoJCQkkZmlsZU5hbWUgPSB0cmltKCBtZDUoJHR5cGUgLiAkdGFyZ2V0IC4gJGJhc2lja2V5IC4gJGtleSkgLiAnLicgLiB0cmltKCRmaWxlVHlwZSwgJy4nKSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkZmlsZU5hbWUgPSB0cmltKCBtZDUoJHR5cGUgLiAkdGFyZ2V0IC4gJGJhc2lja2V5IC4gJGtleSkpIC4gJy50eHQnOw0KCQl9DQoNCgkJLy8gcmV0dXJuIHRoZSB1cmwNCgkJaWYgKCd1cmwnID09PSAkdHlwZSkNCgkJew0KCQkJaWYgKFxzdHJwb3MoKHN0cmluZykgJGZpbGVQYXRoLCAoc3RyaW5nKSBKUEFUSF9TSVRFKSAhPT0gZmFsc2UpDQoJCQl7DQoJCQkJJGZpbGVQYXRoID0gdHJpbSggc3RyX3JlcGxhY2UoIEpQQVRIX1NJVEUsICcnLCAoc3RyaW5nKSAkZmlsZVBhdGgpLCAnLycpOw0KDQoJCQkJcmV0dXJuIFVyaTo6cm9vdCgpIC4gJGZpbGVQYXRoIC4gJy8nIC4gJGZpbGVOYW1lOw0KCQkJfQ0KDQoJCQkvLyBzaW5jZSB0aGUgcGF0aCBpcyBiZWhpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSBzaXRlLCByZXR1cm4gb25seSB0aGUgcm9vdCB1cmwgKG1heSBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBsaW5rKQ0KCQkJcmV0dXJuIFVyaTo6cm9vdCgpOw0KCQl9DQoNCgkJLy8gc2FuaXRpemUgdGhlIHBhdGgNCgkJcmV0dXJuICcvJyAuIHRyaW0oKHN0cmluZykgICRmaWxlUGF0aCwgJy8nICkgLiAnLycgLiAkZmlsZU5hbWU7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgZmlsZSBleGlzdA0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAkcGF0aCAgIFRoZSB1cmwvcGF0aCB0byBjaGVjaw0KCSAqDQoJICogQHJldHVybiAgYm9vbCAgICAgIElmIGV4aXN0IHRydWUNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4aXN0cygkcGF0aCkNCgl7DQoJCSRleGlzdHMgPSBmYWxzZTsNCgkJLy8gaWYgdGhpcyBpcyBhIGxvY2FsIHBhdGgNCgkJaWYgKHN0cnBvcygkcGF0aCwgJ2h0dHA6JykgPT09IGZhbHNlICYmIHN0cnBvcygkcGF0aCwgJ2h0dHBzOicpID09PSBmYWxzZSkNCgkJew0KCQkJaWYgKGZpbGVfZXhpc3RzKCRwYXRoKSkNCgkJCXsNCgkJCQkkZXhpc3RzID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQkvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGN1cmwNCgkJZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKQ0KCQl7DQoJCQkvLyBpbml0aWF0ZSBjdXJsDQoJCQkkY2ggPSBjdXJsX2luaXQoJHBhdGgpOw0KCQkJLy8gQ1VSTE9QVF9OT0JPRFkgKGRvIG5vdCByZXR1cm4gYm9keSkNCgkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9OT0JPRFksIHRydWUpOw0KCQkJLy8gbWFrZSBjYWxsDQoJCQkkcmVzdWx0ID0gY3VybF9leGVjKCRjaCk7DQoJCQkvLyBjaGVjayByZXR1cm4gdmFsdWUNCgkJCWlmICgkcmVzdWx0ICE9PSBmYWxzZSkNCgkJCXsNCgkJCQkvLyBnZXQgdGhlIGh0dHAgQ09ERQ0KCQkJCSRzdGF0dXNDb2RlID0gY3VybF9nZXRpbmZvKCRjaCwgQ1VSTElORk9fSFRUUF9DT0RFKTsNCgkJCQlpZiAoJHN0YXR1c0NvZGUgIT09IDQwNCkNCgkJCQl7DQoJCQkJCSRleGlzdHMgPSB0cnVlOw0KCQkJCX0NCgkJCX0NCgkJCS8vIGNsb3NlIHRoZSBjb25uZWN0aW9uDQoJCQljdXJsX2Nsb3NlKCRjaCk7DQoJCX0NCgkJZWxzZWlmICgkaGVhZGVycyA9IEBnZXRfaGVhZGVycygkcGF0aCkpDQoJCXsNCgkJCWlmKGlzc2V0KCRoZWFkZXJzWzBdKSAmJiBpc19zdHJpbmcoJGhlYWRlcnNbMF0pICYmIHN0cnBvcygkaGVhZGVyc1swXSwnNDA0JykgPT09IGZhbHNlKQ0KCQkJew0KCQkJCSRleGlzdHMgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkZXhpc3RzOw0KCX0NCg==', '{}', 'FileHelper', 'VDM\\Joomla\\Utilities.FileHelper', '1.0.0', '{}', 'Utilities FileHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-03-12 02:09:18', '2023-02-05 17:42:56', 33, 9),
(23, 1, 'Some component helper\r\n\r\n@since 3.0.11', '', '', '640b5352-fb09-425f-a26e-cd44eda03f15', 'dXNlIEpvb21sYVxJbnB1dFxJbnB1dDsNCnVzZSBKb29tbGFcQ01TXENvbXBvbmVudFxDb21wb25lbnRIZWxwZXI7DQp1c2UgSm9vbWxhXFJlZ2lzdHJ5XFJlZ2lzdHJ5Ow==', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBjdXJyZW50IG9wdGlvbg0KCSAqDQoJICogQHZhciAgICBzdHJpbmcNCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIHN0cmluZyAkb3B0aW9uOw0KDQoJLyoqDQoJICogVGhlIGNvbXBvbmVudCBwYXJhbXMgbGlzdCBjYWNoZQ0KCSAqDQoJICogQHZhciAgICBSZWdpc3RyeVtdDQoJICogQHNpbmNlICAgMy4wLjExDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBhcnJheSAkcGFyYW1zID0gW107DQoNCgkvKioNCgkgKiBHZXRzIHRoZSBwYXJhbWV0ZXIgb2JqZWN0IGZvciB0aGUgY29tcG9uZW50DQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmd8bnVsbCAgICAgJG9wdGlvbiAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEByZXR1cm4gIFJlZ2lzdHJ5ICAgICBBIFJlZ2lzdHJ5IG9iamVjdC4NCgkgKiBAc2VlICAgICBSZWdpc3RyeQ0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFyYW1zKD9zdHJpbmcgJG9wdGlvbiA9IG51bGwpOiBSZWdpc3RyeQ0KCXsNCgkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIG9wdGlvbg0KCQlpZiAoZW1wdHkoJG9wdGlvbikpDQoJCXsNCgkJCSRvcHRpb24gPSBzZWxmOjpnZXRPcHRpb24oKTsNCgkJfQ0KDQoJCS8vIGdldCBnbG9iYWwgdmFsdWUNCgkJaWYgKCFpc3NldChzZWxmOjokcGFyYW1zWyRvcHRpb25dKSB8fCAhc2VsZjo6JHBhcmFtc1skb3B0aW9uXSBpbnN0YW5jZW9mIFJlZ2lzdHJ5KQ0KCQl7DQoJCQlzZWxmOjokcGFyYW1zWyRvcHRpb25dID0gQ29tcG9uZW50SGVscGVyOjpnZXRQYXJhbXMoJG9wdGlvbik7DQoJCX0NCg0KCQlyZXR1cm4gc2VsZjo6JHBhcmFtc1skb3B0aW9uXTsNCgl9DQoNCgkvKioNCgkgKiBHZXRzIHRoZSBjb21wb25lbnQgb3B0aW9uDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmd8bnVsbCAgICAgICRkZWZhdWx0ICBUaGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgbm9uZSBpcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nfG51bGwgICAgICBBIGNvbXBvbmVudCBvcHRpb24NCgkgKiBAc2luY2UgICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE9wdGlvbihzdHJpbmcgJGRlZmF1bHQgPSAnZW1wdHknKTogP3N0cmluZw0KCXsNCgkJaWYgKGVtcHR5KHNlbGY6OiRvcHRpb24pKQ0KCQl7DQoJCQkvLyBnZXQgdGhlIG9wdGlvbiBmcm9tIHRoZSB1cmwgaW5wdXQNCgkJCXNlbGY6OiRvcHRpb24gPSAobmV3IElucHV0KS0+Z2V0U3RyaW5nKCdvcHRpb24nLCBmYWxzZSk7DQoJCX0NCg0KCQlpZiAoc2VsZjo6JG9wdGlvbikNCgkJew0KCQkJIHJldHVybiBzZWxmOjokb3B0aW9uOw0KCQl9DQoNCgkJcmV0dXJuICRkZWZhdWx0Ow0KCX0NCg0KCS8qKg0KCSAqIEdldHMgdGhlIGNvbXBvbmVudCBjb2RlIG5hbWUNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZ3xudWxsICAgICRvcHRpb24gICBUaGUgb3B0aW9uIGZvciB0aGUgY29tcG9uZW50Lg0KCSAqIEBwYXJhbSAgIHN0cmluZ3xudWxsICAgICRkZWZhdWx0ICBUaGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgbm9uZSBpcyBmb3VuZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nfG51bGwgICAgQSBjb21wb25lbnQgY29kZSBuYW1lDQoJICogQHNpbmNlICAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb2RlKD9zdHJpbmcgJG9wdGlvbiA9IG51bGwsID9zdHJpbmcgJGRlZmF1bHQgPSBudWxsKTogP3N0cmluZw0KCXsNCgkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIG9wdGlvbg0KCQlpZiAoZW1wdHkoJG9wdGlvbikpDQoJCXsNCgkJCSRvcHRpb24gPSBzZWxmOjpnZXRPcHRpb24oKTsNCgkJfQ0KCQkvLyBvcHRpb24gd2l0aCBjb21fDQoJCWlmIChpc19zdHJpbmcoJG9wdGlvbikgJiYgc3RycG9zKCRvcHRpb24sICdjb21fJykgPT09IDApDQoJCXsNCgkJCXJldHVybiBzdHJ0b2xvd2VyKHRyaW0oc3Vic3RyKCRvcHRpb24sIDQpKSk7DQoJCX0NCg0KCQlyZXR1cm4gJGRlZmF1bHQ7DQoJfQ0KDQoJLyoqDQoJICogR2V0cyB0aGUgY29tcG9uZW50IGFic3RyYWN0IGhlbHBlciBjbGFzcw0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAgJG9wdGlvbiAgIFRoZSBvcHRpb24gZm9yIHRoZSBjb21wb25lbnQuDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAgJGRlZmF1bHQgIFRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBub25lIGlzIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmd8bnVsbCAgICBBIGNvbXBvbmVudCBoZWxwZXIgbmFtZQ0KCSAqDQoJICogQHNpbmNlICAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRvcHRpb24gPSBudWxsLCBzdHJpbmcgJGRlZmF1bHQgPSBudWxsKTogP3N0cmluZw0KCXsNCgkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIG9wdGlvbg0KCQkvLyBhbmQgZ2V0IHRoZSBjb2RlIG5hbWUgZnJvbSBpdA0KCQlpZiAoKCRjb2RlX25hbWUgPSBzZWxmOjpnZXRDb2RlKCRvcHRpb24sIGZhbHNlKSkgIT09IGZhbHNlKQ0KCQl7DQoJCQkvLyB3ZSBidWlsZCB0aGUgaGVscGVyIGNsYXNzIG5hbWUNCgkJCSRoZWxwZXJfbmFtZSA9ICdcXCcgLiBcdWNmaXJzdCgkY29kZV9uYW1lKSAuICdIZWxwZXInOw0KCQkJLy8gY2hlY2sgaWYgY2xhc3MgZXhpc3QNCgkJCWlmIChjbGFzc19leGlzdHMoJGhlbHBlcl9uYW1lKSkNCgkJCXsNCgkJCQlyZXR1cm4gJGhlbHBlcl9uYW1lOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuICRkZWZhdWx0Ow0KCX0NCg0KCS8qKg0KCSAqIENoZWNrIGlmIHRoZSBoZWxwZXIgY2xhc3Mgb2YgdGhpcyBjb21wb25lbnQgaGFzIGEgbWV0aG9kDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgICAgJG1ldGhvZCAgVGhlIG1ldGhvZCBuYW1lIHRvIHNlYXJjaCBmb3INCgkgKiBAcGFyYW0gICBzdHJpbmd8bnVsbCAgJG9wdGlvbiAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgICAgdHJ1ZSBpZiBtZXRob2QgZXhpc3QNCgkgKg0KCSAqIEBzaW5jZSAgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWV0aG9kRXhpc3RzKHN0cmluZyAkbWV0aG9kLCBzdHJpbmcgJG9wdGlvbiA9IG51bGwpOiBib29sDQoJew0KCQkvLyBnZXQgdGhlIGhlbHBlciBjbGFzcw0KCQlyZXR1cm4gKCRoZWxwZXIgPSBzZWxmOjpnZXQoJG9wdGlvbiwgZmFsc2UpKSAhPT0gZmFsc2UgJiYNCgkJCW1ldGhvZF9leGlzdHMoJGhlbHBlciwgJG1ldGhvZCk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgdGhlIGhlbHBlciBjbGFzcyBvZiB0aGlzIGNvbXBvbmVudCBoYXMgYSBtZXRob2QsIGFuZCBjYWxsIGl0IHdpdGggdGhlIGFyZ3VtZW50cw0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAgICAgICAkbWV0aG9kICAgICBUaGUgbWV0aG9kIG5hbWUgdG8gc2VhcmNoIGZvcg0KCSAqIEBwYXJhbSAgIGFycmF5ICAgICAgICAgJGFyZ3VtZW50cyAgVGhlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24uDQoJICogQHBhcmFtICAgc3RyaW5nfG51bGwgICAkb3B0aW9uICAgICBUaGUgb3B0aW9uIGZvciB0aGUgY29tcG9uZW50Lg0KCSAqDQoJICogQHJldHVybiAgbWl4ZWQgICAgcmV0dXJuIHdoYXRldmVyIHRoZSBtZXRob2QgcmV0dXJucyBvciBudWxsDQoJICogQHNpbmNlICAgMy4yLjANCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF8oc3RyaW5nICRtZXRob2QsIGFycmF5ICRhcmd1bWVudHMgPSBbXSwgP3N0cmluZyAkb3B0aW9uID0gbnVsbCkNCgl7DQoJCS8vIGdldCB0aGUgaGVscGVyIGNsYXNzDQoJCWlmICgoJGhlbHBlciA9IHNlbGY6OmdldCgkb3B0aW9uLCBmYWxzZSkpICE9PSBmYWxzZSAmJg0KCQkJbWV0aG9kX2V4aXN0cygkaGVscGVyLCAkbWV0aG9kKSkNCgkJew0KCQkJLy8gd2Uga25vdyB0aGlzIGlzIG5vdCBpZGVhbC4uLg0KCQkJLy8gc28gd2UgbmVlZCB0byBtb3ZlIHRoZXNlDQoJCQkvLyBmdW5jdGlvbnMgdG8gdGhlaXIgb3duIGNsYXNzZXMNCgkJCXJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheShbJGhlbHBlciwgJG1ldGhvZF0sICAkYXJndW1lbnRzKTsNCgkJfQ0KDQoJCXJldHVybiBudWxsOw0KCX0NCg==', '{}', 'Helper', 'VDM\\Joomla\\Utilities.Component.Helper', '1.0.0', '{}', 'Utilities Component Helper', 'abstract class', '{}', '', 1, '2022-05-13 05:36:32', '2023-01-26 15:29:49', 27, 7),
(24, 1, 'Image helper\r\n\r\n@since 3.0.11', '', '', '962b15d8-915f-4cd7-aea6-7cf82afdc20b', 'dXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGaWxlOw0KdXNlIEpvb21sYVxDTVNcRmlsZXN5c3RlbVxGb2xkZXI7DQp1c2UgSm9vbWxhXENNU1xVcmlcVXJpOw0KdXNlIEpvb21sYVxDTVNcSW1hZ2VcSW1hZ2U7', '', '', '{\"load_selection0\":{\"load\":\"91004529-94a9-4590-b842-e7c6b624ecf5\"},\"load_selection1\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"}}', 'CS8qKg0KCSAqIFJlc2l6ZSBhbiBpbWFnZQ0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAgICRmdWxsUGF0aCAgIFRoZSBmdWxsIHBhdGggdG8gdGhlIGltYWdlDQoJICogQHBhcmFtICAgc3RyaW5nICAgICR0eXBlICAgICAgICBUaGUgdHlwZSBvZiBpbWFnZQ0KCSAqDQoJICogQHJldHVybiBib29sDQoJICogQHNpbmNlIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzaXplKHN0cmluZyAkZnVsbFBhdGgsIHN0cmluZyAkdHlwZSkNCgl7DQoJCS8vIGZpcnN0IGNoZWNrIGlmIHdlIHNob3VsZCByZXNpemUgdGhpcyB0YXJnZXQNCgkJaWYgKDEgPT0gSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0eXBlIC4gJ19yZXNpemUnLCAwKSkNCgkJew0KCQkJLy8gbG9hZCB0aGUgc2l6ZSB0byBiZSBzZXQNCgkJCSRoZWlnaHQgPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJHR5cGUgLiAnX2hlaWdodCcsICdub3Rfc2V0Jyk7DQoJCQkkd2lkdGggPSBIZWxwZXI6OmdldFBhcmFtcygpLT5nZXQoJHR5cGUgLiAnX3dpZHRoJywgJ25vdF9zZXQnKTsNCg0KCQkJLy8gR2V0IGZpbGUgZXh0ZW5zaW9uL2Zvcm1hdA0KCQkJJGZpbGVfZm9ybWF0ID0gTWltZUhlbHBlcjo6ZXh0ZW5zaW9uKCRmdWxsUGF0aCk7DQoNCgkJCS8vIGdldCBpbWFnZSBwcm9wZXJ0aWVzDQoJCQkkaW1hZ2UgPSBzZWxmOjpnZXRQcm9wZXJ0aWVzKCRmdWxsUGF0aCk7DQoNCgkJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIG9iamVjdA0KCQkJaWYgKE9iamVjdEhlbHBlcjo6Y2hlY2soJGltYWdlKSAmJiBpc19zdHJpbmcoJGZpbGVfZm9ybWF0KSkNCgkJCXsNCgkJCQlpZiAoJHdpZHRoICE9PSAnbm90X3NldCcgJiYgJGhlaWdodCAhPT0gJ25vdF9zZXQnICYmICgkaW1hZ2UtPndpZHRoICE9ICR3aWR0aCB8fCAkaW1hZ2UtPmhlaWdodCAhPSAkaGVpZ2h0KSkNCgkJCQl7DQoJCQkJCS8vIGlmIGltYWdlIGlzIGh1Z2UgYW5kIHNob3VsZCBvbmx5IGJlIHNjYWxlZCwgcmVzaXplIGl0IG9uIHRoZSBmbHkNCgkJCQkJaWYoKCRpbWFnZS0+d2lkdGggPiA5MDAgfHwgJGltYWdlLT5oZWlnaHQgPiA3MDApICYmICgkaGVpZ2h0ID09IDAgfHwgJHdpZHRoID09IDApKQ0KCQkJCQl7DQoJCQkJCQkvLyBzZWxlY3QgdGhlIGltYWdlICJnZXR0ZXIiIGJhc2VkIG9uIGZvcm1hdA0KCQkJCQkJaWYoJGZpbGVfZm9ybWF0ID09ICJqcGciIHx8ICRmaWxlX2Zvcm1hdCA9PSAianBlZyIgKQ0KCQkJCQkJew0KCQkJCQkJCSRzcmMgPSBpbWFnZWNyZWF0ZWZyb21qcGVnKCRmdWxsUGF0aCk7DQoJCQkJCQl9DQoJCQkJCQllbHNlaWYoJGZpbGVfZm9ybWF0ID09ICJwbmciKQ0KCQkJCQkJew0KCQkJCQkJCSRzcmMgPSBpbWFnZWNyZWF0ZWZyb21wbmcoJGZ1bGxQYXRoKTsNCgkJCQkJCX0NCgkJCQkJCWVsc2VpZigkZmlsZV9mb3JtYXQgPT0gImdpZiIpDQoJCQkJCQl7DQoJCQkJCQkJJHNyYyA9IGltYWdlY3JlYXRlZnJvbWdpZigkZnVsbFBhdGgpOw0KCQkJCQkJfQ0KCQkJCQkJLy8gd2Ugb25seSBzdXBwb3J0IHRoZSBhYm92ZSB0aHJlZSBmb3JtYXRzIGZvciBub3cNCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIHdvcmtvdXQgdGhlIHJhdGlvIGlmIHdlIGhhdmUgaGVpZ2h0DQoJCQkJCQlpZiAoJGhlaWdodCAhPSAwKQ0KCQkJCQkJew0KCQkJCQkJCSRoZWlnaHRfcmF0aW8gPSAkaW1hZ2UtPmhlaWdodCAvICRoZWlnaHQ7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIHdvcmtvdXQgdGhlIHJhdGlvIGlmIHdlIGhhdmUgd2lkdGgNCgkJCQkJCWlmICgkd2lkdGggIT0gMCkNCgkJCQkJCXsNCgkJCQkJCQkkd2lkdGhfcmF0aW8gPSAkaW1hZ2UtPndpZHRoIC8gJHdpZHRoOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBzZXQgbWF4IHJhdGlvIGJhc2VkIG9uIGJvdGgNCgkJCQkJCWlmIChpc3NldCgkaGVpZ2h0X3JhdGlvKSAmJiBpc3NldCgkd2lkdGhfcmF0aW8pKQ0KCQkJCQkJew0KCQkJCQkJCSRtYXhfcmF0aW8JPSBtYXgoJHdpZHRoX3JhdGlvLCAkaGVpZ2h0X3JhdGlvKTsNCgkJCQkJCX0NCgkJCQkJCS8vIHNldCBtYXggcmF0aW8gYmFzZWQgb24gd2lkdGgNCgkJCQkJCWVsc2VpZiAoaXNzZXQoJHdpZHRoX3JhdGlvKSkNCgkJCQkJCXsNCgkJCQkJCQkkbWF4X3JhdGlvCT0gJHdpZHRoX3JhdGlvOw0KCQkJCQkJfQ0KCQkJCQkJLy8gc2V0IG1heCByYXRpbyBiYXNlZCBvbiBoZWlnaHQNCgkJCQkJCWVsc2VpZiAoaXNzZXQoJGhlaWdodF9yYXRpbykpDQoJCQkJCQl7DQoJCQkJCQkJJG1heF9yYXRpbwk9ICRoZWlnaHRfcmF0aW87DQoJCQkJCQl9DQoNCgkJCQkJCS8vIGlmIHdlIGhhdmUgcmF0aW8gZG8gdGhlIGNvbnZlcnNpb24NCgkJCQkJCWlmICgkbWF4X3JhdGlvID4gMSkNCgkJCQkJCXsNCgkJCQkJCQkkbmV3X3dpZHRoCT0gJGltYWdlLT53aWR0aCAvICRtYXhfcmF0aW87DQoJCQkJCQkJJG5ld19oZWlnaHQJPSAkaW1hZ2UtPmhlaWdodCAvICRtYXhfcmF0aW87DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJJG5ld193aWR0aAk9ICRpbWFnZS0+d2lkdGg7DQoJCQkJCQkJJG5ld19oZWlnaHQJPSAkaW1hZ2UtPmhlaWdodDsNCgkJCQkJCX0NCg0KCQkJCQkJJHRtcAkJCT0gaW1hZ2VjcmVhdGV0cnVlY29sb3IoJG5ld193aWR0aCwgJG5ld19oZWlnaHQpOw0KCQkJCQkJJGJhY2tncm91bmRfY29sb3IJPSBpbWFnZWNvbG9yYWxsb2NhdGUoJHRtcCwgMjU1LCAyNTUsIDI1NSk7DQoNCgkJCQkJCWltYWdlZmlsbCgkdG1wLCAwLCAwLCAkYmFja2dyb3VuZF9jb2xvcik7DQoJCQkJCQlpbWFnZWNvcHlyZXNhbXBsZWQoJHRtcCwgJHNyYywgMCwgMCwgMCwgMCwkbmV3X3dpZHRoLCAkbmV3X2hlaWdodCwgJGltYWdlLT53aWR0aCwgJGltYWdlLT5oZWlnaHQpOw0KCQkJCQkJaW1hZ2VqcGVnKCR0bXAsICRmdWxsUGF0aCwgMTAwKTsNCgkJCQkJCWltYWdlZGVzdHJveSgkc3JjKTsNCgkJCQkJCWltYWdlZGVzdHJveSgkdG1wKTsNCgkJCQkJfQ0KCQkJCQkvLyB3ZSBvbmx5IGNyb3AgaWYgYm90aCBoZWlnaHQgYW5kIHdpZHRoIGlzIHNldCB0byBjcm9wDQoJCQkJCWlmICgkaGVpZ2h0ICE9IDAgJiYgJHdpZHRoICE9IDApDQoJCQkJCXsNCgkJCQkJCS8vIGdldCB0aGUgY3VycmVudCBjb21wb25lbnQgY29kZSBuYW1lDQoJCQkJCQlpZiAoKCRjb21wb25lbnRfY29kZV9uYW1lID0gSGVscGVyOjpnZXRDb2RlKG51bGwsIGZhbHNlKSkgPT09IGZhbHNlKQ0KCQkJCQkJew0KCQkJCQkJCS8vIGlmIHdlIGNhbid0IGdldCB0aGUgY29tcG9uZW50IGNvZGUgbmFtZSB3ZSBzaG91bGQgYnJlYWsgcHV0IG5vdw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJCS8vIEluY2x1ZGUgd2lkZWltYWdlIC0gaHR0cDovL3dpZGVpbWFnZS5zb3VyY2Vmb3JnZS5uZXQgVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL3Ntb3R0dC9XaWRlSW1hZ2UNCgkJCQkJCXJlcXVpcmVfb25jZShKUEFUSF9BRE1JTklTVFJBVE9SIC4gJy9jb21wb25lbnRzL2NvbV8nIC4gJGNvbXBvbmVudF9jb2RlX25hbWUgLiAnL2hlbHBlcnMvd2lkZWltYWdlL1dpZGVJbWFnZS5waHAnKTsNCgkJCQkJCS8vIGxvYWQgdGhlIGltYWdlIGludG8gdGhlIGJ1aWxkZXINCgkJCQkJCSRidWlsZGVyID0gXFdpZGVJbWFnZTo6bG9hZCgkZnVsbFBhdGgpOw0KCQkJCQkJLy8gcmVzaXplIHRoZSBpbWFnZQ0KCQkJCQkJJHJlc2l6ZWQgPSAkYnVpbGRlci0+cmVzaXplKCR3aWR0aCwgJGhlaWdodCwgJ291dHNpZGUnKS0+Y3JvcCgnY2VudGVyJywgJ21pZGRsZScsICR3aWR0aCwgJGhlaWdodCk7DQoJCQkJCQkvLyBzYXZlIHRoZSBuZXcgaW1hZ2UgdG8gZnVsbCBmaWxlIHBhdGgNCgkJCQkJCSRyZXNpemVkLT5zYXZlVG9GaWxlKCRmdWxsUGF0aCk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIEdldCBJbWFnZSBQcm9wZXJ0aWVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAgJGZ1bGxQYXRoICAgVGhlIGZ1bGwgcGF0aCB0byB0aGUgaW1hZ2UNCgkgKg0KCSAqIEByZXR1cm4gYm9vbHxzdGRDbGFzcw0KCSAqIEBzaW5jZSAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFByb3BlcnRpZXMoJGZ1bGxQYXRoKQ0KCXsNCgkJLy8gY2hlY2sgdGhhdCB0aGUgZmlsZSBleGlzdA0KCQlpZiAoRmlsZTo6ZXhpc3RzKCRmdWxsUGF0aCkpDQoJCXsNCgkJCSRwcm9wZXJ0aWVzID0gSW1hZ2U6OmdldEltYWdlRmlsZVByb3BlcnRpZXMoJGZ1bGxQYXRoKTsNCgkJCS8vIGNoZWNrIGlmIHdlIGhhdmUgcHJvcGVydGllcw0KCQkJaWYgKE9iamVjdEhlbHBlcjo6Y2hlY2soJHByb3BlcnRpZXMpKQ0KCQkJew0KCQkJCS8vIGdldCBpbWFnZSBmaWxlIG5hbWUNCgkJCQkkbmFtZSA9IGJhc2VuYW1lKCRmdWxsUGF0aCk7DQoJCQkJLy8gcmVtb3ZlIGZpbGUgbmFtZSBmcm9tIHBhdGgNCgkJCQkkZGlyX25hbWUgPSBwYXRoaW5mbygkZnVsbFBhdGgsIFBBVEhJTkZPX0RJUk5BTUUpOw0KCQkJCS8vIHJlbW92ZSB0aGUgc2VydmVyIHBhdGgNCgkJCQkkaW1hZ2VfcHVibGljX3BhdGggPSB0cmltKHN0cl9yZXBsYWNlKEpQQVRIX1NJVEUsICcnLCAkZGlyX25hbWUpLCAnLycpIC4gJy8nIC4gJG5hbWU7DQoJCQkJLy8gbm93IGFkZCB0aGUgc3JjIHBhdGggdG8gc2hvdyB0aGUgaW1hZ2UNCgkJCQkkcHJvcGVydGllcy0+c3JjID0gVXJpOjpyb290KCkgLiAkaW1hZ2VfcHVibGljX3BhdGg7DQoJCQkJLy8gcmV0dXJuIHRoZSBpbWFnZSBwcm9wZXJ0aWVzDQoJCQkJcmV0dXJuICRwcm9wZXJ0aWVzOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9DQo=', '{}', 'ImageHelper', 'VDM\\Joomla\\Utilities.ImageHelper', '1.0.0', '{}', 'Utilities ImageHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-05-16 10:59:17', '2022-09-20 09:51:10', 21, 9),
-(25, 1, 'Upload Helper\r\n\r\n@since 3.0.11', '', '', 'd7600b43-771a-4747-9f5d-952765721799', 'dXNlIEpvb21sYVxDTVNcRmFjdG9yeTsNCnVzZSBKb29tbGFcQ01TXExhbmd1YWdlXFRleHQ7DQp1c2UgSm9vbWxhXENNU1xGaWxlc3lzdGVtXEZpbGU7DQp1c2UgSm9vbWxhXENNU1xGaWxlc3lzdGVtXEZvbGRlcjsNCnVzZSBKb29tbGFcQ01TXEZpbGVzeXN0ZW1cUGF0aDs=', '', '', '{\"load_selection0\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"}}', 'CS8qKg0KCSAqIFRydWUgdG8gdXNlIHN0cmVhbXMNCgkgKg0KCSAqIEB2YXIgICAgYm9vbA0KCSAqDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljICR1c2VTdHJlYW1zID0gZmFsc2U7DQoNCgkvKioNCgkgKiBBbGxvdyB0aGUgdXBsb2FkIG9mIHVuc2FmZSBmaWxlcw0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJGFsbG93VW5zYWZlID0gZmFsc2U7DQoNCgkvKioNCgkgKiBPcHRpb25zIHRvIElucHV0RmlsdGVyOjppc1NhZmVGaWxlDQoJICoNCgkgKiBAdmFyICAgIGFycmF5DQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJHNhZmVGaWxlT3B0aW9ucyA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBTZXQgdGhlIGVycm9yIGJlaGF2aW9yDQoJICoNCgkgKiBAdmFyICAgIGJvb2wNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyAkZW5xdWV1ZUVycm9yID0gdHJ1ZTsNCg0KCS8qKg0KCSAqIEVycm9ycw0KCSAqDQoJICogQHZhciAgICBhcnJheQ0KCSAqDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljICRlcnJvcnMgPSBhcnJheSgpOw0KDQoJLyoqDQoJICogR2V0IGZpbGUvZmlsZXMgZnJvbSBhIEhUVFAgdXBsb2FkLg0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJGZpZWxkICAgICAgICBUaGUgaW5wdXQgZmllbGQgbmFtZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICR0eXBlICAgICAgICBUaGUgZmlsZSB0eXBlDQoJICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRmaWx0ZXIgICAgICAgIFRoZSBmaWx0ZXIgdG8gdXNlIHdoZW4gdXBsb2FkaW5nIHRoZSBmaWxlDQoJICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRwYXRoICAgICAgICBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbWFnZSBtdXN0IGJlIHBsYWNlZA0KCSAqDQoJICogQHJldHVybiAgbWl4ZWQgICBGaWxlIGRldGFpbHMgb3IgZmFsc2Ugb24gZmFpbHVyZS4NCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkZmllbGQsIHN0cmluZyAkdHlwZSwgc3RyaW5nICRmaWx0ZXIgPSBudWxsLCBzdHJpbmcgJHBhdGggPSBudWxsKQ0KCXsNCgkJLy8gR2V0IHRoZSB1cGxvYWRlZCBmaWxlIGluZm9ybWF0aW9uLg0KCQkkaW5wdXQgICAgPSBGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbigpLT5pbnB1dDsNCg0KCQkvLyBzZXQgdGhlIGRlZmF1bHQgZmlsdGVyDQoJCWlmIChlbXB0eSgkZmlsdGVyKSkNCgkJew0KCQkJJGZpbHRlciA9ICdhcnJheSc7DQoJCX0NCgkJLy8gaWYgcmF3IHRoZW4gYWxzbyB1bnNhZmUNCgkJLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vam9vbWxhL2pvb21sYS1jbXMvYmxvYi80LjEtZGV2L2FkbWluaXN0cmF0b3IvY29tcG9uZW50cy9jb21faW5zdGFsbGVyL3NyYy9Nb2RlbC9JbnN0YWxsTW9kZWwucGhwI0wyNTkNCgkJZWxzZWlmICgkZmlsdGVyID09PSAncmF3JykNCgkJew0KCQkJc2VsZjo6JGFsbG93VW5zYWZlID0gdHJ1ZTsNCgkJfQ0KDQoJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBmaWxlIGRlc3RpbmF0aW9uIG5hbWUgaW4gdGhlIGZpZWxkIG5hbWUNCgkJJG5hbWUgPSBudWxsOw0KCQlpZiAoc3RycG9zKCRmaWVsZCwgJzonKSAhPT0gZmFsc2UpDQoJCXsNCgkJCWxpc3QoJGZpZWxkLCAkbmFtZSkgPSBleHBsb2RlKCc6JywgJGZpZWxkKTsNCgkJfQ0KDQoJCS8vIFNlZSBKSW5wdXRGaWxlczo6Z2V0Lg0KCQkkdXNlcmZpbGUgPSAkaW5wdXQtPmZpbGVzLT5nZXQoJGZpZWxkLCBudWxsLCAkZmlsdGVyKTsNCg0KCQkvLyBNYWtlIHN1cmUgdGhhdCBmaWxlIHVwbG9hZHMgYXJlIGVuYWJsZWQgaW4gcGhwLg0KCQlpZiAoIShib29sKSBpbmlfZ2V0KCdmaWxlX3VwbG9hZHMnKSkNCgkJew0KCQkJc2VsZjo6c2V0RXJyb3IoVGV4dDo6XygnV2FybmluZywgdXBsb2FkIGVycm9yLicpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLy8gSWYgdGhlcmUgaXMgbm8gdXBsb2FkZWQgZmlsZSwgd2UgaGF2ZSBhIHByb2JsZW0uLi4NCgkJaWYgKCFpc19hcnJheSgkdXNlcmZpbGUpKQ0KCQl7DQoJCQlzZWxmOjpzZXRFcnJvcihUZXh0OjpfKCdObyB1cGxvYWQgc2VsZWN0ZWQnKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIElzIHRoZSBQSFAgdG1wIGRpcmVjdG9yeSBtaXNzaW5nPw0KCQlpZiAoJHVzZXJmaWxlWydlcnJvciddICYmICgkdXNlcmZpbGVbJ2Vycm9yJ10gPT0gVVBMT0FEX0VSUl9OT19UTVBfRElSKSkNCgkJew0KCQkJc2VsZjo6c2V0RXJyb3IoVGV4dDo6XygnVGhlcmUgd2FzIGFuIGVycm9yIHVwbG9hZGluZyB0byB0aGUgc2VydmVyLicpIC4gJzxicj4nIC4gVGV4dDo6XygnVGhlIFBIUCB0ZW1wb3JhcnkgZm9sZGVyIGlzIG5vdCBzZXQuJykpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvLyBJcyB0aGUgbWF4IHVwbG9hZCBzaXplIHRvbyBzbWFsbCBpbiBwaHAuaW5pPw0KCQlpZiAoJHVzZXJmaWxlWydlcnJvciddICYmICgkdXNlcmZpbGVbJ2Vycm9yJ10gPT0gVVBMT0FEX0VSUl9JTklfU0laRSkpDQoJCXsNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGxvYWRpbmcgdG8gdGhlIHNlcnZlci4nKSAuICc8YnI+JyAuIFRleHQ6Ol8oJ1lvdXIgZmlsZSB3YXMgaXMgbGFyZ2VyIHRoYW4gdGhlIGFsbG93ZWQgc2l6ZS4nKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIGRpZmZlcmVudCBwcm9ibGVtIHVwbG9hZGluZyB0aGUgZmlsZS4NCgkJaWYgKCR1c2VyZmlsZVsnZXJyb3InXSB8fCAkdXNlcmZpbGVbJ3NpemUnXSA8IDEpDQoJCXsNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGxvYWRpbmcgdG8gdGhlIHNlcnZlci4nKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIGNoZWNrIGlmIGEgcGF0aCB3YXMgcGFzc2VkIGFuZCBleGlzdA0KCQlpZiAoaXNfc3RyaW5nKCRwYXRoKSAmJiBGb2xkZXI6OmNyZWF0ZSgkcGF0aCkpDQoJCXsNCgkJCS8vIHNldCB0aGUgcGF0aA0KCQkJJHVzZXJmaWxlWydwYXRoJ10gPSAkcGF0aDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIGdldCB0aGUgSm9vbWxhIGNvbmZpZyBjbGFzcw0KCQkJJGNvbmZpZyA9IEZhY3Rvcnk6OmdldENvbmZpZygpOw0KCQkJLy8gc2V0IHRoZSBwYXRoDQoJCQkkdXNlcmZpbGVbJ3BhdGgnXSA9ICRjb25maWctPmdldCgndG1wX3BhdGgnKTsNCgkJfQ0KDQoJCS8vIHNldCB0aGUgcmFuZG9tIHBhcnQgb2YgdGhlIG5hbWUNCgkJJHVzZXJmaWxlWydyYW5kb20nXSA9IFN0cmluZ0hlbHBlcjo6cmFuZG9tKDEyKTsNCg0KCQkvLyBzZXQgdGhlIGZpbGUgbmFtZQ0KCQlpZiAoZW1wdHkoJG5hbWUpKQ0KCQl7DQoJCQkvLyBzZXQgdGhlIGZpbGUgbmFtZQ0KCQkJJHVzZXJmaWxlWydmaWxlX25hbWUnXSA9ICR1c2VyZmlsZVsncmFuZG9tJ10gLiAkdXNlcmZpbGVbJ25hbWUnXTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIGNoZWNrIHRoYXQgaGlzIG5hbWUgaGFzIGZpbGUgZm9ybWF0DQoJCQlpZiAoaXNfc3RyaW5nKCRuYW1lKSAmJiBzdHJwb3MoJG5hbWUsICcuJykgPT09IGZhbHNlKQ0KCQkJew0KCQkJCSRuYW1lID0gJG5hbWUgLiAnLicgLiBNaW1lSGVscGVyOjpleHRlbnNpb24obnVsbCwgJHVzZXJmaWxlWyd0eXBlJ10pOw0KCQkJfQ0KCQkJJHVzZXJmaWxlWydmaWxlX25hbWUnXSA9ICRuYW1lOw0KCQl9DQoNCgkJLy8gc2V0IGZ1bGwgcGF0aA0KCQkkdXNlcmZpbGVbJ2Z1bGxfcGF0aCddID0gJHVzZXJmaWxlWydwYXRoJ10gLiAnLycgLiAkdXNlcmZpbGVbJ2ZpbGVfbmFtZSddOw0KDQoJCS8vIFVwbG9hZCB0aGUgZmlsZS4NCgkJaWYgKEZpbGU6OnVwbG9hZCgkdXNlcmZpbGVbJ3RtcF9uYW1lJ10sICR1c2VyZmlsZVsnZnVsbF9wYXRoJ10sIHNlbGY6OiR1c2VTdHJlYW1zLCBzZWxmOjokYWxsb3dVbnNhZmUpKQ0KCQl7DQoJCQkvLyBDaGVjayB0aGF0IHRoaXMgaXMgYSB2YWxpZCBmaWxlDQoJCQlyZXR1cm4gc2VsZjo6Y2hlY2soJHVzZXJmaWxlLCAkdHlwZSk7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8qKg0KCSAqIEdldCB0aGUgZXJyb3JzDQoJICoNCgkgKiBAcGFyYW0gIGJvb2wgICAgICAgICAkdG9TdHJpbmcgICAgICBUaGUgb3B0aW9uIHRvIHJldHVybiBlcnJvcnMgYXMgYSBzdHJpbmcNCgkgKg0KCSAqIEByZXR1cm4gIGFycmF5DQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEVycm9yKCR0b1N0cmluZyA9IGZhbHNlKQ0KCXsNCgkJaWYgKCR0b1N0cmluZykNCgkJew0KCQkJcmV0dXJuIGltcGxvZGUoJyAnIC4gUEhQX0VPTCwgc2VsZjo6JGVycm9ycyk7DQoJCX0NCgkJcmV0dXJuIHNlbGY6OiRlcnJvcnM7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgYSBmaWxlIGFuZCB2ZXJpZmllcyBpdCBhcyBhIGFsbG93ZWQgZmlsZSBmb3JtYXQgZmlsZQ0KCSAqDQoJICogQHBhcmFtICBhcnJheSAgICAgICAgICR1cGxvYWQgICAgICBUaGUgdXBsb2FkZWQgZGV0YWlscyBhcnJheQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkdHlwZSAgICAgICAgICBUaGUgZmlsZSB0eXBlDQoJICoNCgkgKiBAcmV0dXJuICBhcnJheSAgb2YgZWxlbWVudHMNCgkgKg0KCSAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY2hlY2soYXJyYXkgJHVwbG9hZCwgc3RyaW5nICR0eXBlKQ0KCXsNCgkJLy8gRGVmYXVsdCBmb3JtYXRzDQoJCSRmb3JtYXRzID0gTWltZUhlbHBlcjo6ZXh0ZW5zaW9ucygkdHlwZSk7DQoNCgkJLy8gQ2xlYW4gdGhlIHBhdGgNCgkJJHVwbG9hZF9wYXRoID0gUGF0aDo6Y2xlYW4oJHVwbG9hZFsnZnVsbF9wYXRoJ10pOw0KDQoJCS8vIEdldCBmaWxlIGV4dGVuc2lvbi9mb3JtYXQNCgkJJGZvcm1hdCA9IE1pbWVIZWxwZXI6OmV4dGVuc2lvbigkdXBsb2FkX3BhdGgpOw0KDQoJCS8vIExlZ2FsIGZpbGUgZm9ybWF0cw0KCQkkbGVnYWwgPSBhcnJheSgpOw0KDQoJCS8vIGNoZWNrIGlmIHRoZSBmaWxlIGZvcm1hdCBpcyBldmVuIGluIHRoZSBsaXN0DQoJCWlmIChpbl9hcnJheSgkZm9ybWF0LCAkZm9ybWF0cykpDQoJCXsNCgkJCS8vIGdldCBhbGxvd2VkIGZvcm1hdHMNCgkJCSRsZWdhbCA9IChhcnJheSkgSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0eXBlIC4gJ19mb3JtYXRzJywgYXJyYXkoKSk7DQoJCX0NCg0KCQkvLyBjaGVjayB0aGUgZXh0ZW5zaW9uDQoJCWlmICghaW5fYXJyYXkoJGZvcm1hdCwgJGxlZ2FsKSkNCgkJew0KCQkJLy8gQ2xlYW51cCB0aGUgaW1wb3J0IGZpbGUNCgkJCXNlbGY6OnJlbW92ZSgkdXBsb2FkWydmdWxsX3BhdGgnXSk7DQoNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ1VwbG9hZCBpcyBub3QgYSB2YWxpZCB0eXBlLicpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJcmV0dXJuICR1cGxvYWQ7DQoJfQ0KDQoJLyoqDQoJICogQ2xlYW4gdXAgdGVtcG9yYXJ5IHVwbG9hZGVkIGZpbGUNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGZ1bGxQYXRoICAgIFRoZSBmdWxsIHBhdGggb2YgdGhlIHVwbG9hZGVkIGZpbGUNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2xlYW4gIFRydWUgb24gc3VjY2Vzcw0KCSAqDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiByZW1vdmUoJGZ1bGxQYXRoKQ0KCXsNCgkJLy8gSXMgdGhlIHBhY2thZ2UgZmlsZSBhIHZhbGlkIGZpbGU/DQoJCWlmIChpc19maWxlKCRmdWxsUGF0aCkpDQoJCXsNCgkJCUZpbGU6OmRlbGV0ZSgkZnVsbFBhdGgpOw0KCQl9DQoJCWVsc2VpZiAoaXNfZmlsZShQYXRoOjpjbGVhbigkZnVsbFBhdGgpKSkNCgkJew0KCQkJLy8gSXQgbWlnaHQgYWxzbyBiZSBqdXN0IGEgYmFzZSBmaWxlbmFtZQ0KCQkJRmlsZTo6ZGVsZXRlKFBhdGg6OmNsZWFuKCRmdWxsUGF0aCkpOw0KCQl9DQoJfQ0KDQoJLyoqDQoJICogU2V0IHRoZSBlcnJvcnMNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAkbWVzc2FnZSAgIFRoZSBlcnJvciBtZXNzYWdlDQoJICoNCgkgKiBAcmV0dXJuICB2b2lkDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHNldEVycm9yKCRtZXNzYWdlKQ0KCXsNCgkJaWYgKHNlbGY6OiRlbnF1ZXVlRXJyb3IpDQoJCXsNCgkJCUZhY3Rvcnk6OmdldEFwcGxpY2F0aW9uKCktPmVucXVldWVNZXNzYWdlKCRtZXNzYWdlLCAnZXJyb3InKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXNlbGY6OiRlcnJvcnNbXSA9ICRtZXNzYWdlOw0KCQl9DQoJfQ0K', '{}', 'UploadHelper', 'VDM\\Joomla\\Utilities.UploadHelper', '1.0.0', '{}', 'Utilities UploadHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-05-16 13:20:50', '2022-09-20 10:10:51', 37, 9),
+(25, 1, 'Upload Helper\r\n\r\n@since 3.0.11', '', '', 'd7600b43-771a-4747-9f5d-952765721799', 'dXNlIEpvb21sYVxDTVNcRmFjdG9yeTsNCnVzZSBKb29tbGFcQ01TXExhbmd1YWdlXFRleHQ7DQp1c2UgSm9vbWxhXENNU1xGaWxlc3lzdGVtXEZpbGU7DQp1c2UgSm9vbWxhXENNU1xGaWxlc3lzdGVtXEZvbGRlcjsNCnVzZSBKb29tbGFcQ01TXEZpbGVzeXN0ZW1cUGF0aDs=', '', '', '{\"load_selection0\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"},\"load_selection1\":{\"load\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\"}}', 'CS8qKg0KCSAqIFRydWUgdG8gdXNlIHN0cmVhbXMNCgkgKg0KCSAqIEB2YXIgICAgYm9vbA0KCSAqDQoJICogQHNpbmNlICAzLjAuMTENCgkgKi8NCglwdWJsaWMgc3RhdGljICR1c2VTdHJlYW1zID0gZmFsc2U7DQoNCgkvKioNCgkgKiBBbGxvdyB0aGUgdXBsb2FkIG9mIHVuc2FmZSBmaWxlcw0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJGFsbG93VW5zYWZlID0gZmFsc2U7DQoNCgkvKioNCgkgKiBPcHRpb25zIHRvIElucHV0RmlsdGVyOjppc1NhZmVGaWxlDQoJICoNCgkgKiBAdmFyICAgIGFycmF5DQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJHNhZmVGaWxlT3B0aW9ucyA9IFtdOw0KDQoJLyoqDQoJICogU2V0IHRoZSBlcnJvciBiZWhhdmlvcg0KCSAqDQoJICogQHZhciAgICBib29sDQoJICoNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgJGVucXVldWVFcnJvciA9IHRydWU7DQoNCgkvKioNCgkgKiBFcnJvcnMNCgkgKg0KCSAqIEB2YXIgICAgYXJyYXkNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyAkZXJyb3JzID0gW107DQoNCgkvKioNCgkgKiBHZXQgZmlsZS9maWxlcyBmcm9tIGEgSFRUUCB1cGxvYWQuDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkZmllbGQgICAgICAgIFRoZSBpbnB1dCBmaWVsZCBuYW1lDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJHR5cGUgICAgICAgIFRoZSBmaWxlIHR5cGUNCgkgKiBAcGFyYW0gIHN0cmluZ3xudWxsICAgJGZpbHRlciAgICAgICAgVGhlIGZpbHRlciB0byB1c2Ugd2hlbiB1cGxvYWRpbmcgdGhlIGZpbGUNCgkgKiBAcGFyYW0gIHN0cmluZ3xudWxsICAgJHBhdGggICAgICAgIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGltYWdlIG11c3QgYmUgcGxhY2VkDQoJICoNCgkgKiBAcmV0dXJuICBtaXhlZCAgIEZpbGUgZGV0YWlscyBvciBmYWxzZSBvbiBmYWlsdXJlLg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRmaWVsZCwgc3RyaW5nICR0eXBlLCBzdHJpbmcgJGZpbHRlciA9IG51bGwsIHN0cmluZyAkcGF0aCA9IG51bGwpDQoJew0KCQkvLyBHZXQgdGhlIHVwbG9hZGVkIGZpbGUgaW5mb3JtYXRpb24uDQoJCSRpbnB1dCAgICA9IEZhY3Rvcnk6OmdldEFwcGxpY2F0aW9uKCktPmlucHV0Ow0KDQoJCS8vIHNldCB0aGUgZGVmYXVsdCBmaWx0ZXINCgkJaWYgKGVtcHR5KCRmaWx0ZXIpKQ0KCQl7DQoJCQkkZmlsdGVyID0gJ2FycmF5JzsNCgkJfQ0KCQkvLyBpZiByYXcgdGhlbiBhbHNvIHVuc2FmZQ0KCQkvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb29tbGEvam9vbWxhLWNtcy9ibG9iLzQuMS1kZXYvYWRtaW5pc3RyYXRvci9jb21wb25lbnRzL2NvbV9pbnN0YWxsZXIvc3JjL01vZGVsL0luc3RhbGxNb2RlbC5waHAjTDI1OQ0KCQllbHNlaWYgKCRmaWx0ZXIgPT09ICdyYXcnKQ0KCQl7DQoJCQlzZWxmOjokYWxsb3dVbnNhZmUgPSB0cnVlOw0KCQl9DQoNCgkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIGZpbGUgZGVzdGluYXRpb24gbmFtZSBpbiB0aGUgZmllbGQgbmFtZQ0KCQkkbmFtZSA9IG51bGw7DQoJCWlmIChzdHJwb3MoJGZpZWxkLCAnOicpICE9PSBmYWxzZSkNCgkJew0KCQkJbGlzdCgkZmllbGQsICRuYW1lKSA9IGV4cGxvZGUoJzonLCAkZmllbGQpOw0KCQl9DQoNCgkJLy8gU2VlIEpJbnB1dEZpbGVzOjpnZXQuDQoJCSR1c2VyZmlsZSA9ICRpbnB1dC0+ZmlsZXMtPmdldCgkZmllbGQsIG51bGwsICRmaWx0ZXIpOw0KDQoJCS8vIE1ha2Ugc3VyZSB0aGF0IGZpbGUgdXBsb2FkcyBhcmUgZW5hYmxlZCBpbiBwaHAuDQoJCWlmICghKGJvb2wpIGluaV9nZXQoJ2ZpbGVfdXBsb2FkcycpKQ0KCQl7DQoJCQlzZWxmOjpzZXRFcnJvcihUZXh0OjpfKCdXYXJuaW5nLCB1cGxvYWQgZXJyb3IuJykpOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQkvLyBJZiB0aGVyZSBpcyBubyB1cGxvYWRlZCBmaWxlLCB3ZSBoYXZlIGEgcHJvYmxlbS4uLg0KCQlpZiAoIWlzX2FycmF5KCR1c2VyZmlsZSkpDQoJCXsNCgkJCXNlbGY6OnNldEVycm9yKFRleHQ6Ol8oJ05vIHVwbG9hZCBzZWxlY3RlZCcpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLy8gSXMgdGhlIFBIUCB0bXAgZGlyZWN0b3J5IG1pc3Npbmc/DQoJCWlmICgkdXNlcmZpbGVbJ2Vycm9yJ10gJiYgKCR1c2VyZmlsZVsnZXJyb3InXSA9PSBVUExPQURfRVJSX05PX1RNUF9ESVIpKQ0KCQl7DQoJCQlzZWxmOjpzZXRFcnJvcihUZXh0OjpfKCdUaGVyZSB3YXMgYW4gZXJyb3IgdXBsb2FkaW5nIHRvIHRoZSBzZXJ2ZXIuJykgLiAnPGJyPicgLiBUZXh0OjpfKCdUaGUgUEhQIHRlbXBvcmFyeSBmb2xkZXIgaXMgbm90IHNldC4nKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIElzIHRoZSBtYXggdXBsb2FkIHNpemUgdG9vIHNtYWxsIGluIHBocC5pbmk/DQoJCWlmICgkdXNlcmZpbGVbJ2Vycm9yJ10gJiYgKCR1c2VyZmlsZVsnZXJyb3InXSA9PSBVUExPQURfRVJSX0lOSV9TSVpFKSkNCgkJew0KCQkJc2VsZjo6c2V0RXJyb3IoVGV4dDo6XygnVGhlcmUgd2FzIGFuIGVycm9yIHVwbG9hZGluZyB0byB0aGUgc2VydmVyLicpIC4gJzxicj4nIC4gVGV4dDo6XygnWW91ciBmaWxlIHdhcyBpcyBsYXJnZXIgdGhhbiB0aGUgYWxsb3dlZCBzaXplLicpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgZGlmZmVyZW50IHByb2JsZW0gdXBsb2FkaW5nIHRoZSBmaWxlLg0KCQlpZiAoJHVzZXJmaWxlWydlcnJvciddIHx8ICR1c2VyZmlsZVsnc2l6ZSddIDwgMSkNCgkJew0KCQkJc2VsZjo6c2V0RXJyb3IoVGV4dDo6XygnVGhlcmUgd2FzIGFuIGVycm9yIHVwbG9hZGluZyB0byB0aGUgc2VydmVyLicpKTsNCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLy8gY2hlY2sgaWYgYSBwYXRoIHdhcyBwYXNzZWQgYW5kIGV4aXN0DQoJCWlmIChpc19zdHJpbmcoJHBhdGgpICYmIEZvbGRlcjo6Y3JlYXRlKCRwYXRoKSkNCgkJew0KCQkJLy8gc2V0IHRoZSBwYXRoDQoJCQkkdXNlcmZpbGVbJ3BhdGgnXSA9ICRwYXRoOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy8gZ2V0IHRoZSBKb29tbGEgY29uZmlnIGNsYXNzDQoJCQkkY29uZmlnID0gRmFjdG9yeTo6Z2V0Q29uZmlnKCk7DQoJCQkvLyBzZXQgdGhlIHBhdGgNCgkJCSR1c2VyZmlsZVsncGF0aCddID0gJGNvbmZpZy0+Z2V0KCd0bXBfcGF0aCcpOw0KCQl9DQoNCgkJLy8gc2V0IHRoZSByYW5kb20gcGFydCBvZiB0aGUgbmFtZQ0KCQkkdXNlcmZpbGVbJ3JhbmRvbSddID0gU3RyaW5nSGVscGVyOjpyYW5kb20oMTIpOw0KDQoJCS8vIHNldCB0aGUgZmlsZSBuYW1lDQoJCWlmIChlbXB0eSgkbmFtZSkpDQoJCXsNCgkJCS8vIHNldCB0aGUgZmlsZSBuYW1lDQoJCQkkdXNlcmZpbGVbJ2ZpbGVfbmFtZSddID0gJHVzZXJmaWxlWydyYW5kb20nXSAuICR1c2VyZmlsZVsnbmFtZSddOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy8gY2hlY2sgdGhhdCBoaXMgbmFtZSBoYXMgZmlsZSBmb3JtYXQNCgkJCWlmIChpc19zdHJpbmcoJG5hbWUpICYmIHN0cnBvcygkbmFtZSwgJy4nKSA9PT0gZmFsc2UpDQoJCQl7DQoJCQkJJG5hbWUgPSAkbmFtZSAuICcuJyAuIE1pbWVIZWxwZXI6OmV4dGVuc2lvbihudWxsLCAkdXNlcmZpbGVbJ3R5cGUnXSk7DQoJCQl9DQoJCQkkdXNlcmZpbGVbJ2ZpbGVfbmFtZSddID0gJG5hbWU7DQoJCX0NCg0KCQkvLyBzZXQgZnVsbCBwYXRoDQoJCSR1c2VyZmlsZVsnZnVsbF9wYXRoJ10gPSAkdXNlcmZpbGVbJ3BhdGgnXSAuICcvJyAuICR1c2VyZmlsZVsnZmlsZV9uYW1lJ107DQoNCgkJLy8gVXBsb2FkIHRoZSBmaWxlLg0KCQlpZiAoRmlsZTo6dXBsb2FkKCR1c2VyZmlsZVsndG1wX25hbWUnXSwgJHVzZXJmaWxlWydmdWxsX3BhdGgnXSwgc2VsZjo6JHVzZVN0cmVhbXMsIHNlbGY6OiRhbGxvd1Vuc2FmZSkpDQoJCXsNCgkJCS8vIENoZWNrIHRoYXQgdGhpcyBpcyBhIHZhbGlkIGZpbGUNCgkJCXJldHVybiBzZWxmOjpjaGVjaygkdXNlcmZpbGUsICR0eXBlKTsNCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogR2V0IHRoZSBlcnJvcnMNCgkgKg0KCSAqIEBwYXJhbSAgYm9vbCAgICAgICAgICR0b1N0cmluZyAgICAgIFRoZSBvcHRpb24gdG8gcmV0dXJuIGVycm9ycyBhcyBhIHN0cmluZw0KCSAqDQoJICogQHJldHVybiAgYXJyYXkNCgkgKiBAc2luY2UgIDMuMC4xMQ0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXJyb3IoJHRvU3RyaW5nID0gZmFsc2UpDQoJew0KCQlpZiAoJHRvU3RyaW5nKQ0KCQl7DQoJCQlyZXR1cm4gaW1wbG9kZSgnICcgLiBQSFBfRU9MLCBzZWxmOjokZXJyb3JzKTsNCgkJfQ0KCQlyZXR1cm4gc2VsZjo6JGVycm9yczsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBhIGZpbGUgYW5kIHZlcmlmaWVzIGl0IGFzIGEgYWxsb3dlZCBmaWxlIGZvcm1hdCBmaWxlDQoJICoNCgkgKiBAcGFyYW0gIGFycmF5ICAgICAgICAgJHVwbG9hZCAgICAgIFRoZSB1cGxvYWRlZCBkZXRhaWxzIGFycmF5DQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICR0eXBlICAgICAgICAgIFRoZSBmaWxlIHR5cGUNCgkgKg0KCSAqIEByZXR1cm4gIGFycmF5ICBvZiBlbGVtZW50cw0KCSAqDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBjaGVjayhhcnJheSAkdXBsb2FkLCBzdHJpbmcgJHR5cGUpDQoJew0KCQkvLyBEZWZhdWx0IGZvcm1hdHMNCgkJJGZvcm1hdHMgPSBNaW1lSGVscGVyOjpleHRlbnNpb25zKCR0eXBlKTsNCg0KCQkvLyBDbGVhbiB0aGUgcGF0aA0KCQkkdXBsb2FkX3BhdGggPSBQYXRoOjpjbGVhbigkdXBsb2FkWydmdWxsX3BhdGgnXSk7DQoNCgkJLy8gR2V0IGZpbGUgZXh0ZW5zaW9uL2Zvcm1hdA0KCQkkZm9ybWF0ID0gTWltZUhlbHBlcjo6ZXh0ZW5zaW9uKCR1cGxvYWRfcGF0aCk7DQoNCgkJLy8gTGVnYWwgZmlsZSBmb3JtYXRzDQoJCSRsZWdhbCA9IFtdOw0KDQoJCS8vIGNoZWNrIGlmIHRoZSBmaWxlIGZvcm1hdCBpcyBldmVuIGluIHRoZSBsaXN0DQoJCWlmIChpbl9hcnJheSgkZm9ybWF0LCAkZm9ybWF0cykpDQoJCXsNCgkJCS8vIGdldCBhbGxvd2VkIGZvcm1hdHMNCgkJCSRsZWdhbCA9IChhcnJheSkgSGVscGVyOjpnZXRQYXJhbXMoKS0+Z2V0KCR0eXBlIC4gJ19mb3JtYXRzJywgW10pOw0KCQl9DQoNCgkJLy8gY2hlY2sgdGhlIGV4dGVuc2lvbg0KCQlpZiAoIWluX2FycmF5KCRmb3JtYXQsICRsZWdhbCkpDQoJCXsNCgkJCS8vIENsZWFudXAgdGhlIGltcG9ydCBmaWxlDQoJCQlzZWxmOjpyZW1vdmUoJHVwbG9hZFsnZnVsbF9wYXRoJ10pOw0KDQoJCQlzZWxmOjpzZXRFcnJvcihUZXh0OjpfKCdVcGxvYWQgaXMgbm90IGEgdmFsaWQgdHlwZS4nKSk7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCXJldHVybiAkdXBsb2FkOw0KCX0NCg0KCS8qKg0KCSAqIENsZWFuIHVwIHRlbXBvcmFyeSB1cGxvYWRlZCBmaWxlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRmdWxsUGF0aCAgICBUaGUgZnVsbCBwYXRoIG9mIHRoZSB1cGxvYWRlZCBmaWxlDQoJICoNCgkgKiBAcmV0dXJuICBib29sZWFuICBUcnVlIG9uIHN1Y2Nlc3MNCgkgKg0KCSAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gcmVtb3ZlKCRmdWxsUGF0aCkNCgl7DQoJCS8vIElzIHRoZSBwYWNrYWdlIGZpbGUgYSB2YWxpZCBmaWxlPw0KCQlpZiAoaXNfZmlsZSgkZnVsbFBhdGgpKQ0KCQl7DQoJCQlGaWxlOjpkZWxldGUoJGZ1bGxQYXRoKTsNCgkJfQ0KCQllbHNlaWYgKGlzX2ZpbGUoUGF0aDo6Y2xlYW4oJGZ1bGxQYXRoKSkpDQoJCXsNCgkJCS8vIEl0IG1pZ2h0IGFsc28gYmUganVzdCBhIGJhc2UgZmlsZW5hbWUNCgkJCUZpbGU6OmRlbGV0ZShQYXRoOjpjbGVhbigkZnVsbFBhdGgpKTsNCgkJfQ0KCX0NCg0KCS8qKg0KCSAqIFNldCB0aGUgZXJyb3JzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgJG1lc3NhZ2UgICBUaGUgZXJyb3IgbWVzc2FnZQ0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBzZXRFcnJvcigkbWVzc2FnZSkNCgl7DQoJCWlmIChzZWxmOjokZW5xdWV1ZUVycm9yKQ0KCQl7DQoJCQlGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbigpLT5lbnF1ZXVlTWVzc2FnZSgkbWVzc2FnZSwgJ2Vycm9yJyk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlzZWxmOjokZXJyb3JzW10gPSAkbWVzc2FnZTsNCgkJfQ0KCX0NCg==', '{}', 'UploadHelper', 'VDM\\Joomla\\Utilities.UploadHelper', '1.0.0', '{}', 'Utilities UploadHelper', 'abstract class', '{\"use_selection0\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2022-05-16 13:20:50', '2022-09-20 10:10:51', 37, 9),
(26, '', 'Mime Helper\r\n\r\n@since 3.0.11', '', '', 'f11dc790-713e-4706-9a85-a318ed3ad56e', '', '', '', '{}', 'W0VYVEVSTkFMQ09ERT1odHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0xsZXdlbGx5bnZkbS83NGJlMzczMzU3ZTEzMWI4Nzc1YTc1ODJjM2RlNTA4Yi9yYXcvbWltZV90eXBlcy5waHBdDQoNCltFWFRFUk5BTENPREU9aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MbGV3ZWxseW52ZG0vNzRiZTM3MzM1N2UxMzFiODc3NWE3NTgyYzNkZTUwOGIvcmF3L2dldC5waHBdDQoNCltFWFRFUk5BTENPREU9aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MbGV3ZWxseW52ZG0vNzRiZTM3MzM1N2UxMzFiODc3NWE3NTgyYzNkZTUwOGIvcmF3L2V4dGVuc2lvbnMucGhwXQ==', '{}', 'MimeHelper', 'VDM\\Joomla\\Utilities.MimeHelper', '1.0.0', '{}', 'Utilities MimeHelper', 'abstract class', '{}', '', 1, '2022-05-16 14:27:38', '2022-09-20 09:51:01', 6, 9),
(27, '', 'Just to link powers to the power updater component', '', '', '8025e71c-8e21-44cb-b23e-dce2fb5a1ab5', '', '', '', '{\"load_selection0\":{\"load\":\"79d765b3-7319-4988-9730-446c7f347020\"},\"load_selection1\":{\"load\":\"d7600b43-771a-4747-9f5d-952765721799\"},\"load_selection2\":{\"load\":\"962b15d8-915f-4cd7-aea6-7cf82afdc20b\"},\"load_selection3\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"},\"load_selection4\":{\"load\":\"0e6235bf-08ef-428a-bc0a-93957587e936\"}}', '', '{}', 'Updater', 'VDM\\Power\\Updater', '1.0.0', '{}', 'Power Updater', 'class', '{}', '', 1, '2022-05-21 13:15:55', '2022-10-20 14:23:32', 7, 13),
(28, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoGetContents', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', 'ef011ee1-64f0-4048-b013-777473b727dd', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldHMgdGhlIG1ldGFkYXRhIGFuZCBjb250ZW50cyAoaWYgYSBmaWxlKSBvZiBhbiBlbnRyeSBpbiBhIHJlcG9zaXRvcnksIG9yIGEgbGlzdCBvZiBlbnRyaWVzIGlmIGEgZGlyDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICBSZXBvc2l0b3J5IG93bmVyLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHJlcG8gICAgICAgICBSZXBvc2l0b3J5IG5hbWUuDQoJICogQHBhcmFtICAgc3RyaW5nICAkZmlsZXBhdGggICAgUmVwb3NpdG9yeSBmaWxlIHBhdGguDQoJICoNCgkgKiBAcmV0dXJuICBvYmplY3QNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXQoJG93bmVyLCAkcmVwbywgJGZpbGVwYXRoKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHBhdGggPSAnL3JlcG9zLycgLiAkb3duZXIgLiAnLycgLiAkcmVwbyAuICcvY29udGVudHMvJyAuICRmaWxlcGF0aDsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg==', '{}', 'File', 'VDM\\Gitea\\Package.Repo.File', '1.0.0', '{}', 'Gitea Repo File', 'class', '{}', '', 1, '2022-05-21 13:40:09', '2022-09-20 10:10:28', 11, 4),
-(29, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoCreateWikiPage', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', 'c4a188de-ad78-4a6d-9d5b-01866846d701', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBwYWdlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICAgICAgICAgIFRoZSByZXBvc2l0b3J5IG93bmVyDQoJICogQHBhcmFtICAgc3RyaW5nICAkcmVwbyAgICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgbmFtZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHBhZ2VOYW1lICAgICAgIFRoZSBwYWdlIG5hbWUNCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXRoLg0KCQkkcGF0aCA9ICcvcmVwb3MvJyAuICRvd25lciAuICcvJyAuICRyZXBvIC4gJy93aWtpL3BhZ2UvJyAuICRwYWdlTmFtZTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBodG1sIHBhZ2UNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG93bmVyICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgb3duZXINCgkgKiBAcGFyYW0gICBzdHJpbmcgICRyZXBvICAgICAgICAgICAgICAgICBUaGUgcmVwb3NpdG9yeSBuYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAkcGFnZU5hbWUgICAgICAgVGhlIHBhZ2UgbmFtZQ0KCSAqDQoJICogQHJldHVybiAgb2JqZWN0DQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SHRtbChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBnZXQgdGhlIGdpdGVhIHdpa2kgcGFnZQ0KCQkkcGFnZSA9ICR0aGlzLT5nZXQoJG93bmVyLCAkcmVwbywgJHBhZ2VOYW1lKTsNCg0KCQlpZiAoZW1wdHkoJHBhZ2UtPmNvbnRlbnQpKQ0KCQl7DQoJCQl0aHJvdyBuZXcgXEV4Y2VwdGlvbignV2lraSBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC4nKTsNCgkJfQ0KDQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSRwYXRoID0gJy9tYXJrZG93bic7DQoNCgkJLy8gR2V0IGhlYWRlcnMNCgkJJGhlYWRlcnMgPSAkdGhpcy0+Y2xpZW50LT5nZXRPcHRpb24oJ2hlYWRlcnMnLCBhcnJheSgpKTsNCg0KCQkkaGVhZGVyc1snYWNjZXB0J10gPSAndGV4dC9odG1sJzsNCgkJJGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nOw0KDQoJCS8vIGJ1aWxkIHRoZSBwb3N0IGJvZHkNCgkJJGRhdGEgPSBbDQoJCQknQ29udGV4dCcgPT4gJ3N0cmluZycsDQoJCQknTW9kZScgPT4gJ3N0cmluZycsDQoJCQknVGV4dCcgPT4gJHBhZ2UtPmNvbnRlbnQsDQoJCQknV2lraScgPT4gdHJ1ZQ0KCQldOw0KDQoJCS8vIFBvc3QgdGhlIHJlcXVlc3QuDQoJCXJldHVybiAkdGhpcy0+cHJvY2Vzc1Jlc3BvbnNlKA0KCQkJJHRoaXMtPmNsaWVudC0+cG9zdCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpLCBqc29uX2VuY29kZSgkZGF0YSksICRoZWFkZXJzKQ0KCQkpOw0KCX0NCg==', '{}', 'Wiki', 'VDM\\Gitea\\Package.Repo.Wiki', '1.0.0', '{}', 'Gitea Repo Wiki', 'class', '{}', '', 1, '2022-07-09 10:21:53', '2022-09-20 10:10:25', 10, 4);
+(29, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoCreateWikiPage', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', 'c4a188de-ad78-4a6d-9d5b-01866846d701', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBwYWdlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICAgICAgICAgIFRoZSByZXBvc2l0b3J5IG93bmVyDQoJICogQHBhcmFtICAgc3RyaW5nICAkcmVwbyAgICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgbmFtZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHBhZ2VOYW1lICAgICAgIFRoZSBwYWdlIG5hbWUNCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXRoLg0KCQkkcGF0aCA9ICcvcmVwb3MvJyAuICRvd25lciAuICcvJyAuICRyZXBvIC4gJy93aWtpL3BhZ2UvJyAuICRwYWdlTmFtZTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBodG1sIHBhZ2UNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG93bmVyICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgb3duZXINCgkgKiBAcGFyYW0gICBzdHJpbmcgICRyZXBvICAgICAgICAgICAgICAgICBUaGUgcmVwb3NpdG9yeSBuYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAkcGFnZU5hbWUgICAgICAgVGhlIHBhZ2UgbmFtZQ0KCSAqDQoJICogQHJldHVybiAgb2JqZWN0DQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SHRtbChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBnZXQgdGhlIGdpdGVhIHdpa2kgcGFnZQ0KCQkkcGFnZSA9ICR0aGlzLT5nZXQoJG93bmVyLCAkcmVwbywgJHBhZ2VOYW1lKTsNCg0KCQlpZiAoZW1wdHkoJHBhZ2UtPmNvbnRlbnQpKQ0KCQl7DQoJCQl0aHJvdyBuZXcgXEV4Y2VwdGlvbignV2lraSBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC4nKTsNCgkJfQ0KDQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSRwYXRoID0gJy9tYXJrZG93bic7DQoNCgkJLy8gR2V0IGhlYWRlcnMNCgkJJGhlYWRlcnMgPSAkdGhpcy0+Y2xpZW50LT5nZXRPcHRpb24oJ2hlYWRlcnMnLCBbXSk7DQoNCgkJJGhlYWRlcnNbJ2FjY2VwdCddID0gJ3RleHQvaHRtbCc7DQoJCSRoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJzsNCg0KCQkvLyBidWlsZCB0aGUgcG9zdCBib2R5DQoJCSRkYXRhID0gWw0KCQkJJ0NvbnRleHQnID0+ICdzdHJpbmcnLA0KCQkJJ01vZGUnID0+ICdzdHJpbmcnLA0KCQkJJ1RleHQnID0+ICRwYWdlLT5jb250ZW50LA0KCQkJJ1dpa2knID0+IHRydWUNCgkJXTsNCg0KCQkvLyBQb3N0IHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPnBvc3QoJHRoaXMtPmZldGNoVXJsKCRwYXRoKSwganNvbl9lbmNvZGUoJGRhdGEpLCAkaGVhZGVycykNCgkJKTsNCgl9DQo=', '{}', 'Wiki', 'VDM\\Gitea\\Package.Repo.Wiki', '1.0.0', '{}', 'Gitea Repo Wiki', 'class', '{}', '', 1, '2022-07-09 10:21:53', '2022-09-20 10:10:25', 10, 4);
--
-- Dumping data for table `#__componentbuilder_admin_view`
diff --git a/admin/views/search/view.html.php b/admin/views/search/view.html.php
index 03bfe4719..0f787e3f3 100644
--- a/admin/views/search/view.html.php
+++ b/admin/views/search/view.html.php
@@ -137,7 +137,8 @@ class ComponentbuilderViewSearch extends HtmlView
// set the mode options
$options = [
1 => 'COM_COMPONENTBUILDER_SEARCH',
- 2 => 'COM_COMPONENTBUILDER_REPLACE'];
+ 2 => 'COM_COMPONENTBUILDER_REPLACE',
+ 0 => 'COM_COMPONENTBUILDER_CLEAR'];
// add to form
$xml = ComponentbuilderHelper::getFieldXML($attributes, $options);
if ($xml instanceof SimpleXMLElement)
diff --git a/componentbuilder.xml b/componentbuilder.xml
index a5029dbf1..b46954a83 100644
--- a/componentbuilder.xml
+++ b/componentbuilder.xml
@@ -1,7 +1,7 @@
COM_COMPONENTBUILDER
- 22nd January, 2023
+ 29th January, 2023
Llewellyn van der Merwe
joomla@vdm.io
https://dev.vdm.io
diff --git a/libraries/jcb_powers/VDM.Gitea/src/AbstractGiteaObject.php b/libraries/jcb_powers/VDM.Gitea/src/AbstractGiteaObject.php
index 3bfb54c54..5509676f9 100644
--- a/libraries/jcb_powers/VDM.Gitea/src/AbstractGiteaObject.php
+++ b/libraries/jcb_powers/VDM.Gitea/src/AbstractGiteaObject.php
@@ -83,7 +83,7 @@ abstract class AbstractGiteaObject
if ($this->options->get('access.token', false))
{
// Use oAuth authentication
- $headers = $this->client->getOption('headers', array());
+ $headers = $this->client->getOption('headers', []);
if (!isset($headers['Authorization']))
{
diff --git a/libraries/jcb_powers/VDM.Gitea/src/Package/Repo/Wiki.php b/libraries/jcb_powers/VDM.Gitea/src/Package/Repo/Wiki.php
index a34ac032d..c193ec01e 100644
--- a/libraries/jcb_powers/VDM.Gitea/src/Package/Repo/Wiki.php
+++ b/libraries/jcb_powers/VDM.Gitea/src/Package/Repo/Wiki.php
@@ -70,7 +70,7 @@ class Wiki extends AbstractPackage
$path = '/markdown';
// Get headers
- $headers = $this->client->getOption('headers', array());
+ $headers = $this->client->getOption('headers', []);
$headers['accept'] = 'text/html';
$headers['Content-Type'] = 'application/json';
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/MapperSingle.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/MapperSingle.php
new file mode 100644
index 000000000..a7c347a04
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Abstraction/MapperSingle.php
@@ -0,0 +1,122 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Abstraction;
+
+
+use VDM\Joomla\Componentbuilder\Interfaces\Mappersingleinterface;
+
+
+/**
+ * Compiler Mapper Single
+ *
+ * @since 3.2.0
+ */
+abstract class MapperSingle implements Mappersingleinterface
+{
+
+ /**
+ * The Content
+ *
+ * @var array
+ * @since 3.2.0
+ **/
+ public array $active = [];
+
+ /**
+ * Set content
+ *
+ * @param string $key The main string key
+ * @param mixed $value The values to set
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function set(string $key, $value)
+ {
+ $this->active[$this->key($key)] = $value;
+ }
+
+ /**
+ * Get content
+ *
+ * @param string $key The main string key
+ *
+ * @return mixed
+ * @since 3.2.0
+ */
+ public function get(string $key)
+ {
+ return $this->active[$this->key($key)] ?? null;
+ }
+
+ /**
+ * Does key exist
+ *
+ * @param string $key The main string key
+ *
+ * @return bool
+ * @since 3.2.0
+ */
+ public function exist(string $key): bool
+ {
+ if (isset($this->active[$this->key($key)]))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Add content
+ *
+ * @param string $key The main string key
+ * @param mixed $value The values to set
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function add(string $key, $value)
+ {
+ if (isset($this->active[$this->key($key)]))
+ {
+ $this->active[$this->key($key)] .= $value;
+ }
+ else
+ {
+ $this->active[$this->key($key)] = $value;
+ }
+ }
+
+ /**
+ * Remove content
+ *
+ * @param string $key The main string key
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function remove(string $key)
+ {
+ unset($this->active[$this->key($key)]);
+ }
+
+ /**
+ * Model the key
+ *
+ * @param string $key The key to model
+ *
+ * @return string
+ * @since 3.2.0
+ */
+ abstract protected function key(string $key): string;
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Data.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Data.php
index 46e17cc4c..f6c3a871b 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Data.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Data.php
@@ -86,6 +86,22 @@ class Data
*/
protected Dispenser $dispenser;
+ /**
+ * Compiler Customcode
+ *
+ * @var Customcode
+ * @since 3.2.0
+ */
+ protected Customcode $customcode;
+
+ /**
+ * Compiler Customcode in Gui
+ *
+ * @var Gui
+ * @since 3.2.0
+ **/
+ protected Gui $gui;
+
/**
* Compiler Field
*
@@ -223,8 +239,7 @@ class Data
?Filesfolders $filesFolders = null, ?Historycomponent $history = null, ?Whmcs $whmcs = null,
?Sqltweaking $sqltweaking = null, ?Adminviews $adminviews = null, ?Siteviews $siteviews = null,
?Customadminviews $customadminviews = null, ?Joomlamodules $modules = null,
- ?Joomlaplugins $plugins = null,
- ?\JDatabaseDriver $db = null)
+ ?Joomlaplugins $plugins = null, ?\JDatabaseDriver $db = null)
{
$this->config = $config ?: Compiler::_('Config');
$this->event = $event ?: Compiler::_('Event');
@@ -709,16 +724,11 @@ class Data
unset($component->bom);
// README
- if ($component->addreadme)
- {
- $component->readme = $this->customcode->update(
- base64_decode((string) $component->readme)
- );
- }
- else
- {
- $component->readme = '';
- }
+ $component->readme =
+ $component->addreadme ?
+ $this->customcode->update(
+ base64_decode((string) $component->readme)
+ ) : '';
// set lang now
$nowLang = $this->config->lang_target;
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php
index 5e7de1e38..59040d164 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Component/Placeholder.php
@@ -88,7 +88,7 @@ class Placeholder implements PlaceholderInterface
// load the db
$db = $this->db;
// reset bucket
- $bucket = array();
+ $bucket = [];
// Create a new query object.
$query = $db->getQuery(true);
$query->select($db->quoteName(array('a.target', 'a.value')));
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Config.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Config.php
index 9ce6b18cb..5dbef0974 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Config.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Config.php
@@ -475,6 +475,21 @@ class Config extends BaseConfig
return $this->compiler_path . '/default.txt';
}
+ /**
+ * get custom folder path
+ *
+ * @return string The custom folder path
+ * @since 3.2.0
+ */
+ protected function getCustomfolderpath(): string
+ {
+ // get the custom folder path
+ return $this->params->get(
+ 'custom_folder_path',
+ JPATH_COMPONENT_ADMINISTRATOR . '/custom'
+ );
+ }
+
/**
* get switch to add assets table fix
*
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode.php
index 82702e1d8..4a11e95d3 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode.php
@@ -193,7 +193,7 @@ class Customcode implements CustomcodeInterface
var_dump($string);
}
// the ids found in this content
- $bucket = array();
+ $bucket = [];
$found = GetHelper::allBetween(
$string, '[CUSTO' . 'MCODE=', ']'
);
@@ -268,7 +268,7 @@ class Customcode implements CustomcodeInterface
{
if (!isset($this->data[$id]['args']))
{
- $this->data[$id]['args'] = array();
+ $this->data[$id]['args'] = [];
}
// only load if not already loaded
if (!isset($this->data[$id]['args'][$key]))
@@ -289,7 +289,7 @@ class Customcode implements CustomcodeInterface
))
{
$this->data[$id]['args'][$key]
- = array();
+ = [];
// update the function values with the custom code key placeholders (this allow the use of [] + and , in the values)
$this->data[$id]['args'][$key][]
= $this->placeholder->update(
@@ -415,7 +415,7 @@ class Customcode implements CustomcodeInterface
$this->db->quoteName('a.from_line') . ' ASC'
); // <--- insure we always add code from top of file
// reset custom code
- $this->active = array();
+ $this->active = [];
}
$query->where($this->db->quoteName('a.published') . ' >= 1');
$this->db->setQuery($query);
@@ -502,7 +502,7 @@ class Customcode implements CustomcodeInterface
*/
protected function insert(array $ids, string $string, int $debug = 0): string
{
- $code = array();
+ $code = [];
// load the code
foreach ($ids as $id)
{
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Dispenser.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Dispenser.php
index 45a45c894..26c417661 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Dispenser.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Dispenser.php
@@ -117,7 +117,7 @@ class Dispenser implements DispenserInterface
* @since 3.2.0
*/
public function set(&$script, string $first, ?string $second = null, ?string $third = null,
- array $config = array(), bool $base64 = true, bool $dynamic = true, bool $add = false): bool
+ array $config = [], bool $base64 = true, bool $dynamic = true, bool $add = false): bool
{
// only load if we have a string
if (!StringHelper::check($script))
@@ -132,7 +132,7 @@ class Dispenser implements DispenserInterface
// check if the script first key is set
if ($second && !isset($this->hub[$first]))
{
- $this->hub[$first] = array();
+ $this->hub[$first] = [];
}
elseif ($add && !$second
&& !isset($this->hub[$first]))
@@ -143,7 +143,7 @@ class Dispenser implements DispenserInterface
if ($second && $third
&& !isset($this->hub[$first][$second]))
{
- $this->hub[$first][$second] = array();
+ $this->hub[$first][$second] = [];
}
elseif ($add && $second && !$third
&& !isset($this->hub[$first][$second]))
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/External.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/External.php
index 352f43fba..1b8acfc19 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/External.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/External.php
@@ -122,7 +122,7 @@ class External implements ExternalInterface
var_dump($string);
}
// target content
- $bucket = array();
+ $bucket = [];
$found = GetHelper::allBetween(
$string, '[EXTERNA' . 'LCODE=', ']'
);
@@ -342,17 +342,9 @@ class External implements ExternalInterface
);
}
}
+
// add to local bucket
- if (isset($this->code[$target_key]))
- {
- // update the placeholder with the external code string
- $bucket[$key] = $this->code[$target_key];
- }
- else
- {
- // remove the placeholder
- $bucket[$key] = '';
- }
+ $bucket[$key] = $this->code[$target_key] ?? '';
}
/**
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor.php
index 1dc3bb42d..73ed508ff 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor.php
@@ -328,15 +328,7 @@ class Extractor implements ExtractorInterface
// make sure we have the path correct (the script file is not in admin path for example)
// there may be more... will nead to keep our eye on this... since files could be moved during install
$file = str_replace('./', '', (string) $file); # TODO (windows path issues)
-
- if ($file !== 'script.php')
- {
- $path = $target . '/' . $file;
- }
- else
- {
- $path = $file;
- }
+ $path = $file !== 'script.php' ? $target . '/' . $file : $file;
// now we go line by line
foreach (new \SplFileObject($file) as $lineNumber => $lineContent)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor/Paths.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor/Paths.php
index 2a2196eca..69365547e 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor/Paths.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Extractor/Paths.php
@@ -130,7 +130,7 @@ class Paths
protected function load()
{
// set the local paths to search
- $local_paths = array();
+ $local_paths = [];
// admin path
$local_paths['admin'] = JPATH_ADMINISTRATOR . '/components/com_'
@@ -213,15 +213,8 @@ class Paths
{
$joomla_modules = array_filter(
array_values($addjoomla_modules),
- function ($array) {
- // only load the modules whose target association call for it
- if (!isset($array['target']) || $array['target'] != 2)
- {
- return true;
- }
-
- return false;
- }
+ // only load the modules whose target association call for it
+ fn($array): bool => !isset($array['target']) || $array['target'] != 2
);
// if we have values we return IDs
if (ArrayHelper::check($joomla_modules))
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Gui.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Gui.php
index f240ea365..d827bd49b 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Gui.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Gui.php
@@ -183,7 +183,7 @@ class Gui implements GuiInterface
// get file content
$file_conent = FileHelper::getContent($file);
- $guiCode = array();
+ $guiCode = [];
// we add a new search for the GUI CODE Blocks
$guiCode[] = GetHelper::allBetween(
$file_conent, '/***[JCB' . 'GUI<>', '/***[/JCBGUI' . '$$$$]***/'
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Hash.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Hash.php
index 4d90649ef..2af2ae1d2 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Hash.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/Hash.php
@@ -62,7 +62,7 @@ class Hash
$values = GetHelper::allBetween(
$script, 'HASH' . 'STRING((((', '))))'
);
- $locker = array();
+ $locker = [];
// convert them
foreach ($values as $value)
{
@@ -80,7 +80,7 @@ class Hash
$values = GetHelper::allBetween(
$script, 'HASH' . 'FILE((((', '))))'
);
- $locker = array();
+ $locker = [];
// convert them
foreach ($values as $path)
{
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/LockBase.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/LockBase.php
index c7a32837a..7db3a4bcc 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/LockBase.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customcode/LockBase.php
@@ -62,7 +62,7 @@ class LockBase implements LockBaseInterface
$values = GetHelper::allBetween(
$script, 'LOCK'.'BASE64((((', '))))'
);
- $locker = array();
+ $locker = [];
// convert them
foreach ($values as $value)
{
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customview/Data.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customview/Data.php
index 3e561dce1..709581696 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customview/Data.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Customview/Data.php
@@ -294,15 +294,7 @@ class Data
$main_get = $this->dynamic->get(
array($item->main_get), $item->code, $item->context
);
-
- if (ArrayHelper::check($main_get))
- {
- $item->main_get = $main_get[0];
- }
- else
- {
- $item->main_get = null;
- }
+ $item->main_get = ArrayHelper::check($main_get) ? $main_get[0] : null;
// set the custom_get data
$item->custom_get = (isset($item->custom_get)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php
index dc6a9c589..d6273b893 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Factory.php
@@ -34,6 +34,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Service\Extension;
use VDM\Joomla\Componentbuilder\Compiler\Service\Field;
use VDM\Joomla\Componentbuilder\Compiler\Service\Joomlamodule;
use VDM\Joomla\Componentbuilder\Compiler\Service\Joomlaplugin;
+use VDM\Joomla\Componentbuilder\Compiler\Service\Utilities;
use VDM\Joomla\Componentbuilder\Interfaces\FactoryInterface;
@@ -136,7 +137,8 @@ abstract class Factory implements FactoryInterface
->registerServiceProvider(new Extension())
->registerServiceProvider(new Field())
->registerServiceProvider(new Joomlamodule())
- ->registerServiceProvider(new Joomlaplugin());
+ ->registerServiceProvider(new Joomlaplugin())
+ ->registerServiceProvider(new Utilities());
}
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Interfaces/Customcode/DispenserInterface.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Interfaces/Customcode/DispenserInterface.php
index d5366d95e..5336ddae8 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Interfaces/Customcode/DispenserInterface.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Interfaces/Customcode/DispenserInterface.php
@@ -38,7 +38,7 @@ interface DispenserInterface
* @since 3.2.0
*/
public function set(&$script, string $first, ?string $second = null, ?string $third = null,
- array $config = array(), bool $base64 = true, bool $dynamic = true, bool $add = false): bool;
+ array $config = [], bool $base64 = true, bool $dynamic = true, bool $add = false): bool;
/**
* Get the script from the customcode dispenser
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/JoomlaThree/History.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/JoomlaThree/History.php
index 4f0922cde..2cfe3f84e 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/JoomlaThree/History.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/JoomlaThree/History.php
@@ -170,7 +170,7 @@ class History implements HistoryInterface
}
else
{
- $version_note = array('component' => array());
+ $version_note = array('component' => []);
}
// set watch
switch ($action)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Builder.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Builder.php
new file mode 100644
index 000000000..68f63106f
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Builder.php
@@ -0,0 +1,883 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Joomlamodule;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Joomlamodule\Data as Module;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Registry;
+use VDM\Joomla\Componentbuilder\Compiler\Customcode\Dispenser;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Line;
+use VDM\Joomla\Utilities\ArrayHelper;
+use VDM\Joomla\Utilities\ObjectHelper;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Utilities\FileHelper;
+
+
+/**
+ * Joomla Module Builder Class
+ *
+ * @since 3.2.0
+ */
+class Builder
+{
+ /**
+ * Compiler Joomla Module Data Class
+ *
+ * @var Module
+ * @since 3.2.0
+ */
+ protected Module $module;
+
+ /**
+ * Compiler Component
+ *
+ * @var Component
+ * @since 3.2.0
+ **/
+ protected Component $component;
+
+ /**
+ * Compiler Config
+ *
+ * @var Config
+ * @since 3.2.0
+ */
+ protected Config $config;
+
+ /**
+ * The compiler registry
+ *
+ * @var Registry
+ * @since 3.2.0
+ */
+ protected Registry $registry;
+
+ /**
+ * Compiler Customcode Dispenser
+ *
+ * @var Dispenser
+ * @since 3.2.0
+ */
+ protected Dispenser $dispenser;
+
+ /**
+ * Compiler Event
+ *
+ * @var EventInterface
+ * @since 3.2.0
+ */
+ protected EventInterface $event;
+
+ /**
+ * Compiler Counter
+ *
+ * @var Counter
+ * @since 3.2.0
+ */
+ protected Counter $counter;
+
+ /**
+ * Compiler Utilities Folder
+ *
+ * @var Folder
+ * @since 3.2.0
+ */
+ protected Folder $folder;
+
+ /**
+ * Compiler Utilities File
+ *
+ * @var File
+ * @since 3.2.0
+ */
+ protected File $file;
+
+ /**
+ * Compiler Utilities Files
+ *
+ * @var Files
+ * @since 3.2.0
+ */
+ protected Files $files;
+
+ /**
+ * Constructor
+ *
+ * @param Module|null $module The compiler Joomla module data object.
+ * @param Component|null $component The component class.
+ * @param Config|null $config The compiler config object.
+ * @param Registry|null $registry The compiler registry object.
+ * @param Dispenser|null $dispenser The compiler customcode dispenser object.
+ * @param EventInterface|null $event The compiler event api object.
+ * @param Counter|null $counter The compiler counter object.
+ * @param Folder|null $folder The compiler folder object.
+ * @param File|null $file The compiler file object.
+ * @param Files|null $files The compiler files object.
+ *
+ * @since 3.2.0
+ */
+ public function __construct(?Module $module = null, ?Component $component = null,
+ ?Config $config = null, ?Registry $registry = null,
+ ?Dispenser $dispenser = null, ?EventInterface $event = null,
+ ?Counter $counter = null, ?Folder $folder = null,
+ ?File $file = null, ?Files $files = null)
+ {
+ $this->module = $module ?: Compiler::_('Joomlamodule.Data');
+ $this->component = $component ?: Compiler::_('Component');
+ $this->config = $config ?: Compiler::_('Config');
+ $this->registry = $registry ?: Compiler::_('Registry');
+ $this->dispenser = $dispenser ?: Compiler::_('Customcode.Dispenser');
+ $this->event = $event ?: Compiler::_('Event');
+ $this->counter = $counter ?? Compiler::_('Utilities.Counter');
+ $this->folder = $folder ?? Compiler::_('Utilities.Folder');
+ $this->file = $file ?? Compiler::_('Utilities.File');
+ $this->files = $files ?? Compiler::_('Utilities.Files');
+ }
+
+ /**
+ * Build the Modules files, folders, url's and config
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function run()
+ {
+ if ($this->module->exists())
+ {
+ // for plugin event TODO change event api signatures
+ $component_context = $this->config->component_context;
+ $modules = $this->module->get();
+ // Trigger Event: jcb_ce_onBeforeSetModules
+ $this->event->trigger(
+ 'jcb_ce_onBeforeBuildModules',
+ array(&$component_context, &$modules)
+ );
+
+ foreach ($modules as $module)
+ {
+ if (ObjectHelper::check($module)
+ && isset($module->folder_name)
+ && StringHelper::check(
+ $module->folder_name
+ ))
+ {
+ // module path
+ $module->folder_path = $this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
+ . $module->folder_name;
+
+ // set the module paths
+ $this->registry->set('dynamic_paths.' . $module->key, $module->folder_path);
+
+ // make sure there is no old build
+ $this->folder->remove($module->folder_path);
+
+ // creat the main module folder
+ $this->folder->create($module->folder_path);
+
+ // set main mod file
+ $fileDetails = array('path' => $module->folder_path . '/'
+ . $module->file_name . '.php',
+ 'name' => $module->file_name . '.php',
+ 'zip' => $module->file_name . '.php');
+ $this->file->write(
+ $fileDetails['path'],
+ 'files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // set custom_get
+ if ($module->custom_get)
+ {
+ $fileDetails = array(
+ 'path' => $module->folder_path . '/data.php',
+ 'name' => 'data.php',
+ 'zip' => 'data.php'
+ );
+ $this->file->write(
+ $fileDetails['path'],
+ 'official_name . ' Data'
+ . PHP_EOL .
+ ' */' . PHP_EOL .
+ "class " . $module->class_data_name
+ . ' extends \JObject' . PHP_EOL .
+ "{" . Placefix::_h('DYNAMICGETS') . "}"
+ . PHP_EOL
+ );
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // set helper file
+ if ($module->add_class_helper >= 1)
+ {
+ $fileDetails = array('path' => $module->folder_path
+ . '/helper.php',
+ 'name' => 'helper.php',
+ 'zip' => 'helper.php');
+ $this->file->write(
+ $fileDetails['path'],
+ 'files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // set main xml file
+ $fileDetails = array('path' => $module->folder_path . '/'
+ . $module->file_name . '.xml',
+ 'name' => $module->file_name . '.xml',
+ 'zip' => $module->file_name . '.xml');
+ $this->file->write(
+ $fileDetails['path'],
+ $this->getXML($module)
+ );
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // set tmpl folder
+ $this->folder->create($module->folder_path . '/tmpl');
+
+ // set default file
+ $fileDetails = array('path' => $module->folder_path
+ . '/tmpl/default.php',
+ 'name' => 'default.php',
+ 'zip' => 'tmpl/default.php');
+ $this->file->write(
+ $fileDetails['path'],
+ 'files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // set install script if needed
+ if ($module->add_install_script)
+ {
+ $fileDetails = array('path' => $module->folder_path
+ . '/script.php',
+ 'name' => 'script.php',
+ 'zip' => 'script.php');
+ $this->file->write(
+ $fileDetails['path'],
+ 'files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // set readme if found
+ if ($module->addreadme)
+ {
+ $fileDetails = array('path' => $module->folder_path
+ . '/README.md',
+ 'name' => 'README.md',
+ 'zip' => 'README.md');
+ $this->file->write($fileDetails['path'], $module->readme);
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // set the folders target path
+ $target_path = '';
+ if ($module->target_client === 'administrator')
+ {
+ $target_path = '/administrator';
+ }
+
+ // check if we have custom fields needed for scripts
+ $module->add_scripts_field = false;
+ $field_script_bucket = [];
+
+ // add any css from the fields
+ if (($css = $this->dispenser->get(
+ 'css_view', $module->key
+ )) !== null
+ && StringHelper::check($css))
+ {
+ // make sure this script does not have PHP
+ if (strpos((string) $css, 'add_scripts_field = true;
+
+ // create the css folder
+ $this->folder->create($module->folder_path . '/css');
+
+ // add the CSS file
+ $fileDetails = array('path' => $module->folder_path
+ . '/css/mod_admin.css',
+ 'name' => 'mod_admin.css',
+ 'zip' => 'mod_admin.css');
+ $this->file->write(
+ $fileDetails['path'],
+ Placefix::_h('BOM') . PHP_EOL
+ . PHP_EOL . $css
+ );
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // add the field script
+ $field_script_bucket[] = Indent::_(2) . "//"
+ . Line::_(__Line__, __Class__) . " Custom CSS";
+ $field_script_bucket[] = Indent::_(2)
+ . "\$document->addStyleSheet('" . $target_path
+ . "/modules/" . $module->folder_name
+ . "/css/mod_admin.css', ['version' => 'auto', 'relative' => true]);";
+ }
+ }
+
+ // add any JavaScript from the fields
+ if (($javascript = $this->dispenser->get(
+ 'view_footer', $module->key
+ )) !== null
+ && StringHelper::check($javascript))
+ {
+ // make sure this script does not have PHP
+ if (strpos((string) $javascript, 'add_scripts_field = true;
+
+ // add the JavaScript file
+ $this->folder->create($module->folder_path . '/js');
+
+ // add the CSS file
+ $fileDetails = array('path' => $module->folder_path
+ . '/js/mod_admin.js',
+ 'name' => 'mod_admin.js',
+ 'zip' => 'mod_admin.js');
+ $this->file->write(
+ $fileDetails['path'],
+ Placefix::_h('BOM') . PHP_EOL
+ . PHP_EOL . $javascript
+ );
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // add the field script
+ $field_script_bucket[] = Indent::_(2) . "//"
+ . Line::_(__Line__, __Class__) . " Custom JS";
+ $field_script_bucket[] = Indent::_(2)
+ . "\$document->addScript('" . $target_path
+ . "/modules/" . $module->folder_name
+ . "/js/mod_admin.js', ['version' => 'auto', 'relative' => true]);";
+ }
+ }
+
+ // set fields folders if needed
+ if ($module->add_scripts_field
+ || (isset($module->fields_rules_paths)
+ && $module->fields_rules_paths == 2))
+ {
+ // create fields folder
+ $this->folder->create($module->folder_path . '/fields');
+
+ // add the custom script field
+ if ($module->add_scripts_field)
+ {
+ $fileDetails = [
+ 'path' => $module->folder_path
+ . '/fields/modadminvvvvvvvdm.php',
+ 'name' => 'modadminvvvvvvvdm.php',
+ 'zip' => 'modadminvvvvvvvdm.php'
+ ];
+ $this->file->write(
+ $fileDetails['path'],
+ $this->getCustomScriptField(
+ $field_script_bucket
+ )
+ );
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+
+ // set rules folders if needed
+ if (isset($module->fields_rules_paths)
+ && $module->fields_rules_paths == 2)
+ {
+ // create rules folder
+ $this->folder->create($module->folder_path . '/rules');
+ }
+
+ // set forms folder if needed
+ if (isset($module->form_files)
+ && ArrayHelper::check(
+ $module->form_files
+ ))
+ {
+ // create forms folder
+ $this->folder->create($module->folder_path . '/forms');
+
+ // set the template files
+ foreach ($module->form_files as $file => $fields)
+ {
+ // set file details
+ $fileDetails = array('path' => $module->folder_path
+ . '/forms/' . $file . '.xml',
+ 'name' => $file . '.xml',
+ 'zip' => 'forms/' . $file
+ . '.xml');
+
+ // build basic XML
+ $xml = '';
+ $xml .= PHP_EOL . '';
+
+ // search if we must add the component path
+ $add_component_path = false;
+ foreach ($fields as $field_name => $fieldsets)
+ {
+ if (!$add_component_path)
+ {
+ foreach ($fieldsets as $fieldset => $field)
+ {
+ if (!$add_component_path
+ && isset(
+ $module->fieldsets_paths[$file
+ . $field_name . $fieldset]
+ )
+ && $module->fieldsets_paths[$file
+ . $field_name . $fieldset] == 1)
+ {
+ $add_component_path = true;
+ }
+ }
+ }
+ }
+
+ // only add if part of the component field types path is required
+ if ($add_component_path)
+ {
+ $xml .= PHP_EOL . '';
+
+ // add xml to file
+ $this->file->write($fileDetails['path'], $xml);
+ $this->files->appendArray($module->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+
+ // set SQL stuff if needed
+ if ($module->add_sql || $module->add_sql_uninstall)
+ {
+ // create SQL folder
+ $this->folder->create($module->folder_path . '/sql');
+
+ // create mysql folder
+ $this->folder->create(
+ $module->folder_path . '/sql/mysql'
+ );
+
+ // now set the install file
+ if ($module->add_sql)
+ {
+ $this->file->write(
+ $module->folder_path . '/sql/mysql/install.sql',
+ $module->sql
+ );
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // now set the uninstall file
+ if ($module->add_sql_uninstall)
+ {
+ $this->file->write(
+ $module->folder_path
+ . '/sql/mysql/uninstall.sql',
+ $module->sql_uninstall
+ );
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+
+ // creat the language folder
+ $this->folder->create($module->folder_path . '/language');
+ // also create the lang tag folder
+ $this->folder->create(
+ $module->folder_path . '/language/' . $this->config->get('lang_tag', 'en-GB')
+ );
+
+ // check if this lib has files
+ if (isset($module->files)
+ && ArrayHelper::check($module->files))
+ {
+ // add to component files
+ foreach ($module->files as $file)
+ {
+ // set the pathfinder
+ $file['target_type'] = $module->target_type;
+ $file['target_id'] = $module->id;
+ $this->component->appendArray('files', $file);
+ }
+ }
+
+ // check if this lib has folders
+ if (isset($module->folders)
+ && ArrayHelper::check($module->folders))
+ {
+ // add to component folders
+ foreach ($module->folders as $folder)
+ {
+ // set the pathfinder
+ $folder['target_type'] = $module->target_type;
+ $folder['target_id'] = $module->id;
+ $this->component->appendArray('folders', $folder);
+ }
+ }
+
+ // check if this module has urls
+ if (isset($module->urls)
+ && ArrayHelper::check($module->urls))
+ {
+ // add to component urls
+ foreach ($module->urls as $n => &$url)
+ {
+ // should we add the local folder
+ if (isset($url['type']) && $url['type'] > 1
+ && isset($url['url'])
+ && StringHelper::check(
+ $url['url']
+ ))
+ {
+ // set file name
+ $fileName = basename((string) $url['url']);
+
+ // get the file contents
+ $data = FileHelper::getContent(
+ $url['url']
+ );
+
+ // build sub path
+ if (strpos($fileName, '.js') !== false)
+ {
+ $path = '/js';
+ }
+ elseif (strpos($fileName, '.css') !== false)
+ {
+ $path = '/css';
+ }
+ else
+ {
+ $path = '';
+ }
+
+ // create sub media path if not set
+ $this->folder->create(
+ $module->folder_path . $path
+ );
+
+ // set the path to module file
+ $url['path'] = $module->folder_path . $path
+ . '/' . $fileName; // we need this for later
+
+ // write data to path
+ $this->file->write($url['path'], $data);
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * get the module xml template
+ *
+ * @param object $module The module object
+ *
+ * @return string
+ * @since 3.2.0
+ */
+ protected function getXML(object &$module): string
+ {
+ $xml = '';
+ $xml .= PHP_EOL . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . $module->lang_prefix
+ . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('BUILDDATE') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHOR') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHOREMAIL') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHORWEBSITE') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('COPYRIGHT') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('LICENSE') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . $module->module_version
+ . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . $module->lang_prefix
+ . '_XML_DESCRIPTION';
+ $xml .= Placefix::_h('MAINXML');
+ $xml .= PHP_EOL . '';
+
+ return $xml;
+ }
+
+ /**
+ * get the module admin custom script field
+ *
+ * @param array $fieldScriptBucket The field
+ *
+ * @return string
+ * @since 3.2.0
+ *
+ */
+ protected function getCustomScriptField(array $fieldScriptBucket): string
+ {
+ $form_field_class = [];
+ $form_field_class[] = Placefix::_h('BOM') . PHP_EOL;
+ $form_field_class[] = "//" . Line::_(__Line__, __Class__)
+ . " No direct access to this file";
+ $form_field_class[] = "defined('_JEXEC') or die('Restricted access');";
+ $form_field_class[] = PHP_EOL . "use Joomla\CMS\Form\FormField;";
+ $form_field_class[] = "use Joomla\CMS\Factory;";
+ $form_field_class[] = PHP_EOL
+ . "class JFormFieldModadminvvvvvvvdm extends FormField";
+ $form_field_class[] = "{";
+ $form_field_class[] = Indent::_(1)
+ . "protected \$type = 'modadminvvvvvvvdm';";
+ $form_field_class[] = PHP_EOL . Indent::_(1)
+ . "protected function getLabel()";
+ $form_field_class[] = Indent::_(1) . "{";
+ $form_field_class[] = Indent::_(2) . "return;";
+ $form_field_class[] = Indent::_(1) . "}";
+ $form_field_class[] = PHP_EOL . Indent::_(1)
+ . "protected function getInput()";
+ $form_field_class[] = Indent::_(1) . "{";
+ $form_field_class[] = Indent::_(2) . "//" . Line::_(__Line__, __Class__)
+ . " Get the document";
+ $form_field_class[] = Indent::_(2)
+ . "\$document = Factory::getDocument();";
+ $form_field_class[] = implode(PHP_EOL, $fieldScriptBucket);
+ $form_field_class[] = Indent::_(2) . "return; // noting for now :)";
+ $form_field_class[] = Indent::_(1) . "}";
+ $form_field_class[] = "}";
+
+ return implode(PHP_EOL, $form_field_class);
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Data.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Data.php
index 236a1d252..ccee1a8d5 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Data.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlamodule/Data.php
@@ -744,17 +744,17 @@ class Data
if (!isset($module->form_files[$form['file']]))
{
$module->form_files[$form['file']]
- = array();
+ = [];
}
if (!isset($module->form_files[$form['file']][$form['fields_name']]))
{
$module->form_files[$form['file']][$form['fields_name']]
- = array();
+ = [];
}
if (!isset($module->form_files[$form['file']][$form['fields_name']][$form['fieldset']]))
{
$module->form_files[$form['file']][$form['fields_name']][$form['fieldset']]
- = array();
+ = [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)
@@ -776,12 +776,12 @@ class Data
if (!isset($module->config_fields[$form['fields_name']]))
{
$module->config_fields[$form['fields_name']]
- = array();
+ = [];
}
if (!isset($module->config_fields[$form['fields_name']][$form['fieldset']]))
{
$module->config_fields[$form['fields_name']][$form['fieldset']]
- = array();
+ = [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Builder.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Builder.php
new file mode 100644
index 000000000..eaa1d5858
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Builder.php
@@ -0,0 +1,626 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin\Data as Plugin;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Registry;
+use VDM\Joomla\Componentbuilder\Compiler\Customcode\Dispenser;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Line;
+use VDM\Joomla\Utilities\ArrayHelper;
+use VDM\Joomla\Utilities\ObjectHelper;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Utilities\FileHelper;
+
+
+/**
+ * Joomla Plugin Builder Class
+ *
+ * @since 3.2.0
+ */
+class Builder
+{
+ /**
+ * Compiler Joomla Plugin Data Class
+ *
+ * @var Plugin
+ * @since 3.2.0
+ */
+ protected Plugin $plugin;
+
+ /**
+ * Compiler Component
+ *
+ * @var Component
+ * @since 3.2.0
+ **/
+ protected Component $component;
+
+ /**
+ * Compiler Config
+ *
+ * @var Config
+ * @since 3.2.0
+ */
+ protected Config $config;
+
+ /**
+ * The compiler registry
+ *
+ * @var Registry
+ * @since 3.2.0
+ */
+ protected Registry $registry;
+
+ /**
+ * Compiler Customcode Dispenser
+ *
+ * @var Dispenser
+ * @since 3.2.0
+ */
+ protected Dispenser $dispenser;
+
+ /**
+ * Compiler Event
+ *
+ * @var EventInterface
+ * @since 3.2.0
+ */
+ protected EventInterface $event;
+
+ /**
+ * Compiler Counter
+ *
+ * @var Counter
+ * @since 3.2.0
+ */
+ protected Counter $counter;
+
+ /**
+ * Compiler Utilities Folder
+ *
+ * @var Folder
+ * @since 3.2.0
+ */
+ protected Folder $folder;
+
+ /**
+ * Compiler Utilities File
+ *
+ * @var File
+ * @since 3.2.0
+ */
+ protected File $file;
+
+ /**
+ * Compiler Utilities Files
+ *
+ * @var Files
+ * @since 3.2.0
+ */
+ protected Files $files;
+
+ /**
+ * Constructor
+ *
+ * @param Plugin|null $plugin The compiler Joomla plugin data object.
+ * @param Component|null $component The component class.
+ * @param Config|null $config The compiler config object.
+ * @param Registry|null $registry The compiler registry object.
+ * @param Dispenser|null $dispenser The compiler customcode dispenser object.
+ * @param EventInterface|null $event The compiler event api object.
+ * @param Counter|null $counter The compiler counter object.
+ * @param Folder|null $folder The compiler folder object.
+ * @param File|null $file The compiler file object.
+ * @param Files|null $files The compiler files object.
+ *
+ * @since 3.2.0
+ */
+ public function __construct(?Plugin $plugin = null, ?Component $component = null,
+ ?Config $config = null, ?Registry $registry = null,
+ ?Dispenser $dispenser = null, ?EventInterface $event = null,
+ ?Counter $counter = null, ?Folder $folder = null,
+ ?File $file = null, ?Files $files = null)
+ {
+ $this->plugin = $plugin ?: Compiler::_('Joomlaplugin.Data');
+ $this->component = $component ?: Compiler::_('Component');
+ $this->config = $config ?: Compiler::_('Config');
+ $this->registry = $registry ?: Compiler::_('Registry');
+ $this->dispenser = $dispenser ?: Compiler::_('Customcode.Dispenser');
+ $this->event = $event ?: Compiler::_('Event');
+ $this->counter = $counter ?? Compiler::_('Utilities.Counter');
+ $this->folder = $folder ?? Compiler::_('Utilities.Folder');
+ $this->file = $file ?? Compiler::_('Utilities.File');
+ $this->files = $files ?? Compiler::_('Utilities.Files');
+ }
+
+ /**
+ * Build the Plugins files, folders, url's and config
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function run()
+ {
+ if ($this->plugin->exists())
+ {
+ // for plugin event TODO change event api signatures
+ $component_context = $this->config->component_context;
+ $plugins = $this->plugin->get();
+ // Trigger Event: jcb_ce_onBeforeSetPlugins
+ $this->event->trigger(
+ 'jcb_ce_onBeforeBuildPlugins',
+ array(&$component_context, &$plugins)
+ );
+ foreach ($plugins as $plugin)
+ {
+ if (ObjectHelper::check($plugin)
+ && isset($plugin->folder_name)
+ && StringHelper::check(
+ $plugin->folder_name
+ ))
+ {
+ // plugin path
+ $plugin->folder_path = $this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
+ . $plugin->folder_name;
+
+ // set the plugin paths
+ $this->registry->set('dynamic_paths.' . $plugin->key, $plugin->folder_path);
+
+ // make sure there is no old build
+ $this->folder->remove($plugin->folder_path);
+
+ // creat the main component folder
+ $this->folder->create($plugin->folder_path);
+
+ // set main class file
+ $fileDetails = array('path' => $plugin->folder_path . '/'
+ . $plugin->file_name . '.php',
+ 'name' => $plugin->file_name . '.php',
+ 'zip' => $plugin->file_name . '.php');
+ $this->file->write(
+ $fileDetails['path'],
+ 'files->appendArray($plugin->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // set main xml file
+ $fileDetails = array('path' => $plugin->folder_path . '/'
+ . $plugin->file_name . '.xml',
+ 'name' => $plugin->file_name . '.xml',
+ 'zip' => $plugin->file_name . '.xml');
+ $this->file->write(
+ $fileDetails['path'],
+ $this->getXML($plugin)
+ );
+ $this->files->appendArray($plugin->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // set install script if needed
+ if ($plugin->add_install_script)
+ {
+ $fileDetails = array('path' => $plugin->folder_path
+ . '/script.php',
+ 'name' => 'script.php',
+ 'zip' => 'script.php');
+ $this->file->write(
+ $fileDetails['path'],
+ 'files->appendArray($plugin->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // set readme if found
+ if ($plugin->addreadme)
+ {
+ $fileDetails = array('path' => $plugin->folder_path
+ . '/README.md',
+ 'name' => 'README.md',
+ 'zip' => 'README.md');
+ $this->file->write($fileDetails['path'], $plugin->readme);
+ $this->files->appendArray($plugin->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // set fields & rules folders if needed
+ if (isset($plugin->fields_rules_paths)
+ && $plugin->fields_rules_paths == 2)
+ {
+ // create fields folder
+ $this->folder->create($plugin->folder_path . '/fields');
+
+ // create rules folder
+ $this->folder->create($plugin->folder_path . '/rules');
+ }
+
+ // set forms folder if needed
+ if (isset($plugin->form_files)
+ && ArrayHelper::check(
+ $plugin->form_files
+ ))
+ {
+ // create forms folder
+ $this->folder->create($plugin->folder_path . '/forms');
+
+ // set the template files
+ foreach ($plugin->form_files as $file => $fields)
+ {
+ // set file details
+ $fileDetails = array('path' => $plugin->folder_path
+ . '/forms/' . $file . '.xml',
+ 'name' => $file . '.xml',
+ 'zip' => 'forms/' . $file
+ . '.xml');
+
+ // build basic XML
+ $xml = '';
+ $xml .= PHP_EOL . '';
+
+ // search if we must add the component path
+ $add_component_path = false;
+ foreach ($fields as $field_name => $fieldsets)
+ {
+ if (!$add_component_path)
+ {
+ foreach ($fieldsets as $fieldset => $field)
+ {
+ if (!$add_component_path
+ && isset(
+ $plugin->fieldsets_paths[$file
+ . $field_name . $fieldset]
+ )
+ && $plugin->fieldsets_paths[$file
+ . $field_name . $fieldset] == 1)
+ {
+ $add_component_path = true;
+ }
+ }
+ }
+ }
+
+ // only add if part of the component field types path is required
+ if ($add_component_path)
+ {
+ $xml .= PHP_EOL . '';
+
+ // add xml to file
+ $this->file->write($fileDetails['path'], $xml);
+ $this->files->appendArray($plugin->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+
+ // set SQL stuff if needed
+ if ($plugin->add_sql || $plugin->add_sql_uninstall)
+ {
+ // create SQL folder
+ $this->folder->create($plugin->folder_path . '/sql');
+
+ // create mysql folder
+ $this->folder->create(
+ $plugin->folder_path . '/sql/mysql'
+ );
+
+ // now set the install file
+ if ($plugin->add_sql)
+ {
+ $this->file->write(
+ $plugin->folder_path . '/sql/mysql/install.sql',
+ $plugin->sql
+ );
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ // now set the uninstall file
+ if ($plugin->add_sql_uninstall)
+ {
+ $this->file->write(
+ $plugin->folder_path
+ . '/sql/mysql/uninstall.sql',
+ $plugin->sql_uninstall
+ );
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+
+ // creat the language folder path
+ $this->folder->create($plugin->folder_path . '/language');
+
+ // also creat the lang tag folder path
+ $this->folder->create(
+ $plugin->folder_path . '/language/' . $this->config->get('lang_tag', 'en-GB')
+ );
+
+ // check if this lib has files
+ if (isset($plugin->files)
+ && ArrayHelper::check($plugin->files))
+ {
+ // add to component files
+ foreach ($plugin->files as $file)
+ {
+ // set the path finder
+ $file['target_type'] = $plugin->target_type;
+ $file['target_id'] = $plugin->id;
+ $this->component->appendArray('files', $file);
+ }
+ }
+
+ // check if this lib has folders
+ if (isset($plugin->folders)
+ && ArrayHelper::check($plugin->folders))
+ {
+ // add to component folders
+ foreach ($plugin->folders as $folder)
+ {
+ // set the path finder
+ $folder['target_type'] = $plugin->target_type;
+ $folder['target_id'] = $plugin->id;
+ $this->component->appendArray('folders', $folder);
+ }
+ }
+
+ // check if this plugin has urls
+ if (isset($plugin->urls)
+ && ArrayHelper::check($plugin->urls))
+ {
+ // add to component urls
+ foreach ($plugin->urls as $n => &$url)
+ {
+ // should we add the local folder
+ if (isset($url['type']) && $url['type'] > 1
+ && isset($url['url'])
+ && StringHelper::check(
+ $url['url']
+ ))
+ {
+ // set file name
+ $fileName = basename((string) $url['url']);
+
+ // get the file contents
+ $data = FileHelper::getContent(
+ $url['url']
+ );
+
+ // build sub path
+ if (strpos($fileName, '.js') !== false)
+ {
+ $path = '/js';
+ }
+ elseif (strpos($fileName, '.css') !== false)
+ {
+ $path = '/css';
+ }
+ else
+ {
+ $path = '';
+ }
+
+ // create sub media media folder path if not set
+ $this->folder->create(
+ $plugin->folder_path . $path
+ );
+
+ // set the path to plugin file
+ $url['path'] = $plugin->folder_path . $path
+ . '/' . $fileName; // we need this for later
+
+ // write data to path
+ $this->file->write($url['path'], $data);
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * get the plugin xml template
+ *
+ * @param object $module The plugin object
+ *
+ * @return string
+ * @since 3.2.0
+ */
+ protected function getXML(object &$plugin): string
+ {
+ $xml = '';
+ $xml .= PHP_EOL . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . $plugin->lang_prefix
+ . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('BUILDDATE') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHOR') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHOREMAIL') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('AUTHORWEBSITE') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('COPYRIGHT') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . Placefix::_h('LICENSE') . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . $plugin->plugin_version
+ . '';
+ $xml .= PHP_EOL . Indent::_(1) . '' . $plugin->lang_prefix
+ . '_XML_DESCRIPTION';
+ $xml .= Placefix::_h('MAINXML');
+ $xml .= PHP_EOL . '';
+
+ return $xml;
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Data.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Data.php
index fec5eeb68..1743d1052 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Data.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Joomlaplugin/Data.php
@@ -669,17 +669,17 @@ class Data
if (!isset($plugin->form_files[$form['file']]))
{
$plugin->form_files[$form['file']]
- = array();
+ = [];
}
if (!isset($plugin->form_files[$form['file']][$form['fields_name']]))
{
$plugin->form_files[$form['file']][$form['fields_name']]
- = array();
+ = [];
}
if (!isset($plugin->form_files[$form['file']][$form['fields_name']][$form['fieldset']]))
{
$plugin->form_files[$form['file']][$form['fields_name']][$form['fieldset']]
- = array();
+ = [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)
@@ -701,12 +701,12 @@ class Data
if (!isset($plugin->config_fields[$form['fields_name']]))
{
$plugin->config_fields[$form['fields_name']]
- = array();
+ = [];
}
if (!isset($plugin->config_fields[$form['fields_name']][$form['fieldset']]))
{
$plugin->config_fields[$form['fields_name']][$form['fieldset']]
- = array();
+ = [];
}
// do some house cleaning (for fields)
foreach ($form['fields'] as $field)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Language/Extractor.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Language/Extractor.php
index fbb586466..6d47abce1 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Language/Extractor.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Language/Extractor.php
@@ -112,11 +112,11 @@ class Extractor
// insure string is not broken
$content = $this->placeholder->update_($content);
// reset some buckets
- $lang_holders = array();
- $lang_check = array();
- $lang_only = array();
- $js_text = array();
- $sc_text = array();
+ $lang_holders = [];
+ $lang_check = [];
+ $lang_only = [];
+ $js_text = [];
+ $sc_text = [];
// first get the Joomla .JText._()
if (in_array('Joomla' . '.JText._(', $lang_string_targets))
{
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Library/Builder.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Library/Builder.php
new file mode 100644
index 000000000..53fa6aa0e
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Library/Builder.php
@@ -0,0 +1,318 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Library;
+
+
+use Joomla\CMS\Filesystem\Folder as JoomlaFolder;
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Registry;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Compiler\Content;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
+use VDM\Joomla\Utilities\ObjectHelper;
+use VDM\Joomla\Utilities\ArrayHelper;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Utilities\FileHelper;
+
+
+/**
+ * Library Builder Class
+ *
+ * @since 3.2.0
+ */
+class Builder
+{
+ /**
+ * Compiler Config
+ *
+ * @var Config
+ * @since 3.2.0
+ */
+ protected Config $config;
+
+ /**
+ * The compiler registry
+ *
+ * @var Registry
+ * @since 3.2.0
+ */
+ protected Registry $registry;
+
+ /**
+ * Compiler Event
+ *
+ * @var EventInterface
+ * @since 3.2.0
+ */
+ protected EventInterface $event;
+
+ /**
+ * Compiler Component
+ *
+ * @var Component
+ * @since 3.2.0
+ **/
+ protected Component $component;
+
+ /**
+ * Compiler Content
+ *
+ * @var Content
+ * @since 3.2.0
+ **/
+ protected Content $content;
+
+ /**
+ * Compiler Counter
+ *
+ * @var Counter
+ * @since 3.2.0
+ */
+ protected Counter $counter;
+
+ /**
+ * Compiler Utilities Paths
+ *
+ * @var Paths
+ * @since 3.2.0
+ */
+ protected Paths $paths;
+
+ /**
+ * Compiler Utilities Folder
+ *
+ * @var Folder
+ * @since 3.2.0
+ */
+ protected Folder $folder;
+
+ /**
+ * Compiler Utilities File
+ *
+ * @var File
+ * @since 3.2.0
+ */
+ protected File $file;
+
+ /**
+ * Constructor
+ *
+ * @param Config|null $config The compiler config object.
+ * @param Registry|null $registry The compiler registry object.
+ * @param EventInterface|null $event The compiler event api object.
+ * @param Component|null $component The component class.
+ * @param Content|null $content The compiler content object.
+ * @param Counter|null $counter The compiler counter object.
+ * @param Paths|null $paths The compiler paths object.
+ * @param Folder|null $folder The compiler folder object.
+ * @param File|null $file The compiler file object.
+ *
+ * @since 3.2.0
+ */
+ public function __construct(?Config $config = null, ?Registry $registry = null,
+ ?EventInterface $event = null, ?Component $component = null,
+ ?Content $content = null,?Counter $counter = null,
+ ?Paths $paths = null, ?Folder $folder = null,
+ ?File $file = null)
+ {
+ $this->config = $config ?: Compiler::_('Config');
+ $this->registry = $registry ?: Compiler::_('Registry');
+ $this->event = $event ?: Compiler::_('Event');
+ $this->component = $component ?: Compiler::_('Component');
+ $this->content = $content ?: Compiler::_('Content');
+ $this->counter = $counter ?: Compiler::_('Utilities.Counter');
+ $this->paths = $paths ?: Compiler::_('Utilities.Paths');
+ $this->folder = $folder ?: Compiler::_('Utilities.Folder');
+ $this->file = $file ?: Compiler::_('Utilities.File');
+ }
+
+ /**
+ * Build the Libraries files, folders, url's and config
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function run()
+ {
+ if (($libraries_ = $this->registry->get('builder.libraries')) !== null)
+ {
+ // for plugin event TODO change event api signatures
+ $component_context = $this->config->component_context;
+
+ // Trigger Event: jcb_ce_onBeforeSetLibraries
+ $this->event->trigger(
+ 'jcb_ce_onBeforeSetLibraries',
+ array(&$component_context, &$libraries_)
+ );
+
+ // creat the main component folder
+ if (!JoomlaFolder::exists($this->paths->component_path))
+ {
+ JoomlaFolder::create($this->paths->component_path);
+
+ // count the folder created
+ $this->counter->folder++;
+ $this->file->html('');
+ }
+
+ // create media path if not set
+ $this->folder->create($this->paths->component_path . '/media');
+ foreach ($libraries_ as $id => &$library)
+ {
+ if (ObjectHelper::check($library))
+ {
+ // check if this lib has files
+ if (isset($library->files)
+ && ArrayHelper::check($library->files))
+ {
+ // add to component files
+ foreach ($library->files as $file)
+ {
+ $this->component->appendArray('files', $file);
+ }
+ }
+
+ // check if this lib has folders
+ if (isset($library->folders)
+ && ArrayHelper::check(
+ $library->folders
+ ))
+ {
+ // add to component folders
+ foreach ($library->folders as $folder)
+ {
+ $this->component->appendArray('folders', $folder);
+ }
+ }
+
+ // check if this lib has urls
+ if (isset($library->urls)
+ && ArrayHelper::check($library->urls))
+ {
+ // build media folder path
+ $libFolder = strtolower(
+ preg_replace(
+ '/\s+/', '-',
+ (string) StringHelper::safe(
+ $library->name, 'filename', ' ', false
+ )
+ )
+ );
+ $mediaPath = '/media/' . $libFolder;
+
+ // should we add the local folder
+ $addLocalFolder = false;
+
+ // add to component urls
+ foreach ($library->urls as $n => &$url)
+ {
+ if (isset($url['type']) && $url['type'] > 1
+ && isset($url['url'])
+ && StringHelper::check(
+ $url['url']
+ ))
+ {
+ // create media/lib path if not set
+ $this->folder->create(
+ $this->paths->component_path . $mediaPath
+ );
+
+ // add local folder
+ $addLocalFolder = true;
+
+ // set file name
+ $fileName = basename((string) $url['url']);
+
+ // get the file contents
+ $data = FileHelper::getContent(
+ $url['url']
+ );
+
+ // build sub path
+ if (strpos($fileName, '.js') !== false)
+ {
+ $path = '/js';
+ }
+ elseif (strpos($fileName, '.css') !== false)
+ {
+ $path = '/css';
+ }
+ else
+ {
+ $path = '';
+ }
+
+ // create sub media path if not set
+ $this->folder->create(
+ $this->paths->component_path . $mediaPath . $path
+ );
+
+ // set the path to library file
+ $url['path'] = $mediaPath . $path . '/'
+ . $fileName; // we need this for later
+
+ // set full path
+ $path = $this->paths->component_path . $url['path'];
+
+ // write data to path
+ $this->file->write($path, $data);
+
+ // count the file created
+ $this->counter->file++;
+ }
+ }
+
+ // only add if local
+ if ($addLocalFolder)
+ {
+ // add folder to xml of media folders
+ $this->content->add('EXSTRA_MEDIA_FOLDERS',
+ PHP_EOL . Indent::_(2) . ""
+ . $libFolder . "");
+ }
+ }
+
+ // if config fields are found load into component config (avoiding duplicates)
+ if (isset($library->how) && $library->how > 1
+ && isset($library->config)
+ && ArrayHelper::check($library->config))
+ {
+ foreach ($library->config as $cofig)
+ {
+ $found = array_filter(
+ $this->component->get('config'),
+ fn($item) => $item['field'] == $cofig['field']
+ );
+
+ // set the config data if not found
+ if (!ArrayHelper::check($found))
+ {
+ $this->component->appendArray('config', $cofig);
+ }
+ }
+ }
+
+ // update the global value just in case for now
+ $this->registry->set("builder.libraries.$id", $library);
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Dynamicget.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Dynamicget.php
index 2e2ccda3c..4b218a239 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Dynamicget.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Dynamicget.php
@@ -283,7 +283,7 @@ class Dynamicget
// build relationship
$_relationship = array_map(
function ($op) use (&$_part_of_a) {
- $bucket = array();
+ $bucket = [];
// array(on_field_as, on_field)
$bucket['on_field'] = array_map(
'trim',
@@ -386,11 +386,11 @@ class Dynamicget
))
{
// start the part of a table bucket
- $_part_of_a = array();
+ $_part_of_a = [];
// build relationship
$_relationship = array_map(
function ($op) use (&$_part_of_a) {
- $bucket = array();
+ $bucket = [];
// array(on_field_as, on_field)
$bucket['on_field'] = array_map(
'trim',
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Fields.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Fields.php
index 75a58578f..d7fe61d64 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Fields.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Fields.php
@@ -272,7 +272,7 @@ class Fields
&& 'tag' !== $field['settings']->type_name)
{
// build temp field bucket
- $tmpfield = array();
+ $tmpfield = [];
$tmpfield['settings'] = new \stdClass();
// convert the xml json string to normal string
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqldump.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqldump.php
index 794fe31b0..e6ed67572 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqldump.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqldump.php
@@ -94,8 +94,8 @@ class Sqldump
if (ArrayHelper::check($fields))
{
// reset array buckets
- $sourceArray = array();
- $targetArray = array();
+ $sourceArray = [];
+ $targetArray = [];
foreach ($fields as $field)
{
if (strpos($field, "=>") !== false)
@@ -148,8 +148,8 @@ class Sqldump
if (ArrayHelper::check($fields))
{
// reset array buckets
- $sourceArray = array();
- $targetArray = array();
+ $sourceArray = [];
+ $targetArray = [];
foreach ($fields as $field)
{
if (strpos($field, "=>") !== false)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqltweaking.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqltweaking.php
index b26729152..960f6076d 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqltweaking.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Model/Sqltweaking.php
@@ -110,7 +110,7 @@ class Sqltweaking
if (2 == $setting['add_sql_options'])
{
// rest always
- $id_array = array();
+ $id_array = [];
// by id (first remove backups)
$ids = $setting['ids'];
@@ -126,7 +126,7 @@ class Sqltweaking
{
$id_array[] = trim((string) $ids);
}
- $id_array_new = array();
+ $id_array_new = [];
// check for ranges
foreach ($id_array as $key => $id)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Placeholder/Reverse.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Placeholder/Reverse.php
index fcb0b028b..9c866ab3e 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Placeholder/Reverse.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Placeholder/Reverse.php
@@ -131,7 +131,7 @@ class Reverse
if (ArrayHelper::check($lang_string_targets))
{
// start lang holder
- $lang_holders = array();
+ $lang_holders = [];
// set the lang for both since we don't know what area is being targeted
$_tmp = $this->config->lang_target;
// set the lang based on target
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power.php
index bd785fee2..ca84d6e6e 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power.php
@@ -542,7 +542,7 @@ class Power implements PowerInterface
$this->active[$guid]->use_selection
)) ? json_decode((string) $this->active[$guid]->use_selection, true) : null;
- if ($this->active[$guid]->use_selection)
+ if (ArrayHelper::check($this->active[$guid]->use_selection))
{
$use = array_values(array_map(function ($u) use(&$as) {
// track the AS options
@@ -551,6 +551,10 @@ class Power implements PowerInterface
return $u['use'];
}, $this->active[$guid]->use_selection));
}
+ else
+ {
+ $this->active[$guid]->use_selection = null;
+ }
}
/**
@@ -569,7 +573,7 @@ class Power implements PowerInterface
$this->active[$guid]->load_selection
)) ? json_decode((string) $this->active[$guid]->load_selection, true) : null;
- if ($this->active[$guid]->load_selection)
+ if (ArrayHelper::check($this->active[$guid]->load_selection))
{
// load use ids
array_map(
@@ -578,6 +582,10 @@ class Power implements PowerInterface
$this->active[$guid]->load_selection
);
}
+ else
+ {
+ $this->active[$guid]->load_selection = null;
+ }
}
/**
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Builder.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Builder.php
new file mode 100644
index 000000000..2197ec0ba
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Builder.php
@@ -0,0 +1,339 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Power;
+
+
+use Joomla\CMS\Factory;
+use Joomla\CMS\Application\CMSApplication;
+use Joomla\CMS\Language\Text;
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Power;
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Registry;
+use VDM\Joomla\Componentbuilder\Compiler\Interfaces\EventInterface;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
+use VDM\Joomla\Utilities\ObjectHelper;
+use VDM\Joomla\Utilities\ArrayHelper;
+use VDM\Joomla\Utilities\StringHelper;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix;
+
+
+/**
+ * Power Builder Class
+ *
+ * @since 3.2.0
+ */
+class Builder
+{
+ /**
+ * we track the creation of htaccess files
+ *
+ * @var array
+ * @since 3.2.0
+ **/
+ protected array $htaccess = [];
+
+ /**
+ * Power Objects
+ *
+ * @var Power
+ * @since 3.2.0
+ **/
+ protected Power $power;
+
+ /**
+ * Compiler Config
+ *
+ * @var Config
+ * @since 3.2.0
+ */
+ protected Config $config;
+
+ /**
+ * The compiler registry
+ *
+ * @var Registry
+ * @since 3.2.0
+ */
+ protected Registry $registry;
+
+ /**
+ * Compiler Event
+ *
+ * @var EventInterface
+ * @since 3.2.0
+ */
+ protected EventInterface $event;
+
+ /**
+ * Compiler Counter
+ *
+ * @var Counter
+ * @since 3.2.0
+ */
+ protected Counter $counter;
+
+ /**
+ * Compiler Utilities Paths
+ *
+ * @var Paths
+ * @since 3.2.0
+ */
+ protected Paths $paths;
+
+ /**
+ * Compiler Utilities Folder
+ *
+ * @var Folder
+ * @since 3.2.0
+ */
+ protected Folder $folder;
+
+ /**
+ * Compiler Utilities File
+ *
+ * @var File
+ * @since 3.2.0
+ */
+ protected File $file;
+
+ /**
+ * Compiler Utilities Files
+ *
+ * @var Files
+ * @since 3.2.0
+ */
+ protected Files $files;
+
+ /**
+ * Database object to query local DB
+ *
+ * @var CMSApplication
+ * @since 3.2.0
+ **/
+ protected CMSApplication $app;
+
+ /**
+ * Constructor
+ *
+ * @param Power|null $power The power object.
+ * @param Config|null $config The compiler config object.
+ * @param Registry|null $registry The compiler registry object.
+ * @param EventInterface|null $event The compiler event api object.
+ * @param Counter|null $counter The compiler counter object.
+ * @param Paths|null $paths The compiler paths object.
+ * @param Folder|null $folder The compiler folder object.
+ * @param File|null $file The compiler file object.
+ * @param Files|null $files The compiler files object.
+ * @param CMSApplication|null $app The CMS Application object.
+ *
+ * @throws \Exception
+ * @since 3.2.0
+ */
+ public function __construct(?Power $power = null, ?Config $config = null,
+ ?Registry $registry = null, ?EventInterface $event = null,
+ ?Counter $counter = null, ?Paths $paths = null, ?Folder $folder = null,
+ ?File $file = null, ?Files $files = null, ?CMSApplication $app = null)
+ {
+ $this->power = $power ?: Compiler::_('Power');
+ $this->config = $config ?: Compiler::_('Config');
+ $this->registry = $registry ?: Compiler::_('Registry');
+ $this->event = $event ?: Compiler::_('Event');
+ $this->counter = $counter ?: Compiler::_('Utilities.Counter');
+ $this->paths = $paths ?: Compiler::_('Utilities.Paths');
+ $this->folder = $folder ?: Compiler::_('Utilities.Folder');
+ $this->file = $file ?: Compiler::_('Utilities.File');
+ $this->files = $files ?: Compiler::_('Utilities.Files');
+ $this->app = $app ?: Factory::getApplication();
+ }
+
+ /**
+ * Build the Powers files, folders
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function run()
+ {
+ if (ArrayHelper::check($this->power->active))
+ {
+ // for plugin event TODO change event api signatures
+ $powers = $this->power->active;
+ $component_context = $this->config->component_context;
+ // Trigger Event: jcb_ce_onBeforeSetModules
+ $this->event->trigger(
+ 'jcb_ce_onBeforeBuildPowers',
+ array(&$component_context, &$powers)
+ );
+ // for plugin event TODO change event api signatures
+ $this->power->active = $powers;
+
+ foreach ($this->power->active as $power)
+ {
+ if (ObjectHelper::check($power)
+ && isset($power->path)
+ && StringHelper::check(
+ $power->path
+ ))
+ {
+ // activate dynamic folders
+ $this->setDynamicFolders();
+
+ // power path
+ $power->full_path = $this->paths->component_path . '/'
+ . $power->path;
+ $power->full_path_jcb = $this->paths->component_path . '/'
+ . $power->path_jcb;
+ $power->full_path_parent = $this->paths->component_path . '/'
+ . $power->path_parent;
+
+ // set the power paths
+ $this->registry->set('dynamic_paths.' . $power->key, $power->full_path_parent);
+
+ // create the power folder if it does not exist
+ // we do it like this to add html files to each part
+ $this->folder->create($power->full_path_jcb);
+ $this->folder->create($power->full_path_parent);
+ $this->folder->create($power->full_path);
+
+ // set power file
+ $fileDetails = array('path' => $power->full_path . '/'
+ . $power->file_name . '.php',
+ 'name' => $power->file_name . '.php',
+ 'zip' => $power->file_name . '.php');
+ $bom = 'add_licensing_template == 2)
+ {
+ $bom = 'licensing_template;
+ }
+ $this->file->write(
+ $fileDetails['path'],
+ $bom . PHP_EOL . Placefix::_h('POWERCODE')
+ . PHP_EOL . Placefix::_h('POWERLINKER')
+ );
+ $this->files->appendArray($power->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // set htaccess once per path
+ $this->setHtaccess($power);
+ }
+ }
+ }
+ }
+
+ /**
+ * Set the .htaccess for this power path
+ *
+ * @param object $power The power object
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ protected function setHtaccess(object &$power)
+ {
+ if (!isset($this->htaccess[$power->path_jcb]))
+ {
+ // set the htaccess data
+ $data = '# Apache 2.4+' . PHP_EOL .
+ '' . PHP_EOL .
+ ' Require all denied' . PHP_EOL .
+ '' . PHP_EOL . PHP_EOL .
+ '# Apache 2.0-2.2' . PHP_EOL .
+ '' . PHP_EOL .
+ ' Deny from all' . PHP_EOL .
+ '' . PHP_EOL;
+
+ // now we must add the .htaccess file
+ $fileDetails = array('path' => $power->full_path_jcb . '/.htaccess',
+ 'name' => '.htaccess',
+ 'zip' => '.htaccess');
+ $this->file->write(
+ $fileDetails['path'], $data
+ );
+ $this->files->appendArray($power->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // now we must add the htaccess.txt file where the zip package my not get the [.] files
+ $fileDetails = array('path' => $power->full_path_jcb . '/htaccess.txt',
+ 'name' => 'htaccess.txt',
+ 'zip' => 'htaccess.txt');
+ $this->file->write(
+ $fileDetails['path'], $data
+ );
+ $this->files->appendArray($power->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // now we must add the web.config file
+ $fileDetails = array('path' => $power->full_path_jcb . '/web.config',
+ 'name' => 'web.config',
+ 'zip' => 'web.config');
+ $this->file->write(
+ $fileDetails['path'],
+ '' . PHP_EOL .
+ ' ' . PHP_EOL .
+ ' ' . PHP_EOL .
+ ' ' . PHP_EOL .
+ ' ' . PHP_EOL .
+ ' ' . PHP_EOL .
+ '' . PHP_EOL
+ );
+ $this->files->appendArray($power->key, $fileDetails);
+
+ // count the file created
+ $this->counter->file++;
+
+ // we set these files only once
+ $this->htaccess[$power->path_jcb] = true;
+ }
+ }
+
+ /**
+ * Add the dynamic folders
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ protected function setDynamicFolders()
+ {
+ // check if we should add the dynamic folder moving script to the installer script
+ if (!$this->registry->get('set_move_folders_install_script'))
+ {
+ // add the setDynamicF0ld3rs() method to the install scipt.php file
+ $this->registry->set('set_move_folders_install_script', true);
+
+ // set message that this was done (will still add a tutorial link later)
+ $this->app->enqueueMessage(
+ Text::_('COM_COMPONENTBUILDER_HR_HTHREEDYNAMIC_FOLDERS_WERE_DETECTEDHTHREE'),
+ 'Notice'
+ );
+ $this->app->enqueueMessage(
+ Text::sprintf('COM_COMPONENTBUILDER_A_METHOD_SETDYNAMICFZEROLDTHREERS_WAS_ADDED_TO_THE_INSTALL_BSCRIPTPHPB_OF_THIS_PACKAGE_TO_INSURE_THAT_THE_FOLDERS_ARE_COPIED_INTO_THE_CORRECT_PLACE_WHEN_THIS_COMPONENT_IS_INSTALLED'),
+ 'Notice'
+ );
+ }
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Infusion.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Infusion.php
index 3337748cf..f72181638 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Infusion.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Power/Infusion.php
@@ -128,6 +128,11 @@ class Infusion
// POWERCODE
$this->content->set_($power->key, 'POWERCODE', $this->get($power));
+ // POWERLINKER
+ // SOON WE STILL NEED TO THINK THIS OVER
+ // $this->content->set_($power->key, 'POWERLINKER', $this->linker($power));
+ $this->content->set_($power->key, 'POWERLINKER', '');
+
// Trigger Event: jcb_ce_onAfterInfusePowerData
$this->event->trigger(
'jcb_ce_onAfterInfusePowerData',
@@ -198,10 +203,84 @@ class Infusion
$code[] = $power->main_class_code;
}
- $code[] = '}' . PHP_EOL . PHP_EOL;
+ $code[] = '}' . PHP_EOL;
return $this->placeholder->update(implode(PHP_EOL, $code), $this->content->active);
}
+
+ /**
+ * Get the Power Linker
+ *
+ * @param object $power A power object.
+ *
+ * @return string
+ * @since 3.2.0
+ */
+ protected function linker(object &$power): string
+ {
+ $map = [];
+ $body = [];
+
+ // set the LINKER
+ $map[] = '/******************| POWER LINKER |*******************|';
+ $map[] = '';
+ $map[] = '{';
+
+ // we build the JSON body
+ $body[] = ' "guid": "' . $power->guid . '"';
+
+ // load extends
+ if (GuidHelper::valid($power->extends))
+ {
+ $body[] = ' "extends": "' . $power->extends . '"';
+ }
+
+ // load implements
+ if (ArrayHelper::check($power->implements))
+ {
+ $sud = [];
+ foreach ($power->implements as $implement)
+ {
+ $sud[] = ' "' . $implement . '"';
+ }
+ $sud = implode(','. PHP_EOL, $sud);
+
+ $body[] = ' "implements": [' . PHP_EOL . $sud . PHP_EOL . ' ]';
+ }
+
+ // load (Use Selection)
+ if (ArrayHelper::check($power->use_selection))
+ {
+ $sud = [];
+ foreach ($power->use_selection as $use)
+ {
+ $sud[] = ' "' . $use['use'] . '"';
+ }
+ $sud = implode(','. PHP_EOL, $sud);
+
+ $body[] = ' "use": [' . PHP_EOL . $sud . PHP_EOL . ' ]';
+ }
+
+ // load (Load Selection)
+ if (ArrayHelper::check($power->load_selection))
+ {
+ $sud = [];
+ foreach ($power->load_selection as $load)
+ {
+ $sud[] = ' "' . $load['load'] . '"';
+ }
+ $sud = implode(','. PHP_EOL, $sud);
+
+ $body[] = ' "load": [' . PHP_EOL . $sud . PHP_EOL . ' ]';
+ }
+ $map[] = implode(','. PHP_EOL, $body);
+
+ $map[] = '}';
+ $map[] = '';
+ $map[] = '|******************| POWER LINKER |*******************/' . PHP_EOL . PHP_EOL;
+
+ return implode(PHP_EOL, $map);
+ }
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Compiler.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Compiler.php
index b9c732c3d..de5451e6f 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Compiler.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Compiler.php
@@ -16,7 +16,6 @@ use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Config;
use VDM\Joomla\Componentbuilder\Compiler\Registry;
-use VDM\Joomla\Componentbuilder\Compiler\Counter;
/**
@@ -41,9 +40,6 @@ class Compiler implements ServiceProviderInterface
$container->alias(Registry::class, 'Registry')
->share('Registry', [$this, 'getRegistry'], true);
-
- $container->alias(Counter::class, 'Counter')
- ->share('Counter', [$this, 'getCounter'], true);
}
/**
@@ -71,19 +67,6 @@ class Compiler implements ServiceProviderInterface
{
return new Registry();
}
-
- /**
- * Get the Compiler Counter
- *
- * @param Container $container The DI container.
- *
- * @return Counter
- * @since 3.2.0
- */
- public function getCounter(Container $container): Counter
- {
- return new Counter();
- }
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlamodule.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlamodule.php
index 5f7d697b4..c3c08ef6f 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlamodule.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlamodule.php
@@ -15,6 +15,7 @@ namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Joomlamodule\Data as JoomlaModuleData;
+use VDM\Joomla\Componentbuilder\Compiler\Joomlamodule\Builder as JoomlaModuleBuilder;
/**
@@ -36,6 +37,9 @@ class Joomlamodule implements ServiceProviderInterface
{
$container->alias(JoomlaModuleData::class, 'Joomlamodule.Data')
->share('Joomlamodule.Data', [$this, 'getJoomlaModuleData'], true);
+
+ $container->alias(JoomlaModuleBuilder::class, 'Joomlamodule.Builder')
+ ->share('Joomlamodule.Builder', [$this, 'getJoomlaModuleBuilder'], true);
}
/**
@@ -61,6 +65,30 @@ class Joomlamodule implements ServiceProviderInterface
$container->get('Dynamicget.Data')
);
}
+
+ /**
+ * Get the Joomla Module Builder
+ *
+ * @param Container $container The DI container.
+ *
+ * @return JoomlaModuleBuilder
+ * @since 3.2.0
+ */
+ public function getJoomlaModuleBuilder(Container $container): JoomlaModuleBuilder
+ {
+ return new JoomlaModuleBuilder(
+ $container->get('Joomlamodule.Data'),
+ $container->get('Component'),
+ $container->get('Config'),
+ $container->get('Registry'),
+ $container->get('Customcode.Dispenser'),
+ $container->get('Event'),
+ $container->get('Utilities.Counter'),
+ $container->get('Utilities.Folder'),
+ $container->get('Utilities.File'),
+ $container->get('Utilities.Files')
+ );
+ }
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlaplugin.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlaplugin.php
index fff2f5942..1e2d2162a 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlaplugin.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Joomlaplugin.php
@@ -15,6 +15,7 @@ namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin\Data as JoomlaPluginData;
+use VDM\Joomla\Componentbuilder\Compiler\Joomlaplugin\Builder as JoomlaPluginBuilder;
/**
@@ -36,6 +37,9 @@ class Joomlaplugin implements ServiceProviderInterface
{
$container->alias(JoomlaPluginData::class, 'Joomlaplugin.Data')
->share('Joomlaplugin.Data', [$this, 'getJoomlaPluginData'], true);
+
+ $container->alias(JoomlaPluginBuilder::class, 'Joomlaplugin.Builder')
+ ->share('Joomlaplugin.Builder', [$this, 'getJoomlaPluginBuilder'], true);
}
/**
@@ -59,6 +63,30 @@ class Joomlaplugin implements ServiceProviderInterface
$container->get('Model.Filesfolders')
);
}
+
+ /**
+ * Get the Joomla Plugin Builder
+ *
+ * @param Container $container The DI container.
+ *
+ * @return JoomlaPluginBuilder
+ * @since 3.2.0
+ */
+ public function getJoomlaPluginBuilder(Container $container): JoomlaPluginBuilder
+ {
+ return new JoomlaPluginBuilder(
+ $container->get('Joomlaplugin.Data'),
+ $container->get('Component'),
+ $container->get('Config'),
+ $container->get('Registry'),
+ $container->get('Customcode.Dispenser'),
+ $container->get('Event'),
+ $container->get('Utilities.Counter'),
+ $container->get('Utilities.Folder'),
+ $container->get('Utilities.File'),
+ $container->get('Utilities.Files')
+ );
+ }
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Library.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Library.php
index c07381ec1..f6f624fc5 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Library.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Library.php
@@ -14,7 +14,8 @@ namespace VDM\Joomla\Componentbuilder\Compiler\Service;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
-use VDM\Joomla\Componentbuilder\Compiler\Library\Data as LibraryData;
+use VDM\Joomla\Componentbuilder\Compiler\Library\Data;
+use VDM\Joomla\Componentbuilder\Compiler\Library\Builder;
/**
@@ -34,8 +35,11 @@ class Library implements ServiceProviderInterface
*/
public function register(Container $container)
{
- $container->alias(LibraryData::class, 'Library.Data')
- ->share('Library.Data', [$this, 'getLibraryData'], true);
+ $container->alias(Data::class, 'Library.Data')
+ ->share('Library.Data', [$this, 'getData'], true);
+
+ $container->alias(Builder::class, 'Library.Builder')
+ ->share('Library.Builder', [$this, 'getBuilder'], true);
}
/**
@@ -43,12 +47,12 @@ class Library implements ServiceProviderInterface
*
* @param Container $container The DI container.
*
- * @return LibraryData
+ * @return Data
* @since 3.2.0
*/
- public function getLibraryData(Container $container): LibraryData
+ public function getData(Container $container): Data
{
- return new LibraryData(
+ return new Data(
$container->get('Config'),
$container->get('Registry'),
$container->get('Customcode'),
@@ -57,6 +61,29 @@ class Library implements ServiceProviderInterface
$container->get('Model.Filesfolders')
);
}
+
+ /**
+ * Get the Compiler Library Builder
+ *
+ * @param Container $container The DI container.
+ *
+ * @return Builder
+ * @since 3.2.0
+ */
+ public function getBuilder(Container $container): Builder
+ {
+ return new Builder(
+ $container->get('Config'),
+ $container->get('Registry'),
+ $container->get('Event'),
+ $container->get('Component'),
+ $container->get('Content'),
+ $container->get('Utilities.Counter'),
+ $container->get('Utilities.Paths'),
+ $container->get('Utilities.Folder'),
+ $container->get('Utilities.File')
+ );
+ }
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Power.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Power.php
index f252fe7bd..835aa3ac0 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Power.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Power.php
@@ -17,6 +17,7 @@ use Joomla\DI\ServiceProviderInterface;
use VDM\Joomla\Componentbuilder\Compiler\Power as Powers;
use VDM\Joomla\Componentbuilder\Compiler\Power\Infusion;
use VDM\Joomla\Componentbuilder\Compiler\Power\Autoloader;
+use VDM\Joomla\Componentbuilder\Compiler\Power\Builder;
/**
@@ -44,6 +45,9 @@ class Power implements ServiceProviderInterface
$container->alias(Infusion::class, 'Power.Infusion')
->share('Power.Infusion', [$this, 'getInfusion'], true);
+
+ $container->alias(Builder::class, 'Power.Builder')
+ ->share('Power.Builder', [$this, 'getBuilder'], true);
}
/**
@@ -100,6 +104,29 @@ class Power implements ServiceProviderInterface
$container->get('Event')
);
}
+
+ /**
+ * Get the Compiler Power Builder
+ *
+ * @param Container $container The DI container.
+ *
+ * @return Builder
+ * @since 3.2.0
+ */
+ public function getBuilder(Container $container): Builder
+ {
+ return new Builder(
+ $container->get('Power'),
+ $container->get('Config'),
+ $container->get('Registry'),
+ $container->get('Event'),
+ $container->get('Utilities.Counter'),
+ $container->get('Utilities.Paths'),
+ $container->get('Utilities.Folder'),
+ $container->get('Utilities.File'),
+ $container->get('Utilities.Files')
+ );
+ }
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Utilities.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Utilities.php
new file mode 100644
index 000000000..dd4ee7468
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Service/Utilities.php
@@ -0,0 +1,134 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Service;
+
+
+use Joomla\DI\Container;
+use Joomla\DI\ServiceProviderInterface;
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Folder;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Files;
+
+
+/**
+ * Utilities Service Provider
+ *
+ * @since 3.2.0
+ */
+class Utilities implements ServiceProviderInterface
+{
+ /**
+ * Registers the service provider with a DI container.
+ *
+ * @param Container $container The DI container.
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function register(Container $container)
+ {
+ $container->alias(Folder::class, 'Utilities.Folder')
+ ->share('Utilities.Folder', [$this, 'getFolder'], true);
+
+ $container->alias(File::class, 'Utilities.File')
+ ->share('Utilities.File', [$this, 'getFile'], true);
+
+ $container->alias(Counter::class, 'Utilities.Counter')
+ ->share('Utilities.Counter', [$this, 'getCounter'], true);
+
+ $container->alias(Paths::class, 'Utilities.Paths')
+ ->share('Utilities.Paths', [$this, 'getPaths'], true);
+
+ $container->alias(Files::class, 'Utilities.Files')
+ ->share('Utilities.Files', [$this, 'getFiles'], true);
+ }
+
+ /**
+ * Get the Compiler Folder
+ *
+ * @param Container $container The DI container.
+ *
+ * @return Folder
+ * @since 3.2.0
+ */
+ public function getFolder(Container $container): Folder
+ {
+ return new Folder(
+ $container->get('Utilities.Counter'),
+ $container->get('Utilities.File')
+ );
+ }
+
+ /**
+ * Get the Compiler File
+ *
+ * @param Container $container The DI container.
+ *
+ * @return File
+ * @since 3.2.0
+ */
+ public function getFile(Container $container): File
+ {
+ return new File(
+ $container->get('Utilities.Counter')
+ );
+ }
+
+ /**
+ * Get the Compiler Counter
+ *
+ * @param Container $container The DI container.
+ *
+ * @return Counter
+ * @since 3.2.0
+ */
+ public function getCounter(Container $container): Counter
+ {
+ return new Counter(
+ $container->get('Content')
+ );
+ }
+
+ /**
+ * Get the Compiler Paths
+ *
+ * @param Container $container The DI container.
+ *
+ * @return Paths
+ * @since 3.2.0
+ */
+ public function getPaths(Container $container): Paths
+ {
+ return new Paths(
+ $container->get('Config'),
+ $container->get('Component')
+ );
+ }
+
+ /**
+ * Get the Compiler Files Bucket
+ *
+ * @param Container $container The DI container.
+ *
+ * @return Files
+ * @since 3.2.0
+ */
+ public function getFiles(Container $container): Files
+ {
+ return new Files();
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Counter.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Counter.php
similarity index 93%
rename from libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Counter.php
rename to libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Counter.php
index 88483cee8..37e878b49 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Counter.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Counter.php
@@ -9,7 +9,7 @@
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
-namespace VDM\Joomla\Componentbuilder\Compiler;
+namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
@@ -17,7 +17,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Content;
/**
- * Compiler Counter
+ * Compiler Utilities Counter
*
* @since 3.2.0
*/
@@ -300,7 +300,6 @@ class Counter
$this->timer = $this->end - $this->start;
// compiler time
- $this->content->set('COMPILER_TIMER_START', $this->start);
$this->content->set('COMPILER_TIMER_END', $this->end);
$this->content->set('COMPILER_TIMER', $this->timer);
}
@@ -353,8 +352,6 @@ class Counter
// compiler time
$this->content->set('COMPILER_TIMER_START', $this->start);
- $this->content->set('COMPILER_TIMER_END', $this->end);
- $this->content->set('COMPILER_TIMER', $this->timer);
}
/**
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/File.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/File.php
new file mode 100644
index 000000000..a6046dafa
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/File.php
@@ -0,0 +1,109 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
+
+
+use Joomla\CMS\Filesystem\File as JoomlaFile;
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Paths;
+use VDM\Joomla\Utilities\FileHelper;
+
+
+/**
+ * File helper
+ *
+ * @since 3.2.0
+ */
+class File
+{
+ /**
+ * Compiler Utilities Counter
+ *
+ * @var Counter
+ * @since 3.2.0
+ */
+ protected Counter $counter;
+
+ /**
+ * Compiler Utilities Paths
+ *
+ * @var Paths
+ * @since 3.2.0
+ */
+ protected Paths $paths;
+
+ /**
+ * Constructor
+ *
+ * @param Counter|null $counter The compiler counter object.
+ * @param Paths|null $paths The compiler paths object.
+ *
+ * @since 3.2.0
+ */
+ public function __construct(?Counter $counter = null, ?Paths $paths = null)
+ {
+ $this->counter = $counter ?: Compiler::_('Utilities.Counter');
+ $this->paths = $paths ?: Compiler::_('Utilities.Paths');
+ }
+
+ /**
+ * set HTML blank file to a path
+ *
+ * @param string $path The path to where to set the blank html file
+ * @param string $root The root path
+ *
+ * @return void
+ */
+ public function html(string $path = '', string $root = 'component')
+ {
+ if ('component' === $root)
+ {
+ $root = $this->paths->component_path . '/';
+ }
+
+ // use path if exist
+ if (strlen($path) > 0)
+ {
+ JoomlaFile::copy(
+ $this->paths->template_path . '/index.html',
+ $root . $path . '/index.html'
+ );
+ }
+ else
+ {
+ JoomlaFile::copy(
+ $this->paths->template_path . '/index.html',
+ $root . '/index.html'
+ );
+ }
+
+ // count the file created
+ $this->counter->file++;
+ }
+
+ /**
+ * Create a file on the server if it does not exist, or Overwrite existing files
+ *
+ * @param string $path The path and file name where to safe the data
+ * @param string $data The data to safe
+ *
+ * @return bool true On success
+ * @since 3.2.0
+ */
+ public function write(string $path, string $data): bool
+ {
+ return FileHelper::write($path, $data);
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Files.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Files.php
new file mode 100644
index 000000000..a9d9809cf
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Files.php
@@ -0,0 +1,26 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
+
+
+use VDM\Joomla\Componentbuilder\Abstraction\BaseRegistry;
+
+
+/**
+ * Compiler Utilities Files Bucket
+ *
+ * @since 3.2.0
+ */
+class Files extends BaseRegistry
+{
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Folder.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Folder.php
new file mode 100644
index 000000000..2c983eac8
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Folder.php
@@ -0,0 +1,172 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
+
+
+use Joomla\CMS\Filesystem\Folder as JoomlaFolder;
+use Joomla\CMS\Filesystem\File as JoomlaFile;
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\Counter;
+use VDM\Joomla\Componentbuilder\Compiler\Utilities\File;
+use VDM\Joomla\Utilities\ArrayHelper;
+
+
+/**
+ * Folder helper
+ *
+ * @since 3.2.0
+ */
+class Folder
+{
+ /**
+ * Compiler Counter
+ *
+ * @var Counter
+ * @since 3.2.0
+ */
+ protected Counter $counter;
+
+ /**
+ * Compiler Utilities File
+ *
+ * @var File
+ * @since 3.2.0
+ */
+ protected File $file;
+
+ /**
+ * Constructor
+ *
+ * @param Counter|null $counter The compiler counter object.
+ * @param File|null $file The compiler file object.
+ *
+ * @since 3.2.0
+ */
+ public function __construct(?Counter $counter = null, ?File $file = null)
+ {
+ $this->counter = $counter ?: Compiler::_('Utilities.Counter');
+ $this->file = $file ?: Compiler::_('Utilities.File');
+ }
+
+ /**
+ * Create Path if not exist
+ *
+ * @param string $path The path to folder to create
+ *
+ * @return void
+ * @since 3.2.0
+ */
+ public function create(string $path)
+ {
+ // check if the path exist
+ if (!JoomlaFolder::exists($path))
+ {
+ // create the path
+ JoomlaFolder::create(
+ $path
+ );
+
+ // count the folder created
+ $this->counter->folder++;
+
+ // add index.html (boring I know)
+ $this->file->html(
+ $path, ''
+ );
+ }
+ }
+
+ /**
+ * Remove folders with files
+ *
+ * @param string $path The path to folder to remove
+ * @param array|null $ignore The folders and files to ignore and not remove
+ *
+ * @return boolean True if all are removed
+ * @since 3.2.0
+ */
+ public function remove(string $path, ?array $ignore = null): bool
+ {
+ if (JoomlaFolder::exists($path))
+ {
+ $it = new \RecursiveDirectoryIterator($path);
+ $it = new \RecursiveIteratorIterator($it, \RecursiveIteratorIterator::CHILD_FIRST);
+
+ // remove ending /
+ $path = rtrim($path, '/');
+
+ // now loop the files & folders
+ foreach ($it as $file)
+ {
+ if ('.' === $file->getBasename() || '..' === $file->getBasename()) continue;
+
+ // set file dir
+ $file_dir = $file->getPathname();
+
+ // check if this is a dir or a file
+ if ($file->isDir())
+ {
+ $keeper = false;
+ if (ArrayHelper::check($ignore))
+ {
+ foreach ($ignore as $keep)
+ {
+ if (strpos((string) $file_dir, $path . '/' . $keep) !== false)
+ {
+ $keeper = true;
+ }
+ }
+ }
+
+ if ($keeper)
+ {
+ continue;
+ }
+
+ JoomlaFolder::delete($file_dir);
+ }
+ else
+ {
+ $keeper = false;
+ if (ArrayHelper::check($ignore))
+ {
+ foreach ($ignore as $keep)
+ {
+ if (strpos((string) $file_dir, $path . '/'. $keep) !== false)
+ {
+ $keeper = true;
+ }
+ }
+ }
+
+ if ($keeper)
+ {
+ continue;
+ }
+
+ JoomlaFile::delete($file_dir);
+ }
+ }
+
+ // delete the root folder if ignore not set
+ if (!ArrayHelper::check($ignore))
+ {
+ return JoomlaFolder::delete($path);
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Path.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Path.php
index b98c9703b..c66c8dc7f 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Path.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Path.php
@@ -37,7 +37,7 @@ abstract class Path
* @return void
* @since 3.2.0
*/
- public static function fix(&$values, $targets = array())
+ public static function fix(&$values, $targets = [])
{
// if multiple to gets searched and fixed
if (ArrayHelper::check($values) && ArrayHelper::check($targets))
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Paths.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Paths.php
new file mode 100644
index 000000000..51ea35cb3
--- /dev/null
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Paths.php
@@ -0,0 +1,132 @@
+
+ * @git Joomla Component Builder
+ * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace VDM\Joomla\Componentbuilder\Compiler\Utilities;
+
+
+use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler;
+use VDM\Joomla\Componentbuilder\Compiler\Config;
+use VDM\Joomla\Componentbuilder\Compiler\Component;
+use VDM\Joomla\Componentbuilder\Interfaces\Mappersingleinterface;
+use VDM\Joomla\Componentbuilder\Abstraction\MapperSingle;
+
+
+/**
+ * Compiler Utilities Paths
+ *
+ * @since 3.2.0
+ */
+class Paths extends MapperSingle implements Mappersingleinterface
+{
+ /**
+ * Compiler Config
+ *
+ * @var Config
+ * @since 3.2.0
+ **/
+ protected Config $config;
+
+ /**
+ * Compiler Component
+ *
+ * @var Component
+ * @since 3.2.0
+ **/
+ protected Component $component;
+
+ /**
+ * Constructor
+ *
+ * @param Config|null $config The compiler config object.
+ * @param Component|null $component The component class.
+ *
+ * @since 3.2.0
+ */
+ public function __construct(?Config $config = null, ?Component $component = null)
+ {
+ $this->config = $config ?: Compiler::_('Config');
+ $this->component = $component ?: Compiler::_('Component');
+
+ // set the template path
+ $this->set('template_path',
+ $this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/joomla_'
+ . $this->config->joomla_versions[$this->config->joomla_version]['folder_key']
+ );
+
+ // set component sales name
+ $this->set('component_sales_name',
+ 'com_' . $this->component->get('sales_name') . '__J'
+ . $this->config->joomla_version
+ );
+
+ // set component backup name
+ $this->set('component_backup_name',
+ 'com_' . $this->component->get('sales_name') . '_v' . str_replace(
+ '.', '_', (string) $this->component->get('component_version')
+ ) . '__J' . $this->config->joomla_version
+ );
+
+ // set component folder name
+ $this->set('component_folder_name',
+ 'com_' . $this->component->get('name_code') . '_v' . str_replace(
+ '.', '_', (string) $this->component->get('component_version')
+ ) . '__J' . $this->config->joomla_version
+ );
+
+ // set component path
+ $this->set('component_path',
+ $this->config->get('compiler_path', JPATH_COMPONENT_ADMINISTRATOR . '/compiler') . '/'
+ . $this->get('component_folder_name')
+ );
+
+ // set the template path for custom TODO: just use custom_folder_path in config
+ $this->set('template_path_custom',
+ $this->config->get(
+ 'custom_folder_path', JPATH_COMPONENT_ADMINISTRATOR . '/custom'
+ )
+ );
+ }
+
+ /**
+ * getting any valid paths
+ *
+ * @param string $key The value's key/path name
+ *
+ * @return string The path found as a string
+ * @since 3.2.0
+ * @throws \InvalidArgumentException If $key is not a valid function name.
+ */
+ public function __get(string $key): string
+ {
+ // check if it has been set
+ if ($this->exist($key))
+ {
+ return $this->get($key);
+ }
+
+ throw new \InvalidArgumentException(sprintf('Path %s could not be found in the Paths Class.', $key));
+ }
+
+ /**
+ * Model the key
+ *
+ * @param string $key The key to model
+ *
+ * @return string
+ * @since 3.2.0
+ */
+ protected function key(string $key): string
+ {
+ return $key;
+ }
+
+}
+
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Unique.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Unique.php
index 615a93581..b92611ad7 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Unique.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Compiler/Utilities/Unique.php
@@ -45,11 +45,13 @@ abstract class Unique
*/
public static function get($size): string
{
- $unique = end(self::$unique[$size]);
+ $unique = (isset(self::$unique[$size])) ? end(self::$unique[$size]) : null;
if(!$unique)
{
$unique = substr("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv", 0, $size);
+
+ self::$unique[$size] = [];
}
while(in_array($unique, self::$unique[$size]))
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Server/Ftp.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Server/Ftp.php
index d66d71e0b..ea4422e7a 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Server/Ftp.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Server/Ftp.php
@@ -119,7 +119,7 @@ class Ftp implements Serverinterface
}
else
{
- $options = array();
+ $options = [];
}
// get ftp object
if (isset($host) && $host != 'HOSTNAME' &&
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Utilities/ArrayHelper.php b/libraries/jcb_powers/VDM.Joomla/src/Utilities/ArrayHelper.php
index 135629a82..70cc939c8 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Utilities/ArrayHelper.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Utilities/ArrayHelper.php
@@ -30,14 +30,14 @@ abstract class ArrayHelper
*/
public static function check($array, $removeEmptyString = false)
{
- if (is_array($array) && ($nr = count((array)$array)) > 0)
+ if (is_array($array) && ($nr = count((array) $array)) > 0)
{
// also make sure the empty strings are removed
if ($removeEmptyString)
{
$array = array_filter($array);
- if (empty($array))
+ if ($array === [])
{
return false;
}
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Utilities/FileHelper.php b/libraries/jcb_powers/VDM.Joomla/src/Utilities/FileHelper.php
index a0bbf09f5..1385775dd 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Utilities/FileHelper.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Utilities/FileHelper.php
@@ -48,7 +48,7 @@ abstract class FileHelper
*
* @since 3.0.9
*/
- public static function zip($workingDirectory, &$filepath)
+ public static function zip($workingDirectory, &$filepath): bool
{
// store the current joomla working directory
$joomla = getcwd();
@@ -65,11 +65,11 @@ abstract class FileHelper
// get a list of files in the current directory tree (also the hidden files)
$files = Folder::files('.', '', true, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX'), array('.*~'));
- $zipArray = array();
+ $zipArray = [];
// setup the zip array
foreach ($files as $file)
{
- $tmp = array();
+ $tmp = [];
$tmp['name'] = str_replace('./', '', (string) $file);
$tmp['data'] = self::getContent($file);
$tmp['time'] = filemtime($file);
@@ -80,15 +80,10 @@ abstract class FileHelper
chdir($joomla);
// get the zip adapter
- $adapter = new Archive();
- $zip = $adapter->getAdapter('zip');
+ $zip = (new Archive())->getAdapter('zip');
//create the zip file
- if ($zip->create($filepath, $zipArray))
- {
- return true;
- }
- return false;
+ return (bool) $zip->create($filepath, $zipArray);
}
/**
@@ -116,7 +111,7 @@ abstract class FileHelper
// start curl
$ch = curl_init();
// set the options
- $options = array();
+ $options = [];
$options[CURLOPT_URL] = $path;
$options[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12';
$options[CURLOPT_RETURNTRANSFER] = TRUE;
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Utilities/JsonHelper.php b/libraries/jcb_powers/VDM.Joomla/src/Utilities/JsonHelper.php
index ea90e7ee8..47fbd243f 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Utilities/JsonHelper.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Utilities/JsonHelper.php
@@ -67,7 +67,7 @@ abstract class JsonHelper
{
if (StringHelper::check($table))
{
- $names = array();
+ $names = [];
foreach ($result as $val)
{
if ($external)
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Utilities/String/ClassfunctionHelper.php b/libraries/jcb_powers/VDM.Joomla/src/Utilities/String/ClassfunctionHelper.php
index 06fce0964..42d21af3e 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Utilities/String/ClassfunctionHelper.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Utilities/String/ClassfunctionHelper.php
@@ -31,7 +31,7 @@ abstract class ClassfunctionHelper
*
* @since 3.0.9
*/
- public static function safe($name)
+ public static function safe($name): string
{
// remove numbers if the first character is a number
if (is_numeric(substr((string) $name, 0, 1)))
diff --git a/libraries/jcb_powers/VDM.Joomla/src/Utilities/StringHelper.php b/libraries/jcb_powers/VDM.Joomla/src/Utilities/StringHelper.php
index 95a7b47f5..1e3d7b966 100644
--- a/libraries/jcb_powers/VDM.Joomla/src/Utilities/StringHelper.php
+++ b/libraries/jcb_powers/VDM.Joomla/src/Utilities/StringHelper.php
@@ -399,7 +399,7 @@ abstract class StringHelper
public static function random($size): string
{
$bag = "abcefghijknopqrstuwxyzABCDDEFGHIJKLLMMNOPQRSTUVVWXYZabcddefghijkllmmnopqrstuvvwxyzABCEFGHIJKNOPQRSTUWXYZ";
- $key = array();
+ $key = [];
$bagsize = strlen($bag) - 1;
for ($i = 0; $i < $size; $i++)
diff --git a/libraries/jcb_powers/VDM.Minify/src/Abstraction/Minify.php b/libraries/jcb_powers/VDM.Minify/src/Abstraction/Minify.php
index e6e92b50b..23a9a450b 100644
--- a/libraries/jcb_powers/VDM.Minify/src/Abstraction/Minify.php
+++ b/libraries/jcb_powers/VDM.Minify/src/Abstraction/Minify.php
@@ -32,14 +32,14 @@ abstract class Minify
*
* @var string[]
*/
- protected $data = array();
+ protected $data = [];
/**
* Array of patterns to match.
*
* @var string[]
*/
- protected $patterns = array();
+ protected $patterns = [];
/**
* This array will hold content of strings and regular expressions that have
@@ -50,7 +50,7 @@ abstract class Minify
*
* @var string[]
*/
- public $extracted = array();
+ public $extracted = [];
/**
* Init the minify class - optionally, code may be passed along already.
@@ -279,7 +279,7 @@ abstract class Minify
$output = '';
$processedOffset = 0;
$positions = array_fill(0, count($this->patterns), -1);
- $matches = array();
+ $matches = [];
while ($processedOffset < $contentLength) {
// find first match for all patterns
@@ -435,7 +435,7 @@ abstract class Minify
$content = strtr($content, $this->extracted);
- $this->extracted = array();
+ $this->extracted = [];
return $content;
}
diff --git a/libraries/jcb_powers/VDM.Minify/src/Css.php b/libraries/jcb_powers/VDM.Minify/src/Css.php
index c08265b8f..baee09933 100644
--- a/libraries/jcb_powers/VDM.Minify/src/Css.php
+++ b/libraries/jcb_powers/VDM.Minify/src/Css.php
@@ -171,15 +171,15 @@ class Css extends Minify
);
// find all relative imports in css
- $matches = array();
+ $matches = [];
foreach ($importRegexes as $importRegex) {
if (preg_match_all($importRegex, $content, $regexMatches, PREG_SET_ORDER)) {
$matches = [...$matches, ...$regexMatches];
}
}
- $search = array();
- $replace = array();
+ $search = [];
+ $replace = [];
// loop the matches
foreach ($matches as $match) {
@@ -234,8 +234,8 @@ class Css extends Minify
{
$regex = '/url\((["\']?)(.+?)\\1\)/i';
if ($this->importExtensions && preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) {
- $search = array();
- $replace = array();
+ $search = [];
+ $replace = [];
// loop the matches
foreach ($matches as $match) {
@@ -277,7 +277,7 @@ class Css extends Minify
*
* @return string The minified data
*/
- public function execute($path = null, $parents = array())
+ public function execute($path = null, $parents = [])
{
$content = '';
@@ -387,15 +387,15 @@ class Css extends Minify
);
// find all relative urls in css
- $matches = array();
+ $matches = [];
foreach ($relativeRegexes as $relativeRegex) {
if (preg_match_all($relativeRegex, $content, $regexMatches, PREG_SET_ORDER)) {
$matches = [...$matches, ...$regexMatches];
}
}
- $search = array();
- $replace = array();
+ $search = [];
+ $replace = [];
// loop all urls
foreach ($matches as $match) {
diff --git a/libraries/jcb_powers/VDM.Minify/src/Path/Converter.php b/libraries/jcb_powers/VDM.Minify/src/Path/Converter.php
index 1667ed8fa..c965c9009 100644
--- a/libraries/jcb_powers/VDM.Minify/src/Path/Converter.php
+++ b/libraries/jcb_powers/VDM.Minify/src/Path/Converter.php
@@ -114,10 +114,10 @@ class Converter implements ConverterInterface
// $path could theoretically be empty (e.g. no path is given), in which
// case it shouldn't expand to array(''), which would compare to one's
// root /
- $path1 = $path1 ? explode('/', $path1) : array();
- $path2 = $path2 ? explode('/', $path2) : array();
+ $path1 = $path1 ? explode('/', $path1) : [];
+ $path2 = $path2 ? explode('/', $path2) : [];
- $shared = array();
+ $shared = [];
// compare paths & strip identical ancestors
foreach ($path1 as $i => $chunk) {
diff --git a/site/language/en-GB/en-GB.com_componentbuilder.ini b/site/language/en-GB/en-GB.com_componentbuilder.ini
index 385c5ef8c..b77d528f4 100644
--- a/site/language/en-GB/en-GB.com_componentbuilder.ini
+++ b/site/language/en-GB/en-GB.com_componentbuilder.ini
@@ -3,6 +3,7 @@ COM_COMPONENTBUILDER_ACCESS_DENIED="Access denied!"
COM_COMPONENTBUILDER_ALL_UNSAVED_WORK_ON_THIS_PAGE_WILL_BE_LOST_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE="All unsaved work on this page will be lost, are you sure you want to continue?"
COM_COMPONENTBUILDER_API="Api"
COM_COMPONENTBUILDER_API_DESC="Sync Portal API"
+COM_COMPONENTBUILDER_A_METHOD_SETDYNAMICFZEROLDTHREERS_WAS_ADDED_TO_THE_INSTALL_BSCRIPTPHPB_OF_THIS_PACKAGE_TO_INSURE_THAT_THE_FOLDERS_ARE_COPIED_INTO_THE_CORRECT_PLACE_WHEN_THIS_COMPONENT_IS_INSTALLED="A method (setDynamicF0ld3rs) was added to the install script.php of this package to insure that the folder(s) are copied into the correct place when this component is installed!"
COM_COMPONENTBUILDER_BACKUP_FAILED_PLEASE_TRY_AGAIN_IF_THE_ERROR_CONTINUE_PLEASE_CONTACT_YOUR_SYSTEM_ADMINISTRATOR="Backup failed, please try again. If the error continue, please contact your system administrator."
COM_COMPONENTBUILDER_BACKUP_WAS_DONE_SUCCESSFULLY="Backup was done successfully"
COM_COMPONENTBUILDER_BE_CAUTIOUS_DO_NOT_CONTINUE_UNLESS_YOU_TRUST_THE_ORIGIN_OF_THIS_PACKAGE="Be cautious! Do not continue unless you trust the origin of this package!"
@@ -43,6 +44,7 @@ COM_COMPONENTBUILDER_GREAT_THIS_PLACEHOLDER_WILL_WORK="Great, this placeholder w
COM_COMPONENTBUILDER_HFOUR_CLASSNAVHEADERCOPYRIGHTHFOURPSP="%s
"
COM_COMPONENTBUILDER_HFOUR_CLASSNAVHEADERLICENSEHFOURPSP="%s
"
COM_COMPONENTBUILDER_HR_HTHREECUSTOM_CODES_WARNINGHTHREE="
Custom Codes Warning
"
+COM_COMPONENTBUILDER_HR_HTHREEDYNAMIC_FOLDERS_WERE_DETECTEDHTHREE="
Dynamic folder(s) were detected.
"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_ERRORHTHREE="
External Code Error
"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_NOTICEHTHREE="
External Code Notice
"
COM_COMPONENTBUILDER_HR_HTHREEEXTERNAL_CODE_WARNINGHTHREE="
External Code Warning
"