');
$ui->assign("error_title", "PHPNuxBill Crash");
$ui->display('router-error.tpl');
+ Message::sendTelegram(
+ "Sistem Error.\n" .
+ $e->getMessage() . "\n" .
+ $e->getTraceAsString()
+ );
die();
}
diff --git a/system/composer.json b/system/composer.json
index 9bded243..2fa24fc3 100644
--- a/system/composer.json
+++ b/system/composer.json
@@ -1,6 +1,6 @@
{
"require": {
"mpdf/mpdf": "^8.1",
- "smarty/smarty": "^4.3"
+ "smarty/smarty": "=4.5.3"
}
}
diff --git a/system/composer.lock b/system/composer.lock
index 40d0cae7..9eb75f04 100644
--- a/system/composer.lock
+++ b/system/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "81c1d3c4b2673fdd2922ac32768d59f1",
+ "content-hash": "a33a5e0440af423877195440decefd29",
"packages": [
{
"name": "mpdf/mpdf",
@@ -413,16 +413,16 @@
},
{
"name": "smarty/smarty",
- "version": "v4.3.1",
+ "version": "v4.5.3",
"source": {
"type": "git",
"url": "https://github.com/smarty-php/smarty.git",
- "reference": "e28cb0915b4e3749bf57d4ebae2984e25395cfe5"
+ "reference": "9fc96a13dbaf546c3d7bcf95466726578cd4e0fa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/smarty-php/smarty/zipball/e28cb0915b4e3749bf57d4ebae2984e25395cfe5",
- "reference": "e28cb0915b4e3749bf57d4ebae2984e25395cfe5",
+ "url": "https://api.github.com/repos/smarty-php/smarty/zipball/9fc96a13dbaf546c3d7bcf95466726578cd4e0fa",
+ "reference": "9fc96a13dbaf546c3d7bcf95466726578cd4e0fa",
"shasum": ""
},
"require": {
@@ -473,9 +473,9 @@
"support": {
"forum": "https://github.com/smarty-php/smarty/discussions",
"issues": "https://github.com/smarty-php/smarty/issues",
- "source": "https://github.com/smarty-php/smarty/tree/v4.3.1"
+ "source": "https://github.com/smarty-php/smarty/tree/v4.5.3"
},
- "time": "2023-03-28T19:47:03+00:00"
+ "time": "2024-05-28T21:46:01+00:00"
}
],
"packages-dev": [],
@@ -486,5 +486,5 @@
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
- "plugin-api-version": "2.3.0"
+ "plugin-api-version": "2.6.0"
}
diff --git a/system/lan/english.json b/system/lan/english.json
index 5197bd84..d327f961 100644
--- a/system/lan/english.json
+++ b/system/lan/english.json
@@ -623,5 +623,13 @@
"Tax_Rates_in_percentage": "Tax Rates in percentage",
"Custom_Tax_Rate": "Custom Tax Rate",
"Enter_Custom_Tax_Rate": "Enter Custom Tax Rate",
- "Enter_the_custom_tax_rate__e_g___3_75_for_3_75__": "Enter the custom tax rate (e.g., 3.75 for 3.75%)"
+ "Enter_the_custom_tax_rate__e_g___3_75_for_3_75__": "Enter the custom tax rate (e.g., 3.75 for 3.75%)",
+ "Additional_Information": "Additional Information",
+ "City_of_Resident": "City of Resident",
+ "District": "District",
+ "State": "State",
+ "State_of_Resident": "State of Resident",
+ "Zip": "Zip",
+ "Zip_Code": "Zip Code",
+ "": ""
}
\ No newline at end of file
diff --git a/system/vendor/composer/ClassLoader.php b/system/vendor/composer/ClassLoader.php
index a72151c7..7824d8f7 100644
--- a/system/vendor/composer/ClassLoader.php
+++ b/system/vendor/composer/ClassLoader.php
@@ -45,35 +45,34 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
- /** @var ?string */
+ /** @var string|null */
private $vendorDir;
// PSR-4
/**
- * @var array[]
- * @psalm-var array>
+ * @var array>
*/
private $prefixLengthsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array>
+ * @var array>
*/
private $prefixDirsPsr4 = array();
/**
- * @var array[]
- * @psalm-var array
+ * @var list
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
- * @var array[]
- * @psalm-var array>
+ * List of PSR-0 prefixes
+ *
+ * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+ *
+ * @var array>>
*/
private $prefixesPsr0 = array();
/**
- * @var array[]
- * @psalm-var array
+ * @var list
*/
private $fallbackDirsPsr0 = array();
@@ -81,8 +80,7 @@ class ClassLoader
private $useIncludePath = false;
/**
- * @var string[]
- * @psalm-var array
+ * @var array
*/
private $classMap = array();
@@ -90,21 +88,20 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
- * @var bool[]
- * @psalm-var array
+ * @var array
*/
private $missingClasses = array();
- /** @var ?string */
+ /** @var string|null */
private $apcuPrefix;
/**
- * @var self[]
+ * @var array
*/
private static $registeredLoaders = array();
/**
- * @param ?string $vendorDir
+ * @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -113,7 +110,7 @@ class ClassLoader
}
/**
- * @return string[]
+ * @return array>
*/
public function getPrefixes()
{
@@ -125,8 +122,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array>
+ * @return array>
*/
public function getPrefixesPsr4()
{
@@ -134,8 +130,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array
+ * @return list
*/
public function getFallbackDirs()
{
@@ -143,8 +138,7 @@ class ClassLoader
}
/**
- * @return array[]
- * @psalm-return array
+ * @return list
*/
public function getFallbackDirsPsr4()
{
@@ -152,8 +146,7 @@ class ClassLoader
}
/**
- * @return string[] Array of classname => path
- * @psalm-return array
+ * @return array Array of classname => path
*/
public function getClassMap()
{
@@ -161,8 +154,7 @@ class ClassLoader
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array $classMap
+ * @param array $classMap Class to filename map
*
* @return void
*/
@@ -179,24 +171,25 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix
+ * @param list|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
- (array) $paths
+ $paths
);
}
@@ -205,19 +198,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+ $this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -226,9 +219,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -236,17 +229,18 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
+ $paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
- (array) $paths,
+ $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
- (array) $paths
+ $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -256,18 +250,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ $this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
- (array) $paths,
+ $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
- (array) $paths
+ $paths
);
}
}
@@ -276,8 +270,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
+ * @param string $prefix The prefix
+ * @param list|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -294,8 +288,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param list|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -481,9 +475,9 @@ class ClassLoader
}
/**
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ * Returns the currently registered loaders keyed by their corresponding vendor directories.
*
- * @return self[]
+ * @return array
*/
public static function getRegisteredLoaders()
{
diff --git a/system/vendor/composer/installed.json b/system/vendor/composer/installed.json
index 4ddb3d37..087d088d 100644
--- a/system/vendor/composer/installed.json
+++ b/system/vendor/composer/installed.json
@@ -428,17 +428,17 @@
},
{
"name": "smarty/smarty",
- "version": "v4.3.1",
- "version_normalized": "4.3.1.0",
+ "version": "v4.5.3",
+ "version_normalized": "4.5.3.0",
"source": {
"type": "git",
"url": "https://github.com/smarty-php/smarty.git",
- "reference": "e28cb0915b4e3749bf57d4ebae2984e25395cfe5"
+ "reference": "9fc96a13dbaf546c3d7bcf95466726578cd4e0fa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/smarty-php/smarty/zipball/e28cb0915b4e3749bf57d4ebae2984e25395cfe5",
- "reference": "e28cb0915b4e3749bf57d4ebae2984e25395cfe5",
+ "url": "https://api.github.com/repos/smarty-php/smarty/zipball/9fc96a13dbaf546c3d7bcf95466726578cd4e0fa",
+ "reference": "9fc96a13dbaf546c3d7bcf95466726578cd4e0fa",
"shasum": ""
},
"require": {
@@ -448,7 +448,7 @@
"phpunit/phpunit": "^8.5 || ^7.5",
"smarty/smarty-lexer": "^3.1"
},
- "time": "2023-03-28T19:47:03+00:00",
+ "time": "2024-05-28T21:46:01+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -491,7 +491,7 @@
"support": {
"forum": "https://github.com/smarty-php/smarty/discussions",
"issues": "https://github.com/smarty-php/smarty/issues",
- "source": "https://github.com/smarty-php/smarty/tree/v4.3.1"
+ "source": "https://github.com/smarty-php/smarty/tree/v4.5.3"
},
"install-path": "../smarty/smarty"
}
diff --git a/system/vendor/composer/installed.php b/system/vendor/composer/installed.php
index ab5d60c4..6375d41a 100644
--- a/system/vendor/composer/installed.php
+++ b/system/vendor/composer/installed.php
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => '54ec065e9828504253781c3720f0dabece50aa35',
+ 'reference' => 'a9c0e955937e3ccb2ff050c71b77353b298a982b',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'reference' => '54ec065e9828504253781c3720f0dabece50aa35',
+ 'reference' => 'a9c0e955937e3ccb2ff050c71b77353b298a982b',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -83,9 +83,9 @@
'dev_requirement' => false,
),
'smarty/smarty' => array(
- 'pretty_version' => 'v4.3.1',
- 'version' => '4.3.1.0',
- 'reference' => 'e28cb0915b4e3749bf57d4ebae2984e25395cfe5',
+ 'pretty_version' => 'v4.5.3',
+ 'version' => '4.5.3.0',
+ 'reference' => '9fc96a13dbaf546c3d7bcf95466726578cd4e0fa',
'type' => 'library',
'install_path' => __DIR__ . '/../smarty/smarty',
'aliases' => array(),
diff --git a/system/vendor/smarty/smarty/CHANGELOG.md b/system/vendor/smarty/smarty/CHANGELOG.md
new file mode 100644
index 00000000..97355b6d
--- /dev/null
+++ b/system/vendor/smarty/smarty/CHANGELOG.md
@@ -0,0 +1,3625 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+## [4.5.3] - 2024-05-28
+- Fixed a code injection vulnerability in extends-tag. This addresses CVE-2024-35226.
+
+
+## [4.5.2] - 2024-04-06
+- Fixed argument must be passed by reference error introduced in v4.5.1 [#964](https://github.com/smarty-php/smarty/issues/964)
+
+## [4.5.1] - 2024-03-18
+- Using unregistered static class methods in expressions now also triggers a deprecation notice because we will drop support for this in the next major release [#813](https://github.com/smarty-php/smarty/issues/813)
+
+## [4.5.0] - 2024-03-18
+- (this release accidentally didn't contain any changes, fixed in 4.5.1)
+
+## [4.4.1] - 2024-02-26
+- Fixed internal release-tooling
+
+## [4.4.0] - 2024-02-26
+- Using the `|implode`, `|json_encode` and `|substr` modifiers does not generate a deprecation warning anymore as they will continue to be supported in v5 [#939](https://github.com/smarty-php/smarty/issues/939)
+
+### Added
+- PHP8.3 support [#925](https://github.com/smarty-php/smarty/issues/925)
+
+### Fixed
+- Incorrect compilation of expressions when escape_html=true [#930](https://github.com/smarty-php/smarty/pull/930)
+
+## [4.3.4] - 2023-09-14
+
+## [4.3.3] - 2023-09-14
+
+### Fixed
+- `|strip_tags` does not work if the input is 0 [#890](https://github.com/smarty-php/smarty/issues/890)
+- Use of negative numbers in {math} equations [#895](https://github.com/smarty-php/smarty/issues/895)
+
+## [4.3.2] - 2023-07-19
+
+### Fixed
+- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP8 warnings for undefined properties
+
+## [4.3.1] - 2023-03-28
+
+### Security
+- Fixed Cross site scripting vulnerability in Javascript escaping. This addresses CVE-2023-28447.
+
+### Fixed
+- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP7 notices for undefined array indexes [#736](https://github.com/smarty-php/smarty/issues/736)
+- `$smarty->muteUndefinedOrNullWarnings()` now treats undefined vars and array access of a null or false variables
+ equivalent across all supported PHP versions
+- `$smarty->muteUndefinedOrNullWarnings()` now allows dereferencing of non-objects across all supported PHP versions [#831](https://github.com/smarty-php/smarty/issues/831)
+- PHP 8.1 deprecation warnings on null strings in modifiers [#834](https://github.com/smarty-php/smarty/pull/834)
+
+## [4.3.0] - 2022-11-22
+
+### Added
+- PHP8.2 compatibility [#775](https://github.com/smarty-php/smarty/pull/775)
+
+### Changed
+- Include docs and demo in the releases [#799](https://github.com/smarty-php/smarty/issues/799)
+- Using PHP functions as modifiers now triggers a deprecation notice because we will drop support for this in the next major release [#813](https://github.com/smarty-php/smarty/issues/813)
+- Dropped remaining references to removed PHP-support in Smarty 4 from docs, lexer and security class. [#816](https://github.com/smarty-php/smarty/issues/816)
+- Support umask when writing (template) files and set dir permissions to 777 [#548](https://github.com/smarty-php/smarty/issues/548) [#819](https://github.com/smarty-php/smarty/issues/819)
+
+### Fixed
+- Output buffer is now cleaned for internal PHP errors as well, not just for Exceptions [#514](https://github.com/smarty-php/smarty/issues/514)
+- Fixed recursion and out of memory errors when caching in complicated template set-ups using inheritance and includes [#801](https://github.com/smarty-php/smarty/pull/801)
+- Fixed PHP8.1 deprecation errors in strip_tags
+- Fix Variable Usage in Exception message when unable to load subtemplate [#808](https://github.com/smarty-php/smarty/pull/808)
+- Fixed PHP8.1 deprecation notices for strftime [#672](https://github.com/smarty-php/smarty/issues/672)
+- Fixed PHP8.1 deprecation errors passing null to parameter in trim [#807](https://github.com/smarty-php/smarty/pull/807)
+- Adapt Smarty upper/lower functions to be codesafe (e.g. for Turkish locale) [#586](https://github.com/smarty-php/smarty/pull/586)
+- Bug fix for underscore and limited length in template name in custom resources [#581](https://github.com/smarty-php/smarty/pull/581)
+
+## [4.2.1] - 2022-09-14
+
+### Security
+- Applied appropriate javascript and html escaping in mailto plugin to counter injection attacks [#454](https://github.com/smarty-php/smarty/issues/454)
+
+### Fixed
+- Fixed PHP8.1 deprecation notices in modifiers (upper, explode, number_format and replace) [#755](https://github.com/smarty-php/smarty/pull/755) and [#788](https://github.com/smarty-php/smarty/pull/788)
+- Fixed PHP8.1 deprecation notices in capitalize modifier [#789](https://github.com/smarty-php/smarty/issues/789)
+- Fixed use of `rand()` without a parameter in math function [#794](https://github.com/smarty-php/smarty/issues/794)
+- Fixed unselected year/month/day not working in html_select_date [#395](https://github.com/smarty-php/smarty/issues/395)
+
+## [4.2.0] - 2022-08-01
+
+### Fixed
+- Fixed problems with smarty_mb_str_replace [#549](https://github.com/smarty-php/smarty/issues/549)
+- Fixed second parameter of unescape modifier not working [#777](https://github.com/smarty-php/smarty/issues/777)
+
+### Changed
+- Updated HTML of the debug template [#599](https://github.com/smarty-php/smarty/pull/599)
+
+## [4.1.1] - 2022-05-17
+
+### Security
+- Prevent PHP injection through malicious block name or include file name. This addresses CVE-2022-29221
+
+### Fixed
+- Exclude docs and demo from export and composer [#751](https://github.com/smarty-php/smarty/pull/751)
+- PHP 8.1 deprecation notices in demo/plugins/cacheresource.pdo.php [#706](https://github.com/smarty-php/smarty/issues/706)
+- PHP 8.1 deprecation notices in truncate modifier [#699](https://github.com/smarty-php/smarty/issues/699)
+- Math equation `max(x, y)` didn't work anymore [#721](https://github.com/smarty-php/smarty/issues/721)
+- Fix PHP 8.1 deprecated warning when calling rtrim [#743](https://github.com/smarty-php/smarty/pull/743)
+- PHP 8.1: fix deprecation in escape modifier [#727](https://github.com/smarty-php/smarty/pull/727)
+
+## [4.1.0] - 2022-02-06
+
+### Added
+- PHP8.1 compatibility [#713](https://github.com/smarty-php/smarty/pull/713)
+
+## [4.0.4] - 2022-01-18
+
+### Fixed
+- Fixed illegal characters bug in math function security check [#702](https://github.com/smarty-php/smarty/issues/702)
+
+## [4.0.3] - 2022-01-10
+
+### Security
+- Prevent evasion of the `static_classes` security policy. This addresses CVE-2021-21408
+
+## [4.0.2] - 2022-01-10
+
+### Security
+- Prevent arbitrary PHP code execution through maliciously crafted expression for the math function. This addresses CVE-2021-29454
+
+## [4.0.1] - 2022-01-09
+
+### Security
+- Rewrote the mailto function to not use `eval` when encoding with javascript
+
+## [4.0.0] - 2021-11-25
+
+## [4.0.0-rc.0] - 2021-10-13
+
+### Added
+- You can now use `$smarty->muteUndefinedOrNullWarnings()` to activate convert warnings about undefined or null template vars to notices when running PHP8
+
+### Changed
+- Switch CI from Travis to Github CI
+- Updated unit tests to avoid skipped and risky test warnings
+
+### Removed
+- Dropped support for PHP7.0 and below, so Smarty now requires PHP >=7.1
+- Dropped support for php asp tags in templates (removed from php since php7.0)
+- Dropped deprecated API calls that where only accessible through SmartyBC
+- Dropped support for {php} and {include_php} tags and embedded PHP in templates. Embedded PHP will now be passed through as is.
+- Removed all PHP_VERSION_ID and compare_version checks and conditional code blocks that are now no longer required
+- Dropped deprecated SMARTY_RESOURCE_CHAR_SET and SMARTY_RESOURCE_DATE_FORMAT constants
+- Dropped deprecated Smarty::muteExpectedErrors and Smarty::unmuteExpectedErrors API methods
+- Dropped deprecated $smarty->getVariable() method. Use $smarty->getTemplateVars() instead.
+- $smarty->registerResource() no longer accepts an array of callback functions
+
+## [3.1.40] - 2021-10-13
+
+### Changed
+- modifier escape now triggers a E_USER_NOTICE when an unsupported escape type is used https://github.com/smarty-php/smarty/pull/649
+
+### Security
+- More advanced javascript escaping to handle https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements thanks to m-haritonov
+
+## [3.1.39] - 2021-02-17
+
+### Security
+- Prevent access to `$smarty.template_object` in sandbox mode. This addresses CVE-2021-26119.
+- Fixed code injection vulnerability by using illegal function names in `{function name='blah'}{/function}`. This addresses CVE-2021-26120.
+
+## [3.1.38] - 2021-01-08
+
+### Fixed
+- Smarty::SMARTY_VERSION wasn't updated https://github.com/smarty-php/smarty/issues/628
+
+## [3.1.37] - 2021-01-07
+
+### Changed
+- Changed error handlers and handling of undefined constants for php8-compatibility (set $errcontext argument optional) https://github.com/smarty-php/smarty/issues/605
+- Changed expected error levels in unit tests for php8-compatibility
+- Travis unit tests now run for all php versions >= 5.3, including php8
+- Travis runs on Xenial where possible
+
+### Fixed
+- PHP5.3 compatibility fixes
+- Brought lexer source functionally up-to-date with compiled version
+
+## [3.1.36] - 2020-04-14
+
+### Fixed
+ - Smarty::SMARTY_VERSION wasn't updated in v3.1.35 https://github.com/smarty-php/smarty/issues/584
+
+## [3.1.35] - 2020-04-14
+ - remove whitespaces after comments https://github.com/smarty-php/smarty/issues/447
+ - fix foreachelse on arrayiterators https://github.com/smarty-php/smarty/issues/506
+ - fix files contained in git export archive for package maintainers https://github.com/smarty-php/smarty/issues/325
+ - throw SmartyException when setting caching attributes for cacheable plugin https://github.com/smarty-php/smarty/issues/457
+ - fix errors that occured where isset was replaced with null check such as https://github.com/smarty-php/smarty/issues/453
+ - unit tests are now in the repository
+
+## 3.1.34 release - 05.11.2019
+13.01.2020
+ - fix typo in exception message (JercSi)
+ - fix typehint warning with callable (bets4breakfast)
+ - add travis badge and compatability info to readme (matks)
+ - fix stdClass cast when compiling foreach (carpii)
+ - fix wrong set/get methods for memcached (IT-Experte)
+ - fix pborm assigning value to object variables in smarty_internal_compile_assign (Hunman)
+ - exclude error_reporting.ini from git export (glensc)
+
+## 3.1.34-dev-6 -
+30.10.2018
+ - bugfix a nested subblock in an inheritance child template was not replace by
+ outer level block with same name in same child template https://github.com/smarty-php/smarty/issues/500
+
+29.10.2018
+ - bugfix Smarty::$php_handling == PHP_PASSTHRU (default) did eat the "\n" (newline) character if it did directly followed
+ a PHP tag like "?>" or other https://github.com/smarty-php/smarty/issues/501
+
+14.10.2018
+ - bugfix autoloader exit shortcut https://github.com/smarty-php/smarty/issues/467
+
+11.10.2018
+ - bugfix {insert} not works when caching is enabled and included template is present
+ https://github.com/smarty-php/smarty/issues/496
+ - bugfix in date-format modifier; NULL at date string or default_date did not produce correct output
+ https://github.com/smarty-php/smarty/pull/458
+
+09.10.2018
+ - bugfix fix of 26.8.2017 https://github.com/smarty-php/smarty/issues/327
+ modifier is applied to sum expression https://github.com/smarty-php/smarty/issues/491
+ - bugfix indexed arrays could not be defined "array(...)""
+
+18.09.2018
+ - bugfix large plain text template sections without a Smarty tag > 700kB could
+ could fail in version 3.1.32 and 3.1.33 because PHP preg_match() restrictions
+ https://github.com/smarty-php/smarty/issues/488
+
+## 3.1.33 release - 12.09.2018
+## 3.1.33-dev-12 -
+03.09.2018
+ - bugfix {foreach} using new style property access like {$item@property} on
+ Smarty 2 style named foreach loop could produce errors https://github.com/smarty-php/smarty/issues/484
+
+31.08.2018
+ - bugfix some custom left and right delimiters like '{^' '^}' did not work
+ https://github.com/smarty-php/smarty/issues/450 https://github.com/smarty-php/smarty/pull/482
+
+ - reformating for PSR-2 coding standards https://github.com/smarty-php/smarty/pull/483
+
+ - bugfix on Windows absolute filepathes did fail if the drive letter was followed by a linux DIRECTORY_SEPARATOR
+ like C:/ at Smarty > 3.1.33-dev-5 https://github.com/smarty-php/smarty/issues/451
+
+ - PSR-2 code style fixes for config and template file Lexer/Parser generated with
+ the Smarty Lexer/Parser generator from https://github.com/smarty-php/smarty-lexer
+ https://github.com/smarty-php/smarty/pull/483
+
+26.08.2018
+ - bugfix/enhancement {capture} allow variable as capture block name in Smarty special variable
+ like $smarty.capture.$foo https://github.com/smarty-php/smarty/issues/478 https://github.com/smarty-php/smarty/pull/481
+
+## 3.1.33-dev-6 -
+19.08.2018
+ - fix PSR-2 coding standards and PHPDoc blocks https://github.com/smarty-php/smarty/pull/452
+ https://github.com/smarty-php/smarty/pull/475
+ https://github.com/smarty-php/smarty/pull/473
+ - bugfix PHP5.2 compatibility https://github.com/smarty-php/smarty/pull/472
+
+## 3.1.33-dev-4 -
+17.05.2018
+ - bugfix strip-block produces different output in Smarty v3.1.32 https://github.com/smarty-php/smarty/issues/436
+ - bugfix Smarty::compileAllTemplates ignores `$extension` parameter https://github.com/smarty-php/smarty/issues/437
+ https://github.com/smarty-php/smarty/pull/438
+ - improvement do not compute total property in {foreach} if not needed https://github.com/smarty-php/smarty/issues/443
+ - bugfix plugins may not be loaded when setMergeCompiledIncludes is true https://github.com/smarty-php/smarty/issues/435
+
+26.04.2018
+ - bugfix regarding Security Vulnerability did not solve the problem under Linux.
+ Security issue CVE-2018-16831
+
+## 3.1.32 - (24.04.2018)
+24.04.2018
+ - bugfix possible Security Vulnerability in Smarty_Security class.
+
+26.03.2018
+ - bugfix plugins may not be loaded if {function} or {block} tags are executed in nocache mode
+ https://github.com/smarty-php/smarty/issues/371
+
+26.03.2018
+ - new feature {parent} = {$smarty.block.parent} {child} = {$smarty.block.child}
+
+23.03.2018
+ - bugfix preg_replace could fail on large content resulting in a blank page https://github.com/smarty-php/smarty/issues/417
+
+21.03.2018
+ - bugfix {$smarty.section...} used outside {section}{/section} showed incorrect values if {section}{/section} was called inside
+ another loop https://github.com/smarty-php/smarty/issues/422
+ - bugfix short form of {section} attributes did not work https://github.com/smarty-php/smarty/issues/428
+
+17.03.2018
+ - improvement Smarty::compileAllTemplates() exit with a non-zero status code if max errors is reached https://github.com/smarty-php/smarty/pull/402
+
+16.03.2018
+ - bugfix extends resource did not work with user defined left/right delimiter https://github.com/smarty-php/smarty/issues/419
+
+22.11.2017
+ - bugfix {break} and {continue} could fail if {foreach}{/foreach} did contain other
+ looping tags like {for}, {section} and {while} https://github.com/smarty-php/smarty/issues/323
+
+20.11.2017
+ - bugfix rework of newline spacing between tag code and template text.
+ now again identical with Smarty2 (forum topic 26878)
+ - replacement of " by '
+
+05.11.2017
+ - lexer/parser optimization
+ - code cleanup and optimizations
+ - bugfix {$smarty.section.name.loop} used together with {$smarty.section.name.total} could produce
+ wrong results (forum topic 27041)
+
+26.10.2017
+ - bugfix Smarty version was not filled in header comment of compiled and cached files
+ - optimization replace internal Smarty::$ds property by DIRECTORY_SEPARATOR
+ - deprecate functions Smarty::muteExpectedErrors() and Smarty::unmuteExpectedErrors()
+ as Smarty does no longer use error suppression like @filemtime().
+ for backward compatibility code is moved from Smarty class to an external class and still can be
+ called.
+ - correction of PHPDoc blocks
+ - minor code cleanup
+
+21.10.2017
+ - bugfix custom delimiters could fail since modification of version 3.1.32-dev-23
+ https://github.com/smarty-php/smarty/issues/394
+
+18.10.2017
+ - bugfix fix implementation of unclosed block tag in double quoted string of 12.10.2017
+ https://github.com/smarty-php/smarty/issues/396 https://github.com/smarty-php/smarty/issues/397
+ https://github.com/smarty-php/smarty/issues/391 https://github.com/smarty-php/smarty/issues/392
+
+12.10.2017
+ - bugfix $smarty.block.child and $smarty.block.parent could not be used like any
+ $smarty special variable https://github.com/smarty-php/smarty/issues/393
+ - unclosed block tag in double quoted string must throw compiler exception.
+ https://github.com/smarty-php/smarty/issues/391 https://github.com/smarty-php/smarty/issues/392
+
+07.10.2017
+ - bugfix modification of 9.8.2017 did fail on some recursive
+ tag nesting. https://github.com/smarty-php/smarty/issues/389
+
+26.8.2017
+ - bugfix chained modifier failed when last modifier parameter is a signed value
+ https://github.com/smarty-php/smarty/issues/327
+ - bugfix templates filepath with multibyte characters did not work
+ https://github.com/smarty-php/smarty/issues/385
+ - bugfix {make_nocache} did display code if the template did not contain other nocache code
+ https://github.com/smarty-php/smarty/issues/369
+
+09.8.2017
+ - improvement repeated delimiter like {{ and }} will be treated as literal
+ https://groups.google.com/forum/#!topic/smarty-developers/h9r82Bx4KZw
+
+05.8.2017
+ - bugfix wordwrap modifier could fail if used in nocache code.
+ converted plugin file shared.mb_wordwrap.php into modifier.mb_wordwrap.php
+ - cleanup of _getSmartyObj()
+
+31.7.2017
+ - Call clearstatcache() after mkdir() failure https://github.com/smarty-php/smarty/pull/379
+
+30.7.2017
+ - rewrite mkdir() bugfix to retry automatically see https://github.com/smarty-php/smarty/pull/377
+ https://github.com/smarty-php/smarty/pull/379
+
+21.7.2017
+ - security possible PHP code injection on custom resources at display() or fetch()
+ calls if the resource does not sanitize the template name
+ - bugfix fix 'mkdir(): File exists' error on create directory from parallel
+ processes https://github.com/smarty-php/smarty/pull/377
+ - bugfix solve preg_match() hhvm parameter problem https://github.com/smarty-php/smarty/pull/372
+
+27.5.2017
+ - bugfix change compiled code for registered function and modifiers to called as callable to allow closures
+ https://github.com/smarty-php/smarty/pull/368, https://github.com/smarty-php/smarty/issues/273
+ - bugfix https://github.com/smarty-php/smarty/pull/368 did break the default plugin handler
+ - improvement replace phpversion() by PHP_VERSION constant.
+ https://github.com/smarty-php/smarty/pull/363
+
+21.5.2017
+ - performance store flag for already required shared plugin functions in static variable or
+ Smarty's $_cache to improve performance when plugins are often called
+ https://github.com/smarty-php/smarty/commit/51e0d5cd405d764a4ea257d1bac1fb1205f74528#commitcomment-22280086
+ - bugfix remove special treatment of classes implementing ArrayAccess in {foreach}
+ https://github.com/smarty-php/smarty/issues/332
+ - bugfix remove deleted files by clear_cache() and clear_compiled_template() from
+ ACP cache if present, add some is_file() checks to avoid possible warnings on filemtime()
+ caused by above functions.
+ https://github.com/smarty-php/smarty/issues/341
+ - bugfix version 3.1.31 did fail under PHP 5.2
+ https://github.com/smarty-php/smarty/issues/365
+
+19.5.2017
+ - change properties $accessMap and $obsoleteProperties from private to protected
+ https://github.com/smarty-php/smarty/issues/351
+ - new feature The named capture buffers can now be accessed also as array
+ See NEWS_FEATURES.txt https://github.com/smarty-php/smarty/issues/366
+ - improvement check if ini_get() and ini_set() not disabled
+ https://github.com/smarty-php/smarty/pull/362
+
+24.4.2017
+ - fix spelling https://github.com/smarty-php/smarty/commit/e3eda8a5f5653d8abb960eb1bc47e3eca679b1b4#commitcomment-21803095
+
+17.4.2017
+ - correct generated code on empty() and isset() call, observe change PHP behaviour since PHP 5.5
+ https://github.com/smarty-php/smarty/issues/347
+
+14.4.2017
+ - merge pull requests https://github.com/smarty-php/smarty/pull/349, https://github.com/smarty-php/smarty/pull/322 and https://github.com/smarty-php/smarty/pull/337 to fix spelling and annotation
+
+13.4.2017
+ - bugfix array_merge() parameter should be checked https://github.com/smarty-php/smarty/issues/350
+
+## 3.1.31 - (14.12.2016)
+ 23.11.2016
+ - move template object cache into static variables
+
+ 19.11.2016
+ - bugfix inheritance root child templates containing nested {block}{/block} could call sub-bock content from parent
+ template https://github.com/smarty-php/smarty/issues/317
+ - change version checking
+
+ 11.11.2016
+ - bugfix when Smarty is using a cached template object on Smarty::fetch() or Smarty::isCached() the inheritance data
+ must be removed https://github.com/smarty-php/smarty/issues/312
+ - smaller speed optimization
+
+ 08.11.2016
+ - add bootstrap file to load and register Smarty_Autoloader. Change composer.json to make it known to composer
+
+ 07.11.2016
+ - optimization of lexer speed https://github.com/smarty-php/smarty/issues/311
+
+ 27.10.2016
+ - bugfix template function definitions array has not been cached between Smarty::fetch() and Smarty::display() calls
+ https://github.com/smarty-php/smarty/issues/301
+
+ 23.10.2016
+ - improvement/bugfix when Smarty::fetch() is called on a template object the inheritance and tplFunctions property
+ should be copied to the called template object
+
+ 21.10.2016
+ - bugfix for compile locking touched timestamp of old compiled file was not restored on compilation error https://github.com/smarty-php/smarty/issues/308
+
+ 20.10.2016
+ - bugfix nocache code was not removed in cache file when subtemplate did contain PHP short tags in text but no other
+ nocache code https://github.com/smarty-php/smarty/issues/300
+
+ 19.10.2016
+ - bugfix {make_nocache $var} did fail when variable value did contain '\' https://github.com/smarty-php/smarty/issues/305
+ - bugfix {make_nocache $var} remove spaces from variable value https://github.com/smarty-php/smarty/issues/304
+
+ 12.10.2016
+ - bugfix {include} with template names including variable or constants could fail after bugfix from
+ 28.09.2016 https://github.com/smarty-php/smarty/issues/302
+
+ 08.10.2016
+ - optimization move runtime extension for template functions into Smarty objects
+
+ 29.09.2016
+ - improvement new Smarty::$extends_recursion property to disable execution of {extends} in templates called by extends resource
+ https://github.com/smarty-php/smarty/issues/296
+
+ 28.09.2016
+ - bugfix the generated code for calling a subtemplate must pass the template resource name in single quotes https://github.com/smarty-php/smarty/issues/299
+ - bugfix nocache hash was not removed for tags in subtemplates https://github.com/smarty-php/smarty/issues/300
+
+ 27.09.2016
+ - bugfix when Smarty does use an internally cached template object on Smarty::fetch() calls
+ the template and config variables must be cleared https://github.com/smarty-php/smarty/issues/297
+
+ 20.09.2016
+ - bugfix some $smarty special template variables are no longer accessed as real variable.
+ using them on calls like {if isset($smarty.foo)} or {if empty($smarty.foo)} will fail
+ http://www.smarty.net/forums/viewtopic.php?t=26222
+ - temporary fix for https://github.com/smarty-php/smarty/issues/293 main reason still under investigation
+ - improvement new tags {block_parent} {block_child} in template inheritance
+
+ 19.09.2016
+ - optimization clear compiled and cached folder completely on detected version change
+ - cleanup convert cache resource file method clear into runtime extension
+
+ 15.09.2016
+ - bugfix assigning a variable in if condition by function like {if $value = array_shift($array)} the function got called twice https://github.com/smarty-php/smarty/issues/291
+ - bugfix function plugins called with assign attribute like {foo assign='bar'} did not output returned content because
+ because assumption was made that it was assigned to a variable https://github.com/smarty-php/smarty/issues/292
+ - bugfix calling $smarty->isCached() on a not existing cache file with $smarty->cache_locking = true; could cause a 10 second delay http://www.smarty.net/forums/viewtopic.php?t=26282
+ - improvement make Smarty::clearCompiledTemplate() on custom resource independent from changes of templateId computation
+
+ 11.09.2016
+ - improvement {math} misleading E_USER_WARNING messages when parameter value = null https://github.com/smarty-php/smarty/issues/288
+ - improvement move often used code snippets into methods
+ - performance Smarty::configLoad() did load unneeded template source object
+
+ 09.09.2016
+ - bugfix/optimization {foreach} did not execute the {foreachelse} when iterating empty objects https://github.com/smarty-php/smarty/pull/287
+ - bugfix {foreach} must keep the @properties when restoring a saved $item variable as the properties might be used outside {foreach} https://github.com/smarty-php/smarty/issues/267
+ - improvement {foreach} observe {break n} and {continue n} nesting levels when restoring saved $item and $key variables
+
+ 08.09.2016
+ - bugfix implement wrapper for removed method getConfigVariable() https://github.com/smarty-php/smarty/issues/286
+
+ 07.09.2016
+ - bugfix using nocache like attribute with value true like {plugin nocache=true} did not work https://github.com/smarty-php/smarty/issues/285
+ - bugfix uppercase TRUE, FALSE and NULL did not work when security was enabled https://github.com/smarty-php/smarty/issues/282
+ - bugfix when {foreach} was looping over an object the total property like {$item@total} did always return 1 https://github.com/smarty-php/smarty/issues/281
+ - bugfix {capture}{/capture} did add in 3.1.30 unintended additional blank lines https://github.com/smarty-php/smarty/issues/268
+
+ 01.09.2016
+ - performance require_once should be called only once for shared plugins https://github.com/smarty-php/smarty/issues/280
+
+ 26.08.2016
+ - bugfix change of 23.08.2016 failed on linux when use_include_path = true
+
+ 23.08.2016
+ - bugfix remove constant DS as shortcut for DIRECTORY_SEPARATOR as the user may have defined it to something else https://github.com/smarty-php/smarty/issues/277
+
+ 20.08-2016
+ - bugfix {config_load ... scope="global"} shall not throw an arror but fallback to scope="smarty" https://github.com/smarty-php/smarty/issues/274
+ - bugfix {make_nocache} failed when using composer autoloader https://github.com/smarty-php/smarty/issues/275
+
+ 14.08.2016
+ - bugfix $smarty_>debugging = true; did E_NOTICE messages when {eval} tag was used https://github.com/smarty-php/smarty/issues/266
+ - bugfix Class 'Smarty_Internal_Runtime_ValidateCompiled' not found when upgrading from some older Smarty versions with existing
+ compiled or cached template files https://github.com/smarty-php/smarty/issues/269
+ - optimization remove unneeded call to update acopes when {assign} scope and template scope was local (default)
+
+## 3.1.30 - (07.08.2016)
+
+ 07.08.2016
+ - bugfix update of 04.08.2016 was incomplete
+
+ 05.08.2016
+ - bugfix compiling of templates failed when the Smarty delimiter did contain '/' https://github.com/smarty-php/smarty/issues/264
+ - updated error checking at template and config default handler
+
+ 04.08.2016
+ - improvement move template function source parameter into extension
+
+ 26.07.2016
+ - optimization unneeded loading of compiled resource
+
+ 24.07.2016
+ - regression this->addPluginsDir('/abs/path/to/dir') adding absolute path without trailing '/' did fail https://github.com/smarty-php/smarty/issues/260
+
+ 23.07.2016
+ - bugfix setTemplateDir('/') and setTemplateDir('') did create wrong absolute filepath https://github.com/smarty-php/smarty/issues/245
+ - optimization of filepath normalization
+ - improvement remove double function declaration in plugin shared.escape_special_cars.php https://github.com/smarty-php/smarty/issues/229
+
+ 19.07.2016
+ - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246
+ - bugfix {math} shell injection vulnerability patch provided by Tim Weber
+
+ 18.07.2016
+ - bugfix {foreach} if key variable and item@key attribute have been used both the key variable was not updated https://github.com/smarty-php/smarty/issues/254
+ - bugfix modifier on plugins like {plugin|modifier ... } did fail when the plugin does return an array https://github.com/smarty-php/smarty/issues/228
+ - bugfix avoid opcache_invalidate to result in ErrorException when opcache.restrict_api is not empty https://github.com/smarty-php/smarty/pull/244
+ - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246
+
+ 14.07.2016
+ - bugfix wrong parameter on compileAllTemplates() and compileAllConfig() https://github.com/smarty-php/smarty/issues/231
+
+ 13.07.2016
+ - bugfix PHP 7 compatibility on registered compiler plugins https://github.com/smarty-php/smarty/issues/241
+ - update testInstall() https://github.com/smarty-php/smarty/issues/248https://github.com/smarty-php/smarty/issues/248
+ - bugfix enable debugging could fail when template objects did already exists https://github.com/smarty-php/smarty/issues/237
+ - bugfix template function data should be merged when loading subtemplate https://github.com/smarty-php/smarty/issues/240
+ - bugfix wrong parameter on compileAllTemplates() https://github.com/smarty-php/smarty/issues/231
+
+ 12.07.2016
+ - bugfix {foreach} item variable must be created also on empty from array https://github.com/smarty-php/smarty/issues/238 and https://github.com/smarty-php/smarty/issues/239
+ - bugfix enableSecurity() must init cache flags https://github.com/smarty-php/smarty/issues/247
+
+ 27.05.2016
+ - bugfix/improvement of compileAlltemplates() follow symlinks in template folder (PHP >= 5.3.1) https://github.com/smarty-php/smarty/issues/224
+ clear internal cache and expension handler for each template to avoid possible conflicts https://github.com/smarty-php/smarty/issues/231
+
+ 16.05.2016
+ - optimization {foreach} compiler and processing
+ - broken PHP 5.3 and 5.4 compatibility
+
+ 15.05.2016
+ - optimization and cleanup of resource code
+
+ 10.05.2016
+ - optimization of inheritance processing
+
+ 07.05.2016
+ -bugfix Only variables should be assigned by reference https://github.com/smarty-php/smarty/issues/227
+
+ 02.05.2016
+ - enhancement {block} tag names can now be variable https://github.com/smarty-php/smarty/issues/221
+
+ 01.05.2016
+ - bugfix same relative filepath at {include} called from template in different folders could display wrong sub-template
+
+ 29.04.2016
+ - bugfix {strip} remove space on linebreak between html tags https://github.com/smarty-php/smarty/issues/213
+
+ 24.04.2016
+ - bugfix nested {include} with relative file path could fail when called in {block} ... {/block} https://github.com/smarty-php/smarty/issues/218
+
+ 14.04.2016
+ - bugfix special variable {$smarty.capture.name} was not case sensitive on name https://github.com/smarty-php/smarty/issues/210
+ - bugfix the default template handler must calculate the source uid https://github.com/smarty-php/smarty/issues/205
+
+ 13.04.2016
+ - bugfix template inheritance status must be saved when calling sub-templates https://github.com/smarty-php/smarty/issues/215
+
+ 27.03.2016
+ - bugfix change of 11.03.2016 cause again {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153
+
+ 11.03.2016
+ - optimization of capture and security handling
+ - improvement $smarty->clearCompiledTemplate() should return on recompiled or uncompiled resources
+
+ 10.03.2016
+ - optimization of resource processing
+
+ 09.03.2016
+ - improvement rework of 'scope' attribute handling see see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/194
+ https://github.com/smarty-php/smarty/issues/186 https://github.com/smarty-php/smarty/issues/179
+ - bugfix correct Autoloader update of 2.3.2014 https://github.com/smarty-php/smarty/issues/199
+
+ 04.03.2016
+ - bugfix change from 01.03.2016 will cause $smarty->isCached(..) failure if called multiple time for same template
+ (forum topic 25935)
+
+ 02.03.2016
+ - revert autoloader optimizations because of unexplainable warning when using plugins https://github.com/smarty-php/smarty/issues/199
+
+ 01.03.2016
+ - bugfix template objects must be cached on $smarty->fetch('foo.tpl) calls incase the template is fetched
+ multiple times (forum topic 25909)
+
+ 25.02.2016
+ - bugfix wrong _realpath with 4 or more parent-directories https://github.com/smarty-php/smarty/issues/190
+ - optimization of _realpath
+ - bugfix instanceof expression in template code must be treated as value https://github.com/smarty-php/smarty/issues/191
+
+ 20.02.2016
+ - bugfix {strip} must keep space between hmtl tags. Broken by changes of 10.2.2016 https://github.com/smarty-php/smarty/issues/184
+ - new feature/bugfix {foreach}{section} add 'properties' attribute to force compilation of loop properties
+ see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/189
+
+ 19.02.2016
+ - revert output buffer flushing on display, echo content again because possible problems when PHP files had
+ characters (newline} after ?> at file end https://github.com/smarty-php/smarty/issues/187
+
+ 14.02.2016
+ - new tag {make_nocache} read NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/110
+ - optimization of sub-template processing
+ - bugfix using extendsall as default resource and {include} inside {block} tags could produce unexpected results https://github.com/smarty-php/smarty/issues/183
+ - optimization of tag attribute compiling
+ - optimization make compiler tag object cache static for higher compilation speed
+
+ 11.02.2016
+ - improvement added KnockoutJS comments to trimwhitespace outputfilter https://github.com/smarty-php/smarty/issues/82
+ https://github.com/smarty-php/smarty/pull/181
+
+ 10.02.2016
+ - bugfix {strip} must keep space on output creating smarty tags within html tags https://github.com/smarty-php/smarty/issues/177
+ - bugfix wrong precedence on special if conditions like '$foo is ... by $bar' could cause wrong code https://github.com/smarty-php/smarty/issues/178
+ - improvement because of ambiguities the inline constant support has been removed from the $foo.bar syntax https://github.com/smarty-php/smarty/issues/149
+ - bugfix other {strip} error with output tags between hmtl https://github.com/smarty-php/smarty/issues/180
+
+ 09.02.2016
+ - move some code from parser into compiler
+ - reformat all code for unique style
+ - update/bugfix scope attribute handling reworked. Read the newfeatures.txt file
+
+ 05.02.2016
+ - improvement internal compiler changes
+
+ 01.02.2016
+ - bugfix {foreach} compilation failed when $smarty->merge_compiled_includes = true and pre-filters are used.
+
+ 29.01.2016
+ - bugfix implement replacement code for _tag_stack property https://github.com/smarty-php/smarty/issues/151
+
+ 28.01.2016
+ - bugfix allow windows network filepath or wrapper (forum topic 25876) https://github.com/smarty-php/smarty/issues/170
+ - bugfix if fetch('foo.tpl') is called on a template object the $parent parameter should default to the calling template object https://github.com/smarty-php/smarty/issues/152
+
+ 27.01.2016
+ - revert bugfix compiling {section} did create warning
+ - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161
+ update of yesterdays fix
+ - bugfix string resource could inject code at {block} or inline subtemplates through PHP comments https://github.com/smarty-php/smarty/issues/157
+ - bugfix output filters did not observe nocache code flhttps://github.com/smarty-php/smarty/issues/154g https://github.com/smarty-php/smarty/issues/160
+ - bugfix {extends} with relative file path did not work https://github.com/smarty-php/smarty/issues/154
+ https://github.com/smarty-php/smarty/issues/158
+ - bugfix {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153
+
+ 26.01.2016
+ - improvement observe Smarty::$_CHARSET in debugging console https://github.com/smarty-php/smarty/issues/169
+ - bugfix compiling {section} did create warning
+ - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161
+
+ 02.01.2016
+ - update scope handling
+ - optimize block plugin compiler
+ - improvement runtime checks if registered block plugins are callable
+
+ 01.01.2016
+ - remove Smarty::$resource_cache_mode property
+
+ 31.12.2015
+ - optimization of {assign}, {if} and {while} compiled code
+
+ 30.12.2015
+ - bugfix plugin names starting with "php" did not compile https://github.com/smarty-php/smarty/issues/147
+
+ 29.12.2015
+ - bugfix Smarty::error_reporting was not observed when display() or fetch() was called on template objects https://github.com/smarty-php/smarty/issues/145
+
+ 28.12.2015
+ - optimization of {foreach} code size and processing
+
+ 27.12.2015
+ - improve inheritance code
+ - update external methods
+ - code fixes
+ - PHPdoc updates
+
+ 25.12.2015
+ - compile {block} tag code and its processing into classes
+ - optimization replace hhvm extension by inline code
+ - new feature If ACP is enabled force an apc_compile_file() when compiled or cached template was updated
+
+ 24.12.2015
+ - new feature Compiler does now observe the template_dir setting and will create separate compiled files if required
+ - bugfix post filter did fail on template inheritance https://github.com/smarty-php/smarty/issues/144
+
+ 23.12.2015
+ - optimization move internal method decodeProperties back into template object
+ - optimization move subtemplate processing back into template object
+ - new feature Caching does now observe the template_dir setting and will create separate cache files if required
+
+ 22.12.2015
+ - change $xxx_dir properties from private to protected in case Smarty class gets extended
+ - code optimizations
+
+ 21.12.2015
+ - bugfix a filepath starting with '/' or '\' on windows should normalize to the root dir
+ of current working drive https://github.com/smarty-php/smarty/issues/134
+ - optimization of filepath normalization
+ - bugfix {strip} must remove all blanks between html tags https://github.com/smarty-php/smarty/issues/136
+
+ - 3.1.29 - (21.12.2015)
+ 21.12.2015
+ - optimization improve speed of filetime checks on extends and extendsall resource
+
+ 20.12.2015
+ - bugfix failure when the default resource type was set to 'extendsall' https://github.com/smarty-php/smarty/issues/123
+ - update compilation of Smarty special variables
+ - bugfix add addition check for OS type on normalization of file path https://github.com/smarty-php/smarty/issues/134
+ - bugfix the source uid of the extendsall resource must contain $template_dir settings https://github.com/smarty-php/smarty/issues/123
+
+ 19.12.2015
+ - bugfix using $smarty.capture.foo in expressions could fail https://github.com/smarty-php/smarty/pull/138
+ - bugfix broken PHP 5.2 compatibility https://github.com/smarty-php/smarty/issues/139
+ - remove no longer used code
+ - improvement make sure that compiled and cache templates never can contain a trailing '?>?
+
+ 18.12.2015
+ - bugfix regression when modifier parameter was followed by math https://github.com/smarty-php/smarty/issues/132
+
+ 17.12.2015
+ - bugfix {$smarty.capture.nameFail} did lowercase capture name https://github.com/smarty-php/smarty/issues/135
+ - bugfix using {block append/prepend} on same block in multiple levels of inheritance templates could fail (forum topic 25827)
+ - bugfix text content consisting of just a single '0' like in {if true}0{/if} was suppressed (forum topic 25834)
+
+ 16.12.2015
+ - bugfix {foreach} did fail if from atrribute is a Generator class https://github.com/smarty-php/smarty/issues/128
+ - bugfix direct access $smarty->template_dir = 'foo'; should call Smarty::setTemplateDir() https://github.com/smarty-php/smarty/issues/121
+
+ 15.12.2015
+ - bugfix {$smarty.cookies.foo} did return the $_COOKIE array not the 'foo' value https://github.com/smarty-php/smarty/issues/122
+ - bugfix a call to clearAllCache() and other should clear all internal template object caches (forum topic 25828)
+
+ 14.12.2015
+ - bugfix {$smarty.config.foo} broken in 3.1.28 https://github.com/smarty-php/smarty/issues/120
+ - bugfix multiple calls of {section} with same name droped E_NOTICE error https://github.com/smarty-php/smarty/issues/118
+
+ - 3.1.28 - (13.12.2015)
+ 13.12.2015
+ - bugfix {foreach} and {section} with uppercase characters in name attribute did not work (forum topic 25819)
+ - bugfix $smarty->debugging_ctrl = 'URL' did not work (forum topic 25811)
+ - bugfix Debug Console could display incorrect data when using subtemplates
+
+ 09.12.2015
+ - bugfix Smarty did fail under PHP 7.0.0 with use_include_path = true;
+
+ 09.12.2015
+ - bugfix {strip} should exclude some html tags from stripping, related to fix for https://github.com/smarty-php/smarty/issues/111
+
+ 08.12.2015
+ - bugfix internal template function data got stored in wrong compiled file https://github.com/smarty-php/smarty/issues/114
+
+ 05.12.2015
+ -bugfix {strip} should insert a single space https://github.com/smarty-php/smarty/issues/111
+
+ 25.11.2015
+ -bugfix a left delimter like '[%' did fail on [%$var_[%$variable%]%] (forum topic 25798)
+
+ 02.11.2015
+ - bugfix {include} with variable file name like {include file="foo_`$bar`.tpl"} did fail in 3.1.28-dev https://github.com/smarty-php/smarty/issues/102
+
+ 01.11.2015
+ - update config file processing
+
+ 31.10.2015
+ - bugfix add missing $trusted_dir property to SmartyBC class (forum topic 25751)
+
+ 29.10.2015
+ - improve template scope handling
+
+ 24.10.2015
+ - more optimizations of template processing
+ - bugfix Error when using {include} within {capture} https://github.com/smarty-php/smarty/issues/100
+
+ 21.10.2015
+ - move some code into runtime extensions
+
+ 18.10.2015
+ - optimize filepath normalization
+ - rework of template inheritance
+ - speed and size optimizations
+ - bugfix under HHVM temporary cache file must only be created when caches template was updated
+ - fix compiled code for new {block} assign attribute
+ - update code generated by template function call handler
+
+ 18.09.2015
+ - bugfix {if $foo instanceof $bar} failed to compile if 2nd value is a variable https://github.com/smarty-php/smarty/issues/92
+
+ 17.09.2015
+ - bugfix {foreach} first attribute was not correctly reset since commit 05a8fa2 of 02.08.2015 https://github.com/smarty-php/smarty/issues/90
+
+ 16.09.2015
+ - update compiler by moving no longer needed properties, code optimizations and other
+
+ 14.09.2015
+ - optimize autoloader
+ - optimize subtemplate handling
+ - update template inheritance processing
+ - move code of {call} processing back into Smarty_Internal_Template class
+ - improvement invalidate OPCACHE for cleared compiled and cached template files (forum topic 25557)
+ - bugfix unintended multiple debug windows (forum topic 25699)
+
+ 30.08.2015
+ - size optimization move some runtime functions into extension
+ - optimize inline template processing
+ - optimization merge inheritance child and parent templates into one compiled template file
+
+ 29.08.2015
+ - improvement convert template inheritance into runtime processing
+ - bugfix {$smarty.block.parent} did always reference the root parent block https://github.com/smarty-php/smarty/issues/68
+
+ 23.08.2015
+ - introduce Smarty::$resource_cache_mode and cache template object of {include} inside loop
+ - load seldom used Smarty API methods dynamically to reduce memory footprint
+ - cache template object of {include} if same template is included several times
+ - convert debug console processing to object
+ - use output buffers for better performance and less memory usage
+ - optimize nocache hash processing
+ - remove not really needed properties
+ - optimize rendering
+ - move caching to Smarty::_cache
+ - remove properties with redundant content
+ - optimize Smarty::templateExists()
+ - optimize use_include_path processing
+ - relocate properties for size optimization
+ - remove redundant code
+ - bugfix compiling super globals like {$smarty.get.foo} did fail in the master branch https://github.com/smarty-php/smarty/issues/77
+
+ 06.08.2015
+ - avoid possible circular object references caused by parser/lexer objects
+ - rewrite compileAll... utility methods
+ - commit several internal improvements
+ - bugfix Smarty failed when compile_id did contain "|"
+
+ 03.08.2015
+ - rework clear cache methods
+ - bugfix compileAllConfig() was broken since 3.1.22 because of the changes in config file processing
+ - improve getIncludePath() to return directory if no file was given
+
+ 02.08.2015
+ - optimization and code cleanup of {foreach} and {section} compiler
+ - rework {capture} compiler
+
+ 01.08.2015
+ - update DateTime object can be instance of DateTimeImmutable since PHP5.5 https://github.com/smarty-php/smarty/pull/75
+ - improvement show resource type and start of template source instead of uid on eval: and string: resource (forum topic 25630)
+
+ 31.07.2015
+ - optimize {foreach} and {section} compiler
+
+ 29.07.2015
+ - optimize {section} compiler for speed and size of compiled code
+
+ 28.07.2015
+ - update for PHP 7 compatibility
+
+ 26.07.2015
+ - improvement impement workaround for HHVM PHP incompatibillity https://github.com/facebook/hhvm/issues/4797
+
+ 25.07.2015
+ - bugfix parser did hang on text starting fetch('foo.tpl') https://github.com/smarty-php/smarty/issues/70
+ - improvement Added $limit parameter to regex_replace modifier #71
+ - new feature multiple indices on file: resource
+
+ 06.07.2015
+ - optimize {block} compilation
+ - optimization get rid of __get and __set in source object
+
+ 01.07.2015
+ - optimize compile check handling
+ - update {foreach} compiler
+ - bugfix debugging console did not display string values containing \n, \r or \t correctly https://github.com/smarty-php/smarty/issues/66
+ - optimize source resources
+
+ 28.06.2015
+ - move $smarty->enableSecurity() into Smarty_Security class
+ - optimize security isTrustedResourceDir()
+ - move auto load filter methods into extension
+ - move $smarty->getTemplateVars() into extension
+ - move getStreamVariable() into extension
+ - move $smarty->append() and $smarty->appendByRef() into extension
+ - optimize autoloader
+ - optimize file path normalization
+ - bugfix PATH_SEPARATOR was replaced by mistake in autoloader
+ - remove redundant code
+
+ 27.06.2015
+ - bugfix resolve naming conflict between custom Smarty delimiter '<%' and PHP ASP tags https://github.com/smarty-php/smarty/issues/64
+ - update $smarty->_realpath for relative path not starting with './'
+ - update Smarty security with new realpath handling
+ - update {include_php} with new realpath handling
+ - move $smarty->loadPlugin() into extension
+ - minor compiler optimizations
+ - bugfix allow function plugins with name ending with 'close' https://github.com/smarty-php/smarty/issues/52
+ - rework of $smarty->clearCompiledTemplate() and move it to its own extension
+
+ 19.06.2015
+ - improvement allow closures as callback at $smarty->registerFilter() https://github.com/smarty-php/smarty/issues/59
+
+ - 3.1.27- (18.06.2015)
+ 18.06.2015
+ - bugfix another update on file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56
+
+ - 3.1.26- (18.06.2015)
+ 18.06.2015
+ - bugfix file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56
+
+ 17.06.2015
+ - bugfix calling a plugin with nocache option but no other attributes like {foo nocache} caused call to undefined function https://github.com/smarty-php/smarty/issues/55
+
+ - 3.1.25- (15.06.2015)
+ 15.06.2015
+ - optimization of smarty_cachereource_keyvaluestore.php code
+
+ 14.06.2015
+ - bugfix a relative sub template path could fail if template_dir path did contain /../ https://github.com/smarty-php/smarty/issues/50
+ - optimization rework of path normalization
+ - bugfix an output tag with variable, modifier followed by an operator like {$foo|modifier+1} did fail https://github.com/smarty-php/smarty/issues/53
+
+ 13.06.2015
+ - bugfix a custom cache resource using smarty_cachereource_keyvaluestore.php did fail if php.ini mbstring.func_overload = 2 (forum topic 25568)
+
+ 11.06.2015
+ - bugfix the lexer could hang on very large quoted strings (forum topic 25570)
+
+ 08.06.2015
+ - bugfix using {$foo} as array index like $bar.{$foo} or in double quoted string like "some {$foo} thing" failed https://github.com/smarty-php/smarty/issues/49
+
+ 04.06.2015
+ - bugfix possible error message on unset() while compiling {block} tags https://github.com/smarty-php/smarty/issues/46
+
+ 01.06.2015
+ - bugfix including template variables broken since 3.1.22 https://github.com/smarty-php/smarty/issues/47
+
+ 27.05.2015
+ - bugfix {include} with variable file name must not create by default individual cache file (since 3.1.22) https://github.com/smarty-php/smarty/issues/43
+
+ 24.05.2015
+ - bugfix if condition string 'neq' broken due to a typo https://github.com/smarty-php/smarty/issues/42
+
+ - 3.1.24- (23.05.2015)
+ 23.05.2015
+ - improvement on php_handling to allow very large PHP sections, better error handling
+ - improvement allow extreme large comment sections (forum 25538)
+
+ 21.05.2015
+ - bugfix broken PHP 5.2 compatibility when compiling 1 did compile into wrong code https://github.com/smarty-php/smarty/issues/41
+
+ 19.05.2015
+ - bugfix compiler did overwrite existing variable value when setting the nocache attribute https://github.com/smarty-php/smarty/issues/39
+ - bugfix output filter trimwhitespace could run into the pcre.backtrack_limit on large output (code.google issue 220)
+ - bugfix compiler could run into the pcre.backtrack_limit on larger comment or {php} tag sections (forum 25538)
+
+ 18.05.2015
+ - improvement introduce shortcuts in lexer/parser rules for most frequent terms for higher
+ compilation speed
+
+ 16.05.2015
+ - bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33
+ - improvement remove not needed ?> handling from parser to new compiler module
+
+ 05.05.2015
+ - bugfix code could be messed up when {tags} are used in multiple attributes https://github.com/smarty-php/smarty/issues/23
+
+ 04.05.2015
+ - bugfix Smarty_Resource::parseResourceName incompatible with Google AppEngine (https://github.com/smarty-php/smarty/issues/22)
+ - improvement use is_file() checks to avoid errors suppressed by @ which could still cause problems (https://github.com/smarty-php/smarty/issues/24)
+
+ 28.04.2015
+ - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508) 2nd fix
+
+ 28.04.2015
+ - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508)
+
+ 23.04.2015
+ - bugfix a nocache template variable used as parameter at {insert} was by mistake cached
+
+ 20.04.2015
+ - bugfix at a template function containing nocache code a parmeter could overwrite a template variable of same name
+
+ 27.03.2015
+ - bugfix Smarty_Security->allow_constants=false; did also disable true, false and null (change of 16.03.2015)
+ - improvement added a whitelist for trusted constants to security Smarty_Security::$trusted_constants (forum topic 25471)
+
+ 20.03.2015
+ - bugfix make sure that function properties get saved only in compiled files containing the fuction definition {forum topic 25452}
+ - bugfix correct update of global variable values on exit of template functions. (reported under Smarty Developers)
+
+ 16.03.2015
+ - bugfix problems with {function}{/function} and {call} tags in different subtemplate cache files {forum topic 25452}
+ - bugfix Smarty_Security->allow_constants=false; did not disallow direct usage of defined constants like {SMARTY_DIR} {forum topic 25457}
+ - bugfix {block}{/block} tags did not work inside double quoted strings https://github.com/smarty-php/smarty/issues/18
+
+
+ 15.03.2015
+ - bugfix $smarty->compile_check must be restored before rendering of a just updated cache file {forum 25452}
+
+ 14.03.2015
+ - bugfix {nocache} {/nocache} tags corrupted code when used within a nocache section caused by a nocache template variable.
+
+ - bugfix template functions defined with {function} in an included subtemplate could not be called in nocache
+ mode with {call... nocache} if the subtemplate had it's own cache file {forum 25452}
+
+ 10.03.2015
+ - bugfix {include ... nocache} whith variable file or compile_id attribute was not executed in nocache mode.
+
+ 12.02.2015
+ - bugfix multiple Smarty::fetch() of same template when $smarty->merge_compiled_includes = true; could cause function already defined error
+
+ 11.02.2015
+ - bugfix recursive {includes} did create E_NOTICE message when $smarty->merge_compiled_includes = true; (github issue #16)
+
+ 22.01.2015
+ - new feature security can now control access to static methods and properties
+ see also NEW_FEATURES.txt
+
+ 21.01.2015
+ - bugfix clearCompiledTemplates(), clearAll() and clear() could try to delete whole drive at wrong path permissions because realpath() fail (forum 25397)
+ - bugfix 'self::' and 'parent::' was interpreted in template syntax as static class
+
+ 04.01.2015
+ - push last weeks changes to github
+
+ - different optimizations
+ - improvement automatically create different versions of compiled templates and config files depending
+ on property settings.
+ - optimization restructure template processing by moving code into classes it better belongs to
+ - optimization restructure config file processing
+
+ 31.12.2014
+ - bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING.
+ Function mb_split could be overloaded depending on php.ini mbstring.func_overload
+
+
+ 29.12.2014
+ - new feature security can now limit the template nesting level by property $max_template_nesting
+ see also NEW_FEATURES.txt (forum 25370)
+
+ 29.12.2014
+ - new feature security can now disable special $smarty variables listed in property $disabled_special_smarty_vars
+ see also NEW_FEATURES.txt (forum 25370)
+
+ 27.12.2014
+ - bugfix clear internal _is_file_cache when plugins_dir was modified
+
+ 13.12.2014
+ - improvement optimization of lexer and parser resulting in a up to 30% higher compiling speed
+
+ 11.12.2014
+ - bugfix resolve parser ambiguity between constant print tag {CONST} and other smarty tags after change of 09.12.2014
+
+ 09.12.2014
+ - bugfix variables $null, $true and $false did not work after the change of 12.11.2014 (forum 25342)
+ - bugfix call of template function by a variable name did not work after latest changes (forum 25342)
+
+ 23.11.2014
+ - bugfix a plugin with attached modifier could fail if the tag was immediately followed by another Smarty tag (since 3.1.21) (forum 25326)
+
+ 13.11.2014
+ - improvement move autoload code into Autoloader.php. Use Composer autoloader when possible
+
+ 12.11.2014
+ - new feature added support of namespaces to template code
+
+ 08.11.2014 - 10.11.2014
+ - bugfix subtemplate called in nocache mode could be called with wrong compile_id when it did change on one of the calling templates
+ - improvement add code of template functions called in nocache mode dynamically to cache file (related to bugfix of 01.11.2014)
+ - bugfix Debug Console did not include all data from merged compiled subtemplates
+
+ 04.11.2014
+ - new feature $smarty->debugging = true; => overwrite existing Debug Console window (old behaviour)
+ $smarty->debugging = 2; => individual Debug Console window by template name
+
+ 03.11.2014
+ - bugfix Debug Console did not show included subtemplates since 3.1.17 (forum 25301)
+ - bugfix Modifier debug_print_var did not limit recursion or prevent recursive object display at Debug Console
+ (ATTENTION: parameter order has changed to be able to specify maximum recursion)
+ - bugfix Debug consol did not include subtemplate information with $smarty->merge_compiled_includes = true
+ - improvement The template variables are no longer displayed as objects on the Debug Console
+ - improvement $smarty->createData($parent = null, $name = null) new optional name parameter for display at Debug Console
+ - addition of some hooks for future extension of Debug Console
+
+ 01.11.2014
+ - bugfix and enhancement on subtemplate {include} and template {function} tags.
+ * Calling a template which has a nocache section could fail if it was called from a cached and a not cached subtemplate.
+ * Calling the same subtemplate cached and not cached with the $smarty->merge_compiled_includes enabled could cause problems
+ * Many smaller related changes
+
+ 30.10.2014
+ - bugfix access to class constant by object like {$object::CONST} or variable class name {$class::CONST} did not work (forum 25301)
+
+ 26.10.2014
+ - bugfix E_NOTICE message was created during compilation when ASP tags '<%' or '%>' are in template source text
+ - bugfix merge_compiled_includes option failed when caching enables and same subtemplate was included cached and not cached
+
+ - 3.1.21 - (18.10.2014)
+ 18.10.2014
+ - composer moved to github
+
+ 17.10.2014
+ - bugfix on $php_handling security and optimization of smarty_internal_parsetree (Thue Kristensen)
+
+ 16.10.2014
+ - bugfix composer.json update
+
+ 15.10.2014
+ - bugfix calling a new created cache file with fetch() and Smarty::CACHING_LIFETIME_SAVED multiple times did fail (forum 22350)
+
+ 14.10.2014
+ - bugfix any tag placed within "
diff --git a/system/vendor/smarty/smarty/libs/plugins/function.math.php b/system/vendor/smarty/smarty/libs/plugins/function.math.php
index f9cf67fe..34912d23 100644
--- a/system/vendor/smarty/smarty/libs/plugins/function.math.php
+++ b/system/vendor/smarty/smarty/libs/plugins/function.math.php
@@ -67,7 +67,7 @@ function smarty_function_math($params, $template)
$equation = preg_replace('/\s+/', '', $equation);
// Adapted from https://www.php.net/manual/en/function.eval.php#107377
- $number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
+ $number = '-?(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functionsOrVars = '((?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))';
$operators = '[,+\/*\^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functionsOrVars.'|('.$functionsOrVars.'\s*\((?1)*\)|\((?1)*\)))(?:'.$operators.'(?1))?)+$/';
diff --git a/system/vendor/smarty/smarty/libs/plugins/modifier.implode.php b/system/vendor/smarty/smarty/libs/plugins/modifier.implode.php
new file mode 100644
index 00000000..679d71d7
--- /dev/null
+++ b/system/vendor/smarty/smarty/libs/plugins/modifier.implode.php
@@ -0,0 +1,15 @@
+]*?>!', ' ', {$params[0]} ?: '')";
+ return "preg_replace('!<[^>]*?>!', ' ', (string) {$params[0]})";
} else {
return 'strip_tags((string) ' . $params[ 0 ] . ')';
}
diff --git a/system/vendor/smarty/smarty/libs/plugins/modifiercompiler.substr.php b/system/vendor/smarty/smarty/libs/plugins/modifiercompiler.substr.php
new file mode 100644
index 00000000..17721f52
--- /dev/null
+++ b/system/vendor/smarty/smarty/libs/plugins/modifiercompiler.substr.php
@@ -0,0 +1,12 @@
+registerInit($compiler, true);
- $file = trim($_attr[ 'file' ], '\'"');
- if (strlen($file) > 8 && substr($file, 0, 8) === 'extends:') {
- // generate code for each template
- $files = array_reverse(explode('|', substr($file, 8)));
- $i = 0;
- foreach ($files as $file) {
- if ($file[ 0 ] === '"') {
- $file = trim($file, '".');
- } else {
- $file = "'{$file}'";
- }
- $i++;
- if ($i === count($files) && isset($_attr[ 'extends_resource' ])) {
- $this->compileEndChild($compiler);
- }
- $this->compileInclude($compiler, $file);
- }
- if (!isset($_attr[ 'extends_resource' ])) {
- $this->compileEndChild($compiler);
- }
- } else {
- $this->compileEndChild($compiler, $_attr[ 'file' ]);
- }
+ $this->compileEndChild($compiler, $_attr[ 'file' ]);
$compiler->has_code = false;
return '';
}
@@ -115,44 +93,4 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh
'') . ");\n?>"
);
}
-
- /**
- * Add code for including subtemplate to end of template
- *
- * @param \Smarty_Internal_TemplateCompilerBase $compiler
- * @param string $template subtemplate name
- *
- * @throws \SmartyCompilerException
- * @throws \SmartyException
- */
- private function compileInclude(Smarty_Internal_TemplateCompilerBase $compiler, $template)
- {
- $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag(
- $compiler->parser,
- $compiler->compileTag(
- 'include',
- array(
- $template,
- array('scope' => 'parent')
- )
- )
- );
- }
-
- /**
- * Create source code for {extends} from source components array
- *
- * @param \Smarty_Internal_Template $template
- *
- * @return string
- */
- public static function extendsSourceArrayCode(Smarty_Internal_Template $template)
- {
- $resources = array();
- foreach ($template->source->components as $source) {
- $resources[] = $source->resource;
- }
- return $template->smarty->left_delimiter . 'extends file=\'extends:' . join('|', $resources) .
- '\' extends_resource=true' . $template->smarty->right_delimiter;
- }
}
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
index aea082f0..31fd6e1d 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
@@ -109,9 +109,11 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
if (!is_object($compiler->smarty->security_policy)
|| $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)
) {
- trigger_error('Using php-function "' . $modifier . '" as a modifier is deprecated and will be ' .
- 'removed in a future release. Use Smarty::registerPlugin to explicitly register ' .
- 'a custom modifier.', E_USER_DEPRECATED);
+ if (!in_array($modifier, ['time', 'join', 'is_array', 'in_array'])) {
+ trigger_error('Using unregistered function "' . $modifier . '" in a template is deprecated and will be ' .
+ 'removed in a future release. Use Smarty::registerPlugin to explicitly register ' .
+ 'a custom modifier.', E_USER_DEPRECATED);
+ }
$output = "{$modifier}({$params})";
}
$compiler->known_modifier_type[ $modifier ] = $type;
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
index 96bd3724..78f1c076 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
@@ -93,7 +93,7 @@ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_C
}
// autoescape html
if ($compiler->template->smarty->escape_html) {
- $output = "htmlspecialchars((string) {$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')";
+ $output = "htmlspecialchars((string) ({$output}), ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')";
}
// loop over registered filters
if (!empty($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ])) {
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php
index 570819d2..da67904c 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php
@@ -238,9 +238,12 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
$_config_vars = $ptr->config_vars;
ksort($_config_vars);
$debugging = $smarty->debugging;
+ $templateName = $obj->source->type . ':' . $obj->source->name;
+ $displayMode = $debugging === 2 || !$full;
+ $offset = $this->offset * 50;
$_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj);
if ($obj->_isTplObj()) {
- $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
+ $_template->assign('template_name', $templateName);
}
if ($obj->_objType === 1 || $full) {
$_template->assign('template_data', $this->template_data[ $this->index ]);
@@ -250,8 +253,8 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data
$_template->assign('assigned_vars', $_assigned_vars);
$_template->assign('config_vars', $_config_vars);
$_template->assign('execution_time', microtime(true) - $smarty->start_time);
- $_template->assign('display_mode', $debugging === 2 || !$full);
- $_template->assign('offset', $this->offset * 50);
+ $_template->assign('targetWindow', $displayMode ? md5("$offset$templateName") : '__Smarty__');
+ $_template->assign('offset', $offset);
echo $_template->fetch();
if (isset($full)) {
$this->index--;
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php
index f57cc21f..4ddcfcd1 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php
@@ -17,6 +17,12 @@ class Smarty_Internal_ErrorHandler
*/
public $allowUndefinedVars = true;
+ /**
+ * Allows {$foo->propName} where propName is undefined.
+ * @var bool
+ */
+ public $allowUndefinedProperties = true;
+
/**
* Allows {$foo.bar} where bar is unset and {$foo.bar1.bar2} where either bar1 or bar2 is unset.
* @var bool
@@ -80,8 +86,15 @@ class Smarty_Internal_ErrorHandler
return; // suppresses this error
}
+ if ($this->allowUndefinedProperties && preg_match(
+ '/^(Undefined property)/',
+ $errstr
+ )) {
+ return; // suppresses this error
+ }
+
if ($this->allowUndefinedArrayKeys && preg_match(
- '/^(Undefined index|Undefined array key|Trying to access array offset on value of type)/',
+ '/^(Undefined index|Undefined array key|Trying to access array offset on)/',
$errstr
)) {
return; // suppresses this error
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
index d5c18d31..8ff3e052 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
@@ -455,15 +455,29 @@ abstract class Smarty_Internal_TemplateCompilerBase
$this->smarty->_current_file = $this->template->source->filepath;
// get template source
if (!empty($this->template->source->components)) {
- // we have array of inheritance templates by extends: resource
- // generate corresponding source code sequence
- $_content =
- Smarty_Internal_Compile_Extends::extendsSourceArrayCode($this->template);
+ $_compiled_code = '_loadInheritance(); $_smarty_tpl->inheritance->init($_smarty_tpl, true); ?>';
+
+ $i = 0;
+ $reversed_components = array_reverse($this->template->getSource()->components);
+ foreach ($reversed_components as $source) {
+ $i++;
+ if ($i === count($reversed_components)) {
+ $_compiled_code .= 'inheritance->endChild($_smarty_tpl); ?>';
+ }
+ $_compiled_code .= $this->compileTag(
+ 'include',
+ [
+ var_export($source->resource, true),
+ ['scope' => 'parent'],
+ ]
+ );
+ }
+ $_compiled_code = $this->postFilter($_compiled_code, $this->template);
} else {
// get template source
$_content = $this->template->source->getContent();
+ $_compiled_code = $this->postFilter($this->doCompile($this->preFilter($_content), true));
}
- $_compiled_code = $this->postFilter($this->doCompile($this->preFilter($_content), true));
if (!empty($this->required_plugins[ 'compiled' ]) || !empty($this->required_plugins[ 'nocache' ])) {
$_compiled_code = 'compileRequiredPlugins() . "?>\n" . $_compiled_code;
}
@@ -640,7 +654,18 @@ abstract class Smarty_Internal_TemplateCompilerBase
return $func_name . '(' . $parameter[ 0 ] . ')';
}
} else {
- return $name . '(' . implode(',', $parameter) . ')';
+
+ if (
+ !$this->smarty->loadPlugin('smarty_modifiercompiler_' . $name)
+ && !isset($this->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$name])
+ && !in_array($name, ['time', 'join', 'is_array', 'in_array'])
+ ) {
+ trigger_error('Using unregistered function "' . $name . '" in a template is deprecated and will be ' .
+ 'removed in a future release. Use Smarty::registerPlugin to explicitly register ' .
+ 'a custom modifier.', E_USER_DEPRECATED);
+ }
+
+ return $name . '(' . implode(',', $parameter) . ')';
}
} else {
$this->trigger_template_error("unknown function '{$name}'");
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php
index a2dd0d6f..c37d3c18 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php
@@ -2425,6 +2425,9 @@ public static $yy_action = array(
if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
$this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor].'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
} else {
+ trigger_error('Using unregistered static method "' . $this->yystack[$this->yyidx + -2]->minor.'::'.$this->yystack[$this->yyidx + 0]->minor[0] . '" in a template is deprecated and will be ' .
+ 'removed in a future release. Use Smarty::registerClass to explicitly register ' .
+ 'a class for access.', E_USER_DEPRECATED);
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
}
} else {
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_security.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_security.php
index 97cd0521..49ae2a38 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_security.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_security.php
@@ -253,7 +253,7 @@ class Smarty_Security
*
* @param string $function_name
* @param object $compiler compiler object
- *
+ * @deprecated
* @return boolean true if function is trusted
*/
public function isTrustedPhpFunction($function_name, $compiler)
diff --git a/system/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php b/system/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php
index 37d8f0a9..b78a3b60 100644
--- a/system/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php
+++ b/system/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php
@@ -85,7 +85,7 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
*
* @param Smarty_Internal_Template $_template
*
- * @return string
+ * @return void
* @throws Exception
*/
public function render(Smarty_Internal_Template $_template)
diff --git a/system/vendor/smarty/smarty/mkdocs.yml b/system/vendor/smarty/smarty/mkdocs.yml
new file mode 100644
index 00000000..66949b80
--- /dev/null
+++ b/system/vendor/smarty/smarty/mkdocs.yml
@@ -0,0 +1,125 @@
+site_name: Smarty Documentation
+theme:
+ name: material
+ palette:
+ primary: amber
+ features:
+ - content.code.copy
+ - navigation.tabs
+ - navigation.tabs.sticky
+ - navigation.instant
+ - navigation.tracking
+ icon:
+ logo: material/lightbulb-on
+ favicon: images/favicon.ico
+
+extra:
+ version:
+ provider: mike
+
+markdown_extensions:
+ - pymdownx.highlight:
+ anchor_linenums: true
+ - pymdownx.inlinehilite
+ - pymdownx.snippets
+ - pymdownx.superfences
+
+nav:
+ - Home: 'index.md'
+ - 'Getting started':
+ - Introduction: 'getting-started.md'
+ - 'Upgrading from an older version': 'upgrading.md'
+ - 'Designers':
+ - 'Basic Syntax':
+ - Introduction: 'designers/language-basic-syntax/index.md'
+ - Comments: 'designers/language-basic-syntax/language-syntax-comments.md'
+ - Variables: 'designers/language-basic-syntax/language-syntax-variables.md'
+ - Functions: 'designers/language-basic-syntax/language-syntax-functions.md'
+ - Attributes: 'designers/language-basic-syntax/language-syntax-attributes.md'
+ - Quotes: 'designers/language-basic-syntax/language-syntax-quotes.md'
+ - Math: 'designers/language-basic-syntax/language-math.md'
+ - 'Escaping Smarty parsing': 'designers/language-basic-syntax/language-escaping.md'
+ - 'Variables':
+ - 'Introduction': 'designers/language-variables/index.md'
+ - 'Assigned from PHP': 'designers/language-variables/language-assigned-variables.md'
+ - 'Variable scopes': 'designers/language-variables/language-variable-scopes.md'
+ - 'From config files': 'designers/language-variables/language-config-variables.md'
+ - '{$smarty}': 'designers/language-variables/language-variables-smarty.md'
+ - 'Modifiers':
+ - 'Introduction': 'designers/language-modifiers/index.md'
+ - 'capitalize': 'designers/language-modifiers/language-modifier-capitalize.md'
+ - 'cat': 'designers/language-modifiers/language-modifier-cat.md'
+ - 'count_characters': 'designers/language-modifiers/language-modifier-count-characters.md'
+ - 'count_paragraphs': 'designers/language-modifiers/language-modifier-count-paragraphs.md'
+ - 'count_sentences': 'designers/language-modifiers/language-modifier-count-sentences.md'
+ - 'count_words': 'designers/language-modifiers/language-modifier-count-words.md'
+ - 'date_format': 'designers/language-modifiers/language-modifier-date-format.md'
+ - 'default': 'designers/language-modifiers/language-modifier-default.md'
+ - 'escape': 'designers/language-modifiers/language-modifier-escape.md'
+ - 'from_charset': 'designers/language-modifiers/language-modifier-from-charset.md'
+ - 'indent': 'designers/language-modifiers/language-modifier-indent.md'
+ - 'lower': 'designers/language-modifiers/language-modifier-lower.md'
+ - 'nl2br': 'designers/language-modifiers/language-modifier-nl2br.md'
+ - 'regex_replace': 'designers/language-modifiers/language-modifier-regex-replace.md'
+ - 'replace': 'designers/language-modifiers/language-modifier-replace.md'
+ - 'spacify': 'designers/language-modifiers/language-modifier-spacify.md'
+ - 'string_format': 'designers/language-modifiers/language-modifier-string-format.md'
+ - 'strip': 'designers/language-modifiers/language-modifier-strip.md'
+ - 'strip_tags': 'designers/language-modifiers/language-modifier-strip-tags.md'
+ - 'to_charset': 'designers/language-modifiers/language-modifier-to-charset.md'
+ - 'truncate': 'designers/language-modifiers/language-modifier-truncate.md'
+ - 'unescape': 'designers/language-modifiers/language-modifier-unescape.md'
+ - 'upper': 'designers/language-modifiers/language-modifier-upper.md'
+ - 'wordwrap': 'designers/language-modifiers/language-modifier-wordwrap.md'
+ - 'designers/language-combining-modifiers.md'
+ - 'Builtin Functions':
+ - 'Introduction': 'designers/language-builtin-functions/index.md'
+ - '{append}': 'designers/language-builtin-functions/language-function-append.md'
+ - '{assign}': 'designers/language-builtin-functions/language-function-assign.md'
+ - '{block}': 'designers/language-builtin-functions/language-function-block.md'
+ - '{call}': 'designers/language-builtin-functions/language-function-call.md'
+ - '{capture}': 'designers/language-builtin-functions/language-function-capture.md'
+ - '{config_load}': 'designers/language-builtin-functions/language-function-config-load.md'
+ - '{debug}': 'designers/language-builtin-functions/language-function-debug.md'
+ - '{extends}': 'designers/language-builtin-functions/language-function-extends.md'
+ - '{for}': 'designers/language-builtin-functions/language-function-for.md'
+ - '{foreach}': 'designers/language-builtin-functions/language-function-foreach.md'
+ - '{function}': 'designers/language-builtin-functions/language-function-function.md'
+ - '{if},{elseif},{else}': 'designers/language-builtin-functions/language-function-if.md'
+ - '{include}': 'designers/language-builtin-functions/language-function-include.md'
+ - '{insert}': 'designers/language-builtin-functions/language-function-insert.md'
+ - '{ldelim},{rdelim}': 'designers/language-builtin-functions/language-function-ldelim.md'
+ - '{literal}': 'designers/language-builtin-functions/language-function-literal.md'
+ - '{nocache}': 'designers/language-builtin-functions/language-function-nocache.md'
+ - '{section}': 'designers/language-builtin-functions/language-function-section.md'
+ - '{setfilter}': 'designers/language-builtin-functions/language-function-setfilter.md'
+ - '{strip}': 'designers/language-builtin-functions/language-function-strip.md'
+ - '{while}': 'designers/language-builtin-functions/language-function-while.md'
+ - 'Custom Functions':
+ - 'Introduction': 'designers/language-custom-functions/index.md'
+ - '{counter}': 'designers/language-custom-functions/language-function-counter.md'
+ - '{cycle}': 'designers/language-custom-functions/language-function-cycle.md'
+ - '{debug}': 'designers/language-custom-functions/language-function-debug.md'
+ - '{eval}': 'designers/language-custom-functions/language-function-eval.md'
+ - '{fetch}': 'designers/language-custom-functions/language-function-fetch.md'
+ - '{html_checkboxes}': 'designers/language-custom-functions/language-function-html-checkboxes.md'
+ - '{html_image}': 'designers/language-custom-functions/language-function-html-image.md'
+ - '{html_options}': 'designers/language-custom-functions/language-function-html-options.md'
+ - '{html_radios}': 'designers/language-custom-functions/language-function-html-radios.md'
+ - '{html_select_date}': 'designers/language-custom-functions/language-function-html-select-date.md'
+ - '{html_select_time}': 'designers/language-custom-functions/language-function-html-select-time.md'
+ - '{html_table}': 'designers/language-custom-functions/language-function-html-table.md'
+ - '{mailto}': 'designers/language-custom-functions/language-function-mailto.md'
+ - '{math}': 'designers/language-custom-functions/language-function-math.md'
+ - '{textformat}': 'designers/language-custom-functions/language-function-textformat.md'
+ - 'designers/config-files.md'
+ - 'designers/chapter-debugging-console.md'
+ - 'Programmers':
+ - 'programmers/charset.md'
+ - 'programmers/smarty-constants.md'
+ - 'programmers/api-variables.md'
+ - 'programmers/api-functions.md'
+ - 'programmers/caching.md'
+ - 'programmers/resources.md'
+ - 'programmers/advanced-features.md'
+ - 'programmers/plugins.md'
\ No newline at end of file
diff --git a/system/vendor/smarty/smarty/run-tests-for-all-php-versions.sh b/system/vendor/smarty/smarty/run-tests-for-all-php-versions.sh
new file mode 100755
index 00000000..23541b51
--- /dev/null
+++ b/system/vendor/smarty/smarty/run-tests-for-all-php-versions.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Runs tests for all supported PHP versions
+# Usage examples:
+# - ./run-tests-for-all-php-versions.sh --group 20221124
+# - ./run-tests-for-all-php-versions.sh --exclude-group slow
+
+COMPOSE_CMD="mutagen-compose"
+
+$COMPOSE_CMD run --rm php71 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php72 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php73 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php74 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php80 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php81 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php82 ./run-tests.sh $@ && \
+$COMPOSE_CMD run --rm php83 ./run-tests.sh $@
diff --git a/system/vendor/smarty/smarty/run-tests.sh b/system/vendor/smarty/smarty/run-tests.sh
new file mode 100755
index 00000000..1990a07f
--- /dev/null
+++ b/system/vendor/smarty/smarty/run-tests.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Runs composer update, echoes php version and runs PHPUnit
+# Usage examples:
+# - ./run-tests.sh --group 20221124
+# - ./run-tests.sh --exclude-group slow
+
+composer update --quiet
+#php -r 'echo "\nPHP version " . phpversion() . ". ";'
+php ./vendor/phpunit/phpunit/phpunit $@
diff --git a/ui/compiled/index.html b/ui/compiled/index.html
new file mode 100644
index 00000000..e69de29b
diff --git a/ui/ui/app-settings.tpl b/ui/ui/app-settings.tpl
index eb3e92dc..141a0ab7 100644
--- a/ui/ui/app-settings.tpl
+++ b/ui/ui/app-settings.tpl
@@ -89,9 +89,12 @@
-
+
-
This used for admin to select payment in recharge, using comma for every new options
+
This used for admin to select payment in recharge, using comma
+ for every new options
@@ -606,17 +609,18 @@
-
{Lang::T('If user buy same internet plan, expiry date will extend')}
+
+ {Lang::T('If user buy same internet plan, expiry date will extend')}