diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..dfe0770424b2a19faf507a501ebfc23be8f54e7b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000000000000000000000000000000000000..f8b4888565caadc7510be75682268d6c18edd6de --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000000000000000000000000000000000000..410e200dafd9f323932119aa1419169010183ce2 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "", + "\\templates" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..27663860fbe00fdc53e54f66fcf3e7cb4c156f1f Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/.vs/velostat/v16/.suo b/.vs/velostat/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..c3d9725d8ccb04e6b896370449ecf2a2bd5ad0ee Binary files /dev/null and b/.vs/velostat/v16/.suo differ diff --git a/Autoloader.php b/Autoloader.php new file mode 100644 index 0000000000000000000000000000000000000000..c09361b669241a53666efbfa1e672c49787e384b --- /dev/null +++ b/Autoloader.php @@ -0,0 +1,110 @@ +<?php +/** + * Smarty Autoloader + * + * @package Smarty + */ + +/** + * Smarty Autoloader + * + * @package Smarty + * @author Uwe Tews + * Usage: + * require_once '...path/Autoloader.php'; + * Smarty_Autoloader::register(); + * or + * include '...path/bootstrap.php'; + * + * $smarty = new Smarty(); + */ +class Smarty_Autoloader +{ + /** + * Filepath to Smarty root + * + * @var string + */ + public static $SMARTY_DIR = null; + + /** + * Filepath to Smarty internal plugins + * + * @var string + */ + public static $SMARTY_SYSPLUGINS_DIR = null; + + /** + * Array with Smarty core classes and their filename + * + * @var array + */ + public static $rootClasses = array('smarty' => 'Smarty.class.php', 'smartybc' => 'SmartyBC.class.php',); + + /** + * Registers Smarty_Autoloader backward compatible to older installations. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function registerBC($prepend = false) + { + /** + * register the class autoloader + */ + if (!defined('SMARTY_SPL_AUTOLOAD')) { + define('SMARTY_SPL_AUTOLOAD', 0); + } + if (SMARTY_SPL_AUTOLOAD + && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false + ) { + $registeredAutoLoadFunctions = spl_autoload_functions(); + if (!isset($registeredAutoLoadFunctions[ 'spl_autoload' ])) { + spl_autoload_register(); + } + } else { + self::register($prepend); + } + } + + /** + * Registers Smarty_Autoloader as an SPL autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function register($prepend = false) + { + self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR; + self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR : + self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR; + if (version_compare(PHP_VERSION, '5.3.0', '>=')) { + spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); + } else { + spl_autoload_register(array(__CLASS__, 'autoload')); + } + } + + /** + * Handles auto loading of classes. + * + * @param string $class A class name. + */ + public static function autoload($class) + { + if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) { + return; + } + $_class = strtolower($class); + if (isset(self::$rootClasses[ $_class ])) { + $file = self::$SMARTY_DIR . self::$rootClasses[ $_class ]; + if (is_file($file)) { + include $file; + } + } else { + $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php'; + if (is_file($file)) { + include $file; + } + } + return; + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f6857df4ff8533b1acb5f563a5aea3ccff87d8ac --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# velostat + web de velostat diff --git a/Smarty.class.php b/Smarty.class.php new file mode 100644 index 0000000000000000000000000000000000000000..6564be6d2d2f2d88313d4201f29a07885474bb6f --- /dev/null +++ b/Smarty.class.php @@ -0,0 +1,1424 @@ +<?php +/** + * Project: Smarty: the PHP compiling template engine + * File: Smarty.class.php + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * For questions, help, comments, discussion, etc., please join the + * Smarty mailing list. Send a blank e-mail to + * smarty-discussion-subscribe@googlegroups.com + * + * @link http://www.smarty.net/ + * @copyright 2018 New Digital Group, Inc. + * @copyright 2018 Uwe Tews + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews <uwe dot tews at gmail dot com> + * @author Rodney Rehm + * @package Smarty + */ +/** + * set SMARTY_DIR to absolute path to Smarty library files. + * Sets SMARTY_DIR only if user application has not already defined it. + */ +if (!defined('SMARTY_DIR')) { + /** + * + */ + define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR); +} +/** + * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. + * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. + */ +if (!defined('SMARTY_SYSPLUGINS_DIR')) { + /** + * + */ + define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR); +} +if (!defined('SMARTY_PLUGINS_DIR')) { + /** + * + */ + define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DIRECTORY_SEPARATOR); +} +if (!defined('SMARTY_MBSTRING')) { + /** + * + */ + define('SMARTY_MBSTRING', function_exists('mb_get_info')); +} +if (!defined('SMARTY_RESOURCE_CHAR_SET')) { + // UTF-8 can only be done properly when mbstring is available! + /** + * @deprecated in favor of Smarty::$_CHARSET + */ + define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1'); +} +if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { + /** + * @deprecated in favor of Smarty::$_DATE_FORMAT + */ + define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); +} +/** + * Load Smarty_Autoloader + */ +if (!class_exists('Smarty_Autoloader')) { + include dirname(__FILE__) . '/bootstrap.php'; +} +/** + * Load always needed external class files + */ +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_extension_handler.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_resource_base.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php'; + +/** + * This is the main Smarty class + * + * @package Smarty + * + * The following methods will be dynamically loaded by the extension handler when they are called. + * They are located in a corresponding Smarty_Internal_Method_xxxx class + * + * @method int clearAllCache(int $exp_time = null, string $type = null) + * @method int clearCache(string $template_name, string $cache_id = null, string $compile_id = null, int $exp_time = null, string $type = null) + * @method int compileAllTemplates(string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, $max_errors = null) + * @method int compileAllConfig(string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, $max_errors = null) + * @method int clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) + */ +class Smarty extends Smarty_Internal_TemplateBase +{ + /** + * smarty version + */ + const SMARTY_VERSION = '3.1.38'; + /** + * define variable scopes + */ + const SCOPE_LOCAL = 1; + const SCOPE_PARENT = 2; + const SCOPE_TPL_ROOT = 4; + const SCOPE_ROOT = 8; + const SCOPE_SMARTY = 16; + const SCOPE_GLOBAL = 32; + /** + * define caching modes + */ + const CACHING_OFF = 0; + const CACHING_LIFETIME_CURRENT = 1; + const CACHING_LIFETIME_SAVED = 2; + /** + * define constant for clearing cache files be saved expiration dates + */ + const CLEAR_EXPIRED = -1; + /** + * define compile check modes + */ + const COMPILECHECK_OFF = 0; + const COMPILECHECK_ON = 1; + const COMPILECHECK_CACHEMISS = 2; + /** + * define debug modes + */ + const DEBUG_OFF = 0; + const DEBUG_ON = 1; + const DEBUG_INDIVIDUAL = 2; + /** + * modes for handling of "<?php ... ?>" tags in templates. + */ + const PHP_PASSTHRU = 0; //-> print tags as plain text + const PHP_QUOTE = 1; //-> escape tags as entities + const PHP_REMOVE = 2; //-> escape tags as entities + const PHP_ALLOW = 3; //-> escape tags as entities + /** + * filter types + */ + const FILTER_POST = 'post'; + const FILTER_PRE = 'pre'; + const FILTER_OUTPUT = 'output'; + const FILTER_VARIABLE = 'variable'; + /** + * plugin types + */ + const PLUGIN_FUNCTION = 'function'; + const PLUGIN_BLOCK = 'block'; + const PLUGIN_COMPILER = 'compiler'; + const PLUGIN_MODIFIER = 'modifier'; + const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler'; + + /** + * assigned global tpl vars + */ + public static $global_tpl_vars = array(); + + /** + * Flag denoting if Multibyte String functions are available + */ + public static $_MBSTRING = SMARTY_MBSTRING; + + /** + * The character set to adhere to (e.g. "UTF-8") + */ + public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET; + + /** + * The date format to be used internally + * (accepts date() and strftime()) + */ + public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT; + + /** + * Flag denoting if PCRE should run in UTF-8 mode + */ + public static $_UTF8_MODIFIER = 'u'; + + /** + * Flag denoting if operating system is windows + */ + public static $_IS_WINDOWS = false; + + /** + * auto literal on delimiters with whitespace + * + * @var boolean + */ + public $auto_literal = true; + + /** + * display error on not assigned variables + * + * @var boolean + */ + public $error_unassigned = false; + + /** + * look up relative file path in include_path + * + * @var boolean + */ + public $use_include_path = false; + + /** + * flag if template_dir is normalized + * + * @var bool + */ + public $_templateDirNormalized = false; + + /** + * joined template directory string used in cache keys + * + * @var string + */ + public $_joined_template_dir = null; + + /** + * flag if config_dir is normalized + * + * @var bool + */ + public $_configDirNormalized = false; + + /** + * joined config directory string used in cache keys + * + * @var string + */ + public $_joined_config_dir = null; + + /** + * default template handler + * + * @var callable + */ + public $default_template_handler_func = null; + + /** + * default config handler + * + * @var callable + */ + public $default_config_handler_func = null; + + /** + * default plugin handler + * + * @var callable + */ + public $default_plugin_handler_func = null; + + /** + * flag if template_dir is normalized + * + * @var bool + */ + public $_compileDirNormalized = false; + + /** + * flag if plugins_dir is normalized + * + * @var bool + */ + public $_pluginsDirNormalized = false; + + /** + * flag if template_dir is normalized + * + * @var bool + */ + public $_cacheDirNormalized = false; + + /** + * force template compiling? + * + * @var boolean + */ + public $force_compile = false; + + /** + * use sub dirs for compiled/cached files? + * + * @var boolean + */ + public $use_sub_dirs = false; + + /** + * allow ambiguous resources (that are made unique by the resource handler) + * + * @var boolean + */ + public $allow_ambiguous_resources = false; + + /** + * merge compiled includes + * + * @var boolean + */ + public $merge_compiled_includes = false; + + /* + * flag for behaviour when extends: resource and {extends} tag are used simultaneous + * if false disable execution of {extends} in templates called by extends resource. + * (behaviour as versions < 3.1.28) + * + * @var boolean + */ + public $extends_recursion = true; + + /** + * force cache file creation + * + * @var boolean + */ + public $force_cache = false; + + /** + * template left-delimiter + * + * @var string + */ + public $left_delimiter = "{"; + + /** + * template right-delimiter + * + * @var string + */ + public $right_delimiter = "}"; + + /** + * array of strings which shall be treated as literal by compiler + * + * @var array string + */ + public $literals = array(); + + /** + * class name + * This should be instance of Smarty_Security. + * + * @var string + * @see Smarty_Security + */ + public $security_class = 'Smarty_Security'; + + /** + * implementation of security class + * + * @var Smarty_Security + */ + public $security_policy = null; + + /** + * controls handling of PHP-blocks + * + * @var integer + */ + public $php_handling = self::PHP_PASSTHRU; + + /** + * controls if the php template file resource is allowed + * + * @var bool + */ + public $allow_php_templates = false; + + /** + * debug mode + * Setting this to true enables the debug-console. + * + * @var boolean + */ + public $debugging = false; + + /** + * This determines if debugging is enable-able from the browser. + * <ul> + * <li>NONE => no debugging control allowed</li> + * <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li> + * </ul> + * + * @var string + */ + public $debugging_ctrl = 'NONE'; + + /** + * Name of debugging URL-param. + * Only used when $debugging_ctrl is set to 'URL'. + * The name of the URL-parameter that activates debugging. + * + * @var string + */ + public $smarty_debug_id = 'SMARTY_DEBUG'; + + /** + * Path of debug template. + * + * @var string + */ + public $debug_tpl = null; + + /** + * When set, smarty uses this value as error_reporting-level. + * + * @var int + */ + public $error_reporting = null; + + /** + * Controls whether variables with the same name overwrite each other. + * + * @var boolean + */ + public $config_overwrite = true; + + /** + * Controls whether config values of on/true/yes and off/false/no get converted to boolean. + * + * @var boolean + */ + public $config_booleanize = true; + + /** + * Controls whether hidden config sections/vars are read from the file. + * + * @var boolean + */ + public $config_read_hidden = false; + + /** + * locking concurrent compiles + * + * @var boolean + */ + public $compile_locking = true; + + /** + * Controls whether cache resources should use locking mechanism + * + * @var boolean + */ + public $cache_locking = false; + + /** + * seconds to wait for acquiring a lock before ignoring the write lock + * + * @var float + */ + public $locking_timeout = 10; + + /** + * resource type used if none given + * Must be an valid key of $registered_resources. + * + * @var string + */ + public $default_resource_type = 'file'; + + /** + * caching type + * Must be an element of $cache_resource_types. + * + * @var string + */ + public $caching_type = 'file'; + + /** + * config type + * + * @var string + */ + public $default_config_type = 'file'; + + /** + * check If-Modified-Since headers + * + * @var boolean + */ + public $cache_modified_check = false; + + /** + * registered plugins + * + * @var array + */ + public $registered_plugins = array(); + + /** + * registered objects + * + * @var array + */ + public $registered_objects = array(); + + /** + * registered classes + * + * @var array + */ + public $registered_classes = array(); + + /** + * registered filters + * + * @var array + */ + public $registered_filters = array(); + + /** + * registered resources + * + * @var array + */ + public $registered_resources = array(); + + /** + * registered cache resources + * + * @var array + */ + public $registered_cache_resources = array(); + + /** + * autoload filter + * + * @var array + */ + public $autoload_filters = array(); + + /** + * default modifier + * + * @var array + */ + public $default_modifiers = array(); + + /** + * autoescape variable output + * + * @var boolean + */ + public $escape_html = false; + + /** + * start time for execution time calculation + * + * @var int + */ + public $start_time = 0; + + /** + * required by the compiler for BC + * + * @var string + */ + public $_current_file = null; + + /** + * internal flag to enable parser debugging + * + * @var bool + */ + public $_parserdebug = false; + + /** + * This object type (Smarty = 1, template = 2, data = 4) + * + * @var int + */ + public $_objType = 1; + + /** + * Debug object + * + * @var Smarty_Internal_Debug + */ + public $_debug = null; + + /** + * template directory + * + * @var array + */ + protected $template_dir = array('./templates/'); + + /** + * flags for normalized template directory entries + * + * @var array + */ + protected $_processedTemplateDir = array(); + + /** + * config directory + * + * @var array + */ + protected $config_dir = array('./configs/'); + + /** + * flags for normalized template directory entries + * + * @var array + */ + protected $_processedConfigDir = array(); + + /** + * compile directory + * + * @var string + */ + protected $compile_dir = './templates_c/'; + + /** + * plugins directory + * + * @var array + */ + protected $plugins_dir = array(); + + /** + * cache directory + * + * @var string + */ + protected $cache_dir = './cache/'; + + /** + * removed properties + * + * @var string[] + */ + protected $obsoleteProperties = array( + 'resource_caching', 'template_resource_caching', 'direct_access_security', + '_dir_perms', '_file_perms', 'plugin_search_order', + 'inheritance_merge_compiled_includes', 'resource_cache_mode', + ); + + /** + * List of private properties which will call getter/setter on a direct access + * + * @var string[] + */ + protected $accessMap = array( + 'template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir', + 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir', + 'cache_dir' => 'CacheDir', + ); + + /** + * Initialize new Smarty object + */ + public function __construct() + { + $this->_clearTemplateCache(); + parent::__construct(); + if (is_callable('mb_internal_encoding')) { + mb_internal_encoding(Smarty::$_CHARSET); + } + $this->start_time = microtime(true); + if (isset($_SERVER[ 'SCRIPT_NAME' ])) { + Smarty::$global_tpl_vars[ 'SCRIPT_NAME' ] = new Smarty_Variable($_SERVER[ 'SCRIPT_NAME' ]); + } + // Check if we're running on windows + Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8 + if (Smarty::$_CHARSET !== 'UTF-8') { + Smarty::$_UTF8_MODIFIER = ''; + } + } + + /** + * Enable error handler to mute expected messages + * + * @return boolean + * @deprecated + */ + public static function muteExpectedErrors() + { + return Smarty_Internal_ErrorHandler::muteExpectedErrors(); + } + + /** + * Disable error handler muting expected messages + * + * @deprecated + */ + public static function unmuteExpectedErrors() + { + restore_error_handler(); + } + + /** + * Check if a template resource exists + * + * @param string $resource_name template name + * + * @return bool status + * @throws \SmartyException + */ + public function templateExists($resource_name) + { + // create source object + $source = Smarty_Template_Source::load(null, $this, $resource_name); + return $source->exists; + } + + /** + * Loads security class and enables security + * + * @param string|Smarty_Security $security_class if a string is used, it must be class-name + * + * @return Smarty current Smarty instance for chaining + * @throws \SmartyException + */ + public function enableSecurity($security_class = null) + { + Smarty_Security::enableSecurity($this, $security_class); + return $this; + } + + /** + * Disable security + * + * @return Smarty current Smarty instance for chaining + */ + public function disableSecurity() + { + $this->security_policy = null; + return $this; + } + + /** + * Add template directory(s) + * + * @param string|array $template_dir directory(s) of template sources + * @param string $key of the array element to assign the template dir to + * @param bool $isConfig true for config_dir + * + * @return Smarty current Smarty instance for chaining + */ + public function addTemplateDir($template_dir, $key = null, $isConfig = false) + { + if ($isConfig) { + $processed = &$this->_processedConfigDir; + $dir = &$this->config_dir; + $this->_configDirNormalized = false; + } else { + $processed = &$this->_processedTemplateDir; + $dir = &$this->template_dir; + $this->_templateDirNormalized = false; + } + if (is_array($template_dir)) { + foreach ($template_dir as $k => $v) { + if (is_int($k)) { + // indexes are not merged but appended + $dir[] = $v; + } else { + // string indexes are overridden + $dir[ $k ] = $v; + unset($processed[ $key ]); + } + } + } else { + if ($key !== null) { + // override directory at specified index + $dir[ $key ] = $template_dir; + unset($processed[ $key ]); + } else { + // append new directory + $dir[] = $template_dir; + } + } + return $this; + } + + /** + * Get template directories + * + * @param mixed $index index of directory to get, null to get all + * @param bool $isConfig true for config_dir + * + * @return array|string list of template directories, or directory of $index + */ + public function getTemplateDir($index = null, $isConfig = false) + { + if ($isConfig) { + $dir = &$this->config_dir; + } else { + $dir = &$this->template_dir; + } + if ($isConfig ? !$this->_configDirNormalized : !$this->_templateDirNormalized) { + $this->_normalizeTemplateConfig($isConfig); + } + if ($index !== null) { + return isset($dir[ $index ]) ? $dir[ $index ] : null; + } + return $dir; + } + + /** + * Set template directory + * + * @param string|array $template_dir directory(s) of template sources + * @param bool $isConfig true for config_dir + * + * @return \Smarty current Smarty instance for chaining + */ + public function setTemplateDir($template_dir, $isConfig = false) + { + if ($isConfig) { + $this->config_dir = array(); + $this->_processedConfigDir = array(); + } else { + $this->template_dir = array(); + $this->_processedTemplateDir = array(); + } + $this->addTemplateDir($template_dir, null, $isConfig); + return $this; + } + + /** + * Add config directory(s) + * + * @param string|array $config_dir directory(s) of config sources + * @param mixed $key key of the array element to assign the config dir to + * + * @return Smarty current Smarty instance for chaining + */ + public function addConfigDir($config_dir, $key = null) + { + return $this->addTemplateDir($config_dir, $key, true); + } + + /** + * Get config directory + * + * @param mixed $index index of directory to get, null to get all + * + * @return array configuration directory + */ + public function getConfigDir($index = null) + { + return $this->getTemplateDir($index, true); + } + + /** + * Set config directory + * + * @param $config_dir + * + * @return Smarty current Smarty instance for chaining + */ + public function setConfigDir($config_dir) + { + return $this->setTemplateDir($config_dir, true); + } + + /** + * Adds directory of plugin files + * + * @param null|array|string $plugins_dir + * + * @return Smarty current Smarty instance for chaining + */ + public function addPluginsDir($plugins_dir) + { + if (empty($this->plugins_dir)) { + $this->plugins_dir[] = SMARTY_PLUGINS_DIR; + } + $this->plugins_dir = array_merge($this->plugins_dir, (array)$plugins_dir); + $this->_pluginsDirNormalized = false; + return $this; + } + + /** + * Get plugin directories + * + * @return array list of plugin directories + */ + public function getPluginsDir() + { + if (empty($this->plugins_dir)) { + $this->plugins_dir[] = SMARTY_PLUGINS_DIR; + $this->_pluginsDirNormalized = false; + } + if (!$this->_pluginsDirNormalized) { + if (!is_array($this->plugins_dir)) { + $this->plugins_dir = (array)$this->plugins_dir; + } + foreach ($this->plugins_dir as $k => $v) { + $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, '/\\') . DIRECTORY_SEPARATOR, true); + } + $this->_cache[ 'plugin_files' ] = array(); + $this->_pluginsDirNormalized = true; + } + return $this->plugins_dir; + } + + /** + * Set plugins directory + * + * @param string|array $plugins_dir directory(s) of plugins + * + * @return Smarty current Smarty instance for chaining + */ + public function setPluginsDir($plugins_dir) + { + $this->plugins_dir = (array)$plugins_dir; + $this->_pluginsDirNormalized = false; + return $this; + } + + /** + * Get compiled directory + * + * @return string path to compiled templates + */ + public function getCompileDir() + { + if (!$this->_compileDirNormalized) { + $this->_normalizeDir('compile_dir', $this->compile_dir); + $this->_compileDirNormalized = true; + } + return $this->compile_dir; + } + + /** + * + * @param string $compile_dir directory to store compiled templates in + * + * @return Smarty current Smarty instance for chaining + */ + public function setCompileDir($compile_dir) + { + $this->_normalizeDir('compile_dir', $compile_dir); + $this->_compileDirNormalized = true; + return $this; + } + + /** + * Get cache directory + * + * @return string path of cache directory + */ + public function getCacheDir() + { + if (!$this->_cacheDirNormalized) { + $this->_normalizeDir('cache_dir', $this->cache_dir); + $this->_cacheDirNormalized = true; + } + return $this->cache_dir; + } + + /** + * Set cache directory + * + * @param string $cache_dir directory to store cached templates in + * + * @return Smarty current Smarty instance for chaining + */ + public function setCacheDir($cache_dir) + { + $this->_normalizeDir('cache_dir', $cache_dir); + $this->_cacheDirNormalized = true; + return $this; + } + + /** + * creates a template object + * + * @param string $template the resource handle of the template file + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @param boolean $do_clone flag is Smarty object shall be cloned + * + * @return \Smarty_Internal_Template template object + * @throws \SmartyException + */ + public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) + { + if ($cache_id !== null && (is_object($cache_id) || is_array($cache_id))) { + $parent = $cache_id; + $cache_id = null; + } + if ($parent !== null && is_array($parent)) { + $data = $parent; + $parent = null; + } else { + $data = null; + } + if (!$this->_templateDirNormalized) { + $this->_normalizeTemplateConfig(false); + } + $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); + $tpl = null; + if ($this->caching && isset(Smarty_Internal_Template::$isCacheTplObj[ $_templateId ])) { + $tpl = $do_clone ? clone Smarty_Internal_Template::$isCacheTplObj[ $_templateId ] : + Smarty_Internal_Template::$isCacheTplObj[ $_templateId ]; + $tpl->inheritance = null; + $tpl->tpl_vars = $tpl->config_vars = array(); + } elseif (!$do_clone && isset(Smarty_Internal_Template::$tplObjCache[ $_templateId ])) { + $tpl = clone Smarty_Internal_Template::$tplObjCache[ $_templateId ]; + $tpl->inheritance = null; + $tpl->tpl_vars = $tpl->config_vars = array(); + } else { + /* @var Smarty_Internal_Template $tpl */ + $tpl = new $this->template_class($template, $this, null, $cache_id, $compile_id, null, null); + $tpl->templateId = $_templateId; + } + if ($do_clone) { + $tpl->smarty = clone $tpl->smarty; + } + $tpl->parent = $parent ? $parent : $this; + // fill data if present + if (!empty($data) && is_array($data)) { + // set up variable values + foreach ($data as $_key => $_val) { + $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val); + } + } + if ($this->debugging || $this->debugging_ctrl === 'URL') { + $tpl->smarty->_debug = new Smarty_Internal_Debug(); + // check URL debugging control + if (!$this->debugging && $this->debugging_ctrl === 'URL') { + $tpl->smarty->_debug->debugUrl($tpl->smarty); + } + } + return $tpl; + } + + /** + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * + * @return string |boolean filepath of loaded file or false + * @throws \SmartyException + */ + public function loadPlugin($plugin_name, $check = true) + { + return $this->ext->loadPlugin->loadPlugin($this, $plugin_name, $check); + } + + /** + * Get unique template id + * + * @param string $template_name + * @param null|mixed $cache_id + * @param null|mixed $compile_id + * @param null $caching + * @param \Smarty_Internal_Template $template + * + * @return string + * @throws \SmartyException + */ + public function _getTemplateId( + $template_name, + $cache_id = null, + $compile_id = null, + $caching = null, + Smarty_Internal_Template $template = null + ) { + $template_name = (strpos($template_name, ':') === false) ? "{$this->default_resource_type}:{$template_name}" : + $template_name; + $cache_id = $cache_id === null ? $this->cache_id : $cache_id; + $compile_id = $compile_id === null ? $this->compile_id : $compile_id; + $caching = (int)($caching === null ? $this->caching : $caching); + if ((isset($template) && strpos($template_name, ':.') !== false) || $this->allow_ambiguous_resources) { + $_templateId = + Smarty_Resource::getUniqueTemplateName((isset($template) ? $template : $this), $template_name) . + "#{$cache_id}#{$compile_id}#{$caching}"; + } else { + $_templateId = $this->_joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}#{$caching}"; + } + if (isset($_templateId[ 150 ])) { + $_templateId = sha1($_templateId); + } + return $_templateId; + } + + /** + * Normalize path + * - remove /./ and /../ + * - make it absolute if required + * + * @param string $path file path + * @param bool $realpath if true - convert to absolute + * false - convert to relative + * null - keep as it is but + * remove /./ /../ + * + * @return string + */ + public function _realpath($path, $realpath = null) + { + $nds = array('/' => '\\', '\\' => '/'); + preg_match( + '%^(?<root>(?:[[:alpha:]]:[\\\\/]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?<path>(.*))$%u', + $path, + $parts + ); + $path = $parts[ 'path' ]; + if ($parts[ 'root' ] === '\\') { + $parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ]; + } else { + if ($realpath !== null && !$parts[ 'root' ]) { + $path = getcwd() . DIRECTORY_SEPARATOR . $path; + } + } + // normalize DIRECTORY_SEPARATOR + $path = str_replace($nds[ DIRECTORY_SEPARATOR ], DIRECTORY_SEPARATOR, $path); + $parts[ 'root' ] = str_replace($nds[ DIRECTORY_SEPARATOR ], DIRECTORY_SEPARATOR, $parts[ 'root' ]); + do { + $path = preg_replace( + array('#[\\\\/]{2}#', '#[\\\\/][.][\\\\/]#', '#[\\\\/]([^\\\\/.]+)[\\\\/][.][.][\\\\/]#'), + DIRECTORY_SEPARATOR, + $path, + -1, + $count + ); + } while ($count > 0); + return $realpath !== false ? $parts[ 'root' ] . $path : str_ireplace(getcwd(), '.', $parts[ 'root' ] . $path); + } + + /** + * Empty template objects cache + */ + public function _clearTemplateCache() + { + Smarty_Internal_Template::$isCacheTplObj = array(); + Smarty_Internal_Template::$tplObjCache = array(); + } + + /** + * @param boolean $use_sub_dirs + */ + public function setUseSubDirs($use_sub_dirs) + { + $this->use_sub_dirs = $use_sub_dirs; + } + + /** + * @param int $error_reporting + */ + public function setErrorReporting($error_reporting) + { + $this->error_reporting = $error_reporting; + } + + /** + * @param boolean $escape_html + */ + public function setEscapeHtml($escape_html) + { + $this->escape_html = $escape_html; + } + + /** + * Return auto_literal flag + * + * @return boolean + */ + public function getAutoLiteral() + { + return $this->auto_literal; + } + + /** + * Set auto_literal flag + * + * @param boolean $auto_literal + */ + public function setAutoLiteral($auto_literal = true) + { + $this->auto_literal = $auto_literal; + } + + /** + * @param boolean $force_compile + */ + public function setForceCompile($force_compile) + { + $this->force_compile = $force_compile; + } + + /** + * @param boolean $merge_compiled_includes + */ + public function setMergeCompiledIncludes($merge_compiled_includes) + { + $this->merge_compiled_includes = $merge_compiled_includes; + } + + /** + * Get left delimiter + * + * @return string + */ + public function getLeftDelimiter() + { + return $this->left_delimiter; + } + + /** + * Set left delimiter + * + * @param string $left_delimiter + */ + public function setLeftDelimiter($left_delimiter) + { + $this->left_delimiter = $left_delimiter; + } + + /** + * Get right delimiter + * + * @return string $right_delimiter + */ + public function getRightDelimiter() + { + return $this->right_delimiter; + } + + /** + * Set right delimiter + * + * @param string + */ + public function setRightDelimiter($right_delimiter) + { + $this->right_delimiter = $right_delimiter; + } + + /** + * @param boolean $debugging + */ + public function setDebugging($debugging) + { + $this->debugging = $debugging; + } + + /** + * @param boolean $config_overwrite + */ + public function setConfigOverwrite($config_overwrite) + { + $this->config_overwrite = $config_overwrite; + } + + /** + * @param boolean $config_booleanize + */ + public function setConfigBooleanize($config_booleanize) + { + $this->config_booleanize = $config_booleanize; + } + + /** + * @param boolean $config_read_hidden + */ + public function setConfigReadHidden($config_read_hidden) + { + $this->config_read_hidden = $config_read_hidden; + } + + /** + * @param boolean $compile_locking + */ + public function setCompileLocking($compile_locking) + { + $this->compile_locking = $compile_locking; + } + + /** + * @param string $default_resource_type + */ + public function setDefaultResourceType($default_resource_type) + { + $this->default_resource_type = $default_resource_type; + } + + /** + * @param string $caching_type + */ + public function setCachingType($caching_type) + { + $this->caching_type = $caching_type; + } + + /** + * Test install + * + * @param null $errors + */ + public function testInstall(&$errors = null) + { + Smarty_Internal_TestInstall::testInstall($this, $errors); + } + + /** + * Get Smarty object + * + * @return Smarty + */ + public function _getSmartyObj() + { + return $this; + } + + /** + * <<magic>> Generic getter. + * Calls the appropriate getter function. + * Issues an E_USER_NOTICE if no valid getter is found. + * + * @param string $name property name + * + * @return mixed + */ + public function __get($name) + { + if (isset($this->accessMap[ $name ])) { + $method = 'get' . $this->accessMap[ $name ]; + return $this->{$method}(); + } elseif (isset($this->_cache[ $name ])) { + return $this->_cache[ $name ]; + } elseif (in_array($name, $this->obsoleteProperties)) { + return null; + } else { + trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); + } + return null; + } + + /** + * <<magic>> Generic setter. + * Calls the appropriate setter function. + * Issues an E_USER_NOTICE if no valid setter is found. + * + * @param string $name property name + * @param mixed $value parameter passed to setter + * + */ + public function __set($name, $value) + { + if (isset($this->accessMap[ $name ])) { + $method = 'set' . $this->accessMap[ $name ]; + $this->{$method}($value); + } elseif (in_array($name, $this->obsoleteProperties)) { + return; + } elseif (is_object($value) && method_exists($value, $name)) { + $this->$name = $value; + } else { + trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); + } + } + + /** + * Normalize and set directory string + * + * @param string $dirName cache_dir or compile_dir + * @param string $dir filepath of folder + */ + private function _normalizeDir($dirName, $dir) + { + $this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . DIRECTORY_SEPARATOR, true); + if (class_exists('Smarty_Internal_ErrorHandler', false)) { + if (!isset(Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ])) { + Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ] = null; + } + } + } + + /** + * Normalize template_dir or config_dir + * + * @param bool $isConfig true for config_dir + */ + private function _normalizeTemplateConfig($isConfig) + { + if ($isConfig) { + $processed = &$this->_processedConfigDir; + $dir = &$this->config_dir; + } else { + $processed = &$this->_processedTemplateDir; + $dir = &$this->template_dir; + } + if (!is_array($dir)) { + $dir = (array)$dir; + } + foreach ($dir as $k => $v) { + if (!isset($processed[ $k ])) { + $dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true); + $processed[ $k ] = true; + } + } + $isConfig ? $this->_configDirNormalized = true : $this->_templateDirNormalized = true; + $isConfig ? $this->_joined_config_dir = join('#', $this->config_dir) : + $this->_joined_template_dir = join('#', $this->template_dir); + } +} diff --git a/SmartyBC.class.php b/SmartyBC.class.php new file mode 100644 index 0000000000000000000000000000000000000000..0550e46dc5ea092820e718afa802c4fae7eed3ef --- /dev/null +++ b/SmartyBC.class.php @@ -0,0 +1,477 @@ +<?php +/** + * Project: Smarty: the PHP compiling template engine + * File: SmartyBC.class.php + * SVN: $Id: $ + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * For questions, help, comments, discussion, etc., please join the + * Smarty mailing list. Send a blank e-mail to + * smarty-discussion-subscribe@googlegroups.com + * + * @link http://www.smarty.net/ + * @copyright 2008 New Digital Group, Inc. + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews + * @author Rodney Rehm + * @package Smarty + */ +/** + * @ignore + */ +require_once dirname(__FILE__) . '/Smarty.class.php'; + +/** + * Smarty Backward Compatibility Wrapper Class + * + * @package Smarty + */ +class SmartyBC extends Smarty +{ + /** + * Smarty 2 BC + * + * @var string + */ + public $_version = self::SMARTY_VERSION; + + /** + * This is an array of directories where trusted php scripts reside. + * + * @var array + */ + public $trusted_dir = array(); + + /** + * Initialize new SmartyBC object + */ + public function __construct() + { + parent::__construct(); + } + + /** + * wrapper for assign_by_ref + * + * @param string $tpl_var the template variable name + * @param mixed &$value the referenced value to assign + */ + public function assign_by_ref($tpl_var, &$value) + { + $this->assignByRef($tpl_var, $value); + } + + /** + * wrapper for append_by_ref + * + * @param string $tpl_var the template variable name + * @param mixed &$value the referenced value to append + * @param boolean $merge flag if array elements shall be merged + */ + public function append_by_ref($tpl_var, &$value, $merge = false) + { + $this->appendByRef($tpl_var, $value, $merge); + } + + /** + * clear the given assigned template variable. + * + * @param string $tpl_var the template variable to clear + */ + public function clear_assign($tpl_var) + { + $this->clearAssign($tpl_var); + } + + /** + * Registers custom function to be used in templates + * + * @param string $function the name of the template function + * @param string $function_impl the name of the PHP function to register + * @param bool $cacheable + * @param mixed $cache_attrs + * + * @throws \SmartyException + */ + public function register_function($function, $function_impl, $cacheable = true, $cache_attrs = null) + { + $this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs); + } + + /** + * Unregister custom function + * + * @param string $function name of template function + */ + public function unregister_function($function) + { + $this->unregisterPlugin('function', $function); + } + + /** + * Registers object to be used in templates + * + * @param string $object name of template object + * @param object $object_impl the referenced PHP object to register + * @param array $allowed list of allowed methods (empty = all) + * @param boolean $smarty_args smarty argument format, else traditional + * @param array $block_methods list of methods that are block format + * + * @throws SmartyException + * @internal param array $block_functs list of methods that are block format + */ + public function register_object( + $object, + $object_impl, + $allowed = array(), + $smarty_args = true, + $block_methods = array() + ) { + settype($allowed, 'array'); + settype($smarty_args, 'boolean'); + $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods); + } + + /** + * Unregister object + * + * @param string $object name of template object + */ + public function unregister_object($object) + { + $this->unregisterObject($object); + } + + /** + * Registers block function to be used in templates + * + * @param string $block name of template block + * @param string $block_impl PHP function to register + * @param bool $cacheable + * @param mixed $cache_attrs + * + * @throws \SmartyException + */ + public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null) + { + $this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs); + } + + /** + * Unregister block function + * + * @param string $block name of template function + */ + public function unregister_block($block) + { + $this->unregisterPlugin('block', $block); + } + + /** + * Registers compiler function + * + * @param string $function name of template function + * @param string $function_impl name of PHP function to register + * @param bool $cacheable + * + * @throws \SmartyException + */ + public function register_compiler_function($function, $function_impl, $cacheable = true) + { + $this->registerPlugin('compiler', $function, $function_impl, $cacheable); + } + + /** + * Unregister compiler function + * + * @param string $function name of template function + */ + public function unregister_compiler_function($function) + { + $this->unregisterPlugin('compiler', $function); + } + + /** + * Registers modifier to be used in templates + * + * @param string $modifier name of template modifier + * @param string $modifier_impl name of PHP function to register + * + * @throws \SmartyException + */ + public function register_modifier($modifier, $modifier_impl) + { + $this->registerPlugin('modifier', $modifier, $modifier_impl); + } + + /** + * Unregister modifier + * + * @param string $modifier name of template modifier + */ + public function unregister_modifier($modifier) + { + $this->unregisterPlugin('modifier', $modifier); + } + + /** + * Registers a resource to fetch a template + * + * @param string $type name of resource + * @param array $functions array of functions to handle resource + */ + public function register_resource($type, $functions) + { + $this->registerResource($type, $functions); + } + + /** + * Unregister a resource + * + * @param string $type name of resource + */ + public function unregister_resource($type) + { + $this->unregisterResource($type); + } + + /** + * Registers a prefilter function to apply + * to a template before compiling + * + * @param callable $function + * + * @throws \SmartyException + */ + public function register_prefilter($function) + { + $this->registerFilter('pre', $function); + } + + /** + * Unregister a prefilter function + * + * @param callable $function + */ + public function unregister_prefilter($function) + { + $this->unregisterFilter('pre', $function); + } + + /** + * Registers a postfilter function to apply + * to a compiled template after compilation + * + * @param callable $function + * + * @throws \SmartyException + */ + public function register_postfilter($function) + { + $this->registerFilter('post', $function); + } + + /** + * Unregister a postfilter function + * + * @param callable $function + */ + public function unregister_postfilter($function) + { + $this->unregisterFilter('post', $function); + } + + /** + * Registers an output filter function to apply + * to a template output + * + * @param callable $function + * + * @throws \SmartyException + */ + public function register_outputfilter($function) + { + $this->registerFilter('output', $function); + } + + /** + * Unregister an outputfilter function + * + * @param callable $function + */ + public function unregister_outputfilter($function) + { + $this->unregisterFilter('output', $function); + } + + /** + * load a filter of specified type and name + * + * @param string $type filter type + * @param string $name filter name + * + * @throws \SmartyException + */ + public function load_filter($type, $name) + { + $this->loadFilter($type, $name); + } + + /** + * clear cached content for the given template and cache id + * + * @param string $tpl_file name of template file + * @param string $cache_id name of cache_id + * @param string $compile_id name of compile_id + * @param string $exp_time expiration time + * + * @return boolean + */ + public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) + { + return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time); + } + + /** + * clear the entire contents of cache (all templates) + * + * @param string $exp_time expire time + * + * @return boolean + */ + public function clear_all_cache($exp_time = null) + { + return $this->clearCache(null, null, null, $exp_time); + } + + /** + * test to see if valid cache exists for this template + * + * @param string $tpl_file name of template file + * @param string $cache_id + * @param string $compile_id + * + * @return bool + * @throws \Exception + * @throws \SmartyException + */ + public function is_cached($tpl_file, $cache_id = null, $compile_id = null) + { + return $this->isCached($tpl_file, $cache_id, $compile_id); + } + + /** + * clear all the assigned template variables. + */ + public function clear_all_assign() + { + $this->clearAllAssign(); + } + + /** + * clears compiled version of specified template resource, + * or all compiled template files if one is not specified. + * This function is for advanced use only, not normally needed. + * + * @param string $tpl_file + * @param string $compile_id + * @param string $exp_time + * + * @return boolean results of {@link smarty_core_rm_auto()} + */ + public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) + { + return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time); + } + + /** + * Checks whether requested template exists. + * + * @param string $tpl_file + * + * @return bool + * @throws \SmartyException + */ + public function template_exists($tpl_file) + { + return $this->templateExists($tpl_file); + } + + /** + * Returns an array containing template variables + * + * @param string $name + * + * @return array + */ + public function get_template_vars($name = null) + { + return $this->getTemplateVars($name); + } + + /** + * Returns an array containing config variables + * + * @param string $name + * + * @return array + */ + public function get_config_vars($name = null) + { + return $this->getConfigVars($name); + } + + /** + * load configuration values + * + * @param string $file + * @param string $section + * @param string $scope + */ + public function config_load($file, $section = null, $scope = 'global') + { + $this->ConfigLoad($file, $section, $scope); + } + + /** + * return a reference to a registered object + * + * @param string $name + * + * @return object + */ + public function get_registered_object($name) + { + return $this->getRegisteredObject($name); + } + + /** + * clear configuration values + * + * @param string $var + */ + public function clear_config($var = null) + { + $this->clearConfig($var); + } + + /** + * trigger Smarty error + * + * @param string $error_msg + * @param integer $error_type + */ + public function trigger_error($error_msg, $error_type = E_USER_WARNING) + { + trigger_error("Smarty error: $error_msg", $error_type); + } +} diff --git a/add_eti.php b/add_eti.php new file mode 100644 index 0000000000000000000000000000000000000000..2f5c1827d4f1ecf2ede138f8edb5eeb30b739931 --- /dev/null +++ b/add_eti.php @@ -0,0 +1,145 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); + +/* +* Archivo de control. A�adir paciente, etiolog�a y patolog�a asociada +* Caso de uso: REGISTRAR PACIENTE <<include>> A�ADIR ETIOLOG�A +*/ + +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + //Recogemos los datos del formulario + $dni_paciente = ($_GET["id"]); + $accion = ($_GET["accion"]); + $n_etiologia = ($_POST["etiologia"]); + $fecha_lesion =($_POST["fecha_lesion"]); + $cuadrantes = ($_POST["cuadrantes"]); + $comentarios = ($_POST["comentarios"]); + $patologia = ($_POST["patologia"]); + $mensaje = ""; + + + // Valores para el formulario: + // Tipo de ensayos + // Nombre + // Apellidos + // Edad + // Sexo + + + $html->assign("id_admin",$id_admin); + //Mostramos una tabla con todos los sujetos para marcar el que queremos + if($accion == 1){ + $result = $conex->query("SELECT `id_patologia` FROM `PATOLOGIAS` WHERE `nombre`='$patologia'"); + $row = $result->fetch_assoc(); + $patologia = $row['id_patologia']; + + $mensaje= "Actualizado resgistro de Pacientes para: '$nombre'"; + //A�adimos la etiolog�a vinculada al paciente + if($cuadrantes == "" && $comentarios == ""){ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$n_etiologia', '$fecha_lesion', NULL, NULL, '$patologia', '$dni_paciente')"; + }elseif ($cuadrantes != "" && $comentarios == ""){ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$n_etiologia', '$fecha_lesion', '$cuadrantes', NULL, '$patologia', '$dni_paciente')"; + }elseif($cuadrantes == "" && $comentarios != ""){ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$n_etiologia', '$fecha_lesion', NULL, '$comentarios', '$patologia', '$dni_paciente')"; + }else{ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$n_etiologia', '$fecha_lesion', '$cuadrantes', '$comentarios', '$patologia', '$dni_paciente')"; + } + + if (!$conex->query($sql)){ + $mensaje.= " Error actualizando base de datos Etiologias $dni_paciente $patologia"; + }else{ + //VOLVEMOS A MOSTRAR LA INFORMACI�N DEL PACIENTE + $sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba + FROM ENSAYOS, PRUEBAS_PACIENTES + WHERE `dni_paciente`='$dni_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo + ORDER BY fecha DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_prueba'], + $row['tipo'], + $row['fecha'], + $row['simetria'], + $row['anotaciones'] + ]; + $x++; + } + $html->assign("entrada",$entrada); + }else{ + $mensaje.=" Error al obtener las pruebas."; + } + + $sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre + FROM ETIOLOGIAS, PATOLOGIAS + WHERE `dni_paciente`='$dni_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia + ORDER BY fecha_lesion DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida + $x = 0; + while ($row = $result->fetch_assoc()){ + $etiologia[$x]=[ + $row['id_etiologia'], + $row['etiologia'], + $row['fecha_lesion'], + $row['cuadrantes'], + $row['comentarios'], + $row['nombre'] + ]; + $x++; + } + $html->assign("etiologia",$etiologia); + }else{ + $mensaje.=" Error al obtener las etiolog�as."; + } + } + + $sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$dni_paciente'"; + $result=$conex->query($sql); + $row = $result->fetch_assoc(); + $sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']]; + + $html->assign("id_admin",$id_admin); + $html->assign("sujeto",$sujeto); + //VOLVEMOS A MOSTRAR LA INFORMACI�N DEL PACIENTE + + $html->assign("mensaje",$mensaje); + $html->display("pac_reg.tpl"); + + }else{ + $sujeto[0]=$dni_paciente; + $html->assign("sujeto",$sujeto); + + //Necesitamos las patologias + $x=0; + $result = $conex->query("SELECT nombre, descripcion FROM `PATOLOGIAS`"); + while ($row = $result->fetch_assoc()){ + $patologias[$x]=$row['nombre']; + $x++; + } + $html->assign("patologias",$patologias); + $html->display("add_eti.tpl"); + } + + +} +else @header('location:index.php'); + +?> diff --git a/add_gestor.php b/add_gestor.php new file mode 100644 index 0000000000000000000000000000000000000000..1c1824db6a20edf25b50ca78a13b59a996445698 --- /dev/null +++ b/add_gestor.php @@ -0,0 +1,63 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Añadir nuevo trabajdor +* Caso de uso: REGISTRAR TRABAJADOR +*/ + +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + // Comprueba que sigue en la sesión + $html=new Smarty; + + + + // Barra del menú + barra(); + // Fin de barra + + // Descargamos las variables de los formularios: + $dni_trabajador = ($_POST["dni_trabajador"]); + $nombre = ($_POST["nombre"]); + $apellidos = ($_POST["apellidos"]); + $nick = ($_POST["login"]); + $titulacion = ($_POST["titulacion"]); + $permisos = ($_POST["permisos"]); + $pass = sha1(mysqli_real_escape_string($conex, $_POST["pass"])); + $passrw= sha1(mysqli_real_escape_string($conex, $_POST["passrw"])); + + if ($dni_trabajador){ //Si hemos pulsado validar al cambiar un registro + if ($permisos!=0 && $permisos!=1 && $permisos!=2 && $permisos!=3 && $permisos > $chmod ) + $mensaje = 'El campo permisos debe ser "1" para permisos de lectura y escritura, y "0" para permisos de solo lectura.'; + else if ($pass != $passrw) + $mensaje="Las contraseñas no coinciden"; + else + { + // Comprobamos que no se repita login + $result = $conex->query("SELECT * FROM TRABAJADORES"); + while ($row = $result->fetch_assoc()){ + if ($row['login'] == $nick) + $mensaje = "El nick $nick, ya existe"; + else if ($row['dni_trabajador'] == $dni_trabajador) + $mensaje = "El DNI: '$dni_trabajador', ya existe"; + } + } + if (!$mensaje) + { + // Si todos los campos están bien entonces actualizamos el nuevo trabajador/usuario + if ($conex->query("INSERT INTO `TRABAJADORES` (`dni_trabajador`, `login`, `nombre`, `apellidos`, `contraseña`, `titulacion`, `permisos`) VALUES ('$dni_trabajador', '$nick', '$nombre', '$apellidos', '$pass', '$titulacion', '$permisos')")) + $mensaje= "Actualizado trabajador $nick"; + else $mensaje= "Error actualizando base de datos"; + mysqli_close($conex); + } + } + $html->assign("id_admin",$id_admin); + $html->assign("mensaje","$mensaje"); + $html->display("add_gestor.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/add_pac.php b/add_pac.php new file mode 100644 index 0000000000000000000000000000000000000000..652734960f795fc11ba266dbdc96ae9d8993c2c6 --- /dev/null +++ b/add_pac.php @@ -0,0 +1,120 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); + +/* +* Archivo de control. A�adir paciente, etiolog�a y patolog�a asociada +* Caso de uso: REGISTRAR PACIENTE <<include>> A�ADIR ETIOLOG�A +*/ + +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + //Recogemos los datos del formulario + $dni_paciente = ($_POST["dni"]); + $nombre = ($_POST["nombre"]); + $apellidos = ($_POST["apellidos"]); + $edad = ($_POST["edad"]); + $sexo = ($_POST["sexo"]); + $anotaciones = ($_POST["anotaciones"]); + $etiologia = ($_POST["etiologia"]); + $fecha_lesion =($_POST["fecha_lesion"]); + $cuadrantes = ($_POST["cuadrantes"]); + $comentarios = ($_POST["comentarios"]); + $patologia = ($_POST["patologia"]); + $mensaje = ""; + + + // Valores para el formulario: + // Tipo de ensayos + // Nombre + // Apellidos + // Edad + // Sexo + + + //Mostramos una tabla con todos los sujetos para marcar el que queremos + if($dni_paciente != ""){ + if ($result = $conex->query("SELECT * FROM `PACIENTES` ORDER BY `nombre` ASC")){ + while ($row = $result->fetch_assoc()) { + if($row['dni_paciente'] == $dni_paciente){ + $mensaje="El DNI: '$dni_paciente', ya existe."; + $dni_paciente = ""; + } + } + if (dni_paciente != "") {//Agregacion del paciente + if($anotaciones == ""){ + $sql="INSERT INTO `PACIENTES` (`dni_paciente`, `nombre`, `apellidos`, `edad`, `sexo`, `anotaciones`, `dni_trabajador`) + VALUES ('$dni_paciente', '$nombre', '$apellidos', '$edad', '$sexo', NULL, '$id_admin')"; + }else{ + $sql="INSERT INTO `PACIENTES` (`dni_paciente`, `nombre`, `apellidos`, `edad`, `sexo`, `anotaciones`, `dni_trabajador`) + VALUES ('$dni_paciente', '$nombre', '$apellidos', '$edad', '$sexo', '$anotaciones', '$id_admin')"; + } + + $result = $conex->query("SELECT `id_patologia` FROM `PATOLOGIAS` WHERE `nombre`='$patologia'"); + $row = $result->fetch_assoc(); + $patologia = $row['id_patologia']; + + if ($conex->query($sql)){ + $mensaje= "Actualizado resgistro de Pacientes para: '$nombre'"; + //A�adimos la etiolog�a vinculada al paciente + if($cuadrantes == "" && $comentarios == ""){ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$etiologia', '$fecha_lesion', NULL, NULL, '$patologia', '$dni_paciente')"; + }elseif ($cuadrantes != "" && $comentarios == ""){ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$etiologia', '$fecha_lesion', '$cuadrantes', NULL, '$patologia', '$dni_paciente')"; + }elseif($cuadrantes == "" && $comentarios != ""){ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$etiologia', '$fecha_lesion', NULL, '$comentarios', '$patologia', '$dni_paciente')"; + }else{ + $sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) + VALUES ('$etiologia', '$fecha_lesion', '$cuadrantes', '$comentarios', '$patologia', '$dni_paciente')"; + } + if (!$conex->query($sql)){ + $mensaje= "Error actualizando base de datos Etiologias"; + } + + + }else { + $mensaje= "Error actualizando base de datos"; + $sujeto = array($dni_paciente,$nombre,$apellidos,$sexo,$edad,$anotaciones); + } + + } + + } else { + $mensaje= "Ha habido un error inesperado."; + } + }else{ + $mensaje="Registro de un nuevo paciente"; + $sujeto = array("",$nombre,$apellidos,$sexo,$edad,$anotaciones); + + } + + //Necesitamos las patologias + $x=0; + $result = $conex->query("SELECT nombre, descripcion FROM `PATOLOGIAS`"); + while ($row = $result->fetch_assoc()){ + $patologias[$x]=$row['nombre']; + $x++; + } + + $html->assign("id_admin",$id_admin); + $html->assign("patologias",$patologias); + $html->assign("mensaje",$mensaje); + $html->assign("sujeto",$sujeto); + $html->display("add_pac.tpl"); + + + +} +else @header('location:index.php'); + +?> diff --git a/add_reg.php b/add_reg.php new file mode 100644 index 0000000000000000000000000000000000000000..6e44b66854d9971d8a7412a9ec25ec34d5630983 --- /dev/null +++ b/add_reg.php @@ -0,0 +1,78 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Realizar una prueba +* Inicio del caso de uso: REALIZAR UNA PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $dni = $_GET['id']; + $id_prueba = $_GET['id_prueba']; + $accion = $_GET['accion']; + + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + //Si hemos salido borramos la �ltima prueba creada + if ($accion==1 && $id_prueba!=""){ + $sql="DELETE FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba'"; + if ($conex->query($sql)){ + $mensaje ="Prueba anterior borrada correctamente"; + }else{ + $mensaje ="Error al borrar la prueba"; + } + } + + // Valores para el formulario: + // Tipo de ensayos + // Nombre + // Apellidos + // Edad + // Sexo + + //Necesitamos tipos de ensayos + $x=0; + $result = $conex->query("SELECT tipo FROM `ENSAYOS`"); + while ($row = $result->fetch_assoc()){ + $entrada[$x]=$row['tipo']; + $x++; + } + // asignamos variable a template + $html->assign("ensayos",$entrada); + + //Mostramos una tabla con todos los sujetos para marcar el que queremos + $x=0; + if ($result = $conex->query("SELECT * FROM `PACIENTES` ORDER BY `nombre` ASC")){ + while ($row = $result->fetch_assoc()) { + $date = date_create(date("Y-m-d"))->diff(date_create($row['edad'])); + if($date->y != 0){ + $date = $date->y . " años"; + }elseif($date->m != 0){ + $date = $date->m . " meses"; + }else{ + $date = $date->d . " días"; + } + + $campos[$x] = array($row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$date,$row['anotaciones'],$row['edad']); + if ($dni == $row['dni_paciente']) {$sujeto = array($row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']);} + $x++; + } + } else $mensaje= "Ha habido un error inesperado."; + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("sujeto",$sujeto); + $html->assign("campos",$campos); + + + $html->display("add_reg.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/add_reg_val.php b/add_reg_val.php new file mode 100644 index 0000000000000000000000000000000000000000..fe691e441428380f31921667eabb9e92e8047045 --- /dev/null +++ b/add_reg_val.php @@ -0,0 +1,95 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Realizar una prueba a un paciente +* Caso de uso: REALIZAR UNA PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + $id_admin= $_GET["variable"]; + $ensayo= $_POST['ensayo']; + $name= $_POST['nombre']; + $apellidos= $_POST['apellidos']; + $edad= $_POST['edad']; + $sexo= $_POST['sexo']; + $simetria= $_POST['simetria']; + $anotaciones=$_POST['anotaciones']; + $dni= $_POST['dni_paciente']; + + if ($result = $conex->query("SELECT count(`dni_paciente`) as num, `dni_paciente` FROM `PACIENTES` WHERE `dni_paciente`= '$dni'")){ + $row = $result->fetch_assoc(); + if($row['num'] == 1 && $row['dni_paciente'] == $dni){ + // recuperamos el id_ensayo con el ensayo + $result = $conex->query("SELECT id_ensayo, coloc_sensores, duracion, repeticiones FROM `ENSAYOS` WHERE `tipo` = '$ensayo'"); + $row = $result->fetch_assoc(); + $id_ensayo=$row['id_ensayo']; + $coloc_sensores=nl2br($row['coloc_sensores']); + $duracion=$row['duracion']; + $repeticiones=$row['repeticiones']; + if ($duracion == 10) $getESP = 'A'; + if ($duracion == 30) $getESP = 'B'; + if ($duracion == 45) $getESP = 'C'; + if ($duracion == 60) $getESP = 'D'; + if ($duracion == 75) $getESP = 'E'; + if ($duracion == 90) $getESP = 'F'; + + + //Hacemos el insert en la tabla de las pruebas de un paciente + if($simetria == "" && $anotaciones == ""){//Simetria y anotaciones vacias + $sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`) + VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), NULL, NULL)"; + }elseif ($simetria != "" && $anotaciones == ""){//Anotaciones vacias + $sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`) + VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), '$simetria', NULL)"; + }elseif ($simetria == "" && $anotaciones != ""){//Simetria vac�a + $sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`) + VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), NULL, '$anotaciones')"; + }else{//Ning�n campo vac�o + $sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`) + VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), '$simetria', '$anotaciones')"; + } + if (!$conex->query($sql)) + { + $mensaje.="Error: \n". $conex->error. "DNI: $dni"; + } + else { + $mensaje.= "Actualizada prueba "; + $result = $conex->query("SELECT max(`id_prueba`) as num FROM `PRUEBAS_PACIENTES` WHERE `dni_paciente`= '$dni'"); + $row = $result->fetch_assoc(); + $id_prueba = $row["num"]; + } + + $imagen = imagen('media/images/ensayo/',$ensayo); // Aqu� ejecutamos la funci�n para obtener la imagen y en caso de no existir poner una alternativa (por definir) + + $html->assign("imagen",$imagen); + $html->assign("segundos",$duracion); + $html->assign("coloc_sensores",$coloc_sensores); + $html->assign("get",$getESP); + $html->assign("repeticiones",$repeticiones); + $html->assign("ensayo",$ensayo); + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("id_prueba",$id_prueba); + $html->assign("dni_paciente",$dni); + $html->display("add_reg_val.tpl"); + + }else{ + $mensaje = "Error con el paciente DNI: $dni"; + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->display("add_reg.tpl"); + + } + } + +} +else @header('location:index.php'); + +?> diff --git a/bootstrap.php b/bootstrap.php new file mode 100644 index 0000000000000000000000000000000000000000..2c830468eddd46f99db9902c6416897e2aa4973e --- /dev/null +++ b/bootstrap.php @@ -0,0 +1,16 @@ +<?php +/** + * This file is part of the Smarty package. + * + * (c) Sebastian Bergmann <sebastian@phpunit.de> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +/** + * Load and register Smarty Autoloader + */ +if (!class_exists('Smarty_Autoloader')) { + include dirname(__FILE__) . '/Autoloader.php'; +} +Smarty_Autoloader::register(true); diff --git a/borrar_prueba.php b/borrar_prueba.php new file mode 100644 index 0000000000000000000000000000000000000000..376d391a5a25665af7da75d52be5eed31a985a14 --- /dev/null +++ b/borrar_prueba.php @@ -0,0 +1,116 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Gestionar ensayos +* Caso de uso: CREAR ENSAYO +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $id_prueba =$_GET["id"]; + + $html=new Smarty; + + + // Barra + barra(); + // Fin de barra + + // Valores para el formulario: + // Id ensayo + // Tipo + // Colocación sensores + // Duración + // Repeticiones + // Comentarios + // Fecha creación + + if($id_prueba!=""){//eliminar un ensayo + if ($result = $conex->query("SELECT `dni_paciente` FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba'")){ + $row = $result->fetch_assoc(); + $id_paciente = $row['dni_paciente']; + } + else { + $mensaje = "Error inesperado en captura del identificador del paciente"; + } + + $sql="DELETE FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba'"; + $id_ensayo = ""; + if ($conex->query($sql)){ + $mensaje ="Prueba borrada con éxito"; + }else{ + $mensaje ="Error al borrar la prueba"; + } + + + //Obtenemos las pruebas del paciente + $sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba + FROM ENSAYOS, PRUEBAS_PACIENTES + WHERE `dni_paciente`='$id_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo + ORDER BY fecha DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_prueba'], + $row['tipo'], + $row['fecha'], + $row['simetria'], + $row['anotaciones'] + ]; + $x++; + } + $html->assign("entrada",$entrada); + } + + //Obtenemos las etiologias del paciente + $sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre + FROM ETIOLOGIAS, PATOLOGIAS + WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia + ORDER BY fecha_lesion DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $etiologia[$x]=[ + $row['id_etiologia'], + $row['etiologia'], + $row['fecha_lesion'], + $row['cuadrantes'], + $row['comentarios'], + $row['nombre'] + ]; + $x++; + } + $html->assign("etiologia",$etiologia); + } + + //Obtenemos los datos del paciente + $sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$id_paciente'"; + $result=$conex->query($sql); + $row = $result->fetch_assoc(); + $sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']]; + $html->assign("sujeto",$sujeto); + + }else{ + $mensaje = "Error inesperado en captura del identificador de la prueba"; + } + + + + + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->display("pac_reg.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/borrar_prueba_sujeto.php b/borrar_prueba_sujeto.php new file mode 100644 index 0000000000000000000000000000000000000000..0af94bcf6dd5ce41559b92cd0df0ffacc790c64d --- /dev/null +++ b/borrar_prueba_sujeto.php @@ -0,0 +1,89 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Gestionar ensayos +* Caso de uso: CREAR ENSAYO +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $id_prueba_sujeto =$_GET["id"]; + + $html=new Smarty; + + + // Barra + barra(); + // Fin de barra + + // Valores para el formulario: + // Id ensayo + // Tipo + // Colocación sensores + // Duración + // Repeticiones + // Comentarios + // Fecha creación + + if($id_prueba_sujeto!=""){//eliminar una prueba + if ($result = $conex->query("SELECT `dni_paciente` FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba_sujeto'")){ + $row = $result->fetch_assoc(); + $id_paciente = $row['dni_paciente']; + } + else { + $mensaje = "Error inesperado en captura del identificador del paciente"; + } + + $sql="DELETE FROM `PRUEBAS_SUJETOS` WHERE `id_prueba_sujeto`='$id_prueba_sujeto'"; + $id_ensayo = ""; + if ($conex->query($sql)){ + $mensaje ="Prueba borrada con éxito"; + }else{ + $mensaje ="Error al borrar la prueba"; + } + + $sql="SELECT SUJETOS.edad, SUJETOS.sexo, tipo, fecha, simetria, PRUEBAS_SUJETOS.anotaciones, PRUEBAS_SUJETOS.id_prueba_sujeto + FROM ENSAYOS, PRUEBAS_SUJETOS, SUJETOS + WHERE ENSAYOS.id_ensayo=PRUEBAS_SUJETOS.id_ensayo AND SUJETOS.id_sujeto = PRUEBAS_SUJETOS.id_sujeto + ORDER BY fecha DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_prueba_sujeto'], + $row['tipo'], + $row['fecha'], + $row['sexo'], + $row['edad'], + $row['simetria'], + $row['anotaciones'] + ]; + $x++; + } + $html->assign("entrada",$entrada); + }else{ + $mensaje="Error al capturar las pruebas sobre los sujetos"; + } + $html->assign("id_admin",$id_admin); + $html->display("ver_pruebas_sujetos.tpl"); + + }else{ + $mensaje = "Error inesperado en captura del identificador de la prueba"; + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->display("pac_reg.tpl"); + } + + + + + + +} +else @header('location:index.php'); + +?> diff --git a/css/font-awesome.css b/css/font-awesome.css new file mode 100644 index 0000000000000000000000000000000000000000..ee906a8196d0fbd581c27a9d5615db4c250860f2 --- /dev/null +++ b/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/css/font-awesome.min.css b/css/font-awesome.min.css new file mode 100644 index 0000000000000000000000000000000000000000..540440ce89f2a408aa699b65100e18f15e0f09ca --- /dev/null +++ b/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000000000000000000000000000000000000..652bd8091535cee0f6673e58ce8ecf4e627dd864 --- /dev/null +++ b/css/styles.css @@ -0,0 +1,44 @@ + + +.board { + border: 10px solid #fafaf9; + background-color: #d4e7e3; + color: #141414; + padding: 15px; + font-size: 22px; + width: 50%; + /* height: 150px; */ + margin-bottom: 15px; +} + +#virtual-keyboard { + border: 5px #212F3D double; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + padding: 15px; + background-color: #525252; +} + +.keyboard-row { + text-align: center; + margin-bottom: 10px; + color: white; +} + +#virtual-keyboard a { + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + background: #000000; + padding: 3px 7px; + font-size: 30px; + color:#ffffff; + text-align: center; + margin-right: 15px; +} + +#virtual-keyboard a:hover { + text-decoration: none; + opacity: 0.8; +} \ No newline at end of file diff --git a/datos.php b/datos.php new file mode 100644 index 0000000000000000000000000000000000000000..95ba14b5c645ed924d6731c1d29bd65d5feeb3ee --- /dev/null +++ b/datos.php @@ -0,0 +1,67 @@ +<?php + // function conexdb(){ + // global $server, $usuario, $contrasena, $bd, $conex; + // $server='localhost:3307'; + // //$server='localhost:3307'; + // $usuario='admin'; + // $contrasena='supermnto'; + // $bd='velostat'; + // $conex = new mysqli($server,$usuario,$contrasena,$bd); + // if ($conex->connect_errno) { + // echo "Fallo al conectar a MySQL: (". $conex->connect_errno . ") ". $conex->connect_error; + // } + // } + require_once("funciones.php"); + + conexdb(); + // value=[[11810,58,0,629,480,24,0],[11911,43,0,573,498,79,0],[12012,42,0,570,496,78,0],[12113,41,0,571,496,75,0]] + // [[12,1,2,3,4,5,6,7,8],[17,1,2,3,4,5,6,7,8],[23,1,2,3,4,5,6,7,8]] + + // recuperamos el ultimo id_prueba del paciente + $result = $conex->query("SELECT id_prueba FROM `PRUEBAS_PACIENTES` ORDER BY id_prueba DESC"); + $row = $result->fetch_assoc(); + $id_prueba=$row['id_prueba']; + + + $output = $_REQUEST['value']; + echo "Recibiendo datos para ensayo ".$id_prueba."...<br> + "; + var_dump($output); + echo "<br> + "; + // quito 2 primeros y 2 ultimos corchete + $output = substr($output, 2 , -2); + // partimos por cada corchete + $datos = explode ("],[", $output); + + print_r ($datos)."<br> + "; + foreach ($datos as $toma) { + echo $toma."<br>"; + $toma = explode (",", $toma); + $i = 0; + for ($i=0; $i < 10 ; $i++) { + if (!$toma[$i]) $toma[$i]=0; + } + $values .= "( NULL, $toma[0], $toma[1], $toma[2], $toma[3], $toma[4], $toma[5], + $toma[6], '$id_prueba'),"; + } + // quitamos último coma + $values = substr($values, 0, -1); + + $sql = "INSERT INTO `DATOS_PRUEBAS_PACIENTES` + (`id_datos_pruebas_pacientes`, `s1`, `s2`, `s3`, `s4`, `s5`, `s6`, `timestamp`, `id_prueba`) + VALUES + ".$values ." + "; + echo $sql; + if (!$conex->query($sql)) + { + echo "<br> + Error actualizando registro: %s\n". $conex->error; + } + else echo "<br> + Actualizado + <br>"; + +?> \ No newline at end of file diff --git a/fonts/FontAwesome.otf b/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 Binary files /dev/null and b/fonts/FontAwesome.otf differ diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 Binary files /dev/null and b/fonts/fontawesome-webfont.eot differ diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..855c845e538b65548118279537a04eab2ec6ef0d --- /dev/null +++ b/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg> +<metadata> +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. +</metadata> +<defs> +<font id="FontAwesome" horiz-adv-x="1536" > + <font-face + font-family="FontAwesome" + font-weight="400" + font-stretch="normal" + units-per-em="1792" + panose-1="0 0 0 0 0 0 0 0 0 0" + ascent="1536" + descent="-256" + bbox="-1.02083 -256.962 2304.6 1537.02" + underline-thickness="0" + underline-position="0" + unicode-range="U+0020-F500" + /> +<missing-glyph horiz-adv-x="896" +d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> + <glyph glyph-name=".notdef" horiz-adv-x="896" +d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" + /> + <glyph glyph-name="space" unicode=" " horiz-adv-x="448" + /> + <glyph glyph-name="dieresis" unicode="¨" horiz-adv-x="1792" + /> + <glyph glyph-name="copyright" unicode="©" horiz-adv-x="1792" + /> + <glyph glyph-name="registered" unicode="®" horiz-adv-x="1792" + /> + <glyph glyph-name="acute" unicode="´" horiz-adv-x="1792" + /> + <glyph glyph-name="AE" unicode="Æ" horiz-adv-x="1792" + /> + <glyph glyph-name="Oslash" unicode="Ø" horiz-adv-x="1792" + /> + <glyph glyph-name="trademark" unicode="™" horiz-adv-x="1792" + /> + <glyph glyph-name="infinity" unicode="∞" horiz-adv-x="1792" + /> + <glyph glyph-name="notequal" unicode="≠" horiz-adv-x="1792" + /> + <glyph glyph-name="glass" unicode="" horiz-adv-x="1792" +d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> + <glyph glyph-name="music" unicode="" +d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 +t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> + <glyph glyph-name="search" unicode="" horiz-adv-x="1664" +d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 +t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> + <glyph glyph-name="envelope" unicode="" horiz-adv-x="1792" +d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 +t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z +M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="heart" unicode="" horiz-adv-x="1792" +d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 +q-18 -18 -44 -18z" /> + <glyph glyph-name="star" unicode="" horiz-adv-x="1664" +d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 +l502 -73q56 -9 56 -46z" /> + <glyph glyph-name="star_empty" unicode="" horiz-adv-x="1664" +d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 +l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> + <glyph glyph-name="user" unicode="" horiz-adv-x="1280" +d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5 +t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="film" unicode="" horiz-adv-x="1920" +d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 +q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 +t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 +q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 +t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="th_large" unicode="" horiz-adv-x="1664" +d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 +h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> + <glyph glyph-name="th" unicode="" horiz-adv-x="1792" +d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 +h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 +q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> + <glyph glyph-name="th_list" unicode="" horiz-adv-x="1792" +d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 +h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> + <glyph glyph-name="ok" unicode="" horiz-adv-x="1792" +d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> + <glyph glyph-name="remove" unicode="" horiz-adv-x="1408" +d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 +t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> + <glyph glyph-name="zoom_in" unicode="" horiz-adv-x="1664" +d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 +q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 +t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> + <glyph glyph-name="zoom_out" unicode="" horiz-adv-x="1664" +d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z +M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z +" /> + <glyph glyph-name="off" unicode="" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 +t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> + <glyph glyph-name="signal" unicode="" horiz-adv-x="1792" +d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 +v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> + <glyph glyph-name="cog" unicode="" +d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 +q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 +l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 +q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> + <glyph glyph-name="trash" unicode="" horiz-adv-x="1408" +d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 +q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 +q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> + <glyph glyph-name="home" unicode="" horiz-adv-x="1664" +d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 +l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> + <glyph glyph-name="file_alt" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +" /> + <glyph glyph-name="time" unicode="" +d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="road" unicode="" horiz-adv-x="1920" +d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 +q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> + <glyph glyph-name="download_alt" unicode="" horiz-adv-x="1664" +d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 +q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> + <glyph glyph-name="download" unicode="" +d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 +t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="upload" unicode="" +d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 +t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="inbox" unicode="" +d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 +q25 -61 25 -123z" /> + <glyph glyph-name="play_circle" unicode="" +d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="repeat" unicode="" +d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9 +l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> + <glyph glyph-name="refresh" unicode="" +d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 +q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 +q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="list_alt" unicode="" horiz-adv-x="1792" +d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z +M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 +t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 +t47 -113z" /> + <glyph glyph-name="lock" unicode="" horiz-adv-x="1152" +d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> + <glyph glyph-name="flag" unicode="" horiz-adv-x="1792" +d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 +t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> + <glyph glyph-name="headphones" unicode="" horiz-adv-x="1664" +d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 +t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 +t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> + <glyph glyph-name="volume_off" unicode="" horiz-adv-x="768" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="volume_down" unicode="" horiz-adv-x="1152" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 +t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> + <glyph glyph-name="volume_up" unicode="" horiz-adv-x="1664" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 +t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 +t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 +t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> + <glyph glyph-name="qrcode" unicode="" horiz-adv-x="1408" +d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z +M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> + <glyph glyph-name="barcode" unicode="" horiz-adv-x="1792" +d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z +M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> + <glyph glyph-name="tag" unicode="" +d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 +l715 -714q37 -39 37 -91z" /> + <glyph glyph-name="tags" unicode="" horiz-adv-x="1920" +d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 +l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> + <glyph glyph-name="book" unicode="" horiz-adv-x="1664" +d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 +q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 +q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 +t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> + <glyph glyph-name="bookmark" unicode="" horiz-adv-x="1280" +d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> + <glyph glyph-name="print" unicode="" horiz-adv-x="1664" +d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 +v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> + <glyph glyph-name="camera" unicode="" horiz-adv-x="1920" +d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 +q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="font" unicode="" horiz-adv-x="1664" +d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 +q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 +q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> + <glyph glyph-name="bold" unicode="" horiz-adv-x="1408" +d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 +q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 +t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 +t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> + <glyph glyph-name="italic" unicode="" horiz-adv-x="1024" +d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 +q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> + <glyph glyph-name="text_height" unicode="" horiz-adv-x="1792" +d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 +t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 +q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 +q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> + <glyph glyph-name="text_width" unicode="" +d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 +t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 +q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 +t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 +t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> + <glyph glyph-name="align_left" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 +t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_center" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 +h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_right" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 +t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_justify" unicode="" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 +t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> + <glyph glyph-name="list" unicode="" horiz-adv-x="1792" +d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 +t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 +q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 +t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 +q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="indent_left" unicode="" horiz-adv-x="1792" +d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 +t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 +q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="indent_right" unicode="" horiz-adv-x="1792" +d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 +t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 +q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="facetime_video" unicode="" horiz-adv-x="1792" +d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 +q39 -17 39 -59z" /> + <glyph glyph-name="picture" unicode="" horiz-adv-x="1920" +d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 +q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="pencil" unicode="" +d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 +q53 0 91 -38l235 -234q37 -39 37 -91z" /> + <glyph glyph-name="map_marker" unicode="" horiz-adv-x="1024" +d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> + <glyph glyph-name="adjust" unicode="" +d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="tint" unicode="" horiz-adv-x="1024" +d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 +q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> + <glyph glyph-name="edit" unicode="" horiz-adv-x="1792" +d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 +q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 +l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> + <glyph glyph-name="share" unicode="" horiz-adv-x="1664" +d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 +q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 +t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="check" unicode="" horiz-adv-x="1664" +d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 +q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 +q24 -24 24 -57t-24 -57z" /> + <glyph glyph-name="move" unicode="" horiz-adv-x="1792" +d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 +t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="step_backward" unicode="" horiz-adv-x="1024" +d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" /> + <glyph glyph-name="fast_backward" unicode="" horiz-adv-x="1792" +d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710 +q19 19 32 13t13 -32v-710q4 10 13 19z" /> + <glyph glyph-name="backward" unicode="" horiz-adv-x="1664" +d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" /> + <glyph glyph-name="play" unicode="" horiz-adv-x="1408" +d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> + <glyph glyph-name="pause" unicode="" +d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> + <glyph glyph-name="stop" unicode="" +d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="forward" unicode="" horiz-adv-x="1664" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> + <glyph glyph-name="fast_forward" unicode="" horiz-adv-x="1792" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710 +q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> + <glyph glyph-name="step_forward" unicode="" horiz-adv-x="1024" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" /> + <glyph glyph-name="eject" unicode="" horiz-adv-x="1538" +d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> + <glyph glyph-name="chevron_left" unicode="" horiz-adv-x="1280" +d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="chevron_right" unicode="" horiz-adv-x="1280" +d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="plus_sign" unicode="" +d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 +t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="minus_sign" unicode="" +d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="remove_sign" unicode="" +d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 +q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ok_sign" unicode="" +d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="question_sign" unicode="" +d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 +q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="info_sign" unicode="" +d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 +t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="screenshot" unicode="" +d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 +q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 +q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> + <glyph glyph-name="remove_circle" unicode="" +d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 +l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 +t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ok_circle" unicode="" +d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 +t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ban_circle" unicode="" +d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 +t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> + <glyph glyph-name="arrow_left" unicode="" +d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 +t32.5 -90.5z" /> + <glyph glyph-name="arrow_right" unicode="" +d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> + <glyph glyph-name="arrow_up" unicode="" horiz-adv-x="1664" +d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 +q37 -39 37 -91z" /> + <glyph glyph-name="arrow_down" unicode="" horiz-adv-x="1664" +d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> + <glyph glyph-name="share_alt" unicode="" horiz-adv-x="1792" +d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 +t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> + <glyph glyph-name="resize_full" unicode="" +d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 +q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> + <glyph glyph-name="resize_small" unicode="" +d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 +t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> + <glyph glyph-name="plus" unicode="" horiz-adv-x="1408" +d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> + <glyph glyph-name="minus" unicode="" horiz-adv-x="1408" +d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> + <glyph glyph-name="asterisk" unicode="" horiz-adv-x="1664" +d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 +q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> + <glyph glyph-name="exclamation_sign" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 +q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> + <glyph glyph-name="gift" unicode="" +d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 +q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 +t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> + <glyph glyph-name="leaf" unicode="" horiz-adv-x="1792" +d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 +q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 +t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> + <glyph glyph-name="fire" unicode="" horiz-adv-x="1408" +d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 +q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> + <glyph glyph-name="eye_open" unicode="" horiz-adv-x="1792" +d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 +t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> + <glyph glyph-name="eye_close" unicode="" horiz-adv-x="1792" +d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 +q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 +q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z +" /> + <glyph glyph-name="warning_sign" unicode="" horiz-adv-x="1792" +d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 +q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> + <glyph glyph-name="plane" unicode="" horiz-adv-x="1408" +d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 +q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> + <glyph glyph-name="calendar" unicode="" horiz-adv-x="1664" +d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z +M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 +q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 +h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="random" unicode="" horiz-adv-x="1792" +d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 +t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 +v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 +t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> + <glyph glyph-name="comment" unicode="" horiz-adv-x="1792" +d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 +q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="magnet" unicode="" +d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 +q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> + <glyph glyph-name="chevron_up" unicode="" horiz-adv-x="1792" +d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> + <glyph glyph-name="chevron_down" unicode="" horiz-adv-x="1792" +d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> + <glyph glyph-name="retweet" unicode="" horiz-adv-x="1920" +d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21 +zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z +" /> + <glyph glyph-name="shopping_cart" unicode="" horiz-adv-x="1664" +d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 +t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="folder_close" unicode="" horiz-adv-x="1664" +d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> + <glyph glyph-name="folder_open" unicode="" horiz-adv-x="1920" +d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 +t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> + <glyph glyph-name="resize_vertical" unicode="" horiz-adv-x="768" +d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="resize_horizontal" unicode="" horiz-adv-x="1792" +d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="bar_chart" unicode="" horiz-adv-x="2048" +d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> + <glyph glyph-name="twitter_sign" unicode="" +d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 +q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 +t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="facebook_sign" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960z" /> + <glyph glyph-name="camera_retro" unicode="" horiz-adv-x="1792" +d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 +t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 +q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="key" unicode="" horiz-adv-x="1792" +d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 +l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 +t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> + <glyph glyph-name="cogs" unicode="" horiz-adv-x="1920" +d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 +l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 +l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 +q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 +t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 +q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 +q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> + <glyph glyph-name="comments" unicode="" horiz-adv-x="1792" +d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 +q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 +q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> + <glyph glyph-name="thumbs_up_alt" unicode="" +d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 +t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 +q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 +q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> + <glyph glyph-name="thumbs_down_alt" unicode="" +d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 +t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z +M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 +h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" /> + <glyph glyph-name="star_half" unicode="" horiz-adv-x="896" +d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> + <glyph glyph-name="heart_empty" unicode="" horiz-adv-x="1792" +d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 +q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 +q224 0 351 -124t127 -344z" /> + <glyph glyph-name="signout" unicode="" horiz-adv-x="1664" +d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 +q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> + <glyph glyph-name="linkedin_sign" unicode="" +d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 +q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="pushpin" unicode="" horiz-adv-x="1152" +d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 +t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> + <glyph glyph-name="external_link" unicode="" horiz-adv-x="1792" +d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 +q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> + <glyph glyph-name="signin" unicode="" +d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 +q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="trophy" unicode="" horiz-adv-x="1664" +d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 +t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 +q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> + <glyph glyph-name="github_sign" unicode="" +d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4 +q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4 +t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16 +q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="upload_alt" unicode="" horiz-adv-x="1664" +d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 +t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> + <glyph glyph-name="lemon" unicode="" +d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 +q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 +q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 +q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" /> + <glyph glyph-name="phone" unicode="" horiz-adv-x="1408" +d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186 +q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14 +t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> + <glyph glyph-name="check_empty" unicode="" horiz-adv-x="1408" +d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 +q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="bookmark_empty" unicode="" horiz-adv-x="1280" +d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 +q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> + <glyph glyph-name="phone_sign" unicode="" +d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5 +t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5 +t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z +" /> + <glyph glyph-name="twitter" unicode="" horiz-adv-x="1664" +d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 +q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> + <glyph glyph-name="facebook" unicode="" horiz-adv-x="1024" +d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> + <glyph glyph-name="github" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24 +q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5 +t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12 +q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z +M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" /> + <glyph glyph-name="unlock" unicode="" horiz-adv-x="1664" +d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 +t316.5 -131.5t131.5 -316.5z" /> + <glyph glyph-name="credit_card" unicode="" horiz-adv-x="1920" +d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 +q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> + <glyph glyph-name="rss" unicode="" horiz-adv-x="1408" +d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 +t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 +q187 -186 294 -425.5t120 -501.5z" /> + <glyph glyph-name="hdd" unicode="" +d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 +h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 +l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> + <glyph glyph-name="bullhorn" unicode="" horiz-adv-x="1792" +d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 +t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> + <glyph glyph-name="bell" unicode="" horiz-adv-x="1792" +d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z +M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 +t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> + <glyph glyph-name="certificate" unicode="" +d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 +l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 +l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> + <glyph glyph-name="hand_right" unicode="" horiz-adv-x="1792" +d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 +q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 +q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 +t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> + <glyph glyph-name="hand_left" unicode="" horiz-adv-x="1792" +d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5 +t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z +M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67 +q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="hand_up" unicode="" +d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 +q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 +t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 +q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> + <glyph glyph-name="hand_down" unicode="" +d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 +t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 +q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 +q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> + <glyph glyph-name="circle_arrow_left" unicode="" +d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_right" unicode="" +d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_up" unicode="" +d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_down" unicode="" +d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="globe" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 +q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 +q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 +q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 +t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 +q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 +q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 +t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 +t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 +q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 +q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 +q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 +t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 +q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 +q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> + <glyph glyph-name="wrench" unicode="" horiz-adv-x="1664" +d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 +t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> + <glyph glyph-name="tasks" unicode="" horiz-adv-x="1792" +d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 +t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> + <glyph glyph-name="filter" unicode="" horiz-adv-x="1408" +d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> + <glyph glyph-name="briefcase" unicode="" horiz-adv-x="1792" +d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 +t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> + <glyph glyph-name="fullscreen" unicode="" +d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 +l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z +" /> + <glyph glyph-name="group" unicode="" horiz-adv-x="1920" +d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 +t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 +t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 +t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> + <glyph glyph-name="link" unicode="" horiz-adv-x="1664" +d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 +l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 +t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 +q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> + <glyph glyph-name="cloud" unicode="" horiz-adv-x="1920" +d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z +" /> + <glyph glyph-name="beaker" unicode="" horiz-adv-x="1664" +d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> + <glyph glyph-name="cut" unicode="" horiz-adv-x="1792" +d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 +q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 +q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 +q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 +q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> + <glyph glyph-name="copy" unicode="" horiz-adv-x="1792" +d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 +h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> + <glyph glyph-name="paper_clip" unicode="" horiz-adv-x="1408" +d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 +l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 +z" /> + <glyph glyph-name="save" unicode="" +d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 +h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> + <glyph glyph-name="sign_blank" unicode="" +d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="reorder" unicode="" +d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 +t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="ul" unicode="" horiz-adv-x="1792" +d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 +t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z +M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="ol" unicode="" horiz-adv-x="1792" +d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 +q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 +t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216 +q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="strikethrough" unicode="" horiz-adv-x="1792" +d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 +l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 +l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> + <glyph glyph-name="underline" unicode="" +d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 +q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 +q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 +q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> + <glyph glyph-name="table" unicode="" horiz-adv-x="1664" +d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 +v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 +q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 +q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 +z" /> + <glyph glyph-name="magic" unicode="" horiz-adv-x="1664" +d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 +l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> + <glyph glyph-name="truck" unicode="" horiz-adv-x="1792" +d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 +t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 +t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> + <glyph glyph-name="pinterest" unicode="" +d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 +q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 +q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="pinterest_sign" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 +t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 +t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> + <glyph glyph-name="google_plus_sign" unicode="" +d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 +h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="google_plus" unicode="" horiz-adv-x="2304" +d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 +q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" /> + <glyph glyph-name="money" unicode="" horiz-adv-x="1920" +d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 +v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> + <glyph glyph-name="caret_down" unicode="" horiz-adv-x="1024" +d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> + <glyph glyph-name="caret_up" unicode="" horiz-adv-x="1024" +d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="caret_left" unicode="" horiz-adv-x="640" +d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="caret_right" unicode="" horiz-adv-x="640" +d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="columns" unicode="" horiz-adv-x="1664" +d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> + <glyph glyph-name="sort" unicode="" horiz-adv-x="1024" +d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="sort_down" unicode="" horiz-adv-x="1024" +d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> + <glyph glyph-name="sort_up" unicode="" horiz-adv-x="1024" +d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="envelope_alt" unicode="" horiz-adv-x="1792" +d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 +q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> + <glyph glyph-name="linkedin" unicode="" +d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 +q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> + <glyph glyph-name="undo" unicode="" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 +t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> + <glyph glyph-name="legal" unicode="" horiz-adv-x="1792" +d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 +t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 +q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 +q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> + <glyph glyph-name="dashboard" unicode="" horiz-adv-x="1792" +d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 +t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 +t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 +q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="comment_alt" unicode="" horiz-adv-x="1792" +d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 +q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 +t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="comments_alt" unicode="" horiz-adv-x="1792" +d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 +t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 +t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 +q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> + <glyph glyph-name="bolt" unicode="" horiz-adv-x="896" +d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> + <glyph glyph-name="sitemap" unicode="" horiz-adv-x="1792" +d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 +q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 +z" /> + <glyph glyph-name="umbrella" unicode="" horiz-adv-x="1664" +d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 +q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 +q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> + <glyph glyph-name="paste" unicode="" horiz-adv-x="1792" +d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 +h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> + <glyph glyph-name="light_bulb" unicode="" horiz-adv-x="1024" +d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 +q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 +q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 +t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> + <glyph glyph-name="exchange" unicode="" horiz-adv-x="1792" +d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 +q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> + <glyph glyph-name="cloud_download" unicode="" horiz-adv-x="1920" +d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 +q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> + <glyph glyph-name="cloud_upload" unicode="" horiz-adv-x="1920" +d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 +q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> + <glyph glyph-name="user_md" unicode="" horiz-adv-x="1408" +d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 +t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 +t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 +t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="stethoscope" unicode="" horiz-adv-x="1408" +d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 +t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 +t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="suitcase" unicode="" horiz-adv-x="1792" +d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 +t66 -158z" /> + <glyph glyph-name="bell_alt" unicode="" horiz-adv-x="1792" +d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 +t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> + <glyph glyph-name="coffee" unicode="" horiz-adv-x="1920" +d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 +t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="food" unicode="" horiz-adv-x="1408" +d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 +t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> + <glyph glyph-name="file_text_alt" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 +q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> + <glyph glyph-name="building" unicode="" horiz-adv-x="1408" +d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> + <glyph glyph-name="hospital" unicode="" horiz-adv-x="1408" +d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 +t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 +v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> + <glyph glyph-name="ambulance" unicode="" horiz-adv-x="1920" +d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 +q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="medkit" unicode="" horiz-adv-x="1792" +d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 +q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> + <glyph glyph-name="fighter_jet" unicode="" horiz-adv-x="1920" +d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 +q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" /> + <glyph glyph-name="beer" unicode="" horiz-adv-x="1664" +d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> + <glyph glyph-name="h_sign" unicode="" +d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="f0fe" unicode="" +d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="double_angle_left" unicode="" horiz-adv-x="1024" +d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 +t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_right" unicode="" horiz-adv-x="1024" +d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 +l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_up" unicode="" horiz-adv-x="1152" +d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 +q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_down" unicode="" horiz-adv-x="1152" +d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 +t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="angle_left" unicode="" horiz-adv-x="640" +d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="angle_right" unicode="" horiz-adv-x="640" +d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="angle_up" unicode="" horiz-adv-x="1152" +d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="angle_down" unicode="" horiz-adv-x="1152" +d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="desktop" unicode="" horiz-adv-x="1920" +d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 +t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="laptop" unicode="" horiz-adv-x="1920" +d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z +M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> + <glyph glyph-name="tablet" unicode="" horiz-adv-x="1152" +d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 +q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> + <glyph glyph-name="mobile_phone" unicode="" horiz-adv-x="768" +d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 +q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> + <glyph glyph-name="circle_blank" unicode="" +d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 +t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="quote_left" unicode="" horiz-adv-x="1664" +d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z +M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> + <glyph glyph-name="quote_right" unicode="" horiz-adv-x="1664" +d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 +v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> + <glyph glyph-name="spinner" unicode="" horiz-adv-x="1792" +d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 +t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z +M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 +q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" /> + <glyph glyph-name="circle" unicode="" +d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="reply" unicode="" horiz-adv-x="1792" +d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 +l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> + <glyph glyph-name="github_alt" unicode="" horiz-adv-x="1664" +d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 +q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 +t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 +q0 -87 -27 -168q136 -160 136 -398z" /> + <glyph glyph-name="folder_close_alt" unicode="" horiz-adv-x="1664" +d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 +q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> + <glyph glyph-name="folder_open_alt" unicode="" horiz-adv-x="1920" +d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 +v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z +" /> + <glyph glyph-name="expand_alt" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="collapse_alt" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="smile" unicode="" +d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 +t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="frown" unicode="" +d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 +t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="meh" unicode="" +d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="gamepad" unicode="" horiz-adv-x="1920" +d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 +t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 +t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> + <glyph glyph-name="keyboard" unicode="" horiz-adv-x="1920" +d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 +h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 +h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 +q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 +h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="flag_alt" unicode="" horiz-adv-x="1792" +d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 +h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 +q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> + <glyph glyph-name="flag_checkered" unicode="" horiz-adv-x="1792" +d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 +q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 +q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 +q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> + <glyph glyph-name="terminal" unicode="" horiz-adv-x="1664" +d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 +t9 -23z" /> + <glyph glyph-name="code" unicode="" horiz-adv-x="1920" +d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 +l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> + <glyph glyph-name="reply_all" unicode="" horiz-adv-x="1792" +d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 +q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> + <glyph glyph-name="star_half_empty" unicode="" horiz-adv-x="1664" +d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 +l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> + <glyph glyph-name="location_arrow" unicode="" horiz-adv-x="1408" +d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> + <glyph glyph-name="crop" unicode="" horiz-adv-x="1664" +d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 +v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> + <glyph glyph-name="code_fork" unicode="" horiz-adv-x="1024" +d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 +q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 +q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="unlink" unicode="" horiz-adv-x="1664" +d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 +q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 +l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 +t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> + <glyph glyph-name="question" unicode="" horiz-adv-x="1024" +d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 +t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> + <glyph glyph-name="_279" unicode="" horiz-adv-x="640" +d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 +q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> + <glyph glyph-name="exclamation" unicode="" horiz-adv-x="640" +d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> + <glyph glyph-name="superscript" unicode="" +d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z +M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5 +t-65.5 -51.5t-30.5 -63h232v80h126z" /> + <glyph glyph-name="subscript" unicode="" +d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z +M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73 +h232v80h126z" /> + <glyph glyph-name="_283" unicode="" horiz-adv-x="1920" +d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> + <glyph glyph-name="puzzle_piece" unicode="" horiz-adv-x="1664" +d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 +t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 +q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 +q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> + <glyph glyph-name="microphone" unicode="" horiz-adv-x="1152" +d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 +t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> + <glyph glyph-name="microphone_off" unicode="" horiz-adv-x="1408" +d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 +q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 +t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> + <glyph glyph-name="shield" unicode="" horiz-adv-x="1280" +d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 +t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="calendar_empty" unicode="" horiz-adv-x="1664" +d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 +q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="fire_extinguisher" unicode="" horiz-adv-x="1408" +d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 +q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 +q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> + <glyph glyph-name="rocket" unicode="" horiz-adv-x="1664" +d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 +q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> + <glyph glyph-name="maxcdn" unicode="" horiz-adv-x="1792" +d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> + <glyph glyph-name="chevron_sign_left" unicode="" +d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_right" unicode="" +d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_up" unicode="" +d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_down" unicode="" +d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="html5" unicode="" horiz-adv-x="1408" +d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> + <glyph glyph-name="css3" unicode="" horiz-adv-x="1792" +d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> + <glyph glyph-name="anchor" unicode="" horiz-adv-x="1792" +d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 +q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 +t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> + <glyph glyph-name="unlock_alt" unicode="" horiz-adv-x="1152" +d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 +v-320h736z" /> + <glyph glyph-name="bullseye" unicode="" +d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 +t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ellipsis_horizontal" unicode="" horiz-adv-x="1408" +d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> + <glyph glyph-name="ellipsis_vertical" unicode="" horiz-adv-x="384" +d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> + <glyph glyph-name="_303" unicode="" +d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128 +q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="play_sign" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 +q16 -8 32 -8q17 0 32 9z" /> + <glyph glyph-name="ticket" unicode="" horiz-adv-x="1792" +d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 +t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> + <glyph glyph-name="minus_sign_alt" unicode="" +d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="check_minus" unicode="" horiz-adv-x="1408" +d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 +t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="level_up" unicode="" horiz-adv-x="1024" +d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> + <glyph glyph-name="level_down" unicode="" horiz-adv-x="1024" +d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> + <glyph glyph-name="check_sign" unicode="" +d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 +t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="edit_sign" unicode="" +d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_312" unicode="" +d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 +q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="share_sign" unicode="" +d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 +t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="compass" unicode="" +d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="collapse" unicode="" +d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="collapse_top" unicode="" +d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_317" unicode="" +d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 +t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="eur" unicode="" horiz-adv-x="1024" +d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 +t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 +l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> + <glyph glyph-name="gbp" unicode="" horiz-adv-x="1024" +d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 +q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> + <glyph glyph-name="usd" unicode="" horiz-adv-x="1024" +d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 +t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 +t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 +t53 -63.5t31.5 -76.5t13 -94z" /> + <glyph glyph-name="inr" unicode="" horiz-adv-x="898" +d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 +q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> + <glyph glyph-name="jpy" unicode="" horiz-adv-x="1027" +d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 +l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> + <glyph glyph-name="rub" unicode="" horiz-adv-x="1280" +d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 +q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> + <glyph glyph-name="krw" unicode="" horiz-adv-x="1792" +d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 +t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 +q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> + <glyph glyph-name="btc" unicode="" horiz-adv-x="1280" +d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 +l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 +t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> + <glyph glyph-name="file" unicode="" +d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> + <glyph glyph-name="file_text" unicode="" +d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 +q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> + <glyph glyph-name="sort_by_alphabet" unicode="" horiz-adv-x="1664" +d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 +v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 +l230 -662h70z" /> + <glyph glyph-name="_329" unicode="" horiz-adv-x="1664" +d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 +v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 +v119h121z" /> + <glyph glyph-name="sort_by_attributes" unicode="" horiz-adv-x="1792" +d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 +q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> + <glyph glyph-name="sort_by_attributes_alt" unicode="" horiz-adv-x="1792" +d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 +q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> + <glyph glyph-name="sort_by_order" unicode="" +d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 +zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 +t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> + <glyph glyph-name="sort_by_order_alt" unicode="" +d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 +t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 +q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> + <glyph glyph-name="_334" unicode="" horiz-adv-x="1664" +d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 +q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 +t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> + <glyph glyph-name="_335" unicode="" horiz-adv-x="1664" +d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 +t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 +t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> + <glyph glyph-name="youtube_sign" unicode="" +d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 +q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 +q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 +q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38 +q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5 +h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="youtube" unicode="" +d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 +q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 +q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 +q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51 +q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> + <glyph glyph-name="xing" unicode="" horiz-adv-x="1408" +d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 +q25 45 64 45h241q22 0 31 -15z" /> + <glyph glyph-name="xing_sign" unicode="" +d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 +l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="youtube_play" unicode="" horiz-adv-x="1792" +d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5 +l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136 +q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" /> + <glyph glyph-name="dropbox" unicode="" horiz-adv-x="1792" +d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> + <glyph glyph-name="stackexchange" unicode="" +d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" /> + <glyph glyph-name="instagram" unicode="" +d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270 +q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5 +t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317 +q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" /> + <glyph glyph-name="flickr" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 +t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> + <glyph glyph-name="adn" unicode="" +d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="f171" unicode="" horiz-adv-x="1408" +d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 +t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 +t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 +t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> + <glyph glyph-name="bitbucket_sign" unicode="" +d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 +t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z +M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="tumblr" unicode="" horiz-adv-x="1024" +d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 +q78 2 134 29z" /> + <glyph glyph-name="tumblr_sign" unicode="" +d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z +M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="long_arrow_down" unicode="" horiz-adv-x="768" +d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> + <glyph glyph-name="long_arrow_up" unicode="" horiz-adv-x="768" +d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> + <glyph glyph-name="long_arrow_left" unicode="" horiz-adv-x="1792" +d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> + <glyph glyph-name="long_arrow_right" unicode="" horiz-adv-x="1792" +d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> + <glyph glyph-name="apple" unicode="" horiz-adv-x="1408" +d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 +q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> + <glyph glyph-name="windows" unicode="" horiz-adv-x="1664" +d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> + <glyph glyph-name="android" unicode="" horiz-adv-x="1408" +d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 +t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 +h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> + <glyph glyph-name="linux" unicode="" +d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z +M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 +q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 +q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 +t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 +q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 +q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 +q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 +q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4 +t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5 +t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43 +q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49 +t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54 +q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5 +t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5 +t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> + <glyph glyph-name="dribble" unicode="" +d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 +t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 +q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 +t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="skype" unicode="" +d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 +t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 +q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 +q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> + <glyph glyph-name="foursquare" unicode="" horiz-adv-x="1280" +d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z +M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 +l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> + <glyph glyph-name="trello" unicode="" +d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 +q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="female" unicode="" horiz-adv-x="1280" +d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 +q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="male" unicode="" horiz-adv-x="1024" +d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z +M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="gittip" unicode="" +d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="sun" unicode="" horiz-adv-x="1792" +d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 +l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 +q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> + <glyph glyph-name="_366" unicode="" +d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 +t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> + <glyph glyph-name="archive" unicode="" horiz-adv-x="1792" +d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 +q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> + <glyph glyph-name="bug" unicode="" horiz-adv-x="1664" +d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 +q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 +t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> + <glyph glyph-name="vk" unicode="" horiz-adv-x="1920" +d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 +t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 +q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24 +q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 +q39 5 64 -2.5t31 -16.5z" /> + <glyph glyph-name="weibo" unicode="" horiz-adv-x="1792" +d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 +q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 +q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 +q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z +M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> + <glyph glyph-name="renren" unicode="" +d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 +q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> + <glyph glyph-name="_372" unicode="" horiz-adv-x="1408" +d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 +t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 +t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 +t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> + <glyph glyph-name="stack_exchange" unicode="" horiz-adv-x="1280" +d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z +" /> + <glyph glyph-name="_374" unicode="" +d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 +t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="arrow_circle_alt_left" unicode="" +d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 +t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_376" unicode="" +d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z +M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="dot_circle_alt" unicode="" +d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 +t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_378" unicode="" horiz-adv-x="1664" +d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 +q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> + <glyph glyph-name="vimeo_square" unicode="" +d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 +q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_380" unicode="" horiz-adv-x="1152" +d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 +q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> + <glyph glyph-name="plus_square_o" unicode="" horiz-adv-x="1408" +d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 +q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_382" unicode="" horiz-adv-x="2176" +d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 +t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 +q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> + <glyph glyph-name="_383" unicode="" horiz-adv-x="1664" +d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 +q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 +t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> + <glyph glyph-name="_384" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 +q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 +t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> + <glyph glyph-name="_385" unicode="" horiz-adv-x="1792" +d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 +t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 +t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 +t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 +t273 -182.5t331.5 -68z" /> + <glyph glyph-name="_386" unicode="" horiz-adv-x="1792" +d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> + <glyph glyph-name="_387" unicode="" horiz-adv-x="2048" +d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 +q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> + <glyph glyph-name="_388" unicode="" horiz-adv-x="2304" +d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 +q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> + <glyph glyph-name="_389" unicode="" +d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 +q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> + <glyph glyph-name="uniF1A0" unicode="" +d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 +t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" /> + <glyph glyph-name="f1a1" unicode="" horiz-adv-x="1792" +d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 +t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 +q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 +t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_392" unicode="" +d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 +q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 +q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_393" unicode="" +d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 +v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 +t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="f1a4" unicode="" horiz-adv-x="1920" +d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 +v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> + <glyph glyph-name="_395" unicode="" +d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="_396" unicode="" horiz-adv-x="2048" +d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 +v-369h123z" /> + <glyph glyph-name="_397" unicode="" +d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 +v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_398" unicode="" horiz-adv-x="2038" +d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 +q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 +q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 +q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 +t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 +q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 +t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 +t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> + <glyph glyph-name="_399" unicode="" +d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 +q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 +q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 +t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 +q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> + <glyph glyph-name="_400" unicode="" +d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z +M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 +t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 +q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 +t135.5 51q85 0 145 -60.5t60 -145.5z" /> + <glyph glyph-name="f1ab" unicode="" +d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 +q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 +q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z +M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 +q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 +q20 0 20 -21v-418z" /> + <glyph glyph-name="_402" unicode="" horiz-adv-x="1792" +d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 +l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 +t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 +q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 +q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> + <glyph glyph-name="_403" unicode="" +d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 +t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 +q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 +q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 +t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 +q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 +q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 +t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> + <glyph glyph-name="_404" unicode="" horiz-adv-x="1280" +d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152 +q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="uniF1B1" unicode="" horiz-adv-x="1664" +d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 +q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 +q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 +t100.5 134t141.5 55.5z" /> + <glyph glyph-name="_406" unicode="" horiz-adv-x="768" +d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> + <glyph glyph-name="_407" unicode="" horiz-adv-x="1792" +d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z +" /> + <glyph glyph-name="_408" unicode="" horiz-adv-x="2304" +d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 +t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 +v-400l434 -186q36 -16 57 -48t21 -70z" /> + <glyph glyph-name="_409" unicode="" horiz-adv-x="2048" +d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 +q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 +q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> + <glyph glyph-name="_410" unicode="" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 +t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 +t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> + <glyph glyph-name="_411" unicode="" horiz-adv-x="1792" +d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 +q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 +q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> + <glyph glyph-name="_412" unicode="" +d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 +q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 +q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z +" /> + <glyph glyph-name="_413" unicode="" horiz-adv-x="1792" +d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 +l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 +t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 +q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> + <glyph glyph-name="_414" unicode="" horiz-adv-x="2048" +d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 +q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 +l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="_415" unicode="" horiz-adv-x="2048" +d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 +t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z +M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> + <glyph glyph-name="_416" unicode="" +d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 +q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> + <glyph glyph-name="_417" unicode="" +d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 +q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 +q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_418" unicode="" horiz-adv-x="1024" +d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" /> + <glyph glyph-name="_419" unicode="" horiz-adv-x="2304" +d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 +q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 +q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 +l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 +q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236 +q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786 +q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> + <glyph glyph-name="uniF1C0" unicode="" +d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 +t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 +t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> + <glyph glyph-name="uniF1C1" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 +q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 +q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> + <glyph glyph-name="_422" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5 +t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" /> + <glyph glyph-name="_423" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 +h-290v-107h68l189 -272l-194 -283h-68z" /> + <glyph glyph-name="_424" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> + <glyph glyph-name="_425" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> + <glyph glyph-name="_426" unicode="" +d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 +v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 +q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> + <glyph glyph-name="_427" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 +q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> + <glyph glyph-name="_428" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> + <glyph glyph-name="_429" unicode="" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 +l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> + <glyph glyph-name="_430" unicode="" +d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 +q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> + <glyph glyph-name="_431" unicode="" horiz-adv-x="1792" +d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 +q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> + <glyph glyph-name="_432" unicode="" horiz-adv-x="2048" +d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 +q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 +t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" /> + <glyph glyph-name="_433" unicode="" horiz-adv-x="1792" +d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 +q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 +t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> + <glyph glyph-name="_434" unicode="" horiz-adv-x="1792" +d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 +t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" /> + <glyph glyph-name="uniF1D0" unicode="" horiz-adv-x="1792" +d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 +t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 +t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 +q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> + <glyph glyph-name="uniF1D1" unicode="" horiz-adv-x="1792" +d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 +l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 +q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 +q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 +t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 +t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF1D2" unicode="" +d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 +q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 +q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 +q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_438" unicode="" horiz-adv-x="1792" +d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 +q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 +q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 +v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> + <glyph glyph-name="_439" unicode="" +d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF1D5" unicode="" horiz-adv-x="1280" +d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 +t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 +t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> + <glyph glyph-name="uniF1D6" unicode="" horiz-adv-x="1792" +d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 +q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 +t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 +t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> + <glyph glyph-name="uniF1D7" unicode="" horiz-adv-x="2048" +d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 +q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 +q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 +q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> + <glyph glyph-name="_443" unicode="" horiz-adv-x="1792" +d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> + <glyph glyph-name="_444" unicode="" horiz-adv-x="1792" +d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 +l863 639l-478 -797z" /> + <glyph glyph-name="_445" unicode="" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 +t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 +t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_446" unicode="" +d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_447" unicode="" horiz-adv-x="1792" +d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 +t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 +t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 +q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 +q0 -26 -12 -48t-36 -22z" /> + <glyph glyph-name="_448" unicode="" horiz-adv-x="1280" +d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 +q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> + <glyph glyph-name="_449" unicode="" +d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 +q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> + <glyph glyph-name="uniF1E0" unicode="" +d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 +t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> + <glyph glyph-name="_451" unicode="" +d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 +t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_452" unicode="" horiz-adv-x="1792" +d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 +t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 +q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 +t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> + <glyph glyph-name="_453" unicode="" horiz-adv-x="1792" +d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 +l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> + <glyph glyph-name="_454" unicode="" horiz-adv-x="1792" +d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 +v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 +zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 +t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> + <glyph glyph-name="_455" unicode="" horiz-adv-x="1792" +d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z +M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_456" unicode="" horiz-adv-x="1792" +d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234 +l401 400q38 37 91 37t90 -37z" /> + <glyph glyph-name="_457" unicode="" horiz-adv-x="1792" +d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 +t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z +M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7 +t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> + <glyph glyph-name="_458" unicode="" horiz-adv-x="1792" +d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> + <glyph glyph-name="_459" unicode="" +d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 +q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 +t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 +q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> + <glyph glyph-name="_460" unicode="" horiz-adv-x="2048" +d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 +t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> + <glyph glyph-name="_461" unicode="" horiz-adv-x="2048" +d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 +q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z +M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> + <glyph glyph-name="_462" unicode="" horiz-adv-x="1792" +d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 +t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 +t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 +t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z +M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 +h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_463" unicode="" +d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 +q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 +q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" /> + <glyph glyph-name="_464" unicode="" horiz-adv-x="1792" +d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640 +q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" /> + <glyph glyph-name="uniF1F0" unicode="" horiz-adv-x="2304" +d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 +q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 +q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_466" unicode="" horiz-adv-x="2304" +d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249 +q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z +M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32 +h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4 +q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75 +q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14 +q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22 +q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12 +q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122 +h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5 +t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_467" unicode="" horiz-adv-x="2304" +d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 +q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 +v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 +q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 +t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> + <glyph glyph-name="f1f3" unicode="" horiz-adv-x="2304" +d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z +M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 +l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 +v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 +q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 +q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 +t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 +h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 +t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> + <glyph glyph-name="_469" unicode="" horiz-adv-x="2304" +d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 +t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 +q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 +t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 +l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 +q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_470" unicode="" horiz-adv-x="2304" +d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 +q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 +q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 +q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 +q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_471" unicode="" horiz-adv-x="2048" +d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 +l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 +l418 363q10 8 23.5 7t21.5 -11z" /> + <glyph glyph-name="_472" unicode="" horiz-adv-x="2048" +d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 +q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 +q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> + <glyph glyph-name="_473" unicode="" horiz-adv-x="1408" +d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 +q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 +q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_474" unicode="" +d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 +t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 +t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_475" unicode="" +d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 +q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 +t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 +t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> + <glyph glyph-name="_476" unicode="" horiz-adv-x="1792" +d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 +t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> + <glyph glyph-name="f1fc" unicode="" horiz-adv-x="1792" +d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 +t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> + <glyph glyph-name="_478" unicode="" horiz-adv-x="1792" +d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5 +t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38 +t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448 +h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5 +q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> + <glyph glyph-name="_479" unicode="" horiz-adv-x="2048" +d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> + <glyph glyph-name="_480" unicode="" horiz-adv-x="1792" +d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_481" unicode="" horiz-adv-x="2048" +d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 +t9 -23z" /> + <glyph glyph-name="_482" unicode="" horiz-adv-x="1792" +d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 +q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 +t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 +q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> + <glyph glyph-name="_483" unicode="" +d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 +q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 +q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_484" unicode="" horiz-adv-x="2048" +d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 +t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 +t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> + <glyph glyph-name="_485" unicode="" horiz-adv-x="2048" +d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 +t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> + <glyph glyph-name="_486" unicode="" horiz-adv-x="2304" +d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 +q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 +q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 +q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> + <glyph glyph-name="_487" unicode="" +d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 +h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> + <glyph glyph-name="_488" unicode="" horiz-adv-x="2048" +d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 +q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 +q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> + <glyph glyph-name="_489" unicode="" horiz-adv-x="1280" +d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 +t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 +t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 +q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 +q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 +t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> + <glyph glyph-name="_490" unicode="" horiz-adv-x="2048" +d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 +q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 +t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 +t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> + <glyph glyph-name="_491" unicode="" +d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 +t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_492" unicode="" +d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 +q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 +q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> + <glyph glyph-name="_493" unicode="" +d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" /> + <glyph glyph-name="_494" unicode="" horiz-adv-x="2048" +d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 +q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 +q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438 +h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66 +l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946 +l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82 +zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" /> + <glyph glyph-name="f210" unicode="" +d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" /> + <glyph glyph-name="_496" unicode="" +d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 +q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" /> + <glyph glyph-name="f212" unicode="" horiz-adv-x="2048" +d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 +q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 +q209 0 374 -102q172 107 374 102z" /> + <glyph glyph-name="_498" unicode="" horiz-adv-x="2048" +d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 +q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 +q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" /> + <glyph glyph-name="_499" unicode="" +d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 +l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 +v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z +M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 +v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 +h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 +t-43 -34t-16.5 -53.5z" /> + <glyph glyph-name="_500" unicode="" horiz-adv-x="2048" +d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 +q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" /> + <glyph glyph-name="_501" unicode="" horiz-adv-x="2048" +d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 +t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 +t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 +q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" /> + <glyph glyph-name="_502" unicode="" horiz-adv-x="1664" +d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 +q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="_503" unicode="" horiz-adv-x="1664" +d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 +q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="_504" unicode="" horiz-adv-x="2048" +d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 +l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" /> + <glyph glyph-name="_505" unicode="" horiz-adv-x="2048" +d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 +q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 +q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 +v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 +q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" /> + <glyph glyph-name="_506" unicode="" +d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 +t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 +q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 +t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" /> + <glyph glyph-name="_507" unicode="" horiz-adv-x="2304" +d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 +t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 +l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 +t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" /> + <glyph glyph-name="_508" unicode="" +d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 +q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 +q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 +t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="_509" unicode="" horiz-adv-x="1792" +d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 +q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 +t127 -344z" /> + <glyph glyph-name="venus" unicode="" horiz-adv-x="1280" +d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 +q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> + <glyph glyph-name="_511" unicode="" +d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 +q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_512" unicode="" horiz-adv-x="1280" +d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 +t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_513" unicode="" +d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 +q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_514" unicode="" horiz-adv-x="1792" +d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 +q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 +t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 +t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_515" unicode="" horiz-adv-x="1792" +d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 +t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 +q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 +q0 -226 -154 -391q103 -57 218 -57z" /> + <glyph glyph-name="_516" unicode="" horiz-adv-x="1920" +d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 +q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 +t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 +q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" /> + <glyph glyph-name="_517" unicode="" horiz-adv-x="2048" +d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 +t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 +t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 +t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" /> + <glyph glyph-name="_518" unicode="" +d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 +t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_519" unicode="" horiz-adv-x="1280" +d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 +t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 +t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_520" unicode="" horiz-adv-x="2048" +d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 +t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 +t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_521" unicode="" horiz-adv-x="1280" +d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 +t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_522" unicode="" horiz-adv-x="1280" +d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 +t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" /> + <glyph glyph-name="_523" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="_524" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="_525" unicode="" +d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" /> + <glyph glyph-name="_526" unicode="" horiz-adv-x="1280" +d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 +l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 +q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" /> + <glyph glyph-name="_527" unicode="" +d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 +t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 +l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" /> + <glyph glyph-name="_528" unicode="" horiz-adv-x="1792" +d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 +q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" /> + <glyph glyph-name="_529" unicode="" horiz-adv-x="2048" +d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 +t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 +t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" /> + <glyph glyph-name="_530" unicode="" horiz-adv-x="2048" +d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 +q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 +t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" /> + <glyph glyph-name="_531" unicode="" horiz-adv-x="2048" +d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 +q-26 0 -45 -19t-19 -45v-384h1152z" /> + <glyph glyph-name="_532" unicode="" +d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" /> + <glyph glyph-name="_533" unicode="" +d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 +t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" /> + <glyph glyph-name="_534" unicode="" +d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 +t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" /> + <glyph glyph-name="_535" unicode="" horiz-adv-x="1792" +d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 +q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" /> + <glyph glyph-name="_536" unicode="" +d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" /> + <glyph glyph-name="_537" unicode="" horiz-adv-x="2296" +d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 +q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 +q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 +q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 +q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 +q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 +q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8 +t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 +q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 +q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z +M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86 +t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 +q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4 +l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130 +t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 +q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 +q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" /> + <glyph glyph-name="_538" unicode="" horiz-adv-x="2304" +d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 +t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 +t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" /> + <glyph glyph-name="_539" unicode="" horiz-adv-x="1792" +d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 +t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 +t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 +q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 +q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" /> + <glyph glyph-name="_540" unicode="" horiz-adv-x="2304" +d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 +v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="_541" unicode="" horiz-adv-x="2304" +d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_542" unicode="" horiz-adv-x="2304" +d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_543" unicode="" horiz-adv-x="2304" +d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_544" unicode="" horiz-adv-x="2304" +d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 +v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_545" unicode="" horiz-adv-x="1280" +d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" /> + <glyph glyph-name="_546" unicode="" horiz-adv-x="1024" +d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" /> + <glyph glyph-name="_547" unicode="" horiz-adv-x="2048" +d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 +h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" /> + <glyph glyph-name="_548" unicode="" horiz-adv-x="2304" +d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 +v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" /> + <glyph glyph-name="_549" unicode="" +d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" /> + <glyph glyph-name="_550" unicode="" +d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 +z" /> + <glyph glyph-name="_551" unicode="" horiz-adv-x="2304" +d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 +t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 +t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 +t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_552" unicode="" horiz-adv-x="2304" +d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 +t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z +M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_553" unicode="" horiz-adv-x="1792" +d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 +zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" /> + <glyph glyph-name="_554" unicode="" horiz-adv-x="2304" +d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 +q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 +t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 +t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" /> + <glyph glyph-name="_555" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 +t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> + <glyph glyph-name="_556" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" /> + <glyph glyph-name="_557" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" /> + <glyph glyph-name="_558" unicode="" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 +h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> + <glyph glyph-name="_559" unicode="" +d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 +t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 +h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" /> + <glyph glyph-name="_560" unicode="" +d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 +q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 +t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 +q72 69 174 69z" /> + <glyph glyph-name="_561" unicode="" horiz-adv-x="1792" +d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 +t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 +h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" /> + <glyph glyph-name="_562" unicode="" horiz-adv-x="1792" +d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 +q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 +t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 +t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 +q0 -42 -23 -78t-61 -53l-310 -141h91z" /> + <glyph glyph-name="_563" unicode="" horiz-adv-x="2048" +d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 +q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 +q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" /> + <glyph glyph-name="_564" unicode="" horiz-adv-x="2048" +d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79 +t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24 +q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26 +l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" /> + <glyph glyph-name="_565" unicode="" horiz-adv-x="1792" +d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 +q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 +v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 +v-384h32z" /> + <glyph glyph-name="_566" unicode="" +d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 +v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 +q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 +q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 +q0 -53 37.5 -90.5t90.5 -37.5h668z" /> + <glyph glyph-name="_567" unicode="" horiz-adv-x="1973" +d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 +t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 +q13 0 22 -8.5t10 -20.5z" /> + <glyph glyph-name="_568" unicode="" horiz-adv-x="1792" +d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 +t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 +q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_569" unicode="" horiz-adv-x="1792" +d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 +q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5 +t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 +q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 +t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" /> + <glyph glyph-name="f260" unicode="" horiz-adv-x="2048" +d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" /> + <glyph glyph-name="f261" unicode="" horiz-adv-x="1792" +d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 +t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_572" unicode="" horiz-adv-x="2304" +d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 +t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 +t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 +t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 +t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 +q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" /> + <glyph glyph-name="f263" unicode="" horiz-adv-x="1280" +d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 +t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 +q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" /> + <glyph glyph-name="_574" unicode="" +d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 +q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 +zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_575" unicode="" horiz-adv-x="1720" +d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 +l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" /> + <glyph glyph-name="_576" unicode="" horiz-adv-x="2304" +d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 +q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 +l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" /> + <glyph glyph-name="_577" unicode="" horiz-adv-x="1792" +d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 +q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 +t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 +t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 +t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 +t191 -286t71 -348z" /> + <glyph glyph-name="_578" unicode="" horiz-adv-x="1792" +d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 +q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" /> + <glyph glyph-name="_579" unicode="" horiz-adv-x="1792" +d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 +q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 +q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" /> + <glyph glyph-name="_580" unicode="" horiz-adv-x="1792" +d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 +q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z +" /> + <glyph glyph-name="_581" unicode="" horiz-adv-x="1792" +d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 +q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z +M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" /> + <glyph glyph-name="_582" unicode="" horiz-adv-x="2048" +d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 +v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="_583" unicode="" horiz-adv-x="1792" +d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 +h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 +q-68 175 -180 287z" /> + <glyph glyph-name="_584" unicode="" +d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 +q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 +q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 +q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 +q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 +t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" /> + <glyph glyph-name="_585" unicode="" horiz-adv-x="1792" +d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z +M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 +q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 +t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 +q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" /> + <glyph glyph-name="_586" unicode="" horiz-adv-x="1792" +d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 +h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 +v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" /> + <glyph glyph-name="_587" unicode="" horiz-adv-x="1792" +d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 +t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 +t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_588" unicode="" horiz-adv-x="1792" +d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z +M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 +q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_589" unicode="" horiz-adv-x="1792" +d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 +t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 +t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_590" unicode="" horiz-adv-x="1792" +d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" /> + <glyph glyph-name="_591" unicode="" horiz-adv-x="1024" +d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 +q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" /> + <glyph glyph-name="_592" unicode="" horiz-adv-x="1792" +d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 +q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" /> + <glyph glyph-name="_593" unicode="" horiz-adv-x="2048" +d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 +v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" /> + <glyph glyph-name="_594" unicode="" horiz-adv-x="1792" +d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 +q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="_595" unicode="" horiz-adv-x="1792" +d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 +t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 +t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="_596" unicode="" horiz-adv-x="1792" +d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 +t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 +t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 +t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" /> + <glyph glyph-name="_597" unicode="" horiz-adv-x="1024" +d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" /> + <glyph glyph-name="_598" unicode="" horiz-adv-x="1792" +d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 +q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" /> + <glyph glyph-name="f27e" unicode="" +d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" /> + <glyph glyph-name="uniF280" unicode="" +d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 +h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 +l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" /> + <glyph glyph-name="uniF281" unicode="" horiz-adv-x="1792" +d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 +l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 +t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 +q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" /> + <glyph glyph-name="_602" unicode="" horiz-adv-x="1792" +d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 +q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" /> + <glyph glyph-name="_603" unicode="" horiz-adv-x="2304" +d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" /> + <glyph glyph-name="_604" unicode="" horiz-adv-x="1792" +d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308 +t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20 +t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" /> + <glyph glyph-name="uniF285" unicode="" horiz-adv-x="1792" +d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" /> + <glyph glyph-name="uniF286" unicode="" horiz-adv-x="1792" +d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 +q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5 +q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96 +q16 0 16 -16z" /> + <glyph glyph-name="_607" unicode="" horiz-adv-x="2304" +d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 +q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 +t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" /> + <glyph glyph-name="_608" unicode="" horiz-adv-x="1792" +d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 +t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_609" unicode="" horiz-adv-x="2304" +d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 +q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 +q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 +q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" /> + <glyph glyph-name="_610" unicode="" +d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 +t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 +q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 +t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" /> + <glyph glyph-name="_611" unicode="" +d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 +t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_612" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 +t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" /> + <glyph glyph-name="_613" unicode="" +d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="_614" unicode="" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 +t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" /> + <glyph glyph-name="_615" unicode="" horiz-adv-x="1792" +d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="_616" unicode="" horiz-adv-x="2048" +d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 +t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 +q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 +h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" /> + <glyph glyph-name="_617" unicode="" horiz-adv-x="1792" +d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 +q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 +q15 0 25 -12q9 -12 6 -28z" /> + <glyph glyph-name="_618" unicode="" +d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 +t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" /> + <glyph glyph-name="_619" unicode="" horiz-adv-x="1024" +d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" /> + <glyph glyph-name="_620" unicode="" +d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 +t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 +t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="_621" unicode="" horiz-adv-x="1792" +d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" /> + <glyph glyph-name="_622" unicode="" horiz-adv-x="1792" +d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111 +q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" /> + <glyph glyph-name="_623" unicode="" +d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14 +t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" /> + <glyph glyph-name="_624" unicode="" horiz-adv-x="1792" +d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57 +q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285 +q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" /> + <glyph glyph-name="_625" unicode="" horiz-adv-x="1792" +d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42 +q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z +M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298 +t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_626" unicode="" +d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300 +l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z +M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" /> + <glyph glyph-name="_627" unicode="" +d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5 +t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5 +t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 +t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_628" unicode="" horiz-adv-x="1408" +d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457 +q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521 +q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661 +q3 -1 7 1t7 4l3 2q11 9 11 17z" /> + <glyph glyph-name="_629" unicode="" horiz-adv-x="2304" +d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10 +t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5 +t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5 +h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96 +t9.5 -70.5z" /> + <glyph glyph-name="uniF2A0" unicode="" horiz-adv-x="1408" +d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5 +q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127 +l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272 +t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249 +q-18 -19 -45 -19z" /> + <glyph glyph-name="uniF2A1" unicode="" horiz-adv-x="2176" +d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352 +q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864 +q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136 +t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56 +t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56 +t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136 +t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="uniF2A2" unicode="" horiz-adv-x="1792" +d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z +M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72 +t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45 +t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4 +q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" /> + <glyph glyph-name="uniF2A3" unicode="" horiz-adv-x="2304" +d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55 +q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5 +q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101 +q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35 +q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5 +q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" /> + <glyph glyph-name="uniF2A4" unicode="" horiz-adv-x="1792" +d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19 +t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74 +t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233 +l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" /> + <glyph glyph-name="uniF2A5" unicode="" +d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2 +q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10 +q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5 +t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF2A6" unicode="" horiz-adv-x="1535" +d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5 +l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5 +q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9 +q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" /> + <glyph glyph-name="uniF2A7" unicode="" horiz-adv-x="1664" +d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37 +t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38 +l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148 +q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26 +l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" /> + <glyph glyph-name="uniF2A8" unicode="" horiz-adv-x="1792" +d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5 +q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841 +q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5 +q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" /> + <glyph glyph-name="uniF2A9" unicode="" horiz-adv-x="1280" +d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5 +q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z +M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" /> + <glyph glyph-name="uniF2AA" unicode="" +d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z +M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5 +q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="uniF2AB" unicode="" +d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114 +q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5 +t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="uniF2AC" unicode="" horiz-adv-x="1664" +d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35 +q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5 +t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" /> + <glyph glyph-name="uniF2AD" unicode="" +d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115 +q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15 +t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 +q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF2AE" unicode="" horiz-adv-x="2304" +d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7 +q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158 +q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" /> + <glyph glyph-name="uniF2B0" unicode="" +d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104 +q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108 +l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z +M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" /> + <glyph glyph-name="uniF2B1" unicode="" horiz-adv-x="1664" +d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5 +t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" /> + <glyph glyph-name="uniF2B2" unicode="" horiz-adv-x="1792" +d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5 +t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114 +q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50 +q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5 +t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46 +q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5 +q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177 +t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" /> + <glyph glyph-name="uniF2B3" unicode="" +d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110 +h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="uniF2B4" unicode="" +d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5 +q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" /> + <glyph glyph-name="uniF2B5" unicode="" horiz-adv-x="2304" +d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66 +l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180 +q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z +M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421 +q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" /> + <glyph glyph-name="uniF2B6" unicode="" horiz-adv-x="1792" +d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107 +t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39 +q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" /> + <glyph glyph-name="uniF2B7" unicode="" horiz-adv-x="1792" +d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5 +l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5 +h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94 +q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" /> + <glyph glyph-name="uniF2B8" unicode="" +d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465 +l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161 +q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74 +q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" /> + <glyph glyph-name="uniF2B9" unicode="" horiz-adv-x="1664" +d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576 +q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216 +q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" /> + <glyph glyph-name="uniF2BA" unicode="" horiz-adv-x="1664" +d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5 +t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96 +q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216 +q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" /> + <glyph glyph-name="uniF2BB" unicode="" horiz-adv-x="2048" +d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z +M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568 +q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9 +h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2BC" unicode="" horiz-adv-x="2048" +d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925 +q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568 +q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5 +t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113 +t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2BD" unicode="" horiz-adv-x="1792" +d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5 +t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2BE" unicode="" horiz-adv-x="1792" +d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61 +t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" /> + <glyph glyph-name="uniF2C0" unicode="" +d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5 +t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145 +q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" /> + <glyph glyph-name="uniF2C1" unicode="" horiz-adv-x="1280" +d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5 +t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352 +q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C2" unicode="" horiz-adv-x="2048" +d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56 +t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23 +v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728 +q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C3" unicode="" horiz-adv-x="2048" +d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z +M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64 +q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47 +h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C4" unicode="" horiz-adv-x="1792" +d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117 +q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5 +t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" /> + <glyph glyph-name="uniF2C5" unicode="" horiz-adv-x="2304" +d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21 +t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46 +t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54 +t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29 +q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5 +t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314 +q2 -42 2 -64z" /> + <glyph glyph-name="uniF2C6" unicode="" horiz-adv-x="1792" +d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 +t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2C7" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2C8" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2C9" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2CA" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2CB" unicode="" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z +M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" /> + <glyph glyph-name="uniF2CC" unicode="" horiz-adv-x="1920" +d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41 +t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19 +t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768 +q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19 +t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384 +q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" /> + <glyph glyph-name="uniF2CD" unicode="" horiz-adv-x="1792" +d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9 +t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9 +t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42 +q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9 +t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23 +t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" /> + <glyph glyph-name="uniF2CE" unicode="" +d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5 +t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70 +q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20 +q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5 +t72.5 -263.5z" /> + <glyph glyph-name="uniF2D0" unicode="" horiz-adv-x="1792" +d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D1" unicode="" horiz-adv-x="1792" +d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D2" unicode="" horiz-adv-x="2048" +d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47 +t47 -113z" /> + <glyph glyph-name="uniF2D3" unicode="" horiz-adv-x="1792" +d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10 +l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D4" unicode="" horiz-adv-x="1792" +d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 +l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D5" unicode="" horiz-adv-x="1792" +d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2D6" unicode="" horiz-adv-x="1794" +d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12 +t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5 +t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5 +q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5 +q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34 +q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5 +t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2D7" unicode="" +d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89 +q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5 +t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" /> + <glyph glyph-name="uniF2D8" unicode="" +d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7 +t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5 +h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113 +v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D9" unicode="" horiz-adv-x="2176" +d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584 +q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5 +q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15 +q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82 +q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104 +t302 11t306.5 -97q220 -115 333 -336t87 -474z" /> + <glyph glyph-name="uniF2DA" unicode="" horiz-adv-x="1792" +d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178 +q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199 +t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297 +t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208 +t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" /> + <glyph glyph-name="uniF2DB" unicode="" +d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16 +q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28 +t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32 +q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16 +h48q16 0 16 -16z" /> + <glyph glyph-name="uniF2DC" unicode="" horiz-adv-x="1664" +d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45 +t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33 +q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313 +l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106 +q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" /> + <glyph glyph-name="uniF2DD" unicode="" horiz-adv-x="1792" +d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321 +q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" /> + <glyph glyph-name="uniF2DE" unicode="" horiz-adv-x="1792" +d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62 +t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71 +t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2E0" unicode="" horiz-adv-x="1920" +d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3 +t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53 +q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5 +q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5 +t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5 +q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z +M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21 +q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16 +q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" /> + <glyph glyph-name="uniF2E1" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E2" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E3" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E4" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E5" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E6" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E7" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="_698" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E9" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EA" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EB" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EC" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2ED" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EE" unicode="" horiz-adv-x="1792" + /> + <glyph glyph-name="lessequal" unicode="" horiz-adv-x="1792" + /> + </font> +</defs></svg> diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 Binary files /dev/null and b/fonts/fontawesome-webfont.ttf differ diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b Binary files /dev/null and b/fonts/fontawesome-webfont.woff differ diff --git a/fonts/fontawesome-webfont.woff2 b/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 Binary files /dev/null and b/fonts/fontawesome-webfont.woff2 differ diff --git a/funciones.php b/funciones.php new file mode 100644 index 0000000000000000000000000000000000000000..8ef934031cbb50a5454a390ac5b7554ea18f5667 --- /dev/null +++ b/funciones.php @@ -0,0 +1,47 @@ +<?php +function conexdb(){ + global $conex; + $server='arduiacob.i234.me:3307'; + $usuario = "velostat"; + $password = "Paula@R4.0"; + $based = "velostat1"; + $conex = new mysqli($server,$usuario,$password,$based); + if ($conex->connect_errno) { + echo "Fallo al conectar a MySQL: (". $conex->connect_errno . ") ". $conex->connect_error; + } +} + +/* +Menú plegable +*/ +function barra(){ + global $conex, $html, $chmod, $id_admin, $nombre, $hoy, $dia_ant; + conexdb(); //Si no hemos conectado a la base de datos conectamos. + $id_admin=$_REQUEST["variable"]; + // Comprobar permisos: + if ($result = $conex->query("SELECT * FROM `TRABAJADORES` WHERE `dni_trabajador`= '$id_admin'")) + { + $row = $result->fetch_assoc(); + $nombre = $row['nombre']; + $permisos = $row['permisos']; + + $html->assign("nombre",$nombre); + $html->assign("permisos",$permisos); + $imagen_id = imagen('media/images/personal/',$id_admin); + $html->assign("imagen_id",$imagen_id); + $html->assign("id_admin",$id_admin); + } + + $html->assign("barra",$barra); + +} + +function imagen($ruta, $nombre){ + $imagen=$ruta.$nombre.'.png'; // Aqui obtienes la imagen del usuario de BBDD + if(! file_exists($imagen)){ + $imagen = 'media/images/no_image/no_image.png'; + } + return $imagen; +} + +?> diff --git a/ges_ens.php b/ges_ens.php new file mode 100644 index 0000000000000000000000000000000000000000..799f2c99d69de74d93d5d2fac85dd06841a5d0a7 --- /dev/null +++ b/ges_ens.php @@ -0,0 +1,74 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Gestionar ensayos +* Caso de uso: CREAR ENSAYO +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $accion =$_GET["accion"]; + $id_ensayo = $_POST['id_ensayo']; + if($id_ensayo=="") $id_ensayo = $_GET['id']; + + $html=new Smarty; + + + // Barra + barra(); + // Fin de barra + + // Valores para el formulario: + // Id ensayo + // Tipo + // Colocación sensores + // Duración + // Repeticiones + // Comentarios + // Fecha creación + + if($accion == 1 && $id_ensayo!=""){//eliminar un ensayo + $sql="DELETE FROM `ENSAYOS` WHERE `id_ensayo`='$id_ensayo'"; + $id_ensayo = ""; + if ($conex->query($sql)){ + $mensaje ="Ensayo borrado con éxito"; + }else{ + $mensaje ="Error al borrar el ensayo"; + } + }else{ + if ($id_ensayo){ + + if ($result = $conex->query("SELECT * FROM `ENSAYOS` WHERE `id_ensayo`='$id_ensayo'")){ + $row = $result->fetch_assoc(); + $mod_campos = [ $row['id_ensayo'],$row['tipo'],$row['coloc_sensores'],$row['duracion'],$row['repeticiones'],$row['comentarios']]; + $mensaje = "Modificando ensayo"; + } + else { + $mensaje = "Error inesperado en lectura registro de '$id_ensayo'"; + } + $html->assign("mod_campos",$mod_campos); + } + } + + + //Mostramos una tabla con todos los ensayos + $x=0; + if ($result = $conex->query("SELECT * FROM `ENSAYOS` ORDER BY `id_ensayo` ASC")){ + while ($row = $result->fetch_assoc()) { + $campos[$x] = array($row['id_ensayo'],$row['tipo'],nl2br($row['coloc_sensores'],false),$row['duracion'],$row['repeticiones'],nl2br($row['comentarios'],false),$row['fecha_creacion'],$row['fecha_modificacion']); + $x++; + } + } else{ + $mensaje= "Ha habido un error inesperado."; + } + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("campos",$campos); + $html->display("ges_ens.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/ges_ens_nuevo.php b/ges_ens_nuevo.php new file mode 100644 index 0000000000000000000000000000000000000000..08216450a4bbf06e494128917023bfc5d73aa80b --- /dev/null +++ b/ges_ens_nuevo.php @@ -0,0 +1,66 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Crear ensayo nuevo +* Caso de uso: Crear ensayo +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + + $html=new Smarty; + $mensaje="Registro de nuevo ensayo"; + + // Barra + barra(); + // Fin de barra + + // Valores para el formulario: + // Id ensayo + // Tipo + // Colocación sensores + // Duración + // Repeticiones + // Comentarios + // Fecha creación + + $tipo = ($_POST["tipo"]); + $coloc_sensores = ($_POST["coloc_sensores"]); + $duracion = ($_POST["duracion"]); + $repeticiones = ($_POST["repeticiones"]); + $comentarios = ($_POST["comentarios"]); + + if($tipo != ""){ + $mensaje=""; + //Comprobamos que no se repita el nombre + if ($result = $conex->query("SELECT * FROM `ENSAYOS`")){ + while ($row = $result->fetch_assoc()) { + if($row['tipo'] == $tipo){ + $mensaje="El ensayo, '$tipo', ya existe."; + } + } + + if($mensaje==""){ + if($comentarios == ""){ + $sql="INSERT INTO `ENSAYOS` (`tipo`, `coloc_sensores`, `duracion`, `repeticiones`, `comentarios`, `fecha_creacion`, `fecha_modificacion`, `dni_trabajador` ) + VALUES ('$tipo', '$coloc_sensores', '$duracion', '$repeticiones', NULL, NOW(), NULL, '$id_admin')"; + }else{ + $sql="INSERT INTO `ENSAYOS` (`tipo`, `coloc_sensores`, `duracion`, `repeticiones`, `comentarios`, `fecha_creacion`, `fecha_modificacion`, `dni_trabajador` ) + VALUES ('$tipo', '$coloc_sensores', '$duracion', '$repeticiones', '$comentarios' , NOW(), NULL, '$id_admin')"; + } + if ($conex->query($sql)) + $mensaje= "Actualizado resgistro de Ensayos para: '$tipo'"; + else $mensaje= "Error actualizando base de datos"; + } + } + } + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->display("ges_ens_nuevo.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/ges_ens_val.php b/ges_ens_val.php new file mode 100644 index 0000000000000000000000000000000000000000..06c7e1cfc16f580b764c20b04656792d47706f87 --- /dev/null +++ b/ges_ens_val.php @@ -0,0 +1,59 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Validaci�n de la modificaci�n de ensayos +* Caso de uso: -- +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin= $_GET["variable"]; + + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + //Descargamos los datos del formulario + $id_ensayo = ($_GET["id"]); + $tipo = ($_POST["tipo"]); + $coloc_sensores = ($_POST["coloc_sensores"]); + $duracion = ($_POST["duracion"]); + $repeticiones = ($_POST["repeticiones"]); + $comentarios = ($_POST["comentarios"]); + $mensaje=""; + + if($mensaje == ""){ + if($comentarios == ""){ + $sql = "UPDATE `ENSAYOS` SET `tipo`='$tipo', `comentarios`= NULL, `coloc_sensores`='$coloc_sensores', `duracion`='$duracion', `repeticiones`='$repeticiones', `fecha_modificacion` = NOW() + WHERE `id_ensayo`='$id_ensayo'"; + }else{ + $sql = "UPDATE `ENSAYOS` SET `tipo`='$tipo', `comentarios`= '$comentarios', `coloc_sensores`='$coloc_sensores', `duracion`='$duracion', `repeticiones`='$repeticiones', `fecha_modificacion` = NOW() + WHERE `id_ensayo`='$id_ensayo'"; + } + if (!$conex->query($sql)){ + $mensaje="Nombre: '$tipo'. Error: %s\n' $conex->error"; + }else{ + $mensaje= "Actualizado registro de Ensayos"; + } + } + + //Mostramos una tabla con todos los ensayos + $x=0; + if ($result = $conex->query("SELECT * FROM `ENSAYOS` ORDER BY `id_ensayo` ASC")){ + while ($row = $result->fetch_assoc()) { + $campos[$x] = array($row['id_ensayo'],$row['tipo'],nl2br($row['coloc_sensores']),$row['duracion'],$row['repeticiones'],$row['comentarios'],$row['fecha_creacion'],$row['fecha_modificacion']); + $x++; + } + } else $mensaje= "Ha habido un error inesperado."; + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("campos",$campos); + $html->display("ges_ens.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/ges_pat.php b/ges_pat.php new file mode 100644 index 0000000000000000000000000000000000000000..80d2fcb1c53f127c0a3b6a26d7d646a0584ec99e --- /dev/null +++ b/ges_pat.php @@ -0,0 +1,69 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Gestionar las patologías +* Caso de uso: AÑADIR PATOLOGÍA, MODIFICAR PATOLOGIA Y ELIMINAR PATOLOGIA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $accion =$_GET["accion"]; + $id_patologia = $_POST['id_patologia']; + if($id_patologia=="") $id_patologia = $_GET['id']; + + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + // Valores para el formulario: + // Id patologia + // Nombre + // Descripción + + + if($accion == 1 && $id_patologia!=""){//eliminar una patologia + $sql="DELETE FROM `PATOLOGIAS` WHERE `id_patologia`='$id_patologia'"; + $id_patologia = ""; + if ($conex->query($sql)){ + $mensaje ="Patología borrada con éxito"; + }else{ + $mensaje ="Error al borrar la patología"; + } + }else{ + if ($id_patologia){ + + if ($result = $conex->query("SELECT * FROM `PATOLOGIAS` WHERE `id_patologia`='$id_patologia'")){ + $row = $result->fetch_assoc(); + $mod_campos = [ $row['id_patologia'],$row['nombre'],$row['descripcion']]; + $mensaje = "Modificando patologia"; + } + else { + $mensaje = "Error inesperado en lectura registro de '$id_patologia'"; + } + $html->assign("mod_campos",$mod_campos); + } + } + + + //Mostramos una tabla con todas las patologias + $x=0; + if ($result = $conex->query("SELECT * FROM `PATOLOGIAS` ORDER BY `nombre` ASC")){ + while ($row = $result->fetch_assoc()) { + $campos[$x] = array($row['id_patologia'],$row['nombre'],$row['descripcion']); + $x++; + } + } else $mensaje= "Ha habido un error inesperado."; + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("campos",$campos); + + $html->display("ges_pat.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/ges_pat_nueva.php b/ges_pat_nueva.php new file mode 100644 index 0000000000000000000000000000000000000000..41a02b6ad01e9e6e4d365d5c38b937f03ca9406a --- /dev/null +++ b/ges_pat_nueva.php @@ -0,0 +1,59 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Añadir patología +* Caso de uso: AÑADIR PATOLOGÍA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + + $html=new Smarty; + $mensaje="Registro de nueva patología"; + // Barra + barra(); + // Fin de barra + + // Valores para el formulario: + // Id patologia + // Nombre + // Descripción + + $nombre = ($_POST["nombre"]); + $descripcion = ($_POST["descripcion"]); + + //Si tenemos un nombre para la patologia + if($nombre != ""){ + $mensaje=""; + //Comprobamos que no se repita el nombre + if ($result = $conex->query("SELECT * FROM `PATOLOGIAS`")){ + while ($row = $result->fetch_assoc()) { + if($row['nombre'] == $nombre){ + $mensaje="La patología, '$nombre', ya existe."; + } + } + + if($mensaje==""){ + if($descripcion == ""){ + $sql="INSERT INTO `PATOLOGIAS` (`nombre`, `descripcion`) VALUES ('$nombre', NULL)"; + }else{ + $sql="INSERT INTO `PATOLOGIAS` (`nombre`, `descripcion`) VALUES ('$nombre', '$descripcion')"; + } + if ($conex->query($sql)) + $mensaje= "Actualizado resgistro de Patologias para: '$nombre'"; + else $mensaje= "Error actualizando base de datos"; + } + } + } + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("campos",$campos); + + $html->display("ges_pat_nueva.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/ges_pat_val.php b/ges_pat_val.php new file mode 100644 index 0000000000000000000000000000000000000000..4178ef45db6894dab1bca7c1ee846ce92723e36a --- /dev/null +++ b/ges_pat_val.php @@ -0,0 +1,58 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Confirmaci�n de las modificaciones en las patolog�as +* Caso de uso: MODIFICAR PATOLOGIA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + $id_admin= $_GET["variable"]; + + $html=new Smarty; + + + // Barra + barra(); + // Fin de barra + + //Descargamos los datos del formulario + $id_patologia = ($_GET["id"]); + $nombre = ($_POST["nombre"]); + $descripcion = ($_POST["descripcion"]); + $mensaje=""; + + + if($descripcion == ""){ + $sql = "UPDATE `PATOLOGIAS` SET `nombre`='$nombre', `descripcion`= NULL + WHERE `id_patologia`='$id_patologia'"; + }else{ + $sql = "UPDATE `PATOLOGIAS` SET `nombre`='$nombre', `descripcion`='$descripcion' + WHERE `id_patologia`='$id_patologia'"; + } + if (!$conex->query($sql)){ + $mensaje="Nombre: '$nombre' Descripcion: '$descripcion' Error: %s\n' $conex->error"; + }else{ + $mensaje="Actualizado registro de Patolog�as"; + } + + //Mostramos una tabla con todas las patologias + $x=0; + if ($result = $conex->query("SELECT * FROM `PATOLOGIAS` ORDER BY `nombre` ASC")){ + while ($row = $result->fetch_assoc()) { + $campos[$x] = array($row['id_patologia'],$row['nombre'],$row['descripcion']); + if ($id_patologia == $row['id_patologia']) $patologia = $campos[$x]; + $x++; + } + } else $mensaje= "Ha habido un error inesperado."; + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + $html->assign("patologia",$patologia); + $html->assign("campos",$campos); + + $html->display("ges_pat.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/include.php b/include.php new file mode 100644 index 0000000000000000000000000000000000000000..fa8eb5aec3479b73a837633f6698f5c1e710bce6 --- /dev/null +++ b/include.php @@ -0,0 +1,13 @@ +<?php +define ('RUTA','/volume1/web/velostat/'); +//clase smarty la cual es esencial para todo el proyecto +include_once('Smarty.class.php'); +$smarty = new Smarty; +//directorio template_dir en la carpeta templates lo cual indica que ahí irán todos los archivos html +$smarty->template_dir = RUTA.'templates/'; +$smarty->config_dir = RUTA.'configs/'; +$smarty->cache_dir = RUTA.'cache/'; +//$smarty->image_dir = RUTA.'images/'; +// templates_c que será donde se ubiquen los cache de los templates “pre” cargados para que la pagina cargue mas rápido +$smarty->compile_dir = RUTA.'templates_c/'; +?> \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000000000000000000000000000000000000..d1363e680a094c4f091cb4b1fc2eaa86158a280c --- /dev/null +++ b/index.php @@ -0,0 +1,15 @@ +<?php +/* +* Archivo de control. Página de inicio +* Caso de uso: INICIAR SESION EN EL SISTEMA +*/ +session_start(); +//cargamos las librerías de smarty +require('include.php'); +$titulo="WEB APP de administración Sensores de Presión"; +$html=new Smarty; +$html->assign("titulo",$titulo); + +$html->display("inicio.tpl"); + +?> \ No newline at end of file diff --git a/log_out.php b/log_out.php new file mode 100644 index 0000000000000000000000000000000000000000..9f808e1429c03f8f5fcb90edffd27ede9b21607d --- /dev/null +++ b/log_out.php @@ -0,0 +1,12 @@ +<?php session_start(); +/* +* Archivo de control. Cerrar sesi�n en el sistema +* Caso de uso: -- +*/ + require('include.php'); + require_once('funciones.php'); + session_unset(); + session_destroy(); + header("Location: index.php"); + exit(); +?> diff --git a/login.php b/login.php new file mode 100644 index 0000000000000000000000000000000000000000..9ac3a6b830c2972cb14310e20067a62ee2c87f88 --- /dev/null +++ b/login.php @@ -0,0 +1,55 @@ +<?php session_start(); + require('include.php'); + require_once('funciones.php'); + /* + * Archivo de control. Comprobación del inicio de sesión en el sistema + * Caso de uso: INICIAR SESION EN EL SISTEMA + */ + + if ( isset($_REQUEST["login"]) && isset($_REQUEST["pass"]) ){ + $titulo="WEB APP de administración Sensores de Presión"; + conexdb(); + //$conex=new mysqli($server,$usuario,$contrasena,$bd); + //printf("conjunto de caracteres iniciales: %s\n", $conex->character_set_name()); + + $login=mysqli_real_escape_string($conex, $_REQUEST["login"]); + $pass=mysqli_real_escape_string($conex, $_REQUEST["pass"]); + + $html=new Smarty; + /* + if(isset($_POST["g-recaptcha-response"])){ + $captcha=$_POST["g-recaptcha-response"]; + $secreto='6LcX5igUAAAAAOANYillOv7O8Io4tDQewva8FztQ'; + $response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secreto."&response=".$captcha.""); + $decoded_response = json_decode($response, true); + } + */ + + $query="SELECT count(*) as num, dni_trabajador as id_admin, contraseña as pass, permisos FROM `TRABAJADORES` WHERE login='".mysqli_real_escape_string($conex, $login)."'"; + + $result=$conex->query($query); + + $row=$result->fetch_assoc(); + + $html->assign("id_admin", $row["id_admin"]); + + $passhasheada=sha1($pass); + + $html->assign("titulo",$titulo); + $html->assign("login", $login); + + if ( ($row['num']>0 && $passhasheada==$row["pass"] && mysqli_real_escape_string($conex, $passhasheada) ) || ( $row['num']>0 && $passhasheada==$row["pass"] && mysqli_real_escape_string($conex, $passhasheada) )){ + //Exito + $_SESSION['valido']=1; + $_SESSION['user']=$row["id_admin"]; + + $html->display("login.tpl"); + + }else { + //Fallo + $mensaje="Autenticación erróena"; + $html->assign("mensaje",$mensaje); + $html->display("inicio.tpl"); + } + } +?> diff --git a/media/audio/check.mp3 b/media/audio/check.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e2cb941ef8eb3f8e9afbb7ec05639e6abc05748d Binary files /dev/null and b/media/audio/check.mp3 differ diff --git a/media/images/ensayo/Cara asco.png b/media/images/ensayo/Cara asco.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9b3584e8edc20bc40aca4a572ec4b93fa96c37 Binary files /dev/null and b/media/images/ensayo/Cara asco.png differ diff --git a/media/images/ensayo/Cierre de ojos.png b/media/images/ensayo/Cierre de ojos.png new file mode 100644 index 0000000000000000000000000000000000000000..e842a2675e54e93e9eca081b8288d2c1bb0e1552 Binary files /dev/null and b/media/images/ensayo/Cierre de ojos.png differ diff --git a/media/images/ensayo/Protusion labial.png b/media/images/ensayo/Protusion labial.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c318aafe7428fbfa103e68ac42ec78893d0eb8 Binary files /dev/null and b/media/images/ensayo/Protusion labial.png differ diff --git a/media/images/ensayo/Reposo.png b/media/images/ensayo/Reposo.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd24f5e729cf7ca10c0c9088e37ef67af0b5327 Binary files /dev/null and b/media/images/ensayo/Reposo.png differ diff --git a/media/images/ensayo/Sonrisa dientes.png b/media/images/ensayo/Sonrisa dientes.png new file mode 100644 index 0000000000000000000000000000000000000000..b9deec250f0edf243f8f05d72610fc79aacc6246 Binary files /dev/null and b/media/images/ensayo/Sonrisa dientes.png differ diff --git a/media/images/ensayo/Subir cejas.png b/media/images/ensayo/Subir cejas.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c730afebf9192b537ab90a31681de406c02db6 Binary files /dev/null and b/media/images/ensayo/Subir cejas.png differ diff --git a/media/images/ensayo/Thumbs.db b/media/images/ensayo/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..98e6f3cc649bf974b7c1f913a06112fb181b04ce Binary files /dev/null and b/media/images/ensayo/Thumbs.db differ diff --git a/media/images/favicon/sensor.png b/media/images/favicon/sensor.png new file mode 100644 index 0000000000000000000000000000000000000000..b88c2567312099bdb478ac255e395c50cabae64f Binary files /dev/null and b/media/images/favicon/sensor.png differ diff --git a/media/images/no_image/no_image.png b/media/images/no_image/no_image.png new file mode 100644 index 0000000000000000000000000000000000000000..7dcb8dbfc21526695fc8df723b5cb213178189bf Binary files /dev/null and b/media/images/no_image/no_image.png differ diff --git a/media/images/personal/1.png b/media/images/personal/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c2584b3f90a255127db4bcc5a931c376a4c600 Binary files /dev/null and b/media/images/personal/1.png differ diff --git a/media/images/personal/3.png b/media/images/personal/3.png new file mode 100644 index 0000000000000000000000000000000000000000..ed76bfd2d04267650bf7485781f8efd32ba9482f Binary files /dev/null and b/media/images/personal/3.png differ diff --git a/mod_gestor.php b/mod_gestor.php new file mode 100644 index 0000000000000000000000000000000000000000..5224e955947f09e595438a265487496fa1e57dc1 --- /dev/null +++ b/mod_gestor.php @@ -0,0 +1,51 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Modificación de los trabajadores de la clinica y gestores de la web +* Caso de uso: -- +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin = $_GET['variable']; + $html=new Smarty; + + $mod_n_emp = $_GET['nombre']; + + //Cargamos la barra + barra(); + + $mensaje=""; + + //Si se han seleccionado filas a modificar + if ($mod_n_emp) { + $mensaje = "Modificar Trabajador. ".$mod_n_emp; + if ($result = $conex->query("SELECT * FROM `TRABAJADORES` WHERE `dni_trabajador`= '$mod_n_emp'")){ + $row = $result->fetch_assoc(); + $mod_campos = [ $row['dni_trabajador'],$row['login'],$row['nombre'],$row['apellidos'],$row['titulacion'],$row['permisos'], imagen('media/images/personal/',$row['dni_trabajador'])]; + } + else { + $mensaje = "Error inesperado en lectura registro de $mod_n_emp"; + } + + $html->assign("mod_campos",$mod_campos); + } + + //Mostramos una tabla con todos los usuarios para marcar el que queremos modificar + $x=0; + if ($result = $conex->query("SELECT * FROM `TRABAJADORES` ORDER BY `nombre` ASC")){ + while ($row = $result->fetch_assoc()) { + $campos[$x] = array($row['dni_trabajador'],$row['login'],$row['nombre'],$row['apellidos'],$row['titulacion'],$row['permisos'], imagen('media/images/personal/',$row['dni_trabajador'])); + $x++; + } + } else $mensaje= "Ha habido un error inesperado."; + + $html->assign("mensaje",$mensaje); + $html->assign("campos",$campos); + $html->assign("id_admin",$id_admin); + $html->display("mod_gestor.tpl"); + +} + +else + @header('location:index.php'); diff --git a/mod_gestor_val.php b/mod_gestor_val.php new file mode 100644 index 0000000000000000000000000000000000000000..c39250d0a043d04b74a55beb5677de5794a586f1 --- /dev/null +++ b/mod_gestor_val.php @@ -0,0 +1,75 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Validación de la modificación de trabajadores y gestores de la web +* Caso de uso: -- +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin = $_GET['variable']; + $html=new Smarty; + + //Barra + barra(); + + $mensaje=""; + + // Descargamos las variables del formulario: + $dni_trabajador = ($_GET['id']); + $nombre = ($_POST['nombre']); + $apellidos = ($_POST['apellidos']); + $nick = ($_POST['login']); + $permisos = ($_POST['permisos']); + $titulacion = ($_POST['titulacion']); + $pass = sha1(mysqli_real_escape_string($conex, $_POST['pass'])); + $passrw= sha1(mysqli_real_escape_string($conex, $_POST['passrw'])); + + + if ($pass != $passrw) + $mensaje="Las contraseñas no coinciden"; + else{ + + // Comprobamos que no se repita nick + $result = $conex->query("SELECT * FROM TRABAJADORES WHERE `dni_trabajador`<>'$dni_trabajador'"); + while ($row = $result->fetch_assoc()){ + if ($row['dni_trabajador'] != $dni_trabajador){ + if ($row['login'] == $nick) + $mensaje = "El nick '$nick', ya existe para otro trabajador"; + } + } + } + if ($mensaje=="") + { + // Si todos los campos están bien entonces actualizamos el nuevo usuario + if ($pass != 'da39a3ee5e6b4b0d3255bfef95601890afd80709') // ese hash = sin contraseña + $sql="UPDATE `TRABAJADORES` SET `dni_trabajador` = '$dni_trabajador', `nombre` = '$nombre', `apellidos` = '$apellidos', `login` = '$nick', `contraseña` = '$pass', `titulacion` = '$titulacion', `permisos` = '$permisos' + WHERE `dni_trabajador` = '$dni_trabajador'"; + else + $sql="UPDATE `TRABAJADORES` SET `dni_trabajador` = '$dni_trabajador', `nombre` = '$nombre', `apellidos` = '$apellidos', `login` = '$nick', `permisos` = '$permisos', `titulacion` = '$titulacion' + WHERE `dni_trabajador` = '$dni_trabajador'"; + if ($conex->query($sql)) + $mensaje= "Actualizado resgistro para: $nombre $apellidos"; + else $mensaje= "Error actualizando base de datos"; + } + + //Mostramos una tabla con todos los usuarios para marcar el que queremos modificar + $x=0; + if ($result = $conex->query("SELECT * FROM `TRABAJADORES` ORDER BY `nombre` ASC")){ + while ($row = $result->fetch_assoc()) { + $campos[$x] = array($row['dni_trabajador'],$row['login'],$row['nombre'],$row['apellidos'],$row['titulacion'],$row['permisos'], imagen('media/images/personal/',$row['dni_trabajador'])); + $x++; + } + } else $mensaje= "Ha habido un error inesperado."; + + $html->assign("mensaje",$mensaje); + $html->assign("campos",$campos); + $html->assign("id_admin",$id_admin); + + $html->display("mod_gestor.tpl"); + +} + +else + @header('location:index.php'); +?> diff --git a/mod_pac.php b/mod_pac.php new file mode 100644 index 0000000000000000000000000000000000000000..2424d73a7535ad927b8f0fbe64039fd7b2e51748 --- /dev/null +++ b/mod_pac.php @@ -0,0 +1,98 @@ +<?php session_start(); +require('include.php'); +require_once("funciones.php"); +/* +* Archivo de control. Comprobación del inicio de sesión en el sistema +* Caso de uso: INICIAR SESION EN EL SISTEMA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + + // Comprueba que sigue en la sesión + $html=new Smarty; + + + //Cargamos la barra + barra(); + + //Capturamos los datos del formulario + $dni_paciente = ($_POST["dni"]); + $nombre = ($_POST["nombre"]); + $apellidos = ($_POST["apellidos"]); + $edad = ($_POST["edad"]); + $sexo = ($_POST["sexo"]); + $anotaciones = ($_POST["anotaciones"]); + + if ($anotaciones != "" ) { + $sql="UPDATE `PACIENTES` SET `nombre` = '$nombre', `apellidos` = '$apellidos', `sexo` = '$sexo' , `edad` = '$edad', `anotaciones` = '$anotaciones' WHERE `PACIENTES`.`dni_paciente` = '$dni_paciente'"; + }else{ + $sql="UPDATE `PACIENTES` SET `nombre` = '$nombre', `apellidos` = '$apellidos', `sexo` = '$sexo' , `edad` = '$edad', `anotaciones` = NULL WHERE `PACIENTES`.`dni_paciente` = '$dni_paciente'"; + } + if ($conex->query($sql)){ + $mensaje= "Actualizado resgistro para $nombre"; + }else{ $mensaje= "Error actualizando base de datos"; + } + + + $sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba + FROM ENSAYOS, PRUEBAS_PACIENTES + WHERE `dni_paciente`='$dni_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo + ORDER BY fecha DESC + "; + $result=$conex->query($sql); + + // rellenamos array con tabla obtenida + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_prueba'], + $row['tipo'], + $row['fecha'], + $row['simetria'], + $row['anotaciones'] + ]; + $x++; + } + + $html->assign("entrada",$entrada); + + + $sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre + FROM ETIOLOGIAS, PATOLOGIAS + WHERE `dni_paciente`='$dni_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia + ORDER BY fecha_lesion DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $etiologia[$x]=[ + $row['id_etiologia'], + $row['etiologia'], + $row['fecha_lesion'], + $row['cuadrantes'], + $row['comentarios'], + $row['nombre'] + ]; + $x++; + } + $html->assign("etiologia",$etiologia); + } + + $sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$dni_paciente'"; + $result=$conex->query($sql); + $row = $result->fetch_assoc(); + $sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']]; + + $html->assign("mensaje",$mensaje); + $html->assign("id_admin",$id_admin); + $html->assign("sujeto",$sujeto); + + $html->display("pac_reg.tpl"); +} + +else @header('location:index.php'); +?> diff --git a/mod_pass.php b/mod_pass.php new file mode 100644 index 0000000000000000000000000000000000000000..47f7132502c64db992781820f8dbffce950a4072 --- /dev/null +++ b/mod_pass.php @@ -0,0 +1,65 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Modificación de la contraseña del usuario +* Caso de uso: -- +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin = $_GET['variable']; + $html=new Smarty; + + barra(); + + $mensaje=""; + + // Descargamos las variables del formulario: + $oldpass = sha1(mysqli_real_escape_string($conex, $_POST['oldpass'])); + $pass = sha1(mysqli_real_escape_string($conex, $_POST['pass'])); + $passrw= sha1(mysqli_real_escape_string($conex, $_POST['passrw'])); + + if($pass != "da39a3ee5e6b4b0d3255bfef95601890afd80709"){// ese hash = sin contraseña + if ($pass != $passrw){ + $mensaje="Error al escribir la nueva contraseña, intentelo de nuevo"; + $pass = ""; + }else{ + // Comprobamos que coincida la anterior pass + $result = $conex->query("SELECT * FROM TRABAJADORES WHERE `dni_trabajador`='$id_admin'"); + while ($row = $result->fetch_assoc()){ + if ($row['dni_trabajador'] == $id_admin){ + if ($row['contraseña'] != $oldpass){ + $mensaje = "La contraseña antigua no coincide"; + $pass = ""; + }else{ + $passrw = ""; + } + } + } + } + } + if ($pass!="" && $passrw == ""){ + // Si todos los campos están bien entonces actualizamos el nuevo usuario + if ($pass == 'da39a3ee5e6b4b0d3255bfef95601890afd80709'){ // ese hash = sin contraseña + $mensaje = "La nueva contraseña no es válida"; + }else{ + $sql="UPDATE `TRABAJADORES` SET `contraseña` = '$pass' WHERE `TRABAJADORES`.`dni_trabajador` = '$id_admin'"; + if ($conex->query($sql)){ + $mensaje= "Actualizado resgistro para $id_admin"; + }else { + $mensaje= "Error actualizando base de datos"; + } + } + + } + $imagen = imagen('media/images/personal/', $id_admin); + $html->assign("imagen",$imagen); + $html->assign("mensaje",$mensaje); + $html->assign("id_admin",$id_admin); + $html->display("mod_pass.tpl"); + +} + +else + @header('location:index.php'); +?> diff --git a/pac_reg.php b/pac_reg.php new file mode 100644 index 0000000000000000000000000000000000000000..8bd47edcc14ac3c541a860363e08db61ddecb298 --- /dev/null +++ b/pac_reg.php @@ -0,0 +1,75 @@ +<?php session_start(); +require('include.php'); +require_once("funciones.php"); +/* +* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos +* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + $id_admin=$_GET["variable"]; + $id_paciente=$_GET["id"]; + // Comprueba que sigue en la sesión + $html=new Smarty; + + barra(); + + + $sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba + FROM ENSAYOS, PRUEBAS_PACIENTES + WHERE `dni_paciente`='$id_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo + ORDER BY fecha DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_prueba'], + $row['tipo'], + $row['fecha'], + $row['simetria'], + $row['anotaciones'] + ]; + $x++; + } + $html->assign("entrada",$entrada); + } + + //Obtenemos las etiologias del paciente + $sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre + FROM ETIOLOGIAS, PATOLOGIAS + WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia + ORDER BY fecha_lesion DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $etiologia[$x]=[ + $row['id_etiologia'], + $row['etiologia'], + $row['fecha_lesion'], + $row['cuadrantes'], + $row['comentarios'], + $row['nombre'] + ]; + $x++; + } + $html->assign("etiologia",$etiologia); + } + + //Obtenemos los datos del paciente + $sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$id_paciente'"; + $result=$conex->query($sql); + $row = $result->fetch_assoc(); + $sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']]; + $html->assign("sujeto",$sujeto); + + + $html->assign("id_admin",$id_admin); + $html->display("pac_reg.tpl"); +} +else @header('location:index.php'); +?> diff --git a/plugins/block.textformat.php b/plugins/block.textformat.php new file mode 100644 index 0000000000000000000000000000000000000000..5e494637ed38519e9f36c5e56742fd3d88befbcd --- /dev/null +++ b/plugins/block.textformat.php @@ -0,0 +1,121 @@ +<?php +/** + * Smarty plugin to format text blocks + * + * @package Smarty + * @subpackage PluginsBlock + */ +/** + * Smarty {textformat}{/textformat} block plugin + * Type: block function + * Name: textformat + * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings + * Params: + * + * - style - string (email) + * - indent - integer (0) + * - wrap - integer (80) + * - wrap_char - string ("\n") + * - indent_char - string (" ") + * - wrap_boundary - boolean (true) + * + * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * + * @param array $params parameters + * @param string $content contents of the block + * @param Smarty_Internal_Template $template template object + * @param boolean &$repeat repeat flag + * + * @return string content re-formatted + * @author Monte Ohrt <monte at ohrt dot com> + * @throws \SmartyException + */ +function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat) +{ + if (is_null($content)) { + return; + } + if (Smarty::$_MBSTRING) { + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_modifier_mb_wordwrap', + 'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php' + ) + ) + ); + } + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'style': + case 'indent_char': + case 'wrap_char': + case 'assign': + $$_key = (string)$_val; + break; + case 'indent': + case 'indent_first': + case 'wrap': + $$_key = (int)$_val; + break; + case 'wrap_cut': + $$_key = (bool)$_val; + break; + default: + trigger_error("textformat: unknown attribute '{$_key}'"); + } + } + if ($style === 'email') { + $wrap = 72; + } + // split into paragraphs + $_paragraphs = preg_split('![\r\n]{2}!', $content); + foreach ($_paragraphs as &$_paragraph) { + if (!$_paragraph) { + continue; + } + // convert mult. spaces & special chars to single space + $_paragraph = + preg_replace( + array( + '!\s+!' . Smarty::$_UTF8_MODIFIER, + '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER + ), + array( + ' ', + '' + ), + $_paragraph + ); + // indent first line + if ($indent_first > 0) { + $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; + } + // wordwrap sentences + if (Smarty::$_MBSTRING) { + $_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + } else { + $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + } + // indent lines + if ($indent > 0) { + $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); + } + } + $_output = implode($wrap_char . $wrap_char, $_paragraphs); + if ($assign) { + $template->assign($assign, $_output); + } else { + return $_output; + } +} diff --git a/plugins/function.counter.php b/plugins/function.counter.php new file mode 100644 index 0000000000000000000000000000000000000000..a4129e77c7f3b519c3098e8d84a34ef24a844d7e --- /dev/null +++ b/plugins/function.counter.php @@ -0,0 +1,62 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {counter} function plugin + * Type: function + * Name: counter + * Purpose: print out a counter value + * + * @author Monte Ohrt <monte at ohrt dot com> + * @link http://www.smarty.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string|null + */ +function smarty_function_counter($params, $template) +{ + static $counters = array(); + $name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default'; + if (!isset($counters[ $name ])) { + $counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1); + } + $counter =& $counters[ $name ]; + if (isset($params[ 'start' ])) { + $counter[ 'start' ] = $counter[ 'count' ] = (int)$params[ 'start' ]; + } + if (!empty($params[ 'assign' ])) { + $counter[ 'assign' ] = $params[ 'assign' ]; + } + if (isset($counter[ 'assign' ])) { + $template->assign($counter[ 'assign' ], $counter[ 'count' ]); + } + if (isset($params[ 'print' ])) { + $print = (bool)$params[ 'print' ]; + } else { + $print = empty($counter[ 'assign' ]); + } + if ($print) { + $retval = $counter[ 'count' ]; + } else { + $retval = null; + } + if (isset($params[ 'skip' ])) { + $counter[ 'skip' ] = $params[ 'skip' ]; + } + if (isset($params[ 'direction' ])) { + $counter[ 'direction' ] = $params[ 'direction' ]; + } + if ($counter[ 'direction' ] === 'down') { + $counter[ 'count' ] -= $counter[ 'skip' ]; + } else { + $counter[ 'count' ] += $counter[ 'skip' ]; + } + return $retval; +} diff --git a/plugins/function.cycle.php b/plugins/function.cycle.php new file mode 100644 index 0000000000000000000000000000000000000000..07ffcc5e243cd81aa6dd6dd68237b85945dccd1c --- /dev/null +++ b/plugins/function.cycle.php @@ -0,0 +1,92 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {cycle} function plugin + * Type: function + * Name: cycle + * Date: May 3, 2002 + * Purpose: cycle through given values + * Params: + * + * - name - name of cycle (optional) + * - values - comma separated list of values to cycle, or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset - boolean - resets given var to true + * - print - boolean - print var or not. default is true + * - advance - boolean - whether or not to advance the cycle + * - delimiter - the value delimiter, default is "," + * - assign - boolean, assigns to template var instead of printed. + * + * Examples: + * + * {cycle values="#eeeeee,#d0d0d0d"} + * {cycle name=row values="one,two,three" reset=true} + * {cycle name=row} + * + * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Mark Priatel <mpriatel@rogers.com> + * @author credit to Gerard <gerard@interfold.com> + * @author credit to Jason Sweat <jsweat_php@yahoo.com> + * @version 1.3 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string|null + */ +function smarty_function_cycle($params, $template) +{ + static $cycle_vars; + $name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ]; + $print = (isset($params[ 'print' ])) ? (bool)$params[ 'print' ] : true; + $advance = (isset($params[ 'advance' ])) ? (bool)$params[ 'advance' ] : true; + $reset = (isset($params[ 'reset' ])) ? (bool)$params[ 'reset' ] : false; + if (!isset($params[ 'values' ])) { + if (!isset($cycle_vars[ $name ][ 'values' ])) { + trigger_error('cycle: missing \'values\' parameter'); + return; + } + } else { + if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) { + $cycle_vars[ $name ][ 'index' ] = 0; + } + $cycle_vars[ $name ][ 'values' ] = $params[ 'values' ]; + } + if (isset($params[ 'delimiter' ])) { + $cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ]; + } elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) { + $cycle_vars[ $name ][ 'delimiter' ] = ','; + } + if (is_array($cycle_vars[ $name ][ 'values' ])) { + $cycle_array = $cycle_vars[ $name ][ 'values' ]; + } else { + $cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]); + } + if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) { + $cycle_vars[ $name ][ 'index' ] = 0; + } + if (isset($params[ 'assign' ])) { + $print = false; + $template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]); + } + if ($print) { + $retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]; + } else { + $retval = null; + } + if ($advance) { + if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) { + $cycle_vars[ $name ][ 'index' ] = 0; + } else { + $cycle_vars[ $name ][ 'index' ]++; + } + } + return $retval; +} diff --git a/plugins/function.fetch.php b/plugins/function.fetch.php new file mode 100644 index 0000000000000000000000000000000000000000..768761b2380ae610a5f4d3ee2fbc995a0a5b1a08 --- /dev/null +++ b/plugins/function.fetch.php @@ -0,0 +1,204 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {fetch} plugin + * Type: function + * Name: fetch + * Purpose: fetch file, web or ftp data and display results + * + * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @throws SmartyException + * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable + */ +function smarty_function_fetch($params, $template) +{ + if (empty($params[ 'file' ])) { + trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE); + return; + } + // strip file protocol + if (stripos($params[ 'file' ], 'file://') === 0) { + $params[ 'file' ] = substr($params[ 'file' ], 7); + } + $protocol = strpos($params[ 'file' ], '://'); + if ($protocol !== false) { + $protocol = strtolower(substr($params[ 'file' ], 0, $protocol)); + } + if (isset($template->smarty->security_policy)) { + if ($protocol) { + // remote resource (or php stream, …) + if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) { + return; + } + } else { + // local file + if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) { + return; + } + } + } + $content = ''; + if ($protocol === 'http') { + // http fetch + if ($uri_parts = parse_url($params[ 'file' ])) { + // set defaults + $host = $server_name = $uri_parts[ 'host' ]; + $timeout = 30; + $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'; + $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION; + $referer = ''; + $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/'; + $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : ''; + $_is_proxy = false; + if (empty($uri_parts[ 'port' ])) { + $port = 80; + } else { + $port = $uri_parts[ 'port' ]; + } + if (!empty($uri_parts[ 'user' ])) { + $user = $uri_parts[ 'user' ]; + } + if (!empty($uri_parts[ 'pass' ])) { + $pass = $uri_parts[ 'pass' ]; + } + // loop through parameters, setup headers + foreach ($params as $param_key => $param_value) { + switch ($param_key) { + case 'file': + case 'assign': + case 'assign_headers': + break; + case 'user': + if (!empty($param_value)) { + $user = $param_value; + } + break; + case 'pass': + if (!empty($param_value)) { + $pass = $param_value; + } + break; + case 'accept': + if (!empty($param_value)) { + $accept = $param_value; + } + break; + case 'header': + if (!empty($param_value)) { + if (!preg_match('![\w\d-]+: .+!', $param_value)) { + trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case 'proxy_host': + if (!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case 'proxy_port': + if (!preg_match('!\D!', $param_value)) { + $proxy_port = (int)$param_value; + } else { + trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE); + return; + } + break; + case 'agent': + if (!empty($param_value)) { + $agent = $param_value; + } + break; + case 'referer': + if (!empty($param_value)) { + $referer = $param_value; + } + break; + case 'timeout': + if (!preg_match('!\D!', $param_value)) { + $timeout = (int)$param_value; + } else { + trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE); + return; + } + break; + default: + trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE); + return; + } + } + if (!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout); + } else { + $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout); + } + if (!$fp) { + trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE); + return; + } else { + if ($_is_proxy) { + fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if (!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if (!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if (!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if (!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if (isset($extra_headers) && is_array($extra_headers)) { + foreach ($extra_headers as $curr_header) { + fputs($fp, $curr_header . "\r\n"); + } + } + if (!empty($user) && !empty($pass)) { + fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n"); + } + fputs($fp, "\r\n"); + while (!feof($fp)) { + $content .= fgets($fp, 4096); + } + fclose($fp); + $csplit = preg_split("!\r\n\r\n!", $content, 2); + $content = $csplit[ 1 ]; + if (!empty($params[ 'assign_headers' ])) { + $template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ])); + } + } + } else { + trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE); + return; + } + } else { + $content = @file_get_contents($params[ 'file' ]); + if ($content === false) { + throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'"); + } + } + if (!empty($params[ 'assign' ])) { + $template->assign($params[ 'assign' ], $content); + } else { + return $content; + } +} diff --git a/plugins/function.html_checkboxes.php b/plugins/function.html_checkboxes.php new file mode 100644 index 0000000000000000000000000000000000000000..302358edd88ed24bafd4403852b788b26d2ca801 --- /dev/null +++ b/plugins/function.html_checkboxes.php @@ -0,0 +1,286 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_checkboxes} function plugin + * File: function.html_checkboxes.php + * Type: function + * Name: html_checkboxes + * Date: 24.Feb.2003 + * Purpose: Prints out a list of checkbox input types + * Examples: + * + * {html_checkboxes values=$ids output=$names} + * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} + * + * Params: + * + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true + * + * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme <christopher.kvarme@flashjab.com> + * @author credits to Monte Ohrt <monte at ohrt dot com> + * @version 1.0 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string + * @uses smarty_function_escape_special_chars() + * @throws \SmartyException + */ +function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + $name = 'checkbox'; + $values = null; + $options = null; + $selected = array(); + $separator = ''; + $escape = true; + $labels = true; + $label_ids = false; + $output = null; + $extra = ''; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'separator': + $$_key = (string)$_val; + break; + case 'escape': + case 'labels': + case 'label_ids': + $$_key = (bool)$_val; + break; + case 'options': + $$_key = (array)$_val; + break; + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + case 'checked': + case 'selected': + if (is_array($_val)) { + $selected = array(); + foreach ($_val as $_sel) { + if (is_object($_sel)) { + if (method_exists($_sel, '__toString')) { + $_sel = smarty_function_escape_special_chars((string)$_sel->__toString()); + } else { + trigger_error( + 'html_checkboxes: selected attribute contains an object of class \'' . + get_class($_sel) . '\' without __toString() method', + E_USER_NOTICE + ); + continue; + } + } else { + $_sel = smarty_function_escape_special_chars((string)$_sel); + } + $selected[ $_sel ] = true; + } + } elseif (is_object($_val)) { + if (method_exists($_val, '__toString')) { + $selected = smarty_function_escape_special_chars((string)$_val->__toString()); + } else { + trigger_error( + 'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', + E_USER_NOTICE + ); + } + } else { + $selected = smarty_function_escape_special_chars((string)$_val); + } + break; + case 'checkboxes': + trigger_error( + 'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', + E_USER_WARNING + ); + $options = (array)$_val; + break; + case 'assign': + break; + case 'strict': + break; + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error( + "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", + E_USER_NOTICE + ); + } + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + break; + } + // omit break; to fall through! + // no break + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); + } + break; + } + } + if (!isset($options) && !isset($values)) { + return ''; + } /* raise error here? */ + $_html_result = array(); + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result[] = + smarty_function_html_checkboxes_output( + $name, + $_key, + $_val, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $escape + ); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; + $_html_result[] = + smarty_function_html_checkboxes_output( + $name, + $_key, + $_val, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $escape + ); + } + } + if (!empty($params[ 'assign' ])) { + $template->assign($params[ 'assign' ], $_html_result); + } else { + return implode("\n", $_html_result); + } +} + +/** + * @param $name + * @param $value + * @param $output + * @param $selected + * @param $extra + * @param $separator + * @param $labels + * @param $label_ids + * @param bool $escape + * + * @return string + */ +function smarty_function_html_checkboxes_output( + $name, + $value, + $output, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $escape = true +) { + $_output = ''; + if (is_object($value)) { + if (method_exists($value, '__toString')) { + $value = (string)$value->__toString(); + } else { + trigger_error( + 'html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $value = (string)$value; + } + if (is_object($output)) { + if (method_exists($output, '__toString')) { + $output = (string)$output->__toString(); + } else { + trigger_error( + 'html_options: output is an object of class \'' . get_class($output) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $output = (string)$output; + } + if ($labels) { + if ($label_ids) { + $_id = smarty_function_escape_special_chars( + preg_replace( + '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, + '_', + $name . '_' . $value + ) + ); + $_output .= '<label for="' . $_id . '">'; + } else { + $_output .= '<label>'; + } + } + $name = smarty_function_escape_special_chars($name); + $value = smarty_function_escape_special_chars($value); + if ($escape) { + $output = smarty_function_escape_special_chars($output); + } + $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; + if ($labels && $label_ids) { + $_output .= ' id="' . $_id . '"'; + } + if (is_array($selected)) { + if (isset($selected[ $value ])) { + $_output .= ' checked="checked"'; + } + } elseif ($value === $selected) { + $_output .= ' checked="checked"'; + } + $_output .= $extra . ' />' . $output; + if ($labels) { + $_output .= '</label>'; + } + $_output .= $separator; + return $_output; +} diff --git a/plugins/function.html_image.php b/plugins/function.html_image.php new file mode 100644 index 0000000000000000000000000000000000000000..ad468e4f15d8b9a56d3d344ea276598c89778733 --- /dev/null +++ b/plugins/function.html_image.php @@ -0,0 +1,158 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_image} function plugin + * Type: function + * Name: html_image + * Date: Feb 24, 2003 + * Purpose: format HTML tags for the image + * Examples: {html_image file="/images/masthead.gif"} + * Output: <img src="/images/masthead.gif" width=400 height=23> + * Params: + * + * - file - (required) - file (and path) of image + * - height - (optional) - image height (default actual height) + * - width - (optional) - image width (default actual width) + * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT + * - path_prefix - prefix for path output (optional, default empty) + * + * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Duda <duda@big.hu> + * @version 1.0 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @throws SmartyException + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + $alt = ''; + $file = ''; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $path_prefix = ''; + $basedir = isset($_SERVER[ 'DOCUMENT_ROOT' ]) ? $_SERVER[ 'DOCUMENT_ROOT' ] : ''; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'file': + case 'height': + case 'width': + case 'dpi': + case 'path_prefix': + case 'basedir': + $$_key = $_val; + break; + case 'alt': + if (!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + throw new SmartyException( + "html_image: extra attribute '{$_key}' cannot be an array", + E_USER_NOTICE + ); + } + break; + case 'link': + case 'href': + $prefix = '<a href="' . $_val . '">'; + $suffix = '</a>'; + break; + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + throw new SmartyException( + "html_image: extra attribute '{$_key}' cannot be an array", + E_USER_NOTICE + ); + } + break; + } + } + if (empty($file)) { + trigger_error('html_image: missing \'file\' parameter', E_USER_NOTICE); + return; + } + if ($file[ 0 ] === '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + // strip file protocol + if (stripos($params[ 'file' ], 'file://') === 0) { + $params[ 'file' ] = substr($params[ 'file' ], 7); + } + $protocol = strpos($params[ 'file' ], '://'); + if ($protocol !== false) { + $protocol = strtolower(substr($params[ 'file' ], 0, $protocol)); + } + if (isset($template->smarty->security_policy)) { + if ($protocol) { + // remote resource (or php stream, …) + if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) { + return; + } + } else { + // local file + if (!$template->smarty->security_policy->isTrustedResourceDir($_image_path)) { + return; + } + } + } + if (!isset($params[ 'width' ]) || !isset($params[ 'height' ])) { + // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader! + if (!$_image_data = @getimagesize($_image_path)) { + if (!file_exists($_image_path)) { + trigger_error("html_image: unable to find '{$_image_path}'", E_USER_NOTICE); + return; + } elseif (!is_readable($_image_path)) { + trigger_error("html_image: unable to read '{$_image_path}'", E_USER_NOTICE); + return; + } else { + trigger_error("html_image: '{$_image_path}' is not a valid image file", E_USER_NOTICE); + return; + } + } + if (!isset($params[ 'width' ])) { + $width = $_image_data[ 0 ]; + } + if (!isset($params[ 'height' ])) { + $height = $_image_data[ 1 ]; + } + } + if (isset($params[ 'dpi' ])) { + if (strstr($_SERVER[ 'HTTP_USER_AGENT' ], 'Mac')) { + // FIXME: (rodneyrehm) wrong dpi assumption + // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011. + $dpi_default = 72; + } else { + $dpi_default = 96; + } + $_resize = $dpi_default / $params[ 'dpi' ]; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . + $height . '"' . $extra . ' />' . $suffix; +} diff --git a/plugins/function.html_options.php b/plugins/function.html_options.php new file mode 100644 index 0000000000000000000000000000000000000000..6907e8ee1264c084dab964df84c8b61c2cd872a7 --- /dev/null +++ b/plugins/function.html_options.php @@ -0,0 +1,230 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_options} function plugin + * Type: function + * Name: html_options + * Purpose: Prints the list of <option> tags generated from + * the passed parameters + * Params: + * + * - name (optional) - string default "select" + * - values (required) - if no options supplied) - array + * - options (required) - if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required) - if not options supplied) - array + * - id (optional) - string default not set + * - class (optional) - string default not set + * + * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> + * + * @param array $params parameters + * + * @param \Smarty_Internal_Template $template + * + * @return string + * @uses smarty_function_escape_special_chars() + * @throws \SmartyException + */ +function smarty_function_html_options($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + $name = null; + $values = null; + $options = null; + $selected = null; + $output = null; + $id = null; + $class = null; + $extra = ''; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'class': + case 'id': + $$_key = (string)$_val; + break; + case 'options': + $options = (array)$_val; + break; + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + case 'selected': + if (is_array($_val)) { + $selected = array(); + foreach ($_val as $_sel) { + if (is_object($_sel)) { + if (method_exists($_sel, '__toString')) { + $_sel = smarty_function_escape_special_chars((string)$_sel->__toString()); + } else { + trigger_error( + 'html_options: selected attribute contains an object of class \'' . + get_class($_sel) . '\' without __toString() method', + E_USER_NOTICE + ); + continue; + } + } else { + $_sel = smarty_function_escape_special_chars((string)$_sel); + } + $selected[ $_sel ] = true; + } + } elseif (is_object($_val)) { + if (method_exists($_val, '__toString')) { + $selected = smarty_function_escape_special_chars((string)$_val->__toString()); + } else { + trigger_error( + 'html_options: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', + E_USER_NOTICE + ); + } + } else { + $selected = smarty_function_escape_special_chars((string)$_val); + } + break; + case 'strict': + break; + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error( + "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", + E_USER_NOTICE + ); + } + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + break; + } + // omit break; to fall through! + // no break + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); + } + break; + } + } + if (!isset($options) && !isset($values)) { + /* raise error here? */ + return ''; + } + $_html_result = ''; + $_idx = 0; + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + } + } + if (!empty($name)) { + $_html_class = !empty($class) ? ' class="' . $class . '"' : ''; + $_html_id = !empty($id) ? ' id="' . $id . '"' : ''; + $_html_result = + '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . + '</select>' . "\n"; + } + return $_html_result; +} + +/** + * @param $key + * @param $value + * @param $selected + * @param $id + * @param $class + * @param $idx + * + * @return string + */ +function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) +{ + if (!is_array($value)) { + $_key = smarty_function_escape_special_chars($key); + $_html_result = '<option value="' . $_key . '"'; + if (is_array($selected)) { + if (isset($selected[ $_key ])) { + $_html_result .= ' selected="selected"'; + } + } elseif ($_key === $selected) { + $_html_result .= ' selected="selected"'; + } + $_html_class = !empty($class) ? ' class="' . $class . ' option"' : ''; + $_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : ''; + if (is_object($value)) { + if (method_exists($value, '__toString')) { + $value = smarty_function_escape_special_chars((string)$value->__toString()); + } else { + trigger_error( + 'html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $value = smarty_function_escape_special_chars((string)$value); + } + $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n"; + $idx++; + } else { + $_idx = 0; + $_html_result = + smarty_function_html_options_optgroup( + $key, + $value, + $selected, + !empty($id) ? ($id . '-' . $idx) : null, + $class, + $_idx + ); + $idx++; + } + return $_html_result; +} + +/** + * @param $key + * @param $values + * @param $selected + * @param $id + * @param $class + * @param $idx + * + * @return string + */ +function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) +{ + $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; + foreach ($values as $key => $value) { + $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx); + } + $optgroup_html .= "</optgroup>\n"; + return $optgroup_html; +} diff --git a/plugins/function.html_radios.php b/plugins/function.html_radios.php new file mode 100644 index 0000000000000000000000000000000000000000..5e834587cd0c24f4a563d4a116335046b0586d5c --- /dev/null +++ b/plugins/function.html_radios.php @@ -0,0 +1,266 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_radios} function plugin + * File: function.html_radios.php + * Type: function + * Name: html_radios + * Date: 24.Feb.2003 + * Purpose: Prints out a list of radio input types + * Params: + * + * - name (optional) - string default "radio" + * - values (required) - array + * - options (required) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or + * - output (optional) - the output next to each radio button + * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true + * + * Examples: + * + * {html_radios values=$ids output=$names} + * {html_radios values=$ids name='box' separator='<br>' output=$names} + * {html_radios values=$ids checked=$checked separator='<br>' output=$names} + * + * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} + * (Smarty online manual) + * @author Christopher Kvarme <christopher.kvarme@flashjab.com> + * @author credits to Monte Ohrt <monte at ohrt dot com> + * @version 1.0 + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string + * @uses smarty_function_escape_special_chars() + * @throws \SmartyException + */ +function smarty_function_html_radios($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + $name = 'radio'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $escape = true; + $labels = true; + $label_ids = false; + $output = null; + $extra = ''; + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'separator': + $$_key = (string)$_val; + break; + case 'checked': + case 'selected': + if (is_array($_val)) { + trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); + } elseif (is_object($_val)) { + if (method_exists($_val, '__toString')) { + $selected = smarty_function_escape_special_chars((string)$_val->__toString()); + } else { + trigger_error( + 'html_radios: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', + E_USER_NOTICE + ); + } + } else { + $selected = (string)$_val; + } + break; + case 'escape': + case 'labels': + case 'label_ids': + $$_key = (bool)$_val; + break; + case 'options': + $$_key = (array)$_val; + break; + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + case 'radios': + trigger_error( + 'html_radios: the use of the "radios" attribute is deprecated, use "options" instead', + E_USER_WARNING + ); + $options = (array)$_val; + break; + case 'assign': + break; + case 'strict': + break; + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error( + "html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + E_USER_NOTICE + ); + } + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + break; + } + // omit break; to fall through! + // no break + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); + } + break; + } + } + if (!isset($options) && !isset($values)) { + /* raise error here? */ + return ''; + } + $_html_result = array(); + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result[] = + smarty_function_html_radios_output( + $name, + $_key, + $_val, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $escape + ); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; + $_html_result[] = + smarty_function_html_radios_output( + $name, + $_key, + $_val, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $escape + ); + } + } + if (!empty($params[ 'assign' ])) { + $template->assign($params[ 'assign' ], $_html_result); + } else { + return implode("\n", $_html_result); + } +} + +/** + * @param $name + * @param $value + * @param $output + * @param $selected + * @param $extra + * @param $separator + * @param $labels + * @param $label_ids + * @param $escape + * + * @return string + */ +function smarty_function_html_radios_output( + $name, + $value, + $output, + $selected, + $extra, + $separator, + $labels, + $label_ids, + $escape +) { + $_output = ''; + if (is_object($value)) { + if (method_exists($value, '__toString')) { + $value = (string)$value->__toString(); + } else { + trigger_error( + 'html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $value = (string)$value; + } + if (is_object($output)) { + if (method_exists($output, '__toString')) { + $output = (string)$output->__toString(); + } else { + trigger_error( + 'html_options: output is an object of class \'' . get_class($output) . + '\' without __toString() method', + E_USER_NOTICE + ); + return ''; + } + } else { + $output = (string)$output; + } + if ($labels) { + if ($label_ids) { + $_id = smarty_function_escape_special_chars( + preg_replace( + '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, + '_', + $name . '_' . $value + ) + ); + $_output .= '<label for="' . $_id . '">'; + } else { + $_output .= '<label>'; + } + } + $name = smarty_function_escape_special_chars($name); + $value = smarty_function_escape_special_chars($value); + if ($escape) { + $output = smarty_function_escape_special_chars($output); + } + $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; + if ($labels && $label_ids) { + $_output .= ' id="' . $_id . '"'; + } + if ($value === $selected) { + $_output .= ' checked="checked"'; + } + $_output .= $extra . ' />' . $output; + if ($labels) { + $_output .= '</label>'; + } + $_output .= $separator; + return $_output; +} diff --git a/plugins/function.html_select_date.php b/plugins/function.html_select_date.php new file mode 100644 index 0000000000000000000000000000000000000000..86403e3dc048a4d4c9f2aaed08799114f05877ae --- /dev/null +++ b/plugins/function.html_select_date.php @@ -0,0 +1,388 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_select_date} plugin + * Type: function + * Name: html_select_date + * Purpose: Prints the dropdowns for date selection. + * ChangeLog: + * + * - 1.0 initial release + * - 1.1 added support for +/- N syntax for begin + * and end year values. (Monte) + * - 1.2 added support for yyyy-mm-dd syntax for + * time value. (Jan Rosier) + * - 1.3 added support for choosing format for + * month values (Gary Loescher) + * - 1.3.1 added support for choosing format for + * day values (Marcus Bointon) + * - 1.3.2 support negative timestamps, force year + * dropdown to include given date unless explicitly set (Monte) + * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that + * of 0000-00-00 dates (cybot, boots) + * - 2.0 complete rewrite for performance, + * added attributes month_names, *_id + * + * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} + * (Smarty online manual) + * @version 2.0 + * @author Andrei Zmievski + * @author Monte Ohrt <monte at ohrt dot com> + * @author Rodney Rehm + * + * @param array $params parameters + * + * @param \Smarty_Internal_Template $template + * + * @return string + * @throws \SmartyException + */ +function smarty_function_html_select_date($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + // generate timestamps used for month names only + static $_month_timestamps = null; + static $_current_year = null; + if ($_month_timestamps === null) { + $_current_year = date('Y'); + $_month_timestamps = array(); + for ($i = 1; $i <= 12; $i++) { + $_month_timestamps[ $i ] = mktime(0, 0, 0, $i, 1, 2000); + } + } + /* Default values. */ + $prefix = 'Date_'; + $start_year = null; + $end_year = null; + $display_days = true; + $display_months = true; + $display_years = true; + $month_format = '%B'; + /* Write months as numbers by default GL */ + $month_value_format = '%m'; + $day_format = '%02d'; + /* Write day values using this format MB */ + $day_value_format = '%d'; + $year_as_text = false; + /* Display years in reverse order? Ie. 2000,1999,.... */ + $reverse_years = false; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Day]", + "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ + $field_array = null; + /* <select size>'s of the different <select> tags. + If not set, uses default dropdown. */ + $day_size = null; + $month_size = null; + $year_size = null; + /* Unparsed attributes common to *ALL* the <select>/<input> tags. + An example might be in the template: all_extra ='class ="foo"'. */ + $all_extra = null; + /* Separate attributes for the tags. */ + $day_extra = null; + $month_extra = null; + $year_extra = null; + /* Order in which to display the fields. + "D" -> day, "M" -> month, "Y" -> year. */ + $field_order = 'MDY'; + /* String printed between the different fields. */ + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + // $all_empty = null; + // $day_empty = null; + // $month_empty = null; + // $year_empty = null; + $extra_attrs = ''; + $all_id = null; + $day_id = null; + $month_id = null; + $year_id = null; + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'time': + if (!is_array($_value) && $_value !== null) { + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_make_timestamp', + 'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php' + ) + ) + ); + $time = smarty_make_timestamp($_value); + } + break; + case 'month_names': + if (is_array($_value) && count($_value) === 12) { + $$_key = $_value; + } else { + trigger_error('html_select_date: month_names must be an array of 12 strings', E_USER_NOTICE); + } + break; + case 'prefix': + case 'field_array': + case 'start_year': + case 'end_year': + case 'day_format': + case 'day_value_format': + case 'month_format': + case 'month_value_format': + case 'day_size': + case 'month_size': + case 'year_size': + case 'all_extra': + case 'day_extra': + case 'month_extra': + case 'year_extra': + case 'field_order': + case 'field_separator': + case 'option_separator': + case 'all_empty': + case 'month_empty': + case 'day_empty': + case 'year_empty': + case 'all_id': + case 'month_id': + case 'day_id': + case 'year_id': + $$_key = (string)$_value; + break; + case 'display_days': + case 'display_months': + case 'display_years': + case 'year_as_text': + case 'reverse_years': + $$_key = (bool)$_value; + break; + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); + } + break; + } + } + // Note: date() is faster than strftime() + // Note: explode(date()) is faster than date() date() date() + if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) { + if (isset($params[ 'time' ][ $prefix . 'Year' ])) { + // $_REQUEST[$field_array] given + foreach (array( + 'Y' => 'Year', + 'm' => 'Month', + 'd' => 'Day' + ) as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = + isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] : + date($_elementKey); + } + } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Year' ])) { + // $_REQUEST given + foreach (array( + 'Y' => 'Year', + 'm' => 'Month', + 'd' => 'Day' + ) as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ? + $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey); + } + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + if (array_key_exists('time', $params)) { + $_year = $_month = $_day = $time = null; + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); + } + // make syntax "+N" or "-N" work with $start_year and $end_year + // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr + foreach (array( + 'start', + 'end' + ) as $key) { + $key .= '_year'; + $t = $$key; + if ($t === null) { + $$key = (int)$_current_year; + } elseif ($t[ 0 ] === '+') { + $$key = (int)($_current_year + (int)trim(substr($t, 1))); + } elseif ($t[ 0 ] === '-') { + $$key = (int)($_current_year - (int)trim(substr($t, 1))); + } else { + $$key = (int)$$key; + } + } + // flip for ascending or descending + if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { + $t = $end_year; + $end_year = $start_year; + $start_year = $t; + } + // generate year <select> or <input> + if ($display_years) { + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($year_extra) { + $_extra .= ' ' . $year_extra; + } + if ($year_as_text) { + $_html_years = + '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . + $extra_attrs . ' />'; + } else { + $_html_years = '<select name="' . $_name . '"'; + if ($year_id !== null || $all_id !== null) { + $_html_years .= ' id="' . smarty_function_escape_special_chars( + $year_id !== null ? + ($year_id ? $year_id : $_name) : + ($all_id ? ($all_id . $_name) : + $_name) + ) . '"'; + } + if ($year_size) { + $_html_years .= ' size="' . $year_size . '"'; + } + $_html_years .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($year_empty) || isset($all_empty)) { + $_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' . + $option_separator; + } + $op = $start_year > $end_year ? -1 : 1; + for ($i = $start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { + $_html_years .= '<option value="' . $i . '"' . ($_year == $i ? ' selected="selected"' : '') . '>' . $i . + '</option>' . $option_separator; + } + $_html_years .= '</select>'; + } + } + // generate month <select> or <input> + if ($display_months) { + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($month_extra) { + $_extra .= ' ' . $month_extra; + } + $_html_months = '<select name="' . $_name . '"'; + if ($month_id !== null || $all_id !== null) { + $_html_months .= ' id="' . smarty_function_escape_special_chars( + $month_id !== null ? + ($month_id ? $month_id : $_name) : + ($all_id ? ($all_id . $_name) : + $_name) + ) . '"'; + } + if ($month_size) { + $_html_months .= ' size="' . $month_size . '"'; + } + $_html_months .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($month_empty) || isset($all_empty)) { + $_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' . + $option_separator; + } + for ($i = 1; $i <= 12; $i++) { + $_val = sprintf('%02d', $i); + $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[ $i ]) : + ($month_format === '%m' ? $_val : strftime($month_format, $_month_timestamps[ $i ])); + $_value = $month_value_format === '%m' ? $_val : strftime($month_value_format, $_month_timestamps[ $i ]); + $_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') . + '>' . $_text . '</option>' . $option_separator; + } + $_html_months .= '</select>'; + } + // generate day <select> or <input> + if ($display_days) { + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($day_extra) { + $_extra .= ' ' . $day_extra; + } + $_html_days = '<select name="' . $_name . '"'; + if ($day_id !== null || $all_id !== null) { + $_html_days .= ' id="' . + smarty_function_escape_special_chars( + $day_id !== null ? ($day_id ? $day_id : $_name) : + ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($day_size) { + $_html_days .= ' size="' . $day_size . '"'; + } + $_html_days .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($day_empty) || isset($all_empty)) { + $_html_days .= '<option value="">' . (isset($day_empty) ? $day_empty : $all_empty) . '</option>' . + $option_separator; + } + for ($i = 1; $i <= 31; $i++) { + $_val = sprintf('%02d', $i); + $_text = $day_format === '%02d' ? $_val : sprintf($day_format, $i); + $_value = $day_value_format === '%02d' ? $_val : sprintf($day_value_format, $i); + $_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' . + $_text . '</option>' . $option_separator; + } + $_html_days .= '</select>'; + } + // order the fields for output + $_html = ''; + for ($i = 0; $i <= 2; $i++) { + switch ($field_order[ $i ]) { + case 'Y': + case 'y': + if (isset($_html_years)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_years; + } + break; + case 'm': + case 'M': + if (isset($_html_months)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_months; + } + break; + case 'd': + case 'D': + if (isset($_html_days)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_days; + } + break; + } + } + return $_html; +} diff --git a/plugins/function.html_select_time.php b/plugins/function.html_select_time.php new file mode 100644 index 0000000000000000000000000000000000000000..cb047bc0aac0fc341c7c6bbfdec2af8a217f09cc --- /dev/null +++ b/plugins/function.html_select_time.php @@ -0,0 +1,354 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_select_time} function plugin + * Type: function + * Name: html_select_time + * Purpose: Prints the dropdowns for time selection + * + * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} + * (Smarty online manual) + * @author Roberto Berto <roberto@berto.net> + * @author Monte Ohrt <monte AT ohrt DOT com> + * + * @param array $params parameters + * + * @param \Smarty_Internal_Template $template + * + * @return string + * @uses smarty_make_timestamp() + * @throws \SmartyException + */ +function smarty_function_html_select_time($params, Smarty_Internal_Template $template) +{ + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' + ) + ) + ); + $prefix = 'Time_'; + $field_array = null; + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + $display_hours = true; + $display_minutes = true; + $display_seconds = true; + $display_meridian = true; + $hour_format = '%02d'; + $hour_value_format = '%02d'; + $minute_format = '%02d'; + $minute_value_format = '%02d'; + $second_format = '%02d'; + $second_value_format = '%02d'; + $hour_size = null; + $minute_size = null; + $second_size = null; + $meridian_size = null; + $all_empty = null; + $hour_empty = null; + $minute_empty = null; + $second_empty = null; + $meridian_empty = null; + $all_id = null; + $hour_id = null; + $minute_id = null; + $second_id = null; + $meridian_id = null; + $use_24_hours = true; + $minute_interval = 1; + $second_interval = 1; + $extra_attrs = ''; + $all_extra = null; + $hour_extra = null; + $minute_extra = null; + $second_extra = null; + $meridian_extra = null; + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'time': + if (!is_array($_value) && $_value !== null) { + $template->_checkPlugins( + array( + array( + 'function' => 'smarty_make_timestamp', + 'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php' + ) + ) + ); + $time = smarty_make_timestamp($_value); + } + break; + case 'prefix': + case 'field_array': + case 'field_separator': + case 'option_separator': + case 'all_extra': + case 'hour_extra': + case 'minute_extra': + case 'second_extra': + case 'meridian_extra': + case 'all_empty': + case 'hour_empty': + case 'minute_empty': + case 'second_empty': + case 'meridian_empty': + case 'all_id': + case 'hour_id': + case 'minute_id': + case 'second_id': + case 'meridian_id': + case 'hour_format': + case 'hour_value_format': + case 'minute_format': + case 'minute_value_format': + case 'second_format': + case 'second_value_format': + $$_key = (string)$_value; + break; + case 'display_hours': + case 'display_minutes': + case 'display_seconds': + case 'display_meridian': + case 'use_24_hours': + $$_key = (bool)$_value; + break; + case 'minute_interval': + case 'second_interval': + case 'hour_size': + case 'minute_size': + case 'second_size': + case 'meridian_size': + $$_key = (int)$_value; + break; + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); + } + break; + } + } + if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) { + if (isset($params[ 'time' ][ $prefix . 'Hour' ])) { + // $_REQUEST[$field_array] given + foreach (array( + 'H' => 'Hour', + 'i' => 'Minute', + 's' => 'Second' + ) as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = + isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] : + date($_elementKey); + } + $_meridian = + isset($params[ 'time' ][ $prefix . 'Meridian' ]) ? (' ' . $params[ 'time' ][ $prefix . 'Meridian' ]) : + ''; + $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) { + // $_REQUEST given + foreach (array( + 'H' => 'Hour', + 'i' => 'Minute', + 's' => 'Second' + ) as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ? + $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey); + } + $_meridian = isset($params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) ? + (' ' . $params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) : ''; + $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + if (array_key_exists('time', $params)) { + $_hour = $_minute = $_second = $time = null; + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); + } + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } + // generate hour <select> + if ($display_hours) { + $_html_hours = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($hour_extra) { + $_extra .= ' ' . $hour_extra; + } + $_html_hours = '<select name="' . $_name . '"'; + if ($hour_id !== null || $all_id !== null) { + $_html_hours .= ' id="' . + smarty_function_escape_special_chars( + $hour_id !== null ? ($hour_id ? $hour_id : $_name) : + ($all_id ? ($all_id . $_name) : $_name) + ) . '"'; + } + if ($hour_size) { + $_html_hours .= ' size="' . $hour_size . '"'; + } + $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($hour_empty) || isset($all_empty)) { + $_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' . + $option_separator; + } + $start = $use_24_hours ? 0 : 1; + $end = $use_24_hours ? 23 : 12; + for ($i = $start; $i <= $end; $i++) { + $_val = sprintf('%02d', $i); + $_text = $hour_format === '%02d' ? $_val : sprintf($hour_format, $i); + $_value = $hour_value_format === '%02d' ? $_val : sprintf($hour_value_format, $i); + if (!$use_24_hours) { + $_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12); + } + $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null; + $_html_hours .= '<option value="' . $_value . '"' . ($selected ? ' selected="selected"' : '') . '>' . + $_text . '</option>' . $option_separator; + } + $_html_hours .= '</select>'; + } + // generate minute <select> + if ($display_minutes) { + $_html_minutes = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($minute_extra) { + $_extra .= ' ' . $minute_extra; + } + $_html_minutes = '<select name="' . $_name . '"'; + if ($minute_id !== null || $all_id !== null) { + $_html_minutes .= ' id="' . smarty_function_escape_special_chars( + $minute_id !== null ? + ($minute_id ? $minute_id : $_name) : + ($all_id ? ($all_id . $_name) : + $_name) + ) . '"'; + } + if ($minute_size) { + $_html_minutes .= ' size="' . $minute_size . '"'; + } + $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($minute_empty) || isset($all_empty)) { + $_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' . + $option_separator; + } + $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; + for ($i = 0; $i <= 59; $i += $minute_interval) { + $_val = sprintf('%02d', $i); + $_text = $minute_format === '%02d' ? $_val : sprintf($minute_format, $i); + $_value = $minute_value_format === '%02d' ? $_val : sprintf($minute_value_format, $i); + $_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') . + '>' . $_text . '</option>' . $option_separator; + } + $_html_minutes .= '</select>'; + } + // generate second <select> + if ($display_seconds) { + $_html_seconds = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($second_extra) { + $_extra .= ' ' . $second_extra; + } + $_html_seconds = '<select name="' . $_name . '"'; + if ($second_id !== null || $all_id !== null) { + $_html_seconds .= ' id="' . smarty_function_escape_special_chars( + $second_id !== null ? + ($second_id ? $second_id : $_name) : + ($all_id ? ($all_id . $_name) : + $_name) + ) . '"'; + } + if ($second_size) { + $_html_seconds .= ' size="' . $second_size . '"'; + } + $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($second_empty) || isset($all_empty)) { + $_html_seconds .= '<option value="">' . (isset($second_empty) ? $second_empty : $all_empty) . '</option>' . + $option_separator; + } + $selected = $_second !== null ? ($_second - $_second % $second_interval) : null; + for ($i = 0; $i <= 59; $i += $second_interval) { + $_val = sprintf('%02d', $i); + $_text = $second_format === '%02d' ? $_val : sprintf($second_format, $i); + $_value = $second_value_format === '%02d' ? $_val : sprintf($second_value_format, $i); + $_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') . + '>' . $_text . '</option>' . $option_separator; + } + $_html_seconds .= '</select>'; + } + // generate meridian <select> + if ($display_meridian && !$use_24_hours) { + $_html_meridian = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($meridian_extra) { + $_extra .= ' ' . $meridian_extra; + } + $_html_meridian = '<select name="' . $_name . '"'; + if ($meridian_id !== null || $all_id !== null) { + $_html_meridian .= ' id="' . smarty_function_escape_special_chars( + $meridian_id !== null ? + ($meridian_id ? $meridian_id : + $_name) : + ($all_id ? ($all_id . $_name) : + $_name) + ) . '"'; + } + if ($meridian_size) { + $_html_meridian .= ' size="' . $meridian_size . '"'; + } + $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; + if (isset($meridian_empty) || isset($all_empty)) { + $_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) . + '</option>' . $option_separator; + } + $_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') . + '>AM</option>' . $option_separator . '<option value="pm"' . + ($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator . + '</select>'; + } + $_html = ''; + foreach (array( + '_html_hours', + '_html_minutes', + '_html_seconds', + '_html_meridian' + ) as $k) { + if (isset($$k)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $$k; + } + } + return $_html; +} diff --git a/plugins/function.html_table.php b/plugins/function.html_table.php new file mode 100644 index 0000000000000000000000000000000000000000..ae61e83dc79d7f1691831cffd55c596fba13801e --- /dev/null +++ b/plugins/function.html_table.php @@ -0,0 +1,164 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {html_table} function plugin + * Type: function + * Name: html_table + * Date: Feb 17, 2003 + * Purpose: make an html table from an array of data + * Params: + * + * - loop - array to loop through + * - cols - number of columns, comma separated list of column names + * or array of column names + * - rows - number of rows + * - table_attr - table attributes + * - th_attr - table heading attributes (arrays are cycled) + * - tr_attr - table row attributes (arrays are cycled) + * - td_attr - table cell attributes (arrays are cycled) + * - trailpad - value to pad trailing cells with + * - caption - text for caption element + * - vdir - vertical direction (default: "down", means top-to-bottom) + * - hdir - horizontal direction (default: "right", means left-to-right) + * - inner - inner loop (default "cols": print $loop line by line, + * $loop will be printed column by column otherwise) + * + * Examples: + * + * {table loop=$data} + * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} + * {table loop=$data cols="first,second,third" tr_attr=$colors} + * + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Messju Mohr <messju at lammfellpuschen dot de> + * @author credit to boots <boots dot smarty at yahoo dot com> + * @version 1.1 + * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} + * (Smarty online manual) + * + * @param array $params parameters + * + * @return string + */ +function smarty_function_html_table($params) +{ + $table_attr = 'border="1"'; + $tr_attr = ''; + $th_attr = ''; + $td_attr = ''; + $cols = $cols_count = 3; + $rows = 3; + $trailpad = ' '; + $vdir = 'down'; + $hdir = 'right'; + $inner = 'cols'; + $caption = ''; + $loop = null; + if (!isset($params[ 'loop' ])) { + trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING); + return; + } + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'loop': + $$_key = (array)$_value; + break; + case 'cols': + if (is_array($_value) && !empty($_value)) { + $cols = $_value; + $cols_count = count($_value); + } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { + $cols = explode(',', $_value); + $cols_count = count($cols); + } elseif (!empty($_value)) { + $cols_count = (int)$_value; + } else { + $cols_count = $cols; + } + break; + case 'rows': + $$_key = (int)$_value; + break; + case 'table_attr': + case 'trailpad': + case 'hdir': + case 'vdir': + case 'inner': + case 'caption': + $$_key = (string)$_value; + break; + case 'tr_attr': + case 'td_attr': + case 'th_attr': + $$_key = $_value; + break; + } + } + $loop_count = count($loop); + if (empty($params[ 'rows' ])) { + /* no rows specified */ + $rows = ceil($loop_count / $cols_count); + } elseif (empty($params[ 'cols' ])) { + if (!empty($params[ 'rows' ])) { + /* no cols specified, but rows */ + $cols_count = ceil($loop_count / $rows); + } + } + $output = "<table $table_attr>\n"; + if (!empty($caption)) { + $output .= '<caption>' . $caption . "</caption>\n"; + } + if (is_array($cols)) { + $cols = ($hdir === 'right') ? $cols : array_reverse($cols); + $output .= "<thead><tr>\n"; + for ($r = 0; $r < $cols_count; $r++) { + $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; + $output .= $cols[ $r ]; + $output .= "</th>\n"; + } + $output .= "</tr></thead>\n"; + } + $output .= "<tbody>\n"; + for ($r = 0; $r < $rows; $r++) { + $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; + $rx = ($vdir === 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count; + for ($c = 0; $c < $cols_count; $c++) { + $x = ($hdir === 'right') ? $rx + $c : $rx + $cols_count - 1 - $c; + if ($inner !== 'cols') { + /* shuffle x to loop over rows*/ + $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; + } + if ($x < $loop_count) { + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[ $x ] . "</td>\n"; + } else { + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; + } + } + $output .= "</tr>\n"; + } + $output .= "</tbody>\n"; + $output .= "</table>\n"; + return $output; +} + +/** + * @param $name + * @param $var + * @param $no + * + * @return string + */ +function smarty_function_html_table_cycle($name, $var, $no) +{ + if (!is_array($var)) { + $ret = $var; + } else { + $ret = $var[ $no % count($var) ]; + } + return ($ret) ? ' ' . $ret : ''; +} diff --git a/plugins/function.mailto.php b/plugins/function.mailto.php new file mode 100644 index 0000000000000000000000000000000000000000..27351df8269827e1c70a0c01a98599a3d7b098f6 --- /dev/null +++ b/plugins/function.mailto.php @@ -0,0 +1,137 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {mailto} function plugin + * Type: function + * Name: mailto + * Date: May 21, 2002 + * Purpose: automate mailto address link creation, and optionally encode them. + * Params: + * + * - address - (required) - e-mail address + * - text - (optional) - text to display, default is address + * - encode - (optional) - can be one of: + * * none : no encoding (default) + * * javascript : encode with javascript + * * javascript_charcode : encode with javascript charcode + * * hex : encode with hexadecimal (no javascript) + * - cc - (optional) - address(es) to carbon copy + * - bcc - (optional) - address(es) to blind carbon copy + * - subject - (optional) - e-mail subject + * - newsgroups - (optional) - newsgroup(s) to post to + * - followupto - (optional) - address(es) to follow up to + * - extra - (optional) - extra tags for the href link + * + * Examples: + * + * {mailto address="me@domain.com"} + * {mailto address="me@domain.com" encode="javascript"} + * {mailto address="me@domain.com" encode="hex"} + * {mailto address="me@domain.com" subject="Hello to you!"} + * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} + * {mailto address="me@domain.com" extra='class="mailto"'} + * + * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} + * (Smarty online manual) + * @version 1.2 + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Jason Sweat (added cc, bcc and subject functionality) + * + * @param array $params parameters + * + * @return string + */ +function smarty_function_mailto($params) +{ + static $_allowed_encoding = + array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true); + $extra = ''; + if (empty($params[ 'address' ])) { + trigger_error("mailto: missing 'address' parameter", E_USER_WARNING); + return; + } else { + $address = $params[ 'address' ]; + } + $text = $address; + // netscape and mozilla do not decode %40 (@) in BCC field (bug?) + // so, don't encode it. + $search = array('%40', '%2C'); + $replace = array('@', ','); + $mail_parms = array(); + foreach ($params as $var => $value) { + switch ($var) { + case 'cc': + case 'bcc': + case 'followupto': + if (!empty($value)) { + $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value)); + } + break; + case 'subject': + case 'newsgroups': + $mail_parms[] = $var . '=' . rawurlencode($value); + break; + case 'extra': + case 'text': + $$var = $value; + // no break + default: + } + } + if ($mail_parms) { + $address .= '?' . join('&', $mail_parms); + } + $encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ]; + if (!isset($_allowed_encoding[ $encode ])) { + trigger_error( + "mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", + E_USER_WARNING + ); + return; + } + // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! + if ($encode === 'javascript') { + $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; + $js_encode = ''; + for ($x = 0, $_length = strlen($string); $x < $_length; $x++) { + $js_encode .= '%' . bin2hex($string[ $x ]); + } + return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; + } elseif ($encode === 'javascript_charcode') { + $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; + for ($x = 0, $y = strlen($string); $x < $y; $x++) { + $ord[] = ord($string[ $x ]); + } + $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" . "{document.write(String.fromCharCode(" . + implode(',', $ord) . "))" . "}\n" . "</script>\n"; + return $_ret; + } elseif ($encode === 'hex') { + preg_match('!^(.*)(\?.*)$!', $address, $match); + if (!empty($match[ 2 ])) { + trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING); + return; + } + $address_encode = ''; + for ($x = 0, $_length = strlen($address); $x < $_length; $x++) { + if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) { + $address_encode .= '%' . bin2hex($address[ $x ]); + } else { + $address_encode .= $address[ $x ]; + } + } + $text_encode = ''; + for ($x = 0, $_length = strlen($text); $x < $_length; $x++) { + $text_encode .= '&#x' . bin2hex($text[ $x ]) . ';'; + } + $mailto = "mailto:"; + return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>'; + } else { + // no encoding + return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; + } +} diff --git a/plugins/function.math.php b/plugins/function.math.php new file mode 100644 index 0000000000000000000000000000000000000000..7348d96494c9dbdbc86eb05ffc3cb4d51b2c122d --- /dev/null +++ b/plugins/function.math.php @@ -0,0 +1,112 @@ +<?php +/** + * Smarty plugin + * This plugin is only for Smarty2 BC + * + * @package Smarty + * @subpackage PluginsFunction + */ +/** + * Smarty {math} function plugin + * Type: function + * Name: math + * Purpose: handle math computations in template + * + * @link http://www.smarty.net/manual/en/language.function.math.php {math} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * + * @return string|null + */ +function smarty_function_math($params, $template) +{ + static $_allowed_funcs = + array( + 'int' => true, + 'abs' => true, + 'ceil' => true, + 'cos' => true, + 'exp' => true, + 'floor' => true, + 'log' => true, + 'log10' => true, + 'max' => true, + 'min' => true, + 'pi' => true, + 'pow' => true, + 'rand' => true, + 'round' => true, + 'sin' => true, + 'sqrt' => true, + 'srand' => true, + 'tan' => true + ); + // be sure equation parameter is present + if (empty($params[ 'equation' ])) { + trigger_error("math: missing equation parameter", E_USER_WARNING); + return; + } + $equation = $params[ 'equation' ]; + // make sure parenthesis are balanced + if (substr_count($equation, '(') !== substr_count($equation, ')')) { + trigger_error("math: unbalanced parenthesis", E_USER_WARNING); + return; + } + // disallow backticks + if (strpos($equation, '`') !== false) { + trigger_error("math: backtick character not allowed in equation", E_USER_WARNING); + return; + } + // also disallow dollar signs + if (strpos($equation, '$') !== false) { + trigger_error("math: dollar signs not allowed in equation", E_USER_WARNING); + return; + } + foreach ($params as $key => $val) { + if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') { + // make sure value is not empty + if (strlen($val) === 0) { + trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING); + return; + } + if (!is_numeric($val)) { + trigger_error("math: parameter '{$key}' is not numeric", E_USER_WARNING); + return; + } + } + } + // match all vars in equation, make sure all are passed + preg_match_all('!(?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $equation, $match); + foreach ($match[ 1 ] as $curr_var) { + if ($curr_var && !isset($params[ $curr_var ]) && !isset($_allowed_funcs[ $curr_var ])) { + trigger_error( + "math: function call '{$curr_var}' not allowed, or missing parameter '{$curr_var}'", + E_USER_WARNING + ); + return; + } + } + foreach ($params as $key => $val) { + if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') { + $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); + } + } + $smarty_math_result = null; + eval("\$smarty_math_result = " . $equation . ";"); + if (empty($params[ 'format' ])) { + if (empty($params[ 'assign' ])) { + return $smarty_math_result; + } else { + $template->assign($params[ 'assign' ], $smarty_math_result); + } + } else { + if (empty($params[ 'assign' ])) { + printf($params[ 'format' ], $smarty_math_result); + } else { + $template->assign($params[ 'assign' ], sprintf($params[ 'format' ], $smarty_math_result)); + } + } +} diff --git a/plugins/modifier.capitalize.php b/plugins/modifier.capitalize.php new file mode 100644 index 0000000000000000000000000000000000000000..c5fc400a6f5dc5582ecabe0d6abe019394e85ab8 --- /dev/null +++ b/plugins/modifier.capitalize.php @@ -0,0 +1,145 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty capitalize modifier plugin + * Type: modifier + * Name: capitalize + * Purpose: capitalize words in the string + * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} + * + * @param string $string string to capitalize + * @param boolean $uc_digits also capitalize "x123" to "X123" + * @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa" + * + * @return string capitalized string + * @author Monte Ohrt <monte at ohrt dot com> + * @author Rodney Rehm + */ +function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) +{ + if (Smarty::$_MBSTRING) { + if ($lc_rest) { + // uppercase (including hyphenated words) + $upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET); + } else { + // uppercase word breaks + $upper_string = preg_replace_callback( + "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, + 'smarty_mod_cap_mbconvert_cb', + $string + ); + } + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all( + "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, + $string, + $matches, + PREG_OFFSET_CAPTURE + ) + ) { + foreach ($matches[ 1 ] as $match) { + $upper_string = + substr_replace( + $upper_string, + mb_strtolower($match[ 0 ], Smarty::$_CHARSET), + $match[ 1 ], + strlen($match[ 0 ]) + ); + } + } + } + $upper_string = + preg_replace_callback( + "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, + 'smarty_mod_cap_mbconvert2_cb', + $upper_string + ); + return $upper_string; + } + // lowercase first + if ($lc_rest) { + $string = strtolower($string); + } + // uppercase (including hyphenated words) + $upper_string = + preg_replace_callback( + "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, + 'smarty_mod_cap_ucfirst_cb', + $string + ); + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all( + "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, + $string, + $matches, + PREG_OFFSET_CAPTURE + ) + ) { + foreach ($matches[ 1 ] as $match) { + $upper_string = + substr_replace($upper_string, strtolower($match[ 0 ]), $match[ 1 ], strlen($match[ 0 ])); + } + } + } + $upper_string = preg_replace_callback( + "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, + 'smarty_mod_cap_ucfirst2_cb', + $upper_string + ); + return $upper_string; +} + +/** + * + * Bug: create_function() use exhausts memory when used in long loops + * Fix: use declared functions for callbacks instead of using create_function() + * Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3 + * + * @author Kyle Renfrow + */ +/** + * @param $matches + * + * @return string + */ +function smarty_mod_cap_mbconvert_cb($matches) +{ + return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET); +} + +/** + * @param $matches + * + * @return string + */ +function smarty_mod_cap_mbconvert2_cb($matches) +{ + return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET); +} + +/** + * @param $matches + * + * @return string + */ +function smarty_mod_cap_ucfirst_cb($matches) +{ + return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ])); +} + +/** + * @param $matches + * + * @return string + */ +function smarty_mod_cap_ucfirst2_cb($matches) +{ + return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ])); +} diff --git a/plugins/modifier.date_format.php b/plugins/modifier.date_format.php new file mode 100644 index 0000000000000000000000000000000000000000..c8e88c5c91b684538dd052d87bd2636628266c46 --- /dev/null +++ b/plugins/modifier.date_format.php @@ -0,0 +1,85 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty date_format modifier plugin + * Type: modifier + * Name: date_format + * Purpose: format datestamps via strftime + * Input: + * - string: input date string + * - format: strftime format for output + * - default_date: default date if $string is empty + * + * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input date string + * @param string $format strftime format for output + * @param string $default_date default date if $string is empty + * @param string $formatter either 'strftime' or 'auto' + * + * @return string |void + * @uses smarty_make_timestamp() + */ +function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto') +{ + if ($format === null) { + $format = Smarty::$_DATE_FORMAT; + } + /** + * require_once the {@link shared.make_timestamp.php} plugin + */ + static $is_loaded = false; + if (!$is_loaded) { + if (!is_callable('smarty_make_timestamp')) { + include_once SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'; + } + $is_loaded = true; + } + if (!empty($string) && $string !== '0000-00-00' && $string !== '0000-00-00 00:00:00') { + $timestamp = smarty_make_timestamp($string); + } elseif (!empty($default_date)) { + $timestamp = smarty_make_timestamp($default_date); + } else { + return; + } + if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) { + if (Smarty::$_IS_WINDOWS) { + $_win_from = array( + '%D', + '%h', + '%n', + '%r', + '%R', + '%t', + '%T' + ); + $_win_to = array( + '%m/%d/%y', + '%b', + "\n", + '%I:%M:%S %p', + '%H:%M', + "\t", + '%H:%M:%S' + ); + if (strpos($format, '%e') !== false) { + $_win_from[] = '%e'; + $_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); + } + if (strpos($format, '%l') !== false) { + $_win_from[] = '%l'; + $_win_to[] = sprintf('%\' 2d', date('h', $timestamp)); + } + $format = str_replace($_win_from, $_win_to, $format); + } + return strftime($format, $timestamp); + } else { + return date($format, $timestamp); + } +} diff --git a/plugins/modifier.debug_print_var.php b/plugins/modifier.debug_print_var.php new file mode 100644 index 0000000000000000000000000000000000000000..78397d0177de950afeddfd7dcea17ec9fd1ce94e --- /dev/null +++ b/plugins/modifier.debug_print_var.php @@ -0,0 +1,103 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage Debug + */ +/** + * Smarty debug_print_var modifier plugin + * Type: modifier + * Name: debug_print_var + * Purpose: formats variable contents for display in the console + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param array|object $var variable to be formatted + * @param int $max maximum recursion depth if $var is an array or object + * @param int $length maximum string length if $var is a string + * @param int $depth actual recursion depth + * @param array $objects processed objects in actual depth to prevent recursive object processing + * + * @return string + */ +function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array()) +{ + $_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t'); + switch (gettype($var)) { + case 'array': + $results = '<b>Array (' . count($var) . ')</b>'; + if ($depth === $max) { + break; + } + foreach ($var as $curr_key => $curr_val) { + $results .= '<br>' . str_repeat(' ', $depth * 2) . '<b>' . strtr($curr_key, $_replace) . + '</b> => ' . + smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects); + $depth--; + } + break; + case 'object': + $object_vars = get_object_vars($var); + $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; + if (in_array($var, $objects)) { + $results .= ' called recursive'; + break; + } + if ($depth === $max) { + break; + } + $objects[] = $var; + foreach ($object_vars as $curr_key => $curr_val) { + $results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) . + '</b> = ' . smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects); + $depth--; + } + break; + case 'boolean': + case 'NULL': + case 'resource': + if (true === $var) { + $results = 'true'; + } elseif (false === $var) { + $results = 'false'; + } elseif (null === $var) { + $results = 'null'; + } else { + $results = htmlspecialchars((string)$var); + } + $results = '<i>' . $results . '</i>'; + break; + case 'integer': + case 'float': + $results = htmlspecialchars((string)$var); + break; + case 'string': + $results = strtr($var, $_replace); + if (Smarty::$_MBSTRING) { + if (mb_strlen($var, Smarty::$_CHARSET) > $length) { + $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...'; + } + } else { + if (isset($var[ $length ])) { + $results = substr($var, 0, $length - 3) . '...'; + } + } + $results = htmlspecialchars('"' . $results . '"', ENT_QUOTES, Smarty::$_CHARSET); + break; + case 'unknown type': + default: + $results = strtr((string)$var, $_replace); + if (Smarty::$_MBSTRING) { + if (mb_strlen($results, Smarty::$_CHARSET) > $length) { + $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...'; + } + } else { + if (strlen($results) > $length) { + $results = substr($results, 0, $length - 3) . '...'; + } + } + $results = htmlspecialchars($results, ENT_QUOTES, Smarty::$_CHARSET); + } + return $results; +} diff --git a/plugins/modifier.escape.php b/plugins/modifier.escape.php new file mode 100644 index 0000000000000000000000000000000000000000..150901c7c7d8bcc4e1c4f4f7a4b176be7e87979d --- /dev/null +++ b/plugins/modifier.escape.php @@ -0,0 +1,255 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty escape modifier plugin + * Type: modifier + * Name: escape + * Purpose: escape string for output + * + * @link http://www.smarty.net/docs/en/language.modifier.escape + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param string $esc_type escape type + * @param string $char_set character set, used for htmlspecialchars() or htmlentities() + * @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities() + * + * @return string escaped input string + */ +function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) +{ + static $_double_encode = null; + static $is_loaded_1 = false; + static $is_loaded_2 = false; + if ($_double_encode === null) { + $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); + } + if (!$char_set) { + $char_set = Smarty::$_CHARSET; + } + switch ($esc_type) { + case 'html': + if ($_double_encode) { + // php >=5.3.2 - go native + return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + // php <5.2.3 - only handle double encoding + return htmlspecialchars($string, ENT_QUOTES, $char_set); + } else { + // php <5.2.3 - prevent double encoding + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + $string = str_replace( + array( + '%%%SMARTY_START%%%', + '%%%SMARTY_END%%%' + ), + array( + '&', + ';' + ), + $string + ); + return $string; + } + } + // no break + case 'htmlall': + if (Smarty::$_MBSTRING) { + // mb_convert_encoding ignores htmlspecialchars() + if ($_double_encode) { + // php >=5.3.2 - go native + $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + // php <5.2.3 - only handle double encoding + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + } else { + // php <5.2.3 - prevent double encoding + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + $string = + str_replace( + array( + '%%%SMARTY_START%%%', + '%%%SMARTY_END%%%' + ), + array( + '&', + ';' + ), + $string + ); + return $string; + } + } + // htmlentities() won't convert everything, so use mb_convert_encoding + return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); + } + // no MBString fallback + if ($_double_encode) { + return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + return htmlentities($string, ENT_QUOTES, $char_set); + } else { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlentities($string, ENT_QUOTES, $char_set); + $string = str_replace( + array( + '%%%SMARTY_START%%%', + '%%%SMARTY_END%%%' + ), + array( + '&', + ';' + ), + $string + ); + return $string; + } + } + // no break + case 'url': + return rawurlencode($string); + case 'urlpathinfo': + return str_replace('%2F', '/', rawurlencode($string)); + case 'quotes': + // escape unescaped single quotes + return preg_replace("%(?<!\\\\)'%", "\\'", $string); + case 'hex': + // escape every byte into hex + // Note that the UTF-8 encoded character ä will be represented as %c3%a4 + $return = ''; + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { + $return .= '%' . bin2hex($string[ $x ]); + } + return $return; + case 'hexentity': + $return = ''; + if (Smarty::$_MBSTRING) { + if (!$is_loaded_1) { + if (!is_callable('smarty_mb_to_unicode')) { + include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'; + } + $is_loaded_1 = true; + } + $return = ''; + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + $return .= '&#x' . strtoupper(dechex($unicode)) . ';'; + } + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { + $return .= '&#x' . bin2hex($string[ $x ]) . ';'; + } + return $return; + case 'decentity': + $return = ''; + if (Smarty::$_MBSTRING) { + if (!$is_loaded_1) { + if (!is_callable('smarty_mb_to_unicode')) { + include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'; + } + $is_loaded_1 = true; + } + $return = ''; + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + $return .= '&#' . $unicode . ';'; + } + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { + $return .= '&#' . ord($string[ $x ]) . ';'; + } + return $return; + case 'javascript': + // escape quotes and backslashes, newlines, etc. + return strtr( + $string, + array( + '\\' => '\\\\', + "'" => "\\'", + '"' => '\\"', + "\r" => '\\r', + "\n" => '\\n', + '</' => '<\/' + ) + ); + case 'mail': + if (Smarty::$_MBSTRING) { + if (!$is_loaded_2) { + if (!is_callable('smarty_mb_str_replace')) { + include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'; + } + $is_loaded_2 = true; + } + return smarty_mb_str_replace( + array( + '@', + '.' + ), + array( + ' [AT] ', + ' [DOT] ' + ), + $string + ); + } + // no MBString fallback + return str_replace( + array( + '@', + '.' + ), + array( + ' [AT] ', + ' [DOT] ' + ), + $string + ); + case 'nonstd': + // escape non-standard chars, such as ms document quotes + $return = ''; + if (Smarty::$_MBSTRING) { + if (!$is_loaded_1) { + if (!is_callable('smarty_mb_to_unicode')) { + include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'; + } + $is_loaded_1 = true; + } + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + if ($unicode >= 126) { + $return .= '&#' . $unicode . ';'; + } else { + $return .= chr($unicode); + } + } + return $return; + } + $_length = strlen($string); + for ($_i = 0; $_i < $_length; $_i++) { + $_ord = ord(substr($string, $_i, 1)); + // non-standard char, escape it + if ($_ord >= 126) { + $return .= '&#' . $_ord . ';'; + } else { + $return .= substr($string, $_i, 1); + } + } + return $return; + default: + return $string; + } +} diff --git a/plugins/modifier.mb_wordwrap.php b/plugins/modifier.mb_wordwrap.php new file mode 100644 index 0000000000000000000000000000000000000000..1cd625b644c77b1d452b36b89a1d313b6a5a89d3 --- /dev/null +++ b/plugins/modifier.mb_wordwrap.php @@ -0,0 +1,71 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty wordwrap modifier plugin + * Type: modifier + * Name: mb_wordwrap + * Purpose: Wrap a string to a given number of characters + * + * @link http://php.net/manual/en/function.wordwrap.php for similarity + * + * @param string $str the string to wrap + * @param int $width the width of the output + * @param string $break the character used to break the line + * @param boolean $cut ignored parameter, just for the sake of + * + * @return string wrapped string + * @author Rodney Rehm + */ +function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) +{ + // break words into tokens using white space as a delimiter + $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + $length = 0; + $t = ''; + $_previous = false; + $_space = false; + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, Smarty::$_CHARSET); + $_tokens = array($_token); + if ($token_length > $width) { + if ($cut) { + $_tokens = preg_split( + '!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, + $_token, + -1, + PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE + ); + } + } + foreach ($_tokens as $token) { + $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token); + $token_length = mb_strlen($token, Smarty::$_CHARSET); + $length += $token_length; + if ($length > $width) { + // remove space before inserted break + if ($_previous) { + $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); + } + if (!$_space) { + // add the break before the token + if (!empty($t)) { + $t .= $break; + } + $length = $token_length; + } + } elseif ($token === "\n") { + // hard break must reset counters + $length = 0; + } + $_previous = $_space; + // add the token + $t .= $token; + } + } + return $t; +} diff --git a/plugins/modifier.regex_replace.php b/plugins/modifier.regex_replace.php new file mode 100644 index 0000000000000000000000000000000000000000..7eb5506954f04743a3d99d0415baf9158f4ce81b --- /dev/null +++ b/plugins/modifier.regex_replace.php @@ -0,0 +1,55 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty regex_replace modifier plugin + * Type: modifier + * Name: regex_replace + * Purpose: regular expression search/replace + * + * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php + * regex_replace (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param string|array $search regular expression(s) to search for + * @param string|array $replace string(s) that should be replaced + * @param int $limit the maximum number of replacements + * + * @return string + */ +function smarty_modifier_regex_replace($string, $search, $replace, $limit = -1) +{ + if (is_array($search)) { + foreach ($search as $idx => $s) { + $search[ $idx ] = _smarty_regex_replace_check($s); + } + } else { + $search = _smarty_regex_replace_check($search); + } + return preg_replace($search, $replace, $string, $limit); +} + +/** + * @param string $search string(s) that should be replaced + * + * @return string + * @ignore + */ +function _smarty_regex_replace_check($search) +{ + // null-byte injection detection + // anything behind the first null-byte is ignored + if (($pos = strpos($search, "\0")) !== false) { + $search = substr($search, 0, $pos); + } + // remove eval-modifier from $search + if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[ 1 ], 'e') !== false)) { + $search = substr($search, 0, -strlen($match[ 1 ])) . preg_replace('![e\s]+!', '', $match[ 1 ]); + } + return $search; +} diff --git a/plugins/modifier.replace.php b/plugins/modifier.replace.php new file mode 100644 index 0000000000000000000000000000000000000000..a98f5a4a6f7f1f45cfc5be6790640bb0af811d9c --- /dev/null +++ b/plugins/modifier.replace.php @@ -0,0 +1,37 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty replace modifier plugin + * Type: modifier + * Name: replace + * Purpose: simple search/replace + * + * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews + * + * @param string $string input string + * @param string $search text to search for + * @param string $replace replacement text + * + * @return string + */ +function smarty_modifier_replace($string, $search, $replace) +{ + static $is_loaded = false; + if (Smarty::$_MBSTRING) { + if (!$is_loaded) { + if (!is_callable('smarty_mb_str_replace')) { + include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'; + } + $is_loaded = true; + } + return smarty_mb_str_replace($search, $replace, $string); + } + return str_replace($search, $replace, $string); +} diff --git a/plugins/modifier.spacify.php b/plugins/modifier.spacify.php new file mode 100644 index 0000000000000000000000000000000000000000..98efd4b300f544518c1b5815935012d5c19d0cb5 --- /dev/null +++ b/plugins/modifier.spacify.php @@ -0,0 +1,26 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty spacify modifier plugin + * Type: modifier + * Name: spacify + * Purpose: add spaces between characters in a string + * + * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param string $spacify_char string to insert between characters. + * + * @return string + */ +function smarty_modifier_spacify($string, $spacify_char = ' ') +{ + // well… what about charsets besides latin and UTF-8? + return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY)); +} diff --git a/plugins/modifier.truncate.php b/plugins/modifier.truncate.php new file mode 100644 index 0000000000000000000000000000000000000000..bb881bf6e5ac4f75a4bee978a6d3fec183dc9273 --- /dev/null +++ b/plugins/modifier.truncate.php @@ -0,0 +1,62 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty truncate modifier plugin + * Type: modifier + * Name: truncate + * Purpose: Truncate a string to a certain length if necessary, + * optionally splitting in the middle of a word, and + * appending the $etc string or inserting $etc into the middle. + * + * @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string input string + * @param integer $length length of truncated text + * @param string $etc end string + * @param boolean $break_words truncate at word boundary + * @param boolean $middle truncate in the middle of text + * + * @return string truncated string + */ +function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) +{ + if ($length === 0) { + return ''; + } + if (Smarty::$_MBSTRING) { + if (mb_strlen($string, Smarty::$_CHARSET) > $length) { + $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET)); + if (!$break_words && !$middle) { + $string = preg_replace( + '/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, + '', + mb_substr($string, 0, $length + 1, Smarty::$_CHARSET) + ); + } + if (!$middle) { + return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc; + } + return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . + mb_substr($string, -$length / 2, $length, Smarty::$_CHARSET); + } + return $string; + } + // no MBString fallback + if (isset($string[ $length ])) { + $length -= min($length, strlen($etc)); + if (!$break_words && !$middle) { + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); + } + if (!$middle) { + return substr($string, 0, $length) . $etc; + } + return substr($string, 0, $length / 2) . $etc . substr($string, -$length / 2); + } + return $string; +} diff --git a/plugins/modifiercompiler.cat.php b/plugins/modifiercompiler.cat.php new file mode 100644 index 0000000000000000000000000000000000000000..21d0e662422fd1b0c85a2ca1adfcac6e23b9cf98 --- /dev/null +++ b/plugins/modifiercompiler.cat.php @@ -0,0 +1,28 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty cat modifier plugin + * Type: modifier + * Name: cat + * Date: Feb 24, 2003 + * Purpose: catenate a value to a variable + * Input: string to catenate + * Example: {$var|cat:"foo"} + * + * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat + * (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_cat($params) +{ + return '(' . implode(').(', $params) . ')'; +} diff --git a/plugins/modifiercompiler.count_characters.php b/plugins/modifiercompiler.count_characters.php new file mode 100644 index 0000000000000000000000000000000000000000..6c44278afab9f25aeabc6e8556cb9be41456b2a5 --- /dev/null +++ b/plugins/modifiercompiler.count_characters.php @@ -0,0 +1,32 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty count_characters modifier plugin + * Type: modifier + * Name: count_characters + * Purpose: count the number of characters in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online + * manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_characters($params) +{ + if (!isset($params[ 1 ]) || $params[ 1 ] !== 'true') { + return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)'; + } + if (Smarty::$_MBSTRING) { + return 'mb_strlen(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strlen(' . $params[ 0 ] . ')'; +} diff --git a/plugins/modifiercompiler.count_paragraphs.php b/plugins/modifiercompiler.count_paragraphs.php new file mode 100644 index 0000000000000000000000000000000000000000..e214a56f0d544ca6020c531c3ac8a673f25894b2 --- /dev/null +++ b/plugins/modifiercompiler.count_paragraphs.php @@ -0,0 +1,26 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty count_paragraphs modifier plugin + * Type: modifier + * Name: count_paragraphs + * Purpose: count the number of paragraphs in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php + * count_paragraphs (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_paragraphs($params) +{ + // count \r or \n characters + return '(preg_match_all(\'#[\r\n]+#\', ' . $params[ 0 ] . ', $tmp)+1)'; +} diff --git a/plugins/modifiercompiler.count_sentences.php b/plugins/modifiercompiler.count_sentences.php new file mode 100644 index 0000000000000000000000000000000000000000..027745635d4c91668dc75159b5a7ebc594b7bd78 --- /dev/null +++ b/plugins/modifiercompiler.count_sentences.php @@ -0,0 +1,26 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty count_sentences modifier plugin + * Type: modifier + * Name: count_sentences + * Purpose: count the number of sentences in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php + * count_sentences (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_sentences($params) +{ + // find periods, question marks, exclamation marks with a word before but not after. + return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[ 0 ] . ', $tmp)'; +} diff --git a/plugins/modifiercompiler.count_words.php b/plugins/modifiercompiler.count_words.php new file mode 100644 index 0000000000000000000000000000000000000000..6d889da5cb11c1efcb38326999c5edbbdc3f9d2e --- /dev/null +++ b/plugins/modifiercompiler.count_words.php @@ -0,0 +1,31 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty count_words modifier plugin + * Type: modifier + * Name: count_words + * Purpose: count the number of words in a text + * + * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_count_words($params) +{ + if (Smarty::$_MBSTRING) { + // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)'; + // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592 + return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . + $params[ 0 ] . ', $tmp)'; + } + // no MBString fallback + return 'str_word_count(' . $params[ 0 ] . ')'; +} diff --git a/plugins/modifiercompiler.default.php b/plugins/modifiercompiler.default.php new file mode 100644 index 0000000000000000000000000000000000000000..ae886c4b2211df208d5e1f143dfc634e23e932b4 --- /dev/null +++ b/plugins/modifiercompiler.default.php @@ -0,0 +1,32 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty default modifier plugin + * Type: modifier + * Name: default + * Purpose: designate default value for empty variables + * + * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_default($params) +{ + $output = $params[ 0 ]; + if (!isset($params[ 1 ])) { + $params[ 1 ] = "''"; + } + array_shift($params); + foreach ($params as $param) { + $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)'; + } + return $output; +} diff --git a/plugins/modifiercompiler.escape.php b/plugins/modifiercompiler.escape.php new file mode 100644 index 0000000000000000000000000000000000000000..e0763adcebc3419d94ce1646ab6b3b2203180a11 --- /dev/null +++ b/plugins/modifiercompiler.escape.php @@ -0,0 +1,112 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty escape modifier plugin + * Type: modifier + * Name: escape + * Purpose: escape string for output + * + * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual) + * @author Rodney Rehm + * + * @param array $params parameters + * @param Smarty_Internal_TemplateCompilerBase $compiler + * + * @return string with compiled code + * @throws \SmartyException + */ +function smarty_modifiercompiler_escape($params, Smarty_Internal_TemplateCompilerBase $compiler) +{ + static $_double_encode = null; + static $is_loaded = false; + $compiler->template->_checkPlugins( + array( + array( + 'function' => 'smarty_literal_compiler_param', + 'file' => SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php' + ) + ) + ); + if ($_double_encode === null) { + $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); + } + try { + $esc_type = smarty_literal_compiler_param($params, 1, 'html'); + $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET); + $double_encode = smarty_literal_compiler_param($params, 3, true); + if (!$char_set) { + $char_set = Smarty::$_CHARSET; + } + switch ($esc_type) { + case 'html': + if ($_double_encode) { + return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' . + var_export($double_encode, true) . ')'; + } elseif ($double_encode) { + return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + // no break + case 'htmlall': + if (Smarty::$_MBSTRING) { + if ($_double_encode) { + // php >=5.2.3 - go native + return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . + var_export($char_set, true) . ', ' . var_export($double_encode, true) . + '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')'; + } elseif ($double_encode) { + // php <5.2.3 - only handle double encoding + return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . + var_export($char_set, true) . '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + } + // no MBString fallback + if ($_double_encode) { + // php >=5.2.3 - go native + return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' . + var_export($double_encode, true) . ')'; + } elseif ($double_encode) { + // php <5.2.3 - only handle double encoding + return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + // no break + case 'url': + return 'rawurlencode(' . $params[ 0 ] . ')'; + case 'urlpathinfo': + return 'str_replace("%2F", "/", rawurlencode(' . $params[ 0 ] . '))'; + case 'quotes': + // escape unescaped single quotes + return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[ 0 ] . ')'; + case 'javascript': + // escape quotes and backslashes, newlines, etc. + return 'strtr(' . + $params[ 0 ] . + ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))'; + } + } catch (SmartyException $e) { + // pass through to regular plugin fallback + } + // could not optimize |escape call, so fallback to regular plugin + if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { + $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] = + SMARTY_PLUGINS_DIR . 'modifier.escape.php'; + $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] = + 'smarty_modifier_escape'; + } else { + $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] = + SMARTY_PLUGINS_DIR . 'modifier.escape.php'; + $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] = + 'smarty_modifier_escape'; + } + return 'smarty_modifier_escape(' . join(', ', $params) . ')'; +} diff --git a/plugins/modifiercompiler.from_charset.php b/plugins/modifiercompiler.from_charset.php new file mode 100644 index 0000000000000000000000000000000000000000..acce7784b937efbe727e5ad67f721cd143963052 --- /dev/null +++ b/plugins/modifiercompiler.from_charset.php @@ -0,0 +1,30 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty from_charset modifier plugin + * Type: modifier + * Name: from_charset + * Purpose: convert character encoding from $charset to internal encoding + * + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_from_charset($params) +{ + if (!Smarty::$_MBSTRING) { + // FIXME: (rodneyrehm) shouldn't this throw an error? + return $params[ 0 ]; + } + if (!isset($params[ 1 ])) { + $params[ 1 ] = '"ISO-8859-1"'; + } + return 'mb_convert_encoding(' . $params[ 0 ] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[ 1 ] . ')'; +} diff --git a/plugins/modifiercompiler.indent.php b/plugins/modifiercompiler.indent.php new file mode 100644 index 0000000000000000000000000000000000000000..2088ad6a83b0252fc3678ed178b9691c3efe3f59 --- /dev/null +++ b/plugins/modifiercompiler.indent.php @@ -0,0 +1,30 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty indent modifier plugin + * Type: modifier + * Name: indent + * Purpose: indent lines of text + * + * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_indent($params) +{ + if (!isset($params[ 1 ])) { + $params[ 1 ] = 4; + } + if (!isset($params[ 2 ])) { + $params[ 2 ] = "' '"; + } + return 'preg_replace(\'!^!m\',str_repeat(' . $params[ 2 ] . ',' . $params[ 1 ] . '),' . $params[ 0 ] . ')'; +} diff --git a/plugins/modifiercompiler.lower.php b/plugins/modifiercompiler.lower.php new file mode 100644 index 0000000000000000000000000000000000000000..0d899a002844d0e21314becd149440d5df1c8fb0 --- /dev/null +++ b/plugins/modifiercompiler.lower.php @@ -0,0 +1,29 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty lower modifier plugin + * Type: modifier + * Name: lower + * Purpose: convert string to lowercase + * + * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_lower($params) +{ + if (Smarty::$_MBSTRING) { + return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strtolower(' . $params[ 0 ] . ')'; +} diff --git a/plugins/modifiercompiler.noprint.php b/plugins/modifiercompiler.noprint.php new file mode 100644 index 0000000000000000000000000000000000000000..1275190e073a8eeec79b3e6a27585fa884380521 --- /dev/null +++ b/plugins/modifiercompiler.noprint.php @@ -0,0 +1,20 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty noprint modifier plugin + * Type: modifier + * Name: noprint + * Purpose: return an empty string + * + * @author Uwe Tews + * @return string with compiled code + */ +function smarty_modifiercompiler_noprint() +{ + return "''"; +} diff --git a/plugins/modifiercompiler.string_format.php b/plugins/modifiercompiler.string_format.php new file mode 100644 index 0000000000000000000000000000000000000000..6630943117c9ddfbdf7c2dd91ad0d1c15bae6194 --- /dev/null +++ b/plugins/modifiercompiler.string_format.php @@ -0,0 +1,24 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty string_format modifier plugin + * Type: modifier + * Name: string_format + * Purpose: format strings via sprintf + * + * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_string_format($params) +{ + return 'sprintf(' . $params[ 1 ] . ',' . $params[ 0 ] . ')'; +} diff --git a/plugins/modifiercompiler.strip.php b/plugins/modifiercompiler.strip.php new file mode 100644 index 0000000000000000000000000000000000000000..04ea332c5286bc4aa426e09014a0782f7b667816 --- /dev/null +++ b/plugins/modifiercompiler.strip.php @@ -0,0 +1,30 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty strip modifier plugin + * Type: modifier + * Name: strip + * Purpose: Replace all repeated spaces, newlines, tabs + * with a single space or supplied replacement string. + * Example: {$var|strip} {$var|strip:" "} + * Date: September 25th, 2002 + * + * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_strip($params) +{ + if (!isset($params[ 1 ])) { + $params[ 1 ] = "' '"; + } + return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})"; +} diff --git a/plugins/modifiercompiler.strip_tags.php b/plugins/modifiercompiler.strip_tags.php new file mode 100644 index 0000000000000000000000000000000000000000..1bca1a28e860edae2b221e0cdee4e78ce43aef1d --- /dev/null +++ b/plugins/modifiercompiler.strip_tags.php @@ -0,0 +1,28 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty strip_tags modifier plugin + * Type: modifier + * Name: strip_tags + * Purpose: strip html tags from text + * + * @link http://www.smarty.net/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_strip_tags($params) +{ + if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') { + return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; + } else { + return 'strip_tags(' . $params[ 0 ] . ')'; + } +} diff --git a/plugins/modifiercompiler.to_charset.php b/plugins/modifiercompiler.to_charset.php new file mode 100644 index 0000000000000000000000000000000000000000..d652eab1b3fa977e6438428c89681083927af66b --- /dev/null +++ b/plugins/modifiercompiler.to_charset.php @@ -0,0 +1,30 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty to_charset modifier plugin + * Type: modifier + * Name: to_charset + * Purpose: convert character encoding from internal encoding to $charset + * + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_to_charset($params) +{ + if (!Smarty::$_MBSTRING) { + // FIXME: (rodneyrehm) shouldn't this throw an error? + return $params[ 0 ]; + } + if (!isset($params[ 1 ])) { + $params[ 1 ] = '"ISO-8859-1"'; + } + return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 1 ] . ', "' . addslashes(Smarty::$_CHARSET) . '")'; +} diff --git a/plugins/modifiercompiler.unescape.php b/plugins/modifiercompiler.unescape.php new file mode 100644 index 0000000000000000000000000000000000000000..05beb81f5c9999dc7a061782794060540fbc636e --- /dev/null +++ b/plugins/modifiercompiler.unescape.php @@ -0,0 +1,44 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty unescape modifier plugin + * Type: modifier + * Name: unescape + * Purpose: unescape html entities + * + * @author Rodney Rehm + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_unescape($params) +{ + if (!isset($params[ 1 ])) { + $params[ 1 ] = 'html'; + } + if (!isset($params[ 2 ])) { + $params[ 2 ] = '\'' . addslashes(Smarty::$_CHARSET) . '\''; + } else { + $params[ 2 ] = "'{$params[ 2 ]}'"; + } + switch (trim($params[ 1 ], '"\'')) { + case 'entity': + case 'htmlall': + if (Smarty::$_MBSTRING) { + return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 2 ] . ', \'HTML-ENTITIES\')'; + } + return 'html_entity_decode(' . $params[ 0 ] . ', ENT_NOQUOTES, ' . $params[ 2 ] . ')'; + case 'html': + return 'htmlspecialchars_decode(' . $params[ 0 ] . ', ENT_QUOTES)'; + case 'url': + return 'rawurldecode(' . $params[ 0 ] . ')'; + default: + return $params[ 0 ]; + } +} diff --git a/plugins/modifiercompiler.upper.php b/plugins/modifiercompiler.upper.php new file mode 100644 index 0000000000000000000000000000000000000000..ea4e95b7a459d7fbb0b5e18232e5c02bd7d62133 --- /dev/null +++ b/plugins/modifiercompiler.upper.php @@ -0,0 +1,28 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty upper modifier plugin + * Type: modifier + * Name: lower + * Purpose: convert string to uppercase + * + * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_upper($params) +{ + if (Smarty::$_MBSTRING) { + return 'mb_strtoupper(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strtoupper(' . $params[ 0 ] . ')'; +} diff --git a/plugins/modifiercompiler.wordwrap.php b/plugins/modifiercompiler.wordwrap.php new file mode 100644 index 0000000000000000000000000000000000000000..8565f140e7bc5ab4f9862a4b47a879c54195d624 --- /dev/null +++ b/plugins/modifiercompiler.wordwrap.php @@ -0,0 +1,39 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifierCompiler + */ +/** + * Smarty wordwrap modifier plugin + * Type: modifier + * Name: wordwrap + * Purpose: wrap a string of text at a given length + * + * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * + * @return string with compiled code + * @throws \SmartyException + */ +function smarty_modifiercompiler_wordwrap($params, Smarty_Internal_TemplateCompilerBase $compiler) +{ + if (!isset($params[ 1 ])) { + $params[ 1 ] = 80; + } + if (!isset($params[ 2 ])) { + $params[ 2 ] = '"\n"'; + } + if (!isset($params[ 3 ])) { + $params[ 3 ] = 'false'; + } + $function = 'wordwrap'; + if (Smarty::$_MBSTRING) { + $function = $compiler->getPlugin('mb_wordwrap', 'modifier'); + } + return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')'; +} diff --git a/plugins/outputfilter.trimwhitespace.php b/plugins/outputfilter.trimwhitespace.php new file mode 100644 index 0000000000000000000000000000000000000000..7e4503a1cf566f1d3587523ff1b0f4ef7403c17a --- /dev/null +++ b/plugins/outputfilter.trimwhitespace.php @@ -0,0 +1,89 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ +/** + * Smarty trimwhitespace outputfilter plugin + * Trim unnecessary whitespace from HTML markup. + * + * @author Rodney Rehm + * + * @param string $source input string + * + * @return string filtered output + * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail! + */ +function smarty_outputfilter_trimwhitespace($source) +{ + $store = array(); + $_store = 0; + $_offset = 0; + // Unify Line-Breaks to \n + $source = preg_replace('/\015\012|\015|\012/', "\n", $source); + // capture Internet Explorer and KnockoutJS Conditional Comments + if (preg_match_all( + '#<!--((\[[^\]]+\]>.*?<!\[[^\]]+\])|(\s*/?ko\s+.+))-->#is', + $source, + $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER + ) + ) { + foreach ($matches as $match) { + $store[] = $match[ 0 ][ 0 ]; + $_length = strlen($match[ 0 ][ 0 ]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length); + $_offset += $_length - strlen($replace); + $_store++; + } + } + // Strip all HTML-Comments + // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124 + $source = preg_replace('#<!--.*?-->#ms', '', $source); + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all( + '#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is', + $source, + $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER + ) + ) { + foreach ($matches as $match) { + $store[] = $match[ 0 ][ 0 ]; + $_length = strlen($match[ 0 ][ 0 ]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length); + $_offset += $_length - strlen($replace); + $_store++; + } + } + $expressions = array(// replace multiple spaces between tags by a single space + // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements + '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2', + // remove spaces between attributes (but not in attribute values!) + '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5', + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + '#^\s+<#Ss' => '<', + '#>\s+$#Ss' => '>', + ); + $source = preg_replace(array_keys($expressions), array_values($expressions), $source); + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + // $source = trim( $source ); + $_offset = 0; + if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $_length = strlen($match[ 0 ][ 0 ]); + $replace = $store[ $match[ 1 ][ 0 ] ]; + $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] + $_offset, $_length); + $_offset += strlen($replace) - $_length; + $_store++; + } + } + return $source; +} diff --git a/plugins/shared.escape_special_chars.php b/plugins/shared.escape_special_chars.php new file mode 100644 index 0000000000000000000000000000000000000000..6b18d3eec300ec478c52d283a87fb54a06fc4728 --- /dev/null +++ b/plugins/shared.escape_special_chars.php @@ -0,0 +1,32 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +/** + * escape_special_chars common function + * Function: smarty_function_escape_special_chars + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param string $string text that should by escaped + * + * @return string + */ +function smarty_function_escape_special_chars($string) +{ + if (!is_array($string)) { + if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false); + } else { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + } + } + return $string; +} diff --git a/plugins/shared.literal_compiler_param.php b/plugins/shared.literal_compiler_param.php new file mode 100644 index 0000000000000000000000000000000000000000..65caf03c829cd9608be8fe7df482b58a3220063e --- /dev/null +++ b/plugins/shared.literal_compiler_param.php @@ -0,0 +1,35 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +/** + * evaluate compiler parameter + * + * @param array $params parameter array as given to the compiler function + * @param integer $index array index of the parameter to convert + * @param mixed $default value to be returned if the parameter is not present + * + * @return mixed evaluated value of parameter or $default + * @throws SmartyException if parameter is not a literal (but an expression, variable, …) + * @author Rodney Rehm + */ +function smarty_literal_compiler_param($params, $index, $default = null) +{ + // not set, go default + if (!isset($params[ $index ])) { + return $default; + } + // test if param is a literal + if (!preg_match('/^([\'"]?)[a-zA-Z0-9-]+(\\1)$/', $params[ $index ])) { + throw new SmartyException( + '$param[' . $index . + '] is not a literal and is thus not evaluatable at compile time' + ); + } + $t = null; + eval("\$t = " . $params[ $index ] . ";"); + return $t; +} diff --git a/plugins/shared.make_timestamp.php b/plugins/shared.make_timestamp.php new file mode 100644 index 0000000000000000000000000000000000000000..9626dc68e487d9d170c08e76dd0236d81bdc5e7a --- /dev/null +++ b/plugins/shared.make_timestamp.php @@ -0,0 +1,49 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +/** + * Function: smarty_make_timestamp + * Purpose: used by other smarty functions to make a timestamp from a string. + * + * @author Monte Ohrt <monte at ohrt dot com> + * + * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime() + * + * @return int + */ +function smarty_make_timestamp($string) +{ + if (empty($string)) { + // use "now": + return time(); + } elseif ($string instanceof DateTime + || (interface_exists('DateTimeInterface', false) && $string instanceof DateTimeInterface) + ) { + return (int)$string->format('U'); // PHP 5.2 BC + } elseif (strlen($string) === 14 && ctype_digit($string)) { + // it is mysql timestamp format of YYYYMMDDHHMMSS? + return mktime( + substr($string, 8, 2), + substr($string, 10, 2), + substr($string, 12, 2), + substr($string, 4, 2), + substr($string, 6, 2), + substr($string, 0, 4) + ); + } elseif (is_numeric($string)) { + // it is a numeric string, we handle it as timestamp + return (int)$string; + } else { + // strtotime should handle it + $time = strtotime($string); + if ($time === -1 || $time === false) { + // strtotime() was not able to parse $string, use "now": + return time(); + } + return $time; + } +} diff --git a/plugins/shared.mb_str_replace.php b/plugins/shared.mb_str_replace.php new file mode 100644 index 0000000000000000000000000000000000000000..206cf9ea6bceed58ab11dbf666f94f0474a5a15a --- /dev/null +++ b/plugins/shared.mb_str_replace.php @@ -0,0 +1,53 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +if (!function_exists('smarty_mb_str_replace')) { + /** + * Multibyte string replace + * + * @param string|string[] $search the string to be searched + * @param string|string[] $replace the replacement string + * @param string $subject the source string + * @param int &$count number of matches found + * + * @return string replaced string + * @author Rodney Rehm + */ + function smarty_mb_str_replace($search, $replace, $subject, &$count = 0) + { + if (!is_array($search) && is_array($replace)) { + return false; + } + if (is_array($subject)) { + // call mb_replace for each single string in $subject + foreach ($subject as &$string) { + $string = smarty_mb_str_replace($search, $replace, $string, $c); + $count += $c; + } + } elseif (is_array($search)) { + if (!is_array($replace)) { + foreach ($search as &$string) { + $subject = smarty_mb_str_replace($string, $replace, $subject, $c); + $count += $c; + } + } else { + $n = max(count($search), count($replace)); + while ($n--) { + $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); + $count += $c; + next($search); + next($replace); + } + } + } else { + $parts = mb_split(preg_quote($search), $subject); + $count = count($parts) - 1; + $subject = implode($replace, $parts); + } + return $subject; + } +} diff --git a/plugins/shared.mb_unicode.php b/plugins/shared.mb_unicode.php new file mode 100644 index 0000000000000000000000000000000000000000..7d12065069bf568b4f1fc501788fcc8d21ba6cb3 --- /dev/null +++ b/plugins/shared.mb_unicode.php @@ -0,0 +1,51 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +/** + * convert characters to their decimal unicode equivalents + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * + * @param string $string characters to calculate unicode of + * @param string $encoding encoding of $string, if null mb_internal_encoding() is used + * + * @return array sequence of unicodes + * @author Rodney Rehm + */ +function smarty_mb_to_unicode($string, $encoding = null) +{ + if ($encoding) { + $expanded = mb_convert_encoding($string, 'UTF-32BE', $encoding); + } else { + $expanded = mb_convert_encoding($string, 'UTF-32BE'); + } + return unpack('N*', $expanded); +} + +/** + * convert unicodes to the character of given encoding + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * + * @param integer|array $unicode single unicode or list of unicodes to convert + * @param string $encoding encoding of returned string, if null mb_internal_encoding() is used + * + * @return string unicode as character sequence in given $encoding + * @author Rodney Rehm + */ +function smarty_mb_from_unicode($unicode, $encoding = null) +{ + $t = ''; + if (!$encoding) { + $encoding = mb_internal_encoding(); + } + foreach ((array)$unicode as $utf32be) { + $character = pack('N*', $utf32be); + $t .= mb_convert_encoding($character, $encoding, 'UTF-32BE'); + } + return $t; +} diff --git a/plugins/variablefilter.htmlspecialchars.php b/plugins/variablefilter.htmlspecialchars.php new file mode 100644 index 0000000000000000000000000000000000000000..3c85295db6900583c27673e4573ce9834415782c --- /dev/null +++ b/plugins/variablefilter.htmlspecialchars.php @@ -0,0 +1,19 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ +/** + * Smarty htmlspecialchars variablefilter plugin + * + * @param string $source input string + * @param \Smarty_Internal_Template $template + * + * @return string filtered output + */ +function smarty_variablefilter_htmlspecialchars($source, Smarty_Internal_Template $template) +{ + return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET); +} diff --git a/prueba_sujeto.php b/prueba_sujeto.php new file mode 100644 index 0000000000000000000000000000000000000000..aa78711d15937c54135457903d992126611fc062 --- /dev/null +++ b/prueba_sujeto.php @@ -0,0 +1,57 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Realizar una prueba +* Inicio del caso de uso: REALIZAR UNA PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $id_prueba = $_GET['id_prueba']; + $accion = $_GET['accion']; + + $html=new Smarty; + + // Barra + barra(); + // Fin de barra + + //Si hemos salido borramos la �ltima prueba creada + if ($accion==1 && $id_prueba != ""){ + $sql="DELETE FROM `PRUEBAS_SUJETOS` WHERE `id_prueba_sujeto`='$id_prueba'"; + if ($conex->query($sql)){ + $mensaje ="Prueba anterior borrada correctamente"; + }else{ + $mensaje ="Error al borrar la prueba"; + } + } + + // Valores para el formulario: + // Tipo de ensayos + // Nombre + // Apellidos + // Edad + // Sexo + + //Necesitamos tipos de ensayos + $x=0; + $result = $conex->query("SELECT tipo FROM `ENSAYOS`"); + while ($row = $result->fetch_assoc()){ + $entrada[$x]=$row['tipo']; + $x++; + } + // asignamos variable a template + $html->assign("ensayos",$entrada); + + + $html->assign("id_admin",$id_admin); + $html->assign("mensaje",$mensaje); + + + $html->display("prueba_sujeto.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/prueba_sujeto_val.php b/prueba_sujeto_val.php new file mode 100644 index 0000000000000000000000000000000000000000..d4826a257e9a3ad1c4dbd07c220ccdc72198cbc2 --- /dev/null +++ b/prueba_sujeto_val.php @@ -0,0 +1,97 @@ +<?php session_start(); +require_once("funciones.php"); +require('include.php'); +/* +* Archivo de control. Realizar una prueba a un paciente +* Caso de uso: REALIZAR UNA PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + + $html=new Smarty; + + + // Barra + barra(); + // Fin de barra + + $id_admin= $_GET["variable"]; + $ensayo= $_POST['ensayo']; + $edad= $_POST['edad']; + $sexo= $_POST['sexo']; + $simetria= $_POST['simetria']; + $anotaciones_sujeto=$_POST['anotaciones_sujeto']; + $anotaciones_prueba=$_POST['anotaciones_prueba']; + + + // recuperamos el id_ensayo con el ensayo + $result = $conex->query("SELECT id_ensayo, coloc_sensores, duracion, repeticiones FROM `ENSAYOS` WHERE `tipo` = '$ensayo'"); + $row = $result->fetch_assoc(); + $id_ensayo=$row['id_ensayo']; + $coloc_sensores=nl2br($row['coloc_sensores']); + $duracion=$row['duracion']; + $repeticiones=$row['repeticiones']; + if ($duracion == 15) $getESP = 'A'; + if ($duracion == 30) $getESP = 'B'; + if ($duracion == 45) $getESP = 'C'; + if ($duracion == 60) $getESP = 'D'; + if ($duracion == 75) $getESP = 'E'; + if ($duracion == 90) $getESP = 'F'; + + //Creamos el nuevo sujeto en la tabla de sujetos y obtenemos el id que se le asigna (contamos con que el id es AUTO_INCREMENT) + if($anotaciones_sujeto == ""){ + $sql = "INSERT INTO `SUJETOS` (`sexo`, `edad`, `anotaciones`) + VALUES ('$sexo', '$edad', NULL)"; + }else{ + $sql = "INSERT INTO `SUJETOS` (`sexo`, `edad`, `anotaciones`) + VALUES ('$sexo', '$edad', '$anotaciones_sujeto')"; + } + + if($conex->query($sql)){ + $result = $conex->query("SELECT MAX(`id_sujeto`) AS id FROM SUJETOS"); + $row = $result->fetch_assoc(); + $id_sujeto=$row['id']; + //Hacemos el insert en la tabla de las pruebas de un paciente + if($simetria == "" && $anotaciones_prueba == ""){//Simetria y anotaciones vacias + $sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`, `fecha`, `simetria`, `anotaciones`, `id_sujeto`) + VALUES ('$id_ensayo', NOW(), NULL, NULL, '$id_sujeto')"; + }elseif ($simetria != "" && $anotaciones_prueba == ""){//Anotaciones vacias + $sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`, `fecha`, `simetria`, `anotaciones`, `id_sujeto`) + VALUES ('$id_ensayo', NOW(), '$simetria', NULL, '$id_sujeto')"; + }elseif ($simetria == "" && $anotaciones_prueba != ""){//Simetria vac�a + $sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`, `fecha`, `simetria`, `anotaciones`, `id_sujeto`) + VALUES ('$id_ensayo', NOW(), NULL, '$anotaciones_prueba', '$id_sujeto')"; + }else{//Ning�n campo vac�o + $sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`, `fecha`, `simetria`, `anotaciones`, `id_sujeto`) + VALUES ('$id_ensayo', NOW(), '$simetria', '$anotaciones_prueba' ,'$id_sujeto')"; + } + if (!$conex->query($sql)) + { + $mensaje.="Error: \n". $conex->error. "DNI: $id_sujeto"; + } + else { + $mensaje.= "Actualizada prueba "; + $result = $conex->query("SELECT max(`id_prueba_sujeto`) as num FROM `PRUEBAS_SUJETOS` WHERE `id_sujeto`= '$id_sujeto'"); + $row = $result->fetch_assoc(); + $id_prueba = $row["num"]; + } + }else $mensaje=$$id_admin .", ".$ensayo.", ". $edad.", ". $sexo.", ". $simetria.", ". $anotaciones_sujeto.", ". $anotaciones_prueba ; + + $imagen = imagen('media/images/ensayo/',$ensayo); // Aqu� ejecutamos la funci�n para obtener la imagen y en caso de no existir poner una alternativa (por definir) + + $html->assign("imagen",$imagen); + $html->assign("id_sujeto",$id_sujeto); + $html->assign("segundos",$duracion); + $html->assign("coloc_sensores",$coloc_sensores); + $html->assign("get",$getESP); + $html->assign("repeticiones",$repeticiones); + $html->assign("ensayo",$ensayo); + $html->assign("id_admin",$id_admin); + $html->assign("id_prueba",$id_prueba); + $html->assign("mensaje",$mensaje); + $html->display("prueba_sujeto_val.tpl"); + +} +else @header('location:index.php'); + +?> diff --git a/result.php b/result.php new file mode 100644 index 0000000000000000000000000000000000000000..6232f22cd5561bdb5d69110fadb846bef9536194 --- /dev/null +++ b/result.php @@ -0,0 +1,72 @@ +<?php session_start(); +require('include.php'); +require_once("funciones.php"); +/* +* Archivo de control. Página de inicio donde se muestra un listado de los pacientes +* Caso de uso: VER DATOS DE UN PACIENTE +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + + $id_admin=$_GET["variable"]; + $accion=$_GET["accion"]; + + $html=new Smarty; + + barra(); + $mensaje=""; + + + if($accion == 1){//eliminar un paciente + $id_paciente = $_GET["id"]; + $sql="DELETE FROM `PACIENTES` WHERE `dni_paciente`='$id_paciente'"; + if ($conex->query($sql)){ + $mensaje =""; + }else{ + $mensaje ="Error al borrar el paciente"; + } + } + + $sql="SELECT `dni_paciente`, `nombre`, `apellidos`, `sexo`, `edad`, `anotaciones` + FROM PACIENTES + "; + $result=$conex->query($sql); + + $x = 0; + // rellenamos array con tabla obtenida + while ($row = $result->fetch_assoc()){ + $date = date_create(date("d-m-Y"))->diff(date_create($row['edad'])); + if($date->y != 0){ + $date = $date->y . " años"; + }elseif($date->m != 0){ + $date = $date->m . " meses"; + }else{ + $date = $date->d . " días"; + } + $entrada[$x]=[ + $row['dni_paciente'], + $row['nombre'], + $row['apellidos'], + $row['sexo'], + $date, + $row['anotaciones'], + $row['edad'], + ]; + $x++; + } + + + $html->assign("id_admin",$id_admin); + $html->assign("entrada",$entrada); + $html->assign("mensaje",$mensaje); + + // inicamos template + if($mensaje=="" ){ + $html->display("result.tpl"); + }else{ + $html->display("pac_reg.tpl"); + } + +} + +else @header('location:index.php'); +?> diff --git a/sysplugins/smarty_cacheresource.php b/sysplugins/smarty_cacheresource.php new file mode 100644 index 0000000000000000000000000000000000000000..91e9f39246adf1840b830a7ebb4e1334293e0ce9 --- /dev/null +++ b/sysplugins/smarty_cacheresource.php @@ -0,0 +1,219 @@ +<?php +/** + * Smarty Internal Plugin + * + * @package Smarty + * @subpackage Cacher + */ + +/** + * Cache Handler API + * + * @package Smarty + * @subpackage Cacher + * @author Rodney Rehm + */ +abstract class Smarty_CacheResource +{ + /** + * resource types provided by the core + * + * @var array + */ + protected static $sysplugins = array('file' => 'smarty_internal_cacheresource_file.php',); + + /** + * populate Cached Object with meta data from Resource + * + * @param \Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + abstract public function populate(\Smarty_Template_Cached $cached, Smarty_Internal_Template $_template); + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $cached + * + * @return void + */ + abstract public function populateTimestamp(Smarty_Template_Cached $cached); + + /** + * Read the cached template and process header + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty_Template_Cached $cached cached object + * @param boolean $update flag if called because cache update + * + * @return boolean true or false if the cached content does not exist + */ + abstract public function process( + Smarty_Internal_Template $_template, + Smarty_Template_Cached $cached = null, + $update = false + ); + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * + * @return boolean success + */ + abstract public function writeCachedContent(Smarty_Internal_Template $_template, $content); + + /** + * Read cached template from cache + * + * @param Smarty_Internal_Template $_template template object + * + * @return string content + */ + abstract public function readCachedContent(Smarty_Internal_Template $_template); + + /** + * Return cached content + * + * @param Smarty_Internal_Template $_template template object + * + * @return null|string + */ + public function getCachedContent(Smarty_Internal_Template $_template) + { + if ($_template->cached->handler->process($_template)) { + ob_start(); + $unifunc = $_template->cached->unifunc; + $unifunc($_template); + return ob_get_clean(); + } + return null; + } + + /** + * Empty cache + * + * @param Smarty $smarty Smarty object + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return integer number of cache files deleted + */ + abstract public function clearAll(Smarty $smarty, $exp_time = null); + + /** + * Empty cache for a specific template + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return integer number of cache files deleted + */ + abstract public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time); + + /** + * @param Smarty $smarty + * @param Smarty_Template_Cached $cached + * + * @return bool|null + */ + public function locked(Smarty $smarty, Smarty_Template_Cached $cached) + { + // theoretically locking_timeout should be checked against time_limit (max_execution_time) + $start = microtime(true); + $hadLock = null; + while ($this->hasLock($smarty, $cached)) { + $hadLock = true; + if (microtime(true) - $start > $smarty->locking_timeout) { + // abort waiting for lock release + return false; + } + sleep(1); + } + return $hadLock; + } + + /** + * Check is cache is locked for this template + * + * @param Smarty $smarty + * @param Smarty_Template_Cached $cached + * + * @return bool + */ + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + // check if lock exists + return false; + } + + /** + * Lock cache for this template + * + * @param Smarty $smarty + * @param Smarty_Template_Cached $cached + * + * @return bool + */ + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + // create lock + return true; + } + + /** + * Unlock cache for this template + * + * @param Smarty $smarty + * @param Smarty_Template_Cached $cached + * + * @return bool + */ + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + // release lock + return true; + } + + /** + * Load Cache Resource Handler + * + * @param Smarty $smarty Smarty object + * @param string $type name of the cache resource + * + * @throws SmartyException + * @return Smarty_CacheResource Cache Resource Handler + */ + public static function load(Smarty $smarty, $type = null) + { + if (!isset($type)) { + $type = $smarty->caching_type; + } + // try smarty's cache + if (isset($smarty->_cache[ 'cacheresource_handlers' ][ $type ])) { + return $smarty->_cache[ 'cacheresource_handlers' ][ $type ]; + } + // try registered resource + if (isset($smarty->registered_cache_resources[ $type ])) { + // do not cache these instances as they may vary from instance to instance + return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = $smarty->registered_cache_resources[ $type ]; + } + // try sysplugins dir + if (isset(self::$sysplugins[ $type ])) { + $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); + return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class(); + } + // try plugins dir + $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); + if ($smarty->loadPlugin($cache_resource_class)) { + return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class(); + } + // give up + throw new SmartyException("Unable to load cache resource '{$type}'"); + } +} diff --git a/sysplugins/smarty_cacheresource_custom.php b/sysplugins/smarty_cacheresource_custom.php new file mode 100644 index 0000000000000000000000000000000000000000..68ad112891a232cbb27dadd9e7397760f6009fc1 --- /dev/null +++ b/sysplugins/smarty_cacheresource_custom.php @@ -0,0 +1,297 @@ +<?php +/** + * Smarty Internal Plugin + * + * @package Smarty + * @subpackage Cacher + */ + +/** + * Cache Handler API + * + * @package Smarty + * @subpackage Cacher + * @author Rodney Rehm + */ +abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource +{ + /** + * fetch cached content and its modification time from data source + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $content cached content + * @param integer $mtime cache modification timestamp (epoch) + * + * @return void + */ + abstract protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime); + + /** + * Fetch cached content's modification timestamp from data source + * {@internal implementing this method is optional. + * Only implement it if modification times can be accessed faster than loading the complete cached content.}} + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + */ + protected function fetchTimestamp($id, $name, $cache_id, $compile_id) + { + return false; + } + + /** + * Save content to cache + * + * @param string $id unique cache content identifier + * @param string $name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer|null $exp_time seconds till expiration or null + * @param string $content content to cache + * + * @return boolean success + */ + abstract protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content); + + /** + * Delete content from cache + * + * @param string|null $name template name + * @param string|null $cache_id cache id + * @param string|null $compile_id compile id + * @param integer|null $exp_time seconds till expiration time in seconds or null + * + * @return integer number of deleted caches + */ + abstract protected function delete($name, $cache_id, $compile_id, $exp_time); + + /** + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) + { + $_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null; + $_compile_id = isset($cached->compile_id) ? preg_replace('![^\w]+!', '_', $cached->compile_id) : null; + $path = $cached->source->uid . $_cache_id . $_compile_id; + $cached->filepath = sha1($path); + if ($_template->smarty->cache_locking) { + $cached->lock_id = sha1('lock.' . $path); + } + $this->populateTimestamp($cached); + } + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $cached + * + * @return void + */ + public function populateTimestamp(Smarty_Template_Cached $cached) + { + $mtime = + $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id); + if ($mtime !== null) { + $cached->timestamp = $mtime; + $cached->exists = !!$cached->timestamp; + return; + } + $timestamp = null; + $this->fetch( + $cached->filepath, + $cached->source->name, + $cached->cache_id, + $cached->compile_id, + $cached->content, + $timestamp + ); + $cached->timestamp = isset($timestamp) ? $timestamp : false; + $cached->exists = !!$cached->timestamp; + } + + /** + * Read the cached template and process the header + * + * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + * @param Smarty_Template_Cached $cached cached object + * @param boolean $update flag if called because cache update + * + * @return boolean true or false if the cached content does not exist + */ + public function process( + Smarty_Internal_Template $_smarty_tpl, + Smarty_Template_Cached $cached = null, + $update = false + ) { + if (!$cached) { + $cached = $_smarty_tpl->cached; + } + $content = $cached->content ? $cached->content : null; + $timestamp = $cached->timestamp ? $cached->timestamp : null; + if ($content === null || !$timestamp) { + $this->fetch( + $_smarty_tpl->cached->filepath, + $_smarty_tpl->source->name, + $_smarty_tpl->cache_id, + $_smarty_tpl->compile_id, + $content, + $timestamp + ); + } + if (isset($content)) { + eval('?>' . $content); + $cached->content = null; + return true; + } + return false; + } + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * + * @return boolean success + */ + public function writeCachedContent(Smarty_Internal_Template $_template, $content) + { + return $this->save( + $_template->cached->filepath, + $_template->source->name, + $_template->cache_id, + $_template->compile_id, + $_template->cache_lifetime, + $content + ); + } + + /** + * Read cached template from cache + * + * @param Smarty_Internal_Template $_template template object + * + * @return string|boolean content + */ + public function readCachedContent(Smarty_Internal_Template $_template) + { + $content = $_template->cached->content ? $_template->cached->content : null; + $timestamp = null; + if ($content === null) { + $timestamp = null; + $this->fetch( + $_template->cached->filepath, + $_template->source->name, + $_template->cache_id, + $_template->compile_id, + $content, + $timestamp + ); + } + if (isset($content)) { + return $content; + } + return false; + } + + /** + * Empty cache + * + * @param Smarty $smarty Smarty object + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return integer number of cache files deleted + */ + public function clearAll(Smarty $smarty, $exp_time = null) + { + return $this->delete(null, null, null, $exp_time); + } + + /** + * Empty cache for a specific template + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return int number of cache files deleted + * @throws \SmartyException + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) + { + $cache_name = null; + if (isset($resource_name)) { + $source = Smarty_Template_Source::load(null, $smarty, $resource_name); + if ($source->exists) { + $cache_name = $source->name; + } else { + return 0; + } + } + return $this->delete($cache_name, $cache_id, $compile_id, $exp_time); + } + + /** + * Check is cache is locked for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return boolean true or false if cache is locked + */ + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $id = $cached->lock_id; + $name = $cached->source->name . '.lock'; + $mtime = $this->fetchTimestamp($id, $name, $cached->cache_id, $cached->compile_id); + if ($mtime === null) { + $this->fetch($id, $name, $cached->cache_id, $cached->compile_id, $content, $mtime); + } + return $mtime && ($t = time()) - $mtime < $smarty->locking_timeout; + } + + /** + * Lock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return bool|void + */ + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = true; + $id = $cached->lock_id; + $name = $cached->source->name . '.lock'; + $this->save($id, $name, $cached->cache_id, $cached->compile_id, $smarty->locking_timeout, ''); + } + + /** + * Unlock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return bool|void + */ + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = false; + $name = $cached->source->name . '.lock'; + $this->delete($name, $cached->cache_id, $cached->compile_id, null); + } +} diff --git a/sysplugins/smarty_cacheresource_keyvaluestore.php b/sysplugins/smarty_cacheresource_keyvaluestore.php new file mode 100644 index 0000000000000000000000000000000000000000..59bf1d4a8d0275223628bb2c2bd0440392fa928a --- /dev/null +++ b/sysplugins/smarty_cacheresource_keyvaluestore.php @@ -0,0 +1,538 @@ +<?php +/** + * Smarty Internal Plugin + * + * @package Smarty + * @subpackage Cacher + */ + +/** + * Smarty Cache Handler Base for Key/Value Storage Implementations + * This class implements the functionality required to use simple key/value stores + * for hierarchical cache groups. key/value stores like memcache or APC do not support + * wildcards in keys, therefore a cache group cannot be cleared like "a|*" - which + * is no problem to filesystem and RDBMS implementations. + * This implementation is based on the concept of invalidation. While one specific cache + * can be identified and cleared, any range of caches cannot be identified. For this reason + * each level of the cache group hierarchy can have its own value in the store. These values + * are nothing but microtimes, telling us when a particular cache group was cleared for the + * last time. These keys are evaluated for every cache read to determine if the cache has + * been invalidated since it was created and should hence be treated as inexistent. + * Although deep hierarchies are possible, they are not recommended. Try to keep your + * cache groups as shallow as possible. Anything up 3-5 parents should be ok. So + * »a|b|c« is a good depth where »a|b|c|d|e|f|g|h|i|j|k« isn't. Try to join correlating + * cache groups: if your cache groups look somewhat like »a|b|$page|$items|$whatever« + * consider using »a|b|c|$page-$items-$whatever« instead. + * + * @package Smarty + * @subpackage Cacher + * @author Rodney Rehm + */ +abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource +{ + /** + * cache for contents + * + * @var array + */ + protected $contents = array(); + + /** + * cache for timestamps + * + * @var array + */ + protected $timestamps = array(); + + /** + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) + { + $cached->filepath = $_template->source->uid . '#' . $this->sanitize($cached->source->resource) . '#' . + $this->sanitize($cached->cache_id) . '#' . $this->sanitize($cached->compile_id); + $this->populateTimestamp($cached); + } + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $cached cached object + * + * @return void + */ + public function populateTimestamp(Smarty_Template_Cached $cached) + { + if (!$this->fetch( + $cached->filepath, + $cached->source->name, + $cached->cache_id, + $cached->compile_id, + $content, + $timestamp, + $cached->source->uid + ) + ) { + return; + } + $cached->content = $content; + $cached->timestamp = (int)$timestamp; + $cached->exists = !!$cached->timestamp; + } + + /** + * Read the cached template and process the header + * + * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + * @param Smarty_Template_Cached $cached cached object + * @param boolean $update flag if called because cache update + * + * @return boolean true or false if the cached content does not exist + */ + public function process( + Smarty_Internal_Template $_smarty_tpl, + Smarty_Template_Cached $cached = null, + $update = false + ) { + if (!$cached) { + $cached = $_smarty_tpl->cached; + } + $content = $cached->content ? $cached->content : null; + $timestamp = $cached->timestamp ? $cached->timestamp : null; + if ($content === null || !$timestamp) { + if (!$this->fetch( + $_smarty_tpl->cached->filepath, + $_smarty_tpl->source->name, + $_smarty_tpl->cache_id, + $_smarty_tpl->compile_id, + $content, + $timestamp, + $_smarty_tpl->source->uid + ) + ) { + return false; + } + } + if (isset($content)) { + eval('?>' . $content); + return true; + } + return false; + } + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * + * @return boolean success + */ + public function writeCachedContent(Smarty_Internal_Template $_template, $content) + { + $this->addMetaTimestamp($content); + return $this->write(array($_template->cached->filepath => $content), $_template->cache_lifetime); + } + + /** + * Read cached template from cache + * + * @param Smarty_Internal_Template $_template template object + * + * @return string|false content + */ + public function readCachedContent(Smarty_Internal_Template $_template) + { + $content = $_template->cached->content ? $_template->cached->content : null; + $timestamp = null; + if ($content === null) { + if (!$this->fetch( + $_template->cached->filepath, + $_template->source->name, + $_template->cache_id, + $_template->compile_id, + $content, + $timestamp, + $_template->source->uid + ) + ) { + return false; + } + } + if (isset($content)) { + return $content; + } + return false; + } + + /** + * Empty cache + * {@internal the $exp_time argument is ignored altogether }} + * + * @param Smarty $smarty Smarty object + * @param integer $exp_time expiration time [being ignored] + * + * @return integer number of cache files deleted [always -1] + * @uses purge() to clear the whole store + * @uses invalidate() to mark everything outdated if purge() is inapplicable + */ + public function clearAll(Smarty $smarty, $exp_time = null) + { + if (!$this->purge()) { + $this->invalidate(null); + } + return -1; + } + + /** + * Empty cache for a specific template + * {@internal the $exp_time argument is ignored altogether}} + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time [being ignored] + * + * @return int number of cache files deleted [always -1] + * @throws \SmartyException + * @uses buildCachedFilepath() to generate the CacheID + * @uses invalidate() to mark CacheIDs parent chain as outdated + * @uses delete() to remove CacheID from cache + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) + { + $uid = $this->getTemplateUid($smarty, $resource_name); + $cid = $uid . '#' . $this->sanitize($resource_name) . '#' . $this->sanitize($cache_id) . '#' . + $this->sanitize($compile_id); + $this->delete(array($cid)); + $this->invalidate($cid, $resource_name, $cache_id, $compile_id, $uid); + return -1; + } + + /** + * Get template's unique ID + * + * @param Smarty $smarty Smarty object + * @param string $resource_name template name + * + * @return string filepath of cache file + * @throws \SmartyException + */ + protected function getTemplateUid(Smarty $smarty, $resource_name) + { + if (isset($resource_name)) { + $source = Smarty_Template_Source::load(null, $smarty, $resource_name); + if ($source->exists) { + return $source->uid; + } + } + return ''; + } + + /** + * Sanitize CacheID components + * + * @param string $string CacheID component to sanitize + * + * @return string sanitized CacheID component + */ + protected function sanitize($string) + { + $string = trim($string, '|'); + if (!$string) { + return ''; + } + return preg_replace('#[^\w\|]+#S', '_', $string); + } + + /** + * Fetch and prepare a cache object. + * + * @param string $cid CacheID to fetch + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $content cached content + * @param integer &$timestamp cached timestamp (epoch) + * @param string $resource_uid resource's uid + * + * @return boolean success + */ + protected function fetch( + $cid, + $resource_name = null, + $cache_id = null, + $compile_id = null, + &$content = null, + &$timestamp = null, + $resource_uid = null + ) { + $t = $this->read(array($cid)); + $content = !empty($t[ $cid ]) ? $t[ $cid ] : null; + $timestamp = null; + if ($content && ($timestamp = $this->getMetaTimestamp($content))) { + $invalidated = + $this->getLatestInvalidationTimestamp($cid, $resource_name, $cache_id, $compile_id, $resource_uid); + if ($invalidated > $timestamp) { + $timestamp = null; + $content = null; + } + } + return !!$content; + } + + /** + * Add current microtime to the beginning of $cache_content + * {@internal the header uses 8 Bytes, the first 4 Bytes are the seconds, the second 4 Bytes are the microseconds}} + * + * @param string &$content the content to be cached + */ + protected function addMetaTimestamp(&$content) + { + $mt = explode(' ', microtime()); + $ts = pack('NN', $mt[ 1 ], (int)($mt[ 0 ] * 100000000)); + $content = $ts . $content; + } + + /** + * Extract the timestamp the $content was cached + * + * @param string &$content the cached content + * + * @return float the microtime the content was cached + */ + protected function getMetaTimestamp(&$content) + { + extract(unpack('N1s/N1m/a*content', $content)); + /** + * @var int $s + * @var int $m + */ + return $s + ($m / 100000000); + } + + /** + * Invalidate CacheID + * + * @param string $cid CacheID + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $resource_uid source's uid + * + * @return void + */ + protected function invalidate( + $cid = null, + $resource_name = null, + $cache_id = null, + $compile_id = null, + $resource_uid = null + ) { + $now = microtime(true); + $key = null; + // invalidate everything + if (!$resource_name && !$cache_id && !$compile_id) { + $key = 'IVK#ALL'; + } // invalidate all caches by template + else { + if ($resource_name && !$cache_id && !$compile_id) { + $key = 'IVK#TEMPLATE#' . $resource_uid . '#' . $this->sanitize($resource_name); + } // invalidate all caches by cache group + else { + if (!$resource_name && $cache_id && !$compile_id) { + $key = 'IVK#CACHE#' . $this->sanitize($cache_id); + } // invalidate all caches by compile id + else { + if (!$resource_name && !$cache_id && $compile_id) { + $key = 'IVK#COMPILE#' . $this->sanitize($compile_id); + } // invalidate by combination + else { + $key = 'IVK#CID#' . $cid; + } + } + } + } + $this->write(array($key => $now)); + } + + /** + * Determine the latest timestamp known to the invalidation chain + * + * @param string $cid CacheID to determine latest invalidation timestamp of + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $resource_uid source's filepath + * + * @return float the microtime the CacheID was invalidated + */ + protected function getLatestInvalidationTimestamp( + $cid, + $resource_name = null, + $cache_id = null, + $compile_id = null, + $resource_uid = null + ) { + // abort if there is no CacheID + if (false && !$cid) { + return 0; + } + // abort if there are no InvalidationKeys to check + if (!($_cid = $this->listInvalidationKeys($cid, $resource_name, $cache_id, $compile_id, $resource_uid))) { + return 0; + } + // there are no InValidationKeys + if (!($values = $this->read($_cid))) { + return 0; + } + // make sure we're dealing with floats + $values = array_map('floatval', $values); + return max($values); + } + + /** + * Translate a CacheID into the list of applicable InvalidationKeys. + * Splits 'some|chain|into|an|array' into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... ) + * + * @param string $cid CacheID to translate + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param string $resource_uid source's filepath + * + * @return array list of InvalidationKeys + * @uses $invalidationKeyPrefix to prepend to each InvalidationKey + */ + protected function listInvalidationKeys( + $cid, + $resource_name = null, + $cache_id = null, + $compile_id = null, + $resource_uid = null + ) { + $t = array('IVK#ALL'); + $_name = $_compile = '#'; + if ($resource_name) { + $_name .= $resource_uid . '#' . $this->sanitize($resource_name); + $t[] = 'IVK#TEMPLATE' . $_name; + } + if ($compile_id) { + $_compile .= $this->sanitize($compile_id); + $t[] = 'IVK#COMPILE' . $_compile; + } + $_name .= '#'; + $cid = trim($cache_id, '|'); + if (!$cid) { + return $t; + } + $i = 0; + while (true) { + // determine next delimiter position + $i = strpos($cid, '|', $i); + // add complete CacheID if there are no more delimiters + if ($i === false) { + $t[] = 'IVK#CACHE#' . $cid; + $t[] = 'IVK#CID' . $_name . $cid . $_compile; + $t[] = 'IVK#CID' . $_name . $_compile; + break; + } + $part = substr($cid, 0, $i); + // add slice to list + $t[] = 'IVK#CACHE#' . $part; + $t[] = 'IVK#CID' . $_name . $part . $_compile; + // skip past delimiter position + $i++; + } + return $t; + } + + /** + * Check is cache is locked for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return boolean true or false if cache is locked + */ + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $key = 'LOCK#' . $cached->filepath; + $data = $this->read(array($key)); + return $data && time() - $data[ $key ] < $smarty->locking_timeout; + } + + /** + * Lock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return bool|void + */ + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = true; + $key = 'LOCK#' . $cached->filepath; + $this->write(array($key => time()), $smarty->locking_timeout); + } + + /** + * Unlock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return bool|void + */ + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = false; + $key = 'LOCK#' . $cached->filepath; + $this->delete(array($key)); + } + + /** + * Read values for a set of keys from cache + * + * @param array $keys list of keys to fetch + * + * @return array list of values with the given keys used as indexes + */ + abstract protected function read(array $keys); + + /** + * Save values for a set of keys to cache + * + * @param array $keys list of values to save + * @param int $expire expiration time + * + * @return boolean true on success, false on failure + */ + abstract protected function write(array $keys, $expire = null); + + /** + * Remove values from cache + * + * @param array $keys list of keys to delete + * + * @return boolean true on success, false on failure + */ + abstract protected function delete(array $keys); + + /** + * Remove *all* values from cache + * + * @return boolean true on success, false on failure + */ + protected function purge() + { + return false; + } +} diff --git a/sysplugins/smarty_data.php b/sysplugins/smarty_data.php new file mode 100644 index 0000000000000000000000000000000000000000..2545ed3a853ee574f0eac46733ff3657f8b1846b --- /dev/null +++ b/sysplugins/smarty_data.php @@ -0,0 +1,68 @@ +<?php +/** + * Smarty Plugin Data + * This file contains the data object + * + * @package Smarty + * @subpackage Template + * @author Uwe Tews + */ + +/** + * class for the Smarty data object + * The Smarty data object will hold Smarty variables in the current scope + * + * @package Smarty + * @subpackage Template + */ +class Smarty_Data extends Smarty_Internal_Data +{ + /** + * Counter + * + * @var int + */ + public static $count = 0; + + /** + * Data block name + * + * @var string + */ + public $dataObjectName = ''; + + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + + /** + * create Smarty data object + * + * @param Smarty|array $_parent parent template + * @param Smarty|Smarty_Internal_Template $smarty global smarty instance + * @param string $name optional data block name + * + * @throws SmartyException + */ + public function __construct($_parent = null, $smarty = null, $name = null) + { + parent::__construct(); + self::$count++; + $this->dataObjectName = 'Data_object ' . (isset($name) ? "'{$name}'" : self::$count); + $this->smarty = $smarty; + if (is_object($_parent)) { + // when object set up back pointer + $this->parent = $_parent; + } elseif (is_array($_parent)) { + // set up variable values + foreach ($_parent as $_key => $_val) { + $this->tpl_vars[ $_key ] = new Smarty_Variable($_val); + } + } elseif ($_parent !== null) { + throw new SmartyException('Wrong type for template variables'); + } + } +} diff --git a/sysplugins/smarty_internal_block.php b/sysplugins/smarty_internal_block.php new file mode 100644 index 0000000000000000000000000000000000000000..9956d642ba0662a567f9c4615950ba36f630235c --- /dev/null +++ b/sysplugins/smarty_internal_block.php @@ -0,0 +1,90 @@ +<?php + +/** + * Smarty {block} tag class + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Block +{ + /** + * Block name + * + * @var string + */ + public $name = ''; + + /** + * Hide attribute + * + * @var bool + */ + public $hide = false; + + /** + * Append attribute + * + * @var bool + */ + public $append = false; + + /** + * prepend attribute + * + * @var bool + */ + public $prepend = false; + + /** + * Block calls $smarty.block.child + * + * @var bool + */ + public $callsChild = false; + + /** + * Inheritance child block + * + * @var Smarty_Internal_Block|null + */ + public $child = null; + + /** + * Inheritance calling parent block + * + * @var Smarty_Internal_Block|null + */ + public $parent = null; + + /** + * Inheritance Template index + * + * @var int + */ + public $tplIndex = 0; + + /** + * Smarty_Internal_Block constructor. + * - if outer level {block} of child template ($state === 1) save it as child root block + * - otherwise process inheritance and render + * + * @param string $name block name + * @param int|null $tplIndex index of outer level {block} if nested + */ + public function __construct($name, $tplIndex) + { + $this->name = $name; + $this->tplIndex = $tplIndex; + } + + /** + * Compiled block code overloaded by {block} class + * + * @param \Smarty_Internal_Template $tpl + */ + public function callBlock(Smarty_Internal_Template $tpl) + { + } +} diff --git a/sysplugins/smarty_internal_cacheresource_file.php b/sysplugins/smarty_internal_cacheresource_file.php new file mode 100644 index 0000000000000000000000000000000000000000..61618449da16bb9f59fbdc15c7a41de66fa7aff2 --- /dev/null +++ b/sysplugins/smarty_internal_cacheresource_file.php @@ -0,0 +1,239 @@ +<?php +/** + * Smarty Internal Plugin CacheResource File + * + * @package Smarty + * @subpackage Cacher + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * This class does contain all necessary methods for the HTML cache on file system + * Implements the file system as resource for the HTML cache Version ussing nocache inserts. + * + * @package Smarty + * @subpackage Cacher + */ +class Smarty_Internal_CacheResource_File extends Smarty_CacheResource +{ + /** + * populate Cached Object with meta data from Resource + * + * @param Smarty_Template_Cached $cached cached object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template) + { + $source = &$_template->source; + $smarty = &$_template->smarty; + $_compile_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'; + $_filepath = sha1($source->uid . $smarty->_joined_template_dir); + $cached->filepath = $smarty->getCacheDir(); + if (isset($_template->cache_id)) { + $cached->filepath .= preg_replace( + array( + '![^\w|]+!', + '![|]+!' + ), + array( + '_', + $_compile_dir_sep + ), + $_template->cache_id + ) . $_compile_dir_sep; + } + if (isset($_template->compile_id)) { + $cached->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . $_compile_dir_sep; + } + // if use_sub_dirs, break file into directories + if ($smarty->use_sub_dirs) { + $cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . DIRECTORY_SEPARATOR . $_filepath[ 2 ] . + $_filepath[ 3 ] . + DIRECTORY_SEPARATOR . + $_filepath[ 4 ] . $_filepath[ 5 ] . DIRECTORY_SEPARATOR; + } + $cached->filepath .= $_filepath; + $basename = $source->handler->getBasename($source); + if (!empty($basename)) { + $cached->filepath .= '.' . $basename; + } + if ($smarty->cache_locking) { + $cached->lock_id = $cached->filepath . '.lock'; + } + $cached->filepath .= '.php'; + $cached->timestamp = $cached->exists = is_file($cached->filepath); + if ($cached->exists) { + $cached->timestamp = filemtime($cached->filepath); + } + } + + /** + * populate Cached Object with timestamp and exists from Resource + * + * @param Smarty_Template_Cached $cached cached object + * + * @return void + */ + public function populateTimestamp(Smarty_Template_Cached $cached) + { + $cached->timestamp = $cached->exists = is_file($cached->filepath); + if ($cached->exists) { + $cached->timestamp = filemtime($cached->filepath); + } + } + + /** + * Read the cached template and process its header + * + * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + * @param Smarty_Template_Cached $cached cached object + * @param bool $update flag if called because cache update + * + * @return boolean true or false if the cached content does not exist + */ + public function process( + Smarty_Internal_Template $_smarty_tpl, + Smarty_Template_Cached $cached = null, + $update = false + ) { + $_smarty_tpl->cached->valid = false; + if ($update && defined('HHVM_VERSION')) { + eval('?>' . file_get_contents($_smarty_tpl->cached->filepath)); + return true; + } else { + return @include $_smarty_tpl->cached->filepath; + } + } + + /** + * Write the rendered template output to cache + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * + * @return bool success + * @throws \SmartyException + */ + public function writeCachedContent(Smarty_Internal_Template $_template, $content) + { + if ($_template->smarty->ext->_writeFile->writeFile( + $_template->cached->filepath, + $content, + $_template->smarty + ) === true + ) { + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1 + ) { + opcache_invalidate($_template->cached->filepath, true); + } elseif (function_exists('apc_compile_file')) { + apc_compile_file($_template->cached->filepath); + } + $cached = $_template->cached; + $cached->timestamp = $cached->exists = is_file($cached->filepath); + if ($cached->exists) { + $cached->timestamp = filemtime($cached->filepath); + return true; + } + } + return false; + } + + /** + * Read cached template from cache + * + * @param Smarty_Internal_Template $_template template object + * + * @return string content + */ + public function readCachedContent(Smarty_Internal_Template $_template) + { + if (is_file($_template->cached->filepath)) { + return file_get_contents($_template->cached->filepath); + } + return false; + } + + /** + * Empty cache + * + * @param Smarty $smarty + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return integer number of cache files deleted + */ + public function clearAll(Smarty $smarty, $exp_time = null) + { + return $smarty->ext->_cacheResourceFile->clear($smarty, null, null, null, $exp_time); + } + + /** + * Empty cache for a specific template + * + * @param Smarty $smarty + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return integer number of cache files deleted + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) + { + return $smarty->ext->_cacheResourceFile->clear($smarty, $resource_name, $cache_id, $compile_id, $exp_time); + } + + /** + * Check is cache is locked for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return boolean true or false if cache is locked + */ + public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + if (version_compare(PHP_VERSION, '5.3.0', '>=')) { + clearstatcache(true, $cached->lock_id); + } else { + clearstatcache(); + } + if (is_file($cached->lock_id)) { + $t = filemtime($cached->lock_id); + return $t && (time() - $t < $smarty->locking_timeout); + } else { + return false; + } + } + + /** + * Lock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return bool|void + */ + public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = true; + touch($cached->lock_id); + } + + /** + * Unlock cache for this template + * + * @param Smarty $smarty Smarty object + * @param Smarty_Template_Cached $cached cached object + * + * @return bool|void + */ + public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached) + { + $cached->is_locked = false; + @unlink($cached->lock_id); + } +} diff --git a/sysplugins/smarty_internal_compile_append.php b/sysplugins/smarty_internal_compile_append.php new file mode 100644 index 0000000000000000000000000000000000000000..1a9befbf6c65e4c6303d33930fa8bdd47bafee5d --- /dev/null +++ b/sysplugins/smarty_internal_compile_append.php @@ -0,0 +1,52 @@ +<?php +/** + * Smarty Internal Plugin Compile Append + * Compiles the {append} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Append Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign +{ + /** + * Compiles code for the {append} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // the following must be assigned at runtime because it will be overwritten in parent class + $this->required_attributes = array('var', 'value'); + $this->shorttag_order = array('var', 'value'); + $this->optional_attributes = array('scope', 'index'); + $this->mapCache = array(); + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + // map to compile assign attributes + if (isset($_attr[ 'index' ])) { + $_params[ 'smarty_internal_index' ] = '[' . $_attr[ 'index' ] . ']'; + unset($_attr[ 'index' ]); + } else { + $_params[ 'smarty_internal_index' ] = '[]'; + } + $_new_attr = array(); + foreach ($_attr as $key => $value) { + $_new_attr[] = array($key => $value); + } + // call compile assign + return parent::compile($_new_attr, $compiler, $_params); + } +} diff --git a/sysplugins/smarty_internal_compile_assign.php b/sysplugins/smarty_internal_compile_assign.php new file mode 100644 index 0000000000000000000000000000000000000000..1f0ab9b7d48fdfad32943672743898044c691be5 --- /dev/null +++ b/sysplugins/smarty_internal_compile_assign.php @@ -0,0 +1,96 @@ +<?php +/** + * Smarty Internal Plugin Compile Assign + * Compiles the {assign} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Assign Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('nocache', 'noscope'); + + /** + * Valid scope names + * + * @var array + */ + public $valid_scopes = array( + 'local' => Smarty::SCOPE_LOCAL, 'parent' => Smarty::SCOPE_PARENT, + 'root' => Smarty::SCOPE_ROOT, 'global' => Smarty::SCOPE_GLOBAL, + 'tpl_root' => Smarty::SCOPE_TPL_ROOT, 'smarty' => Smarty::SCOPE_SMARTY + ); + + /** + * Compiles code for the {assign} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // the following must be assigned at runtime because it will be overwritten in Smarty_Internal_Compile_Append + $this->required_attributes = array('var', 'value'); + $this->shorttag_order = array('var', 'value'); + $this->optional_attributes = array('scope'); + $this->mapCache = array(); + $_nocache = false; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + // nocache ? + if ($_var = $compiler->getId($_attr[ 'var' ])) { + $_var = "'{$_var}'"; + } else { + $_var = $_attr[ 'var' ]; + } + if ($compiler->tag_nocache || $compiler->nocache) { + $_nocache = true; + // create nocache var to make it know for further compiling + $compiler->setNocacheInVariable($_attr[ 'var' ]); + } + // scope setup + if ($_attr[ 'noscope' ]) { + $_scope = -1; + } else { + $_scope = $compiler->convertScope($_attr, $this->valid_scopes); + } + // optional parameter + $_params = ''; + if ($_nocache || $_scope) { + $_params .= ' ,' . var_export($_nocache, true); + } + if ($_scope) { + $_params .= ' ,' . $_scope; + } + if (isset($parameter[ 'smarty_internal_index' ])) { + $output = + "<?php \$_tmp_array = isset(\$_smarty_tpl->tpl_vars[{$_var}]) ? \$_smarty_tpl->tpl_vars[{$_var}]->value : array();\n"; + $output .= "if (!(is_array(\$_tmp_array) || \$_tmp_array instanceof ArrayAccess)) {\n"; + $output .= "settype(\$_tmp_array, 'array');\n"; + $output .= "}\n"; + $output .= "\$_tmp_array{$parameter['smarty_internal_index']} = {$_attr['value']};\n"; + $output .= "\$_smarty_tpl->_assignInScope({$_var}, \$_tmp_array{$_params});?>"; + } else { + $output = "<?php \$_smarty_tpl->_assignInScope({$_var}, {$_attr['value']}{$_params});?>"; + } + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_block.php b/sysplugins/smarty_internal_compile_block.php new file mode 100644 index 0000000000000000000000000000000000000000..8ff15d8e5bc7b0b3dabf57da3455b0b5ffb3e718 --- /dev/null +++ b/sysplugins/smarty_internal_compile_block.php @@ -0,0 +1,189 @@ +<?php +/** + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Block Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inheritance +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('hide', 'nocache'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + + /** + * Compiles code for the {block} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + if (!isset($compiler->_cache[ 'blockNesting' ])) { + $compiler->_cache[ 'blockNesting' ] = 0; + } + if ($compiler->_cache[ 'blockNesting' ] === 0) { + // make sure that inheritance gets initialized in template code + $this->registerInit($compiler); + $this->option_flags = array('hide', 'nocache', 'append', 'prepend'); + } else { + $this->option_flags = array('hide', 'nocache'); + } + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + ++$compiler->_cache[ 'blockNesting' ]; + $_className = 'Block_' . preg_replace('![^\w]+!', '_', uniqid(mt_rand(), true)); + $compiler->_cache[ 'blockName' ][ $compiler->_cache[ 'blockNesting' ] ] = $_attr[ 'name' ]; + $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ] = $_className; + $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ] = array(); + $compiler->_cache[ 'blockParams' ][ 1 ][ 'subBlocks' ][ trim($_attr[ 'name' ], '"\'') ][] = $_className; + $this->openTag( + $compiler, + 'block', + array( + $_attr, $compiler->nocache, $compiler->parser->current_buffer, + $compiler->template->compiled->has_nocache_code, + $compiler->template->caching + ) + ); + $compiler->saveRequiredPlugins(true); + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); + $compiler->template->compiled->has_nocache_code = false; + $compiler->suppressNocacheProcessing = true; + } +} + +/** + * Smarty Internal Plugin Compile BlockClose Class + */ +class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_Inheritance +{ + /** + * Compiles code for the {/block} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return bool true + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + list($_attr, $_nocache, $_buffer, $_has_nocache_code, $_caching) = $this->closeTag($compiler, array('block')); + // init block parameter + $_block = $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ]; + unset($compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ]); + $_name = $_attr[ 'name' ]; + $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null; + unset($_attr[ 'assign' ], $_attr[ 'name' ]); + foreach ($_attr as $name => $stat) { + if ((is_bool($stat) && $stat !== false) || (!is_bool($stat) && $stat !== 'false')) { + $_block[ $name ] = 'true'; + } + } + $_className = $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ]; + // get compiled block code + $_functionCode = $compiler->parser->current_buffer; + // setup buffer for template function code + $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); + $output = "<?php\n"; + $output .= "/* {block {$_name}} */\n"; + $output .= "class {$_className} extends Smarty_Internal_Block\n"; + $output .= "{\n"; + foreach ($_block as $property => $value) { + $output .= "public \${$property} = " . var_export($value, true) . ";\n"; + } + $output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n"; + $output .= $compiler->compileRequiredPlugins(); + $compiler->restoreRequiredPlugins(); + if ($compiler->template->compiled->has_nocache_code) { + $output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n"; + } + if (isset($_assign)) { + $output .= "ob_start();\n"; + } + $output .= "?>\n"; + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $output + ) + ); + $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode); + $output = "<?php\n"; + if (isset($_assign)) { + $output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n"; + } + $output .= "}\n"; + $output .= "}\n"; + $output .= "/* {/block {$_name}} */\n\n"; + $output .= "?>\n"; + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $output + ) + ); + $compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser); + $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); + // restore old status + $compiler->template->compiled->has_nocache_code = $_has_nocache_code; + $compiler->tag_nocache = $compiler->nocache; + $compiler->nocache = $_nocache; + $compiler->parser->current_buffer = $_buffer; + $output = "<?php \n"; + if ($compiler->_cache[ 'blockNesting' ] === 1) { + $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name);\n"; + } else { + $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name, \$this->tplIndex);\n"; + } + $output .= "?>\n"; + --$compiler->_cache[ 'blockNesting' ]; + if ($compiler->_cache[ 'blockNesting' ] === 0) { + unset($compiler->_cache[ 'blockNesting' ]); + } + $compiler->has_code = true; + $compiler->suppressNocacheProcessing = true; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_block_child.php b/sysplugins/smarty_internal_compile_block_child.php new file mode 100644 index 0000000000000000000000000000000000000000..588d18628adc56ed4b74836971d9650ca510f6d0 --- /dev/null +++ b/sysplugins/smarty_internal_compile_block_child.php @@ -0,0 +1,24 @@ +<?php +/** + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Block Child Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Block_Child extends Smarty_Internal_Compile_Child +{ + /** + * Tag name + * + * @var string + */ + public $tag = 'block_child'; +} diff --git a/sysplugins/smarty_internal_compile_block_parent.php b/sysplugins/smarty_internal_compile_block_parent.php new file mode 100644 index 0000000000000000000000000000000000000000..97f11ca43a3a0a811505cfd867ef46a165015770 --- /dev/null +++ b/sysplugins/smarty_internal_compile_block_parent.php @@ -0,0 +1,31 @@ +<?php +/** + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Block Parent Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Block_Parent extends Smarty_Internal_Compile_Child +{ + /** + * Tag name + * + * @var string + */ + public $tag = 'block_parent'; + + /** + * Block type + * + * @var string + */ + public $blockType = 'Parent'; +} diff --git a/sysplugins/smarty_internal_compile_break.php b/sysplugins/smarty_internal_compile_break.php new file mode 100644 index 0000000000000000000000000000000000000000..1ee8d75d7eef13717c2c4db6bb264ac1edc016a3 --- /dev/null +++ b/sysplugins/smarty_internal_compile_break.php @@ -0,0 +1,117 @@ +<?php +/** + * Smarty Internal Plugin Compile Break + * Compiles the {break} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Break Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('levels'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('levels'); + + /** + * Tag name may be overloaded by Smarty_Internal_Compile_Continue + * + * @var string + */ + public $tag = 'break'; + + /** + * Compiles code for the {break} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + list($levels, $foreachLevels) = $this->checkLevels($args, $compiler); + $output = "<?php "; + if ($foreachLevels > 0 && $this->tag === 'continue') { + $foreachLevels--; + } + if ($foreachLevels > 0) { + /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */ + $foreachCompiler = $compiler->getTagCompiler('foreach'); + $output .= $foreachCompiler->compileRestore($foreachLevels); + } + $output .= "{$this->tag} {$levels};?>"; + return $output; + } + + /** + * check attributes and return array of break and foreach levels + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return array + * @throws \SmartyCompilerException + */ + public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true); + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr[ 'nocache' ] === true) { + $compiler->trigger_template_error('nocache option not allowed', null, true); + } + if (isset($_attr[ 'levels' ])) { + if (!is_numeric($_attr[ 'levels' ])) { + $compiler->trigger_template_error('level attribute must be a numeric constant', null, true); + } + $levels = $_attr[ 'levels' ]; + } else { + $levels = 1; + } + $level_count = $levels; + $stack_count = count($compiler->_tag_stack) - 1; + $foreachLevels = 0; + $lastTag = ''; + while ($level_count > 0 && $stack_count >= 0) { + if (isset($_is_loopy[ $compiler->_tag_stack[ $stack_count ][ 0 ] ])) { + $lastTag = $compiler->_tag_stack[ $stack_count ][ 0 ]; + if ($level_count === 0) { + break; + } + $level_count--; + if ($compiler->_tag_stack[ $stack_count ][ 0 ] === 'foreach') { + $foreachLevels++; + } + } + $stack_count--; + } + if ($level_count !== 0) { + $compiler->trigger_template_error("cannot {$this->tag} {$levels} level(s)", null, true); + } + if ($lastTag === 'foreach' && $this->tag === 'break' && $foreachLevels > 0) { + $foreachLevels--; + } + return array($levels, $foreachLevels); + } +} diff --git a/sysplugins/smarty_internal_compile_call.php b/sysplugins/smarty_internal_compile_call.php new file mode 100644 index 0000000000000000000000000000000000000000..445cabc60d01ef00ea0ef7f74b0a8393abfb2b64 --- /dev/null +++ b/sysplugins/smarty_internal_compile_call.php @@ -0,0 +1,89 @@ +<?php +/** + * Smarty Internal Plugin Compile Function_Call + * Compiles the calls of user defined tags defined by {function} + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Function_Call Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles the calls of user defined tags defined by {function} + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + // save possible attributes + if (isset($_attr[ 'assign' ])) { + // output will be stored in a smarty variable instead of being displayed + $_assign = $_attr[ 'assign' ]; + } + //$_name = trim($_attr['name'], "''"); + $_name = $_attr[ 'name' ]; + unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'nocache' ]); + // set flag (compiled code of {function} must be included in cache file + if (!$compiler->template->caching || $compiler->nocache || $compiler->tag_nocache) { + $_nocache = 'true'; + } else { + $_nocache = 'false'; + } + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $_params = 'array(' . implode(',', $_paramsArray) . ')'; + //$compiler->suppressNocacheProcessing = true; + // was there an assign attribute + if (isset($_assign)) { + $_output = + "<?php ob_start();\n\$_smarty_tpl->smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});\n\$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n"; + } else { + $_output = + "<?php \$_smarty_tpl->smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});?>\n"; + } + return $_output; + } +} diff --git a/sysplugins/smarty_internal_compile_capture.php b/sysplugins/smarty_internal_compile_capture.php new file mode 100644 index 0000000000000000000000000000000000000000..a4ffbc9ea7abbcd1e2353a6d607bc1bd7f312421 --- /dev/null +++ b/sysplugins/smarty_internal_compile_capture.php @@ -0,0 +1,105 @@ +<?php +/** + * Smarty Internal Plugin Compile Capture + * Compiles the {capture} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Capture Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('name', 'assign', 'append'); + + /** + * Compiles code for the {$smarty.capture.xxx} + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + */ + public static function compileSpecialVariable( + $args, + Smarty_Internal_TemplateCompilerBase $compiler, + $parameter = null + ) { + return '$_smarty_tpl->smarty->ext->_capture->getBuffer($_smarty_tpl' . + (isset($parameter[ 1 ]) ? ", {$parameter[ 1 ]})" : ')'); + } + + /** + * Compiles code for the {capture} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param null $parameter + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter = null) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args, $parameter, 'capture'); + $buffer = isset($_attr[ 'name' ]) ? $_attr[ 'name' ] : "'default'"; + $assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : 'null'; + $append = isset($_attr[ 'append' ]) ? $_attr[ 'append' ] : 'null'; + $compiler->_cache[ 'capture_stack' ][] = array($compiler->nocache); + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + $_output = "<?php \$_smarty_tpl->smarty->ext->_capture->open(\$_smarty_tpl, $buffer, $assign, $append);?>"; + return $_output; + } +} + +/** + * Smarty Internal Plugin Compile Captureclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/capture} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param null $parameter + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args, $parameter, '/capture'); + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + list($compiler->nocache) = array_pop($compiler->_cache[ 'capture_stack' ]); + return "<?php \$_smarty_tpl->smarty->ext->_capture->close(\$_smarty_tpl);?>"; + } +} diff --git a/sysplugins/smarty_internal_compile_child.php b/sysplugins/smarty_internal_compile_child.php new file mode 100644 index 0000000000000000000000000000000000000000..f728c18bf7e70c00cd83efff1feab468a84e731f --- /dev/null +++ b/sysplugins/smarty_internal_compile_child.php @@ -0,0 +1,79 @@ +<?php +/** + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Child Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Child extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + + /** + * Tag name + * + * @var string + */ + public $tag = 'child'; + + /** + * Block type + * + * @var string + */ + public $blockType = 'Child'; + + /** + * Compiles code for the {child} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $tag = isset($parameter[ 0 ]) ? "'{$parameter[0]}'" : "'{{$this->tag}}'"; + if (!isset($compiler->_cache[ 'blockNesting' ])) { + $compiler->trigger_template_error( + "{$tag} used outside {block} tags ", + $compiler->parser->lex->taglineno + ); + } + $compiler->has_code = true; + $compiler->suppressNocacheProcessing = true; + if ($this->blockType === 'Child') { + $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ][ 'callsChild' ] = 'true'; + } + $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null; + $output = "<?php \n"; + if (isset($_assign)) { + $output .= "ob_start();\n"; + } + $output .= '$_smarty_tpl->inheritance->call' . $this->blockType . '($_smarty_tpl, $this' . + ($this->blockType === 'Child' ? '' : ", {$tag}") . ");\n"; + if (isset($_assign)) { + $output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n"; + } + $output .= "?>\n"; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_config_load.php b/sysplugins/smarty_internal_compile_config_load.php new file mode 100644 index 0000000000000000000000000000000000000000..8fe64ee10f088a870367cb0fd57e65404657783e --- /dev/null +++ b/sysplugins/smarty_internal_compile_config_load.php @@ -0,0 +1,96 @@ +<?php +/** + * Smarty Internal Plugin Compile Config Load + * Compiles the {config load} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Config Load Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('file'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('file', 'section'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('section', 'scope'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('nocache', 'noscope'); + + /** + * Valid scope names + * + * @var array + */ + public $valid_scopes = array( + 'local' => Smarty::SCOPE_LOCAL, 'parent' => Smarty::SCOPE_PARENT, + 'root' => Smarty::SCOPE_ROOT, 'tpl_root' => Smarty::SCOPE_TPL_ROOT, + 'smarty' => Smarty::SCOPE_SMARTY, 'global' => Smarty::SCOPE_SMARTY + ); + + /** + * Compiles code for the {config_load} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr[ 'nocache' ] === true) { + $compiler->trigger_template_error('nocache option not allowed', null, true); + } + // save possible attributes + $conf_file = $_attr[ 'file' ]; + if (isset($_attr[ 'section' ])) { + $section = $_attr[ 'section' ]; + } else { + $section = 'null'; + } + // scope setup + if ($_attr[ 'noscope' ]) { + $_scope = -1; + } else { + $_scope = $compiler->convertScope($_attr, $this->valid_scopes); + } + // create config object + $_output = + "<?php\n\$_smarty_tpl->smarty->ext->configLoad->_loadConfigFile(\$_smarty_tpl, {$conf_file}, {$section}, {$_scope});\n?>\n"; + return $_output; + } +} diff --git a/sysplugins/smarty_internal_compile_continue.php b/sysplugins/smarty_internal_compile_continue.php new file mode 100644 index 0000000000000000000000000000000000000000..e545728ee8c5311fa432538113f5cefd86e79fc8 --- /dev/null +++ b/sysplugins/smarty_internal_compile_continue.php @@ -0,0 +1,25 @@ +<?php +/** + * Smarty Internal Plugin Compile Continue + * Compiles the {continue} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Continue Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Continue extends Smarty_Internal_Compile_Break +{ + /** + * Tag name + * + * @var string + */ + public $tag = 'continue'; +} diff --git a/sysplugins/smarty_internal_compile_debug.php b/sysplugins/smarty_internal_compile_debug.php new file mode 100644 index 0000000000000000000000000000000000000000..7994166890483d5e3a668d7240bd5a33dbe9c752 --- /dev/null +++ b/sysplugins/smarty_internal_compile_debug.php @@ -0,0 +1,40 @@ +<?php +/** + * Smarty Internal Plugin Compile Debug + * Compiles the {debug} tag. + * It opens a window the the Smarty Debugging Console. + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Debug Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {debug} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + // compile always as nocache + $compiler->tag_nocache = true; + // display debug template + $_output = + "<?php \$_smarty_debug = new Smarty_Internal_Debug;\n \$_smarty_debug->display_debug(\$_smarty_tpl);\n"; + $_output .= "unset(\$_smarty_debug);\n?>"; + return $_output; + } +} diff --git a/sysplugins/smarty_internal_compile_eval.php b/sysplugins/smarty_internal_compile_eval.php new file mode 100644 index 0000000000000000000000000000000000000000..8e0174e3ebca4751be0a3934e5567e8be4020b0a --- /dev/null +++ b/sysplugins/smarty_internal_compile_eval.php @@ -0,0 +1,70 @@ +<?php +/** + * Smarty Internal Plugin Compile Eval + * Compiles the {eval} tag. + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Eval Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('var'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('var', 'assign'); + + /** + * Compiles code for the {eval} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if (isset($_attr[ 'assign' ])) { + // output will be stored in a smarty variable instead of being displayed + $_assign = $_attr[ 'assign' ]; + } + // create template object + $_output = + "\$_template = new {$compiler->smarty->template_class}('eval:'.{$_attr[ 'var' ]}, \$_smarty_tpl->smarty, \$_smarty_tpl);"; + //was there an assign attribute? + if (isset($_assign)) { + $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());"; + } else { + $_output .= 'echo $_template->fetch();'; + } + return "<?php $_output ?>"; + } +} diff --git a/sysplugins/smarty_internal_compile_extends.php b/sysplugins/smarty_internal_compile_extends.php new file mode 100644 index 0000000000000000000000000000000000000000..d72d2b76f0476913f0614467e9bea613d9fbb095 --- /dev/null +++ b/sysplugins/smarty_internal_compile_extends.php @@ -0,0 +1,158 @@ +<?php +/** + * Smarty Internal Plugin Compile extend + * Compiles the {extends} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile extend Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inheritance +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('file'); + + /** + * Array of names of optional attribute required by tag + * use array('_any') if there is no restriction of attributes names + * + * @var array + */ + public $optional_attributes = array('extends_resource'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('file'); + + /** + * Compiles code for the {extends} tag extends: resource + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr[ 'nocache' ] === true) { + $compiler->trigger_template_error('nocache option not allowed', $compiler->parser->lex->line - 1); + } + if (strpos($_attr[ 'file' ], '$_tmp') !== false) { + $compiler->trigger_template_error('illegal value for file attribute', $compiler->parser->lex->line - 1); + } + // add code to initialize inheritance + $this->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' ]); + } + $compiler->has_code = false; + return ''; + } + + /** + * Add code for inheritance endChild() method to end of template + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param null|string $template optional inheritance parent template + * + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + private function compileEndChild(Smarty_Internal_TemplateCompilerBase $compiler, $template = null) + { + $inlineUids = ''; + if (isset($template) && $compiler->smarty->merge_compiled_includes) { + $code = $compiler->compileTag('include', array($template, array('scope' => 'parent'))); + if (preg_match('/([,][\s]*[\'][a-z0-9]+[\'][,][\s]*[\']content.*[\'])[)]/', $code, $match)) { + $inlineUids = $match[ 1 ]; + } + } + $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + '<?php $_smarty_tpl->inheritance->endChild($_smarty_tpl' . + (isset($template) ? + ", {$template}{$inlineUids}" : + '') . ");\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/sysplugins/smarty_internal_compile_for.php b/sysplugins/smarty_internal_compile_for.php new file mode 100644 index 0000000000000000000000000000000000000000..3f113e56d58c00e7ffa6f7f2f2ee3cc81da97168 --- /dev/null +++ b/sysplugins/smarty_internal_compile_for.php @@ -0,0 +1,164 @@ +<?php +/** + * Smarty Internal Plugin Compile For + * Compiles the {for} {forelse} {/for} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile For Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {for} tag + * Smarty 3 does implement two different syntax's: + * - {for $var in $array} + * For looping over arrays or iterators + * - {for $x=0; $x<$y; $x++} + * For general loops + * The parser is generating different sets of attribute by which this compiler can + * determine which syntax is used. + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + */ + public function compile($args, $compiler, $parameter) + { + $compiler->loopNesting++; + if ($parameter === 0) { + $this->required_attributes = array('start', 'to'); + $this->optional_attributes = array('max', 'step'); + } else { + $this->required_attributes = array('start', 'ifexp', 'var', 'step'); + $this->optional_attributes = array(); + } + $this->mapCache = array(); + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $output = "<?php\n"; + if ($parameter === 1) { + foreach ($_attr[ 'start' ] as $_statement) { + if (is_array($_statement[ 'var' ])) { + $var = $_statement[ 'var' ][ 'var' ]; + $index = $_statement[ 'var' ][ 'smarty_internal_index' ]; + } else { + $var = $_statement[ 'var' ]; + $index = ''; + } + $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable(null, \$_smarty_tpl->isRenderingCache);\n"; + $output .= "\$_smarty_tpl->tpl_vars[$var]->value{$index} = {$_statement['value']};\n"; + } + if (is_array($_attr[ 'var' ])) { + $var = $_attr[ 'var' ][ 'var' ]; + $index = $_attr[ 'var' ][ 'smarty_internal_index' ]; + } else { + $var = $_attr[ 'var' ]; + $index = ''; + } + $output .= "if ($_attr[ifexp]) {\nfor (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$var]->value{$index}$_attr[step]) {\n"; + } else { + $_statement = $_attr[ 'start' ]; + if (is_array($_statement[ 'var' ])) { + $var = $_statement[ 'var' ][ 'var' ]; + $index = $_statement[ 'var' ][ 'smarty_internal_index' ]; + } else { + $var = $_statement[ 'var' ]; + $index = ''; + } + $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable(null, \$_smarty_tpl->isRenderingCache);"; + if (isset($_attr[ 'step' ])) { + $output .= "\$_smarty_tpl->tpl_vars[$var]->step = $_attr[step];"; + } else { + $output .= "\$_smarty_tpl->tpl_vars[$var]->step = 1;"; + } + if (isset($_attr[ 'max' ])) { + $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) min(ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step)),$_attr[max]);\n"; + } else { + $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step));\n"; + } + $output .= "if (\$_smarty_tpl->tpl_vars[$var]->total > 0) {\n"; + $output .= "for (\$_smarty_tpl->tpl_vars[$var]->value{$index} = $_statement[value], \$_smarty_tpl->tpl_vars[$var]->iteration = 1;\$_smarty_tpl->tpl_vars[$var]->iteration <= \$_smarty_tpl->tpl_vars[$var]->total;\$_smarty_tpl->tpl_vars[$var]->value{$index} += \$_smarty_tpl->tpl_vars[$var]->step, \$_smarty_tpl->tpl_vars[$var]->iteration++) {\n"; + $output .= "\$_smarty_tpl->tpl_vars[$var]->first = \$_smarty_tpl->tpl_vars[$var]->iteration === 1;"; + $output .= "\$_smarty_tpl->tpl_vars[$var]->last = \$_smarty_tpl->tpl_vars[$var]->iteration === \$_smarty_tpl->tpl_vars[$var]->total;"; + } + $output .= '?>'; + $this->openTag($compiler, 'for', array('for', $compiler->nocache)); + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + // return compiled code + return $output; + } +} + +/** + * Smarty Internal Plugin Compile Forelse Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {forelse} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + */ + public function compile($args, $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + list($openTag, $nocache) = $this->closeTag($compiler, array('for')); + $this->openTag($compiler, 'forelse', array('forelse', $nocache)); + return "<?php }} else { ?>"; + } +} + +/** + * Smarty Internal Plugin Compile Forclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/for} tag + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + */ + public function compile($args, $compiler, $parameter) + { + $compiler->loopNesting--; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse')); + $output = "<?php }\n"; + if ($openTag !== 'forelse') { + $output .= "}\n"; + } + $output .= "?>"; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_foreach.php b/sysplugins/smarty_internal_compile_foreach.php new file mode 100644 index 0000000000000000000000000000000000000000..a68da5409f3630c2596e5e0c0ad672d7bc27ca93 --- /dev/null +++ b/sysplugins/smarty_internal_compile_foreach.php @@ -0,0 +1,343 @@ +<?php +/** + * Smarty Internal Plugin Compile Foreach + * Compiles the {foreach} {foreachelse} {/foreach} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Foreach Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_ForeachSection +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('from', 'item'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('name', 'key', 'properties'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('from', 'item', 'key', 'name'); + + /** + * counter + * + * @var int + */ + public $counter = 0; + + /** + * Name of this tag + * + * @var string + */ + public $tagName = 'foreach'; + + /** + * Valid properties of $smarty.foreach.name.xxx variable + * + * @var array + */ + public $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total'); + + /** + * Valid properties of $item@xxx variable + * + * @var array + */ + public $itemProperties = array('first', 'last', 'index', 'iteration', 'show', 'total', 'key'); + + /** + * Flag if tag had name attribute + * + * @var bool + */ + public $isNamed = false; + + /** + * Compiles code for the {foreach} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting++; + // init + $this->isNamed = false; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $from = $_attr[ 'from' ]; + $item = $compiler->getId($_attr[ 'item' ]); + if ($item === false) { + $item = $compiler->getVariableName($_attr[ 'item' ]); + } + $key = $name = null; + $attributes = array('item' => $item); + if (isset($_attr[ 'key' ])) { + $key = $compiler->getId($_attr[ 'key' ]); + if ($key === false) { + $key = $compiler->getVariableName($_attr[ 'key' ]); + } + $attributes[ 'key' ] = $key; + } + if (isset($_attr[ 'name' ])) { + $this->isNamed = true; + $name = $attributes[ 'name' ] = $compiler->getId($_attr[ 'name' ]); + } + foreach ($attributes as $a => $v) { + if ($v === false) { + $compiler->trigger_template_error("'{$a}' attribute/variable has illegal value", null, true); + } + } + $fromName = $compiler->getVariableName($_attr[ 'from' ]); + if ($fromName) { + foreach (array('item', 'key') as $a) { + if (isset($attributes[ $a ]) && $attributes[ $a ] === $fromName) { + $compiler->trigger_template_error( + "'{$a}' and 'from' may not have same variable name '{$fromName}'", + null, + true + ); + } + } + } + $itemVar = "\$_smarty_tpl->tpl_vars['{$item}']"; + $local = '$__foreach_' . $attributes[ 'item' ] . '_' . $this->counter++ . '_'; + // search for used tag attributes + $itemAttr = array(); + $namedAttr = array(); + $this->scanForProperties($attributes, $compiler); + if (!empty($this->matchResults[ 'item' ])) { + $itemAttr = $this->matchResults[ 'item' ]; + } + if (!empty($this->matchResults[ 'named' ])) { + $namedAttr = $this->matchResults[ 'named' ]; + } + if (isset($_attr[ 'properties' ]) && preg_match_all('/[\'](.*?)[\']/', $_attr[ 'properties' ], $match)) { + foreach ($match[ 1 ] as $prop) { + if (in_array($prop, $this->itemProperties)) { + $itemAttr[ $prop ] = true; + } else { + $compiler->trigger_template_error("Invalid property '{$prop}'", null, true); + } + } + if ($this->isNamed) { + foreach ($match[ 1 ] as $prop) { + if (in_array($prop, $this->nameProperties)) { + $nameAttr[ $prop ] = true; + } else { + $compiler->trigger_template_error("Invalid property '{$prop}'", null, true); + } + } + } + } + if (isset($itemAttr[ 'first' ])) { + $itemAttr[ 'index' ] = true; + } + if (isset($namedAttr[ 'first' ])) { + $namedAttr[ 'index' ] = true; + } + if (isset($namedAttr[ 'last' ])) { + $namedAttr[ 'iteration' ] = true; + $namedAttr[ 'total' ] = true; + } + if (isset($itemAttr[ 'last' ])) { + $itemAttr[ 'iteration' ] = true; + $itemAttr[ 'total' ] = true; + } + if (isset($namedAttr[ 'show' ])) { + $namedAttr[ 'total' ] = true; + } + if (isset($itemAttr[ 'show' ])) { + $itemAttr[ 'total' ] = true; + } + $keyTerm = ''; + if (isset($attributes[ 'key' ])) { + $keyTerm = "\$_smarty_tpl->tpl_vars['{$key}']->value => "; + } + if (isset($itemAttr[ 'key' ])) { + $keyTerm = "{$itemVar}->key => "; + } + if ($this->isNamed) { + $foreachVar = "\$_smarty_tpl->tpl_vars['__smarty_foreach_{$attributes['name']}']"; + } + $needTotal = isset($itemAttr[ 'total' ]); + // Register tag + $this->openTag( + $compiler, + 'foreach', + array('foreach', $compiler->nocache, $local, $itemVar, empty($itemAttr) ? 1 : 2) + ); + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + // generate output code + $output = "<?php\n"; + $output .= "\$_from = \$_smarty_tpl->smarty->ext->_foreach->init(\$_smarty_tpl, $from, " . + var_export($item, true); + if ($name || $needTotal || $key) { + $output .= ', ' . var_export($needTotal, true); + } + if ($name || $key) { + $output .= ', ' . var_export($key, true); + } + if ($name) { + $output .= ', ' . var_export($name, true) . ', ' . var_export($namedAttr, true); + } + $output .= ");\n"; + if (isset($itemAttr[ 'show' ])) { + $output .= "{$itemVar}->show = ({$itemVar}->total > 0);\n"; + } + if (isset($itemAttr[ 'iteration' ])) { + $output .= "{$itemVar}->iteration = 0;\n"; + } + if (isset($itemAttr[ 'index' ])) { + $output .= "{$itemVar}->index = -1;\n"; + } + $output .= "{$itemVar}->do_else = true;\n"; + $output .= "if (\$_from !== null) foreach (\$_from as {$keyTerm}{$itemVar}->value) {\n"; + $output .= "{$itemVar}->do_else = false;\n"; + if (isset($attributes[ 'key' ]) && isset($itemAttr[ 'key' ])) { + $output .= "\$_smarty_tpl->tpl_vars['{$key}']->value = {$itemVar}->key;\n"; + } + if (isset($itemAttr[ 'iteration' ])) { + $output .= "{$itemVar}->iteration++;\n"; + } + if (isset($itemAttr[ 'index' ])) { + $output .= "{$itemVar}->index++;\n"; + } + if (isset($itemAttr[ 'first' ])) { + $output .= "{$itemVar}->first = !{$itemVar}->index;\n"; + } + if (isset($itemAttr[ 'last' ])) { + $output .= "{$itemVar}->last = {$itemVar}->iteration === {$itemVar}->total;\n"; + } + if (isset($foreachVar)) { + if (isset($namedAttr[ 'iteration' ])) { + $output .= "{$foreachVar}->value['iteration']++;\n"; + } + if (isset($namedAttr[ 'index' ])) { + $output .= "{$foreachVar}->value['index']++;\n"; + } + if (isset($namedAttr[ 'first' ])) { + $output .= "{$foreachVar}->value['first'] = !{$foreachVar}->value['index'];\n"; + } + if (isset($namedAttr[ 'last' ])) { + $output .= "{$foreachVar}->value['last'] = {$foreachVar}->value['iteration'] === {$foreachVar}->value['total'];\n"; + } + } + if (!empty($itemAttr)) { + $output .= "{$local}saved = {$itemVar};\n"; + } + $output .= '?>'; + return $output; + } + + /** + * Compiles code for to restore saved template variables + * + * @param int $levels number of levels to restore + * + * @return string compiled code + */ + public function compileRestore($levels) + { + return "\$_smarty_tpl->smarty->ext->_foreach->restore(\$_smarty_tpl, {$levels});"; + } +} + +/** + * Smarty Internal Plugin Compile Foreachelse Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {foreachelse} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + list($openTag, $nocache, $local, $itemVar, $restore) = $this->closeTag($compiler, array('foreach')); + $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $local, $itemVar, 0)); + $output = "<?php\n"; + if ($restore === 2) { + $output .= "{$itemVar} = {$local}saved;\n"; + } + $output .= "}\nif ({$itemVar}->do_else) {\n?>"; + return $output; + } +} + +/** + * Smarty Internal Plugin Compile Foreachclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/foreach} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting--; + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + list( + $openTag, $compiler->nocache, $local, $itemVar, $restore + ) = $this->closeTag($compiler, array('foreach', 'foreachelse')); + $output = "<?php\n"; + if ($restore === 2) { + $output .= "{$itemVar} = {$local}saved;\n"; + } + $output .= "}\n"; + /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */ + $foreachCompiler = $compiler->getTagCompiler('foreach'); + $output .= $foreachCompiler->compileRestore(1); + $output .= "?>"; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_function.php b/sysplugins/smarty_internal_compile_function.php new file mode 100644 index 0000000000000000000000000000000000000000..6e408ca724cc2c3ba0777b454d2759b00de20eab --- /dev/null +++ b/sysplugins/smarty_internal_compile_function.php @@ -0,0 +1,231 @@ +<?php +/** + * Smarty Internal Plugin Compile Function + * Compiles the {function} {/function} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Function Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles code for the {function} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return bool true + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($_attr[ 'nocache' ] === true) { + $compiler->trigger_template_error('nocache option not allowed', null, true); + } + unset($_attr[ 'nocache' ]); + $_name = trim($_attr[ 'name' ], '\'"'); + $compiler->parent_compiler->tpl_function[ $_name ] = array(); + $save = array( + $_attr, $compiler->parser->current_buffer, $compiler->template->compiled->has_nocache_code, + $compiler->template->caching + ); + $this->openTag($compiler, 'function', $save); + // Init temporary context + $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); + $compiler->template->compiled->has_nocache_code = false; + $compiler->saveRequiredPlugins(true); + return true; + } +} + +/** + * Smarty Internal Plugin Compile Functionclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase +{ + /** + * Compiler object + * + * @var object + */ + private $compiler = null; + + /** + * Compiles code for the {/function} tag + * + * @param array $args array with attributes from parser + * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return bool true + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->compiler = $compiler; + $saved_data = $this->closeTag($compiler, array('function')); + $_attr = $saved_data[ 0 ]; + $_name = trim($_attr[ 'name' ], '\'"'); + $compiler->parent_compiler->tpl_function[ $_name ][ 'compiled_filepath' ] = + $compiler->parent_compiler->template->compiled->filepath; + $compiler->parent_compiler->tpl_function[ $_name ][ 'uid' ] = $compiler->template->source->uid; + $_parameter = $_attr; + unset($_parameter[ 'name' ]); + // default parameter + $_paramsArray = array(); + foreach ($_parameter as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + if (!empty($_paramsArray)) { + $_params = 'array(' . implode(',', $_paramsArray) . ')'; + $_paramsCode = "\$params = array_merge($_params, \$params);\n"; + } else { + $_paramsCode = ''; + } + $_functionCode = $compiler->parser->current_buffer; + // setup buffer for template function code + $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); + $_funcName = "smarty_template_function_{$_name}_{$compiler->template->compiled->nocache_hash}"; + $_funcNameCaching = $_funcName . '_nocache'; + if ($compiler->template->compiled->has_nocache_code) { + $compiler->parent_compiler->tpl_function[ $_name ][ 'call_name_caching' ] = $_funcNameCaching; + $output = "<?php\n"; + $output .= "/* {$_funcNameCaching} */\n"; + $output .= "if (!function_exists('{$_funcNameCaching}')) {\n"; + $output .= "function {$_funcNameCaching} (Smarty_Internal_Template \$_smarty_tpl,\$params) {\n"; + $output .= "ob_start();\n"; + $output .= $compiler->compileRequiredPlugins(); + $output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n"; + $output .= $_paramsCode; + $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n"; + $output .= "\$params = var_export(\$params, true);\n"; + $output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php "; + $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value, \\\$_smarty_tpl->isRenderingCache);\n}\n?>"; + $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";?>"; + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $output + ) + ); + $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode); + $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php "; + $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n"; + $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";\n?>"; + $output .= "<?php echo str_replace('{$compiler->template->compiled->nocache_hash}', \$_smarty_tpl->compiled->nocache_hash, ob_get_clean());\n"; + $output .= "}\n}\n"; + $output .= "/*/ {$_funcName}_nocache */\n\n"; + $output .= "?>\n"; + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $output + ) + ); + $_functionCode = new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + preg_replace_callback( + "/((<\?php )?echo '\/\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/([\S\s]*?)\/\*\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/", + array($this, 'removeNocache'), + $_functionCode->to_smarty_php($compiler->parser) + ) + ); + } + $compiler->parent_compiler->tpl_function[ $_name ][ 'call_name' ] = $_funcName; + $output = "<?php\n"; + $output .= "/* {$_funcName} */\n"; + $output .= "if (!function_exists('{$_funcName}')) {\n"; + $output .= "function {$_funcName}(Smarty_Internal_Template \$_smarty_tpl,\$params) {\n"; + $output .= $_paramsCode; + $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n"; + $output .= $compiler->compileCheckPlugins(array_merge($compiler->required_plugins[ 'compiled' ], + $compiler->required_plugins[ 'nocache' ])); + $output .= "?>\n"; + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $output + ) + ); + $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode); + $output = "<?php\n}}\n"; + $output .= "/*/ {$_funcName} */\n\n"; + $output .= "?>\n"; + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $output + ) + ); + $compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser); + // restore old buffer + $compiler->parser->current_buffer = $saved_data[ 1 ]; + // restore old status + $compiler->restoreRequiredPlugins(); + $compiler->template->compiled->has_nocache_code = $saved_data[ 2 ]; + $compiler->template->caching = $saved_data[ 3 ]; + return true; + } + + /** + * Remove nocache code + * + * @param $match + * + * @return string + */ + public function removeNocache($match) + { + $code = + preg_replace( + "/((<\?php )?echo '\/\*%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/)|(\/\*\/%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/", + '', + $match[ 0 ] + ); + $code = str_replace(array('\\\'', '\\\\\''), array('\'', '\\\''), $code); + return $code; + } +} diff --git a/sysplugins/smarty_internal_compile_if.php b/sysplugins/smarty_internal_compile_if.php new file mode 100644 index 0000000000000000000000000000000000000000..df3dc3fad1123fbe9966063d741094d58520e1a5 --- /dev/null +++ b/sysplugins/smarty_internal_compile_if.php @@ -0,0 +1,207 @@ +<?php +/** + * Smarty Internal Plugin Compile If + * Compiles the {if} {else} {elseif} {/if} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile If Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {if} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $this->openTag($compiler, 'if', array(1, $compiler->nocache)); + // must whole block be nocache ? + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + if (!isset($parameter[ 'if condition' ])) { + $compiler->trigger_template_error('missing if condition', null, true); + } + if (is_array($parameter[ 'if condition' ])) { + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + } else { + $var = $parameter[ 'if condition' ][ 'var' ]; + } + if ($compiler->nocache) { + // create nocache var to make it know for further compiling + $compiler->setNocacheInVariable($var); + } + $prefixVar = $compiler->getNewPrefixVariable(); + $_output = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n"; + $assignAttr = array(); + $assignAttr[][ 'value' ] = $prefixVar; + $assignCompiler = new Smarty_Internal_Compile_Assign(); + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + $_output .= $assignCompiler->compile( + $assignAttr, + $compiler, + array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ]) + ); + } else { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ]; + $_output .= $assignCompiler->compile($assignAttr, $compiler, array()); + } + $_output .= "<?php if ({$prefixVar}) {?>"; + return $_output; + } else { + return "<?php if ({$parameter['if condition']}) {?>"; + } + } +} + +/** + * Smarty Internal Plugin Compile Else Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {else} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); + $this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache)); + return '<?php } else { ?>'; + } +} + +/** + * Smarty Internal Plugin Compile ElseIf Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {elseif} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); + if (!isset($parameter[ 'if condition' ])) { + $compiler->trigger_template_error('missing elseif condition', null, true); + } + $assignCode = ''; + $var = ''; + if (is_array($parameter[ 'if condition' ])) { + $condition_by_assign = true; + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + } else { + $var = $parameter[ 'if condition' ][ 'var' ]; + } + if ($compiler->nocache) { + // create nocache var to make it know for further compiling + $compiler->setNocacheInVariable($var); + } + $prefixVar = $compiler->getNewPrefixVariable(); + $assignCode = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n"; + $assignCompiler = new Smarty_Internal_Compile_Assign(); + $assignAttr = array(); + $assignAttr[][ 'value' ] = $prefixVar; + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + $assignCode .= $assignCompiler->compile( + $assignAttr, + $compiler, + array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ]) + ); + } else { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ]; + $assignCode .= $assignCompiler->compile($assignAttr, $compiler, array()); + } + } else { + $condition_by_assign = false; + } + $prefixCode = $compiler->getPrefixCode(); + if (empty($prefixCode)) { + if ($condition_by_assign) { + $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache)); + $_output = $compiler->appendCode("<?php } else {\n?>", $assignCode); + return $compiler->appendCode($_output, "<?php if ({$prefixVar}) {?>"); + } else { + $this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache)); + return "<?php } elseif ({$parameter['if condition']}) {?>"; + } + } else { + $_output = $compiler->appendCode("<?php } else {\n?>", $prefixCode); + $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache)); + if ($condition_by_assign) { + $_output = $compiler->appendCode($_output, $assignCode); + return $compiler->appendCode($_output, "<?php if ({$prefixVar}) {?>"); + } else { + return $compiler->appendCode($_output, "<?php if ({$parameter['if condition']}) {?>"); + } + } + } +} + +/** + * Smarty Internal Plugin Compile Ifclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/if} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + list($nesting, $compiler->nocache) = $this->closeTag($compiler, array('if', 'else', 'elseif')); + $tmp = ''; + for ($i = 0; $i < $nesting; $i++) { + $tmp .= '}'; + } + return "<?php {$tmp}?>"; + } +} diff --git a/sysplugins/smarty_internal_compile_include.php b/sysplugins/smarty_internal_compile_include.php new file mode 100644 index 0000000000000000000000000000000000000000..716c91d49b751daadad86c947a94ed1cdf0eb6c8 --- /dev/null +++ b/sysplugins/smarty_internal_compile_include.php @@ -0,0 +1,347 @@ +<?php +/** + * Smarty Internal Plugin Compile Include + * Compiles the {include} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Include Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase +{ + /** + * caching mode to create nocache code but no cache file + */ + const CACHING_NOCACHE_CODE = 9999; + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('file'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('file'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('nocache', 'inline', 'caching'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Valid scope names + * + * @var array + */ + public $valid_scopes = array( + 'parent' => Smarty::SCOPE_PARENT, 'root' => Smarty::SCOPE_ROOT, + 'global' => Smarty::SCOPE_GLOBAL, 'tpl_root' => Smarty::SCOPE_TPL_ROOT, + 'smarty' => Smarty::SCOPE_SMARTY + ); + + /** + * Compiles code for the {include} tag + * + * @param array $args array with attributes from parser + * @param Smarty_Internal_SmartyTemplateCompiler $compiler compiler object + * + * @return string + * @throws \Exception + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler) + { + $uid = $t_hash = null; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $fullResourceName = $source_resource = $_attr[ 'file' ]; + $variable_template = false; + $cache_tpl = false; + // parse resource_name + if (preg_match('/^([\'"])(([A-Za-z0-9_\-]{2,})[:])?(([^$()]+)|(.+))\1$/', $source_resource, $match)) { + $type = !empty($match[ 3 ]) ? $match[ 3 ] : $compiler->template->smarty->default_resource_type; + $name = !empty($match[ 5 ]) ? $match[ 5 ] : $match[ 6 ]; + $handler = Smarty_Resource::load($compiler->smarty, $type); + if ($handler->recompiled || $handler->uncompiled) { + $variable_template = true; + } + if (!$variable_template) { + if ($type !== 'string') { + $fullResourceName = "{$type}:{$name}"; + $compiled = $compiler->parent_compiler->template->compiled; + if (isset($compiled->includes[ $fullResourceName ])) { + $compiled->includes[ $fullResourceName ]++; + $cache_tpl = true; + } else { + if ("{$compiler->template->source->type}:{$compiler->template->source->name}" == + $fullResourceName + ) { + // recursive call of current template + $compiled->includes[ $fullResourceName ] = 2; + $cache_tpl = true; + } else { + $compiled->includes[ $fullResourceName ] = 1; + } + } + $fullResourceName = $match[ 1 ] . $fullResourceName . $match[ 1 ]; + } + } + if (empty($match[ 5 ])) { + $variable_template = true; + } + } else { + $variable_template = true; + } + // scope setup + $_scope = $compiler->convertScope($_attr, $this->valid_scopes); + // set flag to cache subtemplate object when called within loop or template name is variable. + if ($cache_tpl || $variable_template || $compiler->loopNesting > 0) { + $_cache_tpl = 'true'; + } else { + $_cache_tpl = 'false'; + } + // assume caching is off + $_caching = Smarty::CACHING_OFF; + $call_nocache = $compiler->tag_nocache || $compiler->nocache; + // caching was on and {include} is not in nocache mode + if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) { + $_caching = self::CACHING_NOCACHE_CODE; + } + // flag if included template code should be merged into caller + $merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr[ 'inline' ] === true) && + !$compiler->template->source->handler->recompiled; + if ($merge_compiled_includes) { + // variable template name ? + if ($variable_template) { + $merge_compiled_includes = false; + } + // variable compile_id? + if (isset($_attr[ 'compile_id' ]) && $compiler->isVariable($_attr[ 'compile_id' ])) { + $merge_compiled_includes = false; + } + } + /* + * if the {include} tag provides individual parameter for caching or compile_id + * the subtemplate must not be included into the common cache file and is treated like + * a call in nocache mode. + * + */ + if ($_attr[ 'nocache' ] !== true && $_attr[ 'caching' ]) { + $_caching = $_new_caching = (int)$_attr[ 'caching' ]; + $call_nocache = true; + } else { + $_new_caching = Smarty::CACHING_LIFETIME_CURRENT; + } + if (isset($_attr[ 'cache_lifetime' ])) { + $_cache_lifetime = $_attr[ 'cache_lifetime' ]; + $call_nocache = true; + $_caching = $_new_caching; + } else { + $_cache_lifetime = '$_smarty_tpl->cache_lifetime'; + } + if (isset($_attr[ 'cache_id' ])) { + $_cache_id = $_attr[ 'cache_id' ]; + $call_nocache = true; + $_caching = $_new_caching; + } else { + $_cache_id = '$_smarty_tpl->cache_id'; + } + if (isset($_attr[ 'compile_id' ])) { + $_compile_id = $_attr[ 'compile_id' ]; + } else { + $_compile_id = '$_smarty_tpl->compile_id'; + } + // if subtemplate will be called in nocache mode do not merge + if ($compiler->template->caching && $call_nocache) { + $merge_compiled_includes = false; + } + // assign attribute + if (isset($_attr[ 'assign' ])) { + // output will be stored in a smarty variable instead of being displayed + if ($_assign = $compiler->getId($_attr[ 'assign' ])) { + $_assign = "'{$_assign}'"; + if ($compiler->tag_nocache || $compiler->nocache || $call_nocache) { + // create nocache var to make it know for further compiling + $compiler->setNocacheInVariable($_attr[ 'assign' ]); + } + } else { + $_assign = $_attr[ 'assign' ]; + } + } + $has_compiled_template = false; + if ($merge_compiled_includes) { + $c_id = isset($_attr[ 'compile_id' ]) ? $_attr[ 'compile_id' ] : $compiler->template->compile_id; + // we must observe different compile_id and caching + $t_hash = sha1($c_id . ($_caching ? '--caching' : '--nocaching')); + $compiler->smarty->allow_ambiguous_resources = true; + /* @var Smarty_Internal_Template $tpl */ + $tpl = new $compiler->smarty->template_class( + trim($fullResourceName, '"\''), + $compiler->smarty, + $compiler->template, + $compiler->template->cache_id, + $c_id, + $_caching + ); + $uid = $tpl->source->type . $tpl->source->uid; + if (!isset($compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ])) { + $has_compiled_template = $this->compileInlineTemplate($compiler, $tpl, $t_hash); + } else { + $has_compiled_template = true; + } + unset($tpl); + } + // delete {include} standard attributes + unset($_attr[ 'file' ], $_attr[ 'assign' ], $_attr[ 'cache_id' ], $_attr[ 'compile_id' ], $_attr[ 'cache_lifetime' ], $_attr[ 'nocache' ], $_attr[ 'caching' ], $_attr[ 'scope' ], $_attr[ 'inline' ]); + // remaining attributes must be assigned as smarty variable + $_vars = 'array()'; + if (!empty($_attr)) { + $_pairs = array(); + // create variables + foreach ($_attr as $key => $value) { + $_pairs[] = "'$key'=>$value"; + } + $_vars = 'array(' . join(',', $_pairs) . ')'; + } + $update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache && + $_compile_id !== '$_smarty_tpl->compile_id'; + if ($has_compiled_template && !$call_nocache) { + $_output = "<?php\n"; + if ($update_compile_id) { + $_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n"); + } + if (!empty($_attr) && $_caching === 9999 && $compiler->template->caching) { + $_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n"; + $_vars_nc .= "\$_smarty_tpl->tpl_vars[\$ik] = new Smarty_Variable(\$iv);\n"; + $_vars_nc .= "}\n"; + $_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, -3); + } + if (isset($_assign)) { + $_output .= "ob_start();\n"; + } + $_output .= "\$_smarty_tpl->_subTemplateRender({$fullResourceName}, {$_cache_id}, {$_compile_id}, {$_caching}, {$_cache_lifetime}, {$_vars}, {$_scope}, {$_cache_tpl}, '{$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['uid']}', '{$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['func']}');\n"; + if (isset($_assign)) { + $_output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n"; + } + if ($update_compile_id) { + $_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n"); + } + $_output .= "?>"; + return $_output; + } + if ($call_nocache) { + $compiler->tag_nocache = true; + } + $_output = "<?php "; + if ($update_compile_id) { + $_output .= "\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n"; + } + // was there an assign attribute + if (isset($_assign)) { + $_output .= "ob_start();\n"; + } + $_output .= "\$_smarty_tpl->_subTemplateRender({$fullResourceName}, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_scope, {$_cache_tpl});\n"; + if (isset($_assign)) { + $_output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n"; + } + if ($update_compile_id) { + $_output .= "\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n"; + } + $_output .= "?>"; + return $_output; + } + + /** + * Compile inline sub template + * + * @param \Smarty_Internal_SmartyTemplateCompiler $compiler + * @param \Smarty_Internal_Template $tpl + * @param string $t_hash + * + * @return bool + * @throws \Exception + * @throws \SmartyException + */ + public function compileInlineTemplate( + Smarty_Internal_SmartyTemplateCompiler $compiler, + Smarty_Internal_Template $tpl, + $t_hash + ) { + $uid = $tpl->source->type . $tpl->source->uid; + if (!($tpl->source->handler->uncompiled) && $tpl->source->exists) { + $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'uid' ] = $tpl->source->uid; + if (isset($compiler->template->inheritance)) { + $tpl->inheritance = clone $compiler->template->inheritance; + } + $tpl->compiled = new Smarty_Template_Compiled(); + $tpl->compiled->nocache_hash = $compiler->parent_compiler->template->compiled->nocache_hash; + $tpl->loadCompiler(); + // save unique function name + $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'func' ] = + $tpl->compiled->unifunc = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); + // make sure whole chain gets compiled + $tpl->mustCompile = true; + $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'nocache_hash' ] = + $tpl->compiled->nocache_hash; + if ($tpl->source->type === 'file') { + $sourceInfo = $tpl->source->filepath; + } else { + $basename = $tpl->source->handler->getBasename($tpl->source); + $sourceInfo = $tpl->source->type . ':' . + ($basename ? $basename : $tpl->source->name); + } + // get compiled code + $compiled_code = "<?php\n\n"; + $compiled_code .= "/* Start inline template \"{$sourceInfo}\" =============================*/\n"; + $compiled_code .= "function {$tpl->compiled->unifunc} (Smarty_Internal_Template \$_smarty_tpl) {\n"; + $compiled_code .= "?>\n" . $tpl->compiler->compileTemplateSource($tpl, null, $compiler->parent_compiler); + $compiled_code .= "<?php\n"; + $compiled_code .= "}\n?>\n"; + $compiled_code .= $tpl->compiler->postFilter($tpl->compiler->blockOrFunctionCode); + $compiled_code .= "<?php\n\n"; + $compiled_code .= "/* End inline template \"{$sourceInfo}\" =============================*/\n"; + $compiled_code .= '?>'; + unset($tpl->compiler); + if ($tpl->compiled->has_nocache_code) { + // replace nocache_hash + $compiled_code = + str_replace( + "{$tpl->compiled->nocache_hash}", + $compiler->template->compiled->nocache_hash, + $compiled_code + ); + $compiler->template->compiled->has_nocache_code = true; + } + $compiler->parent_compiler->mergedSubTemplatesCode[ $tpl->compiled->unifunc ] = $compiled_code; + return true; + } else { + return false; + } + } +} diff --git a/sysplugins/smarty_internal_compile_include_php.php b/sysplugins/smarty_internal_compile_include_php.php new file mode 100644 index 0000000000000000000000000000000000000000..1b0fdaad3ce34672c113bd65c41331a2b9a56cb0 --- /dev/null +++ b/sysplugins/smarty_internal_compile_include_php.php @@ -0,0 +1,110 @@ +<?php +/** + * Smarty Internal Plugin Compile Include PHP + * Compiles the {include_php} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Insert Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('file'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('file'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('once', 'assign'); + + /** + * Compiles code for the {include_php} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + if (!($compiler->smarty instanceof SmartyBC)) { + throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable"); + } + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + /** + * + * + * @var Smarty_Internal_Template $_smarty_tpl + * used in evaluated code + */ + $_smarty_tpl = $compiler->template; + $_filepath = false; + $_file = null; + eval('$_file = @' . $_attr[ 'file' ] . ';'); + if (!isset($compiler->smarty->security_policy) && file_exists($_file)) { + $_filepath = $compiler->smarty->_realpath($_file, true); + } else { + if (isset($compiler->smarty->security_policy)) { + $_dir = $compiler->smarty->security_policy->trusted_dir; + } else { + $_dir = $compiler->smarty->trusted_dir; + } + if (!empty($_dir)) { + foreach ((array)$_dir as $_script_dir) { + $_path = $compiler->smarty->_realpath($_script_dir . DIRECTORY_SEPARATOR . $_file, true); + if (file_exists($_path)) { + $_filepath = $_path; + break; + } + } + } + } + if ($_filepath === false) { + $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", null, true); + } + if (isset($compiler->smarty->security_policy)) { + $compiler->smarty->security_policy->isTrustedPHPDir($_filepath); + } + if (isset($_attr[ 'assign' ])) { + // output will be stored in a smarty variable instead of being displayed + $_assign = $_attr[ 'assign' ]; + } + $_once = '_once'; + if (isset($_attr[ 'once' ])) { + if ($_attr[ 'once' ] === 'false') { + $_once = ''; + } + } + if (isset($_assign)) { + return "<?php ob_start();\ninclude{$_once} ('{$_filepath}');\n\$_smarty_tpl->assign({$_assign},ob_get_clean());\n?>"; + } else { + return "<?php include{$_once} ('{$_filepath}');?>\n"; + } + } +} diff --git a/sysplugins/smarty_internal_compile_insert.php b/sysplugins/smarty_internal_compile_insert.php new file mode 100644 index 0000000000000000000000000000000000000000..4bdc3952e4139dd4c17a05d14ee3b89ffb0fbe87 --- /dev/null +++ b/sysplugins/smarty_internal_compile_insert.php @@ -0,0 +1,157 @@ +<?php +/** + * Smarty Internal Plugin Compile Insert + * Compiles the {insert} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Insert Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles code for the {insert} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache); + if (!$nocacheParam) { + // do not compile as nocache code + $compiler->suppressNocacheProcessing = true; + } + $compiler->tag_nocache = true; + $_smarty_tpl = $compiler->template; + $_name = null; + $_script = null; + $_output = '<?php '; + // save possible attributes + eval('$_name = @' . $_attr[ 'name' ] . ';'); + if (isset($_attr[ 'assign' ])) { + // output will be stored in a smarty variable instead of being displayed + $_assign = $_attr[ 'assign' ]; + // create variable to make sure that the compiler knows about its nocache status + $var = trim($_attr[ 'assign' ], '\''); + if (isset($compiler->template->tpl_vars[ $var ])) { + $compiler->template->tpl_vars[ $var ]->nocache = true; + } else { + $compiler->template->tpl_vars[ $var ] = new Smarty_Variable(null, true); + } + } + if (isset($_attr[ 'script' ])) { + // script which must be included + $_function = "smarty_insert_{$_name}"; + $_smarty_tpl = $compiler->template; + $_filepath = false; + eval('$_script = @' . $_attr[ 'script' ] . ';'); + if (!isset($compiler->smarty->security_policy) && file_exists($_script)) { + $_filepath = $_script; + } else { + if (isset($compiler->smarty->security_policy)) { + $_dir = $compiler->smarty->security_policy->trusted_dir; + } else { + $_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null; + } + if (!empty($_dir)) { + foreach ((array)$_dir as $_script_dir) { + $_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR; + if (file_exists($_script_dir . $_script)) { + $_filepath = $_script_dir . $_script; + break; + } + } + } + } + if ($_filepath === false) { + $compiler->trigger_template_error("{insert} missing script file '{$_script}'", null, true); + } + // code for script file loading + $_output .= "require_once '{$_filepath}' ;"; + include_once $_filepath; + if (!is_callable($_function)) { + $compiler->trigger_template_error( + " {insert} function '{$_function}' is not callable in script file '{$_script}'", + null, + true + ); + } + } else { + $_filepath = 'null'; + $_function = "insert_{$_name}"; + // function in PHP script ? + if (!is_callable($_function)) { + // try plugin + if (!$_function = $compiler->getPlugin($_name, 'insert')) { + $compiler->trigger_template_error( + "{insert} no function or plugin found for '{$_name}'", + null, + true + ); + } + } + } + // delete {insert} standard attributes + unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'script' ], $_attr[ 'nocache' ]); + // convert attributes into parameter array string + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + $_paramsArray[] = "'$_key' => $_value"; + } + $_params = 'array(' . implode(", ", $_paramsArray) . ')'; + // call insert + if (isset($_assign)) { + if ($_smarty_tpl->caching && !$nocacheParam) { + $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>"; + } else { + $_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>"; + } + } else { + if ($_smarty_tpl->caching && !$nocacheParam) { + $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>"; + } else { + $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>"; + } + } + $compiler->template->compiled->has_nocache_code = true; + return $_output; + } +} diff --git a/sysplugins/smarty_internal_compile_ldelim.php b/sysplugins/smarty_internal_compile_ldelim.php new file mode 100644 index 0000000000000000000000000000000000000000..5493d4eccf4cd7021d126321bbe6fffb4349d8d2 --- /dev/null +++ b/sysplugins/smarty_internal_compile_ldelim.php @@ -0,0 +1,37 @@ +<?php +/** + * Smarty Internal Plugin Compile Ldelim + * Compiles the {ldelim} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Ldelim Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {ldelim} tag + * This tag does output the left delimiter + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $_attr = $this->getAttributes($compiler, $args); + if ($_attr[ 'nocache' ] === true) { + $compiler->trigger_template_error('nocache option not allowed', null, true); + } + return $compiler->smarty->left_delimiter; + } +} diff --git a/sysplugins/smarty_internal_compile_make_nocache.php b/sysplugins/smarty_internal_compile_make_nocache.php new file mode 100644 index 0000000000000000000000000000000000000000..8a34ccd0a510b70991f52d688e94d1d9a113f70c --- /dev/null +++ b/sysplugins/smarty_internal_compile_make_nocache.php @@ -0,0 +1,62 @@ +<?php +/** + * Smarty Internal Plugin Compile Make_Nocache + * Compiles the {make_nocache} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Make_Nocache Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Make_Nocache extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array(); + + /** + * Array of names of required attribute required by tag + * + * @var array + */ + public $required_attributes = array('var'); + + /** + * Shorttag attribute order defined by its names + * + * @var array + */ + public $shorttag_order = array('var'); + + /** + * Compiles code for the {make_nocache} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + if ($compiler->template->caching) { + $output = "<?php \$_smarty_tpl->smarty->ext->_make_nocache->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n"; + $compiler->template->compiled->has_nocache_code = true; + $compiler->suppressNocacheProcessing = true; + return $output; + } else { + return true; + } + } +} diff --git a/sysplugins/smarty_internal_compile_nocache.php b/sysplugins/smarty_internal_compile_nocache.php new file mode 100644 index 0000000000000000000000000000000000000000..12f64ed2e7ba44886a3cbce2cf856482cc9d0b28 --- /dev/null +++ b/sysplugins/smarty_internal_compile_nocache.php @@ -0,0 +1,73 @@ +<?php +/** + * Smarty Internal Plugin Compile Nocache + * Compiles the {nocache} {/nocache} tags. + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Nocache Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase +{ + /** + * Array of names of valid option flags + * + * @var array + */ + public $option_flags = array(); + + /** + * Compiles code for the {nocache} tag + * This tag does not generate compiled output. It only sets a compiler flag. + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return bool + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $_attr = $this->getAttributes($compiler, $args); + $this->openTag($compiler, 'nocache', array($compiler->nocache)); + // enter nocache mode + $compiler->nocache = true; + // this tag does not return compiled code + $compiler->has_code = false; + return true; + } +} + +/** + * Smarty Internal Plugin Compile Nocacheclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/nocache} tag + * This tag does not generate compiled output. It only sets a compiler flag. + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return bool + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $_attr = $this->getAttributes($compiler, $args); + // leave nocache mode + list($compiler->nocache) = $this->closeTag($compiler, array('nocache')); + // this tag does not return compiled code + $compiler->has_code = false; + return true; + } +} diff --git a/sysplugins/smarty_internal_compile_parent.php b/sysplugins/smarty_internal_compile_parent.php new file mode 100644 index 0000000000000000000000000000000000000000..ff23edf73c751e700928d715345afaf975caff7c --- /dev/null +++ b/sysplugins/smarty_internal_compile_parent.php @@ -0,0 +1,31 @@ +<?php +/** + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Parent Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Parent extends Smarty_Internal_Compile_Child +{ + /** + * Tag name + * + * @var string + */ + public $tag = 'parent'; + + /** + * Block type + * + * @var string + */ + public $blockType = 'Parent'; +} diff --git a/sysplugins/smarty_internal_compile_private_block_plugin.php b/sysplugins/smarty_internal_compile_private_block_plugin.php new file mode 100644 index 0000000000000000000000000000000000000000..199a296c8c05ab780a4434e56c43e70ab48497e0 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_block_plugin.php @@ -0,0 +1,124 @@ +<?php +/** + * Smarty Internal Plugin Compile Block Plugin + * Compiles code for the execution of block plugin + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Block Plugin Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * nesting level + * + * @var int + */ + public $nesting = 0; + + /** + * Compiles code for the execution of block plugin + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of block plugin + * @param string $function PHP function name + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function = null) + { + if (!isset($tag[ 5 ]) || substr($tag, -5) !== 'close') { + // opening tag of block plugin + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $this->nesting++; + unset($_attr[ 'nocache' ]); + list($callback, $_paramsArray, $callable) = $this->setup($compiler, $_attr, $tag, $function); + $_params = 'array(' . implode(',', $_paramsArray) . ')'; + // compile code + $output = "<?php "; + if (is_array($callback)) { + $output .= "\$_block_plugin{$this->nesting} = isset({$callback[0]}) ? {$callback[0]} : null;\n"; + $callback = "\$_block_plugin{$this->nesting}{$callback[1]}"; + } + if (isset($callable)) { + $output .= "if (!is_callable({$callable})) {\nthrow new SmartyException('block tag \'{$tag}\' not callable or registered');\n}\n"; + } + $output .= "\$_smarty_tpl->smarty->_cache['_tag_stack'][] = array('{$tag}', {$_params});\n"; + $output .= "\$_block_repeat=true;\necho {$callback}({$_params}, null, \$_smarty_tpl, \$_block_repeat);\nwhile (\$_block_repeat) {\nob_start();?>"; + $this->openTag($compiler, $tag, array($_params, $compiler->nocache, $callback)); + // maybe nocache because of nocache variables or nocache plugin + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + } else { + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + // closing tag of block plugin, restore nocache + list($_params, $compiler->nocache, $callback) = $this->closeTag($compiler, substr($tag, 0, -5)); + // compile code + if (!isset($parameter[ 'modifier_list' ])) { + $mod_pre = $mod_post = $mod_content = ''; + $mod_content2 = 'ob_get_clean()'; + } else { + $mod_content2 = "\$_block_content{$this->nesting}"; + $mod_content = "\$_block_content{$this->nesting} = ob_get_clean();\n"; + $mod_pre = "ob_start();\n"; + $mod_post = 'echo ' . $compiler->compileTag( + 'private_modifier', + array(), + array( + 'modifierlist' => $parameter[ 'modifier_list' ], + 'value' => 'ob_get_clean()' + ) + ) . ";\n"; + } + $output = + "<?php {$mod_content}\$_block_repeat=false;\n{$mod_pre}echo {$callback}({$_params}, {$mod_content2}, \$_smarty_tpl, \$_block_repeat);\n{$mod_post}}\n"; + $output .= 'array_pop($_smarty_tpl->smarty->_cache[\'_tag_stack\']);?>'; + } + return $output; + } + + /** + * Setup callback and parameter array + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param array $_attr attributes + * @param string $tag + * @param string $function + * + * @return array + */ + public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $function) + { + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + return array($function, $_paramsArray, null); + } +} diff --git a/sysplugins/smarty_internal_compile_private_foreachsection.php b/sysplugins/smarty_internal_compile_private_foreachsection.php new file mode 100644 index 0000000000000000000000000000000000000000..d3aab24bb08d3617a54bb8e68f3296cc05f264c7 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_foreachsection.php @@ -0,0 +1,228 @@ +<?php +/** + * Smarty Internal Plugin Compile ForeachSection + * Shared methods for {foreach} {section} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile ForeachSection Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_CompileBase +{ + /** + * Name of this tag + * + * @var string + */ + public $tagName = ''; + + /** + * Valid properties of $smarty.xxx variable + * + * @var array + */ + public $nameProperties = array(); + + /** + * {section} tag has no item properties + * + * @var array + */ + public $itemProperties = null; + + /** + * {section} tag has always name attribute + * + * @var bool + */ + public $isNamed = true; + + /** + * @var array + */ + public $matchResults = array(); + + /** + * Preg search pattern + * + * @var string + */ + private $propertyPreg = ''; + + /** + * Offsets in preg match result + * + * @var array + */ + private $resultOffsets = array(); + + /** + * Start offset + * + * @var int + */ + private $startOffset = 0; + + /** + * Scan sources for used tag attributes + * + * @param array $attributes + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * + * @throws \SmartyException + */ + public function scanForProperties($attributes, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->propertyPreg = '~('; + $this->startOffset = 1; + $this->resultOffsets = array(); + $this->matchResults = array('named' => array(), 'item' => array()); + if (isset($attributes[ 'name' ])) { + $this->buildPropertyPreg(true, $attributes); + } + if (isset($this->itemProperties)) { + if ($this->isNamed) { + $this->propertyPreg .= '|'; + } + $this->buildPropertyPreg(false, $attributes); + } + $this->propertyPreg .= ')\W~i'; + // Template source + $this->matchTemplateSource($compiler); + // Parent template source + $this->matchParentTemplateSource($compiler); + // {block} source + $this->matchBlockSource($compiler); + } + + /** + * Build property preg string + * + * @param bool $named + * @param array $attributes + */ + public function buildPropertyPreg($named, $attributes) + { + if ($named) { + $this->resultOffsets[ 'named' ] = $this->startOffset = $this->startOffset + 3; + $this->propertyPreg .= "(([\$]smarty[.]{$this->tagName}[.]" . + ($this->tagName === 'section' ? "|[\[]\s*" : '') . + "){$attributes['name']}[.]("; + $properties = $this->nameProperties; + } else { + $this->resultOffsets[ 'item' ] = $this->startOffset = $this->startOffset + 2; + $this->propertyPreg .= "([\$]{$attributes['item']}[@]("; + $properties = $this->itemProperties; + } + $propName = reset($properties); + while ($propName) { + $this->propertyPreg .= "{$propName}"; + $propName = next($properties); + if ($propName) { + $this->propertyPreg .= '|'; + } + } + $this->propertyPreg .= '))'; + } + + /** + * Find matches in source string + * + * @param string $source + */ + public function matchProperty($source) + { + preg_match_all($this->propertyPreg, $source, $match); + foreach ($this->resultOffsets as $key => $offset) { + foreach ($match[ $offset ] as $m) { + if (!empty($m)) { + $this->matchResults[ $key ][ strtolower($m) ] = true; + } + } + } + } + + /** + * Find matches in template source + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + */ + public function matchTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->matchProperty($compiler->parser->lex->data); + } + + /** + * Find matches in all parent template source + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * + * @throws \SmartyException + */ + public function matchParentTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler) + { + // search parent compiler template source + $nextCompiler = $compiler; + while ($nextCompiler !== $nextCompiler->parent_compiler) { + $nextCompiler = $nextCompiler->parent_compiler; + if ($compiler !== $nextCompiler) { + // get template source + $_content = $nextCompiler->template->source->getContent(); + if ($_content !== '') { + // run pre filter if required + if ((isset($nextCompiler->smarty->autoload_filters[ 'pre' ]) || + isset($nextCompiler->smarty->registered_filters[ 'pre' ])) + ) { + $_content = $nextCompiler->smarty->ext->_filterHandler->runFilter( + 'pre', + $_content, + $nextCompiler->template + ); + } + $this->matchProperty($_content); + } + } + } + } + + /** + * Find matches in {block} tag source + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + */ + public function matchBlockSource(Smarty_Internal_TemplateCompilerBase $compiler) + { + } + + /** + * Compiles code for the {$smarty.foreach.xxx} or {$smarty.section.xxx}tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + $tag = strtolower(trim($parameter[ 0 ], '"\'')); + $name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false; + if (!$name) { + $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true); + } + $property = isset($parameter[ 2 ]) ? strtolower($compiler->getId($parameter[ 2 ])) : false; + if (!$property || !in_array($property, $this->nameProperties)) { + $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} property attribute", null, true); + } + $tagVar = "'__smarty_{$tag}_{$name}'"; + return "(isset(\$_smarty_tpl->tpl_vars[{$tagVar}]->value['{$property}']) ? \$_smarty_tpl->tpl_vars[{$tagVar}]->value['{$property}'] : null)"; + } +} diff --git a/sysplugins/smarty_internal_compile_private_function_plugin.php b/sysplugins/smarty_internal_compile_private_function_plugin.php new file mode 100644 index 0000000000000000000000000000000000000000..055823423e45ae6c77f2b88299244dffc2b1a8fb --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_function_plugin.php @@ -0,0 +1,78 @@ +<?php +/** + * Smarty Internal Plugin Compile Function Plugin + * Compiles code for the execution of function plugin + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Function Plugin Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array(); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles code for the execution of function plugin + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of function plugin + * @param string $function PHP function name + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + unset($_attr[ 'nocache' ]); + // convert attributes into parameter array string + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $_params = 'array(' . implode(',', $_paramsArray) . ')'; + // compile code + $output = "{$function}({$_params},\$_smarty_tpl)"; + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag( + 'private_modifier', + array(), + array( + 'modifierlist' => $parameter[ 'modifierlist' ], + 'value' => $output + ) + ); + } + $output = "<?php echo {$output};?>\n"; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_private_modifier.php b/sysplugins/smarty_internal_compile_private_modifier.php new file mode 100644 index 0000000000000000000000000000000000000000..72773fff8c6efe0e1aeb1ba6663b7532632b7b0d --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_modifier.php @@ -0,0 +1,158 @@ +<?php +/** + * Smarty Internal Plugin Compile Modifier + * Compiles code for modifier execution + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Modifier Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for modifier execution + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $output = $parameter[ 'value' ]; + // loop over list of modifiers + foreach ($parameter[ 'modifierlist' ] as $single_modifier) { + /* @var string $modifier */ + $modifier = $single_modifier[ 0 ]; + $single_modifier[ 0 ] = $output; + $params = implode(',', $single_modifier); + // check if we know already the type of modifier + if (isset($compiler->known_modifier_type[ $modifier ])) { + $modifier_types = array($compiler->known_modifier_type[ $modifier ]); + } else { + $modifier_types = array(1, 2, 3, 4, 5, 6); + } + foreach ($modifier_types as $type) { + switch ($type) { + case 1: + // registered modifier + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])) { + if (is_callable($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ])) { + $output = + sprintf( + 'call_user_func_array($_smarty_tpl->registered_plugins[ \'%s\' ][ %s ][ 0 ], array( %s ))', + Smarty::PLUGIN_MODIFIER, + var_export($modifier, true), + $params + ); + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + } + break; + case 2: + // registered modifier compiler + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ])) { + $output = + call_user_func( + $compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ], + $single_modifier, + $compiler->smarty + ); + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 3: + // modifiercompiler plugin + if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) { + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler) + ) { + $plugin = 'smarty_modifiercompiler_' . $modifier; + $output = $plugin($single_modifier, $compiler); + } + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 4: + // modifier plugin + if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) { + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler) + ) { + $output = "{$function}({$params})"; + } + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 5: + // PHP function + if (is_callable($modifier)) { + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler) + ) { + $output = "{$modifier}({$params})"; + } + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; + } + break; + case 6: + // default plugin handler + if (isset($compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ]) + || (is_callable($compiler->smarty->default_plugin_handler_func) + && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER)) + ) { + $function = $compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ]; + // check if modifier allowed + if (!is_object($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler) + ) { + if (!is_array($function)) { + $output = "{$function}({$params})"; + } else { + if (is_object($function[ 0 ])) { + $output = $function[ 0 ] . '->' . $function[ 1 ] . '(' . $params . ')'; + } else { + $output = $function[ 0 ] . '::' . $function[ 1 ] . '(' . $params . ')'; + } + } + } + if (isset($compiler->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) + || + isset($compiler->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) + ) { + // was a plugin + $compiler->known_modifier_type[ $modifier ] = 4; + } else { + $compiler->known_modifier_type[ $modifier ] = $type; + } + break 2; + } + } + } + if (!isset($compiler->known_modifier_type[ $modifier ])) { + $compiler->trigger_template_error("unknown modifier '{$modifier}'", null, true); + } + } + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_private_object_block_function.php b/sysplugins/smarty_internal_compile_private_object_block_function.php new file mode 100644 index 0000000000000000000000000000000000000000..baac51b285ad0ac0fb1baf287ee78ca93e6f695d --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_object_block_function.php @@ -0,0 +1,42 @@ +<?php +/** + * Smarty Internal Plugin Compile Object Block Function + * Compiles code for registered objects as block function + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Object Block Function Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_Compile_Private_Block_Plugin +{ + /** + * Setup callback and parameter array + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param array $_attr attributes + * @param string $tag + * @param string $method + * + * @return array + */ + public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $method) + { + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $callback = array("\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]", "->{$method}"); + return array($callback, $_paramsArray, "array(\$_block_plugin{$this->nesting}, '{$method}')"); + } +} diff --git a/sysplugins/smarty_internal_compile_private_object_function.php b/sysplugins/smarty_internal_compile_private_object_function.php new file mode 100644 index 0000000000000000000000000000000000000000..2a763c6e3fc66bb816be92918253aadf7c589965 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_object_function.php @@ -0,0 +1,85 @@ +<?php +/** + * Smarty Internal Plugin Compile Object Function + * Compiles code for registered objects as function + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Object Function Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles code for the execution of function plugin + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of function + * @param string $method name of method to call + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $method) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + unset($_attr[ 'nocache' ]); + $_assign = null; + if (isset($_attr[ 'assign' ])) { + $_assign = $_attr[ 'assign' ]; + unset($_attr[ 'assign' ]); + } + // method or property ? + if (is_callable(array($compiler->smarty->registered_objects[ $tag ][ 0 ], $method))) { + // convert attributes into parameter array string + if ($compiler->smarty->registered_objects[ $tag ][ 2 ]) { + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $_params = 'array(' . implode(',', $_paramsArray) . ')'; + $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)"; + } else { + $_params = implode(',', $_attr); + $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})"; + } + } else { + // object property + $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}"; + } + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag( + 'private_modifier', + array(), + array('modifierlist' => $parameter[ 'modifierlist' ], 'value' => $output) + ); + } + if (empty($_assign)) { + return "<?php echo {$output};?>\n"; + } else { + return "<?php \$_smarty_tpl->assign({$_assign},{$output});?>\n"; + } + } +} diff --git a/sysplugins/smarty_internal_compile_private_php.php b/sysplugins/smarty_internal_compile_private_php.php new file mode 100644 index 0000000000000000000000000000000000000000..ff48c6fbce7c1524f3dccd7b474dc076ad9028ce --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_php.php @@ -0,0 +1,253 @@ +<?php +/** + * Smarty Internal Plugin Compile PHP Expression + * Compiles any tag which will output an expression or variable + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile PHP Expression Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('code', 'type'); + + /** + * Compiles code for generating output from any expression + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $compiler->has_code = false; + if ($_attr[ 'type' ] === 'xml') { + $compiler->tag_nocache = true; + $output = addcslashes($_attr[ 'code' ], "'\\"); + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $compiler->processNocacheCode( + "<?php echo '{$output}';?>\n", + true + ) + ) + ); + return ''; + } + if ($_attr[ 'type' ] !== 'tag') { + if ($compiler->php_handling === Smarty::PHP_REMOVE) { + return ''; + } elseif ($compiler->php_handling === Smarty::PHP_QUOTE) { + $output = + preg_replace_callback( + '#(<\?(?:php|=)?)|(<%)|(<script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*>)|(\?>)|(%>)|(<\/script>)#i', + array($this, 'quote'), + $_attr[ 'code' ] + ); + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Text($output) + ); + return ''; + } elseif ($compiler->php_handling === Smarty::PHP_PASSTHRU || $_attr[ 'type' ] === 'unmatched') { + $compiler->tag_nocache = true; + $output = addcslashes($_attr[ 'code' ], "'\\"); + $compiler->parser->current_buffer->append_subtree( + $compiler->parser, + new Smarty_Internal_ParseTree_Tag( + $compiler->parser, + $compiler->processNocacheCode( + "<?php echo '{$output}';?>\n", + true + ) + ) + ); + return ''; + } elseif ($compiler->php_handling === Smarty::PHP_ALLOW) { + if (!($compiler->smarty instanceof SmartyBC)) { + $compiler->trigger_template_error( + '$smarty->php_handling PHP_ALLOW not allowed. Use SmartyBC to enable it', + null, + true + ); + } + $compiler->has_code = true; + return $_attr[ 'code' ]; + } else { + $compiler->trigger_template_error('Illegal $smarty->php_handling value', null, true); + } + } else { + $compiler->has_code = true; + if (!($compiler->smarty instanceof SmartyBC)) { + $compiler->trigger_template_error( + '{php}{/php} tags not allowed. Use SmartyBC to enable them', + null, + true + ); + } + $ldel = preg_quote($compiler->smarty->left_delimiter, '#'); + $rdel = preg_quote($compiler->smarty->right_delimiter, '#'); + preg_match("#^({$ldel}php\\s*)((.)*?)({$rdel})#", $_attr[ 'code' ], $match); + if (!empty($match[ 2 ])) { + if ('nocache' === trim($match[ 2 ])) { + $compiler->tag_nocache = true; + } else { + $compiler->trigger_template_error("illegal value of option flag '{$match[2]}'", null, true); + } + } + return preg_replace( + array("#^{$ldel}\\s*php\\s*(.)*?{$rdel}#", "#{$ldel}\\s*/\\s*php\\s*{$rdel}$#"), + array('<?php ', '?>'), + $_attr[ 'code' ] + ); + } + } + + /** + * Lexer code for PHP tags + * + * This code has been moved from lexer here fo easier debugging and maintenance + * + * @param Smarty_Internal_Templatelexer $lex + * + * @throws \SmartyCompilerException + */ + public function parsePhp(Smarty_Internal_Templatelexer $lex) + { + $lex->token = Smarty_Internal_Templateparser::TP_PHP; + $close = 0; + $lex->taglineno = $lex->line; + $closeTag = '?>'; + if (strpos($lex->value, '<?xml') === 0) { + $lex->is_xml = true; + $lex->phpType = 'xml'; + return; + } elseif (strpos($lex->value, '<?') === 0) { + $lex->phpType = 'php'; + } elseif (strpos($lex->value, '<%') === 0) { + $lex->phpType = 'asp'; + $closeTag = '%>'; + } elseif (strpos($lex->value, '%>') === 0) { + $lex->phpType = 'unmatched'; + } elseif (strpos($lex->value, '?>') === 0) { + if ($lex->is_xml) { + $lex->is_xml = false; + $lex->phpType = 'xml'; + return; + } + $lex->phpType = 'unmatched'; + } elseif (strpos($lex->value, '<s') === 0) { + $lex->phpType = 'script'; + $closeTag = '</script>'; + } elseif (strpos($lex->value, $lex->smarty->left_delimiter) === 0) { + if ($lex->isAutoLiteral()) { + $lex->token = Smarty_Internal_Templateparser::TP_TEXT; + return; + } + $closeTag = "{$lex->smarty->left_delimiter}/php{$lex->smarty->right_delimiter}"; + if ($lex->value === $closeTag) { + $lex->compiler->trigger_template_error("unexpected closing tag '{$closeTag}'"); + } + $lex->phpType = 'tag'; + } + if ($lex->phpType === 'unmatched') { + return; + } + if (($lex->phpType === 'php' || $lex->phpType === 'asp') + && + ($lex->compiler->php_handling === Smarty::PHP_PASSTHRU || + $lex->compiler->php_handling === Smarty::PHP_QUOTE) + ) { + return; + } + $start = $lex->counter + strlen($lex->value); + $body = true; + if (preg_match('~' . preg_quote($closeTag, '~') . '~i', $lex->data, $match, PREG_OFFSET_CAPTURE, $start)) { + $close = $match[ 0 ][ 1 ]; + } else { + $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'"); + } + while ($body) { + if (preg_match( + '~([/][*])|([/][/][^\n]*)|(\'[^\'\\\\]*(?:\\.[^\'\\\\]*)*\')|("[^"\\\\]*(?:\\.[^"\\\\]*)*")~', + $lex->data, + $match, + PREG_OFFSET_CAPTURE, + $start + ) + ) { + $value = $match[ 0 ][ 0 ]; + $from = $pos = $match[ 0 ][ 1 ]; + if ($pos > $close) { + $body = false; + } else { + $start = $pos + strlen($value); + $phpCommentStart = $value === '/*'; + if ($phpCommentStart) { + $phpCommentEnd = preg_match('~([*][/])~', $lex->data, $match, PREG_OFFSET_CAPTURE, $start); + if ($phpCommentEnd) { + $pos2 = $match[ 0 ][ 1 ]; + $start = $pos2 + strlen($match[ 0 ][ 0 ]); + } + } + while ($close > $pos && $close < $start) { + if (preg_match( + '~' . preg_quote($closeTag, '~') . '~i', + $lex->data, + $match, + PREG_OFFSET_CAPTURE, + $from + ) + ) { + $close = $match[ 0 ][ 1 ]; + $from = $close + strlen($match[ 0 ][ 0 ]); + } else { + $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'"); + } + } + if ($phpCommentStart && (!$phpCommentEnd || $pos2 > $close)) { + $lex->taglineno = $lex->line + substr_count(substr($lex->data, $lex->counter, $start), "\n"); + $lex->compiler->trigger_template_error("missing PHP comment closing tag '*/'"); + } + } + } else { + $body = false; + } + } + $lex->value = substr($lex->data, $lex->counter, $close + strlen($closeTag) - $lex->counter); + } + + /* + * Call back function for $php_handling = PHP_QUOTE + * + */ + /** + * @param $match + * + * @return string + */ + private function quote($match) + { + return htmlspecialchars($match[ 0 ], ENT_QUOTES); + } +} diff --git a/sysplugins/smarty_internal_compile_private_print_expression.php b/sysplugins/smarty_internal_compile_private_print_expression.php new file mode 100644 index 0000000000000000000000000000000000000000..23cae8aefde7c077229ae7afd7dce418aec49271 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_print_expression.php @@ -0,0 +1,161 @@ +<?php +/** + * Smarty Internal Plugin Compile Print Expression + * Compiles any tag which will output an expression or variable + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Print Expression Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $option_flags = array('nocache', 'nofilter'); + + /** + * Compiles code for generating output from any expression + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $output = $parameter[ 'value' ]; + // tag modifier + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag( + 'private_modifier', + array(), + array( + 'modifierlist' => $parameter[ 'modifierlist' ], + 'value' => $output + ) + ); + } + if (isset($_attr[ 'assign' ])) { + // assign output to variable + return "<?php \$_smarty_tpl->assign({$_attr['assign']},{$output});?>"; + } else { + // display value + if (!$_attr[ 'nofilter' ]) { + // default modifier + if (!empty($compiler->smarty->default_modifiers)) { + if (empty($compiler->default_modifier_list)) { + $modifierlist = array(); + foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) { + preg_match_all( + '/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', + $single_default_modifier, + $mod_array + ); + for ($i = 0, $count = count($mod_array[ 0 ]); $i < $count; $i++) { + if ($mod_array[ 0 ][ $i ] !== ':') { + $modifierlist[ $key ][] = $mod_array[ 0 ][ $i ]; + } + } + } + $compiler->default_modifier_list = $modifierlist; + } + $output = $compiler->compileTag( + 'private_modifier', + array(), + array( + 'modifierlist' => $compiler->default_modifier_list, + 'value' => $output + ) + ); + } + // autoescape html + if ($compiler->template->smarty->escape_html) { + $output = "htmlspecialchars({$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')"; + } + // loop over registered filters + if (!empty($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ])) { + foreach ($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ] as $key => + $function) { + if (!is_array($function)) { + $output = "{$function}({$output},\$_smarty_tpl)"; + } elseif (is_object($function[ 0 ])) { + $output = + "\$_smarty_tpl->smarty->registered_filters[Smarty::FILTER_VARIABLE]['{$key}'][0]->{$function[1]}({$output},\$_smarty_tpl)"; + } else { + $output = "{$function[0]}::{$function[1]}({$output},\$_smarty_tpl)"; + } + } + } + // auto loaded filters + if (isset($compiler->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ])) { + foreach ((array)$compiler->template->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ] as $name) { + $result = $this->compile_variable_filter($compiler, $name, $output); + if ($result !== false) { + $output = $result; + } else { + // not found, throw exception + throw new SmartyException("Unable to load variable filter '{$name}'"); + } + } + } + foreach ($compiler->variable_filters as $filter) { + if (count($filter) === 1 + && ($result = $this->compile_variable_filter($compiler, $filter[ 0 ], $output)) !== false + ) { + $output = $result; + } else { + $output = $compiler->compileTag( + 'private_modifier', + array(), + array('modifierlist' => array($filter), 'value' => $output) + ); + } + } + } + $output = "<?php echo {$output};?>\n"; + } + return $output; + } + + /** + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param string $name name of variable filter + * @param string $output embedded output + * + * @return string + * @throws \SmartyException + */ + private function compile_variable_filter(Smarty_Internal_TemplateCompilerBase $compiler, $name, $output) + { + $function = $compiler->getPlugin($name, 'variablefilter'); + if ($function) { + return "{$function}({$output},\$_smarty_tpl)"; + } else { + // not found + return false; + } + } +} diff --git a/sysplugins/smarty_internal_compile_private_registered_block.php b/sysplugins/smarty_internal_compile_private_registered_block.php new file mode 100644 index 0000000000000000000000000000000000000000..0f818d1b37624867863ba9f96cbd1e7540cc2ad2 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_registered_block.php @@ -0,0 +1,72 @@ +<?php +/** + * Smarty Internal Plugin Compile Registered Block + * Compiles code for the execution of a registered block function + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Registered Block Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_Compile_Private_Block_Plugin +{ + /** + * Setup callback, parameter array and nocache mode + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param array $_attr attributes + * @param string $tag + * @param null $function + * + * @return array + */ + public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $function) + { + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ])) { + $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ]; + $callback = $tag_info[ 0 ]; + if (is_array($callback)) { + if (is_object($callback[ 0 ])) { + $callable = "array(\$_block_plugin{$this->nesting}, '{$callback[1]}')"; + $callback = + array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]", "->{$callback[1]}"); + } else { + $callable = "array(\$_block_plugin{$this->nesting}, '{$callback[1]}')"; + $callback = + array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]", "::{$callback[1]}"); + } + } else { + $callable = "\$_block_plugin{$this->nesting}"; + $callback = array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0]", ''); + } + } else { + $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ]; + $callback = $tag_info[ 0 ]; + if (is_array($callback)) { + $callable = "array('{$callback[0]}', '{$callback[1]}')"; + $callback = "{$callback[1]}::{$callback[1]}"; + } else { + $callable = null; + } + } + $compiler->tag_nocache = !$tag_info[ 1 ] | $compiler->tag_nocache; + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) { + $_value = str_replace('\'', "^#^", $_value); + $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + return array($callback, $_paramsArray, $callable); + } +} diff --git a/sysplugins/smarty_internal_compile_private_registered_function.php b/sysplugins/smarty_internal_compile_private_registered_function.php new file mode 100644 index 0000000000000000000000000000000000000000..2591107d230c18e368d2c16ce74e4bfb806ad8f2 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_registered_function.php @@ -0,0 +1,91 @@ +<?php +/** + * Smarty Internal Plugin Compile Registered Function + * Compiles code for the execution of a registered function + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Registered Function Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('_any'); + + /** + * Compiles code for the execution of a registered function + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * @param string $tag name of function + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + unset($_attr[ 'nocache' ]); + if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) { + $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $is_registered = true; + } else { + $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $is_registered = false; + } + // not cacheable? + $compiler->tag_nocache = $compiler->tag_nocache || !$tag_info[ 1 ]; + // convert attributes into parameter array string + $_paramsArray = array(); + foreach ($_attr as $_key => $_value) { + if (is_int($_key)) { + $_paramsArray[] = "$_key=>$_value"; + } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) { + $_value = str_replace('\'', "^#^", $_value); + $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; + } else { + $_paramsArray[] = "'$_key'=>$_value"; + } + } + $_params = 'array(' . implode(',', $_paramsArray) . ')'; + // compile code + if ($is_registered) { + $output = + "call_user_func_array( \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0], array( {$_params},\$_smarty_tpl ) )"; + } else { + $function = $tag_info[ 0 ]; + if (!is_array($function)) { + $output = "{$function}({$_params},\$_smarty_tpl)"; + } else { + $output = "{$function[0]}::{$function[1]}({$_params},\$_smarty_tpl)"; + } + } + if (!empty($parameter[ 'modifierlist' ])) { + $output = $compiler->compileTag( + 'private_modifier', + array(), + array( + 'modifierlist' => $parameter[ 'modifierlist' ], + 'value' => $output + ) + ); + } + $output = "<?php echo {$output};?>\n"; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_private_special_variable.php b/sysplugins/smarty_internal_compile_private_special_variable.php new file mode 100644 index 0000000000000000000000000000000000000000..de7d4a224ae9c3b015c154bbe3f8a1ca7d073cd9 --- /dev/null +++ b/sysplugins/smarty_internal_compile_private_special_variable.php @@ -0,0 +1,126 @@ +<?php +/** + * Smarty Internal Plugin Compile Special Smarty Variable + * Compiles the special $smarty variables + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile special Smarty Variable Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the special $smarty variables + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param $parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + $_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2)); + $variable = strtolower($compiler->getId($_index[ 0 ])); + if ($variable === false) { + $compiler->trigger_template_error("special \$Smarty variable name index can not be variable", null, true); + } + if (!isset($compiler->smarty->security_policy) + || $compiler->smarty->security_policy->isTrustedSpecialSmartyVar($variable, $compiler) + ) { + switch ($variable) { + case 'foreach': + case 'section': + if (!isset(Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ])) { + $class = 'Smarty_Internal_Compile_' . ucfirst($variable); + Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ] = new $class; + } + return Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ]->compileSpecialVariable( + array(), + $compiler, + $_index + ); + case 'capture': + if (class_exists('Smarty_Internal_Compile_Capture')) { + return Smarty_Internal_Compile_Capture::compileSpecialVariable(array(), $compiler, $_index); + } + return ''; + case 'now': + return 'time()'; + case 'cookies': + if (isset($compiler->smarty->security_policy) + && !$compiler->smarty->security_policy->allow_super_globals + ) { + $compiler->trigger_template_error("(secure mode) super globals not permitted"); + break; + } + $compiled_ref = '$_COOKIE'; + break; + case 'get': + case 'post': + case 'env': + case 'server': + case 'session': + case 'request': + if (isset($compiler->smarty->security_policy) + && !$compiler->smarty->security_policy->allow_super_globals + ) { + $compiler->trigger_template_error("(secure mode) super globals not permitted"); + break; + } + $compiled_ref = '$_' . strtoupper($variable); + break; + case 'template': + return 'basename($_smarty_tpl->source->filepath)'; + case 'template_object': + return '$_smarty_tpl'; + case 'current_dir': + return 'dirname($_smarty_tpl->source->filepath)'; + case 'version': + return "Smarty::SMARTY_VERSION"; + case 'const': + if (isset($compiler->smarty->security_policy) + && !$compiler->smarty->security_policy->allow_constants + ) { + $compiler->trigger_template_error("(secure mode) constants not permitted"); + break; + } + if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) { + return "(defined('{$_index[1]}') ? constant('{$_index[1]}') : null)"; + } else { + return "(defined({$_index[1]}) ? constant({$_index[1]}) : null)"; + } + // no break + case 'config': + if (isset($_index[ 2 ])) { + return "(is_array(\$tmp = \$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])) ? \$tmp[$_index[2]] : null)"; + } else { + return "\$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])"; + } + // no break + case 'ldelim': + return "\$_smarty_tpl->smarty->left_delimiter"; + case 'rdelim': + return "\$_smarty_tpl->smarty->right_delimiter"; + default: + $compiler->trigger_template_error('$smarty.' . trim($_index[ 0 ], "'") . ' is not defined'); + break; + } + if (isset($_index[ 1 ])) { + array_shift($_index); + foreach ($_index as $_ind) { + $compiled_ref = $compiled_ref . "[$_ind]"; + } + } + return $compiled_ref; + } + } +} diff --git a/sysplugins/smarty_internal_compile_rdelim.php b/sysplugins/smarty_internal_compile_rdelim.php new file mode 100644 index 0000000000000000000000000000000000000000..1cc340c180df728e55cfe99962e4d799bafe1097 --- /dev/null +++ b/sysplugins/smarty_internal_compile_rdelim.php @@ -0,0 +1,34 @@ +<?php +/** + * Smarty Internal Plugin Compile Rdelim + * Compiles the {rdelim} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Rdelim Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_Compile_Ldelim +{ + /** + * Compiles code for the {rdelim} tag + * This tag does output the right delimiter. + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + parent::compile($args, $compiler); + return $compiler->smarty->right_delimiter; + } +} diff --git a/sysplugins/smarty_internal_compile_section.php b/sysplugins/smarty_internal_compile_section.php new file mode 100644 index 0000000000000000000000000000000000000000..0dee208203206455eb1e9f9b42ccaafec9e72dfc --- /dev/null +++ b/sysplugins/smarty_internal_compile_section.php @@ -0,0 +1,462 @@ +<?php +/** + * Smarty Internal Plugin Compile Section + * Compiles the {section} {sectionelse} {/section} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Section Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_ForeachSection +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $required_attributes = array('name', 'loop'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $shorttag_order = array('name', 'loop'); + + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('start', 'step', 'max', 'show', 'properties'); + + /** + * counter + * + * @var int + */ + public $counter = 0; + + /** + * Name of this tag + * + * @var string + */ + public $tagName = 'section'; + + /** + * Valid properties of $smarty.section.name.xxx variable + * + * @var array + */ + public $nameProperties = array( + 'first', 'last', 'index', 'iteration', 'show', 'total', 'rownum', 'index_prev', + 'index_next', 'loop' + ); + + /** + * {section} tag has no item properties + * + * @var array + */ + public $itemProperties = null; + + /** + * {section} tag has always name attribute + * + * @var bool + */ + public $isNamed = true; + + /** + * Compiles code for the {section} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting++; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $attributes = array('name' => $compiler->getId($_attr[ 'name' ])); + unset($_attr[ 'name' ]); + foreach ($attributes as $a => $v) { + if ($v === false) { + $compiler->trigger_template_error("'{$a}' attribute/variable has illegal value", null, true); + } + } + $local = "\$__section_{$attributes['name']}_" . $this->counter++ . '_'; + $sectionVar = "\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']"; + $this->openTag($compiler, 'section', array('section', $compiler->nocache, $local, $sectionVar)); + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + $initLocal = array(); + $initNamedProperty = array(); + $initFor = array(); + $incFor = array(); + $cmpFor = array(); + $propValue = array( + 'index' => "{$sectionVar}->value['index']", 'show' => 'true', 'step' => 1, + 'iteration' => "{$local}iteration", + ); + $propType = array('index' => 2, 'iteration' => 2, 'show' => 0, 'step' => 0,); + // search for used tag attributes + $this->scanForProperties($attributes, $compiler); + if (!empty($this->matchResults[ 'named' ])) { + $namedAttr = $this->matchResults[ 'named' ]; + } + if (isset($_attr[ 'properties' ]) && preg_match_all("/['](.*?)[']/", $_attr[ 'properties' ], $match)) { + foreach ($match[ 1 ] as $prop) { + if (in_array($prop, $this->nameProperties)) { + $namedAttr[ $prop ] = true; + } else { + $compiler->trigger_template_error("Invalid property '{$prop}'", null, true); + } + } + } + $namedAttr[ 'index' ] = true; + $output = "<?php\n"; + foreach ($_attr as $attr_name => $attr_value) { + switch ($attr_name) { + case 'loop': + if (is_numeric($attr_value)) { + $v = (int)$attr_value; + $t = 0; + } else { + $v = "(is_array(@\$_loop=$attr_value) ? count(\$_loop) : max(0, (int) \$_loop))"; + $t = 1; + } + if ($t === 1) { + $initLocal[ 'loop' ] = $v; + $v = "{$local}loop"; + } + break; + case 'show': + if (is_bool($attr_value)) { + $v = $attr_value ? 'true' : 'false'; + $t = 0; + } else { + $v = "(bool) $attr_value"; + $t = 3; + } + break; + case 'step': + if (is_numeric($attr_value)) { + $v = (int)$attr_value; + $v = ($v === 0) ? 1 : $v; + $t = 0; + break; + } + $initLocal[ 'step' ] = "((int)@$attr_value) === 0 ? 1 : (int)@$attr_value"; + $v = "{$local}step"; + $t = 2; + break; + case 'max': + case 'start': + if (is_numeric($attr_value)) { + $v = (int)$attr_value; + $t = 0; + break; + } + $v = "(int)@$attr_value"; + $t = 3; + break; + } + if ($t === 3 && $compiler->getId($attr_value)) { + $t = 1; + } + $propValue[ $attr_name ] = $v; + $propType[ $attr_name ] = $t; + } + if (isset($namedAttr[ 'step' ])) { + $initNamedProperty[ 'step' ] = $propValue[ 'step' ]; + } + if (isset($namedAttr[ 'iteration' ])) { + $propValue[ 'iteration' ] = "{$sectionVar}->value['iteration']"; + } + $incFor[ 'iteration' ] = "{$propValue['iteration']}++"; + $initFor[ 'iteration' ] = "{$propValue['iteration']} = 1"; + if ($propType[ 'step' ] === 0) { + if ($propValue[ 'step' ] === 1) { + $incFor[ 'index' ] = "{$sectionVar}->value['index']++"; + } elseif ($propValue[ 'step' ] > 1) { + $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}"; + } else { + $incFor[ 'index' ] = "{$sectionVar}->value['index'] -= " . -$propValue[ 'step' ]; + } + } else { + $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}"; + } + if (!isset($propValue[ 'max' ])) { + $propValue[ 'max' ] = $propValue[ 'loop' ]; + $propType[ 'max' ] = $propType[ 'loop' ]; + } elseif ($propType[ 'max' ] !== 0) { + $propValue[ 'max' ] = "{$propValue['max']} < 0 ? {$propValue['loop']} : {$propValue['max']}"; + $propType[ 'max' ] = 1; + } else { + if ($propValue[ 'max' ] < 0) { + $propValue[ 'max' ] = $propValue[ 'loop' ]; + $propType[ 'max' ] = $propType[ 'loop' ]; + } + } + if (!isset($propValue[ 'start' ])) { + $start_code = + array(1 => "{$propValue['step']} > 0 ? ", 2 => '0', 3 => ' : ', 4 => $propValue[ 'loop' ], 5 => ' - 1'); + if ($propType[ 'loop' ] === 0) { + $start_code[ 5 ] = ''; + $start_code[ 4 ] = $propValue[ 'loop' ] - 1; + } + if ($propType[ 'step' ] === 0) { + if ($propValue[ 'step' ] > 0) { + $start_code = array(1 => '0'); + $propType[ 'start' ] = 0; + } else { + $start_code[ 1 ] = $start_code[ 2 ] = $start_code[ 3 ] = ''; + $propType[ 'start' ] = $propType[ 'loop' ]; + } + } else { + $propType[ 'start' ] = 1; + } + $propValue[ 'start' ] = join('', $start_code); + } else { + $start_code = + array( + 1 => "{$propValue['start']} < 0 ? ", 2 => 'max(', 3 => "{$propValue['step']} > 0 ? ", 4 => '0', + 5 => ' : ', 6 => '-1', 7 => ', ', 8 => "{$propValue['start']} + {$propValue['loop']}", 10 => ')', + 11 => ' : ', 12 => 'min(', 13 => $propValue[ 'start' ], 14 => ', ', + 15 => "{$propValue['step']} > 0 ? ", 16 => $propValue[ 'loop' ], 17 => ' : ', + 18 => $propType[ 'loop' ] === 0 ? $propValue[ 'loop' ] - 1 : "{$propValue['loop']} - 1", + 19 => ')' + ); + if ($propType[ 'step' ] === 0) { + $start_code[ 3 ] = $start_code[ 5 ] = $start_code[ 15 ] = $start_code[ 17 ] = ''; + if ($propValue[ 'step' ] > 0) { + $start_code[ 6 ] = $start_code[ 18 ] = ''; + } else { + $start_code[ 4 ] = $start_code[ 16 ] = ''; + } + } + if ($propType[ 'start' ] === 0) { + if ($propType[ 'loop' ] === 0) { + $start_code[ 8 ] = $propValue[ 'start' ] + $propValue[ 'loop' ]; + } + $propType[ 'start' ] = $propType[ 'step' ] + $propType[ 'loop' ]; + $start_code[ 1 ] = ''; + if ($propValue[ 'start' ] < 0) { + for ($i = 11; $i <= 19; $i++) { + $start_code[ $i ] = ''; + } + if ($propType[ 'start' ] === 0) { + $start_code = array( + max( + $propValue[ 'step' ] > 0 ? 0 : -1, + $propValue[ 'start' ] + $propValue[ 'loop' ] + ) + ); + } + } else { + for ($i = 1; $i <= 11; $i++) { + $start_code[ $i ] = ''; + } + if ($propType[ 'start' ] === 0) { + $start_code = + array( + min( + $propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] : $propValue[ 'loop' ] - 1, + $propValue[ 'start' ] + ) + ); + } + } + } + $propValue[ 'start' ] = join('', $start_code); + } + if ($propType[ 'start' ] !== 0) { + $initLocal[ 'start' ] = $propValue[ 'start' ]; + $propValue[ 'start' ] = "{$local}start"; + } + $initFor[ 'index' ] = "{$sectionVar}->value['index'] = {$propValue['start']}"; + if (!isset($_attr[ 'start' ]) && !isset($_attr[ 'step' ]) && !isset($_attr[ 'max' ])) { + $propValue[ 'total' ] = $propValue[ 'loop' ]; + $propType[ 'total' ] = $propType[ 'loop' ]; + } else { + $propType[ 'total' ] = + $propType[ 'start' ] + $propType[ 'loop' ] + $propType[ 'step' ] + $propType[ 'max' ]; + if ($propType[ 'total' ] === 0) { + $propValue[ 'total' ] = + min( + ceil( + ($propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] - $propValue[ 'start' ] : + (int)$propValue[ 'start' ] + 1) / abs($propValue[ 'step' ]) + ), + $propValue[ 'max' ] + ); + } else { + $total_code = array( + 1 => 'min(', 2 => 'ceil(', 3 => '(', 4 => "{$propValue['step']} > 0 ? ", + 5 => $propValue[ 'loop' ], 6 => ' - ', 7 => $propValue[ 'start' ], 8 => ' : ', + 9 => $propValue[ 'start' ], 10 => '+ 1', 11 => ')', 12 => '/ ', 13 => 'abs(', + 14 => $propValue[ 'step' ], 15 => ')', 16 => ')', 17 => ", {$propValue['max']})", + ); + if (!isset($propValue[ 'max' ])) { + $total_code[ 1 ] = $total_code[ 17 ] = ''; + } + if ($propType[ 'loop' ] + $propType[ 'start' ] === 0) { + $total_code[ 5 ] = $propValue[ 'loop' ] - $propValue[ 'start' ]; + $total_code[ 6 ] = $total_code[ 7 ] = ''; + } + if ($propType[ 'start' ] === 0) { + $total_code[ 9 ] = (int)$propValue[ 'start' ] + 1; + $total_code[ 10 ] = ''; + } + if ($propType[ 'step' ] === 0) { + $total_code[ 13 ] = $total_code[ 15 ] = ''; + if ($propValue[ 'step' ] === 1 || $propValue[ 'step' ] === -1) { + $total_code[ 2 ] = $total_code[ 12 ] = $total_code[ 14 ] = $total_code[ 16 ] = ''; + } elseif ($propValue[ 'step' ] < 0) { + $total_code[ 14 ] = -$propValue[ 'step' ]; + } + $total_code[ 4 ] = ''; + if ($propValue[ 'step' ] > 0) { + $total_code[ 8 ] = $total_code[ 9 ] = $total_code[ 10 ] = ''; + } else { + $total_code[ 5 ] = $total_code[ 6 ] = $total_code[ 7 ] = $total_code[ 8 ] = ''; + } + } + $propValue[ 'total' ] = join('', $total_code); + } + } + if (isset($namedAttr[ 'loop' ])) { + $initNamedProperty[ 'loop' ] = "'loop' => {$propValue['loop']}"; + } + if (isset($namedAttr[ 'total' ])) { + $initNamedProperty[ 'total' ] = "'total' => {$propValue['total']}"; + if ($propType[ 'total' ] > 0) { + $propValue[ 'total' ] = "{$sectionVar}->value['total']"; + } + } elseif ($propType[ 'total' ] > 0) { + $initLocal[ 'total' ] = $propValue[ 'total' ]; + $propValue[ 'total' ] = "{$local}total"; + } + $cmpFor[ 'iteration' ] = "{$propValue['iteration']} <= {$propValue['total']}"; + foreach ($initLocal as $key => $code) { + $output .= "{$local}{$key} = {$code};\n"; + } + $_vars = 'array(' . join(', ', $initNamedProperty) . ')'; + $output .= "{$sectionVar} = new Smarty_Variable({$_vars});\n"; + $cond_code = "{$propValue['total']} !== 0"; + if ($propType[ 'total' ] === 0) { + if ($propValue[ 'total' ] === 0) { + $cond_code = 'false'; + } else { + $cond_code = 'true'; + } + } + if ($propType[ 'show' ] > 0) { + $output .= "{$local}show = {$propValue['show']} ? {$cond_code} : false;\n"; + $output .= "if ({$local}show) {\n"; + } elseif ($propValue[ 'show' ] === 'true') { + $output .= "if ({$cond_code}) {\n"; + } else { + $output .= "if (false) {\n"; + } + $jinit = join(', ', $initFor); + $jcmp = join(', ', $cmpFor); + $jinc = join(', ', $incFor); + $output .= "for ({$jinit}; {$jcmp}; {$jinc}){\n"; + if (isset($namedAttr[ 'rownum' ])) { + $output .= "{$sectionVar}->value['rownum'] = {$propValue['iteration']};\n"; + } + if (isset($namedAttr[ 'index_prev' ])) { + $output .= "{$sectionVar}->value['index_prev'] = {$propValue['index']} - {$propValue['step']};\n"; + } + if (isset($namedAttr[ 'index_next' ])) { + $output .= "{$sectionVar}->value['index_next'] = {$propValue['index']} + {$propValue['step']};\n"; + } + if (isset($namedAttr[ 'first' ])) { + $output .= "{$sectionVar}->value['first'] = ({$propValue['iteration']} === 1);\n"; + } + if (isset($namedAttr[ 'last' ])) { + $output .= "{$sectionVar}->value['last'] = ({$propValue['iteration']} === {$propValue['total']});\n"; + } + $output .= '?>'; + return $output; + } +} + +/** + * Smarty Internal Plugin Compile Sectionelse Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Sectionelse extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {sectionelse} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + list($openTag, $nocache, $local, $sectionVar) = $this->closeTag($compiler, array('section')); + $this->openTag($compiler, 'sectionelse', array('sectionelse', $nocache, $local, $sectionVar)); + return "<?php }} else {\n ?>"; + } +} + +/** + * Smarty Internal Plugin Compile Sectionclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Sectionclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/section} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting--; + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + list($openTag, $compiler->nocache, $local, $sectionVar) = + $this->closeTag($compiler, array('section', 'sectionelse')); + $output = "<?php\n"; + if ($openTag === 'sectionelse') { + $output .= "}\n"; + } else { + $output .= "}\n}\n"; + } + $output .= '?>'; + return $output; + } +} diff --git a/sysplugins/smarty_internal_compile_setfilter.php b/sysplugins/smarty_internal_compile_setfilter.php new file mode 100644 index 0000000000000000000000000000000000000000..70e2e2f9fff0e82d96263e35db3a7608fe4df8ad --- /dev/null +++ b/sysplugins/smarty_internal_compile_setfilter.php @@ -0,0 +1,68 @@ +<?php +/** + * Smarty Internal Plugin Compile Setfilter + * Compiles code for setfilter tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Setfilter Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Setfilter extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for setfilter tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + $compiler->variable_filter_stack[] = $compiler->variable_filters; + $compiler->variable_filters = $parameter[ 'modifier_list' ]; + // this tag does not return compiled code + $compiler->has_code = false; + return true; + } +} + +/** + * Smarty Internal Plugin Compile Setfilterclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Setfilterclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/setfilter} tag + * This tag does not generate compiled output. It resets variable filter. + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $_attr = $this->getAttributes($compiler, $args); + // reset variable filter to previous state + if (count($compiler->variable_filter_stack)) { + $compiler->variable_filters = array_pop($compiler->variable_filter_stack); + } else { + $compiler->variable_filters = array(); + } + // this tag does not return compiled code + $compiler->has_code = false; + return true; + } +} diff --git a/sysplugins/smarty_internal_compile_shared_inheritance.php b/sysplugins/smarty_internal_compile_shared_inheritance.php new file mode 100644 index 0000000000000000000000000000000000000000..d90262e604c7d7ea5d4b5f35cebddd165da292db --- /dev/null +++ b/sysplugins/smarty_internal_compile_shared_inheritance.php @@ -0,0 +1,49 @@ +<?php +/** + * Smarty Internal Plugin Compile Shared Inheritance + * Shared methods for {extends} and {block} tags + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Shared Inheritance Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Shared_Inheritance extends Smarty_Internal_CompileBase +{ + /** + * Compile inheritance initialization code as prefix + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param bool|false $initChildSequence if true force child template + */ + public static function postCompile(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) + { + $compiler->prefixCompiledCode .= "<?php \$_smarty_tpl->_loadInheritance();\n\$_smarty_tpl->inheritance->init(\$_smarty_tpl, " . + var_export($initChildSequence, true) . ");\n?>\n"; + } + + /** + * Register post compile callback to compile inheritance initialization code + * + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * @param bool|false $initChildSequence if true force child template + */ + public function registerInit(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) + { + if ($initChildSequence || !isset($compiler->_cache[ 'inheritanceInit' ])) { + $compiler->registerPostCompileCallback( + array('Smarty_Internal_Compile_Shared_Inheritance', 'postCompile'), + array($initChildSequence), + 'inheritanceInit', + $initChildSequence + ); + $compiler->_cache[ 'inheritanceInit' ] = true; + } + } +} diff --git a/sysplugins/smarty_internal_compile_while.php b/sysplugins/smarty_internal_compile_while.php new file mode 100644 index 0000000000000000000000000000000000000000..5aa3a733015edffb6a0f380d7d4e613801a175cc --- /dev/null +++ b/sysplugins/smarty_internal_compile_while.php @@ -0,0 +1,100 @@ +<?php +/** + * Smarty Internal Plugin Compile While + * Compiles the {while} tag + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile While Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {while} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + $compiler->loopNesting++; + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $this->openTag($compiler, 'while', $compiler->nocache); + if (!array_key_exists('if condition', $parameter)) { + $compiler->trigger_template_error('missing while condition', null, true); + } + // maybe nocache because of nocache variables + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; + if (is_array($parameter[ 'if condition' ])) { + if ($compiler->nocache) { + // create nocache var to make it know for further compiling + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + } else { + $var = $parameter[ 'if condition' ][ 'var' ]; + } + $compiler->setNocacheInVariable($var); + } + $prefixVar = $compiler->getNewPrefixVariable(); + $assignCompiler = new Smarty_Internal_Compile_Assign(); + $assignAttr = array(); + $assignAttr[][ 'value' ] = $prefixVar; + if (is_array($parameter[ 'if condition' ][ 'var' ])) { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; + $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>"; + $_output .= $assignCompiler->compile( + $assignAttr, + $compiler, + array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ]) + ); + } else { + $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ]; + $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>"; + $_output .= $assignCompiler->compile($assignAttr, $compiler, array()); + } + return $_output; + } else { + return "<?php\n while ({$parameter['if condition']}) {?>"; + } + } +} + +/** + * Smarty Internal Plugin Compile Whileclose Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Compile_Whileclose extends Smarty_Internal_CompileBase +{ + /** + * Compiles code for the {/while} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return string compiled code + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + $compiler->loopNesting--; + // must endblock be nocache? + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } + $compiler->nocache = $this->closeTag($compiler, array('while')); + return "<?php }?>\n"; + } +} diff --git a/sysplugins/smarty_internal_compilebase.php b/sysplugins/smarty_internal_compilebase.php new file mode 100644 index 0000000000000000000000000000000000000000..2a32e43731722b280129c00c0675c8ae814d27ef --- /dev/null +++ b/sysplugins/smarty_internal_compilebase.php @@ -0,0 +1,203 @@ +<?php +/** + * Smarty Internal Plugin CompileBase + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * This class does extend all internal compile plugins + * + * @package Smarty + * @subpackage Compiler + */ +abstract class Smarty_Internal_CompileBase +{ + /** + * Array of names of required attribute required by tag + * + * @var array + */ + public $required_attributes = array(); + + /** + * Array of names of optional attribute required by tag + * use array('_any') if there is no restriction of attributes names + * + * @var array + */ + public $optional_attributes = array(); + + /** + * Shorttag attribute order defined by its names + * + * @var array + */ + public $shorttag_order = array(); + + /** + * Array of names of valid option flags + * + * @var array + */ + public $option_flags = array('nocache'); + + /** + * Mapping array for boolean option value + * + * @var array + */ + public $optionMap = array(1 => true, 0 => false, 'true' => true, 'false' => false); + + /** + * Mapping array with attributes as key + * + * @var array + */ + public $mapCache = array(); + + /** + * This function checks if the attributes passed are valid + * The attributes passed for the tag to compile are checked against the list of required and + * optional attributes. Required attributes must be present. Optional attributes are check against + * the corresponding list. The keyword '_any' specifies that any attribute will be accepted + * as valid + * + * @param object $compiler compiler object + * @param array $attributes attributes applied to the tag + * + * @return array of mapped attributes for further processing + */ + public function getAttributes($compiler, $attributes) + { + $_indexed_attr = array(); + if (!isset($this->mapCache[ 'option' ])) { + $this->mapCache[ 'option' ] = array_fill_keys($this->option_flags, true); + } + foreach ($attributes as $key => $mixed) { + // shorthand ? + if (!is_array($mixed)) { + // option flag ? + if (isset($this->mapCache[ 'option' ][ trim($mixed, '\'"') ])) { + $_indexed_attr[ trim($mixed, '\'"') ] = true; + // shorthand attribute ? + } elseif (isset($this->shorttag_order[ $key ])) { + $_indexed_attr[ $this->shorttag_order[ $key ] ] = $mixed; + } else { + // too many shorthands + $compiler->trigger_template_error('too many shorthand attributes', null, true); + } + // named attribute + } else { + foreach ($mixed as $k => $v) { + // option flag? + if (isset($this->mapCache[ 'option' ][ $k ])) { + if (is_bool($v)) { + $_indexed_attr[ $k ] = $v; + } else { + if (is_string($v)) { + $v = trim($v, '\'" '); + } + if (isset($this->optionMap[ $v ])) { + $_indexed_attr[ $k ] = $this->optionMap[ $v ]; + } else { + $compiler->trigger_template_error( + "illegal value '" . var_export($v, true) . + "' for option flag '{$k}'", + null, + true + ); + } + } + // must be named attribute + } else { + $_indexed_attr[ $k ] = $v; + } + } + } + } + // check if all required attributes present + foreach ($this->required_attributes as $attr) { + if (!isset($_indexed_attr[ $attr ])) { + $compiler->trigger_template_error("missing '{$attr}' attribute", null, true); + } + } + // check for not allowed attributes + if ($this->optional_attributes !== array('_any')) { + if (!isset($this->mapCache[ 'all' ])) { + $this->mapCache[ 'all' ] = + array_fill_keys( + array_merge( + $this->required_attributes, + $this->optional_attributes, + $this->option_flags + ), + true + ); + } + foreach ($_indexed_attr as $key => $dummy) { + if (!isset($this->mapCache[ 'all' ][ $key ]) && $key !== 0) { + $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true); + } + } + } + // default 'false' for all option flags not set + foreach ($this->option_flags as $flag) { + if (!isset($_indexed_attr[ $flag ])) { + $_indexed_attr[ $flag ] = false; + } + } + if (isset($_indexed_attr[ 'nocache' ]) && $_indexed_attr[ 'nocache' ]) { + $compiler->tag_nocache = true; + } + return $_indexed_attr; + } + + /** + * Push opening tag name on stack + * Optionally additional data can be saved on stack + * + * @param object $compiler compiler object + * @param string $openTag the opening tag's name + * @param mixed $data optional data saved + */ + public function openTag($compiler, $openTag, $data = null) + { + array_push($compiler->_tag_stack, array($openTag, $data)); + } + + /** + * Pop closing tag + * Raise an error if this stack-top doesn't match with expected opening tags + * + * @param object $compiler compiler object + * @param array|string $expectedTag the expected opening tag names + * + * @return mixed any type the opening tag's name or saved data + */ + public function closeTag($compiler, $expectedTag) + { + if (count($compiler->_tag_stack) > 0) { + // get stacked info + list($_openTag, $_data) = array_pop($compiler->_tag_stack); + // open tag must match with the expected ones + if (in_array($_openTag, (array)$expectedTag)) { + if (is_null($_data)) { + // return opening tag + return $_openTag; + } else { + // return restored data + return $_data; + } + } + // wrong nesting of tags + $compiler->trigger_template_error("unclosed '{$compiler->smarty->left_delimiter}{$_openTag}{$compiler->smarty->right_delimiter}' tag"); + return; + } + // wrong nesting of tags + $compiler->trigger_template_error('unexpected closing tag', null, true); + return; + } +} diff --git a/sysplugins/smarty_internal_config_file_compiler.php b/sysplugins/smarty_internal_config_file_compiler.php new file mode 100644 index 0000000000000000000000000000000000000000..90c5dcefacdfd195bb5192355c18c0b01f4b8533 --- /dev/null +++ b/sysplugins/smarty_internal_config_file_compiler.php @@ -0,0 +1,209 @@ +<?php +/** + * Smarty Internal Plugin Config File Compiler + * This is the config file compiler class. It calls the lexer and parser to + * perform the compiling. + * + * @package Smarty + * @subpackage Config + * @author Uwe Tews + */ + +/** + * Main config file compiler class + * + * @package Smarty + * @subpackage Config + */ +class Smarty_Internal_Config_File_Compiler +{ + /** + * Lexer class name + * + * @var string + */ + public $lexer_class; + + /** + * Parser class name + * + * @var string + */ + public $parser_class; + + /** + * Lexer object + * + * @var object + */ + public $lex; + + /** + * Parser object + * + * @var object + */ + public $parser; + + /** + * Smarty object + * + * @var Smarty object + */ + public $smarty; + + /** + * Smarty object + * + * @var Smarty_Internal_Template object + */ + public $template; + + /** + * Compiled config data sections and variables + * + * @var array + */ + public $config_data = array(); + + /** + * compiled config data must always be written + * + * @var bool + */ + public $write_compiled_code = true; + + /** + * Initialize compiler + * + * @param string $lexer_class class name + * @param string $parser_class class name + * @param Smarty $smarty global instance + */ + public function __construct($lexer_class, $parser_class, Smarty $smarty) + { + $this->smarty = $smarty; + // get required plugins + $this->lexer_class = $lexer_class; + $this->parser_class = $parser_class; + $this->smarty = $smarty; + $this->config_data[ 'sections' ] = array(); + $this->config_data[ 'vars' ] = array(); + } + + /** + * Method to compile Smarty config source. + * + * @param Smarty_Internal_Template $template + * + * @return bool true if compiling succeeded, false if it failed + * @throws \SmartyException + */ + public function compileTemplate(Smarty_Internal_Template $template) + { + $this->template = $template; + $this->template->compiled->file_dependency[ $this->template->source->uid ] = + array( + $this->template->source->filepath, + $this->template->source->getTimeStamp(), + $this->template->source->type + ); + if ($this->smarty->debugging) { + if (!isset($this->smarty->_debug)) { + $this->smarty->_debug = new Smarty_Internal_Debug(); + } + $this->smarty->_debug->start_compile($this->template); + } + // init the lexer/parser to compile the config file + /* @var Smarty_Internal_ConfigFileLexer $this->lex */ + $this->lex = new $this->lexer_class( + str_replace( + array( + "\r\n", + "\r" + ), + "\n", + $template->source->getContent() + ) . "\n", + $this + ); + /* @var Smarty_Internal_ConfigFileParser $this->parser */ + $this->parser = new $this->parser_class($this->lex, $this); + if (function_exists('mb_internal_encoding') + && function_exists('ini_get') + && ((int)ini_get('mbstring.func_overload')) & 2 + ) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } else { + $mbEncoding = null; + } + if ($this->smarty->_parserdebug) { + $this->parser->PrintTrace(); + } + // get tokens from lexer and parse them + while ($this->lex->yylex()) { + if ($this->smarty->_parserdebug) { + echo "<br>Parsing {$this->parser->yyTokenName[$this->lex->token]} Token {$this->lex->value} Line {$this->lex->line} \n"; + } + $this->parser->doParse($this->lex->token, $this->lex->value); + } + // finish parsing process + $this->parser->doParse(0, 0); + if ($mbEncoding) { + mb_internal_encoding($mbEncoding); + } + if ($this->smarty->debugging) { + $this->smarty->_debug->end_compile($this->template); + } + // template header code + $template_header = + "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . + "\n"; + $template_header .= " compiled from '{$this->template->source->filepath}' */ ?>\n"; + $code = '<?php $_smarty_tpl->smarty->ext->configLoad->_loadConfigVars($_smarty_tpl, ' . + var_export($this->config_data, true) . '); ?>'; + return $template_header . $this->template->smarty->ext->_codeFrame->create($this->template, $code); + } + + /** + * display compiler error messages without dying + * If parameter $args is empty it is a parser detected syntax error. + * In this case the parser is called to obtain information about expected tokens. + * If parameter $args contains a string this is used as error message + * + * @param string $args individual error message or null + * + * @throws SmartyCompilerException + */ + public function trigger_config_file_error($args = null) + { + // get config source line which has error + $line = $this->lex->line; + if (isset($args)) { + // $line--; + } + $match = preg_split("/\n/", $this->lex->data); + $error_text = + "Syntax error in config file '{$this->template->source->filepath}' on line {$line} '{$match[$line - 1]}' "; + if (isset($args)) { + // individual error message + $error_text .= $args; + } else { + // expected token from parser + foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) { + $exp_token = $this->parser->yyTokenName[ $token ]; + if (isset($this->lex->smarty_token_names[ $exp_token ])) { + // token type from lexer + $expect[] = '"' . $this->lex->smarty_token_names[ $exp_token ] . '"'; + } else { + // otherwise internal token name + $expect[] = $this->parser->yyTokenName[ $token ]; + } + } + // output parser error message + $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect); + } + throw new SmartyCompilerException($error_text); + } +} diff --git a/sysplugins/smarty_internal_configfilelexer.php b/sysplugins/smarty_internal_configfilelexer.php new file mode 100644 index 0000000000000000000000000000000000000000..afb3efcb03e110d9bb9b799aa16f0dcd8924b270 --- /dev/null +++ b/sysplugins/smarty_internal_configfilelexer.php @@ -0,0 +1,739 @@ +<?php +/** + * Smarty Internal Plugin Configfilelexer + * + * This is the lexer to break the config file source into tokens + * + * @package Smarty + * @subpackage Config + * @author Uwe Tews + */ + +/** + * Smarty_Internal_Configfilelexer + * + * This is the config file lexer. + * It is generated from the smarty_internal_configfilelexer.plex file + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ +class Smarty_Internal_Configfilelexer +{ + const START = 1; + const VALUE = 2; + const NAKED_STRING_VALUE = 3; + const COMMENT = 4; + const SECTION = 5; + const TRIPPLE = 6; + + /** + * Source + * + * @var string + */ + public $data; + + /** + * Source length + * + * @var int + */ + public $dataLength = null; + + /** + * byte counter + * + * @var int + */ + public $counter; + + /** + * token number + * + * @var int + */ + public $token; + + /** + * token value + * + * @var string + */ + public $value; + + /** + * current line + * + * @var int + */ + public $line; + + /** + * state number + * + * @var int + */ + public $state = 1; + + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + + /** + * trace file + * + * @var resource + */ + public $yyTraceFILE; + + /** + * trace prompt + * + * @var string + */ + public $yyTracePrompt; + + /** + * state names + * + * @var array + */ + public $state_name = array( + 1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE' + ); + + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + ); + + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + private $compiler = null; + + /** + * copy of config_booleanize + * + * @var bool + */ + private $configBooleanize = false; + + /** + * storage for assembled token patterns + * + * @var string + */ + private $yy_global_pattern1 = null; + + private $yy_global_pattern2 = null; + + private $yy_global_pattern3 = null; + + private $yy_global_pattern4 = null; + + private $yy_global_pattern5 = null; + + private $yy_global_pattern6 = null; + + private $_yy_state = 1; + + private $_yy_stack = array(); + + /** + * constructor + * + * @param string $data template source + * @param Smarty_Internal_Config_File_Compiler $compiler + */ + public function __construct($data, Smarty_Internal_Config_File_Compiler $compiler) + { + $this->data = $data . "\n"; //now all lines are \n-terminated + $this->dataLength = strlen($data); + $this->counter = 0; + if (preg_match('/^\xEF\xBB\xBF/', $this->data, $match)) { + $this->counter += strlen($match[ 0 ]); + } + $this->line = 1; + $this->compiler = $compiler; + $this->smarty = $compiler->smarty; + $this->configBooleanize = $this->smarty->config_booleanize; + } + + public function replace($input) + { + return $input; + } // end function + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + public function yylex() + { + return $this->{'yylex' . $this->_yy_state}(); + } + + public function yypushstate($state) + { + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%sState push %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state + ); + } + array_push($this->_yy_stack, $this->_yy_state); + $this->_yy_state = $state; + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state + ); + } + } + + public function yypopstate() + { + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%sState pop %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state + ); + } + $this->_yy_state = array_pop($this->_yy_stack); + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state + ); + } + } + + public function yybegin($state) + { + $this->_yy_state = $state; + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%sState set %s\n", + $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state + ); + } + } + + public function yylex1() + { + if (!isset($this->yy_global_pattern1)) { + $this->yy_global_pattern1 = + $this->replace("/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr( + $this->data, + $this->counter, + 5 + ) . '... state START'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r1_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r1_1() + { + $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART; + $this->yypushstate(self::COMMENT); + } + + public function yy_r1_2() + { + $this->token = Smarty_Internal_Configfileparser::TPC_OPENB; + $this->yypushstate(self::SECTION); + } + + public function yy_r1_3() + { + $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB; + } + + public function yy_r1_4() + { + $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL; + $this->yypushstate(self::VALUE); + } // end function + + public function yy_r1_5() + { + return false; + } + + public function yy_r1_6() + { + $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; + } + + public function yy_r1_7() + { + $this->token = Smarty_Internal_Configfileparser::TPC_ID; + } + + public function yy_r1_8() + { + $this->token = Smarty_Internal_Configfileparser::TPC_OTHER; + } + + public function yylex2() + { + if (!isset($this->yy_global_pattern2)) { + $this->yy_global_pattern2 = + $this->replace("/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr( + $this->data, + $this->counter, + 5 + ) . '... state VALUE'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r2_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r2_1() + { + return false; + } + + public function yy_r2_2() + { + $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT; + $this->yypopstate(); + } + + public function yy_r2_3() + { + $this->token = Smarty_Internal_Configfileparser::TPC_INT; + $this->yypopstate(); + } + + public function yy_r2_4() + { + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES; + $this->yypushstate(self::TRIPPLE); + } + + public function yy_r2_5() + { + $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING; + $this->yypopstate(); + } + + public function yy_r2_6() + { + $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING; + $this->yypopstate(); + } // end function + + public function yy_r2_7() + { + if (!$this->configBooleanize || + !in_array(strtolower($this->value), array('true', 'false', 'on', 'off', 'yes', 'no'))) { + $this->yypopstate(); + $this->yypushstate(self::NAKED_STRING_VALUE); + return true; //reprocess in new state + } else { + $this->token = Smarty_Internal_Configfileparser::TPC_BOOL; + $this->yypopstate(); + } + } + + public function yy_r2_8() + { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->yypopstate(); + } + + public function yy_r2_9() + { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->value = ''; + $this->yypopstate(); + } // end function + + public function yylex3() + { + if (!isset($this->yy_global_pattern3)) { + $this->yy_global_pattern3 = $this->replace("/\G([^\n]+?(?=[ \t\r]*\n))/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr( + $this->data, + $this->counter, + 5 + ) . '... state NAKED_STRING_VALUE'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r3_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r3_1() + { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + $this->yypopstate(); + } + + public function yylex4() + { + if (!isset($this->yy_global_pattern4)) { + $this->yy_global_pattern4 = $this->replace("/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr( + $this->data, + $this->counter, + 5 + ) . '... state COMMENT'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r4_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r4_1() + { + return false; + } + + public function yy_r4_2() + { + $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; + } // end function + + public function yy_r4_3() + { + $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; + $this->yypopstate(); + } + + public function yylex5() + { + if (!isset($this->yy_global_pattern5)) { + $this->yy_global_pattern5 = $this->replace("/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr( + $this->data, + $this->counter, + 5 + ) . '... state SECTION'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r5_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r5_1() + { + $this->token = Smarty_Internal_Configfileparser::TPC_DOT; + } + + public function yy_r5_2() + { + $this->token = Smarty_Internal_Configfileparser::TPC_SECTION; + $this->yypopstate(); + } // end function + + public function yylex6() + { + if (!isset($this->yy_global_pattern6)) { + $this->yy_global_pattern6 = $this->replace("/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr( + $this->data, + $this->counter, + 5 + ) . '... state TRIPPLE'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r6_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r6_1() + { + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END; + $this->yypopstate(); + $this->yypushstate(self::START); + } + + public function yy_r6_2() + { + $to = strlen($this->data); + preg_match("/\"\"\"[ \t\r]*[\n#;]/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[ 0 ][ 1 ])) { + $to = $match[ 0 ][ 1 ]; + } else { + $this->compiler->trigger_config_file_error('missing or misspelled literal closing tag'); + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT; + } +} diff --git a/sysplugins/smarty_internal_configfileparser.php b/sysplugins/smarty_internal_configfileparser.php new file mode 100644 index 0000000000000000000000000000000000000000..36fdb76eeb020cd857cb6c54c09cbcc7573705b7 --- /dev/null +++ b/sysplugins/smarty_internal_configfileparser.php @@ -0,0 +1,1046 @@ +<?php + +class TPC_yyStackEntry +{ + public $stateno; /* The state-number */ + public $major; /* The major token value. This is the code + ** number for the token at this stack level */ + public $minor; /* The user-supplied minor token value. This + ** is the value of the token */ +} + +// line 12 "../smarty/lexer/smarty_internal_configfileparser.y" + +/** + * Smarty Internal Plugin Configfileparse + * + * This is the config file parser. + * It is generated from the smarty_internal_configfileparser.y file + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ +class Smarty_Internal_Configfileparser +{ + // line 25 "../smarty/lexer/smarty_internal_configfileparser.y" + const TPC_OPENB = 1; + const TPC_SECTION = 2; + const TPC_CLOSEB = 3; + const TPC_DOT = 4; + const TPC_ID = 5; + const TPC_EQUAL = 6; + const TPC_FLOAT = 7; + const TPC_INT = 8; + const TPC_BOOL = 9; + const TPC_SINGLE_QUOTED_STRING = 10; + const TPC_DOUBLE_QUOTED_STRING = 11; + const TPC_TRIPPLE_QUOTES = 12; + const TPC_TRIPPLE_TEXT = 13; + const TPC_TRIPPLE_QUOTES_END = 14; + const TPC_NAKED_STRING = 15; + const TPC_OTHER = 16; + const TPC_NEWLINE = 17; + const TPC_COMMENTSTART = 18; + const YY_NO_ACTION = 60; + const YY_ACCEPT_ACTION = 59; + const YY_ERROR_ACTION = 58; + const YY_SZ_ACTTAB = 38; + const YY_SHIFT_USE_DFLT = -8; + const YY_SHIFT_MAX = 19; + const YY_REDUCE_USE_DFLT = -17; + const YY_REDUCE_MAX = 10; + const YYNOCODE = 29; + const YYSTACKDEPTH = 100; + const YYNSTATE = 36; + const YYNRULE = 22; + const YYERRORSYMBOL = 19; + const YYERRSYMDT = 'yy0'; + const YYFALLBACK = 0; + + public static $yy_action = array( + 32, 31, 30, 29, 35, 13, 19, 3, 24, 26, + 59, 9, 14, 1, 16, 25, 11, 28, 25, 11, + 17, 27, 34, 20, 18, 15, 23, 5, 6, 22, + 10, 8, 4, 12, 2, 33, 7, 21, + ); + + public static $yy_lookahead = array( + 7, 8, 9, 10, 11, 12, 5, 23, 15, 16, + 20, 21, 2, 23, 4, 17, 18, 14, 17, 18, + 13, 14, 25, 26, 15, 2, 17, 3, 3, 17, + 25, 25, 6, 1, 23, 27, 22, 24, + ); + + public static $yy_shift_ofst = array( + -8, 1, 1, 1, -7, -2, -2, 32, -8, -8, + -8, 9, 10, 7, 25, 24, 23, 3, 12, 26, + ); + + public static $yy_reduce_ofst = array( + -10, -3, -3, -3, 8, 6, 5, 13, 11, 14, + -16, + ); + + public static $yyExpectedTokens = array( + array(), + array(5, 17, 18,), + array(5, 17, 18,), + array(5, 17, 18,), + array(7, 8, 9, 10, 11, 12, 15, 16,), + array(17, 18,), + array(17, 18,), + array(1,), + array(), + array(), + array(), + array(15, 17,), + array(2, 4,), + array(13, 14,), + array(3,), + array(3,), + array(2,), + array(14,), + array(17,), + array(6,), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + ); + + public static $yy_default = array( + 44, 37, 41, 40, 58, 58, 58, 36, 44, 39, + 44, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 43, 38, 57, 56, 53, 55, 54, 52, 51, 49, + 48, 47, 46, 45, 42, 50, + ); + + public static $yyFallback = array(); + + public static $yyRuleName = array( + 'start ::= global_vars sections', + 'global_vars ::= var_list', + 'sections ::= sections section', + 'sections ::=', + 'section ::= OPENB SECTION CLOSEB newline var_list', + 'section ::= OPENB DOT SECTION CLOSEB newline var_list', + 'var_list ::= var_list newline', + 'var_list ::= var_list var', + 'var_list ::=', + 'var ::= ID EQUAL value', + 'value ::= FLOAT', + 'value ::= INT', + 'value ::= BOOL', + 'value ::= SINGLE_QUOTED_STRING', + 'value ::= DOUBLE_QUOTED_STRING', + 'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END', + 'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END', + 'value ::= NAKED_STRING', + 'value ::= OTHER', + 'newline ::= NEWLINE', + 'newline ::= COMMENTSTART NEWLINE', + 'newline ::= COMMENTSTART NAKED_STRING NEWLINE', + ); + + public static $yyRuleInfo = array( + array(0 => 20, 1 => 2), + array(0 => 21, 1 => 1), + array(0 => 22, 1 => 2), + array(0 => 22, 1 => 0), + array(0 => 24, 1 => 5), + array(0 => 24, 1 => 6), + array(0 => 23, 1 => 2), + array(0 => 23, 1 => 2), + array(0 => 23, 1 => 0), + array(0 => 26, 1 => 3), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 3), + array(0 => 27, 1 => 2), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 25, 1 => 1), + array(0 => 25, 1 => 2), + array(0 => 25, 1 => 3), + ); + + public static $yyReduceMap = array( + 0 => 0, + 2 => 0, + 3 => 0, + 19 => 0, + 20 => 0, + 21 => 0, + 1 => 1, + 4 => 4, + 5 => 5, + 6 => 6, + 7 => 7, + 8 => 8, + 9 => 9, + 10 => 10, + 11 => 11, + 12 => 12, + 13 => 13, + 14 => 14, + 15 => 15, + 16 => 16, + 17 => 17, + 18 => 17, + ); + + /** + * helper map + * + * @var array + */ + private static $escapes_single = array( + '\\' => '\\', + '\'' => '\'' + ); + + /** + * result status + * + * @var bool + */ + public $successful = true; + + /** + * return value + * + * @var mixed + */ + public $retvalue = 0; + + /** + * @var + */ + public $yymajor; + + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + public $compiler = null; + + /** + * smarty object + * + * @var Smarty + */ + public $smarty = null; + + public $yyTraceFILE; + + public $yyTracePrompt; + + public $yyidx; + + public $yyerrcnt; + + public $yystack = array(); + + public $yyTokenName = array( + '$', 'OPENB', 'SECTION', 'CLOSEB', + 'DOT', 'ID', 'EQUAL', 'FLOAT', + 'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', + 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING', + 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error', + 'start', 'global_vars', 'sections', 'var_list', + 'section', 'newline', 'var', 'value', + ); + + /** + * lexer object + * + * @var Smarty_Internal_Configfilelexer + */ + private $lex; + + /** + * internal error flag + * + * @var bool + */ + private $internalError = false; + + /** + * copy of config_overwrite property + * + * @var bool + */ + private $configOverwrite = false; + + /** + * copy of config_read_hidden property + * + * @var bool + */ + private $configReadHidden = false; + + private $_retvalue; + + /** + * constructor + * + * @param Smarty_Internal_Configfilelexer $lex + * @param Smarty_Internal_Config_File_Compiler $compiler + */ + public function __construct(Smarty_Internal_Configfilelexer $lex, Smarty_Internal_Config_File_Compiler $compiler) + { + $this->lex = $lex; + $this->smarty = $compiler->smarty; + $this->compiler = $compiler; + $this->configOverwrite = $this->smarty->config_overwrite; + $this->configReadHidden = $this->smarty->config_read_hidden; + } + + public static function yy_destructor($yymajor, $yypminor) + { + switch ($yymajor) { + default: + break; /* If no destructor action specified: do nothing */ + } + } + + /** + * parse single quoted string + * remove outer quotes + * unescape inner quotes + * + * @param string $qstr + * + * @return string + */ + private static function parse_single_quoted_string($qstr) + { + $escaped_string = substr($qstr, 1, strlen($qstr) - 2); //remove outer quotes + $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE); + $str = ''; + foreach ($ss as $s) { + if (strlen($s) === 2 && $s[ 0 ] === '\\') { + if (isset(self::$escapes_single[ $s[ 1 ] ])) { + $s = self::$escapes_single[ $s[ 1 ] ]; + } + } + $str .= $s; + } + return $str; + } /* Index of top element in stack */ + /** + * parse double quoted string + * + * @param string $qstr + * + * @return string + */ + private static function parse_double_quoted_string($qstr) + { + $inner_str = substr($qstr, 1, strlen($qstr) - 2); + return stripcslashes($inner_str); + } /* Shifts left before out of the error */ + /** + * parse triple quoted string + * + * @param string $qstr + * + * @return string + */ + private static function parse_tripple_double_quoted_string($qstr) + { + return stripcslashes($qstr); + } /* The parser's stack */ + public function Trace($TraceFILE, $zTracePrompt) + { + if (!$TraceFILE) { + $zTracePrompt = 0; + } elseif (!$zTracePrompt) { + $TraceFILE = 0; + } + $this->yyTraceFILE = $TraceFILE; + $this->yyTracePrompt = $zTracePrompt; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + public function tokenName($tokenType) + { + if ($tokenType === 0) { + return 'End of Input'; + } + if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) { + return $this->yyTokenName[ $tokenType ]; + } else { + return 'Unknown'; + } + } + + public function yy_pop_parser_stack() + { + if (empty($this->yystack)) { + return; + } + $yytos = array_pop($this->yystack); + if ($this->yyTraceFILE && $this->yyidx >= 0) { + fwrite( + $this->yyTraceFILE, + $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . + "\n" + ); + } + $yymajor = $yytos->major; + self::yy_destructor($yymajor, $yytos->minor); + $this->yyidx--; + return $yymajor; + } + + public function __destruct() + { + while ($this->yystack !== array()) { + $this->yy_pop_parser_stack(); + } + if (is_resource($this->yyTraceFILE)) { + fclose($this->yyTraceFILE); + } + } + + public function yy_get_expected_tokens($token) + { + static $res3 = array(); + static $res4 = array(); + $state = $this->yystack[ $this->yyidx ]->stateno; + $expected = self::$yyExpectedTokens[ $state ]; + if (isset($res3[ $state ][ $token ])) { + if ($res3[ $state ][ $token ]) { + return $expected; + } + } else { + if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) { + return $expected; + } + } + $stack = $this->yystack; + $yyidx = $this->yyidx; + do { + $yyact = $this->yy_find_shift_action($token); + if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) { + // reduce action + $done = 0; + do { + if ($done++ === 100) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // too much recursion prevents proper detection + // so give up + return array_unique($expected); + } + $yyruleno = $yyact - self::YYNSTATE; + $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ] + ); + if (isset(self::$yyExpectedTokens[ $nextstate ])) { + $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]); + if (isset($res4[ $nextstate ][ $token ])) { + if ($res4[ $nextstate ][ $token ]) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + } else { + if ($res4[ $nextstate ][ $token ] = + in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + } + } + if ($nextstate < self::YYNSTATE) { + // we need to shift a non-terminal + $this->yyidx++; + $x = new TPC_yyStackEntry; + $x->stateno = $nextstate; + $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; + $this->yystack[ $this->yyidx ] = $x; + continue 2; + } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // the last token was just ignored, we can't accept + // by ignoring input, this is in essence ignoring a + // syntax error! + return array_unique($expected); + } elseif ($nextstate === self::YY_NO_ACTION) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // input accepted, but not shifted (I guess) + return $expected; + } else { + $yyact = $nextstate; + } + } while (true); + } + break; + } while (true); + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + + public function yy_is_expected_token($token) + { + static $res = array(); + static $res2 = array(); + if ($token === 0) { + return true; // 0 is not part of this + } + $state = $this->yystack[ $this->yyidx ]->stateno; + if (isset($res[ $state ][ $token ])) { + if ($res[ $state ][ $token ]) { + return true; + } + } else { + if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) { + return true; + } + } + $stack = $this->yystack; + $yyidx = $this->yyidx; + do { + $yyact = $this->yy_find_shift_action($token); + if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) { + // reduce action + $done = 0; + do { + if ($done++ === 100) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // too much recursion prevents proper detection + // so give up + return true; + } + $yyruleno = $yyact - self::YYNSTATE; + $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ] + ); + if (isset($res2[ $nextstate ][ $token ])) { + if ($res2[ $nextstate ][ $token ]) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + } else { + if ($res2[ $nextstate ][ $token ] = + (isset(self::$yyExpectedTokens[ $nextstate ]) && + in_array($token, self::$yyExpectedTokens[ $nextstate ], true))) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + } + if ($nextstate < self::YYNSTATE) { + // we need to shift a non-terminal + $this->yyidx++; + $x = new TPC_yyStackEntry; + $x->stateno = $nextstate; + $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; + $this->yystack[ $this->yyidx ] = $x; + continue 2; + } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + if (!$token) { + // end of input: this is valid + return true; + } + // the last token was just ignored, we can't accept + // by ignoring input, this is in essence ignoring a + // syntax error! + return false; + } elseif ($nextstate === self::YY_NO_ACTION) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // input accepted, but not shifted (I guess) + return true; + } else { + $yyact = $nextstate; + } + } while (true); + } + break; + } while (true); + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + + public function yy_find_shift_action($iLookAhead) + { + $stateno = $this->yystack[ $this->yyidx ]->stateno; + /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */ + if (!isset(self::$yy_shift_ofst[ $stateno ])) { + // no shift actions + return self::$yy_default[ $stateno ]; + } + $i = self::$yy_shift_ofst[ $stateno ]; + if ($i === self::YY_SHIFT_USE_DFLT) { + return self::$yy_default[ $stateno ]; + } + if ($iLookAhead === self::YYNOCODE) { + return self::YY_NO_ACTION; + } + $i += $iLookAhead; + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { + if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) + && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) { + if ($this->yyTraceFILE) { + fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'FALLBACK ' . + $this->yyTokenName[ $iLookAhead ] . ' => ' . + $this->yyTokenName[ $iFallback ] . "\n"); + } + return $this->yy_find_shift_action($iFallback); + } + return self::$yy_default[ $stateno ]; + } else { + return self::$yy_action[ $i ]; + } + } + + public function yy_find_reduce_action($stateno, $iLookAhead) + { + /* $stateno = $this->yystack[$this->yyidx]->stateno; */ + if (!isset(self::$yy_reduce_ofst[ $stateno ])) { + return self::$yy_default[ $stateno ]; + } + $i = self::$yy_reduce_ofst[ $stateno ]; + if ($i === self::YY_REDUCE_USE_DFLT) { + return self::$yy_default[ $stateno ]; + } + if ($iLookAhead === self::YYNOCODE) { + return self::YY_NO_ACTION; + } + $i += $iLookAhead; + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { + return self::$yy_default[ $stateno ]; + } else { + return self::$yy_action[ $i ]; + } + } + + public function yy_shift($yyNewState, $yyMajor, $yypMinor) + { + $this->yyidx++; + if ($this->yyidx >= self::YYSTACKDEPTH) { + $this->yyidx--; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + // line 239 "../smarty/lexer/smarty_internal_configfileparser.y" + $this->internalError = true; + $this->compiler->trigger_config_file_error('Stack overflow in configfile parser'); + return; + } + $yytos = new TPC_yyStackEntry; + $yytos->stateno = $yyNewState; + $yytos->major = $yyMajor; + $yytos->minor = $yypMinor; + $this->yystack[] = $yytos; + if ($this->yyTraceFILE && $this->yyidx > 0) { + fprintf( + $this->yyTraceFILE, + "%sShift %d\n", + $this->yyTracePrompt, + $yyNewState + ); + fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt); + for ($i = 1; $i <= $this->yyidx; $i++) { + fprintf( + $this->yyTraceFILE, + " %s", + $this->yyTokenName[ $this->yystack[ $i ]->major ] + ); + } + fwrite($this->yyTraceFILE, "\n"); + } + } + + public function yy_r0() + { + $this->_retvalue = null; + } + + public function yy_r1() + { + $this->add_global_vars($this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = null; + } + + public function yy_r4() + { + $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = null; + } + + // line 245 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r5() + { + if ($this->configReadHidden) { + $this->add_section_vars( + $this->yystack[ $this->yyidx + -3 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor + ); + } + $this->_retvalue = null; + } + + // line 250 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r6() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + // line 264 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r7() + { + $this->_retvalue = + array_merge($this->yystack[ $this->yyidx + -1 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 269 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r8() + { + $this->_retvalue = array(); + } + + // line 277 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r9() + { + $this->_retvalue = + array( + 'key' => $this->yystack[ $this->yyidx + -2 ]->minor, + 'value' => $this->yystack[ $this->yyidx + 0 ]->minor + ); + } + + // line 281 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r10() + { + $this->_retvalue = (float)$this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 285 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r11() + { + $this->_retvalue = (int)$this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 291 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r12() + { + $this->_retvalue = $this->parse_bool($this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 296 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r13() + { + $this->_retvalue = self::parse_single_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 300 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r14() + { + $this->_retvalue = self::parse_double_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 304 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r15() + { + $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + -1 ]->minor); + } + + // line 308 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r16() + { + $this->_retvalue = ''; + } + + // line 312 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_r17() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 316 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_reduce($yyruleno) + { + if ($this->yyTraceFILE && $yyruleno >= 0 + && $yyruleno < count(self::$yyRuleName)) { + fprintf( + $this->yyTraceFILE, + "%sReduce (%d) [%s].\n", + $this->yyTracePrompt, + $yyruleno, + self::$yyRuleName[ $yyruleno ] + ); + } + $this->_retvalue = $yy_lefthand_side = null; + if (isset(self::$yyReduceMap[ $yyruleno ])) { + // call the action + $this->_retvalue = null; + $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}(); + $yy_lefthand_side = $this->_retvalue; + } + $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ]; + $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ]; + $this->yyidx -= $yysize; + for ($i = $yysize; $i; $i--) { + // pop all of the right-hand side parameters + array_pop($this->yystack); + } + $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto); + if ($yyact < self::YYNSTATE) { + if (!$this->yyTraceFILE && $yysize) { + $this->yyidx++; + $x = new TPC_yyStackEntry; + $x->stateno = $yyact; + $x->major = $yygoto; + $x->minor = $yy_lefthand_side; + $this->yystack[ $this->yyidx ] = $x; + } else { + $this->yy_shift($yyact, $yygoto, $yy_lefthand_side); + } + } elseif ($yyact === self::YYNSTATE + self::YYNRULE + 1) { + $this->yy_accept(); + } + } + + // line 320 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_parse_failed() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + } + + // line 324 "../smarty/lexer/smarty_internal_configfileparser.y" + public function yy_syntax_error($yymajor, $TOKEN) + { + // line 232 "../smarty/lexer/smarty_internal_configfileparser.y" + $this->internalError = true; + $this->yymajor = $yymajor; + $this->compiler->trigger_config_file_error(); + } + + public function yy_accept() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + // line 225 "../smarty/lexer/smarty_internal_configfileparser.y" + $this->successful = !$this->internalError; + $this->internalError = false; + $this->retvalue = $this->_retvalue; + } + + public function doParse($yymajor, $yytokenvalue) + { + $yyerrorhit = 0; /* True if yymajor has invoked an error */ + if ($this->yyidx === null || $this->yyidx < 0) { + $this->yyidx = 0; + $this->yyerrcnt = -1; + $x = new TPC_yyStackEntry; + $x->stateno = 0; + $x->major = 0; + $this->yystack = array(); + $this->yystack[] = $x; + } + $yyendofinput = ($yymajor == 0); + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%sInput %s\n", + $this->yyTracePrompt, + $this->yyTokenName[ $yymajor ] + ); + } + do { + $yyact = $this->yy_find_shift_action($yymajor); + if ($yymajor < self::YYERRORSYMBOL && + !$this->yy_is_expected_token($yymajor)) { + // force a syntax error + $yyact = self::YY_ERROR_ACTION; + } + if ($yyact < self::YYNSTATE) { + $this->yy_shift($yyact, $yymajor, $yytokenvalue); + $this->yyerrcnt--; + if ($yyendofinput && $this->yyidx >= 0) { + $yymajor = 0; + } else { + $yymajor = self::YYNOCODE; + } + } elseif ($yyact < self::YYNSTATE + self::YYNRULE) { + $this->yy_reduce($yyact - self::YYNSTATE); + } elseif ($yyact === self::YY_ERROR_ACTION) { + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%sSyntax Error!\n", + $this->yyTracePrompt + ); + } + if (self::YYERRORSYMBOL) { + if ($this->yyerrcnt < 0) { + $this->yy_syntax_error($yymajor, $yytokenvalue); + } + $yymx = $this->yystack[ $this->yyidx ]->major; + if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) { + if ($this->yyTraceFILE) { + fprintf( + $this->yyTraceFILE, + "%sDiscard input token %s\n", + $this->yyTracePrompt, + $this->yyTokenName[ $yymajor ] + ); + } + $this->yy_destructor($yymajor, $yytokenvalue); + $yymajor = self::YYNOCODE; + } else { + while ($this->yyidx >= 0 && + $yymx !== self::YYERRORSYMBOL && + ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE + ) { + $this->yy_pop_parser_stack(); + } + if ($this->yyidx < 0 || $yymajor == 0) { + $this->yy_destructor($yymajor, $yytokenvalue); + $this->yy_parse_failed(); + $yymajor = self::YYNOCODE; + } elseif ($yymx !== self::YYERRORSYMBOL) { + $u2 = 0; + $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2); + } + } + $this->yyerrcnt = 3; + $yyerrorhit = 1; + } else { + if ($this->yyerrcnt <= 0) { + $this->yy_syntax_error($yymajor, $yytokenvalue); + } + $this->yyerrcnt = 3; + $this->yy_destructor($yymajor, $yytokenvalue); + if ($yyendofinput) { + $this->yy_parse_failed(); + } + $yymajor = self::YYNOCODE; + } + } else { + $this->yy_accept(); + $yymajor = self::YYNOCODE; + } + } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0); + } + + /** + * parse optional boolean keywords + * + * @param string $str + * + * @return bool + */ + private function parse_bool($str) + { + $str = strtolower($str); + if (in_array($str, array('on', 'yes', 'true'))) { + $res = true; + } else { + $res = false; + } + return $res; + } + + /** + * set a config variable in target array + * + * @param array $var + * @param array $target_array + */ + private function set_var(array $var, array &$target_array) + { + $key = $var[ 'key' ]; + $value = $var[ 'value' ]; + if ($this->configOverwrite || !isset($target_array[ 'vars' ][ $key ])) { + $target_array[ 'vars' ][ $key ] = $value; + } else { + settype($target_array[ 'vars' ][ $key ], 'array'); + $target_array[ 'vars' ][ $key ][] = $value; + } + } + + /** + * add config variable to global vars + * + * @param array $vars + */ + private function add_global_vars(array $vars) + { + if (!isset($this->compiler->config_data[ 'vars' ])) { + $this->compiler->config_data[ 'vars' ] = array(); + } + foreach ($vars as $var) { + $this->set_var($var, $this->compiler->config_data); + } + } + + /** + * add config variable to section + * + * @param string $section_name + * @param array $vars + */ + private function add_section_vars($section_name, array $vars) + { + if (!isset($this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ])) { + $this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ] = array(); + } + foreach ($vars as $var) { + $this->set_var($var, $this->compiler->config_data[ 'sections' ][ $section_name ]); + } + } +} diff --git a/sysplugins/smarty_internal_data.php b/sysplugins/smarty_internal_data.php new file mode 100644 index 0000000000000000000000000000000000000000..98e3e57b34db7ea01b92f1fd7eb7e53f6d191178 --- /dev/null +++ b/sysplugins/smarty_internal_data.php @@ -0,0 +1,292 @@ +<?php +/** + * Smarty Internal Plugin Data + * This file contains the basic classes and methods for template and variable creation + * + * @package Smarty + * @subpackage Template + * @author Uwe Tews + */ + +/** + * Base class with template and variable methods + * + * @package Smarty + * @subpackage Template + * + * @property int $scope + * @property Smarty $smarty + * The following methods will be dynamically loaded by the extension handler when they are called. + * They are located in a corresponding Smarty_Internal_Method_xxxx class + * + * @method mixed _getConfigVariable(string $varName, bool $errorEnable = true) + * @method mixed getConfigVariable(string $varName, bool $errorEnable = true) + * @method mixed getConfigVars(string $varName = null, bool $searchParents = true) + * @method mixed getGlobal(string $varName = null) + * @method mixed getStreamVariable(string $variable) + * @method Smarty_Internal_Data clearAssign(mixed $tpl_var) + * @method Smarty_Internal_Data clearAllAssign() + * @method Smarty_Internal_Data clearConfig(string $varName = null) + * @method Smarty_Internal_Data configLoad(string $config_file, mixed $sections = null, string $scope = 'local') + */ +abstract class Smarty_Internal_Data +{ + /** + * This object type (Smarty = 1, template = 2, data = 4) + * + * @var int + */ + public $_objType = 4; + + /** + * name of class used for templates + * + * @var string + */ + public $template_class = 'Smarty_Internal_Template'; + + /** + * template variables + * + * @var Smarty_Variable[] + */ + public $tpl_vars = array(); + + /** + * parent template (if any) + * + * @var Smarty|Smarty_Internal_Template|Smarty_Data + */ + public $parent = null; + + /** + * configuration settings + * + * @var string[] + */ + public $config_vars = array(); + + /** + * extension handler + * + * @var Smarty_Internal_Extension_Handler + */ + public $ext = null; + + /** + * Smarty_Internal_Data constructor. + * + * Install extension handler + */ + public function __construct() + { + $this->ext = new Smarty_Internal_Extension_Handler(); + $this->ext->objType = $this->_objType; + } + + /** + * assigns a Smarty variable + * + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will be not cached + * + * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for + * chaining + */ + public function assign($tpl_var, $value = null, $nocache = false) + { + if (is_array($tpl_var)) { + foreach ($tpl_var as $_key => $_val) { + $this->assign($_key, $_val, $nocache); + } + } else { + if ($tpl_var !== '') { + if ($this->_objType === 2) { + /** + * + * + * @var Smarty_Internal_Template $this + */ + $this->_assignInScope($tpl_var, $value, $nocache); + } else { + $this->tpl_vars[ $tpl_var ] = new Smarty_Variable($value, $nocache); + } + } + } + return $this; + } + + /** + * appends values to template variables + * + * @api Smarty::append() + * @link http://www.smarty.net/docs/en/api.append.tpl + * + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to append + * @param bool $merge flag if array elements shall be merged + * @param bool $nocache if true any output of this variable will + * be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function append($tpl_var, $value = null, $merge = false, $nocache = false) + { + return $this->ext->append->append($this, $tpl_var, $value, $merge, $nocache); + } + + /** + * assigns a global Smarty variable + * + * @param string $varName the global variable name + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function assignGlobal($varName, $value = null, $nocache = false) + { + return $this->ext->assignGlobal->assignGlobal($this, $varName, $value, $nocache); + } + + /** + * appends values to template variables by reference + * + * @param string $tpl_var the template variable name + * @param mixed &$value the referenced value to append + * @param boolean $merge flag if array elements shall be merged + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function appendByRef($tpl_var, &$value, $merge = false) + { + return $this->ext->appendByRef->appendByRef($this, $tpl_var, $value, $merge); + } + + /** + * assigns values to template variables by reference + * + * @param string $tpl_var the template variable name + * @param $value + * @param boolean $nocache if true any output of this variable will be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function assignByRef($tpl_var, &$value, $nocache = false) + { + return $this->ext->assignByRef->assignByRef($this, $tpl_var, $value, $nocache); + } + + /** + * Returns a single or all template variables + * + * @api Smarty::getTemplateVars() + * @link http://www.smarty.net/docs/en/api.get.template.vars.tpl + * + * @param string $varName variable name or null + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr optional pointer to data object + * @param bool $searchParents include parent templates? + * + * @return mixed variable value or or array of variables + */ + public function getTemplateVars($varName = null, Smarty_Internal_Data $_ptr = null, $searchParents = true) + { + return $this->ext->getTemplateVars->getTemplateVars($this, $varName, $_ptr, $searchParents); + } + + /** + * gets the object of a Smarty variable + * + * @param string $variable the name of the Smarty variable + * @param Smarty_Internal_Data $_ptr optional pointer to data object + * @param boolean $searchParents search also in parent data + * @param bool $error_enable + * + * @return Smarty_Variable|Smarty_Undefined_Variable the object of the variable + * @deprecated since 3.1.28 please use Smarty_Internal_Data::getTemplateVars() instead. + */ + public function getVariable( + $variable = null, + Smarty_Internal_Data $_ptr = null, + $searchParents = true, + $error_enable = true + ) { + return $this->ext->getTemplateVars->_getVariable($this, $variable, $_ptr, $searchParents, $error_enable); + } + + /** + * Follow the parent chain an merge template and config variables + * + * @param \Smarty_Internal_Data|null $data + */ + public function _mergeVars(Smarty_Internal_Data $data = null) + { + if (isset($data)) { + if (!empty($this->tpl_vars)) { + $data->tpl_vars = array_merge($this->tpl_vars, $data->tpl_vars); + } + if (!empty($this->config_vars)) { + $data->config_vars = array_merge($this->config_vars, $data->config_vars); + } + } else { + $data = $this; + } + if (isset($this->parent)) { + $this->parent->_mergeVars($data); + } + } + + /** + * Return true if this instance is a Data obj + * + * @return bool + */ + public function _isDataObj() + { + return $this->_objType === 4; + } + + /** + * Return true if this instance is a template obj + * + * @return bool + */ + public function _isTplObj() + { + return $this->_objType === 2; + } + + /** + * Return true if this instance is a Smarty obj + * + * @return bool + */ + public function _isSmartyObj() + { + return $this->_objType === 1; + } + + /** + * Get Smarty object + * + * @return Smarty + */ + public function _getSmartyObj() + { + return $this->smarty; + } + + /** + * Handle unknown class methods + * + * @param string $name unknown method-name + * @param array $args argument array + * + * @return mixed + */ + public function __call($name, $args) + { + return $this->ext->_callExternalMethod($this, $name, $args); + } +} diff --git a/sysplugins/smarty_internal_debug.php b/sysplugins/smarty_internal_debug.php new file mode 100644 index 0000000000000000000000000000000000000000..24b233e26a03342550c4a81cf0f0752cb9965246 --- /dev/null +++ b/sysplugins/smarty_internal_debug.php @@ -0,0 +1,425 @@ +<?php +/** + * Smarty Internal Plugin Debug + * Class to collect data for the Smarty Debugging Console + * + * @package Smarty + * @subpackage Debug + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Debug Class + * + * @package Smarty + * @subpackage Debug + */ +class Smarty_Internal_Debug extends Smarty_Internal_Data +{ + /** + * template data + * + * @var array + */ + public $template_data = array(); + + /** + * List of uid's which shall be ignored + * + * @var array + */ + public $ignore_uid = array(); + + /** + * Index of display() and fetch() calls + * + * @var int + */ + public $index = 0; + + /** + * Counter for window offset + * + * @var int + */ + public $offset = 0; + + /** + * Start logging template + * + * @param \Smarty_Internal_Template $template template + * @param null $mode true: display false: fetch null: subtemplate + */ + public function start_template(Smarty_Internal_Template $template, $mode = null) + { + if (isset($mode) && !$template->_isSubTpl()) { + $this->index++; + $this->offset++; + $this->template_data[ $this->index ] = null; + } + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'start_template_time' ] = microtime(true); + } + + /** + * End logging of cache time + * + * @param \Smarty_Internal_Template $template cached template + */ + public function end_template(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'total_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_template_time' ]; + //$this->template_data[$this->index][$key]['properties'] = $template->properties; + } + + /** + * Start logging of compile time + * + * @param \Smarty_Internal_Template $template + */ + public function start_compile(Smarty_Internal_Template $template) + { + static $_is_stringy = array('string' => true, 'eval' => true); + if (!empty($template->compiler->trace_uid)) { + $key = $template->compiler->trace_uid; + if (!isset($this->template_data[ $this->index ][ $key ])) { + if (isset($_is_stringy[ $template->source->type ])) { + $this->template_data[ $this->index ][ $key ][ 'name' ] = + '\'' . substr($template->source->name, 0, 25) . '...\''; + } else { + $this->template_data[ $this->index ][ $key ][ 'name' ] = $template->source->filepath; + } + $this->template_data[ $this->index ][ $key ][ 'compile_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'render_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'cache_time' ] = 0; + } + } else { + if (isset($this->ignore_uid[ $template->source->uid ])) { + return; + } + $key = $this->get_key($template); + } + $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true); + } + + /** + * End logging of compile time + * + * @param \Smarty_Internal_Template $template + */ + public function end_compile(Smarty_Internal_Template $template) + { + if (!empty($template->compiler->trace_uid)) { + $key = $template->compiler->trace_uid; + } else { + if (isset($this->ignore_uid[ $template->source->uid ])) { + return; + } + $key = $this->get_key($template); + } + $this->template_data[ $this->index ][ $key ][ 'compile_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ]; + } + + /** + * Start logging of render time + * + * @param \Smarty_Internal_Template $template + */ + public function start_render(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true); + } + + /** + * End logging of compile time + * + * @param \Smarty_Internal_Template $template + */ + public function end_render(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'render_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ]; + } + + /** + * Start logging of cache time + * + * @param \Smarty_Internal_Template $template cached template + */ + public function start_cache(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true); + } + + /** + * End logging of cache time + * + * @param \Smarty_Internal_Template $template cached template + */ + public function end_cache(Smarty_Internal_Template $template) + { + $key = $this->get_key($template); + $this->template_data[ $this->index ][ $key ][ 'cache_time' ] += + microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ]; + } + + /** + * Register template object + * + * @param \Smarty_Internal_Template $template cached template + */ + public function register_template(Smarty_Internal_Template $template) + { + } + + /** + * Register data object + * + * @param \Smarty_Data $data data object + */ + public static function register_data(Smarty_Data $data) + { + } + + /** + * Opens a window for the Smarty Debugging Console and display the data + * + * @param Smarty_Internal_Template|Smarty $obj object to debug + * @param bool $full + * + * @throws \Exception + * @throws \SmartyException + */ + public function display_debug($obj, $full = false) + { + if (!$full) { + $this->offset++; + $savedIndex = $this->index; + $this->index = 9999; + } + $smarty = $obj->_getSmartyObj(); + // create fresh instance of smarty for displaying the debug console + // to avoid problems if the application did overload the Smarty class + $debObj = new Smarty(); + // copy the working dirs from application + $debObj->setCompileDir($smarty->getCompileDir()); + // init properties by hand as user may have edited the original Smarty class + $debObj->setPluginsDir(is_dir(dirname(__FILE__) . '/../plugins') ? dirname(__FILE__) . + '/../plugins' : $smarty->getPluginsDir()); + $debObj->force_compile = false; + $debObj->compile_check = Smarty::COMPILECHECK_ON; + $debObj->left_delimiter = '{'; + $debObj->right_delimiter = '}'; + $debObj->security_policy = null; + $debObj->debugging = false; + $debObj->debugging_ctrl = 'NONE'; + $debObj->error_reporting = E_ALL & ~E_NOTICE; + $debObj->debug_tpl = + isset($smarty->debug_tpl) ? $smarty->debug_tpl : 'file:' . dirname(__FILE__) . '/../debug.tpl'; + $debObj->registered_plugins = array(); + $debObj->registered_resources = array(); + $debObj->registered_filters = array(); + $debObj->autoload_filters = array(); + $debObj->default_modifiers = array(); + $debObj->escape_html = true; + $debObj->caching = Smarty::CACHING_OFF; + $debObj->compile_id = null; + $debObj->cache_id = null; + // prepare information of assigned variables + $ptr = $this->get_debug_vars($obj); + $_assigned_vars = $ptr->tpl_vars; + ksort($_assigned_vars); + $_config_vars = $ptr->config_vars; + ksort($_config_vars); + $debugging = $smarty->debugging; + $_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj); + if ($obj->_isTplObj()) { + $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name); + } + if ($obj->_objType === 1 || $full) { + $_template->assign('template_data', $this->template_data[ $this->index ]); + } else { + $_template->assign('template_data', null); + } + $_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); + echo $_template->fetch(); + if (isset($full)) { + $this->index--; + } + if (!$full) { + $this->index = $savedIndex; + } + } + + /** + * Recursively gets variables from all template/data scopes + * + * @param Smarty_Internal_Template|Smarty_Data $obj object to debug + * + * @return StdClass + */ + public function get_debug_vars($obj) + { + $config_vars = array(); + foreach ($obj->config_vars as $key => $var) { + $config_vars[ $key ][ 'value' ] = $var; + if ($obj->_isTplObj()) { + $config_vars[ $key ][ 'scope' ] = $obj->source->type . ':' . $obj->source->name; + } elseif ($obj->_isDataObj()) { + $tpl_vars[ $key ][ 'scope' ] = $obj->dataObjectName; + } else { + $config_vars[ $key ][ 'scope' ] = 'Smarty object'; + } + } + $tpl_vars = array(); + foreach ($obj->tpl_vars as $key => $var) { + foreach ($var as $varkey => $varvalue) { + if ($varkey === 'value') { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } else { + if ($varkey === 'nocache') { + if ($varvalue === true) { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } + } else { + if ($varkey !== 'scope' || $varvalue !== 0) { + $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue; + } + } + } + } + if ($obj->_isTplObj()) { + $tpl_vars[ $key ][ 'scope' ] = $obj->source->type . ':' . $obj->source->name; + } elseif ($obj->_isDataObj()) { + $tpl_vars[ $key ][ 'scope' ] = $obj->dataObjectName; + } else { + $tpl_vars[ $key ][ 'scope' ] = 'Smarty object'; + } + } + if (isset($obj->parent)) { + $parent = $this->get_debug_vars($obj->parent); + foreach ($parent->tpl_vars as $name => $pvar) { + if (isset($tpl_vars[ $name ]) && $tpl_vars[ $name ][ 'value' ] === $pvar[ 'value' ]) { + $tpl_vars[ $name ][ 'scope' ] = $pvar[ 'scope' ]; + } + } + $tpl_vars = array_merge($parent->tpl_vars, $tpl_vars); + foreach ($parent->config_vars as $name => $pvar) { + if (isset($config_vars[ $name ]) && $config_vars[ $name ][ 'value' ] === $pvar[ 'value' ]) { + $config_vars[ $name ][ 'scope' ] = $pvar[ 'scope' ]; + } + } + $config_vars = array_merge($parent->config_vars, $config_vars); + } else { + foreach (Smarty::$global_tpl_vars as $key => $var) { + if (!array_key_exists($key, $tpl_vars)) { + foreach ($var as $varkey => $varvalue) { + if ($varkey === 'value') { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } else { + if ($varkey === 'nocache') { + if ($varvalue === true) { + $tpl_vars[ $key ][ $varkey ] = $varvalue; + } + } else { + if ($varkey !== 'scope' || $varvalue !== 0) { + $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue; + } + } + } + } + $tpl_vars[ $key ][ 'scope' ] = 'Global'; + } + } + } + return (object)array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars); + } + + /** + * Return key into $template_data for template + * + * @param \Smarty_Internal_Template $template template object + * + * @return string key into $template_data + */ + private function get_key(Smarty_Internal_Template $template) + { + static $_is_stringy = array('string' => true, 'eval' => true); + // calculate Uid if not already done + if ($template->source->uid === '') { + $template->source->filepath; + } + $key = $template->source->uid; + if (isset($this->template_data[ $this->index ][ $key ])) { + return $key; + } else { + if (isset($_is_stringy[ $template->source->type ])) { + $this->template_data[ $this->index ][ $key ][ 'name' ] = + '\'' . substr($template->source->name, 0, 25) . '...\''; + } else { + $this->template_data[ $this->index ][ $key ][ 'name' ] = $template->source->filepath; + } + $this->template_data[ $this->index ][ $key ][ 'compile_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'render_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'cache_time' ] = 0; + $this->template_data[ $this->index ][ $key ][ 'total_time' ] = 0; + return $key; + } + } + + /** + * Ignore template + * + * @param \Smarty_Internal_Template $template + */ + public function ignore(Smarty_Internal_Template $template) + { + // calculate Uid if not already done + if ($template->source->uid === '') { + $template->source->filepath; + } + $this->ignore_uid[ $template->source->uid ] = true; + } + + /** + * handle 'URL' debugging mode + * + * @param Smarty $smarty + */ + public function debugUrl(Smarty $smarty) + { + if (isset($_SERVER[ 'QUERY_STRING' ])) { + $_query_string = $_SERVER[ 'QUERY_STRING' ]; + } else { + $_query_string = ''; + } + if (false !== strpos($_query_string, $smarty->smarty_debug_id)) { + if (false !== strpos($_query_string, $smarty->smarty_debug_id . '=on')) { + // enable debugging for this browser session + setcookie('SMARTY_DEBUG', true); + $smarty->debugging = true; + } elseif (false !== strpos($_query_string, $smarty->smarty_debug_id . '=off')) { + // disable debugging for this browser session + setcookie('SMARTY_DEBUG', false); + $smarty->debugging = false; + } else { + // enable debugging for this page + $smarty->debugging = true; + } + } else { + if (isset($_COOKIE[ 'SMARTY_DEBUG' ])) { + $smarty->debugging = true; + } + } + } +} diff --git a/sysplugins/smarty_internal_errorhandler.php b/sysplugins/smarty_internal_errorhandler.php new file mode 100644 index 0000000000000000000000000000000000000000..56dca18fa94b5d37524a5b1c7ee3b7f8b321c311 --- /dev/null +++ b/sysplugins/smarty_internal_errorhandler.php @@ -0,0 +1,113 @@ +<?php + +/** + * Smarty error handler + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + * + * @deprecated +Smarty does no longer use @filemtime() + */ +class Smarty_Internal_ErrorHandler +{ + /** + * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors() + */ + public static $mutedDirectories = array(); + + /** + * error handler returned by set_error_handler() in self::muteExpectedErrors() + */ + private static $previousErrorHandler = null; + + /** + * Enable error handler to mute expected messages + * + */ + public static function muteExpectedErrors() + { + /* + error muting is done because some people implemented custom error_handlers using + http://php.net/set_error_handler and for some reason did not understand the following paragraph: + + It is important to remember that the standard PHP error handler is completely bypassed for the + error types specified by error_types unless the callback function returns FALSE. + error_reporting() settings will have no effect and your error handler will be called regardless - + however you are still able to read the current value of error_reporting and act appropriately. + Of particular note is that this value will be 0 if the statement that caused the error was + prepended by the @ error-control operator. + + Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include + - @filemtime() is almost twice as fast as using an additional file_exists() + - between file_exists() and filemtime() a possible race condition is opened, + which does not exist using the simple @filemtime() approach. + */ + $error_handler = array('Smarty_Internal_ErrorHandler', 'mutingErrorHandler'); + $previous = set_error_handler($error_handler); + // avoid dead loops + if ($previous !== $error_handler) { + self::$previousErrorHandler = $previous; + } + } + + /** + * Error Handler to mute expected messages + * + * @link http://php.net/set_error_handler + * + * @param integer $errno Error level + * @param $errstr + * @param $errfile + * @param $errline + * @param $errcontext + * + * @return bool + */ + public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext = array()) + { + $_is_muted_directory = false; + // add the SMARTY_DIR to the list of muted directories + if (!isset(self::$mutedDirectories[ SMARTY_DIR ])) { + $smarty_dir = realpath(SMARTY_DIR); + if ($smarty_dir !== false) { + self::$mutedDirectories[ SMARTY_DIR ] = + array('file' => $smarty_dir, 'length' => strlen($smarty_dir),); + } + } + // walk the muted directories and test against $errfile + foreach (self::$mutedDirectories as $key => &$dir) { + if (!$dir) { + // resolve directory and length for speedy comparisons + $file = realpath($key); + if ($file === false) { + // this directory does not exist, remove and skip it + unset(self::$mutedDirectories[ $key ]); + continue; + } + $dir = array('file' => $file, 'length' => strlen($file),); + } + if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) { + $_is_muted_directory = true; + break; + } + } + // pass to next error handler if this error did not occur inside SMARTY_DIR + // or the error was within smarty but masked to be ignored + if (!$_is_muted_directory || ($errno && $errno & error_reporting())) { + if (self::$previousErrorHandler) { + return call_user_func( + self::$previousErrorHandler, + $errno, + $errstr, + $errfile, + $errline, + $errcontext + ); + } else { + return false; + } + } + } +} diff --git a/sysplugins/smarty_internal_extension_handler.php b/sysplugins/smarty_internal_extension_handler.php new file mode 100644 index 0000000000000000000000000000000000000000..b07615526da26cfac78b2a9a56687bd33ff32dae --- /dev/null +++ b/sysplugins/smarty_internal_extension_handler.php @@ -0,0 +1,197 @@ +<?php + +/** + * Smarty Extension handler + * + * Load extensions dynamically + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + * + * Runtime extensions + * @property Smarty_Internal_Runtime_CacheModify $_cacheModify + * @property Smarty_Internal_Runtime_CacheResourceFile $_cacheResourceFile + * @property Smarty_Internal_Runtime_Capture $_capture + * @property Smarty_Internal_Runtime_CodeFrame $_codeFrame + * @property Smarty_Internal_Runtime_FilterHandler $_filterHandler + * @property Smarty_Internal_Runtime_Foreach $_foreach + * @property Smarty_Internal_Runtime_GetIncludePath $_getIncludePath + * @property Smarty_Internal_Runtime_Make_Nocache $_make_nocache + * @property Smarty_Internal_Runtime_UpdateCache $_updateCache + * @property Smarty_Internal_Runtime_UpdateScope $_updateScope + * @property Smarty_Internal_Runtime_TplFunction $_tplFunction + * @property Smarty_Internal_Runtime_WriteFile $_writeFile + * + * Method extensions + * @property Smarty_Internal_Method_GetTemplateVars $getTemplateVars + * @property Smarty_Internal_Method_Append $append + * @property Smarty_Internal_Method_AppendByRef $appendByRef + * @property Smarty_Internal_Method_AssignGlobal $assignGlobal + * @property Smarty_Internal_Method_AssignByRef $assignByRef + * @property Smarty_Internal_Method_LoadFilter $loadFilter + * @property Smarty_Internal_Method_LoadPlugin $loadPlugin + * @property Smarty_Internal_Method_RegisterFilter $registerFilter + * @property Smarty_Internal_Method_RegisterObject $registerObject + * @property Smarty_Internal_Method_RegisterPlugin $registerPlugin + * @property mixed|\Smarty_Template_Cached configLoad + */ +class Smarty_Internal_Extension_Handler +{ + public $objType = null; + + /** + * Cache for property information from generic getter/setter + * Preloaded with names which should not use with generic getter/setter + * + * @var array + */ + private $_property_info = array( + 'AutoloadFilters' => 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0, + 'DebugTemplate' => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0, + 'TemplateVars' => 0, 'Literals' => 'Literals', + );// + + private $resolvedProperties = array(); + + /** + * Call external Method + * + * @param \Smarty_Internal_Data $data + * @param string $name external method names + * @param array $args argument array + * + * @return mixed + */ + public function _callExternalMethod(Smarty_Internal_Data $data, $name, $args) + { + /* @var Smarty $data ->smarty */ + $smarty = isset($data->smarty) ? $data->smarty : $data; + if (!isset($smarty->ext->$name)) { + if (preg_match('/^((set|get)|(.*?))([A-Z].*)$/', $name, $match)) { + $basename = $this->upperCase($match[ 4 ]); + if (!isset($smarty->ext->$basename) && isset($this->_property_info[ $basename ]) + && is_string($this->_property_info[ $basename ]) + ) { + $class = 'Smarty_Internal_Method_' . $this->_property_info[ $basename ]; + if (class_exists($class)) { + $classObj = new $class(); + $methodes = get_class_methods($classObj); + foreach ($methodes as $method) { + $smarty->ext->$method = $classObj; + } + } + } + if (!empty($match[ 2 ]) && !isset($smarty->ext->$name)) { + $class = 'Smarty_Internal_Method_' . $this->upperCase($name); + if (!class_exists($class)) { + $objType = $data->_objType; + $propertyType = false; + if (!isset($this->resolvedProperties[ $match[ 0 ] ][ $objType ])) { + $property = isset($this->resolvedProperties[ 'property' ][ $basename ]) ? + $this->resolvedProperties[ 'property' ][ $basename ] : + $property = $this->resolvedProperties[ 'property' ][ $basename ] = strtolower( + join( + '_', + preg_split( + '/([A-Z][^A-Z]*)/', + $basename, + -1, + PREG_SPLIT_NO_EMPTY | + PREG_SPLIT_DELIM_CAPTURE + ) + ) + ); + if ($property !== false) { + if (property_exists($data, $property)) { + $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ] = 1; + } elseif (property_exists($smarty, $property)) { + $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ] = 2; + } else { + $this->resolvedProperties[ 'property' ][ $basename ] = $property = false; + } + } + } else { + $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ]; + $property = $this->resolvedProperties[ 'property' ][ $basename ]; + } + if ($propertyType) { + $obj = $propertyType === 1 ? $data : $smarty; + if ($match[ 2 ] === 'get') { + return $obj->$property; + } elseif ($match[ 2 ] === 'set') { + return $obj->$property = $args[ 0 ]; + } + } + } + } + } + } + $callback = array($smarty->ext->$name, $name); + array_unshift($args, $data); + if (isset($callback) && $callback[ 0 ]->objMap | $data->_objType) { + return call_user_func_array($callback, $args); + } + return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), $args); + } + + /** + * Make first character of name parts upper case + * + * @param string $name + * + * @return string + */ + public function upperCase($name) + { + $_name = explode('_', $name); + $_name = array_map('ucfirst', $_name); + return implode('_', $_name); + } + + /** + * get extension object + * + * @param string $property_name property name + * + * @return mixed|Smarty_Template_Cached + */ + public function __get($property_name) + { + // object properties of runtime template extensions will start with '_' + if ($property_name[ 0 ] === '_') { + $class = 'Smarty_Internal_Runtime' . $this->upperCase($property_name); + } else { + $class = 'Smarty_Internal_Method_' . $this->upperCase($property_name); + } + if (!class_exists($class)) { + return $this->$property_name = new Smarty_Internal_Undefined($class); + } + return $this->$property_name = new $class(); + } + + /** + * set extension property + * + * @param string $property_name property name + * @param mixed $value value + * + */ + public function __set($property_name, $value) + { + $this->$property_name = $value; + } + + /** + * Call error handler for undefined method + * + * @param string $name unknown method-name + * @param array $args argument array + * + * @return mixed + */ + public function __call($name, $args) + { + return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), array($this)); + } +} diff --git a/sysplugins/smarty_internal_method_addautoloadfilters.php b/sysplugins/smarty_internal_method_addautoloadfilters.php new file mode 100644 index 0000000000000000000000000000000000000000..a05f55a8228bd1ef8f78ae0f8ecface0b6544d32 --- /dev/null +++ b/sysplugins/smarty_internal_method_addautoloadfilters.php @@ -0,0 +1,53 @@ +<?php + +/** + * Smarty Method AddAutoloadFilters + * + * Smarty::addAutoloadFilters() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_AddAutoloadFilters extends Smarty_Internal_Method_SetAutoloadFilters +{ + /** + * Add autoload filters + * + * @api Smarty::setAutoloadFilters() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array $filters filters to load automatically + * @param string $type "pre", "output", … specify + * the filter type to set. + * Defaults to none treating + * $filters' keys as the + * appropriate types + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function addAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null) + { + $smarty = $obj->_getSmartyObj(); + if ($type !== null) { + $this->_checkFilterType($type); + if (!empty($smarty->autoload_filters[ $type ])) { + $smarty->autoload_filters[ $type ] = array_merge($smarty->autoload_filters[ $type ], (array)$filters); + } else { + $smarty->autoload_filters[ $type ] = (array)$filters; + } + } else { + foreach ((array)$filters as $type => $value) { + $this->_checkFilterType($type); + if (!empty($smarty->autoload_filters[ $type ])) { + $smarty->autoload_filters[ $type ] = + array_merge($smarty->autoload_filters[ $type ], (array)$value); + } else { + $smarty->autoload_filters[ $type ] = (array)$value; + } + } + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_adddefaultmodifiers.php b/sysplugins/smarty_internal_method_adddefaultmodifiers.php new file mode 100644 index 0000000000000000000000000000000000000000..c3feb3d8b97295c2efe06b67dd4f2c4d0b47c38a --- /dev/null +++ b/sysplugins/smarty_internal_method_adddefaultmodifiers.php @@ -0,0 +1,42 @@ +<?php + +/** + * Smarty Method AddDefaultModifiers + * + * Smarty::addDefaultModifiers() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_AddDefaultModifiers +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Add default modifiers + * + * @api Smarty::addDefaultModifiers() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array|string $modifiers modifier or list of modifiers + * to add + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function addDefaultModifiers(Smarty_Internal_TemplateBase $obj, $modifiers) + { + $smarty = $obj->_getSmartyObj(); + if (is_array($modifiers)) { + $smarty->default_modifiers = array_merge($smarty->default_modifiers, $modifiers); + } else { + $smarty->default_modifiers[] = $modifiers; + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_append.php b/sysplugins/smarty_internal_method_append.php new file mode 100644 index 0000000000000000000000000000000000000000..881375efe9c2825e01b08c76f7e6b3a71124f57e --- /dev/null +++ b/sysplugins/smarty_internal_method_append.php @@ -0,0 +1,74 @@ +<?php + +/** + * Smarty Method Append + * + * Smarty::append() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_Append +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * appends values to template variables + * + * @api Smarty::append() + * @link http://www.smarty.net/docs/en/api.append.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to append + * @param bool $merge flag if array elements shall be merged + * @param bool $nocache if true any output of this variable will + * be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function append(Smarty_Internal_Data $data, $tpl_var, $value = null, $merge = false, $nocache = false) + { + if (is_array($tpl_var)) { + // $tpl_var is an array, ignore $value + foreach ($tpl_var as $_key => $_val) { + if ($_key !== '') { + $this->append($data, $_key, $_val, $merge, $nocache); + } + } + } else { + if ($tpl_var !== '' && isset($value)) { + if (!isset($data->tpl_vars[ $tpl_var ])) { + $tpl_var_inst = $data->ext->getTemplateVars->_getVariable($data, $tpl_var, null, true, false); + if ($tpl_var_inst instanceof Smarty_Undefined_Variable) { + $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache); + } else { + $data->tpl_vars[ $tpl_var ] = clone $tpl_var_inst; + } + } + if (!(is_array($data->tpl_vars[ $tpl_var ]->value) + || $data->tpl_vars[ $tpl_var ]->value instanceof ArrayAccess) + ) { + settype($data->tpl_vars[ $tpl_var ]->value, 'array'); + } + if ($merge && is_array($value)) { + foreach ($value as $_mkey => $_mval) { + $data->tpl_vars[ $tpl_var ]->value[ $_mkey ] = $_mval; + } + } else { + $data->tpl_vars[ $tpl_var ]->value[] = $value; + } + } + if ($data->_isTplObj() && $data->scope) { + $data->ext->_updateScope->_updateScope($data, $tpl_var); + } + } + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_appendbyref.php b/sysplugins/smarty_internal_method_appendbyref.php new file mode 100644 index 0000000000000000000000000000000000000000..c9590446005074bcd54ab7cc7bccdd580df4e9ac --- /dev/null +++ b/sysplugins/smarty_internal_method_appendbyref.php @@ -0,0 +1,49 @@ +<?php + +/** + * Smarty Method AppendByRef + * + * Smarty::appendByRef() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_AppendByRef +{ + /** + * appends values to template variables by reference + * + * @api Smarty::appendByRef() + * @link http://www.smarty.net/docs/en/api.append.by.ref.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $tpl_var the template variable name + * @param mixed &$value the referenced value to append + * @param bool $merge flag if array elements shall be merged + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public static function appendByRef(Smarty_Internal_Data $data, $tpl_var, &$value, $merge = false) + { + if ($tpl_var !== '' && isset($value)) { + if (!isset($data->tpl_vars[ $tpl_var ])) { + $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(); + } + if (!is_array($data->tpl_vars[ $tpl_var ]->value)) { + settype($data->tpl_vars[ $tpl_var ]->value, 'array'); + } + if ($merge && is_array($value)) { + foreach ($value as $_key => $_val) { + $data->tpl_vars[ $tpl_var ]->value[ $_key ] = &$value[ $_key ]; + } + } else { + $data->tpl_vars[ $tpl_var ]->value[] = &$value; + } + if ($data->_isTplObj() && $data->scope) { + $data->ext->_updateScope->_updateScope($data, $tpl_var); + } + } + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_assignbyref.php b/sysplugins/smarty_internal_method_assignbyref.php new file mode 100644 index 0000000000000000000000000000000000000000..fa705bb80d8dce98b7f70515fde9077730383d3b --- /dev/null +++ b/sysplugins/smarty_internal_method_assignbyref.php @@ -0,0 +1,36 @@ +<?php + +/** + * Smarty Method AssignByRef + * + * Smarty::assignByRef() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_AssignByRef +{ + /** + * assigns values to template variables by reference + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $tpl_var the template variable name + * @param $value + * @param boolean $nocache if true any output of this variable will + * be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function assignByRef(Smarty_Internal_Data $data, $tpl_var, &$value, $nocache) + { + if ($tpl_var !== '') { + $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache); + $data->tpl_vars[ $tpl_var ]->value = &$value; + if ($data->_isTplObj() && $data->scope) { + $data->ext->_updateScope->_updateScope($data, $tpl_var); + } + } + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_assignglobal.php b/sysplugins/smarty_internal_method_assignglobal.php new file mode 100644 index 0000000000000000000000000000000000000000..08cfa4693ed8a706345bea0e471677af4663f0be --- /dev/null +++ b/sysplugins/smarty_internal_method_assignglobal.php @@ -0,0 +1,44 @@ +<?php + +/** + * Smarty Method AssignGlobal + * + * Smarty::assignGlobal() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_AssignGlobal +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * assigns a global Smarty variable + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $varName the global variable name + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will + * be not cached + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function assignGlobal(Smarty_Internal_Data $data, $varName, $value = null, $nocache = false) + { + if ($varName !== '') { + Smarty::$global_tpl_vars[ $varName ] = new Smarty_Variable($value, $nocache); + $ptr = $data; + while ($ptr->_isTplObj()) { + $ptr->tpl_vars[ $varName ] = clone Smarty::$global_tpl_vars[ $varName ]; + $ptr = $ptr->parent; + } + } + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_clearallassign.php b/sysplugins/smarty_internal_method_clearallassign.php new file mode 100644 index 0000000000000000000000000000000000000000..29ff2ffb047000c9c1c21cdf74b490a65ee480f4 --- /dev/null +++ b/sysplugins/smarty_internal_method_clearallassign.php @@ -0,0 +1,36 @@ +<?php + +/** + * Smarty Method ClearAllAssign + * + * Smarty::clearAllAssign() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ClearAllAssign +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * clear all the assigned template variables. + * + * @api Smarty::clearAllAssign() + * @link http://www.smarty.net/docs/en/api.clear.all.assign.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function clearAllAssign(Smarty_Internal_Data $data) + { + $data->tpl_vars = array(); + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_clearallcache.php b/sysplugins/smarty_internal_method_clearallcache.php new file mode 100644 index 0000000000000000000000000000000000000000..30d55f7d200fd594565201e87ced47083f0a0c83 --- /dev/null +++ b/sysplugins/smarty_internal_method_clearallcache.php @@ -0,0 +1,41 @@ +<?php + +/** + * Smarty Method ClearAllCache + * + * Smarty::clearAllCache() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ClearAllCache +{ + /** + * Valid for Smarty object + * + * @var int + */ + public $objMap = 1; + + /** + * Empty cache folder + * + * @api Smarty::clearAllCache() + * @link http://www.smarty.net/docs/en/api.clear.all.cache.tpl + * + * @param \Smarty $smarty + * @param integer $exp_time expiration time + * @param string $type resource type + * + * @return int number of cache files deleted + * @throws \SmartyException + */ + public function clearAllCache(Smarty $smarty, $exp_time = null, $type = null) + { + $smarty->_clearTemplateCache(); + // load cache resource and call clearAll + $_cache_resource = Smarty_CacheResource::load($smarty, $type); + return $_cache_resource->clearAll($smarty, $exp_time); + } +} diff --git a/sysplugins/smarty_internal_method_clearassign.php b/sysplugins/smarty_internal_method_clearassign.php new file mode 100644 index 0000000000000000000000000000000000000000..22bfa2d31d0cb555ffd4d1686692cebc719ba1fe --- /dev/null +++ b/sysplugins/smarty_internal_method_clearassign.php @@ -0,0 +1,43 @@ +<?php + +/** + * Smarty Method ClearAssign + * + * Smarty::clearAssign() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ClearAssign +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * clear the given assigned template variable(s). + * + * @api Smarty::clearAssign() + * @link http://www.smarty.net/docs/en/api.clear.assign.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string|array $tpl_var the template variable(s) to clear + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function clearAssign(Smarty_Internal_Data $data, $tpl_var) + { + if (is_array($tpl_var)) { + foreach ($tpl_var as $curr_var) { + unset($data->tpl_vars[ $curr_var ]); + } + } else { + unset($data->tpl_vars[ $tpl_var ]); + } + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_clearcache.php b/sysplugins/smarty_internal_method_clearcache.php new file mode 100644 index 0000000000000000000000000000000000000000..a5dd4e26ebc27721847677434d654595c0df3544 --- /dev/null +++ b/sysplugins/smarty_internal_method_clearcache.php @@ -0,0 +1,50 @@ +<?php + +/** + * Smarty Method ClearCache + * + * Smarty::clearCache() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ClearCache +{ + /** + * Valid for Smarty object + * + * @var int + */ + public $objMap = 1; + + /** + * Empty cache for a specific template + * + * @api Smarty::clearCache() + * @link http://www.smarty.net/docs/en/api.clear.cache.tpl + * + * @param \Smarty $smarty + * @param string $template_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @param string $type resource type + * + * @return int number of cache files deleted + * @throws \SmartyException + */ + public function clearCache( + Smarty $smarty, + $template_name, + $cache_id = null, + $compile_id = null, + $exp_time = null, + $type = null + ) { + $smarty->_clearTemplateCache(); + // load cache resource and call clear + $_cache_resource = Smarty_CacheResource::load($smarty, $type); + return $_cache_resource->clear($smarty, $template_name, $cache_id, $compile_id, $exp_time); + } +} diff --git a/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/sysplugins/smarty_internal_method_clearcompiledtemplate.php new file mode 100644 index 0000000000000000000000000000000000000000..bf49298079d2df0991d274f017f57299212681d1 --- /dev/null +++ b/sysplugins/smarty_internal_method_clearcompiledtemplate.php @@ -0,0 +1,131 @@ +<?php + +/** + * Smarty Method ClearCompiledTemplate + * + * Smarty::clearCompiledTemplate() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ClearCompiledTemplate +{ + /** + * Valid for Smarty object + * + * @var int + */ + public $objMap = 1; + + /** + * Delete compiled template file + * + * @api Smarty::clearCompiledTemplate() + * @link http://www.smarty.net/docs/en/api.clear.compiled.template.tpl + * + * @param \Smarty $smarty + * @param string $resource_name template name + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * + * @return int number of template files deleted + * @throws \SmartyException + */ + public function clearCompiledTemplate(Smarty $smarty, $resource_name = null, $compile_id = null, $exp_time = null) + { + // clear template objects cache + $smarty->_clearTemplateCache(); + $_compile_dir = $smarty->getCompileDir(); + if ($_compile_dir === '/') { //We should never want to delete this! + return 0; + } + $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null; + $_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'; + if (isset($resource_name)) { + $_save_stat = $smarty->caching; + $smarty->caching = Smarty::CACHING_OFF; + /* @var Smarty_Internal_Template $tpl */ + $tpl = $smarty->createTemplate($resource_name); + $smarty->caching = $_save_stat; + if (!$tpl->source->handler->uncompiled && !$tpl->source->handler->recompiled && $tpl->source->exists) { + $_resource_part_1 = basename(str_replace('^', DIRECTORY_SEPARATOR, $tpl->compiled->filepath)); + $_resource_part_1_length = strlen($_resource_part_1); + } else { + return 0; + } + $_resource_part_2 = str_replace('.php', '.cache.php', $_resource_part_1); + $_resource_part_2_length = strlen($_resource_part_2); + } + $_dir = $_compile_dir; + if ($smarty->use_sub_dirs && isset($_compile_id)) { + $_dir .= $_compile_id . $_dir_sep; + } + if (isset($_compile_id)) { + $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep; + $_compile_id_part_length = strlen($_compile_id_part); + } + $_count = 0; + try { + $_compileDirs = new RecursiveDirectoryIterator($_dir); + // NOTE: UnexpectedValueException thrown for PHP >= 5.3 + } catch (Exception $e) { + return 0; + } + $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); + foreach ($_compile as $_file) { + if (substr(basename($_file->getPathname()), 0, 1) === '.') { + continue; + } + $_filepath = (string)$_file; + if ($_file->isDir()) { + if (!$_compile->isDot()) { + // delete folder if empty + @rmdir($_file->getPathname()); + } + } else { + // delete only php files + if (substr($_filepath, -4) !== '.php') { + continue; + } + $unlink = false; + if ((!isset($_compile_id) || + (isset($_filepath[ $_compile_id_part_length ]) && + $a = !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) + && (!isset($resource_name) || (isset($_filepath[ $_resource_part_1_length ]) + && substr_compare( + $_filepath, + $_resource_part_1, + -$_resource_part_1_length, + $_resource_part_1_length + ) === 0) || (isset($_filepath[ $_resource_part_2_length ]) + && substr_compare( + $_filepath, + $_resource_part_2, + -$_resource_part_2_length, + $_resource_part_2_length + ) === 0)) + ) { + if (isset($exp_time)) { + if (is_file($_filepath) && time() - filemtime($_filepath) >= $exp_time) { + $unlink = true; + } + } else { + $unlink = true; + } + } + if ($unlink && is_file($_filepath) && @unlink($_filepath)) { + $_count++; + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api')) < 1) + ) { + opcache_invalidate($_filepath, true); + } elseif (function_exists('apc_delete_file')) { + apc_delete_file($_filepath); + } + } + } + } + return $_count; + } +} diff --git a/sysplugins/smarty_internal_method_clearconfig.php b/sysplugins/smarty_internal_method_clearconfig.php new file mode 100644 index 0000000000000000000000000000000000000000..15bf492a168924a8642616db6623cad48b6c6d0f --- /dev/null +++ b/sysplugins/smarty_internal_method_clearconfig.php @@ -0,0 +1,41 @@ +<?php + +/** + * Smarty Method ClearConfig + * + * Smarty::clearConfig() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ClearConfig +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * clear a single or all config variables + * + * @api Smarty::clearConfig() + * @link http://www.smarty.net/docs/en/api.clear.config.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string|null $name variable name or null + * + * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty + */ + public function clearConfig(Smarty_Internal_Data $data, $name = null) + { + if (isset($name)) { + unset($data->config_vars[ $name ]); + } else { + $data->config_vars = array(); + } + return $data; + } +} diff --git a/sysplugins/smarty_internal_method_compileallconfig.php b/sysplugins/smarty_internal_method_compileallconfig.php new file mode 100644 index 0000000000000000000000000000000000000000..3934ca042cbe3ebd998028b8d893c555ede4fbcd --- /dev/null +++ b/sysplugins/smarty_internal_method_compileallconfig.php @@ -0,0 +1,36 @@ +<?php + +/** + * Smarty Method CompileAllConfig + * + * Smarty::compileAllConfig() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_CompileAllConfig extends Smarty_Internal_Method_CompileAllTemplates +{ + /** + * Compile all config files + * + * @api Smarty::compileAllConfig() + * + * @param \Smarty $smarty passed smarty object + * @param string $extension file extension + * @param bool $force_compile force all to recompile + * @param int $time_limit + * @param int $max_errors + * + * @return int number of template files recompiled + */ + public function compileAllConfig( + Smarty $smarty, + $extension = '.conf', + $force_compile = false, + $time_limit = 0, + $max_errors = null + ) { + return $this->compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors, true); + } +} diff --git a/sysplugins/smarty_internal_method_compilealltemplates.php b/sysplugins/smarty_internal_method_compilealltemplates.php new file mode 100644 index 0000000000000000000000000000000000000000..5c046da4079667f29bb2683a25155beab02be865 --- /dev/null +++ b/sysplugins/smarty_internal_method_compilealltemplates.php @@ -0,0 +1,130 @@ +<?php + +/** + * Smarty Method CompileAllTemplates + * + * Smarty::compileAllTemplates() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_CompileAllTemplates +{ + /** + * Valid for Smarty object + * + * @var int + */ + public $objMap = 1; + + /** + * Compile all template files + * + * @api Smarty::compileAllTemplates() + * + * @param \Smarty $smarty passed smarty object + * @param string $extension file extension + * @param bool $force_compile force all to recompile + * @param int $time_limit + * @param int $max_errors + * + * @return integer number of template files recompiled + */ + public function compileAllTemplates( + Smarty $smarty, + $extension = '.tpl', + $force_compile = false, + $time_limit = 0, + $max_errors = null + ) { + return $this->compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors); + } + + /** + * Compile all template or config files + * + * @param \Smarty $smarty + * @param string $extension template file name extension + * @param bool $force_compile force all to recompile + * @param int $time_limit set maximum execution time + * @param int $max_errors set maximum allowed errors + * @param bool $isConfig flag true if called for config files + * + * @return int number of template files compiled + */ + protected function compileAll( + Smarty $smarty, + $extension, + $force_compile, + $time_limit, + $max_errors, + $isConfig = false + ) { + // switch off time limit + if (function_exists('set_time_limit')) { + @set_time_limit($time_limit); + } + $_count = 0; + $_error_count = 0; + $sourceDir = $isConfig ? $smarty->getConfigDir() : $smarty->getTemplateDir(); + // loop over array of source directories + foreach ($sourceDir as $_dir) { + $_dir_1 = new RecursiveDirectoryIterator( + $_dir, + defined('FilesystemIterator::FOLLOW_SYMLINKS') ? + FilesystemIterator::FOLLOW_SYMLINKS : 0 + ); + $_dir_2 = new RecursiveIteratorIterator($_dir_1); + foreach ($_dir_2 as $_fileinfo) { + $_file = $_fileinfo->getFilename(); + if (substr(basename($_fileinfo->getPathname()), 0, 1) === '.' || strpos($_file, '.svn') !== false) { + continue; + } + if (substr_compare($_file, $extension, -strlen($extension)) !== 0) { + continue; + } + if ($_fileinfo->getPath() !== substr($_dir, 0, -1)) { + $_file = substr($_fileinfo->getPath(), strlen($_dir)) . DIRECTORY_SEPARATOR . $_file; + } + echo "\n<br>", $_dir, '---', $_file; + flush(); + $_start_time = microtime(true); + $_smarty = clone $smarty; + // + $_smarty->_cache = array(); + $_smarty->ext = new Smarty_Internal_Extension_Handler(); + $_smarty->ext->objType = $_smarty->_objType; + $_smarty->force_compile = $force_compile; + try { + /* @var Smarty_Internal_Template $_tpl */ + $_tpl = new $smarty->template_class($_file, $_smarty); + $_tpl->caching = Smarty::CACHING_OFF; + $_tpl->source = + $isConfig ? Smarty_Template_Config::load($_tpl) : Smarty_Template_Source::load($_tpl); + if ($_tpl->mustCompile()) { + $_tpl->compileTemplateSource(); + $_count++; + echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; + flush(); + } else { + echo ' is up to date'; + flush(); + } + } catch (Exception $e) { + echo "\n<br> ------>Error: ", $e->getMessage(), "<br><br>\n"; + $_error_count++; + } + // free memory + unset($_tpl); + $_smarty->_clearTemplateCache(); + if ($max_errors !== null && $_error_count === $max_errors) { + echo "\n<br><br>too many errors\n"; + exit(1); + } + } + } + echo "\n<br>"; + return $_count; + } +} diff --git a/sysplugins/smarty_internal_method_configload.php b/sysplugins/smarty_internal_method_configload.php new file mode 100644 index 0000000000000000000000000000000000000000..2e6254880944b004b3620e97733f3c2eb8ed639d --- /dev/null +++ b/sysplugins/smarty_internal_method_configload.php @@ -0,0 +1,182 @@ +<?php + +/** + * Smarty Method ConfigLoad + * + * Smarty::configLoad() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_ConfigLoad +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * load a config file, optionally load just selected sections + * + * @api Smarty::configLoad() + * @link http://www.smarty.net/docs/en/api.config.load.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $config_file filename + * @param mixed $sections array of section names, single + * section or null + * + * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template + * @throws \Exception + */ + public function configLoad(Smarty_Internal_Data $data, $config_file, $sections = null) + { + $this->_loadConfigFile($data, $config_file, $sections, null); + return $data; + } + + /** + * load a config file, optionally load just selected sections + * + * @api Smarty::configLoad() + * @link http://www.smarty.net/docs/en/api.config.load.tpl + * + * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data + * @param string $config_file filename + * @param mixed $sections array of section names, single + * section or null + * @param int $scope scope into which config variables + * shall be loaded + * + * @throws \Exception + */ + public function _loadConfigFile(Smarty_Internal_Data $data, $config_file, $sections = null, $scope = 0) + { + /* @var \Smarty $smarty */ + $smarty = $data->_getSmartyObj(); + /* @var \Smarty_Internal_Template $confObj */ + $confObj = new Smarty_Internal_Template($config_file, $smarty, $data, null, null, null, null, true); + $confObj->caching = Smarty::CACHING_OFF; + $confObj->source->config_sections = $sections; + $confObj->source->scope = $scope; + $confObj->compiled = Smarty_Template_Compiled::load($confObj); + $confObj->compiled->render($confObj); + if ($data->_isTplObj()) { + $data->compiled->file_dependency[ $confObj->source->uid ] = + array($confObj->source->filepath, $confObj->source->getTimeStamp(), $confObj->source->type); + } + } + + /** + * load config variables into template object + * + * @param \Smarty_Internal_Template $tpl + * @param array $new_config_vars + */ + public function _loadConfigVars(Smarty_Internal_Template $tpl, $new_config_vars) + { + $this->_assignConfigVars($tpl->parent->config_vars, $tpl, $new_config_vars); + $tagScope = $tpl->source->scope; + if ($tagScope >= 0) { + if ($tagScope === Smarty::SCOPE_LOCAL) { + $this->_updateVarStack($tpl, $new_config_vars); + $tagScope = 0; + if (!$tpl->scope) { + return; + } + } + if ($tpl->parent->_isTplObj() && ($tagScope || $tpl->parent->scope)) { + $mergedScope = $tagScope | $tpl->scope; + if ($mergedScope) { + // update scopes + /* @var \Smarty_Internal_Template|\Smarty|\Smarty_Internal_Data $ptr */ + foreach ($tpl->smarty->ext->_updateScope->_getAffectedScopes($tpl->parent, $mergedScope) as $ptr) { + $this->_assignConfigVars($ptr->config_vars, $tpl, $new_config_vars); + if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) { + $this->_updateVarStack($tpl, $new_config_vars); + } + } + } + } + } + } + + /** + * Assign all config variables in given scope + * + * @param array $config_vars config variables in scope + * @param \Smarty_Internal_Template $tpl + * @param array $new_config_vars loaded config variables + */ + public function _assignConfigVars(&$config_vars, Smarty_Internal_Template $tpl, $new_config_vars) + { + // copy global config vars + foreach ($new_config_vars[ 'vars' ] as $variable => $value) { + if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) { + $config_vars[ $variable ] = $value; + } else { + $config_vars[ $variable ] = array_merge((array)$config_vars[ $variable ], (array)$value); + } + } + // scan sections + $sections = $tpl->source->config_sections; + if (!empty($sections)) { + foreach ((array)$sections as $tpl_section) { + if (isset($new_config_vars[ 'sections' ][ $tpl_section ])) { + foreach ($new_config_vars[ 'sections' ][ $tpl_section ][ 'vars' ] as $variable => $value) { + if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) { + $config_vars[ $variable ] = $value; + } else { + $config_vars[ $variable ] = array_merge((array)$config_vars[ $variable ], (array)$value); + } + } + } + } + } + } + + /** + * Update config variables in template local variable stack + * + * @param \Smarty_Internal_Template $tpl + * @param array $config_vars + */ + public function _updateVarStack(Smarty_Internal_Template $tpl, $config_vars) + { + $i = 0; + while (isset($tpl->_cache[ 'varStack' ][ $i ])) { + $this->_assignConfigVars($tpl->_cache[ 'varStack' ][ $i ][ 'config' ], $tpl, $config_vars); + $i++; + } + } + + /** + * gets a config variable value + * + * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data + * @param string $varName the name of the config variable + * @param bool $errorEnable + * + * @return null|string the value of the config variable + */ + public function _getConfigVariable(Smarty_Internal_Data $data, $varName, $errorEnable = true) + { + $_ptr = $data; + while ($_ptr !== null) { + if (isset($_ptr->config_vars[ $varName ])) { + // found it, return it + return $_ptr->config_vars[ $varName ]; + } + // not found, try at parent + $_ptr = $_ptr->parent; + } + if ($data->smarty->error_unassigned && $errorEnable) { + // force a notice + $x = $$varName; + } + return null; + } +} diff --git a/sysplugins/smarty_internal_method_createdata.php b/sysplugins/smarty_internal_method_createdata.php new file mode 100644 index 0000000000000000000000000000000000000000..f95097519c7a13700da9660255eaaa69f5dd5f00 --- /dev/null +++ b/sysplugins/smarty_internal_method_createdata.php @@ -0,0 +1,44 @@ +<?php + +/** + * Smarty Method CreateData + * + * Smarty::createData() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_CreateData +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * creates a data object + * + * @api Smarty::createData() + * @link http://www.smarty.net/docs/en/api.create.data.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param \Smarty_Internal_Template|\Smarty_Internal_Data|\Smarty_Data|\Smarty $parent next higher level of Smarty + * variables + * @param string $name optional data block name + * + * @return \Smarty_Data data object + */ + public function createData(Smarty_Internal_TemplateBase $obj, Smarty_Internal_Data $parent = null, $name = null) + { + /* @var Smarty $smarty */ + $smarty = $obj->_getSmartyObj(); + $dataObj = new Smarty_Data($parent, $smarty, $name); + if ($smarty->debugging) { + Smarty_Internal_Debug::register_data($dataObj); + } + return $dataObj; + } +} diff --git a/sysplugins/smarty_internal_method_getautoloadfilters.php b/sysplugins/smarty_internal_method_getautoloadfilters.php new file mode 100644 index 0000000000000000000000000000000000000000..4145db10b26705f5d215fe7847d3cc80864e0fdc --- /dev/null +++ b/sysplugins/smarty_internal_method_getautoloadfilters.php @@ -0,0 +1,37 @@ +<?php + +/** + * Smarty Method GetAutoloadFilters + * + * Smarty::getAutoloadFilters() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetAutoloadFilters extends Smarty_Internal_Method_SetAutoloadFilters +{ + /** + * Get autoload filters + * + * @api Smarty::getAutoloadFilters() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type type of filter to get auto loads + * for. Defaults to all autoload + * filters + * + * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type + * was specified + * @throws \SmartyException + */ + public function getAutoloadFilters(Smarty_Internal_TemplateBase $obj, $type = null) + { + $smarty = $obj->_getSmartyObj(); + if ($type !== null) { + $this->_checkFilterType($type); + return isset($smarty->autoload_filters[ $type ]) ? $smarty->autoload_filters[ $type ] : array(); + } + return $smarty->autoload_filters; + } +} diff --git a/sysplugins/smarty_internal_method_getconfigvariable.php b/sysplugins/smarty_internal_method_getconfigvariable.php new file mode 100644 index 0000000000000000000000000000000000000000..b54815123f10dd687a806fb64661976fe9aff278 --- /dev/null +++ b/sysplugins/smarty_internal_method_getconfigvariable.php @@ -0,0 +1,34 @@ +<?php + +/** + * Smarty Method GetConfigVariable + * + * Smarty::getConfigVariable() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetConfigVariable +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * gets a config variable value + * + * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data + * @param string $varName the name of the config variable + * @param bool $errorEnable + * + * @return null|string the value of the config variable + */ + public function getConfigVariable(Smarty_Internal_Data $data, $varName = null, $errorEnable = true) + { + return $data->ext->configLoad->_getConfigVariable($data, $varName, $errorEnable); + } +} diff --git a/sysplugins/smarty_internal_method_getconfigvars.php b/sysplugins/smarty_internal_method_getconfigvars.php new file mode 100644 index 0000000000000000000000000000000000000000..1d11e44c16f3090002eb47afee932427e4d5badd --- /dev/null +++ b/sysplugins/smarty_internal_method_getconfigvars.php @@ -0,0 +1,58 @@ +<?php + +/** + * Smarty Method GetConfigVars + * + * Smarty::getConfigVars() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetConfigVars +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * Returns a single or all config variables + * + * @api Smarty::getConfigVars() + * @link http://www.smarty.net/docs/en/api.get.config.vars.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $varname variable name or null + * @param bool $search_parents include parent templates? + * + * @return mixed variable value or or array of variables + */ + public function getConfigVars(Smarty_Internal_Data $data, $varname = null, $search_parents = true) + { + $_ptr = $data; + $var_array = array(); + while ($_ptr !== null) { + if (isset($varname)) { + if (isset($_ptr->config_vars[ $varname ])) { + return $_ptr->config_vars[ $varname ]; + } + } else { + $var_array = array_merge($_ptr->config_vars, $var_array); + } + // not found, try at parent + if ($search_parents) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if (isset($varname)) { + return ''; + } else { + return $var_array; + } + } +} diff --git a/sysplugins/smarty_internal_method_getdebugtemplate.php b/sysplugins/smarty_internal_method_getdebugtemplate.php new file mode 100644 index 0000000000000000000000000000000000000000..77d908c15bba3b10c4c6413ba506fbe9a0fa5641 --- /dev/null +++ b/sysplugins/smarty_internal_method_getdebugtemplate.php @@ -0,0 +1,35 @@ +<?php + +/** + * Smarty Method GetDebugTemplate + * + * Smarty::getDebugTemplate() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetDebugTemplate +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * return name of debugging template + * + * @api Smarty::getDebugTemplate() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * + * @return string + */ + public function getDebugTemplate(Smarty_Internal_TemplateBase $obj) + { + $smarty = $obj->_getSmartyObj(); + return $smarty->debug_tpl; + } +} diff --git a/sysplugins/smarty_internal_method_getdefaultmodifiers.php b/sysplugins/smarty_internal_method_getdefaultmodifiers.php new file mode 100644 index 0000000000000000000000000000000000000000..57da85c497826948bcd346647c2b2aa1c3b0f2a5 --- /dev/null +++ b/sysplugins/smarty_internal_method_getdefaultmodifiers.php @@ -0,0 +1,35 @@ +<?php + +/** + * Smarty Method GetDefaultModifiers + * + * Smarty::getDefaultModifiers() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetDefaultModifiers +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Get default modifiers + * + * @api Smarty::getDefaultModifiers() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * + * @return array list of default modifiers + */ + public function getDefaultModifiers(Smarty_Internal_TemplateBase $obj) + { + $smarty = $obj->_getSmartyObj(); + return $smarty->default_modifiers; + } +} diff --git a/sysplugins/smarty_internal_method_getglobal.php b/sysplugins/smarty_internal_method_getglobal.php new file mode 100644 index 0000000000000000000000000000000000000000..2be11d7e878959551391020855790488b00484db --- /dev/null +++ b/sysplugins/smarty_internal_method_getglobal.php @@ -0,0 +1,47 @@ +<?php + +/** + * Smarty Method GetGlobal + * + * Smarty::getGlobal() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetGlobal +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * Returns a single or all global variables + * + * @api Smarty::getGlobal() + * + * @param \Smarty_Internal_Data $data + * @param string $varName variable name or null + * + * @return string|array variable value or or array of variables + */ + public function getGlobal(Smarty_Internal_Data $data, $varName = null) + { + if (isset($varName)) { + if (isset(Smarty::$global_tpl_vars[ $varName ])) { + return Smarty::$global_tpl_vars[ $varName ]->value; + } else { + return ''; + } + } else { + $_result = array(); + foreach (Smarty::$global_tpl_vars as $key => $var) { + $_result[ $key ] = $var->value; + } + return $_result; + } + } +} diff --git a/sysplugins/smarty_internal_method_getregisteredobject.php b/sysplugins/smarty_internal_method_getregisteredobject.php new file mode 100644 index 0000000000000000000000000000000000000000..df6ede13078c9a5676c73499fc63932a31ee575f --- /dev/null +++ b/sysplugins/smarty_internal_method_getregisteredobject.php @@ -0,0 +1,44 @@ +<?php + +/** + * Smarty Method GetRegisteredObject + * + * Smarty::getRegisteredObject() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetRegisteredObject +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * return a reference to a registered object + * + * @api Smarty::getRegisteredObject() + * @link http://www.smarty.net/docs/en/api.get.registered.object.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $object_name object name + * + * @return object + * @throws \SmartyException if no such object is found + */ + public function getRegisteredObject(Smarty_Internal_TemplateBase $obj, $object_name) + { + $smarty = $obj->_getSmartyObj(); + if (!isset($smarty->registered_objects[ $object_name ])) { + throw new SmartyException("'$object_name' is not a registered object"); + } + if (!is_object($smarty->registered_objects[ $object_name ][ 0 ])) { + throw new SmartyException("registered '$object_name' is not an object"); + } + return $smarty->registered_objects[ $object_name ][ 0 ]; + } +} diff --git a/sysplugins/smarty_internal_method_getstreamvariable.php b/sysplugins/smarty_internal_method_getstreamvariable.php new file mode 100644 index 0000000000000000000000000000000000000000..8db39c525ca61da05f742c5325e1602974754720 --- /dev/null +++ b/sysplugins/smarty_internal_method_getstreamvariable.php @@ -0,0 +1,50 @@ +<?php + +/** + * Smarty Method GetStreamVariable + * + * Smarty::getStreamVariable() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetStreamVariable +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * gets a stream variable + * + * @api Smarty::getStreamVariable() + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $variable the stream of the variable + * + * @return mixed + * @throws \SmartyException + */ + public function getStreamVariable(Smarty_Internal_Data $data, $variable) + { + $_result = ''; + $fp = fopen($variable, 'r+'); + if ($fp) { + while (!feof($fp) && ($current_line = fgets($fp)) !== false) { + $_result .= $current_line; + } + fclose($fp); + return $_result; + } + $smarty = isset($data->smarty) ? $data->smarty : $data; + if ($smarty->error_unassigned) { + throw new SmartyException('Undefined stream variable "' . $variable . '"'); + } else { + return null; + } + } +} diff --git a/sysplugins/smarty_internal_method_gettags.php b/sysplugins/smarty_internal_method_gettags.php new file mode 100644 index 0000000000000000000000000000000000000000..c07ae07ec76d096f4db809b176ffdea6f6957d38 --- /dev/null +++ b/sysplugins/smarty_internal_method_gettags.php @@ -0,0 +1,63 @@ +<?php + +/** + * Smarty Method GetTags + * + * Smarty::getTags() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetTags +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Return array of tag/attributes of all tags used by an template + * + * @api Smarty::getTags() + * @link http://www.smarty.net/docs/en/api.get.tags.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param null|string|Smarty_Internal_Template $template + * + * @return array of tag/attributes + * @throws \Exception + * @throws \SmartyException + */ + public function getTags(Smarty_Internal_TemplateBase $obj, $template = null) + { + /* @var Smarty $smarty */ + $smarty = $obj->_getSmartyObj(); + if ($obj->_isTplObj() && !isset($template)) { + $tpl = clone $obj; + } elseif (isset($template) && $template->_isTplObj()) { + $tpl = clone $template; + } elseif (isset($template) && is_string($template)) { + /* @var Smarty_Internal_Template $tpl */ + $tpl = new $smarty->template_class($template, $smarty); + // checks if template exists + if (!$tpl->source->exists) { + throw new SmartyException("Unable to load template {$tpl->source->type} '{$tpl->source->name}'"); + } + } + if (isset($tpl)) { + $tpl->smarty = clone $tpl->smarty; + $tpl->smarty->_cache[ 'get_used_tags' ] = true; + $tpl->_cache[ 'used_tags' ] = array(); + $tpl->smarty->merge_compiled_includes = false; + $tpl->smarty->disableSecurity(); + $tpl->caching = Smarty::CACHING_OFF; + $tpl->loadCompiler(); + $tpl->compiler->compileTemplate($tpl); + return $tpl->_cache[ 'used_tags' ]; + } + throw new SmartyException('Missing template specification'); + } +} diff --git a/sysplugins/smarty_internal_method_gettemplatevars.php b/sysplugins/smarty_internal_method_gettemplatevars.php new file mode 100644 index 0000000000000000000000000000000000000000..9ef7d46bb7cd1cb0dd2744f17e1c807238c2d6ac --- /dev/null +++ b/sysplugins/smarty_internal_method_gettemplatevars.php @@ -0,0 +1,119 @@ +<?php + +/** + * Smarty Method GetTemplateVars + * + * Smarty::getTemplateVars() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_GetTemplateVars +{ + /** + * Valid for all objects + * + * @var int + */ + public $objMap = 7; + + /** + * Returns a single or all template variables + * + * @api Smarty::getTemplateVars() + * @link http://www.smarty.net/docs/en/api.get.template.vars.tpl + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $varName variable name or null + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr optional pointer to data object + * @param bool $searchParents include parent templates? + * + * @return mixed variable value or or array of variables + */ + public function getTemplateVars( + Smarty_Internal_Data $data, + $varName = null, + Smarty_Internal_Data $_ptr = null, + $searchParents = true + ) { + if (isset($varName)) { + $_var = $this->_getVariable($data, $varName, $_ptr, $searchParents, false); + if (is_object($_var)) { + return $_var->value; + } else { + return null; + } + } else { + $_result = array(); + if ($_ptr === null) { + $_ptr = $data; + } + while ($_ptr !== null) { + foreach ($_ptr->tpl_vars as $key => $var) { + if (!array_key_exists($key, $_result)) { + $_result[ $key ] = $var->value; + } + } + // not found, try at parent + if ($searchParents && isset($_ptr->parent)) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if ($searchParents && isset(Smarty::$global_tpl_vars)) { + foreach (Smarty::$global_tpl_vars as $key => $var) { + if (!array_key_exists($key, $_result)) { + $_result[ $key ] = $var->value; + } + } + } + return $_result; + } + } + + /** + * gets the object of a Smarty variable + * + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data + * @param string $varName the name of the Smarty variable + * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr optional pointer to data object + * @param bool $searchParents search also in parent data + * @param bool $errorEnable + * + * @return \Smarty_Variable + */ + public function _getVariable( + Smarty_Internal_Data $data, + $varName, + Smarty_Internal_Data $_ptr = null, + $searchParents = true, + $errorEnable = true + ) { + if ($_ptr === null) { + $_ptr = $data; + } + while ($_ptr !== null) { + if (isset($_ptr->tpl_vars[ $varName ])) { + // found it, return it + return $_ptr->tpl_vars[ $varName ]; + } + // not found, try at parent + if ($searchParents && isset($_ptr->parent)) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if (isset(Smarty::$global_tpl_vars[ $varName ])) { + // found it, return it + return Smarty::$global_tpl_vars[ $varName ]; + } + if ($errorEnable && $data->_getSmartyObj()->error_unassigned) { + // force a notice + $x = $$varName; + } + return new Smarty_Undefined_Variable; + } +} diff --git a/sysplugins/smarty_internal_method_literals.php b/sysplugins/smarty_internal_method_literals.php new file mode 100644 index 0000000000000000000000000000000000000000..bfa3f58ecf7b641d1183731889f8f279baae0d79 --- /dev/null +++ b/sysplugins/smarty_internal_method_literals.php @@ -0,0 +1,100 @@ +<?php + +/** + * Smarty Method GetLiterals + * + * Smarty::getLiterals() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_Literals +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Get literals + * + * @api Smarty::getLiterals() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * + * @return array list of literals + */ + public function getLiterals(Smarty_Internal_TemplateBase $obj) + { + $smarty = $obj->_getSmartyObj(); + return (array)$smarty->literals; + } + + /** + * Add literals + * + * @api Smarty::addLiterals() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array|string $literals literal or list of literals + * to addto add + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function addLiterals(Smarty_Internal_TemplateBase $obj, $literals = null) + { + if (isset($literals)) { + $this->set($obj->_getSmartyObj(), (array)$literals); + } + return $obj; + } + + /** + * Set literals + * + * @api Smarty::setLiterals() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array|string $literals literal or list of literals + * to setto set + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function setLiterals(Smarty_Internal_TemplateBase $obj, $literals = null) + { + $smarty = $obj->_getSmartyObj(); + $smarty->literals = array(); + if (!empty($literals)) { + $this->set($smarty, (array)$literals); + } + return $obj; + } + + /** + * common setter for literals for easier handling of duplicates the + * Smarty::$literals array gets filled with identical key values + * + * @param \Smarty $smarty + * @param array $literals + * + * @throws \SmartyException + */ + private function set(Smarty $smarty, $literals) + { + $literals = array_combine($literals, $literals); + $error = isset($literals[ $smarty->left_delimiter ]) ? array($smarty->left_delimiter) : array(); + $error = isset($literals[ $smarty->right_delimiter ]) ? $error[] = $smarty->right_delimiter : $error; + if (!empty($error)) { + throw new SmartyException( + 'User defined literal(s) "' . $error . + '" may not be identical with left or right delimiter' + ); + } + $smarty->literals = array_merge((array)$smarty->literals, (array)$literals); + } +} diff --git a/sysplugins/smarty_internal_method_loadfilter.php b/sysplugins/smarty_internal_method_loadfilter.php new file mode 100644 index 0000000000000000000000000000000000000000..66d80d474b486b44f31517b2cfeea672e809575a --- /dev/null +++ b/sysplugins/smarty_internal_method_loadfilter.php @@ -0,0 +1,77 @@ +<?php + +/** + * Smarty Method LoadFilter + * + * Smarty::loadFilter() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_LoadFilter +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Valid filter types + * + * @var array + */ + private $filterTypes = array('pre' => true, 'post' => true, 'output' => true, 'variable' => true); + + /** + * load a filter of specified type and name + * + * @api Smarty::loadFilter() + * + * @link http://www.smarty.net/docs/en/api.load.filter.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type filter type + * @param string $name filter name + * + * @return bool + * @throws SmartyException if filter could not be loaded + */ + public function loadFilter(Smarty_Internal_TemplateBase $obj, $type, $name) + { + $smarty = $obj->_getSmartyObj(); + $this->_checkFilterType($type); + $_plugin = "smarty_{$type}filter_{$name}"; + $_filter_name = $_plugin; + if (is_callable($_plugin)) { + $smarty->registered_filters[ $type ][ $_filter_name ] = $_plugin; + return true; + } + if ($smarty->loadPlugin($_plugin)) { + if (class_exists($_plugin, false)) { + $_plugin = array($_plugin, 'execute'); + } + if (is_callable($_plugin)) { + $smarty->registered_filters[ $type ][ $_filter_name ] = $_plugin; + return true; + } + } + throw new SmartyException("{$type}filter '{$name}' not found or callable"); + } + + /** + * Check if filter type is valid + * + * @param string $type + * + * @throws \SmartyException + */ + public function _checkFilterType($type) + { + if (!isset($this->filterTypes[ $type ])) { + throw new SmartyException("Illegal filter type '{$type}'"); + } + } +} diff --git a/sysplugins/smarty_internal_method_loadplugin.php b/sysplugins/smarty_internal_method_loadplugin.php new file mode 100644 index 0000000000000000000000000000000000000000..3bd659cb862b01e855cb964ab88411fc0fa3cd06 --- /dev/null +++ b/sysplugins/smarty_internal_method_loadplugin.php @@ -0,0 +1,111 @@ +<?php + +/** + * Smarty Extension Loadplugin + * + * $smarty->loadPlugin() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_LoadPlugin +{ + /** + * Cache of searched plugin files + * + * @var array + */ + public $plugin_files = array(); + + /** + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param \Smarty $smarty + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * + * @return bool|string + * @throws \SmartyException + */ + public function loadPlugin(Smarty $smarty, $plugin_name, $check) + { + // if function or class exists, exit silently (already loaded) + if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) { + return true; + } + if (!preg_match('#^smarty_((internal)|([^_]+))_(.+)$#i', $plugin_name, $match)) { + throw new SmartyException("plugin {$plugin_name} is not a valid name format"); + } + if (!empty($match[ 2 ])) { + $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php'; + if (isset($this->plugin_files[ $file ])) { + if ($this->plugin_files[ $file ] !== false) { + return $this->plugin_files[ $file ]; + } else { + return false; + } + } else { + if (is_file($file)) { + $this->plugin_files[ $file ] = $file; + include_once $file; + return $file; + } else { + $this->plugin_files[ $file ] = false; + return false; + } + } + } + // plugin filename is expected to be: [type].[name].php + $_plugin_filename = "{$match[1]}.{$match[4]}.php"; + $_lower_filename = strtolower($_plugin_filename); + if (isset($this->plugin_files)) { + if (isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { + if (!$smarty->use_include_path || $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] !== false) { + return $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ]; + } + } + if (!$smarty->use_include_path || $smarty->ext->_getIncludePath->isNewIncludePath($smarty)) { + unset($this->plugin_files[ 'include_path' ]); + } else { + if (isset($this->plugin_files[ 'include_path' ][ $_lower_filename ])) { + return $this->plugin_files[ 'include_path' ][ $_lower_filename ]; + } + } + } + $_file_names = array($_plugin_filename); + if ($_lower_filename !== $_plugin_filename) { + $_file_names[] = $_lower_filename; + } + $_p_dirs = $smarty->getPluginsDir(); + if (!isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { + // loop through plugin dirs and find the plugin + foreach ($_p_dirs as $_plugin_dir) { + foreach ($_file_names as $name) { + $file = $_plugin_dir . $name; + if (is_file($file)) { + $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = $file; + include_once $file; + return $file; + } + $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = false; + } + } + } + if ($smarty->use_include_path) { + foreach ($_file_names as $_file_name) { + // try PHP include_path + $file = $smarty->ext->_getIncludePath->getIncludePath($_p_dirs, $_file_name, $smarty); + $this->plugin_files[ 'include_path' ][ $_lower_filename ] = $file; + if ($file !== false) { + include_once $file; + return $file; + } + } + } + // no plugin loaded + return false; + } +} diff --git a/sysplugins/smarty_internal_method_mustcompile.php b/sysplugins/smarty_internal_method_mustcompile.php new file mode 100644 index 0000000000000000000000000000000000000000..39318838ee9aa12e63956cd7fa8aec0d42ec28cb --- /dev/null +++ b/sysplugins/smarty_internal_method_mustcompile.php @@ -0,0 +1,50 @@ +<?php + +/** + * Smarty Method MustCompile + * + * Smarty_Internal_Template::mustCompile() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_MustCompile +{ + /** + * Valid for template object + * + * @var int + */ + public $objMap = 2; + + /** + * Returns if the current template must be compiled by the Smarty compiler + * It does compare the timestamps of template source and the compiled templates and checks the force compile + * configuration + * + * @param \Smarty_Internal_Template $_template + * + * @return bool + * @throws \SmartyException + */ + public function mustCompile(Smarty_Internal_Template $_template) + { + if (!$_template->source->exists) { + if ($_template->_isSubTpl()) { + $parent_resource = " in '$_template->parent->template_resource}'"; + } else { + $parent_resource = ''; + } + throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}"); + } + if ($_template->mustCompile === null) { + $_template->mustCompile = (!$_template->source->handler->uncompiled && + ($_template->smarty->force_compile || $_template->source->handler->recompiled || + !$_template->compiled->exists || ($_template->compile_check && + $_template->compiled->getTimeStamp() < + $_template->source->getTimeStamp()))); + } + return $_template->mustCompile; + } +} diff --git a/sysplugins/smarty_internal_method_registercacheresource.php b/sysplugins/smarty_internal_method_registercacheresource.php new file mode 100644 index 0000000000000000000000000000000000000000..6483656190d34027209412947328a92218d97380 --- /dev/null +++ b/sysplugins/smarty_internal_method_registercacheresource.php @@ -0,0 +1,42 @@ +<?php + +/** + * Smarty Method RegisterCacheResource + * + * Smarty::registerCacheResource() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterCacheResource +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers a resource to fetch a template + * + * @api Smarty::registerCacheResource() + * @link http://www.smarty.net/docs/en/api.register.cacheresource.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $name name of resource type + * @param \Smarty_CacheResource $resource_handler + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function registerCacheResource( + Smarty_Internal_TemplateBase $obj, + $name, + Smarty_CacheResource $resource_handler + ) { + $smarty = $obj->_getSmartyObj(); + $smarty->registered_cache_resources[ $name ] = $resource_handler; + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_registerclass.php b/sysplugins/smarty_internal_method_registerclass.php new file mode 100644 index 0000000000000000000000000000000000000000..8d18547e2726a22719abd20b05756805d72ade5a --- /dev/null +++ b/sysplugins/smarty_internal_method_registerclass.php @@ -0,0 +1,46 @@ +<?php + +/** + * Smarty Method RegisterClass + * + * Smarty::registerClass() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterClass +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers static classes to be used in templates + * + * @api Smarty::registerClass() + * @link http://www.smarty.net/docs/en/api.register.class.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $class_name + * @param string $class_impl the referenced PHP class to + * register + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerClass(Smarty_Internal_TemplateBase $obj, $class_name, $class_impl) + { + $smarty = $obj->_getSmartyObj(); + // test if exists + if (!class_exists($class_impl)) { + throw new SmartyException("Undefined class '$class_impl' in register template class"); + } + // register the class + $smarty->registered_classes[ $class_name ] = $class_impl; + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_registerdefaultconfighandler.php b/sysplugins/smarty_internal_method_registerdefaultconfighandler.php new file mode 100644 index 0000000000000000000000000000000000000000..b340f178de405b9402d9db4e0ff4ae737b212cf2 --- /dev/null +++ b/sysplugins/smarty_internal_method_registerdefaultconfighandler.php @@ -0,0 +1,42 @@ +<?php + +/** + * Smarty Method RegisterDefaultConfigHandler + * + * Smarty::registerDefaultConfigHandler() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterDefaultConfigHandler +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Register config default handler + * + * @api Smarty::registerDefaultConfigHandler() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param callable $callback class/method name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws SmartyException if $callback is not callable + */ + public function registerDefaultConfigHandler(Smarty_Internal_TemplateBase $obj, $callback) + { + $smarty = $obj->_getSmartyObj(); + if (is_callable($callback)) { + $smarty->default_config_handler_func = $callback; + } else { + throw new SmartyException('Default config handler not callable'); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php b/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php new file mode 100644 index 0000000000000000000000000000000000000000..a9fb78dc6f03e021b48b04952aaf7b35d918254a --- /dev/null +++ b/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php @@ -0,0 +1,43 @@ +<?php + +/** + * Smarty Method RegisterDefaultPluginHandler + * + * Smarty::registerDefaultPluginHandler() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterDefaultPluginHandler +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers a default plugin handler + * + * @api Smarty::registerDefaultPluginHandler() + * @link http://www.smarty.net/docs/en/api.register.default.plugin.handler.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param callable $callback class/method name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws SmartyException if $callback is not callable + */ + public function registerDefaultPluginHandler(Smarty_Internal_TemplateBase $obj, $callback) + { + $smarty = $obj->_getSmartyObj(); + if (is_callable($callback)) { + $smarty->default_plugin_handler_func = $callback; + } else { + throw new SmartyException("Default plugin handler '$callback' not callable"); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php b/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php new file mode 100644 index 0000000000000000000000000000000000000000..cbc133ccd8de087025f6fc56baf3dfe85a7a13c3 --- /dev/null +++ b/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php @@ -0,0 +1,88 @@ +<?php + +/** + * Smarty Method RegisterDefaultTemplateHandler + * + * Smarty::registerDefaultTemplateHandler() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterDefaultTemplateHandler +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Register template default handler + * + * @api Smarty::registerDefaultTemplateHandler() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param callable $callback class/method name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws SmartyException if $callback is not callable + */ + public function registerDefaultTemplateHandler(Smarty_Internal_TemplateBase $obj, $callback) + { + $smarty = $obj->_getSmartyObj(); + if (is_callable($callback)) { + $smarty->default_template_handler_func = $callback; + } else { + throw new SmartyException('Default template handler not callable'); + } + return $obj; + } + + /** + * get default content from template or config resource handler + * + * @param Smarty_Template_Source $source + * + * @throws \SmartyException + */ + public static function _getDefaultTemplate(Smarty_Template_Source $source) + { + if ($source->isConfig) { + $default_handler = $source->smarty->default_config_handler_func; + } else { + $default_handler = $source->smarty->default_template_handler_func; + } + $_content = $_timestamp = null; + $_return = call_user_func_array( + $default_handler, + array($source->type, $source->name, &$_content, &$_timestamp, $source->smarty) + ); + if (is_string($_return)) { + $source->exists = is_file($_return); + if ($source->exists) { + $source->timestamp = filemtime($_return); + } else { + throw new SmartyException( + 'Default handler: Unable to load ' . + ($source->isConfig ? 'config' : 'template') . + " default file '{$_return}' for '{$source->type}:{$source->name}'" + ); + } + $source->name = $source->filepath = $_return; + $source->uid = sha1($source->filepath); + } elseif ($_return === true) { + $source->content = $_content; + $source->exists = true; + $source->uid = $source->name = sha1($_content); + $source->handler = Smarty_Resource::load($source->smarty, 'eval'); + } else { + $source->exists = false; + throw new SmartyException( + 'Default handler: No ' . ($source->isConfig ? 'config' : 'template') . + " default content for '{$source->type}:{$source->name}'" + ); + } + } +} diff --git a/sysplugins/smarty_internal_method_registerfilter.php b/sysplugins/smarty_internal_method_registerfilter.php new file mode 100644 index 0000000000000000000000000000000000000000..c0f9fff10536ea0974df4d5c9cfc384125374295 --- /dev/null +++ b/sysplugins/smarty_internal_method_registerfilter.php @@ -0,0 +1,87 @@ +<?php + +/** + * Smarty Method RegisterFilter + * + * Smarty::registerFilter() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterFilter +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Valid filter types + * + * @var array + */ + private $filterTypes = array('pre' => true, 'post' => true, 'output' => true, 'variable' => true); + + /** + * Registers a filter function + * + * @api Smarty::registerFilter() + * + * @link http://www.smarty.net/docs/en/api.register.filter.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type filter type + * @param callback $callback + * @param string|null $name optional filter name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerFilter(Smarty_Internal_TemplateBase $obj, $type, $callback, $name = null) + { + $smarty = $obj->_getSmartyObj(); + $this->_checkFilterType($type); + $name = isset($name) ? $name : $this->_getFilterName($callback); + if (!is_callable($callback)) { + throw new SmartyException("{$type}filter '{$name}' not callable"); + } + $smarty->registered_filters[ $type ][ $name ] = $callback; + return $obj; + } + + /** + * Return internal filter name + * + * @param callback $function_name + * + * @return string internal filter name + */ + public function _getFilterName($function_name) + { + if (is_array($function_name)) { + $_class_name = (is_object($function_name[ 0 ]) ? get_class($function_name[ 0 ]) : $function_name[ 0 ]); + return $_class_name . '_' . $function_name[ 1 ]; + } elseif (is_string($function_name)) { + return $function_name; + } else { + return 'closure'; + } + } + + /** + * Check if filter type is valid + * + * @param string $type + * + * @throws \SmartyException + */ + public function _checkFilterType($type) + { + if (!isset($this->filterTypes[ $type ])) { + throw new SmartyException("Illegal filter type '{$type}'"); + } + } +} diff --git a/sysplugins/smarty_internal_method_registerobject.php b/sysplugins/smarty_internal_method_registerobject.php new file mode 100644 index 0000000000000000000000000000000000000000..4646e4f2254cb7c3e0c2b70d743766aa0aba8476 --- /dev/null +++ b/sysplugins/smarty_internal_method_registerobject.php @@ -0,0 +1,84 @@ +<?php + +/** + * Smarty Method RegisterObject + * + * Smarty::registerObject() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterObject +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers object to be used in templates + * + * @api Smarty::registerObject() + * @link http://www.smarty.net/docs/en/api.register.object.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $object_name + * @param object $object the + * referenced + * PHP + * object + * to + * register + * + * @param array $allowed_methods_properties list of + * allowed + * methods + * (empty + * = all) + * + * @param bool $format smarty + * argument + * format, + * else + * traditional + * + * @param array $block_methods list of + * block-methods + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerObject( + Smarty_Internal_TemplateBase $obj, + $object_name, + $object, + $allowed_methods_properties = array(), + $format = true, + $block_methods = array() + ) { + $smarty = $obj->_getSmartyObj(); + // test if allowed methods callable + if (!empty($allowed_methods_properties)) { + foreach ((array)$allowed_methods_properties as $method) { + if (!is_callable(array($object, $method)) && !property_exists($object, $method)) { + throw new SmartyException("Undefined method or property '$method' in registered object"); + } + } + } + // test if block methods callable + if (!empty($block_methods)) { + foreach ((array)$block_methods as $method) { + if (!is_callable(array($object, $method))) { + throw new SmartyException("Undefined method '$method' in registered object"); + } + } + } + // register the object + $smarty->registered_objects[ $object_name ] = + array($object, (array)$allowed_methods_properties, (boolean)$format, (array)$block_methods); + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_registerplugin.php b/sysplugins/smarty_internal_method_registerplugin.php new file mode 100644 index 0000000000000000000000000000000000000000..ed18d84bbc01024e35c0ebcf1635a4270b58ec46 --- /dev/null +++ b/sysplugins/smarty_internal_method_registerplugin.php @@ -0,0 +1,58 @@ +<?php + +/** + * Smarty Method RegisterPlugin + * + * Smarty::registerPlugin() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterPlugin +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers plugin to be used in templates + * + * @api Smarty::registerPlugin() + * @link http://www.smarty.net/docs/en/api.register.plugin.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type plugin type + * @param string $name name of template tag + * @param callback $callback PHP callback to register + * @param bool $cacheable if true (default) this + * function is cache able + * @param mixed $cache_attr caching attributes if any + * + * @return \Smarty|\Smarty_Internal_Template + * @throws SmartyException when the plugin tag is invalid + */ + public function registerPlugin( + Smarty_Internal_TemplateBase $obj, + $type, + $name, + $callback, + $cacheable = true, + $cache_attr = null + ) { + $smarty = $obj->_getSmartyObj(); + if (isset($smarty->registered_plugins[ $type ][ $name ])) { + throw new SmartyException("Plugin tag '{$name}' already registered"); + } elseif (!is_callable($callback)) { + throw new SmartyException("Plugin '{$name}' not callable"); + } elseif ($cacheable && $cache_attr) { + throw new SmartyException("Cannot set caching attributes for plugin '{$name}' when it is cacheable."); + } else { + $smarty->registered_plugins[ $type ][ $name ] = array($callback, (bool)$cacheable, (array)$cache_attr); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_registerresource.php b/sysplugins/smarty_internal_method_registerresource.php new file mode 100644 index 0000000000000000000000000000000000000000..7c7d0f78af76122724f58f37279a5c42f1fbc80f --- /dev/null +++ b/sysplugins/smarty_internal_method_registerresource.php @@ -0,0 +1,46 @@ +<?php + +/** + * Smarty Method RegisterResource + * + * Smarty::registerResource() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_RegisterResource +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers a resource to fetch a template + * + * @api Smarty::registerResource() + * @link http://www.smarty.net/docs/en/api.register.resource.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $name name of resource type + * @param Smarty_Resource|array $resource_handler or instance of + * Smarty_Resource, + * or array of + * callbacks to + * handle + * resource + * (deprecated) + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function registerResource(Smarty_Internal_TemplateBase $obj, $name, $resource_handler) + { + $smarty = $obj->_getSmartyObj(); + $smarty->registered_resources[ $name ] = + $resource_handler instanceof Smarty_Resource ? $resource_handler : array($resource_handler, false); + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_setautoloadfilters.php b/sysplugins/smarty_internal_method_setautoloadfilters.php new file mode 100644 index 0000000000000000000000000000000000000000..2972f3ce1b3d8913843cc8d50b6ff5b653886cd1 --- /dev/null +++ b/sysplugins/smarty_internal_method_setautoloadfilters.php @@ -0,0 +1,72 @@ +<?php + +/** + * Smarty Method SetAutoloadFilters + * + * Smarty::setAutoloadFilters() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_SetAutoloadFilters +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Valid filter types + * + * @var array + */ + private $filterTypes = array('pre' => true, 'post' => true, 'output' => true, 'variable' => true); + + /** + * Set autoload filters + * + * @api Smarty::setAutoloadFilters() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array $filters filters to load automatically + * @param string $type "pre", "output", … specify + * the filter type to set. + * Defaults to none treating + * $filters' keys as the + * appropriate types + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function setAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null) + { + $smarty = $obj->_getSmartyObj(); + if ($type !== null) { + $this->_checkFilterType($type); + $smarty->autoload_filters[ $type ] = (array)$filters; + } else { + foreach ((array)$filters as $type => $value) { + $this->_checkFilterType($type); + } + $smarty->autoload_filters = (array)$filters; + } + return $obj; + } + + /** + * Check if filter type is valid + * + * @param string $type + * + * @throws \SmartyException + */ + public function _checkFilterType($type) + { + if (!isset($this->filterTypes[ $type ])) { + throw new SmartyException("Illegal filter type '{$type}'"); + } + } +} diff --git a/sysplugins/smarty_internal_method_setdebugtemplate.php b/sysplugins/smarty_internal_method_setdebugtemplate.php new file mode 100644 index 0000000000000000000000000000000000000000..cc9d23e2aede5456b864b9530cf876571d78fd2e --- /dev/null +++ b/sysplugins/smarty_internal_method_setdebugtemplate.php @@ -0,0 +1,41 @@ +<?php + +/** + * Smarty Method SetDebugTemplate + * + * Smarty::setDebugTemplate() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_SetDebugTemplate +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * set the debug template + * + * @api Smarty::setDebugTemplate() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $tpl_name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws SmartyException if file is not readable + */ + public function setDebugTemplate(Smarty_Internal_TemplateBase $obj, $tpl_name) + { + $smarty = $obj->_getSmartyObj(); + if (!is_readable($tpl_name)) { + throw new SmartyException("Unknown file '{$tpl_name}'"); + } + $smarty->debug_tpl = $tpl_name; + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_setdefaultmodifiers.php b/sysplugins/smarty_internal_method_setdefaultmodifiers.php new file mode 100644 index 0000000000000000000000000000000000000000..eadc2de1bf8e0bd3fb05e48d1ba8bb75a7c16b21 --- /dev/null +++ b/sysplugins/smarty_internal_method_setdefaultmodifiers.php @@ -0,0 +1,38 @@ +<?php + +/** + * Smarty Method SetDefaultModifiers + * + * Smarty::setDefaultModifiers() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_SetDefaultModifiers +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Set default modifiers + * + * @api Smarty::setDefaultModifiers() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array|string $modifiers modifier or list of modifiers + * to set + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function setDefaultModifiers(Smarty_Internal_TemplateBase $obj, $modifiers) + { + $smarty = $obj->_getSmartyObj(); + $smarty->default_modifiers = (array)$modifiers; + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_unloadfilter.php b/sysplugins/smarty_internal_method_unloadfilter.php new file mode 100644 index 0000000000000000000000000000000000000000..55e1596be1fe7dd742fe46114afba1d91d820c4b --- /dev/null +++ b/sysplugins/smarty_internal_method_unloadfilter.php @@ -0,0 +1,43 @@ +<?php + +/** + * Smarty Method UnloadFilter + * + * Smarty::unloadFilter() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_UnloadFilter extends Smarty_Internal_Method_LoadFilter +{ + /** + * load a filter of specified type and name + * + * @api Smarty::unloadFilter() + * + * @link http://www.smarty.net/docs/en/api.unload.filter.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type filter type + * @param string $name filter name + * + * @return Smarty_Internal_TemplateBase + * @throws \SmartyException + */ + public function unloadFilter(Smarty_Internal_TemplateBase $obj, $type, $name) + { + $smarty = $obj->_getSmartyObj(); + $this->_checkFilterType($type); + if (isset($smarty->registered_filters[ $type ])) { + $_filter_name = "smarty_{$type}filter_{$name}"; + if (isset($smarty->registered_filters[ $type ][ $_filter_name ])) { + unset($smarty->registered_filters[ $type ][ $_filter_name ]); + if (empty($smarty->registered_filters[ $type ])) { + unset($smarty->registered_filters[ $type ]); + } + } + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_unregistercacheresource.php b/sysplugins/smarty_internal_method_unregistercacheresource.php new file mode 100644 index 0000000000000000000000000000000000000000..b999038672107b89361e4341d9e5cfe5e4b1ea7f --- /dev/null +++ b/sysplugins/smarty_internal_method_unregistercacheresource.php @@ -0,0 +1,40 @@ +<?php + +/** + * Smarty Method UnregisterCacheResource + * + * Smarty::unregisterCacheResource() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_UnregisterCacheResource +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers a resource to fetch a template + * + * @api Smarty::unregisterCacheResource() + * @link http://www.smarty.net/docs/en/api.unregister.cacheresource.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param $name + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function unregisterCacheResource(Smarty_Internal_TemplateBase $obj, $name) + { + $smarty = $obj->_getSmartyObj(); + if (isset($smarty->registered_cache_resources[ $name ])) { + unset($smarty->registered_cache_resources[ $name ]); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_unregisterfilter.php b/sysplugins/smarty_internal_method_unregisterfilter.php new file mode 100644 index 0000000000000000000000000000000000000000..9cb494a52a3e8599f99e3ee898e2f22a2ad09651 --- /dev/null +++ b/sysplugins/smarty_internal_method_unregisterfilter.php @@ -0,0 +1,43 @@ +<?php + +/** + * Smarty Method UnregisterFilter + * + * Smarty::unregisterFilter() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_UnregisterFilter extends Smarty_Internal_Method_RegisterFilter +{ + /** + * Unregisters a filter function + * + * @api Smarty::unregisterFilter() + * + * @link http://www.smarty.net/docs/en/api.unregister.filter.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type filter type + * @param callback|string $callback + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function unregisterFilter(Smarty_Internal_TemplateBase $obj, $type, $callback) + { + $smarty = $obj->_getSmartyObj(); + $this->_checkFilterType($type); + if (isset($smarty->registered_filters[ $type ])) { + $name = is_string($callback) ? $callback : $this->_getFilterName($callback); + if (isset($smarty->registered_filters[ $type ][ $name ])) { + unset($smarty->registered_filters[ $type ][ $name ]); + if (empty($smarty->registered_filters[ $type ])) { + unset($smarty->registered_filters[ $type ]); + } + } + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_unregisterobject.php b/sysplugins/smarty_internal_method_unregisterobject.php new file mode 100644 index 0000000000000000000000000000000000000000..1e592b339b2a320d84361c7c6ab8ab50b23d05c2 --- /dev/null +++ b/sysplugins/smarty_internal_method_unregisterobject.php @@ -0,0 +1,40 @@ +<?php + +/** + * Smarty Method UnregisterObject + * + * Smarty::unregisterObject() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_UnregisterObject +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers plugin to be used in templates + * + * @api Smarty::unregisterObject() + * @link http://www.smarty.net/docs/en/api.unregister.object.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $object_name name of object + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function unregisterObject(Smarty_Internal_TemplateBase $obj, $object_name) + { + $smarty = $obj->_getSmartyObj(); + if (isset($smarty->registered_objects[ $object_name ])) { + unset($smarty->registered_objects[ $object_name ]); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_unregisterplugin.php b/sysplugins/smarty_internal_method_unregisterplugin.php new file mode 100644 index 0000000000000000000000000000000000000000..f39e3167827ccb07ba5c5cc85ecb81b2b85bc7bd --- /dev/null +++ b/sysplugins/smarty_internal_method_unregisterplugin.php @@ -0,0 +1,41 @@ +<?php + +/** + * Smarty Method UnregisterPlugin + * + * Smarty::unregisterPlugin() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_UnregisterPlugin +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers plugin to be used in templates + * + * @api Smarty::unregisterPlugin() + * @link http://www.smarty.net/docs/en/api.unregister.plugin.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type plugin type + * @param string $name name of template tag + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function unregisterPlugin(Smarty_Internal_TemplateBase $obj, $type, $name) + { + $smarty = $obj->_getSmartyObj(); + if (isset($smarty->registered_plugins[ $type ][ $name ])) { + unset($smarty->registered_plugins[ $type ][ $name ]); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_method_unregisterresource.php b/sysplugins/smarty_internal_method_unregisterresource.php new file mode 100644 index 0000000000000000000000000000000000000000..a79db429960b5b73b6295a2bfd7b0dc8b13dbc85 --- /dev/null +++ b/sysplugins/smarty_internal_method_unregisterresource.php @@ -0,0 +1,40 @@ +<?php + +/** + * Smarty Method UnregisterResource + * + * Smarty::unregisterResource() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_UnregisterResource +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Registers a resource to fetch a template + * + * @api Smarty::unregisterResource() + * @link http://www.smarty.net/docs/en/api.unregister.resource.tpl + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param string $type name of resource type + * + * @return \Smarty|\Smarty_Internal_Template + */ + public function unregisterResource(Smarty_Internal_TemplateBase $obj, $type) + { + $smarty = $obj->_getSmartyObj(); + if (isset($smarty->registered_resources[ $type ])) { + unset($smarty->registered_resources[ $type ]); + } + return $obj; + } +} diff --git a/sysplugins/smarty_internal_nocache_insert.php b/sysplugins/smarty_internal_nocache_insert.php new file mode 100644 index 0000000000000000000000000000000000000000..88694dcfdcfc33125a0cc7647bab88b30fe60ac1 --- /dev/null +++ b/sysplugins/smarty_internal_nocache_insert.php @@ -0,0 +1,51 @@ +<?php +/** + * Smarty Internal Plugin Nocache Insert + * Compiles the {insert} tag into the cache file + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Smarty Internal Plugin Compile Insert Class + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_Nocache_Insert +{ + /** + * Compiles code for the {insert} tag into cache file + * + * @param string $_function insert function name + * @param array $_attr array with parameter + * @param Smarty_Internal_Template $_template template object + * @param string $_script script name to load or 'null' + * @param string $_assign optional variable name + * + * @return string compiled code + */ + public static function compile($_function, $_attr, $_template, $_script, $_assign = null) + { + $_output = '<?php '; + if ($_script !== 'null') { + // script which must be included + // code for script file loading + $_output .= "require_once '{$_script}';"; + } + // call insert + if (isset($_assign)) { + $_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) . + ',\$_smarty_tpl), true);?>'; + } else { + $_output .= "echo {$_function}(" . var_export($_attr, true) . ',$_smarty_tpl);?>'; + } + $_tpl = $_template; + while ($_tpl->_isSubTpl()) { + $_tpl = $_tpl->parent; + } + return "/*%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/"; + } +} diff --git a/sysplugins/smarty_internal_parsetree.php b/sysplugins/smarty_internal_parsetree.php new file mode 100644 index 0000000000000000000000000000000000000000..9f7678526b232a7ca3ebda2babc46fbcfff0d0b3 --- /dev/null +++ b/sysplugins/smarty_internal_parsetree.php @@ -0,0 +1,50 @@ +<?php +/** + * Smarty Internal Plugin Templateparser Parsetree + * These are classes to build parsetree in the template parser + * + * @package Smarty + * @subpackage Compiler + * @author Thue Kristensen + * @author Uwe Tews + */ + +/** + * @package Smarty + * @subpackage Compiler + * @ignore + */ +abstract class Smarty_Internal_ParseTree +{ + /** + * Buffer content + * + * @var mixed + */ + public $data; + + /** + * Subtree array + * + * @var array + */ + public $subtrees = array(); + + /** + * Return buffer + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string buffer content + */ + abstract public function to_smarty_php(Smarty_Internal_Templateparser $parser); + + /** + * Template data object destructor + */ + public function __destruct() + { + $this->data = null; + $this->subtrees = null; + } +} diff --git a/sysplugins/smarty_internal_parsetree_code.php b/sysplugins/smarty_internal_parsetree_code.php new file mode 100644 index 0000000000000000000000000000000000000000..7bd0bc45c41c38935b858d5e2575fc3ad97a5f9e --- /dev/null +++ b/sysplugins/smarty_internal_parsetree_code.php @@ -0,0 +1,42 @@ +<?php +/** + * Smarty Internal Plugin Templateparser Parse Tree + * These are classes to build parse trees in the template parser + * + * @package Smarty + * @subpackage Compiler + * @author Thue Kristensen + * @author Uwe Tews + */ + +/** + * Code fragment inside a tag . + * + * @package Smarty + * @subpackage Compiler + * @ignore + */ +class Smarty_Internal_ParseTree_Code extends Smarty_Internal_ParseTree +{ + /** + * Create parse tree buffer for code fragment + * + * @param string $data content + */ + public function __construct($data) + { + $this->data = $data; + } + + /** + * Return buffer content in parentheses + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string content + */ + public function to_smarty_php(Smarty_Internal_Templateparser $parser) + { + return sprintf('(%s)', $this->data); + } +} diff --git a/sysplugins/smarty_internal_parsetree_dq.php b/sysplugins/smarty_internal_parsetree_dq.php new file mode 100644 index 0000000000000000000000000000000000000000..8655f5869ec4f1a3aef3435190090837b6d81a8f --- /dev/null +++ b/sysplugins/smarty_internal_parsetree_dq.php @@ -0,0 +1,95 @@ +<?php +/** + * Double quoted string inside a tag. + * + * @package Smarty + * @subpackage Compiler + * @ignore + */ + +/** + * Double quoted string inside a tag. + * + * @package Smarty + * @subpackage Compiler + * @ignore + */ +class Smarty_Internal_ParseTree_Dq extends Smarty_Internal_ParseTree +{ + /** + * Create parse tree buffer for double quoted string subtrees + * + * @param object $parser parser object + * @param Smarty_Internal_ParseTree $subtree parse tree buffer + */ + public function __construct($parser, Smarty_Internal_ParseTree $subtree) + { + $this->subtrees[] = $subtree; + if ($subtree instanceof Smarty_Internal_ParseTree_Tag) { + $parser->block_nesting_level = count($parser->compiler->_tag_stack); + } + } + + /** + * Append buffer to subtree + * + * @param \Smarty_Internal_Templateparser $parser + * @param Smarty_Internal_ParseTree $subtree parse tree buffer + */ + public function append_subtree(Smarty_Internal_Templateparser $parser, Smarty_Internal_ParseTree $subtree) + { + $last_subtree = count($this->subtrees) - 1; + if ($last_subtree >= 0 && $this->subtrees[ $last_subtree ] instanceof Smarty_Internal_ParseTree_Tag + && $this->subtrees[ $last_subtree ]->saved_block_nesting < $parser->block_nesting_level + ) { + if ($subtree instanceof Smarty_Internal_ParseTree_Code) { + $this->subtrees[ $last_subtree ]->data = + $parser->compiler->appendCode( + $this->subtrees[ $last_subtree ]->data, + '<?php echo ' . $subtree->data . ';?>' + ); + } elseif ($subtree instanceof Smarty_Internal_ParseTree_DqContent) { + $this->subtrees[ $last_subtree ]->data = + $parser->compiler->appendCode( + $this->subtrees[ $last_subtree ]->data, + '<?php echo "' . $subtree->data . '";?>' + ); + } else { + $this->subtrees[ $last_subtree ]->data = + $parser->compiler->appendCode($this->subtrees[ $last_subtree ]->data, $subtree->data); + } + } else { + $this->subtrees[] = $subtree; + } + if ($subtree instanceof Smarty_Internal_ParseTree_Tag) { + $parser->block_nesting_level = count($parser->compiler->_tag_stack); + } + } + + /** + * Merge subtree buffer content together + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string compiled template code + */ + public function to_smarty_php(Smarty_Internal_Templateparser $parser) + { + $code = ''; + foreach ($this->subtrees as $subtree) { + if ($code !== '') { + $code .= '.'; + } + if ($subtree instanceof Smarty_Internal_ParseTree_Tag) { + $more_php = $subtree->assign_to_var($parser); + } else { + $more_php = $subtree->to_smarty_php($parser); + } + $code .= $more_php; + if (!$subtree instanceof Smarty_Internal_ParseTree_DqContent) { + $parser->compiler->has_variable_string = true; + } + } + return $code; + } +} diff --git a/sysplugins/smarty_internal_parsetree_dqcontent.php b/sysplugins/smarty_internal_parsetree_dqcontent.php new file mode 100644 index 0000000000000000000000000000000000000000..a8ca389d9ca2198e7162efa8422983fcc30fa55b --- /dev/null +++ b/sysplugins/smarty_internal_parsetree_dqcontent.php @@ -0,0 +1,42 @@ +<?php +/** + * Smarty Internal Plugin Templateparser Parse Tree + * These are classes to build parse tree in the template parser + * + * @package Smarty + * @subpackage Compiler + * @author Thue Kristensen + * @author Uwe Tews + */ + +/** + * Raw chars as part of a double quoted string. + * + * @package Smarty + * @subpackage Compiler + * @ignore + */ +class Smarty_Internal_ParseTree_DqContent extends Smarty_Internal_ParseTree +{ + /** + * Create parse tree buffer with string content + * + * @param string $data string section + */ + public function __construct($data) + { + $this->data = $data; + } + + /** + * Return content as double quoted string + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string doubled quoted string + */ + public function to_smarty_php(Smarty_Internal_Templateparser $parser) + { + return '"' . $this->data . '"'; + } +} diff --git a/sysplugins/smarty_internal_parsetree_tag.php b/sysplugins/smarty_internal_parsetree_tag.php new file mode 100644 index 0000000000000000000000000000000000000000..e6c755604c450668c97ccba50d1efa6c2bb112eb --- /dev/null +++ b/sysplugins/smarty_internal_parsetree_tag.php @@ -0,0 +1,67 @@ +<?php +/** + * Smarty Internal Plugin Templateparser Parse Tree + * These are classes to build parse tree in the template parser + * + * @package Smarty + * @subpackage Compiler + * @author Thue Kristensen + * @author Uwe Tews + */ + +/** + * A complete smarty tag. + * + * @package Smarty + * @subpackage Compiler + * @ignore + */ +class Smarty_Internal_ParseTree_Tag extends Smarty_Internal_ParseTree +{ + /** + * Saved block nesting level + * + * @var int + */ + public $saved_block_nesting; + + /** + * Create parse tree buffer for Smarty tag + * + * @param \Smarty_Internal_Templateparser $parser parser object + * @param string $data content + */ + public function __construct(Smarty_Internal_Templateparser $parser, $data) + { + $this->data = $data; + $this->saved_block_nesting = $parser->block_nesting_level; + } + + /** + * Return buffer content + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string content + */ + public function to_smarty_php(Smarty_Internal_Templateparser $parser) + { + return $this->data; + } + + /** + * Return complied code that loads the evaluated output of buffer content into a temporary variable + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string template code + */ + public function assign_to_var(Smarty_Internal_Templateparser $parser) + { + $var = $parser->compiler->getNewPrefixVariable(); + $tmp = $parser->compiler->appendCode('<?php ob_start();?>', $this->data); + $tmp = $parser->compiler->appendCode($tmp, "<?php {$var}=ob_get_clean();?>"); + $parser->compiler->prefix_code[] = sprintf('%s', $tmp); + return $var; + } +} diff --git a/sysplugins/smarty_internal_parsetree_template.php b/sysplugins/smarty_internal_parsetree_template.php new file mode 100644 index 0000000000000000000000000000000000000000..ab4c3ec3b61e98cdf7da770ff9c4f6ecce80d21e --- /dev/null +++ b/sysplugins/smarty_internal_parsetree_template.php @@ -0,0 +1,169 @@ +<?php +/** + * Smarty Internal Plugin Templateparser Parse Tree + * These are classes to build parse tree in the template parser + * + * @package Smarty + * @subpackage Compiler + * @author Thue Kristensen + * @author Uwe Tews + */ + +/** + * Template element + * + * @package Smarty + * @subpackage Compiler + * @ignore + */ +class Smarty_Internal_ParseTree_Template extends Smarty_Internal_ParseTree +{ + /** + * Array of template elements + * + * @var array + */ + public $subtrees = array(); + + /** + * Create root of parse tree for template elements + */ + public function __construct() + { + } + + /** + * Append buffer to subtree + * + * @param \Smarty_Internal_Templateparser $parser + * @param Smarty_Internal_ParseTree $subtree + */ + public function append_subtree(Smarty_Internal_Templateparser $parser, Smarty_Internal_ParseTree $subtree) + { + if (!empty($subtree->subtrees)) { + $this->subtrees = array_merge($this->subtrees, $subtree->subtrees); + } else { + if ($subtree->data !== '') { + $this->subtrees[] = $subtree; + } + } + } + + /** + * Append array to subtree + * + * @param \Smarty_Internal_Templateparser $parser + * @param \Smarty_Internal_ParseTree[] $array + */ + public function append_array(Smarty_Internal_Templateparser $parser, $array = array()) + { + if (!empty($array)) { + $this->subtrees = array_merge($this->subtrees, (array)$array); + } + } + + /** + * Prepend array to subtree + * + * @param \Smarty_Internal_Templateparser $parser + * @param \Smarty_Internal_ParseTree[] $array + */ + public function prepend_array(Smarty_Internal_Templateparser $parser, $array = array()) + { + if (!empty($array)) { + $this->subtrees = array_merge((array)$array, $this->subtrees); + } + } + + /** + * Sanitize and merge subtree buffers together + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string template code content + */ + public function to_smarty_php(Smarty_Internal_Templateparser $parser) + { + $code = ''; + + foreach ($this->getChunkedSubtrees() as $chunk) { + $text = ''; + switch ($chunk['mode']) { + case 'textstripped': + foreach ($chunk['subtrees'] as $subtree) { + $text .= $subtree->to_smarty_php($parser); + } + $code .= preg_replace( + '/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', + "<?php echo '\$1'; ?>\n", + $parser->compiler->processText($text) + ); + break; + case 'text': + foreach ($chunk['subtrees'] as $subtree) { + $text .= $subtree->to_smarty_php($parser); + } + $code .= preg_replace( + '/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', + "<?php echo '\$1'; ?>\n", + $text + ); + break; + case 'tag': + foreach ($chunk['subtrees'] as $subtree) { + $text = $parser->compiler->appendCode($text, $subtree->to_smarty_php($parser)); + } + $code .= $text; + break; + default: + foreach ($chunk['subtrees'] as $subtree) { + $text = $subtree->to_smarty_php($parser); + } + $code .= $text; + + } + } + return $code; + } + + private function getChunkedSubtrees() { + $chunks = array(); + $currentMode = null; + $currentChunk = array(); + for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) { + + if ($this->subtrees[ $key ]->data === '' && in_array($currentMode, array('textstripped', 'text', 'tag'))) { + continue; + } + + if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text + && $this->subtrees[ $key ]->isToBeStripped()) { + $newMode = 'textstripped'; + } elseif ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text) { + $newMode = 'text'; + } elseif ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Tag) { + $newMode = 'tag'; + } else { + $newMode = 'other'; + } + + if ($newMode == $currentMode) { + $currentChunk[] = $this->subtrees[ $key ]; + } else { + $chunks[] = array( + 'mode' => $currentMode, + 'subtrees' => $currentChunk + ); + $currentMode = $newMode; + $currentChunk = array($this->subtrees[ $key ]); + } + } + if ($currentMode && $currentChunk) { + $chunks[] = array( + 'mode' => $currentMode, + 'subtrees' => $currentChunk + ); + } + return $chunks; + } +} diff --git a/sysplugins/smarty_internal_parsetree_text.php b/sysplugins/smarty_internal_parsetree_text.php new file mode 100644 index 0000000000000000000000000000000000000000..399e84941d605c7839d772ecad0d9dd9e6f0e84b --- /dev/null +++ b/sysplugins/smarty_internal_parsetree_text.php @@ -0,0 +1,57 @@ +<?php + +/** + * Smarty Internal Plugin Templateparser Parse Tree + * These are classes to build parse tree in the template parser + * + * @package Smarty + * @subpackage Compiler + * @author Thue Kristensen + * @author Uwe Tews + * * + * template text + * @package Smarty + * @subpackage Compiler + * @ignore + */ +class Smarty_Internal_ParseTree_Text extends Smarty_Internal_ParseTree +{ + + /** + * Wether this section should be stripped on output to smarty php + * @var bool + */ + private $toBeStripped = false; + + /** + * Create template text buffer + * + * @param string $data text + * @param bool $toBeStripped wether this section should be stripped on output to smarty php + */ + public function __construct($data, $toBeStripped = false) + { + $this->data = $data; + $this->toBeStripped = $toBeStripped; + } + + /** + * Wether this section should be stripped on output to smarty php + * @return bool + */ + public function isToBeStripped() { + return $this->toBeStripped; + } + + /** + * Return buffer content + * + * @param \Smarty_Internal_Templateparser $parser + * + * @return string text + */ + public function to_smarty_php(Smarty_Internal_Templateparser $parser) + { + return $this->data; + } +} diff --git a/sysplugins/smarty_internal_resource_eval.php b/sysplugins/smarty_internal_resource_eval.php new file mode 100644 index 0000000000000000000000000000000000000000..3b552a589f7dca602b8505357b1f3759c045a533 --- /dev/null +++ b/sysplugins/smarty_internal_resource_eval.php @@ -0,0 +1,94 @@ +<?php +/** + * Smarty Internal Plugin Resource Eval + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * Smarty Internal Plugin Resource Eval + * Implements the strings as resource for Smarty template + * {@internal unlike string-resources the compiled state of eval-resources is NOT saved for subsequent access}} + * + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Resource_Eval extends Smarty_Resource_Recompiled +{ + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $source->uid = $source->filepath = sha1($source->name); + $source->timestamp = $source->exists = true; + } + + /** + * Load template's source from $resource_name into current template object + * + * @uses decode() to decode base64 and urlencoded template_resources + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + */ + public function getContent(Smarty_Template_Source $source) + { + return $this->decode($source->name); + } + + /** + * decode base64 and urlencode + * + * @param string $string template_resource to decode + * + * @return string decoded template_resource + */ + protected function decode($string) + { + // decode if specified + if (($pos = strpos($string, ':')) !== false) { + if (!strncmp($string, 'base64', 6)) { + return base64_decode(substr($string, 7)); + } elseif (!strncmp($string, 'urlencode', 9)) { + return urldecode(substr($string, 10)); + } + } + return $string; + } + + /** + * modify resource_name according to resource handlers specifications + * + * @param Smarty $smarty Smarty instance + * @param string $resource_name resource_name to make unique + * @param boolean $isConfig flag for config resource + * + * @return string unique resource name + */ + public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) + { + return get_class($this) . '#' . $this->decode($resource_name); + } + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return ''; + } +} diff --git a/sysplugins/smarty_internal_resource_extends.php b/sysplugins/smarty_internal_resource_extends.php new file mode 100644 index 0000000000000000000000000000000000000000..80946932eaea741c3412eb3b66765822c416950e --- /dev/null +++ b/sysplugins/smarty_internal_resource_extends.php @@ -0,0 +1,126 @@ +<?php +/** + * Smarty Internal Plugin Resource Extends + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * Smarty Internal Plugin Resource Extends + * Implements the file system as resource for Smarty which {extend}s a chain of template files templates + * + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Resource_Extends extends Smarty_Resource +{ + /** + * mbstring.overload flag + * + * @var int + */ + public $mbstring_overload = 0; + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @throws SmartyException + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $uid = ''; + $sources = array(); + $components = explode('|', $source->name); + $smarty = &$source->smarty; + $exists = true; + foreach ($components as $component) { + /* @var \Smarty_Template_Source $_s */ + $_s = Smarty_Template_Source::load(null, $smarty, $component); + if ($_s->type === 'php') { + throw new SmartyException("Resource type {$_s->type} cannot be used with the extends resource type"); + } + $sources[ $_s->uid ] = $_s; + $uid .= $_s->filepath; + if ($_template) { + $exists = $exists && $_s->exists; + } + } + $source->components = $sources; + $source->filepath = $_s->filepath; + $source->uid = sha1($uid . $source->smarty->_joined_template_dir); + $source->exists = $exists; + if ($_template) { + $source->timestamp = $_s->timestamp; + } + } + + /** + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + */ + public function populateTimestamp(Smarty_Template_Source $source) + { + $source->exists = true; + /* @var \Smarty_Template_Source $_s */ + foreach ($source->components as $_s) { + $source->exists = $source->exists && $_s->exists; + } + $source->timestamp = $source->exists ? $_s->getTimeStamp() : false; + } + + /** + * Load template's source from files into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) + { + if (!$source->exists) { + throw new SmartyException("Unable to load template '{$source->type}:{$source->name}'"); + } + $_components = array_reverse($source->components); + $_content = ''; + /* @var \Smarty_Template_Source $_s */ + foreach ($_components as $_s) { + // read content + $_content .= $_s->getContent(); + } + return $_content; + } + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return str_replace(':', '.', basename($source->filepath)); + } + + /* + * Disable timestamp checks for extends resource. + * The individual source components will be checked. + * + * @return bool + */ + /** + * @return bool + */ + public function checkTimestamps() + { + return false; + } +} diff --git a/sysplugins/smarty_internal_resource_file.php b/sysplugins/smarty_internal_resource_file.php new file mode 100644 index 0000000000000000000000000000000000000000..ae2060673e788bfcdedd1926bd830916526e719e --- /dev/null +++ b/sysplugins/smarty_internal_resource_file.php @@ -0,0 +1,180 @@ +<?php +/** + * Smarty Internal Plugin Resource File + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * Smarty Internal Plugin Resource File + * Implements the file system as resource for Smarty templates + * + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Resource_File extends Smarty_Resource +{ + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @throws \SmartyException + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $source->filepath = $this->buildFilepath($source, $_template); + if ($source->filepath !== false) { + if (isset($source->smarty->security_policy) && is_object($source->smarty->security_policy)) { + $source->smarty->security_policy->isTrustedResourceDir($source->filepath, $source->isConfig); + } + $source->exists = true; + $source->uid = sha1( + $source->filepath . ($source->isConfig ? $source->smarty->_joined_config_dir : + $source->smarty->_joined_template_dir) + ); + $source->timestamp = filemtime($source->filepath); + } else { + $source->timestamp = $source->exists = false; + } + } + + /** + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + */ + public function populateTimestamp(Smarty_Template_Source $source) + { + if (!$source->exists) { + $source->timestamp = $source->exists = is_file($source->filepath); + } + if ($source->exists) { + $source->timestamp = filemtime($source->filepath); + } + } + + /** + * Load template's source from file into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) + { + if ($source->exists) { + return file_get_contents($source->filepath); + } + throw new SmartyException( + 'Unable to read ' . ($source->isConfig ? 'config' : 'template') . + " {$source->type} '{$source->name}'" + ); + } + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return basename($source->filepath); + } + + /** + * build template filepath by traversing the template_dir array + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return string fully qualified filepath + * @throws SmartyException + */ + protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $file = $source->name; + // absolute file ? + if ($file[ 0 ] === '/' || $file[ 1 ] === ':') { + $file = $source->smarty->_realpath($file, true); + return is_file($file) ? $file : false; + } + // go relative to a given template? + if ($file[ 0 ] === '.' && $_template && $_template->_isSubTpl() + && preg_match('#^[.]{1,2}[\\\/]#', $file) + ) { + if ($_template->parent->source->type !== 'file' && $_template->parent->source->type !== 'extends' + && !isset($_template->parent->_cache[ 'allow_relative_path' ]) + ) { + throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'"); + } + // normalize path + $path = + $source->smarty->_realpath(dirname($_template->parent->source->filepath) . DIRECTORY_SEPARATOR . $file); + // files relative to a template only get one shot + return is_file($path) ? $path : false; + } + // normalize DIRECTORY_SEPARATOR + if (strpos($file, DIRECTORY_SEPARATOR === '/' ? '\\' : '/') !== false) { + $file = str_replace(DIRECTORY_SEPARATOR === '/' ? '\\' : '/', DIRECTORY_SEPARATOR, $file); + } + $_directories = $source->smarty->getTemplateDir(null, $source->isConfig); + // template_dir index? + if ($file[ 0 ] === '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) { + $file = $fileMatch[ 2 ]; + $_indices = explode(',', $fileMatch[ 1 ]); + $_index_dirs = array(); + foreach ($_indices as $index) { + $index = trim($index); + // try string indexes + if (isset($_directories[ $index ])) { + $_index_dirs[] = $_directories[ $index ]; + } elseif (is_numeric($index)) { + // try numeric index + $index = (int)$index; + if (isset($_directories[ $index ])) { + $_index_dirs[] = $_directories[ $index ]; + } else { + // try at location index + $keys = array_keys($_directories); + if (isset($_directories[ $keys[ $index ] ])) { + $_index_dirs[] = $_directories[ $keys[ $index ] ]; + } + } + } + } + if (empty($_index_dirs)) { + // index not found + return false; + } else { + $_directories = $_index_dirs; + } + } + // relative file name? + foreach ($_directories as $_directory) { + $path = $_directory . $file; + if (is_file($path)) { + return (strpos($path, '.' . DIRECTORY_SEPARATOR) !== false) ? $source->smarty->_realpath($path) : $path; + } + } + if (!isset($_index_dirs)) { + // Could be relative to cwd + $path = $source->smarty->_realpath($file, true); + if (is_file($path)) { + return $path; + } + } + // Use include path ? + if ($source->smarty->use_include_path) { + return $source->smarty->ext->_getIncludePath->getIncludePath($_directories, $file, $source->smarty); + } + return false; + } +} diff --git a/sysplugins/smarty_internal_resource_php.php b/sysplugins/smarty_internal_resource_php.php new file mode 100644 index 0000000000000000000000000000000000000000..9d98ae181f76917257ac68aaccf2191455fce758 --- /dev/null +++ b/sysplugins/smarty_internal_resource_php.php @@ -0,0 +1,116 @@ +<?php + +/** + * Smarty Internal Plugin Resource PHP + * Implements the file system as resource for PHP templates + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ +class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File +{ + /** + * Flag that it's an uncompiled resource + * + * @var bool + */ + public $uncompiled = true; + + /** + * Resource does implement populateCompiledFilepath() method + * + * @var bool + */ + public $hasCompiledHandler = true; + + /** + * container for short_open_tag directive's value before executing PHP templates + * + * @var string + */ + protected $short_open_tag; + + /** + * Create a new PHP Resource + */ + public function __construct() + { + $this->short_open_tag = function_exists('ini_get') ? ini_get('short_open_tag') : 1; + } + + /** + * Load template's source from file into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) + { + if ($source->exists) { + return ''; + } + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } + + /** + * populate compiled object with compiled filepath + * + * @param Smarty_Template_Compiled $compiled compiled object + * @param Smarty_Internal_Template $_template template object (is ignored) + */ + public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) + { + $compiled->filepath = $_template->source->filepath; + $compiled->timestamp = $_template->source->timestamp; + $compiled->exists = $_template->source->exists; + $compiled->file_dependency[ $_template->source->uid ] = + array( + $compiled->filepath, + $compiled->timestamp, + $_template->source->type, + ); + } + + /** + * Render and output the template (without using the compiler) + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return void + * @throws SmartyException if template cannot be loaded or allow_php_templates is disabled + */ + public function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template) + { + if (!$source->smarty->allow_php_templates) { + throw new SmartyException('PHP templates are disabled'); + } + if (!$source->exists) { + throw new SmartyException( + "Unable to load template '{$source->type}:{$source->name}'" . + ($_template->_isSubTpl() ? " in '{$_template->parent->template_resource}'" : '') + ); + } + // prepare variables + extract($_template->getTemplateVars()); + // include PHP template with short open tags enabled + if (function_exists('ini_set')) { + ini_set('short_open_tag', '1'); + } + /** + * + * + * @var Smarty_Internal_Template $_smarty_template + * used in included file + */ + $_smarty_template = $_template; + include $source->filepath; + if (function_exists('ini_set')) { + ini_set('short_open_tag', $this->short_open_tag); + } + } +} diff --git a/sysplugins/smarty_internal_resource_registered.php b/sysplugins/smarty_internal_resource_registered.php new file mode 100644 index 0000000000000000000000000000000000000000..df526101f016771f5622c69d7073b58a9ddfe318 --- /dev/null +++ b/sysplugins/smarty_internal_resource_registered.php @@ -0,0 +1,101 @@ +<?php +/** + * Smarty Internal Plugin Resource Registered + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * Smarty Internal Plugin Resource Registered + * Implements the registered resource for Smarty template + * + * @package Smarty + * @subpackage TemplateResources + * @deprecated + */ +class Smarty_Internal_Resource_Registered extends Smarty_Resource +{ + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $source->filepath = $source->type . ':' . $source->name; + $source->uid = sha1($source->filepath . $source->smarty->_joined_template_dir); + $source->timestamp = $this->getTemplateTimestamp($source); + $source->exists = !!$source->timestamp; + } + + /** + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + * + * @return void + */ + public function populateTimestamp(Smarty_Template_Source $source) + { + $source->timestamp = $this->getTemplateTimestamp($source); + $source->exists = !!$source->timestamp; + } + + /** + * Get timestamp (epoch) the template source was modified + * + * @param Smarty_Template_Source $source source object + * + * @return integer|boolean timestamp (epoch) the template was modified, false if resources has no timestamp + */ + public function getTemplateTimestamp(Smarty_Template_Source $source) + { + // return timestamp + $time_stamp = false; + call_user_func_array( + $source->smarty->registered_resources[ $source->type ][ 0 ][ 1 ], + array($source->name, &$time_stamp, $source->smarty) + ); + return is_numeric($time_stamp) ? (int)$time_stamp : $time_stamp; + } + + /** + * Load template's source by invoking the registered callback into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) + { + // return template string + $content = null; + $t = call_user_func_array( + $source->smarty->registered_resources[ $source->type ][ 0 ][ 0 ], + array($source->name, &$content, $source->smarty) + ); + if (is_bool($t) && !$t) { + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } + return $content; + } + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return basename($source->name); + } +} diff --git a/sysplugins/smarty_internal_resource_stream.php b/sysplugins/smarty_internal_resource_stream.php new file mode 100644 index 0000000000000000000000000000000000000000..9956bd07306f0af6e7a01c199b902a0709d41060 --- /dev/null +++ b/sysplugins/smarty_internal_resource_stream.php @@ -0,0 +1,78 @@ +<?php +/** + * Smarty Internal Plugin Resource Stream + * Implements the streams as resource for Smarty template + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * Smarty Internal Plugin Resource Stream + * Implements the streams as resource for Smarty template + * + * @link http://php.net/streams + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled +{ + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + if (strpos($source->resource, '://') !== false) { + $source->filepath = $source->resource; + } else { + $source->filepath = str_replace(':', '://', $source->resource); + } + $source->uid = false; + $source->content = $this->getContent($source); + $source->timestamp = $source->exists = !!$source->content; + } + + /** + * Load template's source from stream into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + */ + public function getContent(Smarty_Template_Source $source) + { + $t = ''; + // the availability of the stream has already been checked in Smarty_Resource::fetch() + $fp = fopen($source->filepath, 'r+'); + if ($fp) { + while (!feof($fp) && ($current_line = fgets($fp)) !== false) { + $t .= $current_line; + } + fclose($fp); + return $t; + } else { + return false; + } + } + + /** + * modify resource_name according to resource handlers specifications + * + * @param Smarty $smarty Smarty instance + * @param string $resource_name resource_name to make unique + * @param boolean $isConfig flag for config resource + * + * @return string unique resource name + */ + public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) + { + return get_class($this) . '#' . $resource_name; + } +} diff --git a/sysplugins/smarty_internal_resource_string.php b/sysplugins/smarty_internal_resource_string.php new file mode 100644 index 0000000000000000000000000000000000000000..3fecbb7ef782ba04a99b3d22554b173e56fa9515 --- /dev/null +++ b/sysplugins/smarty_internal_resource_string.php @@ -0,0 +1,108 @@ +<?php +/** + * Smarty Internal Plugin Resource String + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + * @author Rodney Rehm + */ + +/** + * Smarty Internal Plugin Resource String + * Implements the strings as resource for Smarty template + * {@internal unlike eval-resources the compiled state of string-resources is saved for subsequent access}} + * + * @package Smarty + * @subpackage TemplateResources + */ +class Smarty_Internal_Resource_String extends Smarty_Resource +{ + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $source->uid = $source->filepath = sha1($source->name . $source->smarty->_joined_template_dir); + $source->timestamp = $source->exists = true; + } + + /** + * Load template's source from $resource_name into current template object + * + * @uses decode() to decode base64 and urlencoded template_resources + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + */ + public function getContent(Smarty_Template_Source $source) + { + return $this->decode($source->name); + } + + /** + * decode base64 and urlencode + * + * @param string $string template_resource to decode + * + * @return string decoded template_resource + */ + protected function decode($string) + { + // decode if specified + if (($pos = strpos($string, ':')) !== false) { + if (!strncmp($string, 'base64', 6)) { + return base64_decode(substr($string, 7)); + } elseif (!strncmp($string, 'urlencode', 9)) { + return urldecode(substr($string, 10)); + } + } + return $string; + } + + /** + * modify resource_name according to resource handlers specifications + * + * @param Smarty $smarty Smarty instance + * @param string $resource_name resource_name to make unique + * @param boolean $isConfig flag for config resource + * + * @return string unique resource name + */ + public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) + { + return get_class($this) . '#' . $this->decode($resource_name); + } + + /** + * Determine basename for compiled filename + * Always returns an empty string. + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return ''; + } + + /* + * Disable timestamp checks for string resource. + * + * @return bool + */ + /** + * @return bool + */ + public function checkTimestamps() + { + return false; + } +} diff --git a/sysplugins/smarty_internal_runtime_cachemodify.php b/sysplugins/smarty_internal_runtime_cachemodify.php new file mode 100644 index 0000000000000000000000000000000000000000..6e12d2ae19aa005078eb9c094d7ce1bf331a3735 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_cachemodify.php @@ -0,0 +1,68 @@ +<?php + +/** + * Inline Runtime Methods render, setSourceByUid, setupSubTemplate + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + **/ +class Smarty_Internal_Runtime_CacheModify +{ + /** + * check client side cache + * + * @param \Smarty_Template_Cached $cached + * @param \Smarty_Internal_Template $_template + * @param string $content + * + * @throws \Exception + * @throws \SmartyException + */ + public function cacheModifiedCheck(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content) + { + $_isCached = $_template->isCached() && !$_template->compiled->has_nocache_code; + $_last_modified_date = + @substr($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 0, strpos($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 'GMT') + 3); + if ($_isCached && $cached->timestamp <= strtotime($_last_modified_date)) { + switch (PHP_SAPI) { + case 'cgi': // php-cgi < 5.3 + case 'cgi-fcgi': // php-cgi >= 5.3 + case 'fpm-fcgi': // php-fpm >= 5.3.3 + header('Status: 304 Not Modified'); + break; + case 'cli': + if (/* ^phpunit */ + !empty($_SERVER[ 'SMARTY_PHPUNIT_DISABLE_HEADERS' ]) /* phpunit$ */ + ) { + $_SERVER[ 'SMARTY_PHPUNIT_HEADERS' ][] = '304 Not Modified'; + } + break; + default: + if (/* ^phpunit */ + !empty($_SERVER[ 'SMARTY_PHPUNIT_DISABLE_HEADERS' ]) /* phpunit$ */ + ) { + $_SERVER[ 'SMARTY_PHPUNIT_HEADERS' ][] = '304 Not Modified'; + } else { + header($_SERVER[ 'SERVER_PROTOCOL' ] . ' 304 Not Modified'); + } + break; + } + } else { + switch (PHP_SAPI) { + case 'cli': + if (/* ^phpunit */ + !empty($_SERVER[ 'SMARTY_PHPUNIT_DISABLE_HEADERS' ]) /* phpunit$ */ + ) { + $_SERVER[ 'SMARTY_PHPUNIT_HEADERS' ][] = + 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $cached->timestamp) . ' GMT'; + } + break; + default: + header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $cached->timestamp) . ' GMT'); + break; + } + echo $content; + } + } +} diff --git a/sysplugins/smarty_internal_runtime_cacheresourcefile.php b/sysplugins/smarty_internal_runtime_cacheresourcefile.php new file mode 100644 index 0000000000000000000000000000000000000000..2870964383418c34f54f8efc1bc796d0a052e2b4 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_cacheresourcefile.php @@ -0,0 +1,139 @@ +<?php +/** + * Smarty cache resource file clear method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ + +/** + * Smarty Internal Runtime Cache Resource File Class + * + * @package Smarty + * @subpackage PluginsInternal + */ +class Smarty_Internal_Runtime_CacheResourceFile +{ + /** + * Empty cache for a specific template + * + * @param Smarty $smarty + * @param string $resource_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time (number of seconds, not timestamp) + * + * @return integer number of cache files deleted + */ + public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) + { + $_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null; + $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null; + $_dir_sep = $smarty->use_sub_dirs ? '/' : '^'; + $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0; + $_dir = $smarty->getCacheDir(); + if ($_dir === '/') { //We should never want to delete this! + return 0; + } + $_dir_length = strlen($_dir); + if (isset($_cache_id)) { + $_cache_id_parts = explode('|', $_cache_id); + $_cache_id_parts_count = count($_cache_id_parts); + if ($smarty->use_sub_dirs) { + foreach ($_cache_id_parts as $id_part) { + $_dir .= $id_part . '/'; + } + } + } + if (isset($resource_name)) { + $_save_stat = $smarty->caching; + $smarty->caching = Smarty::CACHING_LIFETIME_CURRENT; + $tpl = new $smarty->template_class($resource_name, $smarty); + $smarty->caching = $_save_stat; + // remove from template cache + $tpl->source; // have the template registered before unset() + if ($tpl->source->exists) { + $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath)); + } else { + return 0; + } + } + $_count = 0; + $_time = time(); + if (file_exists($_dir)) { + $_cacheDirs = new RecursiveDirectoryIterator($_dir); + $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST); + foreach ($_cache as $_file) { + if (substr(basename($_file->getPathname()), 0, 1) === '.') { + continue; + } + $_filepath = (string)$_file; + // directory ? + if ($_file->isDir()) { + if (!$_cache->isDot()) { + // delete folder if empty + @rmdir($_file->getPathname()); + } + } else { + // delete only php files + if (substr($_filepath, -4) !== '.php') { + continue; + } + $_parts = explode($_dir_sep, str_replace('\\', '/', substr($_filepath, $_dir_length))); + $_parts_count = count($_parts); + // check name + if (isset($resource_name)) { + if ($_parts[ $_parts_count - 1 ] !== $_resourcename_parts) { + continue; + } + } + // check compile id + if (isset($_compile_id) && (!isset($_parts[ $_parts_count - 2 - $_compile_id_offset ]) + || $_parts[ $_parts_count - 2 - $_compile_id_offset ] !== $_compile_id) + ) { + continue; + } + // check cache id + if (isset($_cache_id)) { + // count of cache id parts + $_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset : + $_parts_count - 1 - $_compile_id_offset; + if ($_parts_count < $_cache_id_parts_count) { + continue; + } + for ($i = 0; $i < $_cache_id_parts_count; $i++) { + if ($_parts[ $i ] !== $_cache_id_parts[ $i ]) { + continue 2; + } + } + } + if (is_file($_filepath)) { + // expired ? + if (isset($exp_time)) { + if ($exp_time < 0) { + preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_filepath), $match); + if ($_time < (filemtime($_filepath) + $match[ 1 ])) { + continue; + } + } else { + if ($_time - filemtime($_filepath) < $exp_time) { + continue; + } + } + } + $_count += @unlink($_filepath) ? 1 : 0; + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) + ) { + opcache_invalidate($_filepath, true); + } elseif (function_exists('apc_delete_file')) { + apc_delete_file($_filepath); + } + } + } + } + } + return $_count; + } +} diff --git a/sysplugins/smarty_internal_runtime_capture.php b/sysplugins/smarty_internal_runtime_capture.php new file mode 100644 index 0000000000000000000000000000000000000000..c9dca83d95fa3c5b7f2ce6033e5a92aed9fcffd6 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_capture.php @@ -0,0 +1,174 @@ +<?php + +/** + * Runtime Extension Capture + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Runtime_Capture +{ + /** + * Flag that this instance will not be cached + * + * @var bool + */ + public $isPrivateExtension = true; + + /** + * Stack of capture parameter + * + * @var array + */ + private $captureStack = array(); + + /** + * Current open capture sections + * + * @var int + */ + private $captureCount = 0; + + /** + * Count stack + * + * @var int[] + */ + private $countStack = array(); + + /** + * Named buffer + * + * @var string[] + */ + private $namedBuffer = array(); + + /** + * Flag if callbacks are registered + * + * @var bool + */ + private $isRegistered = false; + + /** + * Open capture section + * + * @param \Smarty_Internal_Template $_template + * @param string $buffer capture name + * @param string $assign variable name + * @param string $append variable name + */ + public function open(Smarty_Internal_Template $_template, $buffer, $assign, $append) + { + if (!$this->isRegistered) { + $this->register($_template); + } + $this->captureStack[] = array( + $buffer, + $assign, + $append + ); + $this->captureCount++; + ob_start(); + } + + /** + * Register callbacks in template class + * + * @param \Smarty_Internal_Template $_template + */ + private function register(Smarty_Internal_Template $_template) + { + $_template->startRenderCallbacks[] = array( + $this, + 'startRender' + ); + $_template->endRenderCallbacks[] = array( + $this, + 'endRender' + ); + $this->startRender($_template); + $this->isRegistered = true; + } + + /** + * Start render callback + * + * @param \Smarty_Internal_Template $_template + */ + public function startRender(Smarty_Internal_Template $_template) + { + $this->countStack[] = $this->captureCount; + $this->captureCount = 0; + } + + /** + * Close capture section + * + * @param \Smarty_Internal_Template $_template + * + * @throws \SmartyException + */ + public function close(Smarty_Internal_Template $_template) + { + if ($this->captureCount) { + list($buffer, $assign, $append) = array_pop($this->captureStack); + $this->captureCount--; + if (isset($assign)) { + $_template->assign($assign, ob_get_contents()); + } + if (isset($append)) { + $_template->append($append, ob_get_contents()); + } + $this->namedBuffer[ $buffer ] = ob_get_clean(); + } else { + $this->error($_template); + } + } + + /** + * Error exception on not matching {capture}{/capture} + * + * @param \Smarty_Internal_Template $_template + * + * @throws \SmartyException + */ + public function error(Smarty_Internal_Template $_template) + { + throw new SmartyException("Not matching {capture}{/capture} in '{$_template->template_resource}'"); + } + + /** + * Return content of named capture buffer by key or as array + * + * @param \Smarty_Internal_Template $_template + * @param string|null $name + * + * @return string|string[]|null + */ + public function getBuffer(Smarty_Internal_Template $_template, $name = null) + { + if (isset($name)) { + return isset($this->namedBuffer[ $name ]) ? $this->namedBuffer[ $name ] : null; + } else { + return $this->namedBuffer; + } + } + + /** + * End render callback + * + * @param \Smarty_Internal_Template $_template + * + * @throws \SmartyException + */ + public function endRender(Smarty_Internal_Template $_template) + { + if ($this->captureCount) { + $this->error($_template); + } else { + $this->captureCount = array_pop($this->countStack); + } + } +} diff --git a/sysplugins/smarty_internal_runtime_codeframe.php b/sysplugins/smarty_internal_runtime_codeframe.php new file mode 100644 index 0000000000000000000000000000000000000000..983ca6180fa065669e7c85bb60577e699266e092 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_codeframe.php @@ -0,0 +1,100 @@ +<?php +/** + * Smarty Internal Extension + * This file contains the Smarty template extension to create a code frame + * + * @package Smarty + * @subpackage Template + * @author Uwe Tews + */ + +/** + * Class Smarty_Internal_Extension_CodeFrame + * Create code frame for compiled and cached templates + */ +class Smarty_Internal_Runtime_CodeFrame +{ + /** + * Create code frame for compiled and cached templates + * + * @param Smarty_Internal_Template $_template + * @param string $content optional template content + * @param string $functions compiled template function and block code + * @param bool $cache flag for cache file + * @param \Smarty_Internal_TemplateCompilerBase $compiler + * + * @return string + */ + public function create( + Smarty_Internal_Template $_template, + $content = '', + $functions = '', + $cache = false, + Smarty_Internal_TemplateCompilerBase $compiler = null + ) { + // build property code + $properties[ 'version' ] = Smarty::SMARTY_VERSION; + $properties[ 'unifunc' ] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true)); + if (!$cache) { + $properties[ 'has_nocache_code' ] = $_template->compiled->has_nocache_code; + $properties[ 'file_dependency' ] = $_template->compiled->file_dependency; + $properties[ 'includes' ] = $_template->compiled->includes; + } else { + $properties[ 'has_nocache_code' ] = $_template->cached->has_nocache_code; + $properties[ 'file_dependency' ] = $_template->cached->file_dependency; + $properties[ 'cache_lifetime' ] = $_template->cache_lifetime; + } + $output = "<?php\n"; + $output .= "/* Smarty version {$properties[ 'version' ]}, created on " . strftime("%Y-%m-%d %H:%M:%S") . + "\n from '" . str_replace('*/', '* /', $_template->source->filepath) . "' */\n\n"; + $output .= "/* @var Smarty_Internal_Template \$_smarty_tpl */\n"; + $dec = "\$_smarty_tpl->_decodeProperties(\$_smarty_tpl, " . var_export($properties, true) . ',' . + ($cache ? 'true' : 'false') . ')'; + $output .= "if ({$dec}) {\n"; + $output .= "function {$properties['unifunc']} (Smarty_Internal_Template \$_smarty_tpl) {\n"; + if (!$cache && !empty($compiler->tpl_function)) { + $output .= '$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions($_smarty_tpl, '; + $output .= var_export($compiler->tpl_function, true); + $output .= ");\n"; + } + if ($cache && isset($_template->smarty->ext->_tplFunction)) { + $output .= "\$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions(\$_smarty_tpl, " . + var_export($_template->smarty->ext->_tplFunction->getTplFunction($_template), true) . ");\n"; + } + $output .= "?>"; + $output .= $content; + $output .= "<?php }\n?>"; + $output .= $functions; + $output .= "<?php }\n"; + // remove unneeded PHP tags + if (preg_match('/\s*\?>[\n]?<\?php\s*/', $output)) { + $curr_split = preg_split( + '/\s*\?>[\n]?<\?php\s*/', + $output + ); + preg_match_all( + '/\s*\?>[\n]?<\?php\s*/', + $output, + $curr_parts + ); + $output = ''; + foreach ($curr_split as $idx => $curr_output) { + $output .= $curr_output; + if (isset($curr_parts[ 0 ][ $idx ])) { + $output .= "\n"; + } + } + } + if (preg_match('/\?>\s*$/', $output)) { + $curr_split = preg_split( + '/\?>\s*$/', + $output + ); + $output = ''; + foreach ($curr_split as $idx => $curr_output) { + $output .= $curr_output; + } + } + return $output; + } +} diff --git a/sysplugins/smarty_internal_runtime_filterhandler.php b/sysplugins/smarty_internal_runtime_filterhandler.php new file mode 100644 index 0000000000000000000000000000000000000000..9f868e1a40b1e0cff9f4c44d7d475d0805ab7f44 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_filterhandler.php @@ -0,0 +1,69 @@ +<?php +/** + * Smarty Internal Plugin Filter Handler + * Smarty filter handler class + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ + +/** + * Class for filter processing + * + * @package Smarty + * @subpackage PluginsInternal + */ +class Smarty_Internal_Runtime_FilterHandler +{ + /** + * Run filters over content + * The filters will be lazy loaded if required + * class name format: Smarty_FilterType_FilterName + * plugin filename format: filtertype.filtername.php + * Smarty2 filter plugins could be used + * + * @param string $type the type of filter ('pre','post','output') which shall run + * @param string $content the content which shall be processed by the filters + * @param Smarty_Internal_Template $template template object + * + * @throws SmartyException + * @return string the filtered content + */ + public function runFilter($type, $content, Smarty_Internal_Template $template) + { + // loop over autoload filters of specified type + if (!empty($template->smarty->autoload_filters[ $type ])) { + foreach ((array)$template->smarty->autoload_filters[ $type ] as $name) { + $plugin_name = "Smarty_{$type}filter_{$name}"; + if (function_exists($plugin_name)) { + $callback = $plugin_name; + } elseif (class_exists($plugin_name, false) && is_callable(array($plugin_name, 'execute'))) { + $callback = array($plugin_name, 'execute'); + } elseif ($template->smarty->loadPlugin($plugin_name, false)) { + if (function_exists($plugin_name)) { + // use loaded Smarty2 style plugin + $callback = $plugin_name; + } elseif (class_exists($plugin_name, false) && is_callable(array($plugin_name, 'execute'))) { + // loaded class of filter plugin + $callback = array($plugin_name, 'execute'); + } else { + throw new SmartyException("Auto load {$type}-filter plugin method '{$plugin_name}::execute' not callable"); + } + } else { + // nothing found, throw exception + throw new SmartyException("Unable to auto load {$type}-filter plugin '{$plugin_name}'"); + } + $content = call_user_func($callback, $content, $template); + } + } + // loop over registered filters of specified type + if (!empty($template->smarty->registered_filters[ $type ])) { + foreach ($template->smarty->registered_filters[ $type ] as $key => $name) { + $content = call_user_func($template->smarty->registered_filters[ $type ][ $key ], $content, $template); + } + } + // return filtered output + return $content; + } +} diff --git a/sysplugins/smarty_internal_runtime_foreach.php b/sysplugins/smarty_internal_runtime_foreach.php new file mode 100644 index 0000000000000000000000000000000000000000..badead16545f88007efd7b56f2989029bad9a76c --- /dev/null +++ b/sysplugins/smarty_internal_runtime_foreach.php @@ -0,0 +1,162 @@ +<?php + +/** + * Foreach Runtime Methods count(), init(), restore() + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Runtime_Foreach +{ + /** + * Stack of saved variables + * + * @var array + */ + private $stack = array(); + + /** + * Init foreach loop + * - save item and key variables, named foreach property data if defined + * - init item and key variables, named foreach property data if required + * - count total if required + * + * @param \Smarty_Internal_Template $tpl + * @param mixed $from values to loop over + * @param string $item variable name + * @param bool $needTotal flag if we need to count values + * @param null|string $key variable name + * @param null|string $name of named foreach + * @param array $properties of named foreach + * + * @return mixed $from + */ + public function init( + Smarty_Internal_Template $tpl, + $from, + $item, + $needTotal = false, + $key = null, + $name = null, + $properties = array() + ) { + $needTotal = $needTotal || isset($properties[ 'total' ]); + $saveVars = array(); + $total = null; + if (!is_array($from)) { + if (is_object($from)) { + if ($needTotal) { + $total = $this->count($from); + } + } else { + settype($from, 'array'); + } + } + if (!isset($total)) { + $total = empty($from) ? 0 : ($needTotal ? count($from) : 1); + } + if (isset($tpl->tpl_vars[ $item ])) { + $saveVars[ 'item' ] = array( + $item, + $tpl->tpl_vars[ $item ] + ); + } + $tpl->tpl_vars[ $item ] = new Smarty_Variable(null, $tpl->isRenderingCache); + if ($total === 0) { + $from = null; + } else { + if ($key) { + if (isset($tpl->tpl_vars[ $key ])) { + $saveVars[ 'key' ] = array( + $key, + $tpl->tpl_vars[ $key ] + ); + } + $tpl->tpl_vars[ $key ] = new Smarty_Variable(null, $tpl->isRenderingCache); + } + } + if ($needTotal) { + $tpl->tpl_vars[ $item ]->total = $total; + } + if ($name) { + $namedVar = "__smarty_foreach_{$name}"; + if (isset($tpl->tpl_vars[ $namedVar ])) { + $saveVars[ 'named' ] = array( + $namedVar, + $tpl->tpl_vars[ $namedVar ] + ); + } + $namedProp = array(); + if (isset($properties[ 'total' ])) { + $namedProp[ 'total' ] = $total; + } + if (isset($properties[ 'iteration' ])) { + $namedProp[ 'iteration' ] = 0; + } + if (isset($properties[ 'index' ])) { + $namedProp[ 'index' ] = -1; + } + if (isset($properties[ 'show' ])) { + $namedProp[ 'show' ] = ($total > 0); + } + $tpl->tpl_vars[ $namedVar ] = new Smarty_Variable($namedProp); + } + $this->stack[] = $saveVars; + return $from; + } + + /** + * [util function] counts an array, arrayAccess/traversable or PDOStatement object + * + * @param mixed $value + * + * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 + * for empty elements + */ + public function count($value) + { + if ($value instanceof IteratorAggregate) { + // Note: getIterator() returns a Traversable, not an Iterator + // thus rewind() and valid() methods may not be present + return iterator_count($value->getIterator()); + } elseif ($value instanceof Iterator) { + return $value instanceof Generator ? 1 : iterator_count($value); + } elseif ($value instanceof Countable) { + return count($value); + } elseif ($value instanceof PDOStatement) { + return $value->rowCount(); + } elseif ($value instanceof Traversable) { + return iterator_count($value); + } + return count((array)$value); + } + + /** + * Restore saved variables + * + * will be called by {break n} or {continue n} for the required number of levels + * + * @param \Smarty_Internal_Template $tpl + * @param int $levels number of levels + */ + public function restore(Smarty_Internal_Template $tpl, $levels = 1) + { + while ($levels) { + $saveVars = array_pop($this->stack); + if (!empty($saveVars)) { + if (isset($saveVars[ 'item' ])) { + $item = &$saveVars[ 'item' ]; + $tpl->tpl_vars[ $item[ 0 ] ]->value = $item[ 1 ]->value; + } + if (isset($saveVars[ 'key' ])) { + $tpl->tpl_vars[ $saveVars[ 'key' ][ 0 ] ] = $saveVars[ 'key' ][ 1 ]; + } + if (isset($saveVars[ 'named' ])) { + $tpl->tpl_vars[ $saveVars[ 'named' ][ 0 ] ] = $saveVars[ 'named' ][ 1 ]; + } + } + $levels--; + } + } +} diff --git a/sysplugins/smarty_internal_runtime_getincludepath.php b/sysplugins/smarty_internal_runtime_getincludepath.php new file mode 100644 index 0000000000000000000000000000000000000000..5ae98304ea10a71bf54588473ef0af572ad4b677 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_getincludepath.php @@ -0,0 +1,181 @@ +<?php +/** + * Smarty read include path plugin + * + * @package Smarty + * @subpackage PluginsInternal + * @author Monte Ohrt + */ + +/** + * Smarty Internal Read Include Path Class + * + * @package Smarty + * @subpackage PluginsInternal + */ +class Smarty_Internal_Runtime_GetIncludePath +{ + /** + * include path cache + * + * @var string + */ + public $_include_path = ''; + + /** + * include path directory cache + * + * @var array + */ + public $_include_dirs = array(); + + /** + * include path directory cache + * + * @var array + */ + public $_user_dirs = array(); + + /** + * stream cache + * + * @var string[][] + */ + public $isFile = array(); + + /** + * stream cache + * + * @var string[] + */ + public $isPath = array(); + + /** + * stream cache + * + * @var int[] + */ + public $number = array(); + + /** + * status cache + * + * @var bool + */ + public $_has_stream_include = null; + + /** + * Number for array index + * + * @var int + */ + public $counter = 0; + + /** + * Check if include path was updated + * + * @param \Smarty $smarty + * + * @return bool + */ + public function isNewIncludePath(Smarty $smarty) + { + $_i_path = get_include_path(); + if ($this->_include_path !== $_i_path) { + $this->_include_dirs = array(); + $this->_include_path = $_i_path; + $_dirs = (array)explode(PATH_SEPARATOR, $_i_path); + foreach ($_dirs as $_path) { + if (is_dir($_path)) { + $this->_include_dirs[] = $smarty->_realpath($_path . DIRECTORY_SEPARATOR, true); + } + } + return true; + } + return false; + } + + /** + * return array with include path directories + * + * @param \Smarty $smarty + * + * @return array + */ + public function getIncludePathDirs(Smarty $smarty) + { + $this->isNewIncludePath($smarty); + return $this->_include_dirs; + } + + /** + * Return full file path from PHP include_path + * + * @param string[] $dirs + * @param string $file + * @param \Smarty $smarty + * + * @return bool|string full filepath or false + */ + public function getIncludePath($dirs, $file, Smarty $smarty) + { + //if (!(isset($this->_has_stream_include) ? $this->_has_stream_include : $this->_has_stream_include = false)) { + if (!(isset($this->_has_stream_include) ? $this->_has_stream_include : + $this->_has_stream_include = function_exists('stream_resolve_include_path')) + ) { + $this->isNewIncludePath($smarty); + } + // try PHP include_path + foreach ($dirs as $dir) { + $dir_n = isset($this->number[ $dir ]) ? $this->number[ $dir ] : $this->number[ $dir ] = $this->counter++; + if (isset($this->isFile[ $dir_n ][ $file ])) { + if ($this->isFile[ $dir_n ][ $file ]) { + return $this->isFile[ $dir_n ][ $file ]; + } else { + continue; + } + } + if (isset($this->_user_dirs[ $dir_n ])) { + if (false === $this->_user_dirs[ $dir_n ]) { + continue; + } else { + $dir = $this->_user_dirs[ $dir_n ]; + } + } else { + if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') { + $dir = str_ireplace(getcwd(), '.', $dir); + if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') { + $this->_user_dirs[ $dir_n ] = false; + continue; + } + } + $dir = substr($dir, 2); + $this->_user_dirs[ $dir_n ] = $dir; + } + if ($this->_has_stream_include) { + $path = stream_resolve_include_path($dir . (isset($file) ? $file : '')); + if ($path) { + return $this->isFile[ $dir_n ][ $file ] = $path; + } + } else { + foreach ($this->_include_dirs as $key => $_i_path) { + $path = isset($this->isPath[ $key ][ $dir_n ]) ? $this->isPath[ $key ][ $dir_n ] : + $this->isPath[ $key ][ $dir_n ] = is_dir($_dir_path = $_i_path . $dir) ? $_dir_path : false; + if ($path === false) { + continue; + } + if (isset($file)) { + $_file = $this->isFile[ $dir_n ][ $file ] = (is_file($path . $file)) ? $path . $file : false; + if ($_file) { + return $_file; + } + } else { + // no file was given return directory path + return $path; + } + } + } + } + return false; + } +} diff --git a/sysplugins/smarty_internal_runtime_inheritance.php b/sysplugins/smarty_internal_runtime_inheritance.php new file mode 100644 index 0000000000000000000000000000000000000000..8f7f02d59b5e90d80e4294a18d50dd901a1a3948 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_inheritance.php @@ -0,0 +1,251 @@ +<?php + +/** + * Inheritance Runtime Methods processBlock, endChild, init + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + **/ +class Smarty_Internal_Runtime_Inheritance +{ + /** + * State machine + * - 0 idle next extends will create a new inheritance tree + * - 1 processing child template + * - 2 wait for next inheritance template + * - 3 assume parent template, if child will loaded goto state 1 + * a call to a sub template resets the state to 0 + * + * @var int + */ + public $state = 0; + + /** + * Array of root child {block} objects + * + * @var Smarty_Internal_Block[] + */ + public $childRoot = array(); + + /** + * inheritance template nesting level + * + * @var int + */ + public $inheritanceLevel = 0; + + /** + * inheritance template index + * + * @var int + */ + public $tplIndex = -1; + + /** + * Array of template source objects + * + * @var Smarty_Template_Source[] + */ + public $sources = array(); + + /** + * Stack of source objects while executing block code + * + * @var Smarty_Template_Source[] + */ + public $sourceStack = array(); + + /** + * Initialize inheritance + * + * @param \Smarty_Internal_Template $tpl template object of caller + * @param bool $initChild if true init for child template + * @param array $blockNames outer level block name + */ + public function init(Smarty_Internal_Template $tpl, $initChild, $blockNames = array()) + { + // if called while executing parent template it must be a sub-template with new inheritance root + if ($initChild && $this->state === 3 && (strpos($tpl->template_resource, 'extendsall') === false)) { + $tpl->inheritance = new Smarty_Internal_Runtime_Inheritance(); + $tpl->inheritance->init($tpl, $initChild, $blockNames); + return; + } + ++$this->tplIndex; + $this->sources[ $this->tplIndex ] = $tpl->source; + // start of child sub template(s) + if ($initChild) { + $this->state = 1; + if (!$this->inheritanceLevel) { + //grab any output of child templates + ob_start(); + } + ++$this->inheritanceLevel; + // $tpl->startRenderCallbacks[ 'inheritance' ] = array($this, 'subTemplateStart'); + // $tpl->endRenderCallbacks[ 'inheritance' ] = array($this, 'subTemplateEnd'); + } + // if state was waiting for parent change state to parent + if ($this->state === 2) { + $this->state = 3; + } + } + + /** + * End of child template(s) + * - if outer level is reached flush output buffer and switch to wait for parent template state + * + * @param \Smarty_Internal_Template $tpl + * @param null|string $template optional name of inheritance parent template + * @param null|string $uid uid of inline template + * @param null|string $func function call name of inline template + * + * @throws \Exception + * @throws \SmartyException + */ + public function endChild(Smarty_Internal_Template $tpl, $template = null, $uid = null, $func = null) + { + --$this->inheritanceLevel; + if (!$this->inheritanceLevel) { + ob_end_clean(); + $this->state = 2; + } + if (isset($template) && (($tpl->parent->_isTplObj() && $tpl->parent->source->type !== 'extends') + || $tpl->smarty->extends_recursion) + ) { + $tpl->_subTemplateRender( + $template, + $tpl->cache_id, + $tpl->compile_id, + $tpl->caching ? 9999 : 0, + $tpl->cache_lifetime, + array(), + 2, + false, + $uid, + $func + ); + } + } + + /** + * Smarty_Internal_Block constructor. + * - if outer level {block} of child template ($state === 1) save it as child root block + * - otherwise process inheritance and render + * + * @param \Smarty_Internal_Template $tpl + * @param $className + * @param string $name + * @param int|null $tplIndex index of outer level {block} if nested + * + * @throws \SmartyException + */ + public function instanceBlock(Smarty_Internal_Template $tpl, $className, $name, $tplIndex = null) + { + $block = new $className($name, isset($tplIndex) ? $tplIndex : $this->tplIndex); + if (isset($this->childRoot[ $name ])) { + $block->child = $this->childRoot[ $name ]; + } + if ($this->state === 1) { + $this->childRoot[ $name ] = $block; + return; + } + // make sure we got child block of child template of current block + while ($block->child && $block->child->child && $block->tplIndex <= $block->child->tplIndex) { + $block->child = $block->child->child; + } + $this->process($tpl, $block); + } + + /** + * Goto child block or render this + * + * @param \Smarty_Internal_Template $tpl + * @param \Smarty_Internal_Block $block + * @param \Smarty_Internal_Block|null $parent + * + * @throws \SmartyException + */ + public function process( + Smarty_Internal_Template $tpl, + Smarty_Internal_Block $block, + Smarty_Internal_Block $parent = null + ) { + if ($block->hide && !isset($block->child)) { + return; + } + if (isset($block->child) && $block->child->hide && !isset($block->child->child)) { + $block->child = null; + } + $block->parent = $parent; + if ($block->append && !$block->prepend && isset($parent)) { + $this->callParent($tpl, $block, '\'{block append}\''); + } + if ($block->callsChild || !isset($block->child) || ($block->child->hide && !isset($block->child->child))) { + $this->callBlock($block, $tpl); + } else { + $this->process($tpl, $block->child, $block); + } + if ($block->prepend && isset($parent)) { + $this->callParent($tpl, $block, '{block prepend}'); + if ($block->append) { + if ($block->callsChild || !isset($block->child) + || ($block->child->hide && !isset($block->child->child)) + ) { + $this->callBlock($block, $tpl); + } else { + $this->process($tpl, $block->child, $block); + } + } + } + $block->parent = null; + } + + /** + * Render child on \$smarty.block.child + * + * @param \Smarty_Internal_Template $tpl + * @param \Smarty_Internal_Block $block + * + * @return null|string block content + * @throws \SmartyException + */ + public function callChild(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block) + { + if (isset($block->child)) { + $this->process($tpl, $block->child, $block); + } + } + + /** + * Render parent block on \$smarty.block.parent or {block append/prepend} + * + * @param \Smarty_Internal_Template $tpl + * @param \Smarty_Internal_Block $block + * @param string $tag + * + * @return null|string block content + * @throws \SmartyException + */ + public function callParent(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block, $tag) + { + if (isset($block->parent)) { + $this->callBlock($block->parent, $tpl); + } else { + throw new SmartyException("inheritance: illegal '{$tag}' used in child template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'"); + } + } + + /** + * render block + * + * @param \Smarty_Internal_Block $block + * @param \Smarty_Internal_Template $tpl + */ + public function callBlock(Smarty_Internal_Block $block, Smarty_Internal_Template $tpl) + { + $this->sourceStack[] = $tpl->source; + $tpl->source = $this->sources[ $block->tplIndex ]; + $block->callBlock($tpl); + $tpl->source = array_pop($this->sourceStack); + } +} diff --git a/sysplugins/smarty_internal_runtime_make_nocache.php b/sysplugins/smarty_internal_runtime_make_nocache.php new file mode 100644 index 0000000000000000000000000000000000000000..53069148ddda1bbb0cafb709936a402800d677c5 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_make_nocache.php @@ -0,0 +1,54 @@ +<?php + +/** + * {make_nocache} Runtime Methods save(), store() + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Runtime_Make_Nocache +{ + /** + * Save current variable value while rendering compiled template and inject nocache code to + * assign variable value in cahed template + * + * @param \Smarty_Internal_Template $tpl + * @param string $var variable name + * + * @throws \SmartyException + */ + public function save(Smarty_Internal_Template $tpl, $var) + { + if (isset($tpl->tpl_vars[ $var ])) { + $export = + preg_replace('/^Smarty_Variable::__set_state[(]|[)]$/', '', var_export($tpl->tpl_vars[ $var ], true)); + if (preg_match('/(\w+)::__set_state/', $export, $match)) { + throw new SmartyException("{make_nocache \${$var}} in template '{$tpl->source->name}': variable does contain object '{$match[1]}' not implementing method '__set_state'"); + } + echo "/*%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/<?php " . + addcslashes("\$_smarty_tpl->smarty->ext->_make_nocache->store(\$_smarty_tpl, '{$var}', ", '\\') . + $export . ");?>\n/*/%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/"; + } + } + + /** + * Store variable value saved while rendering compiled template in cached template context + * + * @param \Smarty_Internal_Template $tpl + * @param string $var variable name + * @param array $properties + */ + public function store(Smarty_Internal_Template $tpl, $var, $properties) + { + // do not overwrite existing nocache variables + if (!isset($tpl->tpl_vars[ $var ]) || !$tpl->tpl_vars[ $var ]->nocache) { + $newVar = new Smarty_Variable(); + unset($properties[ 'nocache' ]); + foreach ($properties as $k => $v) { + $newVar->$k = $v; + } + $tpl->tpl_vars[ $var ] = $newVar; + } + } +} diff --git a/sysplugins/smarty_internal_runtime_tplfunction.php b/sysplugins/smarty_internal_runtime_tplfunction.php new file mode 100644 index 0000000000000000000000000000000000000000..e5f8e48f7929e4e1dc4f228e8153f2893ad82441 --- /dev/null +++ b/sysplugins/smarty_internal_runtime_tplfunction.php @@ -0,0 +1,177 @@ +<?php + +/** + * TplFunction Runtime Methods callTemplateFunction + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + **/ +class Smarty_Internal_Runtime_TplFunction +{ + /** + * Call template function + * + * @param \Smarty_Internal_Template $tpl template object + * @param string $name template function name + * @param array $params parameter array + * @param bool $nocache true if called nocache + * + * @throws \SmartyException + */ + public function callTemplateFunction(Smarty_Internal_Template $tpl, $name, $params, $nocache) + { + $funcParam = isset($tpl->tplFunctions[ $name ]) ? $tpl->tplFunctions[ $name ] : + (isset($tpl->smarty->tplFunctions[ $name ]) ? $tpl->smarty->tplFunctions[ $name ] : null); + if (isset($funcParam)) { + if (!$tpl->caching || ($tpl->caching && $nocache)) { + $function = $funcParam[ 'call_name' ]; + } else { + if (isset($funcParam[ 'call_name_caching' ])) { + $function = $funcParam[ 'call_name_caching' ]; + } else { + $function = $funcParam[ 'call_name' ]; + } + } + if (function_exists($function)) { + $this->saveTemplateVariables($tpl, $name); + $function($tpl, $params); + $this->restoreTemplateVariables($tpl, $name); + return; + } + // try to load template function dynamically + if ($this->addTplFuncToCache($tpl, $name, $function)) { + $this->saveTemplateVariables($tpl, $name); + $function($tpl, $params); + $this->restoreTemplateVariables($tpl, $name); + return; + } + } + throw new SmartyException("Unable to find template function '{$name}'"); + } + + /** + * Register template functions defined by template + * + * @param \Smarty|\Smarty_Internal_Template|\Smarty_Internal_TemplateBase $obj + * @param array $tplFunctions source information array of + * template functions defined + * in template + * @param bool $override if true replace existing + * functions with same name + */ + public function registerTplFunctions(Smarty_Internal_TemplateBase $obj, $tplFunctions, $override = true) + { + $obj->tplFunctions = + $override ? array_merge($obj->tplFunctions, $tplFunctions) : array_merge($tplFunctions, $obj->tplFunctions); + // make sure that the template functions are known in parent templates + if ($obj->_isSubTpl()) { + $obj->smarty->ext->_tplFunction->registerTplFunctions($obj->parent, $tplFunctions, false); + } else { + $obj->smarty->tplFunctions = $override ? array_merge($obj->smarty->tplFunctions, $tplFunctions) : + array_merge($tplFunctions, $obj->smarty->tplFunctions); + } + } + + /** + * Return source parameter array for single or all template functions + * + * @param \Smarty_Internal_Template $tpl template object + * @param null|string $name template function name + * + * @return array|bool|mixed + */ + public function getTplFunction(Smarty_Internal_Template $tpl, $name = null) + { + if (isset($name)) { + return isset($tpl->tplFunctions[ $name ]) ? $tpl->tplFunctions[ $name ] : + (isset($tpl->smarty->tplFunctions[ $name ]) ? $tpl->smarty->tplFunctions[ $name ] : false); + } else { + return empty($tpl->tplFunctions) ? $tpl->smarty->tplFunctions : $tpl->tplFunctions; + } + } + + /** + * Add template function to cache file for nocache calls + * + * @param Smarty_Internal_Template $tpl + * @param string $_name template function name + * @param string $_function PHP function name + * + * @return bool + */ + public function addTplFuncToCache(Smarty_Internal_Template $tpl, $_name, $_function) + { + $funcParam = $tpl->tplFunctions[ $_name ]; + if (is_file($funcParam[ 'compiled_filepath' ])) { + // read compiled file + $code = file_get_contents($funcParam[ 'compiled_filepath' ]); + // grab template function + if (preg_match("/\/\* {$_function} \*\/([\S\s]*?)\/\*\/ {$_function} \*\//", $code, $match)) { + // grab source info from file dependency + preg_match("/\s*'{$funcParam['uid']}'([\S\s]*?)\),/", $code, $match1); + unset($code); + // make PHP function known + eval($match[ 0 ]); + if (function_exists($_function)) { + // search cache file template + $tplPtr = $tpl; + while (!isset($tplPtr->cached) && isset($tplPtr->parent)) { + $tplPtr = $tplPtr->parent; + } + // add template function code to cache file + if (isset($tplPtr->cached)) { + $content = $tplPtr->cached->read($tplPtr); + if ($content) { + // check if we must update file dependency + if (!preg_match("/'{$funcParam['uid']}'(.*?)'nocache_hash'/", $content, $match2)) { + $content = preg_replace("/('file_dependency'(.*?)\()/", "\\1{$match1[0]}", $content); + } + $tplPtr->smarty->ext->_updateCache->write( + $tplPtr, + preg_replace('/\s*\?>\s*$/', "\n", $content) . + "\n" . preg_replace( + array( + '/^\s*<\?php\s+/', + '/\s*\?>\s*$/', + ), + "\n", + $match[ 0 ] + ) + ); + } + } + return true; + } + } + } + return false; + } + + /** + * Save current template variables on stack + * + * @param \Smarty_Internal_Template $tpl + * @param string $name stack name + */ + public function saveTemplateVariables(Smarty_Internal_Template $tpl, $name) + { + $tpl->_cache[ 'varStack' ][] = + array('tpl' => $tpl->tpl_vars, 'config' => $tpl->config_vars, 'name' => "_tplFunction_{$name}"); + } + + /** + * Restore saved variables into template objects + * + * @param \Smarty_Internal_Template $tpl + * @param string $name stack name + */ + public function restoreTemplateVariables(Smarty_Internal_Template $tpl, $name) + { + if (isset($tpl->_cache[ 'varStack' ])) { + $vars = array_pop($tpl->_cache[ 'varStack' ]); + $tpl->tpl_vars = $vars[ 'tpl' ]; + $tpl->config_vars = $vars[ 'config' ]; + } + } +} diff --git a/sysplugins/smarty_internal_runtime_updatecache.php b/sysplugins/smarty_internal_runtime_updatecache.php new file mode 100644 index 0000000000000000000000000000000000000000..c1abbb321a0e2ee13dcaca52e2f1442ec7bd13ea --- /dev/null +++ b/sysplugins/smarty_internal_runtime_updatecache.php @@ -0,0 +1,183 @@ +<?php + +/** + * Inline Runtime Methods render, setSourceByUid, setupSubTemplate + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + **/ +class Smarty_Internal_Runtime_UpdateCache +{ + /** + * check client side cache + * + * @param \Smarty_Template_Cached $cached + * @param Smarty_Internal_Template $_template + * @param string $content + */ + public function cacheModifiedCheck(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content) + { + } + + /** + * Cache was invalid , so render from compiled and write to cache + * + * @param \Smarty_Template_Cached $cached + * @param \Smarty_Internal_Template $_template + * @param $no_output_filter + * + * @throws \Exception + */ + public function updateCache(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $no_output_filter) + { + ob_start(); + if (!isset($_template->compiled)) { + $_template->loadCompiled(); + } + $_template->compiled->render($_template); + if ($_template->smarty->debugging) { + $_template->smarty->_debug->start_cache($_template); + } + $this->removeNoCacheHash($cached, $_template, $no_output_filter); + $compile_check = (int)$_template->compile_check; + $_template->compile_check = Smarty::COMPILECHECK_OFF; + if ($_template->_isSubTpl()) { + $_template->compiled->unifunc = $_template->parent->compiled->unifunc; + } + if (!$_template->cached->processed) { + $_template->cached->process($_template, true); + } + $_template->compile_check = $compile_check; + $cached->getRenderedTemplateCode($_template); + if ($_template->smarty->debugging) { + $_template->smarty->_debug->end_cache($_template); + } + } + + /** + * Sanitize content and write it to cache resource + * + * @param \Smarty_Template_Cached $cached + * @param Smarty_Internal_Template $_template + * @param bool $no_output_filter + * + * @throws \SmartyException + */ + public function removeNoCacheHash( + Smarty_Template_Cached $cached, + Smarty_Internal_Template $_template, + $no_output_filter + ) { + $php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/'; + $content = ob_get_clean(); + $hash_array = $cached->hashes; + $hash_array[ $_template->compiled->nocache_hash ] = true; + $hash_array = array_keys($hash_array); + $nocache_hash = '(' . implode('|', $hash_array) . ')'; + $_template->cached->has_nocache_code = false; + // get text between non-cached items + $cache_split = + preg_split( + "!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s", + $content + ); + // get non-cached items + preg_match_all( + "!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s", + $content, + $cache_parts + ); + $content = ''; + // loop over items, stitch back together + foreach ($cache_split as $curr_idx => $curr_split) { + if (preg_match($php_pattern, $curr_split)) { + // escape PHP tags in template content + $php_split = preg_split( + $php_pattern, + $curr_split + ); + preg_match_all( + $php_pattern, + $curr_split, + $php_parts + ); + foreach ($php_split as $idx_php => $curr_php) { + $content .= $curr_php; + if (isset($php_parts[ 0 ][ $idx_php ])) { + $content .= "<?php echo '{$php_parts[ 1 ][ $idx_php ]}'; ?>\n"; + } + } + } else { + $content .= $curr_split; + } + if (isset($cache_parts[ 0 ][ $curr_idx ])) { + $_template->cached->has_nocache_code = true; + $content .= $cache_parts[ 2 ][ $curr_idx ]; + } + } + if (!$no_output_filter && !$_template->cached->has_nocache_code + && (isset($_template->smarty->autoload_filters[ 'output' ]) + || isset($_template->smarty->registered_filters[ 'output' ])) + ) { + $content = $_template->smarty->ext->_filterHandler->runFilter('output', $content, $_template); + } + // write cache file content + $this->writeCachedContent($_template, $content); + } + + /** + * Writes the content to cache resource + * + * @param Smarty_Internal_Template $_template + * @param string $content + * + * @return bool + */ + public function writeCachedContent(Smarty_Internal_Template $_template, $content) + { + if ($_template->source->handler->recompiled || !$_template->caching + ) { + // don't write cache file + return false; + } + if (!isset($_template->cached)) { + $_template->loadCached(); + } + $content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true); + return $this->write($_template, $content); + } + + /** + * Write this cache object to handler + * + * @param Smarty_Internal_Template $_template template object + * @param string $content content to cache + * + * @return bool success + */ + public function write(Smarty_Internal_Template $_template, $content) + { + if (!$_template->source->handler->recompiled) { + $cached = $_template->cached; + if ($cached->handler->writeCachedContent($_template, $content)) { + $cached->content = null; + $cached->timestamp = time(); + $cached->exists = true; + $cached->valid = true; + $cached->cache_lifetime = $_template->cache_lifetime; + $cached->processed = false; + if ($_template->smarty->cache_locking) { + $cached->handler->releaseLock($_template->smarty, $cached); + } + return true; + } + $cached->content = null; + $cached->timestamp = false; + $cached->exists = false; + $cached->valid = false; + $cached->processed = false; + } + return false; + } +} diff --git a/sysplugins/smarty_internal_runtime_updatescope.php b/sysplugins/smarty_internal_runtime_updatescope.php new file mode 100644 index 0000000000000000000000000000000000000000..2240f97cac0efa6880c9ee60a3e6d7ed171288fd --- /dev/null +++ b/sysplugins/smarty_internal_runtime_updatescope.php @@ -0,0 +1,115 @@ +<?php + +/** + * Runtime Extension updateScope + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + **/ +class Smarty_Internal_Runtime_UpdateScope +{ + /** + * Update new assigned template or config variable in other effected scopes + * + * @param Smarty_Internal_Template $tpl data object + * @param string|null $varName variable name + * @param int $tagScope tag scope to which bubble up variable value + */ + public function _updateScope(Smarty_Internal_Template $tpl, $varName, $tagScope = 0) + { + if ($tagScope) { + $this->_updateVarStack($tpl, $varName); + $tagScope = $tagScope & ~Smarty::SCOPE_LOCAL; + if (!$tpl->scope && !$tagScope) { + return; + } + } + $mergedScope = $tagScope | $tpl->scope; + if ($mergedScope) { + if ($mergedScope & Smarty::SCOPE_GLOBAL && $varName) { + Smarty::$global_tpl_vars[ $varName ] = $tpl->tpl_vars[ $varName ]; + } + // update scopes + foreach ($this->_getAffectedScopes($tpl, $mergedScope) as $ptr) { + $this->_updateVariableInOtherScope($ptr->tpl_vars, $tpl, $varName); + if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) { + $this->_updateVarStack($ptr, $varName); + } + } + } + } + + /** + * Get array of objects which needs to be updated by given scope value + * + * @param Smarty_Internal_Template $tpl + * @param int $mergedScope merged tag and template scope to which bubble up variable value + * + * @return array + */ + public function _getAffectedScopes(Smarty_Internal_Template $tpl, $mergedScope) + { + $_stack = array(); + $ptr = $tpl->parent; + if ($mergedScope && isset($ptr) && $ptr->_isTplObj()) { + $_stack[] = $ptr; + $mergedScope = $mergedScope & ~Smarty::SCOPE_PARENT; + if (!$mergedScope) { + // only parent was set, we are done + return $_stack; + } + $ptr = $ptr->parent; + } + while (isset($ptr) && $ptr->_isTplObj()) { + $_stack[] = $ptr; + $ptr = $ptr->parent; + } + if ($mergedScope & Smarty::SCOPE_SMARTY) { + if (isset($tpl->smarty)) { + $_stack[] = $tpl->smarty; + } + } elseif ($mergedScope & Smarty::SCOPE_ROOT) { + while (isset($ptr)) { + if (!$ptr->_isTplObj()) { + $_stack[] = $ptr; + break; + } + $ptr = $ptr->parent; + } + } + return $_stack; + } + + /** + * Update variable in other scope + * + * @param array $tpl_vars template variable array + * @param \Smarty_Internal_Template $from + * @param string $varName variable name + */ + public function _updateVariableInOtherScope(&$tpl_vars, Smarty_Internal_Template $from, $varName) + { + if (!isset($tpl_vars[ $varName ])) { + $tpl_vars[ $varName ] = clone $from->tpl_vars[ $varName ]; + } else { + $tpl_vars[ $varName ] = clone $tpl_vars[ $varName ]; + $tpl_vars[ $varName ]->value = $from->tpl_vars[ $varName ]->value; + } + } + + /** + * Update variable in template local variable stack + * + * @param \Smarty_Internal_Template $tpl + * @param string|null $varName variable name or null for config variables + */ + public function _updateVarStack(Smarty_Internal_Template $tpl, $varName) + { + $i = 0; + while (isset($tpl->_cache[ 'varStack' ][ $i ])) { + $this->_updateVariableInOtherScope($tpl->_cache[ 'varStack' ][ $i ][ 'tpl' ], $tpl, $varName); + $i++; + } + } +} diff --git a/sysplugins/smarty_internal_runtime_writefile.php b/sysplugins/smarty_internal_runtime_writefile.php new file mode 100644 index 0000000000000000000000000000000000000000..4383e6f38f427cf17202fa76e84f52f7c8f0036a --- /dev/null +++ b/sysplugins/smarty_internal_runtime_writefile.php @@ -0,0 +1,100 @@ +<?php +/** + * Smarty write file plugin + * + * @package Smarty + * @subpackage PluginsInternal + * @author Monte Ohrt + */ + +/** + * Smarty Internal Write File Class + * + * @package Smarty + * @subpackage PluginsInternal + */ +class Smarty_Internal_Runtime_WriteFile +{ + /** + * Writes file in a safe way to disk + * + * @param string $_filepath complete filepath + * @param string $_contents file content + * @param Smarty $smarty smarty instance + * + * @throws SmartyException + * @return boolean true + */ + public function writeFile($_filepath, $_contents, Smarty $smarty) + { + $_error_reporting = error_reporting(); + error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING); + $_file_perms = property_exists($smarty, '_file_perms') ? $smarty->_file_perms : 0644; + $_dir_perms = + property_exists($smarty, '_dir_perms') ? (isset($smarty->_dir_perms) ? $smarty->_dir_perms : 0777) : 0771; + if ($_file_perms !== null) { + $old_umask = umask(0); + } + $_dirpath = dirname($_filepath); + // if subdirs, create dir structure + if ($_dirpath !== '.') { + $i = 0; + // loop if concurrency problem occurs + // see https://bugs.php.net/bug.php?id=35326 + while (!is_dir($_dirpath)) { + if (@mkdir($_dirpath, $_dir_perms, true)) { + break; + } + clearstatcache(); + if (++$i === 3) { + error_reporting($_error_reporting); + throw new SmartyException("unable to create directory {$_dirpath}"); + } + sleep(1); + } + } + // write to tmp file, then move to overt file lock race condition + $_tmp_file = $_dirpath . DIRECTORY_SEPARATOR . str_replace(array('.', ','), '_', uniqid('wrt', true)); + if (!file_put_contents($_tmp_file, $_contents)) { + error_reporting($_error_reporting); + throw new SmartyException("unable to write file {$_tmp_file}"); + } + /* + * Windows' rename() fails if the destination exists, + * Linux' rename() properly handles the overwrite. + * Simply unlink()ing a file might cause other processes + * currently reading that file to fail, but linux' rename() + * seems to be smart enough to handle that for us. + */ + if (Smarty::$_IS_WINDOWS) { + // remove original file + if (is_file($_filepath)) { + @unlink($_filepath); + } + // rename tmp file + $success = @rename($_tmp_file, $_filepath); + } else { + // rename tmp file + $success = @rename($_tmp_file, $_filepath); + if (!$success) { + // remove original file + if (is_file($_filepath)) { + @unlink($_filepath); + } + // rename tmp file + $success = @rename($_tmp_file, $_filepath); + } + } + if (!$success) { + error_reporting($_error_reporting); + throw new SmartyException("unable to write file {$_filepath}"); + } + if ($_file_perms !== null) { + // set file permissions + chmod($_filepath, $_file_perms); + umask($old_umask); + } + error_reporting($_error_reporting); + return true; + } +} diff --git a/sysplugins/smarty_internal_smartytemplatecompiler.php b/sysplugins/smarty_internal_smartytemplatecompiler.php new file mode 100644 index 0000000000000000000000000000000000000000..21f4e3fddcee8d6913ae7ce9ea13a1eb46442509 --- /dev/null +++ b/sysplugins/smarty_internal_smartytemplatecompiler.php @@ -0,0 +1,184 @@ +<?php +/** + * Smarty Internal Plugin Smarty Template Compiler Base + * This file contains the basic classes and methods for compiling Smarty templates with lexer/parser + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Class SmartyTemplateCompiler + * + * @package Smarty + * @subpackage Compiler + */ +class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCompilerBase +{ + /** + * Lexer class name + * + * @var string + */ + public $lexer_class; + + /** + * Parser class name + * + * @var string + */ + public $parser_class; + + /** + * array of vars which can be compiled in local scope + * + * @var array + */ + public $local_var = array(); + + /** + * array of callbacks called when the normal compile process of template is finished + * + * @var array + */ + public $postCompileCallbacks = array(); + + /** + * prefix code + * + * @var string + */ + public $prefixCompiledCode = ''; + + /** + * postfix code + * + * @var string + */ + public $postfixCompiledCode = ''; + + /** + * Initialize compiler + * + * @param string $lexer_class class name + * @param string $parser_class class name + * @param Smarty $smarty global instance + */ + public function __construct($lexer_class, $parser_class, Smarty $smarty) + { + parent::__construct($smarty); + // get required plugins + $this->lexer_class = $lexer_class; + $this->parser_class = $parser_class; + } + + /** + * method to compile a Smarty template + * + * @param mixed $_content template source + * @param bool $isTemplateSource + * + * @return bool true if compiling succeeded, false if it failed + * @throws \SmartyCompilerException + */ + protected function doCompile($_content, $isTemplateSource = false) + { + /* here is where the compiling takes place. Smarty + tags in the templates are replaces with PHP code, + then written to compiled files. */ + // init the lexer/parser to compile the template + $this->parser = + new $this->parser_class( + new $this->lexer_class( + str_replace( + array( + "\r\n", + "\r" + ), + "\n", + $_content + ), + $this + ), + $this + ); + if ($isTemplateSource && $this->template->caching) { + $this->parser->insertPhpCode("<?php\n\$_smarty_tpl->compiled->nocache_hash = '{$this->nocache_hash}';\n?>\n"); + } + if (function_exists('mb_internal_encoding') + && function_exists('ini_get') + && ((int)ini_get('mbstring.func_overload')) & 2 + ) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } else { + $mbEncoding = null; + } + if ($this->smarty->_parserdebug) { + $this->parser->PrintTrace(); + $this->parser->lex->PrintTrace(); + } + // get tokens from lexer and parse them + while ($this->parser->lex->yylex()) { + if ($this->smarty->_parserdebug) { + echo "<pre>Line {$this->parser->lex->line} Parsing {$this->parser->yyTokenName[$this->parser->lex->token]} Token " . + htmlentities($this->parser->lex->value) . "</pre>"; + } + $this->parser->doParse($this->parser->lex->token, $this->parser->lex->value); + } + // finish parsing process + $this->parser->doParse(0, 0); + if ($mbEncoding) { + mb_internal_encoding($mbEncoding); + } + // check for unclosed tags + if (count($this->_tag_stack) > 0) { + // get stacked info + list($openTag, $_data) = array_pop($this->_tag_stack); + $this->trigger_template_error( + "unclosed {$this->smarty->left_delimiter}" . $openTag . + "{$this->smarty->right_delimiter} tag" + ); + } + // call post compile callbacks + foreach ($this->postCompileCallbacks as $cb) { + $parameter = $cb; + $parameter[ 0 ] = $this; + call_user_func_array($cb[ 0 ], $parameter); + } + // return compiled code + return $this->prefixCompiledCode . $this->parser->retvalue . $this->postfixCompiledCode; + } + + /** + * Register a post compile callback + * - when the callback is called after template compiling the compiler object will be inserted as first parameter + * + * @param callback $callback + * @param array $parameter optional parameter array + * @param string $key optional key for callback + * @param bool $replace if true replace existing keyed callback + */ + public function registerPostCompileCallback($callback, $parameter = array(), $key = null, $replace = false) + { + array_unshift($parameter, $callback); + if (isset($key)) { + if ($replace || !isset($this->postCompileCallbacks[ $key ])) { + $this->postCompileCallbacks[ $key ] = $parameter; + } + } else { + $this->postCompileCallbacks[] = $parameter; + } + } + + /** + * Remove a post compile callback + * + * @param string $key callback key + */ + public function unregisterPostCompileCallback($key) + { + unset($this->postCompileCallbacks[ $key ]); + } +} diff --git a/sysplugins/smarty_internal_template.php b/sysplugins/smarty_internal_template.php new file mode 100644 index 0000000000000000000000000000000000000000..bae22a7d58676393dc72829672a6ced04f951bc3 --- /dev/null +++ b/sysplugins/smarty_internal_template.php @@ -0,0 +1,740 @@ +<?php +/** + * Smarty Internal Plugin Template + * This file contains the Smarty template engine + * + * @package Smarty + * @subpackage Template + * @author Uwe Tews + */ + +/** + * Main class with template data structures and methods + * + * @package Smarty + * @subpackage Template + * + * @property Smarty_Template_Compiled $compiled + * @property Smarty_Template_Cached $cached + * @property Smarty_Internal_TemplateCompilerBase $compiler + * @property mixed|\Smarty_Template_Cached registered_plugins + * + * The following methods will be dynamically loaded by the extension handler when they are called. + * They are located in a corresponding Smarty_Internal_Method_xxxx class + * + * @method bool mustCompile() + */ +class Smarty_Internal_Template extends Smarty_Internal_TemplateBase +{ + /** + * Template object cache + * + * @var Smarty_Internal_Template[] + */ + public static $tplObjCache = array(); + + /** + * Template object cache for Smarty::isCached() === true + * + * @var Smarty_Internal_Template[] + */ + public static $isCacheTplObj = array(); + + /** + * Sub template Info Cache + * - index name + * - value use count + * + * @var int[] + */ + public static $subTplInfo = array(); + + /** + * This object type (Smarty = 1, template = 2, data = 4) + * + * @var int + */ + public $_objType = 2; + + /** + * Global smarty instance + * + * @var Smarty + */ + public $smarty = null; + + /** + * Source instance + * + * @var Smarty_Template_Source|Smarty_Template_Config + */ + public $source = null; + + /** + * Inheritance runtime extension + * + * @var Smarty_Internal_Runtime_Inheritance + */ + public $inheritance = null; + + /** + * Template resource + * + * @var string + */ + public $template_resource = null; + + /** + * flag if compiled template is invalid and must be (re)compiled + * + * @var bool + */ + public $mustCompile = null; + + /** + * Template Id + * + * @var null|string + */ + public $templateId = null; + + /** + * Scope in which variables shall be assigned + * + * @var int + */ + public $scope = 0; + + /** + * Flag which is set while rending a cache file + * + * @var bool + */ + public $isRenderingCache = false; + + /** + * Callbacks called before rendering template + * + * @var callback[] + */ + public $startRenderCallbacks = array(); + + /** + * Callbacks called after rendering template + * + * @var callback[] + */ + public $endRenderCallbacks = array(); + + /** + * Create template data object + * Some of the global Smarty settings copied to template scope + * It load the required template resources and caching plugins + * + * @param string $template_resource template resource string + * @param Smarty $smarty Smarty instance + * @param null|\Smarty_Internal_Template|\Smarty|\Smarty_Internal_Data $_parent back pointer to parent + * object with variables or + * null + * @param mixed $_cache_id cache id or null + * @param mixed $_compile_id compile id or null + * @param bool|int|null $_caching use caching? + * @param int|null $_cache_lifetime cache life-time in + * seconds + * @param bool $_isConfig + * + * @throws \SmartyException + */ + public function __construct( + $template_resource, + Smarty $smarty, + Smarty_Internal_Data $_parent = null, + $_cache_id = null, + $_compile_id = null, + $_caching = null, + $_cache_lifetime = null, + $_isConfig = false + ) { + $this->smarty = $smarty; + // Smarty parameter + $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id; + $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id; + $this->caching = (int)($_caching === null ? $this->smarty->caching : $_caching); + $this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime; + $this->compile_check = (int)$smarty->compile_check; + $this->parent = $_parent; + // Template resource + $this->template_resource = $template_resource; + $this->source = $_isConfig ? Smarty_Template_Config::load($this) : Smarty_Template_Source::load($this); + parent::__construct(); + if ($smarty->security_policy && method_exists($smarty->security_policy, 'registerCallBacks')) { + $smarty->security_policy->registerCallBacks($this); + } + } + + /** + * render template + * + * @param bool $no_output_filter if true do not run output filter + * @param null|bool $display true: display, false: fetch null: sub-template + * + * @return string + * @throws \Exception + * @throws \SmartyException + */ + public function render($no_output_filter = true, $display = null) + { + if ($this->smarty->debugging) { + if (!isset($this->smarty->_debug)) { + $this->smarty->_debug = new Smarty_Internal_Debug(); + } + $this->smarty->_debug->start_template($this, $display); + } + // checks if template exists + if (!$this->source->exists) { + throw new SmartyException( + "Unable to load template '{$this->source->type}:{$this->source->name}'" . + ($this->_isSubTpl() ? " in '{$this->parent->template_resource}'" : '') + ); + } + // disable caching for evaluated code + if ($this->source->handler->recompiled) { + $this->caching = Smarty::CACHING_OFF; + } + // read from cache or render + if ($this->caching === Smarty::CACHING_LIFETIME_CURRENT || $this->caching === Smarty::CACHING_LIFETIME_SAVED) { + if (!isset($this->cached) || $this->cached->cache_id !== $this->cache_id + || $this->cached->compile_id !== $this->compile_id + ) { + $this->loadCached(true); + } + $this->cached->render($this, $no_output_filter); + } else { + if (!isset($this->compiled) || $this->compiled->compile_id !== $this->compile_id) { + $this->loadCompiled(true); + } + $this->compiled->render($this); + } + // display or fetch + if ($display) { + if ($this->caching && $this->smarty->cache_modified_check) { + $this->smarty->ext->_cacheModify->cacheModifiedCheck( + $this->cached, + $this, + isset($content) ? $content : ob_get_clean() + ); + } else { + if ((!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) + && !$no_output_filter && (isset($this->smarty->autoload_filters[ 'output' ]) + || isset($this->smarty->registered_filters[ 'output' ])) + ) { + echo $this->smarty->ext->_filterHandler->runFilter('output', ob_get_clean(), $this); + } else { + echo ob_get_clean(); + } + } + if ($this->smarty->debugging) { + $this->smarty->_debug->end_template($this); + // debug output + $this->smarty->_debug->display_debug($this, true); + } + return ''; + } else { + if ($this->smarty->debugging) { + $this->smarty->_debug->end_template($this); + if ($this->smarty->debugging === 2 && $display === false) { + $this->smarty->_debug->display_debug($this, true); + } + } + if (!$no_output_filter + && (!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) + && (isset($this->smarty->autoload_filters[ 'output' ]) + || isset($this->smarty->registered_filters[ 'output' ])) + ) { + return $this->smarty->ext->_filterHandler->runFilter('output', ob_get_clean(), $this); + } + // return cache content + return null; + } + } + + /** + * Runtime function to render sub-template + * + * @param string $template template name + * @param mixed $cache_id cache id + * @param mixed $compile_id compile id + * @param integer $caching cache mode + * @param integer $cache_lifetime life time of cache data + * @param array $data passed parameter template variables + * @param int $scope scope in which {include} should execute + * @param bool $forceTplCache cache template object + * @param string $uid file dependency uid + * @param string $content_func function name + * + * @throws \Exception + * @throws \SmartyException + */ + public function _subTemplateRender( + $template, + $cache_id, + $compile_id, + $caching, + $cache_lifetime, + $data, + $scope, + $forceTplCache, + $uid = null, + $content_func = null + ) { + $tpl = clone $this; + $tpl->parent = $this; + $smarty = &$this->smarty; + $_templateId = $smarty->_getTemplateId($template, $cache_id, $compile_id, $caching, $tpl); + // recursive call ? + if (isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId() !== $_templateId) { + // already in template cache? + if (isset(self::$tplObjCache[ $_templateId ])) { + // copy data from cached object + $cachedTpl = &self::$tplObjCache[ $_templateId ]; + $tpl->templateId = $cachedTpl->templateId; + $tpl->template_resource = $cachedTpl->template_resource; + $tpl->cache_id = $cachedTpl->cache_id; + $tpl->compile_id = $cachedTpl->compile_id; + $tpl->source = $cachedTpl->source; + if (isset($cachedTpl->compiled)) { + $tpl->compiled = $cachedTpl->compiled; + } else { + unset($tpl->compiled); + } + if ($caching !== 9999 && isset($cachedTpl->cached)) { + $tpl->cached = $cachedTpl->cached; + } else { + unset($tpl->cached); + } + } else { + $tpl->templateId = $_templateId; + $tpl->template_resource = $template; + $tpl->cache_id = $cache_id; + $tpl->compile_id = $compile_id; + if (isset($uid)) { + // for inline templates we can get all resource information from file dependency + list($filepath, $timestamp, $type) = $tpl->compiled->file_dependency[ $uid ]; + $tpl->source = new Smarty_Template_Source($smarty, $filepath, $type, $filepath); + $tpl->source->filepath = $filepath; + $tpl->source->timestamp = $timestamp; + $tpl->source->exists = true; + $tpl->source->uid = $uid; + } else { + $tpl->source = Smarty_Template_Source::load($tpl); + unset($tpl->compiled); + } + if ($caching !== 9999) { + unset($tpl->cached); + } + } + } else { + // on recursive calls force caching + $forceTplCache = true; + } + $tpl->caching = $caching; + $tpl->cache_lifetime = $cache_lifetime; + // set template scope + $tpl->scope = $scope; + if (!isset(self::$tplObjCache[ $tpl->templateId ]) && !$tpl->source->handler->recompiled) { + // check if template object should be cached + if ($forceTplCache || (isset(self::$subTplInfo[ $tpl->template_resource ]) + && self::$subTplInfo[ $tpl->template_resource ] > 1) + || ($tpl->_isSubTpl() && isset(self::$tplObjCache[ $tpl->parent->templateId ])) + ) { + self::$tplObjCache[ $tpl->templateId ] = $tpl; + } + } + if (!empty($data)) { + // set up variable values + foreach ($data as $_key => $_val) { + $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val, $this->isRenderingCache); + } + } + if ($tpl->caching === 9999) { + if (!isset($tpl->compiled)) { + $this->loadCompiled(true); + } + if ($tpl->compiled->has_nocache_code) { + $this->cached->hashes[ $tpl->compiled->nocache_hash ] = true; + } + } + $tpl->_cache = array(); + if (isset($uid)) { + if ($smarty->debugging) { + if (!isset($smarty->_debug)) { + $smarty->_debug = new Smarty_Internal_Debug(); + } + $smarty->_debug->start_template($tpl); + $smarty->_debug->start_render($tpl); + } + $tpl->compiled->getRenderedTemplateCode($tpl, $content_func); + if ($smarty->debugging) { + $smarty->_debug->end_template($tpl); + $smarty->_debug->end_render($tpl); + } + } else { + if (isset($tpl->compiled)) { + $tpl->compiled->render($tpl); + } else { + $tpl->render(); + } + } + } + + /** + * Get called sub-templates and save call count + */ + public function _subTemplateRegister() + { + foreach ($this->compiled->includes as $name => $count) { + if (isset(self::$subTplInfo[ $name ])) { + self::$subTplInfo[ $name ] += $count; + } else { + self::$subTplInfo[ $name ] = $count; + } + } + } + + /** + * Check if this is a sub template + * + * @return bool true is sub template + */ + public function _isSubTpl() + { + return isset($this->parent) && $this->parent->_isTplObj(); + } + + /** + * Assign variable in scope + * + * @param string $varName variable name + * @param mixed $value value + * @param bool $nocache nocache flag + * @param int $scope scope into which variable shall be assigned + */ + public function _assignInScope($varName, $value, $nocache = false, $scope = 0) + { + if (isset($this->tpl_vars[ $varName ])) { + $this->tpl_vars[ $varName ] = clone $this->tpl_vars[ $varName ]; + $this->tpl_vars[ $varName ]->value = $value; + if ($nocache || $this->isRenderingCache) { + $this->tpl_vars[ $varName ]->nocache = true; + } + } else { + $this->tpl_vars[ $varName ] = new Smarty_Variable($value, $nocache || $this->isRenderingCache); + } + if ($scope >= 0) { + if ($scope > 0 || $this->scope > 0) { + $this->smarty->ext->_updateScope->_updateScope($this, $varName, $scope); + } + } + } + + /** + * Check if plugins are callable require file otherwise + * + * @param array $plugins required plugins + * + * @throws \SmartyException + */ + public function _checkPlugins($plugins) + { + static $checked = array(); + foreach ($plugins as $plugin) { + $name = join('::', (array)$plugin[ 'function' ]); + if (!isset($checked[ $name ])) { + if (!is_callable($plugin[ 'function' ])) { + if (is_file($plugin[ 'file' ])) { + include_once $plugin[ 'file' ]; + if (is_callable($plugin[ 'function' ])) { + $checked[ $name ] = true; + } + } + } else { + $checked[ $name ] = true; + } + } + if (!isset($checked[ $name ])) { + if (false !== $this->smarty->loadPlugin($name)) { + $checked[ $name ] = true; + } else { + throw new SmartyException("Plugin '{$name}' not callable"); + } + } + } + } + + /** + * This function is executed automatically when a compiled or cached template file is included + * - Decode saved properties from compiled template and cache files + * - Check if compiled or cache file is valid + * + * @param \Smarty_Internal_Template $tpl + * @param array $properties special template properties + * @param bool $cache flag if called from cache file + * + * @return bool flag if compiled or cache file is valid + * @throws \SmartyException + */ + public function _decodeProperties(Smarty_Internal_Template $tpl, $properties, $cache = false) + { + // on cache resources other than file check version stored in cache code + if (!isset($properties[ 'version' ]) || Smarty::SMARTY_VERSION !== $properties[ 'version' ]) { + if ($cache) { + $tpl->smarty->clearAllCache(); + } else { + $tpl->smarty->clearCompiledTemplate(); + } + return false; + } + $is_valid = true; + if (!empty($properties[ 'file_dependency' ]) + && ((!$cache && $tpl->compile_check) || $tpl->compile_check === Smarty::COMPILECHECK_ON) + ) { + // check file dependencies at compiled code + foreach ($properties[ 'file_dependency' ] as $_file_to_check) { + if ($_file_to_check[ 2 ] === 'file' || $_file_to_check[ 2 ] === 'php') { + if ($tpl->source->filepath === $_file_to_check[ 0 ]) { + // do not recheck current template + continue; + //$mtime = $tpl->source->getTimeStamp(); + } else { + // file and php types can be checked without loading the respective resource handlers + $mtime = is_file($_file_to_check[ 0 ]) ? filemtime($_file_to_check[ 0 ]) : false; + } + } else { + $handler = Smarty_Resource::load($tpl->smarty, $_file_to_check[ 2 ]); + if ($handler->checkTimestamps()) { + $source = Smarty_Template_Source::load($tpl, $tpl->smarty, $_file_to_check[ 0 ]); + $mtime = $source->getTimeStamp(); + } else { + continue; + } + } + if ($mtime === false || $mtime > $_file_to_check[ 1 ]) { + $is_valid = false; + break; + } + } + } + if ($cache) { + // CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc + if ($tpl->caching === Smarty::CACHING_LIFETIME_SAVED && $properties[ 'cache_lifetime' ] >= 0 + && (time() > ($tpl->cached->timestamp + $properties[ 'cache_lifetime' ])) + ) { + $is_valid = false; + } + $tpl->cached->cache_lifetime = $properties[ 'cache_lifetime' ]; + $tpl->cached->valid = $is_valid; + $resource = $tpl->cached; + } else { + $tpl->mustCompile = !$is_valid; + $resource = $tpl->compiled; + $resource->includes = isset($properties[ 'includes' ]) ? $properties[ 'includes' ] : array(); + } + if ($is_valid) { + $resource->unifunc = $properties[ 'unifunc' ]; + $resource->has_nocache_code = $properties[ 'has_nocache_code' ]; + // $tpl->compiled->nocache_hash = $properties['nocache_hash']; + $resource->file_dependency = $properties[ 'file_dependency' ]; + } + return $is_valid && !function_exists($properties[ 'unifunc' ]); + } + + /** + * Compiles the template + * If the template is not evaluated the compiled template is saved on disk + * + * @throws \Exception + */ + public function compileTemplateSource() + { + return $this->compiled->compileTemplateSource($this); + } + + /** + * Writes the content to cache resource + * + * @param string $content + * + * @return bool + */ + public function writeCachedContent($content) + { + return $this->smarty->ext->_updateCache->writeCachedContent($this, $content); + } + + /** + * Get unique template id + * + * @return string + * @throws \SmartyException + */ + public function _getTemplateId() + { + return isset($this->templateId) ? $this->templateId : $this->templateId = + $this->smarty->_getTemplateId($this->template_resource, $this->cache_id, $this->compile_id); + } + + /** + * runtime error not matching capture tags + * + * @throws \SmartyException + */ + public function capture_error() + { + throw new SmartyException("Not matching {capture} open/close in '{$this->template_resource}'"); + } + + /** + * Load compiled object + * + * @param bool $force force new compiled object + */ + public function loadCompiled($force = false) + { + if ($force || !isset($this->compiled)) { + $this->compiled = Smarty_Template_Compiled::load($this); + } + } + + /** + * Load cached object + * + * @param bool $force force new cached object + */ + public function loadCached($force = false) + { + if ($force || !isset($this->cached)) { + $this->cached = Smarty_Template_Cached::load($this); + } + } + + /** + * Load inheritance object + */ + public function _loadInheritance() + { + if (!isset($this->inheritance)) { + $this->inheritance = new Smarty_Internal_Runtime_Inheritance(); + } + } + + /** + * Unload inheritance object + */ + public function _cleanUp() + { + $this->startRenderCallbacks = array(); + $this->endRenderCallbacks = array(); + $this->inheritance = null; + } + + /** + * Load compiler object + * + * @throws \SmartyException + */ + public function loadCompiler() + { + if (!class_exists($this->source->compiler_class)) { + $this->smarty->loadPlugin($this->source->compiler_class); + } + $this->compiler = + new $this->source->compiler_class( + $this->source->template_lexer_class, + $this->source->template_parser_class, + $this->smarty + ); + } + + /** + * Handle unknown class methods + * + * @param string $name unknown method-name + * @param array $args argument array + * + * @return mixed + */ + public function __call($name, $args) + { + // method of Smarty object? + if (method_exists($this->smarty, $name)) { + return call_user_func_array(array($this->smarty, $name), $args); + } + // parent + return parent::__call($name, $args); + } + + /** + * get Smarty property in template context + * + * @param string $property_name property name + * + * @return mixed|Smarty_Template_Cached + * @throws SmartyException + */ + public function __get($property_name) + { + switch ($property_name) { + case 'compiled': + $this->loadCompiled(); + return $this->compiled; + case 'cached': + $this->loadCached(); + return $this->cached; + case 'compiler': + $this->loadCompiler(); + return $this->compiler; + default: + // Smarty property ? + if (property_exists($this->smarty, $property_name)) { + return $this->smarty->$property_name; + } + } + throw new SmartyException("template property '$property_name' does not exist."); + } + + /** + * set Smarty property in template context + * + * @param string $property_name property name + * @param mixed $value value + * + * @throws SmartyException + */ + public function __set($property_name, $value) + { + switch ($property_name) { + case 'compiled': + case 'cached': + case 'compiler': + $this->$property_name = $value; + return; + default: + // Smarty property ? + if (property_exists($this->smarty, $property_name)) { + $this->smarty->$property_name = $value; + return; + } + } + throw new SmartyException("invalid template property '$property_name'."); + } + + /** + * Template data object destructor + */ + public function __destruct() + { + if ($this->smarty->cache_locking && isset($this->cached) && $this->cached->is_locked) { + $this->cached->handler->releaseLock($this->smarty, $this->cached); + } + } +} diff --git a/sysplugins/smarty_internal_templatebase.php b/sysplugins/smarty_internal_templatebase.php new file mode 100644 index 0000000000000000000000000000000000000000..200c11bb5f53acf245cc37117ad12ffb2c1da101 --- /dev/null +++ b/sysplugins/smarty_internal_templatebase.php @@ -0,0 +1,386 @@ +<?php +/** + * Smarty Internal Plugin Smarty Template Base + * This file contains the basic shared methods for template handling + * + * @package Smarty + * @subpackage Template + * @author Uwe Tews + */ + +/** + * Class with shared smarty/template methods + * + * @package Smarty + * @subpackage Template + * + * @property int $_objType + * + * The following methods will be dynamically loaded by the extension handler when they are called. + * They are located in a corresponding Smarty_Internal_Method_xxxx class + * + * @method Smarty_Internal_TemplateBase addAutoloadFilters(mixed $filters, string $type = null) + * @method Smarty_Internal_TemplateBase addDefaultModifiers(mixed $modifiers) + * @method Smarty_Internal_TemplateBase addLiterals(mixed $literals) + * @method Smarty_Internal_TemplateBase createData(Smarty_Internal_Data $parent = null, string $name = null) + * @method array getAutoloadFilters(string $type = null) + * @method string getDebugTemplate() + * @method array getDefaultModifier() + * @method array getLiterals() + * @method array getTags(mixed $template = null) + * @method object getRegisteredObject(string $object_name) + * @method Smarty_Internal_TemplateBase registerCacheResource(string $name, Smarty_CacheResource $resource_handler) + * @method Smarty_Internal_TemplateBase registerClass(string $class_name, string $class_impl) + * @method Smarty_Internal_TemplateBase registerDefaultConfigHandler(callback $callback) + * @method Smarty_Internal_TemplateBase registerDefaultPluginHandler(callback $callback) + * @method Smarty_Internal_TemplateBase registerDefaultTemplateHandler(callback $callback) + * @method Smarty_Internal_TemplateBase registerResource(string $name, mixed $resource_handler) + * @method Smarty_Internal_TemplateBase setAutoloadFilters(mixed $filters, string $type = null) + * @method Smarty_Internal_TemplateBase setDebugTemplate(string $tpl_name) + * @method Smarty_Internal_TemplateBase setDefaultModifiers(mixed $modifiers) + * @method Smarty_Internal_TemplateBase setLiterals(mixed $literals) + * @method Smarty_Internal_TemplateBase unloadFilter(string $type, string $name) + * @method Smarty_Internal_TemplateBase unregisterCacheResource(string $name) + * @method Smarty_Internal_TemplateBase unregisterObject(string $object_name) + * @method Smarty_Internal_TemplateBase unregisterPlugin(string $type, string $name) + * @method Smarty_Internal_TemplateBase unregisterFilter(string $type, mixed $callback) + * @method Smarty_Internal_TemplateBase unregisterResource(string $name) + */ +abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data +{ + /** + * Set this if you want different sets of cache files for the same + * templates. + * + * @var string + */ + public $cache_id = null; + + /** + * Set this if you want different sets of compiled files for the same + * templates. + * + * @var string + */ + public $compile_id = null; + + /** + * caching enabled + * + * @var int + */ + public $caching = Smarty::CACHING_OFF; + + /** + * check template for modifications? + * + * @var int + */ + public $compile_check = Smarty::COMPILECHECK_ON; + + /** + * cache lifetime in seconds + * + * @var integer + */ + public $cache_lifetime = 3600; + + /** + * Array of source information for known template functions + * + * @var array + */ + public $tplFunctions = array(); + + /** + * universal cache + * + * @var array() + */ + public $_cache = array(); + + /** + * fetches a rendered Smarty template + * + * @param string $template the resource handle of the template file or template object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * + * @throws Exception + * @throws SmartyException + * @return string rendered template output + */ + public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null) + { + $result = $this->_execute($template, $cache_id, $compile_id, $parent, 0); + return $result === null ? ob_get_clean() : $result; + } + + /** + * displays a Smarty template + * + * @param string $template the resource handle of the template file or template object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * + * @throws \Exception + * @throws \SmartyException + */ + public function display($template = null, $cache_id = null, $compile_id = null, $parent = null) + { + // display template + $this->_execute($template, $cache_id, $compile_id, $parent, 1); + } + + /** + * test if cache is valid + * + * @api Smarty::isCached() + * @link http://www.smarty.net/docs/en/api.is.cached.tpl + * + * @param null|string|\Smarty_Internal_Template $template the resource handle of the template file or template + * object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * + * @return bool cache status + * @throws \Exception + * @throws \SmartyException + */ + public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null) + { + return $this->_execute($template, $cache_id, $compile_id, $parent, 2); + } + + /** + * fetches a rendered Smarty template + * + * @param string $template the resource handle of the template file or template object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @param string $function function type 0 = fetch, 1 = display, 2 = isCache + * + * @return mixed + * @throws \Exception + * @throws \SmartyException + */ + private function _execute($template, $cache_id, $compile_id, $parent, $function) + { + $smarty = $this->_getSmartyObj(); + $saveVars = true; + if ($template === null) { + if (!$this->_isTplObj()) { + throw new SmartyException($function . '():Missing \'$template\' parameter'); + } else { + $template = $this; + } + } elseif (is_object($template)) { + /* @var Smarty_Internal_Template $template */ + if (!isset($template->_objType) || !$template->_isTplObj()) { + throw new SmartyException($function . '():Template object expected'); + } + } else { + // get template object + $saveVars = false; + $template = $smarty->createTemplate($template, $cache_id, $compile_id, $parent ? $parent : $this, false); + if ($this->_objType === 1) { + // set caching in template object + $template->caching = $this->caching; + } + } + // make sure we have integer values + $template->caching = (int)$template->caching; + // fetch template content + $level = ob_get_level(); + try { + $_smarty_old_error_level = + isset($smarty->error_reporting) ? error_reporting($smarty->error_reporting) : null; + if ($this->_objType === 2) { + /* @var Smarty_Internal_Template $this */ + $template->tplFunctions = $this->tplFunctions; + $template->inheritance = $this->inheritance; + } + /* @var Smarty_Internal_Template $parent */ + if (isset($parent->_objType) && ($parent->_objType === 2) && !empty($parent->tplFunctions)) { + $template->tplFunctions = array_merge($parent->tplFunctions, $template->tplFunctions); + } + if ($function === 2) { + if ($template->caching) { + // return cache status of template + if (!isset($template->cached)) { + $template->loadCached(); + } + $result = $template->cached->isCached($template); + Smarty_Internal_Template::$isCacheTplObj[ $template->_getTemplateId() ] = $template; + } else { + return false; + } + } else { + if ($saveVars) { + $savedTplVars = $template->tpl_vars; + $savedConfigVars = $template->config_vars; + } + ob_start(); + $template->_mergeVars(); + if (!empty(Smarty::$global_tpl_vars)) { + $template->tpl_vars = array_merge(Smarty::$global_tpl_vars, $template->tpl_vars); + } + $result = $template->render(false, $function); + $template->_cleanUp(); + if ($saveVars) { + $template->tpl_vars = $savedTplVars; + $template->config_vars = $savedConfigVars; + } else { + if (!$function && !isset(Smarty_Internal_Template::$tplObjCache[ $template->templateId ])) { + $template->parent = null; + $template->tpl_vars = $template->config_vars = array(); + Smarty_Internal_Template::$tplObjCache[ $template->templateId ] = $template; + } + } + } + if (isset($_smarty_old_error_level)) { + error_reporting($_smarty_old_error_level); + } + return $result; + } catch (Exception $e) { + while (ob_get_level() > $level) { + ob_end_clean(); + } + if (isset($_smarty_old_error_level)) { + error_reporting($_smarty_old_error_level); + } + throw $e; + } + } + + /** + * Registers plugin to be used in templates + * + * @api Smarty::registerPlugin() + * @link http://www.smarty.net/docs/en/api.register.plugin.tpl + * + * @param string $type plugin type + * @param string $name name of template tag + * @param callable $callback PHP callback to register + * @param bool $cacheable if true (default) this function is cache able + * @param mixed $cache_attr caching attributes if any + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerPlugin($type, $name, $callback, $cacheable = true, $cache_attr = null) + { + return $this->ext->registerPlugin->registerPlugin($this, $type, $name, $callback, $cacheable, $cache_attr); + } + + /** + * load a filter of specified type and name + * + * @api Smarty::loadFilter() + * @link http://www.smarty.net/docs/en/api.load.filter.tpl + * + * @param string $type filter type + * @param string $name filter name + * + * @return bool + * @throws \SmartyException + */ + public function loadFilter($type, $name) + { + return $this->ext->loadFilter->loadFilter($this, $type, $name); + } + + /** + * Registers a filter function + * + * @api Smarty::registerFilter() + * @link http://www.smarty.net/docs/en/api.register.filter.tpl + * + * @param string $type filter type + * @param callable $callback + * @param string|null $name optional filter name + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerFilter($type, $callback, $name = null) + { + return $this->ext->registerFilter->registerFilter($this, $type, $callback, $name); + } + + /** + * Registers object to be used in templates + * + * @api Smarty::registerObject() + * @link http://www.smarty.net/docs/en/api.register.object.tpl + * + * @param string $object_name + * @param object $object the referenced PHP object to register + * @param array $allowed_methods_properties list of allowed methods (empty = all) + * @param bool $format smarty argument format, else traditional + * @param array $block_methods list of block-methods + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function registerObject( + $object_name, + $object, + $allowed_methods_properties = array(), + $format = true, + $block_methods = array() + ) { + return $this->ext->registerObject->registerObject( + $this, + $object_name, + $object, + $allowed_methods_properties, + $format, + $block_methods + ); + } + + /** + * @param int $compile_check + */ + public function setCompileCheck($compile_check) + { + $this->compile_check = (int)$compile_check; + } + + /** + * @param int $caching + */ + public function setCaching($caching) + { + $this->caching = (int)$caching; + } + + /** + * @param int $cache_lifetime + */ + public function setCacheLifetime($cache_lifetime) + { + $this->cache_lifetime = $cache_lifetime; + } + + /** + * @param string $compile_id + */ + public function setCompileId($compile_id) + { + $this->compile_id = $compile_id; + } + + /** + * @param string $cache_id + */ + public function setCacheId($cache_id) + { + $this->cache_id = $cache_id; + } +} diff --git a/sysplugins/smarty_internal_templatecompilerbase.php b/sysplugins/smarty_internal_templatecompilerbase.php new file mode 100644 index 0000000000000000000000000000000000000000..3cc957dece8e3c72d0f0a88dbce057e62c2067bf --- /dev/null +++ b/sysplugins/smarty_internal_templatecompilerbase.php @@ -0,0 +1,1760 @@ +<?php +/** + * Smarty Internal Plugin Smarty Template Compiler Base + * This file contains the basic classes and methods for compiling Smarty templates with lexer/parser + * + * @package Smarty + * @subpackage Compiler + * @author Uwe Tews + */ + +/** + * Main abstract compiler class + * + * @package Smarty + * @subpackage Compiler + * + * @property Smarty_Internal_SmartyTemplateCompiler $prefixCompiledCode = '' + * @property Smarty_Internal_SmartyTemplateCompiler $postfixCompiledCode = '' + * @method registerPostCompileCallback($callback, $parameter = array(), $key = null, $replace = false) + * @method unregisterPostCompileCallback($key) + */ +abstract class Smarty_Internal_TemplateCompilerBase +{ + /** + * compile tag objects cache + * + * @var array + */ + public static $_tag_objects = array(); + + /** + * counter for prefix variable number + * + * @var int + */ + public static $prefixVariableNumber = 0; + + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + + /** + * Parser object + * + * @var Smarty_Internal_Templateparser + */ + public $parser = null; + + /** + * hash for nocache sections + * + * @var mixed + */ + public $nocache_hash = null; + + /** + * suppress generation of nocache code + * + * @var bool + */ + public $suppressNocacheProcessing = false; + + /** + * caching enabled (copied from template object) + * + * @var int + */ + public $caching = 0; + + /** + * tag stack + * + * @var array + */ + public $_tag_stack = array(); + + /** + * tag stack count + * + * @var array + */ + public $_tag_stack_count = array(); + + /** + * Plugins used by template + * + * @var array + */ + public $required_plugins = array('compiled' => array(), 'nocache' => array()); + + /** + * Required plugins stack + * + * @var array + */ + public $required_plugins_stack = array(); + + /** + * current template + * + * @var Smarty_Internal_Template + */ + public $template = null; + + /** + * merged included sub template data + * + * @var array + */ + public $mergedSubTemplatesData = array(); + + /** + * merged sub template code + * + * @var array + */ + public $mergedSubTemplatesCode = array(); + + /** + * collected template properties during compilation + * + * @var array + */ + public $templateProperties = array(); + + /** + * source line offset for error messages + * + * @var int + */ + public $trace_line_offset = 0; + + /** + * trace uid + * + * @var string + */ + public $trace_uid = ''; + + /** + * trace file path + * + * @var string + */ + public $trace_filepath = ''; + + /** + * stack for tracing file and line of nested {block} tags + * + * @var array + */ + public $trace_stack = array(); + + /** + * plugins loaded by default plugin handler + * + * @var array + */ + public $default_handler_plugins = array(); + + /** + * saved preprocessed modifier list + * + * @var mixed + */ + public $default_modifier_list = null; + + /** + * force compilation of complete template as nocache + * + * @var boolean + */ + public $forceNocache = false; + + /** + * flag if compiled template file shall we written + * + * @var bool + */ + public $write_compiled_code = true; + + /** + * Template functions + * + * @var array + */ + public $tpl_function = array(); + + /** + * called sub functions from template function + * + * @var array + */ + public $called_functions = array(); + + /** + * compiled template or block function code + * + * @var string + */ + public $blockOrFunctionCode = ''; + + /** + * php_handling setting either from Smarty or security + * + * @var int + */ + public $php_handling = 0; + + /** + * flags for used modifier plugins + * + * @var array + */ + public $modifier_plugins = array(); + + /** + * type of already compiled modifier + * + * @var array + */ + public $known_modifier_type = array(); + + /** + * parent compiler object for merged subtemplates and template functions + * + * @var Smarty_Internal_TemplateCompilerBase + */ + public $parent_compiler = null; + + /** + * Flag true when compiling nocache section + * + * @var bool + */ + public $nocache = false; + + /** + * Flag true when tag is compiled as nocache + * + * @var bool + */ + public $tag_nocache = false; + + /** + * Compiled tag prefix code + * + * @var array + */ + public $prefix_code = array(); + + /** + * used prefix variables by current compiled tag + * + * @var array + */ + public $usedPrefixVariables = array(); + + /** + * Prefix code stack + * + * @var array + */ + public $prefixCodeStack = array(); + + /** + * Tag has compiled code + * + * @var bool + */ + public $has_code = false; + + /** + * A variable string was compiled + * + * @var bool + */ + public $has_variable_string = false; + + /** + * Stack for {setfilter} {/setfilter} + * + * @var array + */ + public $variable_filter_stack = array(); + + /** + * variable filters for {setfilter} {/setfilter} + * + * @var array + */ + public $variable_filters = array(); + + /** + * Nesting count of looping tags like {foreach}, {for}, {section}, {while} + * + * @var int + */ + public $loopNesting = 0; + + /** + * Strip preg pattern + * + * @var string + */ + public $stripRegEx = '![\t ]*[\r\n]+[\t ]*!'; + + /** + * plugin search order + * + * @var array + */ + public $plugin_search_order = array( + 'function', + 'block', + 'compiler', + 'class' + ); + + /** + * General storage area for tag compiler plugins + * + * @var array + */ + public $_cache = array(); + + /** + * Lexer preg pattern for left delimiter + * + * @var string + */ + private $ldelPreg = '[{]'; + + /** + * Lexer preg pattern for right delimiter + * + * @var string + */ + private $rdelPreg = '[}]'; + + /** + * Length of right delimiter + * + * @var int + */ + private $rdelLength = 0; + + /** + * Length of left delimiter + * + * @var int + */ + private $ldelLength = 0; + + /** + * Lexer preg pattern for user literals + * + * @var string + */ + private $literalPreg = ''; + + /** + * Initialize compiler + * + * @param Smarty $smarty global instance + */ + public function __construct(Smarty $smarty) + { + $this->smarty = $smarty; + $this->nocache_hash = str_replace( + array( + '.', + ',' + ), + '_', + uniqid(mt_rand(), true) + ); + } + + /** + * Method to compile a Smarty template + * + * @param Smarty_Internal_Template $template template object to compile + * @param bool $nocache true is shall be compiled in nocache mode + * @param null|Smarty_Internal_TemplateCompilerBase $parent_compiler + * + * @return bool true if compiling succeeded, false if it failed + * @throws \Exception + */ + public function compileTemplate( + Smarty_Internal_Template $template, + $nocache = null, + Smarty_Internal_TemplateCompilerBase $parent_compiler = null + ) { + // get code frame of compiled template + $_compiled_code = $template->smarty->ext->_codeFrame->create( + $template, + $this->compileTemplateSource( + $template, + $nocache, + $parent_compiler + ), + $this->postFilter($this->blockOrFunctionCode) . + join('', $this->mergedSubTemplatesCode), + false, + $this + ); + return $_compiled_code; + } + + /** + * Compile template source and run optional post filter + * + * @param \Smarty_Internal_Template $template + * @param null|bool $nocache flag if template must be compiled in nocache mode + * @param \Smarty_Internal_TemplateCompilerBase $parent_compiler + * + * @return string + * @throws \Exception + */ + public function compileTemplateSource( + Smarty_Internal_Template $template, + $nocache = null, + Smarty_Internal_TemplateCompilerBase $parent_compiler = null + ) { + try { + // save template object in compiler class + $this->template = $template; + if (property_exists($this->template->smarty, 'plugin_search_order')) { + $this->plugin_search_order = $this->template->smarty->plugin_search_order; + } + if ($this->smarty->debugging) { + if (!isset($this->smarty->_debug)) { + $this->smarty->_debug = new Smarty_Internal_Debug(); + } + $this->smarty->_debug->start_compile($this->template); + } + if (isset($this->template->smarty->security_policy)) { + $this->php_handling = $this->template->smarty->security_policy->php_handling; + } else { + $this->php_handling = $this->template->smarty->php_handling; + } + $this->parent_compiler = $parent_compiler ? $parent_compiler : $this; + $nocache = isset($nocache) ? $nocache : false; + if (empty($template->compiled->nocache_hash)) { + $template->compiled->nocache_hash = $this->nocache_hash; + } else { + $this->nocache_hash = $template->compiled->nocache_hash; + } + $this->caching = $template->caching; + // flag for nocache sections + $this->nocache = $nocache; + $this->tag_nocache = false; + // reset has nocache code flag + $this->template->compiled->has_nocache_code = false; + $this->has_variable_string = false; + $this->prefix_code = array(); + // add file dependency + if ($this->smarty->merge_compiled_includes || $this->template->source->handler->checkTimestamps()) { + $this->parent_compiler->template->compiled->file_dependency[ $this->template->source->uid ] = + array( + $this->template->source->filepath, + $this->template->source->getTimeStamp(), + $this->template->source->type, + ); + } + $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); + } else { + // get template source + $_content = $this->template->source->getContent(); + } + $_compiled_code = $this->postFilter($this->doCompile($this->preFilter($_content), true)); + if (!empty($this->required_plugins[ 'compiled' ]) || !empty($this->required_plugins[ 'nocache' ])) { + $_compiled_code = '<?php ' . $this->compileRequiredPlugins() . "?>\n" . $_compiled_code; + } + } catch (Exception $e) { + if ($this->smarty->debugging) { + $this->smarty->_debug->end_compile($this->template); + } + $this->_tag_stack = array(); + // free memory + $this->parent_compiler = null; + $this->template = null; + $this->parser = null; + throw $e; + } + if ($this->smarty->debugging) { + $this->smarty->_debug->end_compile($this->template); + } + $this->parent_compiler = null; + $this->parser = null; + return $_compiled_code; + } + + /** + * Optionally process compiled code by post filter + * + * @param string $code compiled code + * + * @return string + * @throws \SmartyException + */ + public function postFilter($code) + { + // run post filter if on code + if (!empty($code) + && (isset($this->smarty->autoload_filters[ 'post' ]) || isset($this->smarty->registered_filters[ 'post' ])) + ) { + return $this->smarty->ext->_filterHandler->runFilter('post', $code, $this->template); + } else { + return $code; + } + } + + /** + * Run optional prefilter + * + * @param string $_content template source + * + * @return string + * @throws \SmartyException + */ + public function preFilter($_content) + { + // run pre filter if required + if ($_content !== '' + && ((isset($this->smarty->autoload_filters[ 'pre' ]) || isset($this->smarty->registered_filters[ 'pre' ]))) + ) { + return $this->smarty->ext->_filterHandler->runFilter('pre', $_content, $this->template); + } else { + return $_content; + } + } + + /** + * Compile Tag + * This is a call back from the lexer/parser + * + * Save current prefix code + * Compile tag + * Merge tag prefix code with saved one + * (required nested tags in attributes) + * + * @param string $tag tag name + * @param array $args array with tag attributes + * @param array $parameter array with compilation parameter + * + * @throws SmartyCompilerException + * @throws SmartyException + * @return string compiled code + */ + public function compileTag($tag, $args, $parameter = array()) + { + $this->prefixCodeStack[] = $this->prefix_code; + $this->prefix_code = array(); + $result = $this->compileTag2($tag, $args, $parameter); + $this->prefix_code = array_merge($this->prefix_code, array_pop($this->prefixCodeStack)); + return $result; + } + + /** + * compile variable + * + * @param string $variable + * + * @return string + */ + public function compileVariable($variable) + { + if (!strpos($variable, '(')) { + // not a variable variable + $var = trim($variable, '\''); + $this->tag_nocache = $this->tag_nocache | + $this->template->ext->getTemplateVars->_getVariable( + $this->template, + $var, + null, + true, + false + )->nocache; + // todo $this->template->compiled->properties['variables'][$var] = $this->tag_nocache | $this->nocache; + } + return '$_smarty_tpl->tpl_vars[' . $variable . ']->value'; + } + + /** + * compile config variable + * + * @param string $variable + * + * @return string + */ + public function compileConfigVariable($variable) + { + // return '$_smarty_tpl->config_vars[' . $variable . ']'; + return '$_smarty_tpl->smarty->ext->configLoad->_getConfigVariable($_smarty_tpl, ' . $variable . ')'; + } + + /** + * compile PHP function call + * + * @param string $name + * @param array $parameter + * + * @return string + * @throws \SmartyCompilerException + */ + public function compilePHPFunctionCall($name, $parameter) + { + if (!$this->smarty->security_policy || $this->smarty->security_policy->isTrustedPhpFunction($name, $this)) { + if (strcasecmp($name, 'isset') === 0 || strcasecmp($name, 'empty') === 0 + || strcasecmp($name, 'array') === 0 || is_callable($name) + ) { + $func_name = strtolower($name); + + if ($func_name === 'isset') { + if (count($parameter) === 0) { + $this->trigger_template_error('Illegal number of parameter in "isset()"'); + } + + $pa = array(); + foreach ($parameter as $p) { + $pa[] = $this->syntaxMatchesVariable($p) ? 'isset(' . $p . ')' : '(' . $p . ' !== null )'; + } + return '(' . implode(' && ', $pa) . ')'; + + } elseif (in_array( + $func_name, + array( + 'empty', + 'reset', + 'current', + 'end', + 'prev', + 'next' + ) + ) + ) { + if (count($parameter) !== 1) { + $this->trigger_template_error("Illegal number of parameter in '{$func_name()}'"); + } + if ($func_name === 'empty') { + if (!$this->syntaxMatchesVariable($parameter[0]) && version_compare(PHP_VERSION, '5.5.0', '<')) { + return '(' . $parameter[ 0 ] . ' === false )'; + } else { + return $func_name . '(' . + str_replace("')->value", "',null,true,false)->value", $parameter[ 0 ]) . ')'; + } + } else { + return $func_name . '(' . $parameter[ 0 ] . ')'; + } + } else { + return $name . '(' . implode(',', $parameter) . ')'; + } + } else { + $this->trigger_template_error("unknown function '{$name}'"); + } + } + } + + /** + * Determines whether the passed string represents a valid (PHP) variable. + * This is important, because `isset()` only works on variables and `empty()` can only be passed + * a variable prior to php5.5 + * @param $string + * @return bool + */ + private function syntaxMatchesVariable($string) { + static $regex_pattern = '/^\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*((->)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*|\[.*]*\])*$/'; + return 1 === preg_match($regex_pattern, trim($string)); + } + + /** + * This method is called from parser to process a text content section if strip is enabled + * - remove text from inheritance child templates as they may generate output + * + * @param string $text + * + * @return string + */ + public function processText($text) + { + + if (strpos($text, '<') === false) { + return preg_replace($this->stripRegEx, '', $text); + } + + $store = array(); + $_store = 0; + + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all( + '#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is', + $text, + $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER + ) + ) { + foreach ($matches as $match) { + $store[] = $match[ 0 ][ 0 ]; + $_length = strlen($match[ 0 ][ 0 ]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] - $_offset, $_length); + $_offset += $_length - strlen($replace); + $_store++; + } + } + $expressions = array(// replace multiple spaces between tags by a single space + '#(:SMARTY@!@|>)[\040\011]+(?=@!@SMARTY:|<)#s' => '\1 \2', + // remove newline between tags + '#(:SMARTY@!@|>)[\040\011]*[\n]\s*(?=@!@SMARTY:|<)#s' => '\1\2', + // remove multiple spaces between attributes (but not in attribute values!) + '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5', + '#>[\040\011]+$#Ss' => '> ', + '#>[\040\011]*[\n]\s*$#Ss' => '>', + $this->stripRegEx => '', + ); + $text = preg_replace(array_keys($expressions), array_values($expressions), $text); + $_offset = 0; + if (preg_match_all( + '#@!@SMARTY:([0-9]+):SMARTY@!@#is', + $text, + $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER + ) + ) { + foreach ($matches as $match) { + $_length = strlen($match[ 0 ][ 0 ]); + $replace = $store[ $match[ 1 ][ 0 ] ]; + $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] + $_offset, $_length); + $_offset += strlen($replace) - $_length; + $_store++; + } + } + return $text; + } + + /** + * lazy loads internal compile plugin for tag and calls the compile method + * compile objects cached for reuse. + * class name format: Smarty_Internal_Compile_TagName + * plugin filename format: Smarty_Internal_TagName.php + * + * @param string $tag tag name + * @param array $args list of tag attributes + * @param mixed $param1 optional parameter + * @param mixed $param2 optional parameter + * @param mixed $param3 optional parameter + * + * @return bool|string compiled code or false + * @throws \SmartyCompilerException + */ + public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null) + { + /* @var Smarty_Internal_CompileBase $tagCompiler */ + $tagCompiler = $this->getTagCompiler($tag); + // compile this tag + return $tagCompiler === false ? false : $tagCompiler->compile($args, $this, $param1, $param2, $param3); + } + + /** + * lazy loads internal compile plugin for tag compile objects cached for reuse. + * + * class name format: Smarty_Internal_Compile_TagName + * plugin filename format: Smarty_Internal_TagName.php + * + * @param string $tag tag name + * + * @return bool|\Smarty_Internal_CompileBase tag compiler object or false if not found + */ + public function getTagCompiler($tag) + { + // re-use object if already exists + if (!isset(self::$_tag_objects[ $tag ])) { + // lazy load internal compiler plugin + $_tag = explode('_', $tag); + $_tag = array_map('ucfirst', $_tag); + $class_name = 'Smarty_Internal_Compile_' . implode('_', $_tag); + if (class_exists($class_name) + && (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) + ) { + self::$_tag_objects[ $tag ] = new $class_name; + } else { + self::$_tag_objects[ $tag ] = false; + } + } + return self::$_tag_objects[ $tag ]; + } + + /** + * Check for plugins and return function name + * + * @param $plugin_name + * @param string $plugin_type type of plugin + * + * @return string call name of function + * @throws \SmartyException + */ + public function getPlugin($plugin_name, $plugin_type) + { + $function = null; + if ($this->caching && ($this->nocache || $this->tag_nocache)) { + if (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) { + $function = + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + } elseif (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) { + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ]; + $function = + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + } + } else { + if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) { + $function = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + } elseif (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) { + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] = + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ]; + $function = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + } + } + if (isset($function)) { + if ($plugin_type === 'modifier') { + $this->modifier_plugins[ $plugin_name ] = true; + } + return $function; + } + // loop through plugin dirs and find the plugin + $function = 'smarty_' . $plugin_type . '_' . $plugin_name; + $file = $this->smarty->loadPlugin($function, false); + if (is_string($file)) { + if ($this->caching && ($this->nocache || $this->tag_nocache)) { + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] = + $file; + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] = + $function; + } else { + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] = + $file; + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] = + $function; + } + if ($plugin_type === 'modifier') { + $this->modifier_plugins[ $plugin_name ] = true; + } + return $function; + } + if (is_callable($function)) { + // plugin function is defined in the script + return $function; + } + return false; + } + + /** + * Check for plugins by default plugin handler + * + * @param string $tag name of tag + * @param string $plugin_type type of plugin + * + * @return bool true if found + * @throws \SmartyCompilerException + */ + public function getPluginFromDefaultHandler($tag, $plugin_type) + { + $callback = null; + $script = null; + $cacheable = true; + $result = call_user_func_array( + $this->smarty->default_plugin_handler_func, + array( + $tag, + $plugin_type, + $this->template, + &$callback, + &$script, + &$cacheable, + ) + ); + if ($result) { + $this->tag_nocache = $this->tag_nocache || !$cacheable; + if ($script !== null) { + if (is_file($script)) { + if ($this->caching && ($this->nocache || $this->tag_nocache)) { + $this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] = + $script; + $this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] = + $callback; + } else { + $this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] = + $script; + $this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] = + $callback; + } + include_once $script; + } else { + $this->trigger_template_error("Default plugin handler: Returned script file '{$script}' for '{$tag}' not found"); + } + } + if (is_callable($callback)) { + $this->default_handler_plugins[ $plugin_type ][ $tag ] = array( + $callback, + true, + array() + ); + return true; + } else { + $this->trigger_template_error("Default plugin handler: Returned callback for '{$tag}' not callable"); + } + } + return false; + } + + /** + * Append code segments and remove unneeded ?> <?php transitions + * + * @param string $left + * @param string $right + * + * @return string + */ + public function appendCode($left, $right) + { + if (preg_match('/\s*\?>\s?$/D', $left) && preg_match('/^<\?php\s+/', $right)) { + $left = preg_replace('/\s*\?>\s?$/D', "\n", $left); + $left .= preg_replace('/^<\?php\s+/', '', $right); + } else { + $left .= $right; + } + return $left; + } + + /** + * Inject inline code for nocache template sections + * This method gets the content of each template element from the parser. + * If the content is compiled code and it should be not cached the code is injected + * into the rendered output. + * + * @param string $content content of template element + * @param boolean $is_code true if content is compiled code + * + * @return string content + */ + public function processNocacheCode($content, $is_code) + { + // If the template is not evaluated and we have a nocache section and or a nocache tag + if ($is_code && !empty($content)) { + // generate replacement code + if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->caching + && !$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache) + ) { + $this->template->compiled->has_nocache_code = true; + $_output = addcslashes($content, '\'\\'); + $_output = str_replace('^#^', '\'', $_output); + $_output = + "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n"; + // make sure we include modifier plugins for nocache code + foreach ($this->modifier_plugins as $plugin_name => $dummy) { + if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) { + $this->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ]; + } + } + } else { + $_output = $content; + } + } else { + $_output = $content; + } + $this->modifier_plugins = array(); + $this->suppressNocacheProcessing = false; + $this->tag_nocache = false; + return $_output; + } + + /** + * Get Id + * + * @param string $input + * + * @return bool|string + */ + public function getId($input) + { + if (preg_match('~^([\'"]*)([0-9]*[a-zA-Z_]\w*)\1$~', $input, $match)) { + return $match[ 2 ]; + } + return false; + } + + /** + * Get variable name from string + * + * @param string $input + * + * @return bool|string + */ + public function getVariableName($input) + { + if (preg_match('~^[$]_smarty_tpl->tpl_vars\[[\'"]*([0-9]*[a-zA-Z_]\w*)[\'"]*\]->value$~', $input, $match)) { + return $match[ 1 ]; + } + return false; + } + + /** + * Set nocache flag in variable or create new variable + * + * @param string $varName + */ + public function setNocacheInVariable($varName) + { + // create nocache var to make it know for further compiling + if ($_var = $this->getId($varName)) { + if (isset($this->template->tpl_vars[ $_var ])) { + $this->template->tpl_vars[ $_var ] = clone $this->template->tpl_vars[ $_var ]; + $this->template->tpl_vars[ $_var ]->nocache = true; + } else { + $this->template->tpl_vars[ $_var ] = new Smarty_Variable(null, true); + } + } + } + + /** + * @param array $_attr tag attributes + * @param array $validScopes + * + * @return int|string + * @throws \SmartyCompilerException + */ + public function convertScope($_attr, $validScopes) + { + $_scope = 0; + if (isset($_attr[ 'scope' ])) { + $_scopeName = trim($_attr[ 'scope' ], '\'"'); + if (is_numeric($_scopeName) && in_array($_scopeName, $validScopes)) { + $_scope = $_scopeName; + } elseif (is_string($_scopeName)) { + $_scopeName = trim($_scopeName, '\'"'); + $_scope = isset($validScopes[ $_scopeName ]) ? $validScopes[ $_scopeName ] : false; + } else { + $_scope = false; + } + if ($_scope === false) { + $err = var_export($_scopeName, true); + $this->trigger_template_error("illegal value '{$err}' for \"scope\" attribute", null, true); + } + } + return $_scope; + } + + /** + * Generate nocache code string + * + * @param string $code PHP code + * + * @return string + */ + public function makeNocacheCode($code) + { + return "echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/<?php " . + str_replace('^#^', '\'', addcslashes($code, '\'\\')) . + "?>/*/%%SmartyNocache:{$this->nocache_hash}%%*/';\n"; + } + + /** + * display compiler error messages without dying + * If parameter $args is empty it is a parser detected syntax error. + * In this case the parser is called to obtain information about expected tokens. + * If parameter $args contains a string this is used as error message + * + * @param string $args individual error message or null + * @param string $line line-number + * @param null|bool $tagline if true the line number of last tag + * + * @throws \SmartyCompilerException when an unexpected token is found + */ + public function trigger_template_error($args = null, $line = null, $tagline = null) + { + $lex = $this->parser->lex; + if ($tagline === true) { + // get line number of Tag + $line = $lex->taglineno; + } elseif (!isset($line)) { + // get template source line which has error + $line = $lex->line; + } else { + $line = (int)$line; + } + if (in_array( + $this->template->source->type, + array( + 'eval', + 'string' + ) + ) + ) { + $templateName = $this->template->source->type . ':' . trim( + preg_replace( + '![\t\r\n]+!', + ' ', + strlen($lex->data) > 40 ? + substr($lex->data, 0, 40) . + '...' : $lex->data + ) + ); + } else { + $templateName = $this->template->source->type . ':' . $this->template->source->filepath; + } + // $line += $this->trace_line_offset; + $match = preg_split("/\n/", $lex->data); + $error_text = + 'Syntax error in template "' . (empty($this->trace_filepath) ? $templateName : $this->trace_filepath) . + '" on line ' . ($line + $this->trace_line_offset) . ' "' . + trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ])) . '" '; + if (isset($args)) { + // individual error message + $error_text .= $args; + } else { + $expect = array(); + // expected token from parser + $error_text .= ' - Unexpected "' . $lex->value . '"'; + if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4) { + foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) { + $exp_token = $this->parser->yyTokenName[ $token ]; + if (isset($lex->smarty_token_names[ $exp_token ])) { + // token type from lexer + $expect[] = '"' . $lex->smarty_token_names[ $exp_token ] . '"'; + } else { + // otherwise internal token name + $expect[] = $this->parser->yyTokenName[ $token ]; + } + } + $error_text .= ', expected one of: ' . implode(' , ', $expect); + } + } + if ($this->smarty->_parserdebug) { + $this->parser->errorRunDown(); + echo ob_get_clean(); + flush(); + } + $e = new SmartyCompilerException($error_text); + $e->line = $line; + $e->source = trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ])); + $e->desc = $args; + $e->template = $this->template->source->filepath; + throw $e; + } + + /** + * Return var_export() value with all white spaces removed + * + * @param mixed $value + * + * @return string + */ + public function getVarExport($value) + { + return preg_replace('/\s/', '', var_export($value, true)); + } + + /** + * enter double quoted string + * - save tag stack count + */ + public function enterDoubleQuote() + { + array_push($this->_tag_stack_count, $this->getTagStackCount()); + } + + /** + * Return tag stack count + * + * @return int + */ + public function getTagStackCount() + { + return count($this->_tag_stack); + } + + /** + * @param $lexerPreg + * + * @return mixed + */ + public function replaceDelimiter($lexerPreg) + { + return str_replace( + array('SMARTYldel', 'SMARTYliteral', 'SMARTYrdel', 'SMARTYautoliteral', 'SMARTYal'), + array( + $this->ldelPreg, $this->literalPreg, $this->rdelPreg, + $this->smarty->getAutoLiteral() ? '{1,}' : '{9}', + $this->smarty->getAutoLiteral() ? '' : '\\s*' + ), + $lexerPreg + ); + } + + /** + * Build lexer regular expressions for left and right delimiter and user defined literals + */ + public function initDelimiterPreg() + { + $ldel = $this->smarty->getLeftDelimiter(); + $this->ldelLength = strlen($ldel); + $this->ldelPreg = ''; + foreach (str_split($ldel, 1) as $chr) { + $this->ldelPreg .= '[' . preg_quote($chr,'/') . ']'; + } + $rdel = $this->smarty->getRightDelimiter(); + $this->rdelLength = strlen($rdel); + $this->rdelPreg = ''; + foreach (str_split($rdel, 1) as $chr) { + $this->rdelPreg .= '[' . preg_quote($chr,'/') . ']'; + } + $literals = $this->smarty->getLiterals(); + if (!empty($literals)) { + foreach ($literals as $key => $literal) { + $literalPreg = ''; + foreach (str_split($literal, 1) as $chr) { + $literalPreg .= '[' . preg_quote($chr,'/') . ']'; + } + $literals[ $key ] = $literalPreg; + } + $this->literalPreg = '|' . implode('|', $literals); + } else { + $this->literalPreg = ''; + } + } + + /** + * leave double quoted string + * - throw exception if block in string was not closed + * + * @throws \SmartyCompilerException + */ + public function leaveDoubleQuote() + { + if (array_pop($this->_tag_stack_count) !== $this->getTagStackCount()) { + $tag = $this->getOpenBlockTag(); + $this->trigger_template_error( + "unclosed '{{$tag}}' in doubled quoted string", + null, + true + ); + } + } + + /** + * Get left delimiter preg + * + * @return string + */ + public function getLdelPreg() + { + return $this->ldelPreg; + } + + /** + * Get right delimiter preg + * + * @return string + */ + public function getRdelPreg() + { + return $this->rdelPreg; + } + + /** + * Get length of left delimiter + * + * @return int + */ + public function getLdelLength() + { + return $this->ldelLength; + } + + /** + * Get length of right delimiter + * + * @return int + */ + public function getRdelLength() + { + return $this->rdelLength; + } + + /** + * Get name of current open block tag + * + * @return string|boolean + */ + public function getOpenBlockTag() + { + $tagCount = $this->getTagStackCount(); + if ($tagCount) { + return $this->_tag_stack[ $tagCount - 1 ][ 0 ]; + } else { + return false; + } + } + + /** + * Check if $value contains variable elements + * + * @param mixed $value + * + * @return bool|int + */ + public function isVariable($value) + { + if (is_string($value)) { + return preg_match('/[$(]/', $value); + } + if (is_bool($value) || is_numeric($value)) { + return false; + } + if (is_array($value)) { + foreach ($value as $k => $v) { + if ($this->isVariable($k) || $this->isVariable($v)) { + return true; + } + } + return false; + } + return false; + } + + /** + * Get new prefix variable name + * + * @return string + */ + public function getNewPrefixVariable() + { + ++self::$prefixVariableNumber; + return $this->getPrefixVariable(); + } + + /** + * Get current prefix variable name + * + * @return string + */ + public function getPrefixVariable() + { + return '$_prefixVariable' . self::$prefixVariableNumber; + } + + /** + * append code to prefix buffer + * + * @param string $code + */ + public function appendPrefixCode($code) + { + $this->prefix_code[] = $code; + } + + /** + * get prefix code string + * + * @return string + */ + public function getPrefixCode() + { + $code = ''; + $prefixArray = array_merge($this->prefix_code, array_pop($this->prefixCodeStack)); + $this->prefixCodeStack[] = array(); + foreach ($prefixArray as $c) { + $code = $this->appendCode($code, $c); + } + $this->prefix_code = array(); + return $code; + } + + /** + * Save current required plugins + * + * @param bool $init if true init required plugins + */ + public function saveRequiredPlugins($init = false) + { + $this->required_plugins_stack[] = $this->required_plugins; + if ($init) { + $this->required_plugins = array('compiled' => array(), 'nocache' => array()); + } + } + + /** + * Restore required plugins + */ + public function restoreRequiredPlugins() + { + $this->required_plugins = array_pop($this->required_plugins_stack); + } + + /** + * Compile code to call Smarty_Internal_Template::_checkPlugins() + * for required plugins + * + * @return string + */ + public function compileRequiredPlugins() + { + $code = $this->compileCheckPlugins($this->required_plugins[ 'compiled' ]); + if ($this->caching && !empty($this->required_plugins[ 'nocache' ])) { + $code .= $this->makeNocacheCode($this->compileCheckPlugins($this->required_plugins[ 'nocache' ])); + } + return $code; + } + + /** + * Compile code to call Smarty_Internal_Template::_checkPlugins + * - checks if plugin is callable require otherwise + * + * @param $requiredPlugins + * + * @return string + */ + public function compileCheckPlugins($requiredPlugins) + { + if (!empty($requiredPlugins)) { + $plugins = array(); + foreach ($requiredPlugins as $plugin) { + foreach ($plugin as $data) { + $plugins[] = $data; + } + } + return '$_smarty_tpl->_checkPlugins(' . $this->getVarExport($plugins) . ');' . "\n"; + } else { + return ''; + } + } + + /** + * method to compile a Smarty template + * + * @param mixed $_content template source + * @param bool $isTemplateSource + * + * @return bool true if compiling succeeded, false if it failed + */ + abstract protected function doCompile($_content, $isTemplateSource = false); + + /** + * Compile Tag + * + * @param string $tag tag name + * @param array $args array with tag attributes + * @param array $parameter array with compilation parameter + * + * @throws SmartyCompilerException + * @throws SmartyException + * @return string compiled code + */ + private function compileTag2($tag, $args, $parameter) + { + $plugin_type = ''; + // $args contains the attributes parsed and compiled by the lexer/parser + // assume that tag does compile into code, but creates no HTML output + $this->has_code = true; + // log tag/attributes + if (isset($this->smarty->_cache[ 'get_used_tags' ])) { + $this->template->_cache[ 'used_tags' ][] = array( + $tag, + $args + ); + } + // check nocache option flag + foreach ($args as $arg) { + if (!is_array($arg)) { + if ($arg === "'nocache'" || $arg === 'nocache') { + $this->tag_nocache = true; + } + } else { + foreach ($arg as $k => $v) { + if (($k === "'nocache'" || $k === 'nocache') && (trim($v, "'\" ") === 'true')) { + $this->tag_nocache = true; + } + } + } + } + // compile the smarty tag (required compile classes to compile the tag are auto loaded) + if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) { + if (isset($this->parent_compiler->tpl_function[ $tag ]) + || (isset($this->template->smarty->ext->_tplFunction) + && $this->template->smarty->ext->_tplFunction->getTplFunction($this->template, $tag) !== false) + ) { + // template defined by {template} tag + $args[ '_attr' ][ 'name' ] = "'{$tag}'"; + $_output = $this->callTagCompiler('call', $args, $parameter); + } + } + if ($_output !== false) { + if ($_output !== true) { + // did we get compiled code + if ($this->has_code) { + // return compiled code + return $_output; + } + } + // tag did not produce compiled code + return null; + } else { + // map_named attributes + if (isset($args[ '_attr' ])) { + foreach ($args[ '_attr' ] as $key => $attribute) { + if (is_array($attribute)) { + $args = array_merge($args, $attribute); + } + } + } + // not an internal compiler tag + if (strlen($tag) < 6 || substr($tag, -5) !== 'close') { + // check if tag is a registered object + if (isset($this->smarty->registered_objects[ $tag ]) && isset($parameter[ 'object_method' ])) { + $method = $parameter[ 'object_method' ]; + if (!in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ]) + && (empty($this->smarty->registered_objects[ $tag ][ 1 ]) + || in_array($method, $this->smarty->registered_objects[ $tag ][ 1 ])) + ) { + return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $method); + } elseif (in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ])) { + return $this->callTagCompiler( + 'private_object_block_function', + $args, + $parameter, + $tag, + $method + ); + } else { + // throw exception + $this->trigger_template_error( + 'not allowed method "' . $method . '" in registered object "' . + $tag . '"', + null, + true + ); + } + } + // check if tag is registered + foreach (array( + Smarty::PLUGIN_COMPILER, + Smarty::PLUGIN_FUNCTION, + Smarty::PLUGIN_BLOCK, + ) as $plugin_type) { + if (isset($this->smarty->registered_plugins[ $plugin_type ][ $tag ])) { + // if compiler function plugin call it now + if ($plugin_type === Smarty::PLUGIN_COMPILER) { + $new_args = array(); + foreach ($args as $key => $mixed) { + if (is_array($mixed)) { + $new_args = array_merge($new_args, $mixed); + } else { + $new_args[ $key ] = $mixed; + } + } + if (!$this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 1 ]) { + $this->tag_nocache = true; + } + return call_user_func_array( + $this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 0 ], + array( + $new_args, + $this + ) + ); + } + // compile registered function or block function + if ($plugin_type === Smarty::PLUGIN_FUNCTION || $plugin_type === Smarty::PLUGIN_BLOCK) { + return $this->callTagCompiler( + 'private_registered_' . $plugin_type, + $args, + $parameter, + $tag + ); + } + } + } + // check plugins from plugins folder + foreach ($this->plugin_search_order as $plugin_type) { + if ($plugin_type === Smarty::PLUGIN_COMPILER + && $this->smarty->loadPlugin('smarty_compiler_' . $tag) + && (!isset($this->smarty->security_policy) + || $this->smarty->security_policy->isTrustedTag($tag, $this)) + ) { + $plugin = 'smarty_compiler_' . $tag; + if (is_callable($plugin)) { + // convert arguments format for old compiler plugins + $new_args = array(); + foreach ($args as $key => $mixed) { + if (is_array($mixed)) { + $new_args = array_merge($new_args, $mixed); + } else { + $new_args[ $key ] = $mixed; + } + } + return $plugin($new_args, $this->smarty); + } + if (class_exists($plugin, false)) { + $plugin_object = new $plugin; + if (method_exists($plugin_object, 'compile')) { + return $plugin_object->compile($args, $this); + } + } + throw new SmartyException("Plugin '{$tag}' not callable"); + } else { + if ($function = $this->getPlugin($tag, $plugin_type)) { + if (!isset($this->smarty->security_policy) + || $this->smarty->security_policy->isTrustedTag($tag, $this) + ) { + return $this->callTagCompiler( + 'private_' . $plugin_type . '_plugin', + $args, + $parameter, + $tag, + $function + ); + } + } + } + } + if (is_callable($this->smarty->default_plugin_handler_func)) { + $found = false; + // look for already resolved tags + foreach ($this->plugin_search_order as $plugin_type) { + if (isset($this->default_handler_plugins[ $plugin_type ][ $tag ])) { + $found = true; + break; + } + } + if (!$found) { + // call default handler + foreach ($this->plugin_search_order as $plugin_type) { + if ($this->getPluginFromDefaultHandler($tag, $plugin_type)) { + $found = true; + break; + } + } + } + if ($found) { + // if compiler function plugin call it now + if ($plugin_type === Smarty::PLUGIN_COMPILER) { + $new_args = array(); + foreach ($args as $key => $mixed) { + if (is_array($mixed)) { + $new_args = array_merge($new_args, $mixed); + } else { + $new_args[ $key ] = $mixed; + } + } + return call_user_func_array( + $this->default_handler_plugins[ $plugin_type ][ $tag ][ 0 ], + array( + $new_args, + $this + ) + ); + } else { + return $this->callTagCompiler( + 'private_registered_' . $plugin_type, + $args, + $parameter, + $tag + ); + } + } + } + } else { + // compile closing tag of block function + $base_tag = substr($tag, 0, -5); + // check if closing tag is a registered object + if (isset($this->smarty->registered_objects[ $base_tag ]) && isset($parameter[ 'object_method' ])) { + $method = $parameter[ 'object_method' ]; + if (in_array($method, $this->smarty->registered_objects[ $base_tag ][ 3 ])) { + return $this->callTagCompiler( + 'private_object_block_function', + $args, + $parameter, + $tag, + $method + ); + } else { + // throw exception + $this->trigger_template_error( + 'not allowed closing tag method "' . $method . + '" in registered object "' . $base_tag . '"', + null, + true + ); + } + } + // registered block tag ? + if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) + || isset($this->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) + ) { + return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag); + } + // registered function tag ? + if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) { + return $this->callTagCompiler('private_registered_function', $args, $parameter, $tag); + } + // block plugin? + if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) { + return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function); + } + // function plugin? + if ($function = $this->getPlugin($tag, Smarty::PLUGIN_FUNCTION)) { + if (!isset($this->smarty->security_policy) + || $this->smarty->security_policy->isTrustedTag($tag, $this) + ) { + return $this->callTagCompiler('private_function_plugin', $args, $parameter, $tag, $function); + } + } + // registered compiler plugin ? + if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ])) { + // if compiler function plugin call it now + $args = array(); + if (!$this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 1 ]) { + $this->tag_nocache = true; + } + return call_user_func_array( + $this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 0 ], + array( + $args, + $this + ) + ); + } + if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) { + $plugin = 'smarty_compiler_' . $tag; + if (is_callable($plugin)) { + return $plugin($args, $this->smarty); + } + if (class_exists($plugin, false)) { + $plugin_object = new $plugin; + if (method_exists($plugin_object, 'compile')) { + return $plugin_object->compile($args, $this); + } + } + throw new SmartyException("Plugin '{$tag}' not callable"); + } + } + $this->trigger_template_error("unknown tag '{$tag}'", null, true); + } + } +} diff --git a/sysplugins/smarty_internal_templatelexer.php b/sysplugins/smarty_internal_templatelexer.php new file mode 100644 index 0000000000000000000000000000000000000000..867a31d26400fc7ff3ddc13d19acc647e650a496 --- /dev/null +++ b/sysplugins/smarty_internal_templatelexer.php @@ -0,0 +1,1095 @@ +<?php +/* + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty_Internal_Templatelexer + * This is the template file lexer. + * It is generated from the smarty_internal_templatelexer.plex file + * + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Templatelexer +{ + const TEXT = 1; + const TAG = 2; + const TAGBODY = 3; + const LITERAL = 4; + const DOUBLEQUOTEDSTRING = 5; + + /** + * Source + * + * @var string + */ + public $data; + + /** + * Source length + * + * @var int + */ + public $dataLength = null; + + /** + * byte counter + * + * @var int + */ + public $counter; + + /** + * token number + * + * @var int + */ + public $token; + + /** + * token value + * + * @var string + */ + public $value; + + /** + * current line + * + * @var int + */ + public $line; + + /** + * tag start line + * + * @var + */ + public $taglineno; + + /** + * php code type + * + * @var string + */ + public $phpType = ''; + + /** + * state number + * + * @var int + */ + public $state = 1; + + /** + * Smarty object + * + * @var Smarty + */ + public $smarty = null; + + /** + * compiler object + * + * @var Smarty_Internal_TemplateCompilerBase + */ + public $compiler = null; + + /** + * trace file + * + * @var resource + */ + public $yyTraceFILE; + + /** + * trace prompt + * + * @var string + */ + public $yyTracePrompt; + + /** + * XML flag true while processing xml + * + * @var bool + */ + public $is_xml = false; + + /** + * state names + * + * @var array + */ + public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING',); + + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + 'NOT' => '(!,not)', + 'OPENP' => '(', + 'CLOSEP' => ')', + 'OPENB' => '[', + 'CLOSEB' => ']', + 'PTR' => '->', + 'APTR' => '=>', + 'EQUAL' => '=', + 'NUMBER' => 'number', + 'UNIMATH' => '+" , "-', + 'MATH' => '*" , "/" , "%', + 'INCDEC' => '++" , "--', + 'SPACE' => ' ', + 'DOLLAR' => '$', + 'SEMICOLON' => ';', + 'COLON' => ':', + 'DOUBLECOLON' => '::', + 'AT' => '@', + 'HATCH' => '#', + 'QUOTE' => '"', + 'BACKTICK' => '`', + 'VERT' => '"|" modifier', + 'DOT' => '.', + 'COMMA' => '","', + 'QMARK' => '"?"', + 'ID' => 'id, name', + 'TEXT' => 'text', + 'LDELSLASH' => '{/..} closing tag', + 'LDEL' => '{...} Smarty tag', + 'COMMENT' => 'comment', + 'AS' => 'as', + 'TO' => 'to', + 'PHP' => '"<?php", "<%", "{php}" tag', + 'LOGOP' => '"<", "==" ... logical operator', + 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', + 'SCOND' => '"is even" ... if condition', + ); + + /** + * literal tag nesting level + * + * @var int + */ + private $literal_cnt = 0; + + /** + * preg token pattern for state TEXT + * + * @var string + */ + private $yy_global_pattern1 = null; + + /** + * preg token pattern for state TAG + * + * @var string + */ + private $yy_global_pattern2 = null; + + /** + * preg token pattern for state TAGBODY + * + * @var string + */ + private $yy_global_pattern3 = null; + + /** + * preg token pattern for state LITERAL + * + * @var string + */ + private $yy_global_pattern4 = null; + + /** + * preg token pattern for state DOUBLEQUOTEDSTRING + * + * @var null + */ + private $yy_global_pattern5 = null; + + /** + * preg token pattern for text + * + * @var null + */ + private $yy_global_text = null; + + /** + * preg token pattern for literal + * + * @var null + */ + private $yy_global_literal = null; + + private $_yy_state = 1; + + private $_yy_stack = array(); + + /** + * constructor + * + * @param string $source template source + * @param Smarty_Internal_TemplateCompilerBase $compiler + */ + public function __construct($source, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->data = $source; + $this->dataLength = strlen($this->data); + $this->counter = 0; + if (preg_match('/^\xEF\xBB\xBF/i', $this->data, $match)) { + $this->counter += strlen($match[ 0 ]); + } + $this->line = 1; + $this->smarty = $compiler->template->smarty; + $this->compiler = $compiler; + $this->compiler->initDelimiterPreg(); + $this->smarty_token_names[ 'LDEL' ] = $this->smarty->getLeftDelimiter(); + $this->smarty_token_names[ 'RDEL' ] = $this->smarty->getRightDelimiter(); + } + + /** + * open lexer/parser trace file + * + */ + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + /** + * replace placeholders with runtime preg code + * + * @param string $preg + * + * @return string + */ + public function replace($preg) + { + return $this->compiler->replaceDelimiter($preg); + } + + /** + * check if current value is an autoliteral left delimiter + * + * @return bool + */ + public function isAutoLiteral() + { + return $this->smarty->getAutoLiteral() && isset($this->value[ $this->compiler->getLdelLength() ]) ? + strpos(" \n\t\r", $this->value[ $this->compiler->getLdelLength() ]) !== false : false; + } // end function + + public function yylex() + { + return $this->{'yylex' . $this->_yy_state}(); + } + + public function yypushstate($state) + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); + } + array_push($this->_yy_stack, $this->_yy_state); + $this->_yy_state = $state; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); + } + } + + public function yypopstate() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); + } + $this->_yy_state = array_pop($this->_yy_stack); + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); + } + } + + public function yybegin($state) + { + $this->_yy_state = $state; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt, + isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); + } + } + + public function yylex1() + { + if (!isset($this->yy_global_pattern1)) { + $this->yy_global_pattern1 = + $this->replace("/\G([{][}])|\G((SMARTYldel)SMARTYal[*])|\G((SMARTYldel)SMARTYalphp([ ].*?)?SMARTYrdel|(SMARTYldel)SMARTYal[\/]phpSMARTYrdel)|\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([<][?]((php\\s+|=)|\\s+)|[<][%]|[<][?]xml\\s+|[<]script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*[>]|[?][>]|[%][>])|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, 5) . '... state TEXT'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r1_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line ' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r1_1() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r1_2() + { + $to = $this->dataLength; + preg_match("/[*]{$this->compiler->getRdelPreg()}[\n]?/", $this->data, $match, PREG_OFFSET_CAPTURE, + $this->counter); + if (isset($match[ 0 ][ 1 ])) { + $to = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]); + } else { + $this->compiler->trigger_template_error("missing or misspelled comment closing tag '{$this->smarty->getRightDelimiter()}'"); + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + return false; + } + + public function yy_r1_4() + { + $this->compiler->getTagCompiler('private_php')->parsePhp($this); + } + + public function yy_r1_8() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r1_10() + { + $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; + $this->yypushstate(self::LITERAL); + } + + public function yy_r1_12() + { + $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; + $this->yypushstate(self::LITERAL); + } // end function + + public function yy_r1_14() + { + $this->yypushstate(self::TAG); + return true; + } + + public function yy_r1_16() + { + $this->compiler->getTagCompiler('private_php')->parsePhp($this); + } + + public function yy_r1_19() + { + if (!isset($this->yy_global_text)) { + $this->yy_global_text = + $this->replace('/(SMARTYldel)SMARTYal|[<][?]((php\s+|=)|\s+)|[<][%]|[<][?]xml\s+|[<]script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*[>]|[?][>]|[%][>]SMARTYliteral/isS'); + } + $to = $this->dataLength; + preg_match($this->yy_global_text, $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[ 0 ][ 1 ])) { + $to = $match[ 0 ][ 1 ]; + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yylex2() + { + if (!isset($this->yy_global_pattern2)) { + $this->yy_global_pattern2 = + $this->replace("/\G((SMARTYldel)SMARTYal(if|elseif|else if|while)\\s+)|\G((SMARTYldel)SMARTYalfor\\s+)|\G((SMARTYldel)SMARTYalforeach(?![^\s]))|\G((SMARTYldel)SMARTYalsetfilter\\s+)|\G((SMARTYldel)SMARTYalmake_nocache\\s+)|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$]smarty\\.block\\.(child|parent)\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/][0-9]*[a-zA-Z_]\\w*\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal)/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, 5) . '... state TAG'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r2_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line ' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r2_1() + { + $this->token = Smarty_Internal_Templateparser::TP_LDELIF; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r2_4() + { + $this->token = Smarty_Internal_Templateparser::TP_LDELFOR; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r2_6() + { + $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r2_8() + { + $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r2_10() + { + $this->token = Smarty_Internal_Templateparser::TP_LDELMAKENOCACHE; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r2_12() + { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG; + $this->taglineno = $this->line; + } + + public function yy_r2_15() + { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT; + $this->taglineno = $this->line; + } + + public function yy_r2_18() + { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG; + $this->taglineno = $this->line; + } + + public function yy_r2_20() + { + if ($this->_yy_stack[ count($this->_yy_stack) - 1 ] === self::TEXT) { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SIMPELOUTPUT; + $this->taglineno = $this->line; + } else { + $this->value = $this->smarty->getLeftDelimiter(); + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + } // end function + + public function yy_r2_23() + { + $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r2_25() + { + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->yybegin(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yylex3() + { + if (!isset($this->yy_global_pattern3)) { + $this->yy_global_pattern3 = + $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, 5) . '... state TAGBODY'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r3_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line ' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r3_1() + { + $this->token = Smarty_Internal_Templateparser::TP_RDEL; + $this->yypopstate(); + } + + public function yy_r3_2() + { + $this->yypushstate(self::TAG); + return true; + } + + public function yy_r3_4() + { + $this->token = Smarty_Internal_Templateparser::TP_QUOTE; + $this->yypushstate(self::DOUBLEQUOTEDSTRING); + $this->compiler->enterDoubleQuote(); + } + + public function yy_r3_5() + { + $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING; + } + + public function yy_r3_6() + { + $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; + } + + public function yy_r3_7() + { + $this->token = Smarty_Internal_Templateparser::TP_DOLLAR; + } + + public function yy_r3_8() + { + $this->token = Smarty_Internal_Templateparser::TP_ISIN; + } + + public function yy_r3_9() + { + $this->token = Smarty_Internal_Templateparser::TP_AS; + } + + public function yy_r3_10() + { + $this->token = Smarty_Internal_Templateparser::TP_TO; + } + + public function yy_r3_11() + { + $this->token = Smarty_Internal_Templateparser::TP_STEP; + } + + public function yy_r3_12() + { + $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF; + } + + public function yy_r3_13() + { + $this->token = Smarty_Internal_Templateparser::TP_LOGOP; + } + + public function yy_r3_15() + { + $this->token = Smarty_Internal_Templateparser::TP_SLOGOP; + } + + public function yy_r3_17() + { + $this->token = Smarty_Internal_Templateparser::TP_TLOGOP; + } + + public function yy_r3_20() + { + $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND; + } + + public function yy_r3_23() + { + $this->token = Smarty_Internal_Templateparser::TP_NOT; + } + + public function yy_r3_24() + { + $this->token = Smarty_Internal_Templateparser::TP_TYPECAST; + } + + public function yy_r3_28() + { + $this->token = Smarty_Internal_Templateparser::TP_OPENP; + } + + public function yy_r3_29() + { + $this->token = Smarty_Internal_Templateparser::TP_CLOSEP; + } + + public function yy_r3_30() + { + $this->token = Smarty_Internal_Templateparser::TP_OPENB; + } + + public function yy_r3_31() + { + $this->token = Smarty_Internal_Templateparser::TP_CLOSEB; + } + + public function yy_r3_32() + { + $this->token = Smarty_Internal_Templateparser::TP_PTR; + } + + public function yy_r3_33() + { + $this->token = Smarty_Internal_Templateparser::TP_APTR; + } + + public function yy_r3_34() + { + $this->token = Smarty_Internal_Templateparser::TP_EQUAL; + } + + public function yy_r3_35() + { + $this->token = Smarty_Internal_Templateparser::TP_INCDEC; + } + + public function yy_r3_37() + { + $this->token = Smarty_Internal_Templateparser::TP_UNIMATH; + } + + public function yy_r3_39() + { + $this->token = Smarty_Internal_Templateparser::TP_MATH; + } + + public function yy_r3_41() + { + $this->token = Smarty_Internal_Templateparser::TP_AT; + } + + public function yy_r3_42() + { + $this->token = Smarty_Internal_Templateparser::TP_ARRAYOPEN; + } + + public function yy_r3_43() + { + $this->token = Smarty_Internal_Templateparser::TP_HATCH; + } + + public function yy_r3_44() + { + // resolve conflicts with shorttag and right_delimiter starting with '=' + if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->compiler->getRdelLength()) === + $this->smarty->getRightDelimiter()) { + preg_match('/\s+/', $this->value, $match); + $this->value = $match[ 0 ]; + $this->token = Smarty_Internal_Templateparser::TP_SPACE; + } else { + $this->token = Smarty_Internal_Templateparser::TP_ATTR; + } + } + + public function yy_r3_45() + { + $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE; + } + + public function yy_r3_48() + { + $this->token = Smarty_Internal_Templateparser::TP_ID; + } + + public function yy_r3_49() + { + $this->token = Smarty_Internal_Templateparser::TP_INTEGER; + } + + public function yy_r3_50() + { + $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; + $this->yypopstate(); + } + + public function yy_r3_51() + { + $this->token = Smarty_Internal_Templateparser::TP_VERT; + } + + public function yy_r3_52() + { + $this->token = Smarty_Internal_Templateparser::TP_DOT; + } + + public function yy_r3_53() + { + $this->token = Smarty_Internal_Templateparser::TP_COMMA; + } + + public function yy_r3_54() + { + $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON; + } + + public function yy_r3_55() + { + $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON; + } + + public function yy_r3_56() + { + $this->token = Smarty_Internal_Templateparser::TP_COLON; + } + + public function yy_r3_57() + { + $this->token = Smarty_Internal_Templateparser::TP_QMARK; + } + + public function yy_r3_58() + { + $this->token = Smarty_Internal_Templateparser::TP_HEX; + } + + public function yy_r3_59() + { + $this->token = Smarty_Internal_Templateparser::TP_SPACE; + } // end function + + public function yy_r3_60() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yylex4() + { + if (!isset($this->yy_global_pattern4)) { + $this->yy_global_pattern4 = + $this->replace("/\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, 5) . '... state LITERAL'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r4_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line ' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r4_1() + { + $this->literal_cnt++; + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } + + public function yy_r4_3() + { + if ($this->literal_cnt) { + $this->literal_cnt--; + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } else { + $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; + $this->yypopstate(); + } + } + + public function yy_r4_5() + { + if (!isset($this->yy_global_literal)) { + $this->yy_global_literal = $this->replace('/(SMARTYldel)SMARTYal[\/]?literalSMARTYrdel/isS'); + } + $to = $this->dataLength; + preg_match($this->yy_global_literal, $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + if (isset($match[ 0 ][ 1 ])) { + $to = $match[ 0 ][ 1 ]; + } else { + $this->compiler->trigger_template_error("missing or misspelled literal closing tag"); + } + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Templateparser::TP_LITERAL; + } // end function + + public function yylex5() + { + if (!isset($this->yy_global_pattern5)) { + $this->yy_global_pattern5 = + $this->replace("/\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=((SMARTYldel)SMARTYal|\\$|`\\$|\"SMARTYliteral)))|\G([\S\s])/isS"); + } + if (!isset($this->dataLength)) { + $this->dataLength = strlen($this->data); + } + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + do { + if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) { + if (!isset($yymatches[ 0 ][ 1 ])) { + $yymatches = preg_grep("/(.|\s)+/", $yymatches); + } else { + $yymatches = array_filter($yymatches); + } + if (empty($yymatches)) { + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, 5) . '... state DOUBLEQUOTEDSTRING'); + } + next($yymatches); // skip global match + $this->token = key($yymatches); // token number + $this->value = current($yymatches); // token value + $r = $this->{'yy_r5_' . $this->token}(); + if ($r === null) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + // accept this token + return true; + } elseif ($r === true) { + // we have changed state + // process this token in the new state + return $this->yylex(); + } elseif ($r === false) { + $this->counter += strlen($this->value); + $this->line += substr_count($this->value, "\n"); + if ($this->counter >= $this->dataLength) { + return false; // end of input + } + // skip this token + continue; + } + } else { + throw new Exception('Unexpected input at line ' . $this->line . + ': ' . $this->data[ $this->counter ]); + } + break; + } while (true); + } + + public function yy_r5_1() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r5_3() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r5_5() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r5_7() + { + $this->yypushstate(self::TAG); + return true; + } + + public function yy_r5_9() + { + $this->yypushstate(self::TAG); + return true; + } + + public function yy_r5_11() + { + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->taglineno = $this->line; + $this->yypushstate(self::TAGBODY); + } + + public function yy_r5_13() + { + $this->token = Smarty_Internal_Templateparser::TP_QUOTE; + $this->yypopstate(); + } + + public function yy_r5_14() + { + $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; + $this->value = substr($this->value, 0, -1); + $this->yypushstate(self::TAGBODY); + $this->taglineno = $this->line; + } + + public function yy_r5_15() + { + $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; + } + + public function yy_r5_16() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r5_17() + { + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } + + public function yy_r5_22() + { + $to = $this->dataLength; + $this->value = substr($this->data, $this->counter, $to - $this->counter); + $this->token = Smarty_Internal_Templateparser::TP_TEXT; + } +} + + diff --git a/sysplugins/smarty_internal_templateparser.php b/sysplugins/smarty_internal_templateparser.php new file mode 100644 index 0000000000000000000000000000000000000000..aaeae63b715bd5fc5dc41163e1e0dfb6eeba7d82 --- /dev/null +++ b/sysplugins/smarty_internal_templateparser.php @@ -0,0 +1,3623 @@ +<?php + +class TP_yyStackEntry +{ + public $stateno; /* The state-number */ + public $major; /* The major token value. This is the code + ** number for the token at this stack level */ + public $minor; /* The user-supplied minor token value. This + ** is the value of the token */ +} + +// line 11 "../smarty/lexer/smarty_internal_templateparser.y" + +/** + * Smarty Template Parser Class + * + * This is the template parser. + * It is generated from the smarty_internal_templateparser.y file + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Templateparser +{ + // line 23 "../smarty/lexer/smarty_internal_templateparser.y" + const ERR1 = 'Security error: Call to private object member not allowed'; + const ERR2 = 'Security error: Call to dynamic object member not allowed'; + const ERR3 = 'PHP in template not allowed. Use SmartyBC to enable it'; + const TP_VERT = 1; + const TP_COLON = 2; + const TP_PHP = 3; + const TP_TEXT = 4; + const TP_STRIPON = 5; + const TP_STRIPOFF = 6; + const TP_LITERALSTART = 7; + const TP_LITERALEND = 8; + const TP_LITERAL = 9; + const TP_SIMPELOUTPUT = 10; + const TP_SIMPLETAG = 11; + const TP_SMARTYBLOCKCHILDPARENT = 12; + const TP_LDEL = 13; + const TP_RDEL = 14; + const TP_DOLLARID = 15; + const TP_EQUAL = 16; + const TP_ID = 17; + const TP_PTR = 18; + const TP_LDELMAKENOCACHE = 19; + const TP_LDELIF = 20; + const TP_LDELFOR = 21; + const TP_SEMICOLON = 22; + const TP_INCDEC = 23; + const TP_TO = 24; + const TP_STEP = 25; + const TP_LDELFOREACH = 26; + const TP_SPACE = 27; + const TP_AS = 28; + const TP_APTR = 29; + const TP_LDELSETFILTER = 30; + const TP_CLOSETAG = 31; + const TP_LDELSLASH = 32; + const TP_ATTR = 33; + const TP_INTEGER = 34; + const TP_COMMA = 35; + const TP_OPENP = 36; + const TP_CLOSEP = 37; + const TP_MATH = 38; + const TP_UNIMATH = 39; + const TP_ISIN = 40; + const TP_QMARK = 41; + const TP_NOT = 42; + const TP_TYPECAST = 43; + const TP_HEX = 44; + const TP_DOT = 45; + const TP_INSTANCEOF = 46; + const TP_SINGLEQUOTESTRING = 47; + const TP_DOUBLECOLON = 48; + const TP_NAMESPACE = 49; + const TP_AT = 50; + const TP_HATCH = 51; + const TP_OPENB = 52; + const TP_CLOSEB = 53; + const TP_DOLLAR = 54; + const TP_LOGOP = 55; + const TP_SLOGOP = 56; + const TP_TLOGOP = 57; + const TP_SINGLECOND = 58; + const TP_ARRAYOPEN = 59; + const TP_QUOTE = 60; + const TP_BACKTICK = 61; + const YY_NO_ACTION = 516; + const YY_ACCEPT_ACTION = 515; + const YY_ERROR_ACTION = 514; + const YY_SZ_ACTTAB = 2071; + const YY_SHIFT_USE_DFLT = -31; + const YY_SHIFT_MAX = 230; + const YY_REDUCE_USE_DFLT = -91; + const YY_REDUCE_MAX = 178; + const YYNOCODE = 110; + const YYSTACKDEPTH = 500; + const YYNSTATE = 327; + const YYNRULE = 187; + const YYERRORSYMBOL = 62; + const YYERRSYMDT = 'yy0'; + const YYFALLBACK = 0; + + public static $yy_action = array( + 251, 234, 237, 1, 144, 127, 428, 184, 199, 212, + 10, 54, 19, 175, 282, 215, 109, 389, 428, 428, + 224, 321, 223, 303, 203, 389, 13, 389, 281, 43, + 389, 428, 41, 40, 266, 225, 389, 213, 389, 194, + 389, 52, 4, 308, 301, 383, 34, 209, 222, 3, + 50, 153, 251, 234, 237, 1, 199, 131, 383, 198, + 305, 212, 10, 54, 383, 16, 199, 428, 109, 385, + 132, 18, 224, 321, 223, 222, 221, 12, 32, 428, + 116, 43, 385, 262, 41, 40, 266, 225, 385, 233, + 95, 194, 16, 52, 4, 131, 301, 252, 18, 265, + 164, 3, 50, 324, 251, 234, 237, 1, 23, 130, + 229, 198, 150, 212, 10, 54, 326, 11, 170, 284, + 109, 42, 22, 239, 224, 321, 223, 193, 221, 261, + 13, 52, 157, 43, 301, 286, 41, 40, 266, 225, + 205, 233, 5, 194, 96, 52, 4, 263, 301, 301, + 99, 349, 96, 3, 50, 199, 251, 234, 237, 1, + 238, 130, 241, 181, 349, 212, 10, 54, 382, 240, + 349, 36, 109, 185, 104, 256, 224, 321, 223, 132, + 191, 382, 13, 49, 91, 43, 12, 382, 41, 40, + 266, 225, 257, 233, 152, 194, 457, 52, 4, 457, + 301, 301, 228, 457, 282, 3, 50, 285, 251, 234, + 237, 1, 301, 131, 441, 198, 238, 212, 10, 54, + 349, 441, 325, 175, 109, 30, 349, 273, 224, 321, + 223, 20, 221, 295, 32, 211, 457, 39, 166, 49, + 41, 40, 266, 225, 87, 233, 205, 194, 279, 52, + 4, 24, 301, 204, 200, 280, 99, 3, 50, 199, + 251, 234, 237, 1, 31, 130, 96, 198, 205, 212, + 10, 54, 350, 55, 293, 207, 109, 283, 99, 96, + 224, 321, 223, 199, 180, 350, 13, 134, 230, 43, + 222, 350, 41, 40, 266, 225, 104, 233, 316, 194, + 279, 52, 4, 24, 301, 165, 284, 280, 85, 3, + 50, 25, 251, 234, 237, 1, 131, 129, 210, 198, + 14, 212, 10, 54, 269, 270, 301, 116, 109, 295, + 216, 211, 224, 321, 223, 171, 221, 95, 13, 28, + 219, 43, 323, 9, 41, 40, 266, 225, 151, 233, + 324, 194, 52, 52, 4, 301, 301, 30, 282, 302, + 178, 3, 50, 7, 251, 234, 237, 1, 136, 130, + 304, 179, 238, 212, 10, 54, 279, 175, 282, 24, + 109, 238, 429, 280, 224, 321, 223, 177, 221, 270, + 13, 255, 281, 43, 429, 49, 41, 40, 266, 225, + 275, 233, 318, 194, 49, 52, 4, 276, 301, 163, + 26, 199, 8, 3, 50, 119, 251, 234, 237, 1, + 11, 93, 291, 51, 107, 212, 10, 54, 226, 428, + 206, 201, 109, 148, 178, 322, 224, 321, 223, 441, + 221, 428, 13, 282, 9, 43, 441, 115, 41, 40, + 266, 225, 167, 233, 227, 194, 457, 52, 4, 457, + 301, 96, 158, 457, 101, 3, 50, 271, 251, 234, + 237, 1, 282, 130, 235, 186, 135, 212, 10, 54, + 199, 37, 119, 315, 109, 165, 284, 176, 224, 321, + 223, 104, 221, 149, 13, 281, 146, 43, 281, 300, + 41, 40, 266, 225, 30, 233, 289, 194, 21, 52, + 4, 272, 301, 211, 18, 301, 161, 3, 50, 110, + 251, 234, 237, 1, 137, 128, 282, 198, 268, 212, + 10, 54, 222, 169, 515, 92, 109, 172, 284, 31, + 224, 321, 223, 29, 221, 238, 6, 260, 53, 43, + 232, 139, 41, 40, 266, 225, 154, 233, 178, 194, + 168, 52, 4, 214, 301, 145, 99, 33, 49, 3, + 50, 245, 208, 211, 320, 282, 90, 111, 311, 183, + 98, 70, 309, 297, 236, 178, 95, 319, 142, 258, + 247, 267, 249, 264, 250, 195, 231, 199, 246, 324, + 317, 253, 254, 259, 126, 137, 133, 251, 234, 237, + 1, 326, 290, 105, 143, 156, 212, 10, 54, 88, + 84, 83, 484, 109, 322, 282, 37, 224, 321, 223, + 245, 208, 211, 320, 281, 90, 111, 298, 182, 98, + 56, 245, 298, 211, 178, 95, 103, 147, 258, 197, + 102, 75, 141, 250, 195, 231, 95, 246, 324, 258, + 279, 242, 89, 24, 250, 195, 231, 280, 246, 324, + 298, 298, 298, 298, 298, 298, 298, 16, 298, 192, + 277, 298, 298, 18, 294, 44, 45, 38, 298, 298, + 251, 234, 237, 2, 298, 296, 298, 298, 298, 212, + 10, 54, 310, 312, 313, 314, 109, 162, 298, 298, + 224, 321, 223, 298, 298, 298, 294, 282, 298, 42, + 22, 239, 251, 234, 237, 2, 298, 296, 298, 298, + 298, 212, 10, 54, 298, 159, 298, 298, 109, 298, + 298, 17, 224, 321, 223, 282, 298, 42, 22, 239, + 298, 298, 245, 298, 211, 278, 298, 103, 111, 298, + 183, 98, 70, 298, 298, 298, 298, 95, 298, 298, + 258, 298, 292, 17, 298, 250, 195, 231, 279, 246, + 324, 24, 298, 395, 245, 280, 211, 298, 298, 103, + 298, 298, 197, 102, 75, 16, 298, 140, 298, 95, + 298, 18, 258, 298, 298, 298, 298, 250, 195, 231, + 298, 246, 324, 298, 298, 298, 298, 428, 298, 395, + 395, 395, 202, 277, 298, 245, 298, 211, 298, 428, + 103, 298, 298, 197, 120, 69, 395, 395, 395, 395, + 95, 298, 298, 258, 298, 298, 298, 160, 250, 195, + 231, 86, 246, 324, 245, 16, 211, 282, 298, 103, + 196, 18, 197, 120, 69, 298, 44, 45, 38, 95, + 298, 298, 258, 298, 298, 298, 178, 250, 195, 231, + 298, 246, 324, 310, 312, 313, 314, 298, 298, 190, + 245, 298, 211, 298, 298, 103, 298, 298, 197, 102, + 75, 298, 298, 298, 298, 95, 298, 298, 258, 298, + 298, 298, 298, 250, 195, 231, 298, 246, 324, 298, + 298, 298, 245, 298, 211, 298, 199, 100, 298, 288, + 197, 120, 47, 298, 106, 298, 298, 95, 298, 353, + 258, 155, 298, 218, 298, 250, 195, 231, 298, 246, + 324, 282, 16, 42, 22, 239, 298, 245, 18, 211, + 298, 428, 103, 298, 298, 197, 120, 69, 298, 298, + 298, 298, 95, 428, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 100, 189, 298, 197, 120, 59, 245, 207, 211, + 298, 95, 103, 298, 258, 197, 120, 81, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 120, 80, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 67, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 120, 57, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 120, 58, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 82, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 97, 76, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 120, 71, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 187, 120, 61, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 120, 63, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 94, 79, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 59, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 120, 77, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 188, 108, 64, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 65, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 97, 66, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 120, 68, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 62, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 120, 60, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 120, 74, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 72, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 120, 48, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 120, 46, 298, 298, + 298, 298, 95, 298, 298, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 120, 78, 245, 298, 211, + 298, 95, 103, 298, 258, 197, 120, 73, 298, 250, + 195, 231, 95, 246, 324, 258, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 125, 298, 298, 298, + 298, 298, 95, 298, 298, 298, 298, 298, 298, 244, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 114, 298, 245, 298, 211, + 298, 95, 103, 298, 298, 197, 122, 298, 243, 250, + 195, 231, 95, 246, 324, 298, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 117, 298, 298, 298, + 298, 298, 95, 298, 298, 298, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 121, 298, 245, 298, 211, + 298, 95, 103, 298, 298, 197, 124, 298, 298, 250, + 195, 231, 95, 246, 324, 298, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 298, 245, 298, 211, + 298, 298, 103, 298, 298, 197, 118, 298, 298, 298, + 298, 298, 95, 298, 298, 298, 298, 298, 298, 298, + 250, 195, 231, 298, 246, 324, 245, 298, 211, 298, + 298, 103, 298, 298, 197, 123, 298, 245, 298, 211, + 298, 95, 103, 298, 298, 197, 113, 298, 298, 250, + 195, 231, 95, 246, 324, 298, 298, 298, 298, 298, + 250, 195, 231, 220, 246, 324, 298, 27, 298, 16, + 298, 457, 298, 298, 457, 18, 298, 26, 457, 441, + 44, 45, 38, 217, 44, 45, 38, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 310, 312, 313, + 314, 310, 312, 313, 314, 298, 441, 298, 298, 441, + 298, 457, 220, 441, 457, 298, 298, 457, 298, 298, + 457, 457, 441, 457, 298, 298, 220, 457, 441, 298, + 298, 298, 298, 298, 457, 298, 298, 457, 298, 298, + 5, 457, 441, 298, 298, 298, 298, 298, 298, 441, + 298, 298, 441, 298, 457, 441, 441, 298, 441, 298, + 457, 298, 441, 306, 298, 298, 298, 298, 298, 441, + 298, 298, 441, 298, 457, 220, 441, 298, 298, 298, + 298, 298, 298, 457, 298, 298, 457, 298, 298, 15, + 457, 441, 35, 274, 44, 45, 38, 457, 298, 298, + 457, 298, 298, 298, 457, 441, 298, 298, 298, 298, + 298, 310, 312, 313, 314, 298, 298, 298, 441, 298, + 298, 441, 298, 457, 298, 441, 287, 298, 44, 45, + 38, 298, 441, 298, 298, 441, 298, 457, 298, 441, + 248, 298, 298, 298, 298, 310, 312, 313, 314, 298, + 44, 45, 38, 298, 298, 112, 298, 44, 45, 38, + 298, 173, 298, 298, 44, 45, 38, 310, 312, 313, + 314, 44, 45, 38, 310, 312, 313, 314, 298, 298, + 299, 310, 312, 313, 314, 44, 45, 38, 310, 312, + 313, 314, 174, 298, 298, 298, 138, 298, 298, 298, + 298, 298, 310, 312, 313, 314, 44, 45, 38, 298, + 298, 298, 44, 45, 38, 298, 44, 45, 38, 298, + 44, 45, 38, 310, 312, 313, 314, 307, 298, 310, + 312, 313, 314, 310, 312, 313, 314, 310, 312, 313, + 314, + ); + + public static $yy_lookahead = array( + 10, 11, 12, 13, 74, 15, 36, 17, 1, 19, + 20, 21, 29, 103, 84, 45, 26, 14, 48, 36, + 30, 31, 32, 53, 34, 22, 36, 24, 98, 39, + 27, 48, 42, 43, 44, 45, 33, 47, 35, 49, + 37, 51, 52, 53, 54, 14, 16, 16, 45, 59, + 60, 96, 10, 11, 12, 13, 1, 15, 27, 17, + 53, 19, 20, 21, 33, 27, 1, 36, 26, 14, + 45, 33, 30, 31, 32, 45, 34, 52, 36, 48, + 72, 39, 27, 75, 42, 43, 44, 45, 33, 47, + 82, 49, 27, 51, 52, 15, 54, 17, 33, 91, + 83, 59, 60, 95, 10, 11, 12, 13, 13, 15, + 15, 17, 17, 19, 20, 21, 97, 35, 99, 100, + 26, 86, 87, 88, 30, 31, 32, 66, 34, 49, + 36, 51, 96, 39, 54, 53, 42, 43, 44, 45, + 72, 47, 16, 49, 18, 51, 52, 79, 54, 54, + 82, 14, 18, 59, 60, 1, 10, 11, 12, 13, + 23, 15, 15, 17, 27, 19, 20, 21, 14, 17, + 33, 13, 26, 15, 48, 17, 30, 31, 32, 45, + 34, 27, 36, 46, 83, 39, 52, 33, 42, 43, + 44, 45, 34, 47, 74, 49, 10, 51, 52, 13, + 54, 54, 50, 17, 84, 59, 60, 14, 10, 11, + 12, 13, 54, 15, 45, 17, 23, 19, 20, 21, + 27, 52, 100, 103, 26, 35, 33, 37, 30, 31, + 32, 22, 34, 67, 36, 69, 50, 39, 83, 46, + 42, 43, 44, 45, 35, 47, 72, 49, 10, 51, + 52, 13, 54, 79, 80, 17, 82, 59, 60, 1, + 10, 11, 12, 13, 16, 15, 18, 17, 72, 19, + 20, 21, 14, 107, 108, 79, 26, 71, 82, 18, + 30, 31, 32, 1, 34, 27, 36, 15, 50, 39, + 45, 33, 42, 43, 44, 45, 48, 47, 53, 49, + 10, 51, 52, 13, 54, 99, 100, 17, 36, 59, + 60, 29, 10, 11, 12, 13, 15, 15, 17, 17, + 13, 19, 20, 21, 8, 9, 54, 72, 26, 67, + 75, 69, 30, 31, 32, 78, 34, 82, 36, 24, + 50, 39, 17, 36, 42, 43, 44, 45, 74, 47, + 95, 49, 51, 51, 52, 54, 54, 35, 84, 37, + 103, 59, 60, 36, 10, 11, 12, 13, 74, 15, + 108, 17, 23, 19, 20, 21, 10, 103, 84, 13, + 26, 23, 36, 17, 30, 31, 32, 7, 34, 9, + 36, 17, 98, 39, 48, 46, 42, 43, 44, 45, + 17, 47, 53, 49, 46, 51, 52, 93, 54, 78, + 16, 1, 36, 59, 60, 101, 10, 11, 12, 13, + 35, 15, 37, 17, 48, 19, 20, 21, 18, 36, + 65, 66, 26, 74, 103, 104, 30, 31, 32, 45, + 34, 48, 36, 84, 36, 39, 52, 17, 42, 43, + 44, 45, 15, 47, 17, 49, 10, 51, 52, 13, + 54, 18, 74, 17, 82, 59, 60, 34, 10, 11, + 12, 13, 84, 15, 93, 17, 15, 19, 20, 21, + 1, 2, 101, 101, 26, 99, 100, 17, 30, 31, + 32, 48, 34, 96, 36, 98, 96, 39, 98, 71, + 42, 43, 44, 45, 35, 47, 37, 49, 27, 51, + 52, 67, 54, 69, 33, 54, 74, 59, 60, 17, + 10, 11, 12, 13, 96, 15, 84, 17, 34, 19, + 20, 21, 45, 78, 63, 64, 26, 99, 100, 16, + 30, 31, 32, 16, 34, 23, 36, 17, 17, 39, + 23, 51, 42, 43, 44, 45, 72, 47, 103, 49, + 78, 51, 52, 17, 54, 74, 82, 41, 46, 59, + 60, 67, 68, 69, 70, 84, 72, 73, 53, 75, + 76, 77, 53, 61, 15, 103, 82, 14, 51, 85, + 14, 37, 17, 8, 90, 91, 92, 1, 94, 95, + 3, 4, 5, 6, 7, 96, 82, 10, 11, 12, + 13, 97, 84, 81, 96, 74, 19, 20, 21, 78, + 82, 82, 1, 26, 104, 84, 2, 30, 31, 32, + 67, 68, 69, 70, 98, 72, 73, 109, 75, 76, + 77, 67, 109, 69, 103, 82, 72, 96, 85, 75, + 76, 77, 96, 90, 91, 92, 82, 94, 95, 85, + 10, 14, 96, 13, 90, 91, 92, 17, 94, 95, + 109, 109, 109, 109, 109, 109, 109, 27, 109, 105, + 106, 109, 109, 33, 4, 38, 39, 40, 109, 109, + 10, 11, 12, 13, 109, 15, 109, 109, 109, 19, + 20, 21, 55, 56, 57, 58, 26, 74, 109, 109, + 30, 31, 32, 109, 109, 109, 4, 84, 109, 86, + 87, 88, 10, 11, 12, 13, 109, 15, 109, 109, + 109, 19, 20, 21, 109, 74, 109, 109, 26, 109, + 60, 61, 30, 31, 32, 84, 109, 86, 87, 88, + 109, 109, 67, 109, 69, 70, 109, 72, 73, 109, + 75, 76, 77, 109, 109, 109, 109, 82, 109, 109, + 85, 109, 60, 61, 109, 90, 91, 92, 10, 94, + 95, 13, 109, 2, 67, 17, 69, 109, 109, 72, + 109, 109, 75, 76, 77, 27, 109, 29, 109, 82, + 109, 33, 85, 109, 109, 109, 109, 90, 91, 92, + 109, 94, 95, 109, 109, 109, 109, 36, 109, 38, + 39, 40, 105, 106, 109, 67, 109, 69, 109, 48, + 72, 109, 109, 75, 76, 77, 55, 56, 57, 58, + 82, 109, 109, 85, 109, 109, 109, 74, 90, 91, + 92, 78, 94, 95, 67, 27, 69, 84, 109, 72, + 102, 33, 75, 76, 77, 109, 38, 39, 40, 82, + 109, 109, 85, 109, 109, 109, 103, 90, 91, 92, + 109, 94, 95, 55, 56, 57, 58, 109, 109, 102, + 67, 109, 69, 109, 109, 72, 109, 109, 75, 76, + 77, 109, 109, 109, 109, 82, 109, 109, 85, 109, + 109, 109, 109, 90, 91, 92, 109, 94, 95, 109, + 109, 109, 67, 109, 69, 109, 1, 72, 109, 106, + 75, 76, 77, 109, 79, 109, 109, 82, 109, 14, + 85, 74, 109, 18, 109, 90, 91, 92, 109, 94, + 95, 84, 27, 86, 87, 88, 109, 67, 33, 69, + 109, 36, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 48, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 102, 109, 75, 76, 77, 67, 79, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 77, 109, 109, + 109, 109, 82, 109, 109, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 77, 67, 109, 69, + 109, 82, 72, 109, 85, 75, 76, 77, 109, 90, + 91, 92, 82, 94, 95, 85, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 109, 109, 109, + 109, 109, 82, 109, 109, 109, 109, 109, 109, 89, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 109, 67, 109, 69, + 109, 82, 72, 109, 109, 75, 76, 109, 89, 90, + 91, 92, 82, 94, 95, 109, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 109, 109, 109, + 109, 109, 82, 109, 109, 109, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 109, 67, 109, 69, + 109, 82, 72, 109, 109, 75, 76, 109, 109, 90, + 91, 92, 82, 94, 95, 109, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 109, 67, 109, 69, + 109, 109, 72, 109, 109, 75, 76, 109, 109, 109, + 109, 109, 82, 109, 109, 109, 109, 109, 109, 109, + 90, 91, 92, 109, 94, 95, 67, 109, 69, 109, + 109, 72, 109, 109, 75, 76, 109, 67, 109, 69, + 109, 82, 72, 109, 109, 75, 76, 109, 109, 90, + 91, 92, 82, 94, 95, 109, 109, 109, 109, 109, + 90, 91, 92, 2, 94, 95, 109, 25, 109, 27, + 109, 10, 109, 109, 13, 33, 109, 16, 17, 18, + 38, 39, 40, 37, 38, 39, 40, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 55, 56, 57, + 58, 55, 56, 57, 58, 109, 45, 109, 109, 48, + 109, 50, 2, 52, 10, 109, 109, 13, 109, 109, + 10, 17, 18, 13, 109, 109, 2, 17, 18, 109, + 109, 109, 109, 109, 10, 109, 109, 13, 109, 109, + 16, 17, 18, 109, 109, 109, 109, 109, 109, 45, + 109, 109, 48, 109, 50, 45, 52, 109, 48, 109, + 50, 109, 52, 53, 109, 109, 109, 109, 109, 45, + 109, 109, 48, 109, 50, 2, 52, 109, 109, 109, + 109, 109, 109, 10, 109, 109, 13, 109, 109, 2, + 17, 18, 2, 37, 38, 39, 40, 10, 109, 109, + 13, 109, 109, 109, 17, 18, 109, 109, 109, 109, + 109, 55, 56, 57, 58, 109, 109, 109, 45, 109, + 109, 48, 109, 50, 109, 52, 14, 109, 38, 39, + 40, 109, 45, 109, 109, 48, 109, 50, 109, 52, + 14, 109, 109, 109, 109, 55, 56, 57, 58, 109, + 38, 39, 40, 109, 109, 22, 109, 38, 39, 40, + 109, 14, 109, 109, 38, 39, 40, 55, 56, 57, + 58, 38, 39, 40, 55, 56, 57, 58, 109, 109, + 61, 55, 56, 57, 58, 38, 39, 40, 55, 56, + 57, 58, 14, 109, 109, 109, 28, 109, 109, 109, + 109, 109, 55, 56, 57, 58, 38, 39, 40, 109, + 109, 109, 38, 39, 40, 109, 38, 39, 40, 109, + 38, 39, 40, 55, 56, 57, 58, 53, 109, 55, + 56, 57, 58, 55, 56, 57, 58, 55, 56, 57, + 58, + ); + + public static $yy_shift_ofst = array( + -31, 406, 406, 458, 458, 94, 510, 94, 94, 94, + 510, 458, -10, 94, 94, 354, 146, 94, 94, 94, + 94, 146, 94, 94, 94, 94, 250, 94, 94, 94, + 94, 94, 94, 302, 94, 94, 94, 198, 42, 42, + 42, 42, 42, 42, 42, 42, 1772, 828, 828, 80, + 712, 925, 301, 65, 272, 680, 1942, 1920, 1886, 1776, + 647, 1949, 1977, 2008, 2004, 1963, 1998, 1956, 2012, 2012, + 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, + 2012, 2012, 2012, 768, 650, 272, 65, 272, 65, 134, + 126, 479, 597, 1854, 154, 290, 95, 55, 258, 366, + 248, 366, 282, 443, 437, 38, 38, 437, 7, 481, + 410, 38, 461, 621, 596, 596, 261, 596, 596, 261, + 596, 596, 596, 596, 596, -31, -31, 1840, 1791, 1917, + 1903, 1834, 158, 238, 394, 446, 38, 25, 147, 169, + 147, 25, 169, 25, 38, 38, 25, 25, 38, 25, + 307, 38, 38, 25, 527, 38, 38, 25, 38, 38, + 38, 38, 38, 596, 624, 261, 624, 327, 596, 596, + 261, 596, 261, -31, -31, -31, -31, -31, -31, 781, + 3, 31, 193, 137, -30, 186, -17, 522, 349, 469, + 322, 30, 82, 316, 346, 376, 190, 358, 393, 152, + 209, 380, 385, 245, 315, 523, 585, 554, 576, 575, + 537, 573, 569, 529, 525, 546, 500, 526, 531, 325, + 530, 487, 494, 502, 470, 433, 430, 408, 383, 327, + 374, + ); + + public static $yy_reduce_ofst = array( + 471, 504, 563, 717, 574, 685, 919, 890, 787, 758, + 855, 823, 1240, 1199, 1140, 1100, 1070, 1129, 1170, 1210, + 1269, 1280, 1310, 1339, 1350, 1380, 1409, 1420, 1450, 1479, + 1490, 1059, 1030, 1000, 930, 960, 989, 1520, 1549, 1700, + 1619, 1689, 1660, 1630, 1590, 1560, 633, 661, 867, 8, + 166, 773, 255, 541, 174, 262, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 294, -70, 196, 120, 68, 274, 19, + 206, 331, 444, 428, 257, 400, 382, 257, 257, 400, + 386, 397, 257, 386, 381, 388, 359, 314, 257, 442, + 482, 491, 484, 257, 257, 455, 386, 257, 257, 438, + 257, 257, 257, 257, 257, 257, 365, 509, 509, 509, + 509, 509, 524, 536, 509, 509, 528, 514, 539, 551, + 538, 514, 556, 514, 528, 528, 514, 514, 528, 514, + 518, 528, 528, 514, 532, 528, 528, 514, 528, 528, + 528, 528, 528, -90, 520, 122, 520, 566, -90, -90, + 122, -90, 122, -45, 36, 155, 101, 61, 17, + ); + + public static $yyExpectedTokens = array( + array(), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 53, 54, 59, + 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array( + 10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60, + ), + array(25, 27, 33, 38, 39, 40, 55, 56, 57, 58,), + array(27, 33, 38, 39, 40, 55, 56, 57, 58,), + array(27, 33, 38, 39, 40, 55, 56, 57, 58,), + array(15, 17, 49, 51, 54,), + array(4, 10, 11, 12, 13, 15, 19, 20, 21, 26, 30, 31, 32, 60, 61,), + array(1, 14, 18, 27, 33, 36, 48,), + array(15, 17, 51, 54,), + array(1, 27, 33,), + array(15, 36, 54,), + array(4, 10, 11, 12, 13, 15, 19, 20, 21, 26, 30, 31, 32, 60, 61,), + array(14, 38, 39, 40, 55, 56, 57, 58,), + array(2, 38, 39, 40, 55, 56, 57, 58,), + array(37, 38, 39, 40, 55, 56, 57, 58,), + array(37, 38, 39, 40, 55, 56, 57, 58,), + array(14, 38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58, 61,), + array(14, 38, 39, 40, 55, 56, 57, 58,), + array(14, 38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 53, 55, 56, 57, 58,), + array(22, 38, 39, 40, 55, 56, 57, 58,), + array(28, 38, 39, 40, 55, 56, 57, 58,), + array(14, 38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(38, 39, 40, 55, 56, 57, 58,), + array(10, 13, 17, 27, 29, 33,), + array(10, 13, 17, 27, 33,), + array(15, 36, 54,), + array(1, 27, 33,), + array(15, 36, 54,), + array(1, 27, 33,), + array(18, 45, 52,), + array(16, 18, 48,), + array(1, 2,), + array(3, 4, 5, 6, 7, 10, 11, 12, 13, 19, 20, 21, 26, 30, 31, 32,), + array(2, 10, 13, 16, 17, 18, 45, 48, 50, 52,), + array(1, 14, 27, 33,), + array(10, 13, 17, 50,), + array(13, 15, 17, 54,), + array(1, 14, 27, 33,), + array(1, 14, 27, 33,), + array(10, 13, 17,), + array(16, 18, 48,), + array(10, 13, 17,), + array(1, 29,), + array(18, 48,), + array(15, 17,), + array(27, 33,), + array(27, 33,), + array(15, 17,), + array(1, 53,), + array(27, 33,), + array(1, 18,), + array(27, 33,), + array(15, 54,), + array(1,), + array(1,), + array(1,), + array(18,), + array(1,), + array(1,), + array(18,), + array(1,), + array(1,), + array(1,), + array(1,), + array(1,), + array(), + array(), + array(2, 10, 13, 17, 18, 45, 48, 50, 52, 53,), + array(2, 10, 13, 16, 17, 18, 45, 48, 50, 52,), + array(2, 10, 13, 17, 18, 45, 48, 50, 52,), + array(2, 10, 13, 17, 18, 45, 48, 50, 52,), + array(10, 13, 17, 18, 45, 48, 50, 52,), + array(13, 15, 17, 34, 54,), + array(10, 13, 17, 50,), + array(16, 45, 52,), + array(10, 13, 17,), + array(27, 33,), + array(45, 52,), + array(15, 54,), + array(45, 52,), + array(15, 54,), + array(45, 52,), + array(45, 52,), + array(45, 52,), + array(27, 33,), + array(27, 33,), + array(45, 52,), + array(45, 52,), + array(27, 33,), + array(45, 52,), + array(13, 36,), + array(27, 33,), + array(27, 33,), + array(45, 52,), + array(16, 23,), + array(27, 33,), + array(27, 33,), + array(45, 52,), + array(27, 33,), + array(27, 33,), + array(27, 33,), + array(27, 33,), + array(27, 33,), + array(1,), + array(2,), + array(18,), + array(2,), + array(36,), + array(1,), + array(1,), + array(18,), + array(1,), + array(18,), + array(), + array(), + array(), + array(), + array(), + array(), + array(2, 36, 38, 39, 40, 48, 55, 56, 57, 58,), + array(14, 22, 24, 27, 33, 35, 37, 45,), + array(14, 16, 27, 33, 36, 48,), + array(14, 23, 27, 33, 46,), + array(14, 23, 27, 33, 46,), + array(36, 45, 48, 53,), + array(10, 13, 17, 50,), + array(29, 36, 48,), + array(23, 46, 61,), + array(23, 46, 53,), + array(35, 37,), + array(35, 37,), + array(16, 45,), + array(35, 53,), + array(8, 9,), + array(36, 48,), + array(36, 48,), + array(35, 37,), + array(23, 46,), + array(36, 48,), + array(17, 50,), + array(22, 35,), + array(7, 9,), + array(35, 37,), + array(45, 53,), + array(24,), + array(16,), + array(8,), + array(37,), + array(14,), + array(17,), + array(51,), + array(14,), + array(15,), + array(53,), + array(53,), + array(17,), + array(51,), + array(41,), + array(17,), + array(17,), + array(17,), + array(45,), + array(34,), + array(17,), + array(17,), + array(34,), + array(17,), + array(36,), + array(17,), + array(36,), + array(17,), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + ); + + public static $yy_default = array( + 338, 514, 514, 499, 499, 514, 514, 476, 476, 476, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 379, 358, 379, 514, + 514, 415, 514, 379, 514, 514, 351, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 384, 514, 399, 475, + 351, 403, 390, 474, 500, 502, 384, 501, 363, 381, + 404, 386, 391, 379, 379, 514, 379, 514, 379, 489, + 431, 370, 327, 430, 393, 441, 514, 393, 393, 441, + 431, 441, 393, 431, 514, 379, 360, 514, 393, 379, + 373, 379, 514, 406, 402, 375, 431, 396, 398, 486, + 393, 408, 397, 407, 406, 483, 336, 430, 430, 430, + 430, 430, 514, 443, 457, 441, 367, 438, 514, 436, + 514, 435, 434, 466, 368, 348, 439, 437, 361, 467, + 441, 356, 354, 468, 514, 366, 355, 469, 362, 359, + 352, 369, 365, 371, 478, 463, 477, 441, 374, 376, + 490, 424, 487, 441, 441, 482, 482, 336, 482, 415, + 411, 415, 405, 405, 415, 442, 415, 405, 405, 514, + 514, 411, 514, 514, 425, 514, 514, 405, 415, 514, + 514, 334, 514, 411, 387, 514, 514, 514, 514, 514, + 514, 514, 514, 420, 514, 514, 514, 417, 514, 514, + 514, 411, 413, 514, 514, 514, 514, 488, 514, 457, + 514, 421, 364, 420, 340, 422, 357, 341, 409, 400, + 480, 457, 462, 401, 485, 423, 426, 342, 447, 380, + 416, 339, 428, 329, 330, 444, 445, 446, 394, 331, + 395, 429, 419, 388, 332, 418, 410, 392, 412, 333, + 335, 414, 337, 472, 417, 479, 427, 497, 347, 461, + 460, 459, 378, 346, 464, 510, 495, 511, 498, 473, + 377, 496, 503, 506, 513, 512, 509, 507, 504, 508, + 345, 458, 471, 448, 505, 454, 452, 455, 456, 450, + 491, 449, 492, 493, 494, 470, 451, 328, 453, 343, + 344, 372, 481, 432, 433, 465, 440, + ); + + public static $yyFallback = array(); + + public static $yyRuleName = array( + 'start ::= template', + 'template ::= template PHP', + 'template ::= template TEXT', + 'template ::= template STRIPON', + 'template ::= template STRIPOFF', + 'template ::= template LITERALSTART literal_e2 LITERALEND', + 'literal_e2 ::= literal_e1 LITERALSTART literal_e1 LITERALEND', + 'literal_e2 ::= literal_e1', + 'literal_e1 ::= literal_e1 LITERAL', + 'literal_e1 ::=', + 'template ::= template smartytag', + 'template ::=', + 'smartytag ::= SIMPELOUTPUT', + 'smartytag ::= SIMPLETAG', + 'smartytag ::= SMARTYBLOCKCHILDPARENT', + 'smartytag ::= LDEL tagbody RDEL', + 'smartytag ::= tag RDEL', + 'tagbody ::= outattr', + 'tagbody ::= DOLLARID eqoutattr', + 'tagbody ::= varindexed eqoutattr', + 'eqoutattr ::= EQUAL outattr', + 'outattr ::= output attributes', + 'output ::= variable', + 'output ::= value', + 'output ::= expr', + 'tag ::= LDEL ID attributes', + 'tag ::= LDEL ID', + 'tag ::= LDEL ID modifierlist attributes', + 'tag ::= LDEL ID PTR ID attributes', + 'tag ::= LDEL ID PTR ID modifierlist attributes', + 'tag ::= LDELMAKENOCACHE DOLLARID', + 'tag ::= LDELIF expr', + 'tag ::= LDELIF expr attributes', + 'tag ::= LDELIF statement', + 'tag ::= LDELIF statement attributes', + 'tag ::= LDELFOR statements SEMICOLON expr SEMICOLON varindexed foraction attributes', + 'foraction ::= EQUAL expr', + 'foraction ::= INCDEC', + 'tag ::= LDELFOR statement TO expr attributes', + 'tag ::= LDELFOR statement TO expr STEP expr attributes', + 'tag ::= LDELFOREACH SPACE expr AS varvar attributes', + 'tag ::= LDELFOREACH SPACE expr AS varvar APTR varvar attributes', + 'tag ::= LDELFOREACH attributes', + 'tag ::= LDELSETFILTER ID modparameters', + 'tag ::= LDELSETFILTER ID modparameters modifierlist', + 'smartytag ::= CLOSETAG', + 'tag ::= LDELSLASH ID', + 'tag ::= LDELSLASH ID modifierlist', + 'tag ::= LDELSLASH ID PTR ID', + 'tag ::= LDELSLASH ID PTR ID modifierlist', + 'attributes ::= attributes attribute', + 'attributes ::= attribute', + 'attributes ::=', + 'attribute ::= SPACE ID EQUAL ID', + 'attribute ::= ATTR expr', + 'attribute ::= ATTR value', + 'attribute ::= SPACE ID', + 'attribute ::= SPACE expr', + 'attribute ::= SPACE value', + 'attribute ::= SPACE INTEGER EQUAL expr', + 'statements ::= statement', + 'statements ::= statements COMMA statement', + 'statement ::= DOLLARID EQUAL INTEGER', + 'statement ::= DOLLARID EQUAL expr', + 'statement ::= varindexed EQUAL expr', + 'statement ::= OPENP statement CLOSEP', + 'expr ::= value', + 'expr ::= ternary', + 'expr ::= DOLLARID COLON ID', + 'expr ::= expr MATH value', + 'expr ::= expr UNIMATH value', + 'expr ::= expr tlop value', + 'expr ::= expr lop expr', + 'expr ::= expr scond', + 'expr ::= expr ISIN array', + 'expr ::= expr ISIN value', + 'ternary ::= OPENP expr CLOSEP QMARK DOLLARID COLON expr', + 'ternary ::= OPENP expr CLOSEP QMARK expr COLON expr', + 'value ::= variable', + 'value ::= UNIMATH value', + 'value ::= NOT value', + 'value ::= TYPECAST value', + 'value ::= variable INCDEC', + 'value ::= HEX', + 'value ::= INTEGER', + 'value ::= INTEGER DOT INTEGER', + 'value ::= INTEGER DOT', + 'value ::= DOT INTEGER', + 'value ::= ID', + 'value ::= function', + 'value ::= OPENP expr CLOSEP', + 'value ::= variable INSTANCEOF ns1', + 'value ::= variable INSTANCEOF variable', + 'value ::= SINGLEQUOTESTRING', + 'value ::= doublequoted_with_quotes', + 'value ::= varindexed DOUBLECOLON static_class_access', + 'value ::= smartytag', + 'value ::= value modifierlist', + 'value ::= NAMESPACE', + 'value ::= arraydef', + 'value ::= ns1 DOUBLECOLON static_class_access', + 'ns1 ::= ID', + 'ns1 ::= NAMESPACE', + 'variable ::= DOLLARID', + 'variable ::= varindexed', + 'variable ::= varvar AT ID', + 'variable ::= object', + 'variable ::= HATCH ID HATCH', + 'variable ::= HATCH ID HATCH arrayindex', + 'variable ::= HATCH variable HATCH', + 'variable ::= HATCH variable HATCH arrayindex', + 'varindexed ::= DOLLARID arrayindex', + 'varindexed ::= varvar arrayindex', + 'arrayindex ::= arrayindex indexdef', + 'arrayindex ::=', + 'indexdef ::= DOT DOLLARID', + 'indexdef ::= DOT varvar', + 'indexdef ::= DOT varvar AT ID', + 'indexdef ::= DOT ID', + 'indexdef ::= DOT INTEGER', + 'indexdef ::= DOT LDEL expr RDEL', + 'indexdef ::= OPENB ID CLOSEB', + 'indexdef ::= OPENB ID DOT ID CLOSEB', + 'indexdef ::= OPENB SINGLEQUOTESTRING CLOSEB', + 'indexdef ::= OPENB INTEGER CLOSEB', + 'indexdef ::= OPENB DOLLARID CLOSEB', + 'indexdef ::= OPENB variable CLOSEB', + 'indexdef ::= OPENB value CLOSEB', + 'indexdef ::= OPENB expr CLOSEB', + 'indexdef ::= OPENB CLOSEB', + 'varvar ::= DOLLARID', + 'varvar ::= DOLLAR', + 'varvar ::= varvar varvarele', + 'varvarele ::= ID', + 'varvarele ::= SIMPELOUTPUT', + 'varvarele ::= LDEL expr RDEL', + 'object ::= varindexed objectchain', + 'objectchain ::= objectelement', + 'objectchain ::= objectchain objectelement', + 'objectelement ::= PTR ID arrayindex', + 'objectelement ::= PTR varvar arrayindex', + 'objectelement ::= PTR LDEL expr RDEL arrayindex', + 'objectelement ::= PTR ID LDEL expr RDEL arrayindex', + 'objectelement ::= PTR method', + 'function ::= ns1 OPENP params CLOSEP', + 'method ::= ID OPENP params CLOSEP', + 'method ::= DOLLARID OPENP params CLOSEP', + 'params ::= params COMMA expr', + 'params ::= expr', + 'params ::=', + 'modifierlist ::= modifierlist modifier modparameters', + 'modifierlist ::= modifier modparameters', + 'modifier ::= VERT AT ID', + 'modifier ::= VERT ID', + 'modparameters ::= modparameters modparameter', + 'modparameters ::=', + 'modparameter ::= COLON value', + 'modparameter ::= COLON UNIMATH value', + 'modparameter ::= COLON array', + 'static_class_access ::= method', + 'static_class_access ::= method objectchain', + 'static_class_access ::= ID', + 'static_class_access ::= DOLLARID arrayindex', + 'static_class_access ::= DOLLARID arrayindex objectchain', + 'lop ::= LOGOP', + 'lop ::= SLOGOP', + 'tlop ::= TLOGOP', + 'scond ::= SINGLECOND', + 'arraydef ::= OPENB arrayelements CLOSEB', + 'arraydef ::= ARRAYOPEN arrayelements CLOSEP', + 'arrayelements ::= arrayelement', + 'arrayelements ::= arrayelements COMMA arrayelement', + 'arrayelements ::=', + 'arrayelement ::= value APTR expr', + 'arrayelement ::= ID APTR expr', + 'arrayelement ::= expr', + 'doublequoted_with_quotes ::= QUOTE QUOTE', + 'doublequoted_with_quotes ::= QUOTE doublequoted QUOTE', + 'doublequoted ::= doublequoted doublequotedcontent', + 'doublequoted ::= doublequotedcontent', + 'doublequotedcontent ::= BACKTICK variable BACKTICK', + 'doublequotedcontent ::= BACKTICK expr BACKTICK', + 'doublequotedcontent ::= DOLLARID', + 'doublequotedcontent ::= LDEL variable RDEL', + 'doublequotedcontent ::= LDEL expr RDEL', + 'doublequotedcontent ::= smartytag', + 'doublequotedcontent ::= TEXT', + ); + + public static $yyRuleInfo = array( + array(0 => 63, 1 => 1), + array(0 => 64, 1 => 2), + array(0 => 64, 1 => 2), + array(0 => 64, 1 => 2), + array(0 => 64, 1 => 2), + array(0 => 64, 1 => 4), + array(0 => 65, 1 => 4), + array(0 => 65, 1 => 1), + array(0 => 66, 1 => 2), + array(0 => 66, 1 => 0), + array(0 => 64, 1 => 2), + array(0 => 64, 1 => 0), + array(0 => 67, 1 => 1), + array(0 => 67, 1 => 1), + array(0 => 67, 1 => 1), + array(0 => 67, 1 => 3), + array(0 => 67, 1 => 2), + array(0 => 68, 1 => 1), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 2), + array(0 => 71, 1 => 2), + array(0 => 70, 1 => 2), + array(0 => 73, 1 => 1), + array(0 => 73, 1 => 1), + array(0 => 73, 1 => 1), + array(0 => 69, 1 => 3), + array(0 => 69, 1 => 2), + array(0 => 69, 1 => 4), + array(0 => 69, 1 => 5), + array(0 => 69, 1 => 6), + array(0 => 69, 1 => 2), + array(0 => 69, 1 => 2), + array(0 => 69, 1 => 3), + array(0 => 69, 1 => 2), + array(0 => 69, 1 => 3), + array(0 => 69, 1 => 8), + array(0 => 81, 1 => 2), + array(0 => 81, 1 => 1), + array(0 => 69, 1 => 5), + array(0 => 69, 1 => 7), + array(0 => 69, 1 => 6), + array(0 => 69, 1 => 8), + array(0 => 69, 1 => 2), + array(0 => 69, 1 => 3), + array(0 => 69, 1 => 4), + array(0 => 67, 1 => 1), + array(0 => 69, 1 => 2), + array(0 => 69, 1 => 3), + array(0 => 69, 1 => 4), + array(0 => 69, 1 => 5), + array(0 => 74, 1 => 2), + array(0 => 74, 1 => 1), + array(0 => 74, 1 => 0), + array(0 => 84, 1 => 4), + array(0 => 84, 1 => 2), + array(0 => 84, 1 => 2), + array(0 => 84, 1 => 2), + array(0 => 84, 1 => 2), + array(0 => 84, 1 => 2), + array(0 => 84, 1 => 4), + array(0 => 80, 1 => 1), + array(0 => 80, 1 => 3), + array(0 => 79, 1 => 3), + array(0 => 79, 1 => 3), + array(0 => 79, 1 => 3), + array(0 => 79, 1 => 3), + array(0 => 77, 1 => 1), + array(0 => 77, 1 => 1), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 2), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 3), + array(0 => 85, 1 => 7), + array(0 => 85, 1 => 7), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 3), + array(0 => 91, 1 => 1), + array(0 => 91, 1 => 1), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 4), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 4), + array(0 => 72, 1 => 2), + array(0 => 72, 1 => 2), + array(0 => 96, 1 => 2), + array(0 => 96, 1 => 0), + array(0 => 97, 1 => 2), + array(0 => 97, 1 => 2), + array(0 => 97, 1 => 4), + array(0 => 97, 1 => 2), + array(0 => 97, 1 => 2), + array(0 => 97, 1 => 4), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 5), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 3), + array(0 => 97, 1 => 2), + array(0 => 82, 1 => 1), + array(0 => 82, 1 => 1), + array(0 => 82, 1 => 2), + array(0 => 98, 1 => 1), + array(0 => 98, 1 => 1), + array(0 => 98, 1 => 3), + array(0 => 95, 1 => 2), + array(0 => 99, 1 => 1), + array(0 => 99, 1 => 2), + array(0 => 100, 1 => 3), + array(0 => 100, 1 => 3), + array(0 => 100, 1 => 5), + array(0 => 100, 1 => 6), + array(0 => 100, 1 => 2), + array(0 => 90, 1 => 4), + array(0 => 101, 1 => 4), + array(0 => 101, 1 => 4), + array(0 => 102, 1 => 3), + array(0 => 102, 1 => 1), + array(0 => 102, 1 => 0), + array(0 => 78, 1 => 3), + array(0 => 78, 1 => 2), + array(0 => 103, 1 => 3), + array(0 => 103, 1 => 2), + array(0 => 83, 1 => 2), + array(0 => 83, 1 => 0), + array(0 => 104, 1 => 2), + array(0 => 104, 1 => 3), + array(0 => 104, 1 => 2), + array(0 => 93, 1 => 1), + array(0 => 93, 1 => 2), + array(0 => 93, 1 => 1), + array(0 => 93, 1 => 2), + array(0 => 93, 1 => 3), + array(0 => 87, 1 => 1), + array(0 => 87, 1 => 1), + array(0 => 86, 1 => 1), + array(0 => 88, 1 => 1), + array(0 => 94, 1 => 3), + array(0 => 94, 1 => 3), + array(0 => 105, 1 => 1), + array(0 => 105, 1 => 3), + array(0 => 105, 1 => 0), + array(0 => 106, 1 => 3), + array(0 => 106, 1 => 3), + array(0 => 106, 1 => 1), + array(0 => 92, 1 => 2), + array(0 => 92, 1 => 3), + array(0 => 107, 1 => 2), + array(0 => 107, 1 => 1), + array(0 => 108, 1 => 3), + array(0 => 108, 1 => 3), + array(0 => 108, 1 => 1), + array(0 => 108, 1 => 3), + array(0 => 108, 1 => 3), + array(0 => 108, 1 => 1), + array(0 => 108, 1 => 1), + ); + + public static $yyReduceMap = array( + 0 => 0, + 1 => 1, + 2 => 2, + 3 => 3, + 4 => 4, + 5 => 5, + 6 => 6, + 7 => 7, + 22 => 7, + 23 => 7, + 24 => 7, + 37 => 7, + 57 => 7, + 58 => 7, + 66 => 7, + 67 => 7, + 78 => 7, + 83 => 7, + 84 => 7, + 89 => 7, + 93 => 7, + 94 => 7, + 98 => 7, + 99 => 7, + 101 => 7, + 106 => 7, + 170 => 7, + 175 => 7, + 8 => 8, + 9 => 9, + 10 => 10, + 12 => 12, + 13 => 13, + 14 => 14, + 15 => 15, + 16 => 16, + 17 => 17, + 18 => 18, + 19 => 19, + 20 => 20, + 21 => 21, + 25 => 25, + 26 => 26, + 27 => 27, + 28 => 28, + 29 => 29, + 30 => 30, + 31 => 31, + 32 => 32, + 34 => 32, + 33 => 33, + 35 => 35, + 36 => 36, + 38 => 38, + 39 => 39, + 40 => 40, + 41 => 41, + 42 => 42, + 43 => 43, + 44 => 44, + 45 => 45, + 46 => 46, + 47 => 47, + 48 => 48, + 49 => 49, + 50 => 50, + 51 => 51, + 60 => 51, + 148 => 51, + 152 => 51, + 156 => 51, + 158 => 51, + 52 => 52, + 149 => 52, + 155 => 52, + 53 => 53, + 54 => 54, + 55 => 54, + 56 => 56, + 133 => 56, + 59 => 59, + 61 => 61, + 62 => 62, + 63 => 62, + 64 => 64, + 65 => 65, + 68 => 68, + 69 => 69, + 70 => 69, + 71 => 71, + 72 => 72, + 73 => 73, + 74 => 74, + 75 => 75, + 76 => 76, + 77 => 77, + 79 => 79, + 81 => 79, + 82 => 79, + 113 => 79, + 80 => 80, + 85 => 85, + 86 => 86, + 87 => 87, + 88 => 88, + 90 => 90, + 91 => 91, + 92 => 91, + 95 => 95, + 96 => 96, + 97 => 97, + 100 => 100, + 102 => 102, + 103 => 103, + 104 => 104, + 105 => 105, + 107 => 107, + 108 => 108, + 109 => 109, + 110 => 110, + 111 => 111, + 112 => 112, + 114 => 114, + 172 => 114, + 115 => 115, + 116 => 116, + 117 => 117, + 118 => 118, + 119 => 119, + 120 => 120, + 128 => 120, + 121 => 121, + 122 => 122, + 123 => 123, + 124 => 123, + 126 => 123, + 127 => 123, + 125 => 125, + 129 => 129, + 130 => 130, + 131 => 131, + 176 => 131, + 132 => 132, + 134 => 134, + 135 => 135, + 136 => 136, + 137 => 137, + 138 => 138, + 139 => 139, + 140 => 140, + 141 => 141, + 142 => 142, + 143 => 143, + 144 => 144, + 145 => 145, + 146 => 146, + 147 => 147, + 150 => 150, + 151 => 151, + 153 => 153, + 154 => 154, + 157 => 157, + 159 => 159, + 160 => 160, + 161 => 161, + 162 => 162, + 163 => 163, + 164 => 164, + 165 => 165, + 166 => 166, + 167 => 167, + 168 => 168, + 169 => 168, + 171 => 171, + 173 => 173, + 174 => 174, + 177 => 177, + 178 => 178, + 179 => 179, + 180 => 180, + 183 => 180, + 181 => 181, + 184 => 181, + 182 => 182, + 185 => 185, + 186 => 186, + ); + + /** + * result status + * + * @var bool + */ + public $successful = true; + + /** + * return value + * + * @var mixed + */ + public $retvalue = 0; + + /** + * @var + */ + public $yymajor; + + /** + * last index of array variable + * + * @var mixed + */ + public $last_index; + + /** + * last variable name + * + * @var string + */ + public $last_variable; + + /** + * root parse tree buffer + * + * @var Smarty_Internal_ParseTree_Template + */ + public $root_buffer; + + /** + * current parse tree object + * + * @var Smarty_Internal_ParseTree + */ + public $current_buffer; + + /** + * lexer object + * + * @var Smarty_Internal_Templatelexer + */ + public $lex; + + /** + * {strip} status + * + * @var bool + */ + public $strip = false; + + /** + * compiler object + * + * @var Smarty_Internal_TemplateCompilerBase + */ + public $compiler = null; + + /** + * smarty object + * + * @var Smarty + */ + public $smarty = null; + + /** + * template object + * + * @var Smarty_Internal_Template + */ + public $template = null; + + /** + * block nesting level + * + * @var int + */ + public $block_nesting_level = 0; + + /** + * security object + * + * @var Smarty_Security + */ + public $security = null; + + /** + * template prefix array + * + * @var \Smarty_Internal_ParseTree[] + */ + public $template_prefix = array(); + + /** + * template prefix array + * + * @var \Smarty_Internal_ParseTree[] + */ + public $template_postfix = array(); + + public $yyTraceFILE; + + public $yyTracePrompt; + + public $yyidx; + + public $yyerrcnt; + + public $yystack = array(); + + public $yyTokenName = array( + '$', 'VERT', 'COLON', 'PHP', + 'TEXT', 'STRIPON', 'STRIPOFF', 'LITERALSTART', + 'LITERALEND', 'LITERAL', 'SIMPELOUTPUT', 'SIMPLETAG', + 'SMARTYBLOCKCHILDPARENT', 'LDEL', 'RDEL', 'DOLLARID', + 'EQUAL', 'ID', 'PTR', 'LDELMAKENOCACHE', + 'LDELIF', 'LDELFOR', 'SEMICOLON', 'INCDEC', + 'TO', 'STEP', 'LDELFOREACH', 'SPACE', + 'AS', 'APTR', 'LDELSETFILTER', 'CLOSETAG', + 'LDELSLASH', 'ATTR', 'INTEGER', 'COMMA', + 'OPENP', 'CLOSEP', 'MATH', 'UNIMATH', + 'ISIN', 'QMARK', 'NOT', 'TYPECAST', + 'HEX', 'DOT', 'INSTANCEOF', 'SINGLEQUOTESTRING', + 'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH', + 'OPENB', 'CLOSEB', 'DOLLAR', 'LOGOP', + 'SLOGOP', 'TLOGOP', 'SINGLECOND', 'ARRAYOPEN', + 'QUOTE', 'BACKTICK', 'error', 'start', + 'template', 'literal_e2', 'literal_e1', 'smartytag', + 'tagbody', 'tag', 'outattr', 'eqoutattr', + 'varindexed', 'output', 'attributes', 'variable', + 'value', 'expr', 'modifierlist', 'statement', + 'statements', 'foraction', 'varvar', 'modparameters', + 'attribute', 'ternary', 'tlop', 'lop', + 'scond', 'array', 'function', 'ns1', + 'doublequoted_with_quotes', 'static_class_access', 'arraydef', 'object', + 'arrayindex', 'indexdef', 'varvarele', 'objectchain', + 'objectelement', 'method', 'params', 'modifier', + 'modparameter', 'arrayelements', 'arrayelement', 'doublequoted', + 'doublequotedcontent', + ); + + /** + * internal error flag + * + * @var bool + */ + private $internalError = false; /* Index of top element in stack */ + private $_retvalue; /* Shifts left before out of the error */ + /** + * constructor + * + * @param Smarty_Internal_Templatelexer $lex + * @param Smarty_Internal_TemplateCompilerBase $compiler + */ + public function __construct(Smarty_Internal_Templatelexer $lex, Smarty_Internal_TemplateCompilerBase $compiler) + { + $this->lex = $lex; + $this->compiler = $compiler; + $this->template = $this->compiler->template; + $this->smarty = $this->template->smarty; + $this->security = isset($this->smarty->security_policy) ? $this->smarty->security_policy : false; + $this->current_buffer = $this->root_buffer = new Smarty_Internal_ParseTree_Template(); + } /* The parser's stack */ + public static function yy_destructor($yymajor, $yypminor) + { + switch ($yymajor) { + default: + break; /* If no destructor action specified: do nothing */ + } + } + + /** + * insert PHP code in current buffer + * + * @param string $code + */ + public function insertPhpCode($code) + { + $this->current_buffer->append_subtree($this, new Smarty_Internal_ParseTree_Tag($this, $code)); + } + + /** + * error rundown + * + */ + public function errorRunDown() + { + while ($this->yystack !== array()) { + $this->yy_pop_parser_stack(); + } + if (is_resource($this->yyTraceFILE)) { + fclose($this->yyTraceFILE); + } + } + + /** + * merge PHP code with prefix code and return parse tree tag object + * + * @param string $code + * + * @return Smarty_Internal_ParseTree_Tag + */ + public function mergePrefixCode($code) + { + $tmp = ''; + foreach ($this->compiler->prefix_code as $preCode) { + $tmp .= $preCode; + } + $this->compiler->prefix_code = array(); + $tmp .= $code; + return new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp, true)); + } + + public function Trace($TraceFILE, $zTracePrompt) + { + if (!$TraceFILE) { + $zTracePrompt = 0; + } elseif (!$zTracePrompt) { + $TraceFILE = 0; + } + $this->yyTraceFILE = $TraceFILE; + $this->yyTracePrompt = $zTracePrompt; + } + + public function PrintTrace() + { + $this->yyTraceFILE = fopen('php://output', 'w'); + $this->yyTracePrompt = '<br>'; + } + + public function tokenName($tokenType) + { + if ($tokenType === 0) { + return 'End of Input'; + } + if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) { + return $this->yyTokenName[ $tokenType ]; + } else { + return 'Unknown'; + } + } + + public function yy_pop_parser_stack() + { + if (empty($this->yystack)) { + return; + } + $yytos = array_pop($this->yystack); + if ($this->yyTraceFILE && $this->yyidx >= 0) { + fwrite($this->yyTraceFILE, + $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . + "\n"); + } + $yymajor = $yytos->major; + self::yy_destructor($yymajor, $yytos->minor); + $this->yyidx--; + return $yymajor; + } + + public function __destruct() + { + while ($this->yystack !== array()) { + $this->yy_pop_parser_stack(); + } + if (is_resource($this->yyTraceFILE)) { + fclose($this->yyTraceFILE); + } + } + + public function yy_get_expected_tokens($token) + { + static $res3 = array(); + static $res4 = array(); + $state = $this->yystack[ $this->yyidx ]->stateno; + $expected = self::$yyExpectedTokens[ $state ]; + if (isset($res3[ $state ][ $token ])) { + if ($res3[ $state ][ $token ]) { + return $expected; + } + } else { + if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) { + return $expected; + } + } + $stack = $this->yystack; + $yyidx = $this->yyidx; + do { + $yyact = $this->yy_find_shift_action($token); + if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) { + // reduce action + $done = 0; + do { + if ($done++ === 100) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // too much recursion prevents proper detection + // so give up + return array_unique($expected); + } + $yyruleno = $yyact - self::YYNSTATE; + $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ]); + if (isset(self::$yyExpectedTokens[ $nextstate ])) { + $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]); + if (isset($res4[ $nextstate ][ $token ])) { + if ($res4[ $nextstate ][ $token ]) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + } else { + if ($res4[ $nextstate ][ $token ] = + in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + } + } + if ($nextstate < self::YYNSTATE) { + // we need to shift a non-terminal + $this->yyidx++; + $x = new TP_yyStackEntry; + $x->stateno = $nextstate; + $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; + $this->yystack[ $this->yyidx ] = $x; + continue 2; + } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // the last token was just ignored, we can't accept + // by ignoring input, this is in essence ignoring a + // syntax error! + return array_unique($expected); + } elseif ($nextstate === self::YY_NO_ACTION) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // input accepted, but not shifted (I guess) + return $expected; + } else { + $yyact = $nextstate; + } + } while (true); + } + break; + } while (true); + $this->yyidx = $yyidx; + $this->yystack = $stack; + return array_unique($expected); + } + + public function yy_is_expected_token($token) + { + static $res = array(); + static $res2 = array(); + if ($token === 0) { + return true; // 0 is not part of this + } + $state = $this->yystack[ $this->yyidx ]->stateno; + if (isset($res[ $state ][ $token ])) { + if ($res[ $state ][ $token ]) { + return true; + } + } else { + if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) { + return true; + } + } + $stack = $this->yystack; + $yyidx = $this->yyidx; + do { + $yyact = $this->yy_find_shift_action($token); + if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) { + // reduce action + $done = 0; + do { + if ($done++ === 100) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // too much recursion prevents proper detection + // so give up + return true; + } + $yyruleno = $yyact - self::YYNSTATE; + $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ]); + if (isset($res2[ $nextstate ][ $token ])) { + if ($res2[ $nextstate ][ $token ]) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + } else { + if ($res2[ $nextstate ][ $token ] = + (isset(self::$yyExpectedTokens[ $nextstate ]) && + in_array($token, self::$yyExpectedTokens[ $nextstate ], true))) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + } + if ($nextstate < self::YYNSTATE) { + // we need to shift a non-terminal + $this->yyidx++; + $x = new TP_yyStackEntry; + $x->stateno = $nextstate; + $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; + $this->yystack[ $this->yyidx ] = $x; + continue 2; + } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + if (!$token) { + // end of input: this is valid + return true; + } + // the last token was just ignored, we can't accept + // by ignoring input, this is in essence ignoring a + // syntax error! + return false; + } elseif ($nextstate === self::YY_NO_ACTION) { + $this->yyidx = $yyidx; + $this->yystack = $stack; + // input accepted, but not shifted (I guess) + return true; + } else { + $yyact = $nextstate; + } + } while (true); + } + break; + } while (true); + $this->yyidx = $yyidx; + $this->yystack = $stack; + return true; + } + + public function yy_find_shift_action($iLookAhead) + { + $stateno = $this->yystack[ $this->yyidx ]->stateno; + /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */ + if (!isset(self::$yy_shift_ofst[ $stateno ])) { + // no shift actions + return self::$yy_default[ $stateno ]; + } + $i = self::$yy_shift_ofst[ $stateno ]; + if ($i === self::YY_SHIFT_USE_DFLT) { + return self::$yy_default[ $stateno ]; + } + if ($iLookAhead === self::YYNOCODE) { + return self::YY_NO_ACTION; + } + $i += $iLookAhead; + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { + if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) + && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) { + if ($this->yyTraceFILE) { + fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'FALLBACK ' . + $this->yyTokenName[ $iLookAhead ] . ' => ' . + $this->yyTokenName[ $iFallback ] . "\n"); + } + return $this->yy_find_shift_action($iFallback); + } + return self::$yy_default[ $stateno ]; + } else { + return self::$yy_action[ $i ]; + } + } + + public function yy_find_reduce_action($stateno, $iLookAhead) + { + /* $stateno = $this->yystack[$this->yyidx]->stateno; */ + if (!isset(self::$yy_reduce_ofst[ $stateno ])) { + return self::$yy_default[ $stateno ]; + } + $i = self::$yy_reduce_ofst[ $stateno ]; + if ($i === self::YY_REDUCE_USE_DFLT) { + return self::$yy_default[ $stateno ]; + } + if ($iLookAhead === self::YYNOCODE) { + return self::YY_NO_ACTION; + } + $i += $iLookAhead; + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { + return self::$yy_default[ $stateno ]; + } else { + return self::$yy_action[ $i ]; + } + } + + // line 234 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_shift($yyNewState, $yyMajor, $yypMinor) + { + $this->yyidx++; + if ($this->yyidx >= self::YYSTACKDEPTH) { + $this->yyidx--; + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + // line 221 "../smarty/lexer/smarty_internal_templateparser.y" + $this->internalError = true; + $this->compiler->trigger_template_error('Stack overflow in template parser'); + return; + } + $yytos = new TP_yyStackEntry; + $yytos->stateno = $yyNewState; + $yytos->major = $yyMajor; + $yytos->minor = $yypMinor; + $this->yystack[] = $yytos; + if ($this->yyTraceFILE && $this->yyidx > 0) { + fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, + $yyNewState); + fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt); + for ($i = 1; $i <= $this->yyidx; $i++) { + fprintf($this->yyTraceFILE, " %s", + $this->yyTokenName[ $this->yystack[ $i ]->major ]); + } + fwrite($this->yyTraceFILE, "\n"); + } + } + + // line 242 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r0() + { + $this->root_buffer->prepend_array($this, $this->template_prefix); + $this->root_buffer->append_array($this, $this->template_postfix); + $this->_retvalue = $this->root_buffer->to_smarty_php($this); + } + + // line 251 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r1() + { + $code = + $this->compiler->compileTag('private_php', + array(array('code' => $this->yystack[ $this->yyidx + 0 ]->minor), array('type' => $this->lex->phpType)), + array()); + if ($this->compiler->has_code && !empty($code)) { + $tmp = ''; + foreach ($this->compiler->prefix_code as $code) { + $tmp .= $code; + } + $this->compiler->prefix_code = array(); + $this->current_buffer->append_subtree($this, + new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp . $code, true))); + } + } + + // line 255 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r2() + { + $text = $this->yystack[ $this->yyidx + 0 ]->minor; + + if ((string)$text == '') { + $this->current_buffer->append_subtree($this, null); + } + + $this->current_buffer->append_subtree($this, new Smarty_Internal_ParseTree_Text($text, $this->strip)); + } + + // line 259 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r3() + { + $this->strip = true; + } + + // line 264 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r4() + { + $this->strip = false; + } + + // line 269 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r5() + { + $this->current_buffer->append_subtree($this, + new Smarty_Internal_ParseTree_Text($this->yystack[ $this->yyidx + -1 ]->minor)); + } + + // line 272 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r6() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -3 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor; + } + + // line 276 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r7() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 281 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r8() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 285 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r9() + { + $this->_retvalue = ''; + } + + // line 297 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r10() + { + if ($this->compiler->has_code) { + $this->current_buffer->append_subtree($this, + $this->mergePrefixCode($this->yystack[ $this->yyidx + 0 ]->minor)); + } + $this->compiler->has_variable_string = false; + $this->block_nesting_level = count($this->compiler->_tag_stack); + } + + // line 307 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r12() + { + $var = + trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength()), ' $'); + if (preg_match('/^(.*)(\s+nocache)$/', $var, $match)) { + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', array('nocache'), + array('value' => $this->compiler->compileVariable('\'' . $match[ 1 ] . '\''))); + } else { + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', array(), + array('value' => $this->compiler->compileVariable('\'' . $var . '\''))); + } + } + + // line 328 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r13() + { + $tag = + trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength())); + if ($tag == 'strip') { + $this->strip = true; + $this->_retvalue = null; + } else { + if (defined($tag)) { + if ($this->security) { + $this->security->isTrustedConstant($tag, $this->compiler); + } + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', array(), array('value' => $tag)); + } else { + if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) { + $this->_retvalue = $this->compiler->compileTag($match[ 1 ], array('\'nocache\'')); + } else { + $this->_retvalue = $this->compiler->compileTag($tag, array()); + } + } + } + } + + // line 339 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r14() + { + $j = strrpos($this->yystack[ $this->yyidx + 0 ]->minor, '.'); + if ($this->yystack[ $this->yyidx + 0 ]->minor[ $j + 1 ] == 'c') { + // {$smarty.block.child} + $this->_retvalue = + $this->compiler->compileTag('child', array(), array($this->yystack[ $this->yyidx + 0 ]->minor)); + } else { + // {$smarty.block.parent} + $this->_retvalue = + $this->compiler->compileTag('parent', array(), array($this->yystack[ $this->yyidx + 0 ]->minor)); + } + } + + // line 343 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r15() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + // line 347 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r16() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + // line 356 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r17() + { + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ], + array('value' => $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ])); + } + + // line 360 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r18() + { + $this->_retvalue = + $this->compiler->compileTag('assign', array_merge(array( + array('value' => $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ]), + array('var' => '\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'') + ), $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ])); + } + + // line 364 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r19() + { + $this->_retvalue = + $this->compiler->compileTag('assign', array_merge(array( + array('value' => $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ]), + array('var' => $this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ]) + ), $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]), array( + 'smarty_internal_index' => $this->yystack[ $this->yyidx + + -1 ]->minor[ 'smarty_internal_index' ] + )); + } + + // line 368 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r20() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 383 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r21() + { + $this->_retvalue = array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 393 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r25() + { + if (defined($this->yystack[ $this->yyidx + -1 ]->minor)) { + if ($this->security) { + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler); + } + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor, + array('value' => $this->yystack[ $this->yyidx + -1 ]->minor)); + } else { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -1 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor); + } + } + + // line 406 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r26() + { + if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) { + if ($this->security) { + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler); + } + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', array(), + array('value' => $this->yystack[ $this->yyidx + 0 ]->minor)); + } else { + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor, array()); + } + } + + // line 418 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r27() + { + if (defined($this->yystack[ $this->yyidx + -2 ]->minor)) { + if ($this->security) { + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + -2 ]->minor, $this->compiler); + } + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor, + array( + 'value' => $this->yystack[ $this->yyidx + -2 ]->minor, + 'modifierlist' => $this->yystack[ $this->yyidx + -1 ]->minor + )); + } else { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -2 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor, + array('modifierlist' => $this->yystack[ $this->yyidx + -1 ]->minor)); + } + } + + // line 423 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r28() + { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -3 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor, + array('object_method' => $this->yystack[ $this->yyidx + -1 ]->minor)); + } + + // line 428 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r29() + { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -4 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor, array( + 'modifierlist' => $this->yystack[ $this->yyidx + -1 ]->minor, + 'object_method' => $this->yystack[ $this->yyidx + -2 ]->minor + )); + } + + // line 433 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r30() + { + $this->_retvalue = + $this->compiler->compileTag('make_nocache', + array(array('var' => '\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\''))); + } + + // line 438 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r31() + { + $tag = trim(substr($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler->getLdelLength())); + $this->_retvalue = + $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, array(), + array('if condition' => $this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 443 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r32() + { + $tag = trim(substr($this->yystack[ $this->yyidx + -2 ]->minor, $this->compiler->getLdelLength())); + $this->_retvalue = + $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, + $this->yystack[ $this->yyidx + 0 ]->minor, + array('if condition' => $this->yystack[ $this->yyidx + -1 ]->minor)); + } + + // line 454 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r33() + { + $tag = trim(substr($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler->getLdelLength())); + $this->_retvalue = + $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, array(), + array('if condition' => $this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 458 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r35() + { + $this->_retvalue = + $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array( + array('start' => $this->yystack[ $this->yyidx + -6 ]->minor), + array('ifexp' => $this->yystack[ $this->yyidx + -4 ]->minor), + array('var' => $this->yystack[ $this->yyidx + -2 ]->minor), + array('step' => $this->yystack[ $this->yyidx + -1 ]->minor) + )), 1); + } + + // line 466 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r36() + { + $this->_retvalue = '=' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 470 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r38() + { + $this->_retvalue = + $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array( + array('start' => $this->yystack[ $this->yyidx + -3 ]->minor), + array('to' => $this->yystack[ $this->yyidx + -1 ]->minor) + )), 0); + } + + // line 475 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r39() + { + $this->_retvalue = + $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array( + array('start' => $this->yystack[ $this->yyidx + -5 ]->minor), + array('to' => $this->yystack[ $this->yyidx + -3 ]->minor), + array('step' => $this->yystack[ $this->yyidx + -1 ]->minor) + )), 0); + } + + // line 479 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r40() + { + $this->_retvalue = + $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array( + array('from' => $this->yystack[ $this->yyidx + -3 ]->minor), + array('item' => $this->yystack[ $this->yyidx + -1 ]->minor) + ))); + } + + // line 482 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r41() + { + $this->_retvalue = + $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array( + array('from' => $this->yystack[ $this->yyidx + -5 ]->minor), + array('item' => $this->yystack[ $this->yyidx + -1 ]->minor), + array('key' => $this->yystack[ $this->yyidx + -3 ]->minor) + ))); + } + + // line 487 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r42() + { + $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 491 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r43() + { + $this->_retvalue = + $this->compiler->compileTag('setfilter', array(), array( + 'modifier_list' => array( + array_merge(array($this->yystack[ $this->yyidx + -1 ]->minor), + $this->yystack[ $this->yyidx + 0 ]->minor) + ) + )); + } + + // line 497 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r44() + { + $this->_retvalue = + $this->compiler->compileTag('setfilter', array(), array( + 'modifier_list' => array_merge(array( + array_merge(array( + $this->yystack[ $this->yyidx + + -2 ]->minor + ), $this->yystack[ $this->yyidx + -1 ]->minor) + ), $this->yystack[ $this->yyidx + 0 ]->minor) + )); + } + + // line 506 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r45() + { + $tag = + trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength()), ' /'); + if ($tag === 'strip') { + $this->strip = false; + $this->_retvalue = null; + } else { + $this->_retvalue = $this->compiler->compileTag($tag . 'close', array()); + } + } + + // line 510 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r46() + { + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor . 'close', array()); + } + + // line 515 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r47() + { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -1 ]->minor . 'close', array(), + array('modifier_list' => $this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 519 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r48() + { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -2 ]->minor . 'close', array(), + array('object_method' => $this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 527 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r49() + { + $this->_retvalue = + $this->compiler->compileTag($this->yystack[ $this->yyidx + -3 ]->minor . 'close', array(), array( + 'object_method' => $this->yystack[ $this->yyidx + -1 ]->minor, + 'modifier_list' => $this->yystack[ $this->yyidx + 0 ]->minor + )); + } + + // line 533 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r50() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + $this->_retvalue[] = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 538 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r51() + { + $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 543 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r52() + { + $this->_retvalue = array(); + } + + // line 554 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r53() + { + if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) { + if ($this->security) { + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler); + } + $this->_retvalue = + array($this->yystack[ $this->yyidx + -2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor); + } else { + $this->_retvalue = + array( + $this->yystack[ $this->yyidx + -2 ]->minor => '\'' . + $this->yystack[ $this->yyidx + 0 ]->minor . + '\'' + ); + } + } + + // line 562 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r54() + { + $this->_retvalue = + array( + trim($this->yystack[ $this->yyidx + -1 ]->minor, " =\n\r\t") => $this->yystack[ $this->yyidx + + 0 ]->minor + ); + } + + // line 574 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r56() + { + $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\''; + } + + // line 587 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r59() + { + $this->_retvalue = + array($this->yystack[ $this->yyidx + -2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 592 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r61() + { + $this->yystack[ $this->yyidx + -2 ]->minor[] = $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor; + } + + // line 599 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r62() + { + $this->_retvalue = + array( + 'var' => '\'' . substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . '\'', + 'value' => $this->yystack[ $this->yyidx + 0 ]->minor + ); + } + + // line 603 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r64() + { + $this->_retvalue = + array( + 'var' => $this->yystack[ $this->yyidx + -2 ]->minor, + 'value' => $this->yystack[ $this->yyidx + 0 ]->minor + ); + } + + // line 623 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r65() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + // line 628 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r68() + { + $this->_retvalue = + '$_smarty_tpl->getStreamVariable(\'' . + substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . + '://' . + $this->yystack[ $this->yyidx + 0 ]->minor . + '\')'; + } + + // line 638 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r69() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -2 ]->minor . + trim($this->yystack[ $this->yyidx + -1 ]->minor) . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 642 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r71() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -1 ]->minor[ 'pre' ] . + $this->yystack[ $this->yyidx + -2 ]->minor . + $this->yystack[ $this->yyidx + -1 ]->minor[ 'op' ] . + $this->yystack[ $this->yyidx + 0 ]->minor . + ')'; + } + + // line 646 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r72() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -2 ]->minor . + $this->yystack[ $this->yyidx + -1 ]->minor . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 650 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r73() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; + } + + // line 654 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r74() + { + $this->_retvalue = + 'in_array(' . + $this->yystack[ $this->yyidx + -2 ]->minor . + ',' . + $this->yystack[ $this->yyidx + 0 ]->minor . + ')'; + } + + // line 662 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r75() + { + $this->_retvalue = + 'in_array(' . + $this->yystack[ $this->yyidx + -2 ]->minor . + ',(array)' . + $this->yystack[ $this->yyidx + 0 ]->minor . + ')'; + } + + // line 666 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r76() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -5 ]->minor . + ' ? ' . + $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . '\'') . + ' : ' . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 676 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r77() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -5 ]->minor . + ' ? ' . + $this->yystack[ $this->yyidx + -2 ]->minor . + ' : ' . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 681 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r79() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 702 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r80() + { + $this->_retvalue = '!' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 706 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r85() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 710 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r86() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . '.'; + } + + // line 715 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r87() + { + $this->_retvalue = '.' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 732 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r88() + { + if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) { + if ($this->security) { + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler); + } + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } else { + $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\''; + } + } + + // line 736 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r90() + { + $this->_retvalue = '(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; + } + + // line 754 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r91() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -2 ]->minor . + $this->yystack[ $this->yyidx + -1 ]->minor . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 765 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r95() + { + $prefixVar = $this->compiler->getNewPrefixVariable(); + if ($this->yystack[ $this->yyidx + -2 ]->minor[ 'var' ] === '\'smarty\'') { + $this->compiler->appendPrefixCode("<?php {$prefixVar} = " . + $this->compiler->compileTag('private_special_variable', array(), + $this->yystack[ $this->yyidx + + -2 ]->minor[ 'smarty_internal_index' ]) . + ';?>'); + } else { + $this->compiler->appendPrefixCode("<?php {$prefixVar} = " . + $this->compiler->compileVariable($this->yystack[ $this->yyidx + + -2 ]->minor[ 'var' ]) . + $this->yystack[ $this->yyidx + -2 ]->minor[ 'smarty_internal_index' ] . + ';?>'); + } + $this->_retvalue = + $prefixVar . + '::' . + $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . + $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]; + } + + // line 772 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r96() + { + $prefixVar = $this->compiler->getNewPrefixVariable(); + $tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[ $this->yyidx + 0 ]->minor); + $this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php {$prefixVar} = ob_get_clean();?>")); + $this->_retvalue = $prefixVar; + } + + // line 785 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r97() + { + $this->_retvalue = + $this->compiler->compileTag('private_modifier', array(), array( + 'value' => $this->yystack[ $this->yyidx + -1 ]->minor, + 'modifierlist' => $this->yystack[ $this->yyidx + 0 ]->minor + )); + } + + // line 804 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r100() + { + if (!in_array(strtolower($this->yystack[ $this->yyidx + -2 ]->minor), array('self', 'parent')) && + (!$this->security || + $this->security->isTrustedStaticClassAccess($this->yystack[ $this->yyidx + -2 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler))) { + 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 { + $this->_retvalue = + $this->yystack[ $this->yyidx + -2 ]->minor . + '::' . + $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . + $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]; + } + } else { + $this->compiler->trigger_template_error('static class \'' . + $this->yystack[ $this->yyidx + -2 ]->minor . + '\' is undefined or not allowed by security setting'); + } + } + + // line 815 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r102() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 818 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r103() + { + $this->_retvalue = + $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\''); + } + + // line 831 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r104() + { + if ($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ] === '\'smarty\'') { + $smarty_var = + $this->compiler->compileTag('private_special_variable', array(), + $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ]); + $this->_retvalue = $smarty_var; + } else { + // used for array reset,next,prev,end,current + $this->last_variable = $this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ]; + $this->last_index = $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ]; + $this->_retvalue = + $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ]) . + $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ]; + } + } + + // line 841 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r105() + { + $this->_retvalue = + '$_smarty_tpl->tpl_vars[' . + $this->yystack[ $this->yyidx + -2 ]->minor . + ']->' . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 845 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r107() + { + $this->_retvalue = + $this->compiler->compileConfigVariable('\'' . $this->yystack[ $this->yyidx + -1 ]->minor . '\''); + } + + // line 849 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r108() + { + $this->_retvalue = + '(is_array($tmp = ' . + $this->compiler->compileConfigVariable('\'' . $this->yystack[ $this->yyidx + -2 ]->minor . '\'') . + ') ? $tmp' . + $this->yystack[ $this->yyidx + 0 ]->minor . + ' :null)'; + } + + // line 853 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r109() + { + $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + -1 ]->minor); + } + + // line 857 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r110() + { + $this->_retvalue = + '(is_array($tmp = ' . + $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + -2 ]->minor) . + ') ? $tmp' . + $this->yystack[ $this->yyidx + 0 ]->minor . + ' : null)'; + } + + // line 860 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r111() + { + $this->_retvalue = + array( + 'var' => '\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'', + 'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor + ); + } + + // line 873 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r112() + { + $this->_retvalue = + array( + 'var' => $this->yystack[ $this->yyidx + -1 ]->minor, + 'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor + ); + } + + // line 879 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r114() + { + return; + } + + // line 882 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r115() + { + $this->_retvalue = + '[' . + $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'') . + ']'; + } + + // line 886 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r116() + { + $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor) . ']'; + } + + // line 890 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r117() + { + $this->_retvalue = + '[' . + $this->compiler->compileVariable($this->yystack[ $this->yyidx + -2 ]->minor) . + '->' . + $this->yystack[ $this->yyidx + 0 ]->minor . + ']'; + } + + // line 894 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r118() + { + $this->_retvalue = '[\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\']'; + } + + // line 899 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r119() + { + $this->_retvalue = '[' . $this->yystack[ $this->yyidx + 0 ]->minor . ']'; + } + + // line 904 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r120() + { + $this->_retvalue = '[' . $this->yystack[ $this->yyidx + -1 ]->minor . ']'; + } + + // line 908 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r121() + { + $this->_retvalue = + '[' . + $this->compiler->compileTag('private_special_variable', array(), + '[\'section\'][\'' . $this->yystack[ $this->yyidx + -1 ]->minor . '\'][\'index\']') . + ']'; + } + + // line 911 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r122() + { + $this->_retvalue = + '[' . + $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . + $this->yystack[ $this->yyidx + + -3 ]->minor . + '\'][\'' . + $this->yystack[ $this->yyidx + + -1 ]->minor . + '\']') . + ']'; + } + + // line 917 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r123() + { + $this->_retvalue = '[' . $this->yystack[ $this->yyidx + -1 ]->minor . ']'; + } + + // line 933 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r125() + { + $this->_retvalue = + '[' . + $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'') . + ']'; + } + + // line 943 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r129() + { + $this->_retvalue = '[]'; + } + + // line 947 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r130() + { + $this->_retvalue = '\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\''; + } + + // line 952 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r131() + { + $this->_retvalue = '\'\''; + } + + // line 960 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r132() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 966 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r134() + { + $var = + trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength()), ' $'); + $this->_retvalue = $this->compiler->compileVariable('\'' . $var . '\''); + } + + // line 973 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r135() + { + $this->_retvalue = '(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; + } + + // line 982 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r136() + { + if ($this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ] === '\'smarty\'') { + $this->_retvalue = + $this->compiler->compileTag('private_special_variable', array(), + $this->yystack[ $this->yyidx + -1 ]->minor[ 'smarty_internal_index' ]) . + $this->yystack[ $this->yyidx + 0 ]->minor; + } else { + $this->_retvalue = + $this->compiler->compileVariable($this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ]) . + $this->yystack[ $this->yyidx + -1 ]->minor[ 'smarty_internal_index' ] . + $this->yystack[ $this->yyidx + 0 ]->minor; + } + } + + // line 987 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r137() + { + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 992 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r138() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 999 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r139() + { + if ($this->security && substr($this->yystack[ $this->yyidx + -1 ]->minor, 0, 1) === '_') { + $this->compiler->trigger_template_error(self::ERR1); + } + $this->_retvalue = + '->' . $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 1006 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r140() + { + if ($this->security) { + $this->compiler->trigger_template_error(self::ERR2); + } + $this->_retvalue = + '->{' . + $this->compiler->compileVariable($this->yystack[ $this->yyidx + -1 ]->minor) . + $this->yystack[ $this->yyidx + 0 ]->minor . + '}'; + } + + // line 1013 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r141() + { + if ($this->security) { + $this->compiler->trigger_template_error(self::ERR2); + } + $this->_retvalue = + '->{' . $this->yystack[ $this->yyidx + -2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . '}'; + } + + // line 1021 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r142() + { + if ($this->security) { + $this->compiler->trigger_template_error(self::ERR2); + } + $this->_retvalue = + '->{\'' . + $this->yystack[ $this->yyidx + -4 ]->minor . + '\'.' . + $this->yystack[ $this->yyidx + -2 ]->minor . + $this->yystack[ $this->yyidx + 0 ]->minor . + '}'; + } + + // line 1029 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r143() + { + $this->_retvalue = '->' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 1037 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r144() + { + $this->_retvalue = + $this->compiler->compilePHPFunctionCall($this->yystack[ $this->yyidx + -3 ]->minor, + $this->yystack[ $this->yyidx + -1 ]->minor); + } + + // line 1044 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r145() + { + if ($this->security && substr($this->yystack[ $this->yyidx + -3 ]->minor, 0, 1) === '_') { + $this->compiler->trigger_template_error(self::ERR1); + } + $this->_retvalue = + $this->yystack[ $this->yyidx + -3 ]->minor . + '(' . + implode(',', $this->yystack[ $this->yyidx + -1 ]->minor) . + ')'; + } + + // line 1055 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r146() + { + if ($this->security) { + $this->compiler->trigger_template_error(self::ERR2); + } + $prefixVar = $this->compiler->getNewPrefixVariable(); + $this->compiler->appendPrefixCode("<?php {$prefixVar} = " . + $this->compiler->compileVariable('\'' . + substr($this->yystack[ $this->yyidx + + -3 ]->minor, 1) . + '\'') . + ';?>'); + $this->_retvalue = $prefixVar . '(' . implode(',', $this->yystack[ $this->yyidx + -1 ]->minor) . ')'; + } + + // line 1072 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r147() + { + $this->_retvalue = + array_merge($this->yystack[ $this->yyidx + -2 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 1076 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r150() + { + $this->_retvalue = + array_merge($this->yystack[ $this->yyidx + -2 ]->minor, array( + array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor) + )); + } + + // line 1084 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r151() + { + $this->_retvalue = + array(array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor)); + } + + // line 1092 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r153() + { + $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 1105 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r154() + { + $this->_retvalue = + array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 1114 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r157() + { + $this->_retvalue = + array(trim($this->yystack[ $this->yyidx + -1 ]->minor) . $this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 1119 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r159() + { + $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, '', 'method'); + } + + // line 1124 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r160() + { + $this->_retvalue = + array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'method'); + } + + // line 1129 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r161() + { + $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, ''); + } + + // line 1134 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r162() + { + $this->_retvalue = + array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'property'); + } + + // line 1140 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r163() + { + $this->_retvalue = + array( + $this->yystack[ $this->yyidx + -2 ]->minor, + $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor, 'property' + ); + } + + // line 1144 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r164() + { + $this->_retvalue = ' ' . trim($this->yystack[ $this->yyidx + 0 ]->minor) . ' '; + } + + // line 1163 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r165() + { + static $lops = array( + 'eq' => ' == ', + 'ne' => ' != ', + 'neq' => ' != ', + 'gt' => ' > ', + 'ge' => ' >= ', + 'gte' => ' >= ', + 'lt' => ' < ', + 'le' => ' <= ', + 'lte' => ' <= ', + 'mod' => ' % ', + 'and' => ' && ', + 'or' => ' || ', + 'xor' => ' xor ', + ); + $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor)); + $this->_retvalue = $lops[ $op ]; + } + + // line 1176 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r166() + { + static $tlops = array( + 'isdivby' => array('op' => ' % ', 'pre' => '!('), + 'isnotdivby' => array('op' => ' % ', 'pre' => '('), + 'isevenby' => array('op' => ' / ', 'pre' => '!(1 & '), + 'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '), + 'isoddby' => array('op' => ' / ', 'pre' => '(1 & '), + 'isnotoddby' => array('op' => ' / ', 'pre' => '!(1 & '), + ); + $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor)); + $this->_retvalue = $tlops[ $op ]; + } + + // line 1190 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r167() + { + static $scond = array( + 'iseven' => '!(1 & ', + 'isnoteven' => '(1 & ', + 'isodd' => '(1 & ', + 'isnotodd' => '!(1 & ', + ); + $op = strtolower(str_replace(' ', '', $this->yystack[ $this->yyidx + 0 ]->minor)); + $this->_retvalue = $scond[ $op ]; + } + + // line 1201 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r168() + { + $this->_retvalue = 'array(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; + } + + // line 1209 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r171() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . ',' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 1213 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r173() + { + $this->_retvalue = + $this->yystack[ $this->yyidx + -2 ]->minor . '=>' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 1229 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r174() + { + $this->_retvalue = + '\'' . $this->yystack[ $this->yyidx + -2 ]->minor . '\'=>' . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + // line 1235 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r177() + { + $this->compiler->leaveDoubleQuote(); + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor->to_smarty_php($this); + } + + // line 1240 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r178() + { + $this->yystack[ $this->yyidx + -1 ]->minor->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + // line 1244 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r179() + { + $this->_retvalue = new Smarty_Internal_ParseTree_Dq($this, $this->yystack[ $this->yyidx + 0 ]->minor); + } + + // line 1248 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r180() + { + $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)' . $this->yystack[ $this->yyidx + -1 ]->minor); + } + + // line 1252 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r181() + { + $this->_retvalue = + new Smarty_Internal_ParseTree_Code('(string)(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'); + } + + // line 1264 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r182() + { + $this->_retvalue = + new Smarty_Internal_ParseTree_Code('(string)$_smarty_tpl->tpl_vars[\'' . + substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . + '\']->value'); + } + + // line 1268 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_r185() + { + $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->yystack[ $this->yyidx + 0 ]->minor); + } + + public function yy_r186() + { + $this->_retvalue = new Smarty_Internal_ParseTree_DqContent($this->yystack[ $this->yyidx + 0 ]->minor); + } + + public function yy_reduce($yyruleno) + { + if ($this->yyTraceFILE && $yyruleno >= 0 + && $yyruleno < count(self::$yyRuleName)) { + fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n", + $this->yyTracePrompt, $yyruleno, + self::$yyRuleName[ $yyruleno ]); + } + $this->_retvalue = $yy_lefthand_side = null; + if (isset(self::$yyReduceMap[ $yyruleno ])) { + // call the action + $this->_retvalue = null; + $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}(); + $yy_lefthand_side = $this->_retvalue; + } + $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ]; + $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ]; + $this->yyidx -= $yysize; + for ($i = $yysize; $i; $i--) { + // pop all of the right-hand side parameters + array_pop($this->yystack); + } + $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto); + if ($yyact < self::YYNSTATE) { + if (!$this->yyTraceFILE && $yysize) { + $this->yyidx++; + $x = new TP_yyStackEntry; + $x->stateno = $yyact; + $x->major = $yygoto; + $x->minor = $yy_lefthand_side; + $this->yystack[ $this->yyidx ] = $x; + } else { + $this->yy_shift($yyact, $yygoto, $yy_lefthand_side); + } + } elseif ($yyact === self::YYNSTATE + self::YYNRULE + 1) { + $this->yy_accept(); + } + } + + public function yy_parse_failed() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + } + + public function yy_syntax_error($yymajor, $TOKEN) + { + // line 214 "../smarty/lexer/smarty_internal_templateparser.y" + $this->internalError = true; + $this->yymajor = $yymajor; + $this->compiler->trigger_template_error(); + } + + public function yy_accept() + { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt); + } + while ($this->yyidx >= 0) { + $this->yy_pop_parser_stack(); + } + // line 207 "../smarty/lexer/smarty_internal_templateparser.y" + $this->successful = !$this->internalError; + $this->internalError = false; + $this->retvalue = $this->_retvalue; + } + + public function doParse($yymajor, $yytokenvalue) + { + $yyerrorhit = 0; /* True if yymajor has invoked an error */ + if ($this->yyidx === null || $this->yyidx < 0) { + $this->yyidx = 0; + $this->yyerrcnt = -1; + $x = new TP_yyStackEntry; + $x->stateno = 0; + $x->major = 0; + $this->yystack = array(); + $this->yystack[] = $x; + } + $yyendofinput = ($yymajor == 0); + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sInput %s\n", + $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]); + } + do { + $yyact = $this->yy_find_shift_action($yymajor); + if ($yymajor < self::YYERRORSYMBOL && + !$this->yy_is_expected_token($yymajor)) { + // force a syntax error + $yyact = self::YY_ERROR_ACTION; + } + if ($yyact < self::YYNSTATE) { + $this->yy_shift($yyact, $yymajor, $yytokenvalue); + $this->yyerrcnt--; + if ($yyendofinput && $this->yyidx >= 0) { + $yymajor = 0; + } else { + $yymajor = self::YYNOCODE; + } + } elseif ($yyact < self::YYNSTATE + self::YYNRULE) { + $this->yy_reduce($yyact - self::YYNSTATE); + } elseif ($yyact === self::YY_ERROR_ACTION) { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sSyntax Error!\n", + $this->yyTracePrompt); + } + if (self::YYERRORSYMBOL) { + if ($this->yyerrcnt < 0) { + $this->yy_syntax_error($yymajor, $yytokenvalue); + } + $yymx = $this->yystack[ $this->yyidx ]->major; + if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) { + if ($this->yyTraceFILE) { + fprintf($this->yyTraceFILE, "%sDiscard input token %s\n", + $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]); + } + $this->yy_destructor($yymajor, $yytokenvalue); + $yymajor = self::YYNOCODE; + } else { + while ($this->yyidx >= 0 && + $yymx !== self::YYERRORSYMBOL && + ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE + ) { + $this->yy_pop_parser_stack(); + } + if ($this->yyidx < 0 || $yymajor == 0) { + $this->yy_destructor($yymajor, $yytokenvalue); + $this->yy_parse_failed(); + $yymajor = self::YYNOCODE; + } elseif ($yymx !== self::YYERRORSYMBOL) { + $u2 = 0; + $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2); + } + } + $this->yyerrcnt = 3; + $yyerrorhit = 1; + } else { + if ($this->yyerrcnt <= 0) { + $this->yy_syntax_error($yymajor, $yytokenvalue); + } + $this->yyerrcnt = 3; + $this->yy_destructor($yymajor, $yytokenvalue); + if ($yyendofinput) { + $this->yy_parse_failed(); + } + $yymajor = self::YYNOCODE; + } + } else { + $this->yy_accept(); + $yymajor = self::YYNOCODE; + } + } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0); + } +} + diff --git a/sysplugins/smarty_internal_testinstall.php b/sysplugins/smarty_internal_testinstall.php new file mode 100644 index 0000000000000000000000000000000000000000..504a4582c3614cf302ef1d9bfa890b7b185da8ed --- /dev/null +++ b/sysplugins/smarty_internal_testinstall.php @@ -0,0 +1,609 @@ +<?php +/** + * Smarty Internal TestInstall + * Test Smarty installation + * + * @package Smarty + * @subpackage Utilities + * @author Uwe Tews + */ + +/** + * TestInstall class + * + * @package Smarty + * @subpackage Utilities + */ +class Smarty_Internal_TestInstall +{ + /** + * diagnose Smarty setup + * If $errors is secified, the diagnostic report will be appended to the array, rather than being output. + * + * @param \Smarty $smarty + * @param array $errors array to push results into rather than outputting them + * + * @return bool status, true if everything is fine, false else + */ + public static function testInstall(Smarty $smarty, &$errors = null) + { + $status = true; + if ($errors === null) { + echo "<PRE>\n"; + echo "Smarty Installation test...\n"; + echo "Testing template directory...\n"; + } + $_stream_resolve_include_path = function_exists('stream_resolve_include_path'); + // test if all registered template_dir are accessible + foreach ($smarty->getTemplateDir() as $template_dir) { + $_template_dir = $template_dir; + $template_dir = realpath($template_dir); + // resolve include_path or fail existence + if (!$template_dir) { + if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) { + // try PHP include_path + if ($_stream_resolve_include_path) { + $template_dir = stream_resolve_include_path($_template_dir); + } else { + $template_dir = $smarty->ext->_getIncludePath->getIncludePath($_template_dir, null, $smarty); + } + if ($template_dir !== false) { + if ($errors === null) { + echo "$template_dir is OK.\n"; + } + continue; + } else { + $status = false; + $message = + "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'template_dir' ] = $message; + } + continue; + } + } else { + $status = false; + $message = "FAILED: $_template_dir does not exist"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'template_dir' ] = $message; + } + continue; + } + } + if (!is_dir($template_dir)) { + $status = false; + $message = "FAILED: $template_dir is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'template_dir' ] = $message; + } + } elseif (!is_readable($template_dir)) { + $status = false; + $message = "FAILED: $template_dir is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'template_dir' ] = $message; + } + } else { + if ($errors === null) { + echo "$template_dir is OK.\n"; + } + } + } + if ($errors === null) { + echo "Testing compile directory...\n"; + } + // test if registered compile_dir is accessible + $__compile_dir = $smarty->getCompileDir(); + $_compile_dir = realpath($__compile_dir); + if (!$_compile_dir) { + $status = false; + $message = "FAILED: {$__compile_dir} does not exist"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'compile_dir' ] = $message; + } + } elseif (!is_dir($_compile_dir)) { + $status = false; + $message = "FAILED: {$_compile_dir} is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'compile_dir' ] = $message; + } + } elseif (!is_readable($_compile_dir)) { + $status = false; + $message = "FAILED: {$_compile_dir} is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'compile_dir' ] = $message; + } + } elseif (!is_writable($_compile_dir)) { + $status = false; + $message = "FAILED: {$_compile_dir} is not writable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'compile_dir' ] = $message; + } + } else { + if ($errors === null) { + echo "{$_compile_dir} is OK.\n"; + } + } + if ($errors === null) { + echo "Testing plugins directory...\n"; + } + // test if all registered plugins_dir are accessible + // and if core plugins directory is still registered + $_core_plugins_dir = realpath(dirname(__FILE__) . '/../plugins'); + $_core_plugins_available = false; + foreach ($smarty->getPluginsDir() as $plugin_dir) { + $_plugin_dir = $plugin_dir; + $plugin_dir = realpath($plugin_dir); + // resolve include_path or fail existence + if (!$plugin_dir) { + if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) { + // try PHP include_path + if ($_stream_resolve_include_path) { + $plugin_dir = stream_resolve_include_path($_plugin_dir); + } else { + $plugin_dir = $smarty->ext->_getIncludePath->getIncludePath($_plugin_dir, null, $smarty); + } + if ($plugin_dir !== false) { + if ($errors === null) { + echo "$plugin_dir is OK.\n"; + } + continue; + } else { + $status = false; + $message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'plugins_dir' ] = $message; + } + continue; + } + } else { + $status = false; + $message = "FAILED: $_plugin_dir does not exist"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'plugins_dir' ] = $message; + } + continue; + } + } + if (!is_dir($plugin_dir)) { + $status = false; + $message = "FAILED: $plugin_dir is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'plugins_dir' ] = $message; + } + } elseif (!is_readable($plugin_dir)) { + $status = false; + $message = "FAILED: $plugin_dir is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'plugins_dir' ] = $message; + } + } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) { + $_core_plugins_available = true; + if ($errors === null) { + echo "$plugin_dir is OK.\n"; + } + } else { + if ($errors === null) { + echo "$plugin_dir is OK.\n"; + } + } + } + if (!$_core_plugins_available) { + $status = false; + $message = "WARNING: Smarty's own libs/plugins is not available"; + if ($errors === null) { + echo $message . ".\n"; + } elseif (!isset($errors[ 'plugins_dir' ])) { + $errors[ 'plugins_dir' ] = $message; + } + } + if ($errors === null) { + echo "Testing cache directory...\n"; + } + // test if all registered cache_dir is accessible + $__cache_dir = $smarty->getCacheDir(); + $_cache_dir = realpath($__cache_dir); + if (!$_cache_dir) { + $status = false; + $message = "FAILED: {$__cache_dir} does not exist"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'cache_dir' ] = $message; + } + } elseif (!is_dir($_cache_dir)) { + $status = false; + $message = "FAILED: {$_cache_dir} is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'cache_dir' ] = $message; + } + } elseif (!is_readable($_cache_dir)) { + $status = false; + $message = "FAILED: {$_cache_dir} is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'cache_dir' ] = $message; + } + } elseif (!is_writable($_cache_dir)) { + $status = false; + $message = "FAILED: {$_cache_dir} is not writable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'cache_dir' ] = $message; + } + } else { + if ($errors === null) { + echo "{$_cache_dir} is OK.\n"; + } + } + if ($errors === null) { + echo "Testing configs directory...\n"; + } + // test if all registered config_dir are accessible + foreach ($smarty->getConfigDir() as $config_dir) { + $_config_dir = $config_dir; + // resolve include_path or fail existence + if (!$config_dir) { + if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) { + // try PHP include_path + if ($_stream_resolve_include_path) { + $config_dir = stream_resolve_include_path($_config_dir); + } else { + $config_dir = $smarty->ext->_getIncludePath->getIncludePath($_config_dir, null, $smarty); + } + if ($config_dir !== false) { + if ($errors === null) { + echo "$config_dir is OK.\n"; + } + continue; + } else { + $status = false; + $message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'config_dir' ] = $message; + } + continue; + } + } else { + $status = false; + $message = "FAILED: $_config_dir does not exist"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'config_dir' ] = $message; + } + continue; + } + } + if (!is_dir($config_dir)) { + $status = false; + $message = "FAILED: $config_dir is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'config_dir' ] = $message; + } + } elseif (!is_readable($config_dir)) { + $status = false; + $message = "FAILED: $config_dir is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'config_dir' ] = $message; + } + } else { + if ($errors === null) { + echo "$config_dir is OK.\n"; + } + } + } + if ($errors === null) { + echo "Testing sysplugin files...\n"; + } + // test if sysplugins are available + $source = SMARTY_SYSPLUGINS_DIR; + if (is_dir($source)) { + $expectedSysplugins = array( + 'smartycompilerexception.php' => true, + 'smartyexception.php' => true, + 'smarty_cacheresource.php' => true, + 'smarty_cacheresource_custom.php' => true, + 'smarty_cacheresource_keyvaluestore.php' => true, + 'smarty_data.php' => true, + 'smarty_internal_block.php' => true, + 'smarty_internal_cacheresource_file.php' => true, + 'smarty_internal_compilebase.php' => true, + 'smarty_internal_compile_append.php' => true, + 'smarty_internal_compile_assign.php' => true, + 'smarty_internal_compile_block.php' => true, + 'smarty_internal_compile_block_child.php' => true, + 'smarty_internal_compile_block_parent.php' => true, + 'smarty_internal_compile_child.php' => true, + 'smarty_internal_compile_parent.php' => true, + 'smarty_internal_compile_break.php' => true, + 'smarty_internal_compile_call.php' => true, + 'smarty_internal_compile_capture.php' => true, + 'smarty_internal_compile_config_load.php' => true, + 'smarty_internal_compile_continue.php' => true, + 'smarty_internal_compile_debug.php' => true, + 'smarty_internal_compile_eval.php' => true, + 'smarty_internal_compile_extends.php' => true, + 'smarty_internal_compile_for.php' => true, + 'smarty_internal_compile_foreach.php' => true, + 'smarty_internal_compile_function.php' => true, + 'smarty_internal_compile_if.php' => true, + 'smarty_internal_compile_include.php' => true, + 'smarty_internal_compile_include_php.php' => true, + 'smarty_internal_compile_insert.php' => true, + 'smarty_internal_compile_ldelim.php' => true, + 'smarty_internal_compile_make_nocache.php' => true, + 'smarty_internal_compile_nocache.php' => true, + 'smarty_internal_compile_private_block_plugin.php' => true, + 'smarty_internal_compile_private_foreachsection.php' => true, + 'smarty_internal_compile_private_function_plugin.php' => true, + 'smarty_internal_compile_private_modifier.php' => true, + 'smarty_internal_compile_private_object_block_function.php' => true, + 'smarty_internal_compile_private_object_function.php' => true, + 'smarty_internal_compile_private_php.php' => true, + 'smarty_internal_compile_private_print_expression.php' => true, + 'smarty_internal_compile_private_registered_block.php' => true, + 'smarty_internal_compile_private_registered_function.php' => true, + 'smarty_internal_compile_private_special_variable.php' => true, + 'smarty_internal_compile_rdelim.php' => true, + 'smarty_internal_compile_section.php' => true, + 'smarty_internal_compile_setfilter.php' => true, + 'smarty_internal_compile_shared_inheritance.php' => true, + 'smarty_internal_compile_while.php' => true, + 'smarty_internal_configfilelexer.php' => true, + 'smarty_internal_configfileparser.php' => true, + 'smarty_internal_config_file_compiler.php' => true, + 'smarty_internal_data.php' => true, + 'smarty_internal_debug.php' => true, + 'smarty_internal_errorhandler.php' => true, + 'smarty_internal_extension_handler.php' => true, + 'smarty_internal_method_addautoloadfilters.php' => true, + 'smarty_internal_method_adddefaultmodifiers.php' => true, + 'smarty_internal_method_append.php' => true, + 'smarty_internal_method_appendbyref.php' => true, + 'smarty_internal_method_assignbyref.php' => true, + 'smarty_internal_method_assignglobal.php' => true, + 'smarty_internal_method_clearallassign.php' => true, + 'smarty_internal_method_clearallcache.php' => true, + 'smarty_internal_method_clearassign.php' => true, + 'smarty_internal_method_clearcache.php' => true, + 'smarty_internal_method_clearcompiledtemplate.php' => true, + 'smarty_internal_method_clearconfig.php' => true, + 'smarty_internal_method_compileallconfig.php' => true, + 'smarty_internal_method_compilealltemplates.php' => true, + 'smarty_internal_method_configload.php' => true, + 'smarty_internal_method_createdata.php' => true, + 'smarty_internal_method_getautoloadfilters.php' => true, + 'smarty_internal_method_getconfigvariable.php' => true, + 'smarty_internal_method_getconfigvars.php' => true, + 'smarty_internal_method_getdebugtemplate.php' => true, + 'smarty_internal_method_getdefaultmodifiers.php' => true, + 'smarty_internal_method_getglobal.php' => true, + 'smarty_internal_method_getregisteredobject.php' => true, + 'smarty_internal_method_getstreamvariable.php' => true, + 'smarty_internal_method_gettags.php' => true, + 'smarty_internal_method_gettemplatevars.php' => true, + 'smarty_internal_method_literals.php' => true, + 'smarty_internal_method_loadfilter.php' => true, + 'smarty_internal_method_loadplugin.php' => true, + 'smarty_internal_method_mustcompile.php' => true, + 'smarty_internal_method_registercacheresource.php' => true, + 'smarty_internal_method_registerclass.php' => true, + 'smarty_internal_method_registerdefaultconfighandler.php' => true, + 'smarty_internal_method_registerdefaultpluginhandler.php' => true, + 'smarty_internal_method_registerdefaulttemplatehandler.php' => true, + 'smarty_internal_method_registerfilter.php' => true, + 'smarty_internal_method_registerobject.php' => true, + 'smarty_internal_method_registerplugin.php' => true, + 'smarty_internal_method_registerresource.php' => true, + 'smarty_internal_method_setautoloadfilters.php' => true, + 'smarty_internal_method_setdebugtemplate.php' => true, + 'smarty_internal_method_setdefaultmodifiers.php' => true, + 'smarty_internal_method_unloadfilter.php' => true, + 'smarty_internal_method_unregistercacheresource.php' => true, + 'smarty_internal_method_unregisterfilter.php' => true, + 'smarty_internal_method_unregisterobject.php' => true, + 'smarty_internal_method_unregisterplugin.php' => true, + 'smarty_internal_method_unregisterresource.php' => true, + 'smarty_internal_nocache_insert.php' => true, + 'smarty_internal_parsetree.php' => true, + 'smarty_internal_parsetree_code.php' => true, + 'smarty_internal_parsetree_dq.php' => true, + 'smarty_internal_parsetree_dqcontent.php' => true, + 'smarty_internal_parsetree_tag.php' => true, + 'smarty_internal_parsetree_template.php' => true, + 'smarty_internal_parsetree_text.php' => true, + 'smarty_internal_resource_eval.php' => true, + 'smarty_internal_resource_extends.php' => true, + 'smarty_internal_resource_file.php' => true, + 'smarty_internal_resource_php.php' => true, + 'smarty_internal_resource_registered.php' => true, + 'smarty_internal_resource_stream.php' => true, + 'smarty_internal_resource_string.php' => true, + 'smarty_internal_runtime_cachemodify.php' => true, + 'smarty_internal_runtime_cacheresourcefile.php' => true, + 'smarty_internal_runtime_capture.php' => true, + 'smarty_internal_runtime_codeframe.php' => true, + 'smarty_internal_runtime_filterhandler.php' => true, + 'smarty_internal_runtime_foreach.php' => true, + 'smarty_internal_runtime_getincludepath.php' => true, + 'smarty_internal_runtime_inheritance.php' => true, + 'smarty_internal_runtime_make_nocache.php' => true, + 'smarty_internal_runtime_tplfunction.php' => true, + 'smarty_internal_runtime_updatecache.php' => true, + 'smarty_internal_runtime_updatescope.php' => true, + 'smarty_internal_runtime_writefile.php' => true, + 'smarty_internal_smartytemplatecompiler.php' => true, + 'smarty_internal_template.php' => true, + 'smarty_internal_templatebase.php' => true, + 'smarty_internal_templatecompilerbase.php' => true, + 'smarty_internal_templatelexer.php' => true, + 'smarty_internal_templateparser.php' => true, + 'smarty_internal_testinstall.php' => true, + 'smarty_internal_undefined.php' => true, + 'smarty_resource.php' => true, + 'smarty_resource_custom.php' => true, + 'smarty_resource_recompiled.php' => true, + 'smarty_resource_uncompiled.php' => true, + 'smarty_security.php' => true, + 'smarty_template_cached.php' => true, + 'smarty_template_compiled.php' => true, + 'smarty_template_config.php' => true, + 'smarty_template_resource_base.php' => true, + 'smarty_template_source.php' => true, + 'smarty_undefined_variable.php' => true, + 'smarty_variable.php' => true, + ); + $iterator = new DirectoryIterator($source); + foreach ($iterator as $file) { + if (!$file->isDot()) { + $filename = $file->getFilename(); + if (isset($expectedSysplugins[ $filename ])) { + unset($expectedSysplugins[ $filename ]); + } + } + } + if ($expectedSysplugins) { + $status = false; + $message = "FAILED: files missing from libs/sysplugins: " . join(', ', array_keys($expectedSysplugins)); + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'sysplugins' ] = $message; + } + } elseif ($errors === null) { + echo "... OK\n"; + } + } else { + $status = false; + $message = "FAILED: " . SMARTY_SYSPLUGINS_DIR . ' is not a directory'; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'sysplugins_dir_constant' ] = $message; + } + } + if ($errors === null) { + echo "Testing plugin files...\n"; + } + // test if core plugins are available + $source = SMARTY_PLUGINS_DIR; + if (is_dir($source)) { + $expectedPlugins = array( + 'block.textformat.php' => true, + 'function.counter.php' => true, + 'function.cycle.php' => true, + 'function.fetch.php' => true, + 'function.html_checkboxes.php' => true, + 'function.html_image.php' => true, + 'function.html_options.php' => true, + 'function.html_radios.php' => true, + 'function.html_select_date.php' => true, + 'function.html_select_time.php' => true, + 'function.html_table.php' => true, + 'function.mailto.php' => true, + 'function.math.php' => true, + 'modifier.capitalize.php' => true, + 'modifier.date_format.php' => true, + 'modifier.debug_print_var.php' => true, + 'modifier.escape.php' => true, + 'modifier.mb_wordwrap.php' => true, + 'modifier.regex_replace.php' => true, + 'modifier.replace.php' => true, + 'modifier.spacify.php' => true, + 'modifier.truncate.php' => true, + 'modifiercompiler.cat.php' => true, + 'modifiercompiler.count_characters.php' => true, + 'modifiercompiler.count_paragraphs.php' => true, + 'modifiercompiler.count_sentences.php' => true, + 'modifiercompiler.count_words.php' => true, + 'modifiercompiler.default.php' => true, + 'modifiercompiler.escape.php' => true, + 'modifiercompiler.from_charset.php' => true, + 'modifiercompiler.indent.php' => true, + 'modifiercompiler.lower.php' => true, + 'modifiercompiler.noprint.php' => true, + 'modifiercompiler.string_format.php' => true, + 'modifiercompiler.strip.php' => true, + 'modifiercompiler.strip_tags.php' => true, + 'modifiercompiler.to_charset.php' => true, + 'modifiercompiler.unescape.php' => true, + 'modifiercompiler.upper.php' => true, + 'modifiercompiler.wordwrap.php' => true, + 'outputfilter.trimwhitespace.php' => true, + 'shared.escape_special_chars.php' => true, + 'shared.literal_compiler_param.php' => true, + 'shared.make_timestamp.php' => true, + 'shared.mb_str_replace.php' => true, + 'shared.mb_unicode.php' => true, + 'variablefilter.htmlspecialchars.php' => true, + ); + $iterator = new DirectoryIterator($source); + foreach ($iterator as $file) { + if (!$file->isDot()) { + $filename = $file->getFilename(); + if (isset($expectedPlugins[ $filename ])) { + unset($expectedPlugins[ $filename ]); + } + } + } + if ($expectedPlugins) { + $status = false; + $message = "FAILED: files missing from libs/plugins: " . join(', ', array_keys($expectedPlugins)); + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'plugins' ] = $message; + } + } elseif ($errors === null) { + echo "... OK\n"; + } + } else { + $status = false; + $message = "FAILED: " . SMARTY_PLUGINS_DIR . ' is not a directory'; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors[ 'plugins_dir_constant' ] = $message; + } + } + if ($errors === null) { + echo "Tests complete.\n"; + echo "</PRE>\n"; + } + return $status; + } +} diff --git a/sysplugins/smarty_internal_undefined.php b/sysplugins/smarty_internal_undefined.php new file mode 100644 index 0000000000000000000000000000000000000000..7df0acc2d0948cc7ed3b35a792180d21424832c9 --- /dev/null +++ b/sysplugins/smarty_internal_undefined.php @@ -0,0 +1,67 @@ +<?php + +/** + * Smarty Internal Undefined + * + * Class to handle undefined method calls or calls to obsolete runtime extensions + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Undefined +{ + /** + * Name of undefined extension class + * + * @var string|null + */ + public $class = null; + + /** + * Smarty_Internal_Undefined constructor. + * + * @param null|string $class name of undefined extension class + */ + public function __construct($class = null) + { + $this->class = $class; + } + + /** + * Wrapper for obsolete class Smarty_Internal_Runtime_ValidateCompiled + * + * @param \Smarty_Internal_Template $tpl + * @param array $properties special template properties + * @param bool $cache flag if called from cache file + * + * @return bool false + */ + public function decodeProperties(Smarty_Internal_Template $tpl, $properties, $cache = false) + { + if ($cache) { + $tpl->cached->valid = false; + } else { + $tpl->mustCompile = true; + } + return false; + } + + /** + * Call error handler for undefined method + * + * @param string $name unknown method-name + * @param array $args argument array + * + * @return mixed + * @throws SmartyException + */ + public function __call($name, $args) + { + if (isset($this->class)) { + throw new SmartyException("undefined extension class '{$this->class}'"); + } else { + throw new SmartyException(get_class($args[ 0 ]) . "->{$name}() undefined method"); + } + } +} diff --git a/sysplugins/smarty_resource.php b/sysplugins/smarty_resource.php new file mode 100644 index 0000000000000000000000000000000000000000..aae7e42f708bd6f226eab04dd314ed5afaabe595 --- /dev/null +++ b/sysplugins/smarty_resource.php @@ -0,0 +1,262 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * Base implementation for resource plugins + * + * @package Smarty + * @subpackage TemplateResources + * + * @method renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template) + * @method populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) + * @method process(Smarty_Internal_Template $_smarty_tpl) + */ +abstract class Smarty_Resource +{ + /** + * resource types provided by the core + * + * @var array + */ + public static $sysplugins = array( + 'file' => 'smarty_internal_resource_file.php', + 'string' => 'smarty_internal_resource_string.php', + 'extends' => 'smarty_internal_resource_extends.php', + 'stream' => 'smarty_internal_resource_stream.php', + 'eval' => 'smarty_internal_resource_eval.php', + 'php' => 'smarty_internal_resource_php.php' + ); + + /** + * Source is bypassing compiler + * + * @var boolean + */ + public $uncompiled = false; + + /** + * Source must be recompiled on every occasion + * + * @var boolean + */ + public $recompiled = false; + + /** + * Flag if resource does implement populateCompiledFilepath() method + * + * @var bool + */ + public $hasCompiledHandler = false; + + /** + * Load Resource Handler + * + * @param Smarty $smarty smarty object + * @param string $type name of the resource + * + * @throws SmartyException + * @return Smarty_Resource Resource Handler + */ + public static function load(Smarty $smarty, $type) + { + // try smarty's cache + if (isset($smarty->_cache[ 'resource_handlers' ][ $type ])) { + return $smarty->_cache[ 'resource_handlers' ][ $type ]; + } + // try registered resource + if (isset($smarty->registered_resources[ $type ])) { + return $smarty->_cache[ 'resource_handlers' ][ $type ] = + $smarty->registered_resources[ $type ] instanceof Smarty_Resource ? + $smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered(); + } + // try sysplugins dir + if (isset(self::$sysplugins[ $type ])) { + $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type); + return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class(); + } + // try plugins dir + $_resource_class = 'Smarty_Resource_' . ucfirst($type); + if ($smarty->loadPlugin($_resource_class)) { + if (class_exists($_resource_class, false)) { + return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class(); + } else { + $smarty->registerResource( + $type, + array( + "smarty_resource_{$type}_source", "smarty_resource_{$type}_timestamp", + "smarty_resource_{$type}_secure", "smarty_resource_{$type}_trusted" + ) + ); + // give it another try, now that the resource is registered properly + return self::load($smarty, $type); + } + } + // try streams + $_known_stream = stream_get_wrappers(); + if (in_array($type, $_known_stream)) { + // is known stream + if (is_object($smarty->security_policy)) { + $smarty->security_policy->isTrustedStream($type); + } + return $smarty->_cache[ 'resource_handlers' ][ $type ] = new Smarty_Internal_Resource_Stream(); + } + // TODO: try default_(template|config)_handler + // give up + throw new SmartyException("Unknown resource type '{$type}'"); + } + + /** + * extract resource_type and resource_name from template_resource and config_resource + * + * @note "C:/foo.tpl" was forced to file resource up till Smarty 3.1.3 (including). + * + * @param string $resource_name template_resource or config_resource to parse + * @param string $default_resource the default resource_type defined in $smarty + * + * @return array with parsed resource name and type + */ + public static function parseResourceName($resource_name, $default_resource) + { + if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]/', $resource_name, $match)) { + $type = $match[ 1 ]; + $name = substr($resource_name, strlen($match[ 0 ])); + } else { + // no resource given, use default + // or single character before the colon is not a resource type, but part of the filepath + $type = $default_resource; + $name = $resource_name; + } + return array($name, $type); + } + + /** + * modify template_resource according to resource handlers specifications + * + * @param \Smarty_Internal_Template|\Smarty $obj Smarty instance + * @param string $template_resource template_resource to extract resource handler and + * name of + * + * @return string unique resource name + * @throws \SmartyException + */ + public static function getUniqueTemplateName($obj, $template_resource) + { + $smarty = $obj->_getSmartyObj(); + list($name, $type) = self::parseResourceName($template_resource, $smarty->default_resource_type); + // TODO: optimize for Smarty's internal resource types + $resource = Smarty_Resource::load($smarty, $type); + // go relative to a given template? + $_file_is_dotted = $name[ 0 ] === '.' && ($name[ 1 ] === '.' || $name[ 1 ] === '/'); + if ($obj->_isTplObj() && $_file_is_dotted + && ($obj->source->type === 'file' || $obj->parent->source->type === 'extends') + ) { + $name = $smarty->_realpath(dirname($obj->parent->source->filepath) . DIRECTORY_SEPARATOR . $name); + } + return $resource->buildUniqueResourceName($smarty, $name); + } + + /** + * initialize Source Object for given resource + * wrapper for backward compatibility to versions < 3.1.22 + * Either [$_template] or [$smarty, $template_resource] must be specified + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty $smarty smarty object + * @param string $template_resource resource identifier + * + * @return \Smarty_Template_Source Source Object + * @throws \SmartyException + */ + public static function source( + Smarty_Internal_Template $_template = null, + Smarty $smarty = null, + $template_resource = null + ) { + return Smarty_Template_Source::load($_template, $smarty, $template_resource); + } + + /** + * Load template's source into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + abstract public function getContent(Smarty_Template_Source $source); + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + */ + abstract public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null); + + /** + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + */ + public function populateTimestamp(Smarty_Template_Source $source) + { + // intentionally left blank + } + + /** + * modify resource_name according to resource handlers specifications + * + * @param Smarty $smarty Smarty instance + * @param string $resource_name resource_name to make unique + * @param boolean $isConfig flag for config resource + * + * @return string unique resource name + */ + public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) + { + if ($isConfig) { + if (!isset($smarty->_joined_config_dir)) { + $smarty->getTemplateDir(null, true); + } + return get_class($this) . '#' . $smarty->_joined_config_dir . '#' . $resource_name; + } else { + if (!isset($smarty->_joined_template_dir)) { + $smarty->getTemplateDir(); + } + return get_class($this) . '#' . $smarty->_joined_template_dir . '#' . $resource_name; + } + } + + /* + * Check if resource must check time stamps when when loading complied or cached templates. + * Resources like 'extends' which use source components my disable timestamp checks on own resource. + * + * @return bool + */ + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return basename(preg_replace('![^\w]+!', '_', $source->name)); + } + + /** + * @return bool + */ + public function checkTimestamps() + { + return true; + } +} diff --git a/sysplugins/smarty_resource_custom.php b/sysplugins/smarty_resource_custom.php new file mode 100644 index 0000000000000000000000000000000000000000..8d66be3ae18abeb543c4dfb72926ce939bbd6041 --- /dev/null +++ b/sysplugins/smarty_resource_custom.php @@ -0,0 +1,93 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * Wrapper Implementation for custom resource plugins + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource_Custom extends Smarty_Resource +{ + /** + * fetch template and its modification time from data source + * + * @param string $name template name + * @param string &$source template source + * @param integer &$mtime template modification timestamp (epoch) + */ + abstract protected function fetch($name, &$source, &$mtime); + + /** + * Fetch template's modification timestamp from data source + * {@internal implementing this method is optional. + * Only implement it if modification times can be accessed faster than loading the complete template source.}} + * + * @param string $name template name + * + * @return integer|boolean timestamp (epoch) the template was modified, or false if not found + */ + protected function fetchTimestamp($name) + { + return null; + } + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + */ + public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) + { + $source->filepath = $source->type . ':' . substr(preg_replace('/[^A-Za-z0-9.]/', '', $source->name), 0, 25); + $source->uid = sha1($source->type . ':' . $source->name); + $mtime = $this->fetchTimestamp($source->name); + if ($mtime !== null) { + $source->timestamp = $mtime; + } else { + $this->fetch($source->name, $content, $timestamp); + $source->timestamp = isset($timestamp) ? $timestamp : false; + if (isset($content)) { + $source->content = $content; + } + } + $source->exists = !!$source->timestamp; + } + + /** + * Load template's source into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + public function getContent(Smarty_Template_Source $source) + { + $this->fetch($source->name, $content, $timestamp); + if (isset($content)) { + return $content; + } + throw new SmartyException("Unable to read template {$source->type} '{$source->name}'"); + } + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return basename(substr(preg_replace('/[^A-Za-z0-9.]/', '', $source->name), 0, 25)); + } +} diff --git a/sysplugins/smarty_resource_recompiled.php b/sysplugins/smarty_resource_recompiled.php new file mode 100644 index 0000000000000000000000000000000000000000..760c4dd338ed45f80f14385b6a96b3503de882a3 --- /dev/null +++ b/sysplugins/smarty_resource_recompiled.php @@ -0,0 +1,94 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * Base implementation for resource plugins that don't compile cache + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource_Recompiled extends Smarty_Resource +{ + /** + * Flag that it's an recompiled resource + * + * @var bool + */ + public $recompiled = true; + + /** + * Resource does implement populateCompiledFilepath() method + * + * @var bool + */ + public $hasCompiledHandler = true; + + /** + * compile template from source + * + * @param Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + * + * @throws Exception + */ + public function process(Smarty_Internal_Template $_smarty_tpl) + { + $compiled = &$_smarty_tpl->compiled; + $compiled->file_dependency = array(); + $compiled->includes = array(); + $compiled->nocache_hash = null; + $compiled->unifunc = null; + $level = ob_get_level(); + ob_start(); + $_smarty_tpl->loadCompiler(); + // call compiler + try { + eval('?>' . $_smarty_tpl->compiler->compileTemplate($_smarty_tpl)); + } catch (Exception $e) { + unset($_smarty_tpl->compiler); + while (ob_get_level() > $level) { + ob_end_clean(); + } + throw $e; + } + // release compiler object to free memory + unset($_smarty_tpl->compiler); + ob_get_clean(); + $compiled->timestamp = time(); + $compiled->exists = true; + } + + /** + * populate Compiled Object with compiled filepath + * + * @param Smarty_Template_Compiled $compiled compiled object + * @param Smarty_Internal_Template $_template template object + * + * @return void + */ + public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) + { + $compiled->filepath = false; + $compiled->timestamp = false; + $compiled->exists = false; + } + + /* + * Disable timestamp checks for recompiled resource. + * + * @return bool + */ + /** + * @return bool + */ + public function checkTimestamps() + { + return false; + } +} diff --git a/sysplugins/smarty_resource_uncompiled.php b/sysplugins/smarty_resource_uncompiled.php new file mode 100644 index 0000000000000000000000000000000000000000..a11e2c14c7c2e60d03bef659557376f40b2b4579 --- /dev/null +++ b/sysplugins/smarty_resource_uncompiled.php @@ -0,0 +1,49 @@ +<?php +/** + * Smarty Resource Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ + +/** + * Smarty Resource Plugin + * Base implementation for resource plugins that don't use the compiler + * + * @package Smarty + * @subpackage TemplateResources + */ +abstract class Smarty_Resource_Uncompiled extends Smarty_Resource +{ + /** + * Flag that it's an uncompiled resource + * + * @var bool + */ + public $uncompiled = true; + + /** + * Resource does implement populateCompiledFilepath() method + * + * @var bool + */ + public $hasCompiledHandler = true; + + /** + * populate compiled object with compiled filepath + * + * @param Smarty_Template_Compiled $compiled compiled object + * @param Smarty_Internal_Template $_template template object + */ + public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) + { + $compiled->filepath = $_template->source->filepath; + $compiled->timestamp = $_template->source->timestamp; + $compiled->exists = $_template->source->exists; + if ($_template->smarty->merge_compiled_includes || $_template->source->handler->checkTimestamps()) { + $compiled->file_dependency[ $_template->source->uid ] = + array($compiled->filepath, $compiled->timestamp, $_template->source->type,); + } + } +} diff --git a/sysplugins/smarty_security.php b/sysplugins/smarty_security.php new file mode 100644 index 0000000000000000000000000000000000000000..441a7e28409ff959ed543acbf609a828d3b31fcb --- /dev/null +++ b/sysplugins/smarty_security.php @@ -0,0 +1,721 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage Security + * @author Uwe Tews + */ +/** + * FIXME: Smarty_Security API + * - getter and setter instead of public properties would allow cultivating an internal cache properly + * - current implementation of isTrustedResourceDir() assumes that Smarty::$template_dir and Smarty::$config_dir + * are immutable the cache is killed every time either of the variables change. That means that two distinct + * Smarty objects with differing + * $template_dir or $config_dir should NOT share the same Smarty_Security instance, + * as this would lead to (severe) performance penalty! how should this be handled? + */ + +/** + * This class does contain the security settings + */ +class Smarty_Security +{ + /** + * This determines how Smarty handles "<?php ... ?>" tags in templates. + * possible values: + * <ul> + * <li>Smarty::PHP_PASSTHRU -> echo PHP tags as they are</li> + * <li>Smarty::PHP_QUOTE -> escape tags as entities</li> + * <li>Smarty::PHP_REMOVE -> remove php tags</li> + * <li>Smarty::PHP_ALLOW -> execute php tags</li> + * </ul> + * + * @var integer + */ + public $php_handling = Smarty::PHP_PASSTHRU; + + /** + * This is the list of template directories that are considered secure. + * $template_dir is in this list implicitly. + * + * @var array + */ + public $secure_dir = array(); + + /** + * This is an array of directories where trusted php scripts reside. + * {@link $security} is disabled during their inclusion/execution. + * + * @var array + */ + public $trusted_dir = array(); + + /** + * List of regular expressions (PCRE) that include trusted URIs + * + * @var array + */ + public $trusted_uri = array(); + + /** + * List of trusted constants names + * + * @var array + */ + public $trusted_constants = array(); + + /** + * This is an array of trusted static classes. + * If empty access to all static classes is allowed. + * If set to 'none' none is allowed. + * + * @var array + */ + public $static_classes = array(); + + /** + * This is an nested array of trusted classes and static methods. + * If empty access to all static classes and methods is allowed. + * Format: + * array ( + * 'class_1' => array('method_1', 'method_2'), // allowed methods listed + * 'class_2' => array(), // all methods of class allowed + * ) + * If set to null none is allowed. + * + * @var array + */ + public $trusted_static_methods = array(); + + /** + * This is an array of trusted static properties. + * If empty access to all static classes and properties is allowed. + * Format: + * array ( + * 'class_1' => array('prop_1', 'prop_2'), // allowed properties listed + * 'class_2' => array(), // all properties of class allowed + * ) + * If set to null none is allowed. + * + * @var array + */ + public $trusted_static_properties = array(); + + /** + * This is an array of trusted PHP functions. + * If empty all functions are allowed. + * To disable all PHP functions set $php_functions = null. + * + * @var array + */ + public $php_functions = array('isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'time',); + + /** + * This is an array of trusted PHP modifiers. + * If empty all modifiers are allowed. + * To disable all modifier set $php_modifiers = null. + * + * @var array + */ + public $php_modifiers = array('escape', 'count', 'nl2br',); + + /** + * This is an array of allowed tags. + * If empty no restriction by allowed_tags. + * + * @var array + */ + public $allowed_tags = array(); + + /** + * This is an array of disabled tags. + * If empty no restriction by disabled_tags. + * + * @var array + */ + public $disabled_tags = array(); + + /** + * This is an array of allowed modifier plugins. + * If empty no restriction by allowed_modifiers. + * + * @var array + */ + public $allowed_modifiers = array(); + + /** + * This is an array of disabled modifier plugins. + * If empty no restriction by disabled_modifiers. + * + * @var array + */ + public $disabled_modifiers = array(); + + /** + * This is an array of disabled special $smarty variables. + * + * @var array + */ + public $disabled_special_smarty_vars = array(); + + /** + * This is an array of trusted streams. + * If empty all streams are allowed. + * To disable all streams set $streams = null. + * + * @var array + */ + public $streams = array('file'); + + /** + * + flag if constants can be accessed from template + * + * @var boolean + */ + public $allow_constants = true; + + /** + * + flag if super globals can be accessed from template + * + * @var boolean + */ + public $allow_super_globals = true; + + /** + * max template nesting level + * + * @var int + */ + public $max_template_nesting = 0; + + /** + * current template nesting level + * + * @var int + */ + private $_current_template_nesting = 0; + + /** + * Cache for $resource_dir lookup + * + * @var array + */ + protected $_resource_dir = array(); + + /** + * Cache for $template_dir lookup + * + * @var array + */ + protected $_template_dir = array(); + + /** + * Cache for $config_dir lookup + * + * @var array + */ + protected $_config_dir = array(); + + /** + * Cache for $secure_dir lookup + * + * @var array + */ + protected $_secure_dir = array(); + + /** + * Cache for $php_resource_dir lookup + * + * @var array + */ + protected $_php_resource_dir = null; + + /** + * Cache for $trusted_dir lookup + * + * @var array + */ + protected $_trusted_dir = null; + + /** + * Cache for include path status + * + * @var bool + */ + protected $_include_path_status = false; + + /** + * Cache for $_include_array lookup + * + * @var array + */ + protected $_include_dir = array(); + + /** + * @param Smarty $smarty + */ + public function __construct($smarty) + { + $this->smarty = $smarty; + } + + /** + * Check if PHP function is trusted. + * + * @param string $function_name + * @param object $compiler compiler object + * + * @return boolean true if function is trusted + */ + public function isTrustedPhpFunction($function_name, $compiler) + { + if (isset($this->php_functions) + && (empty($this->php_functions) || in_array($function_name, $this->php_functions)) + ) { + return true; + } + $compiler->trigger_template_error("PHP function '{$function_name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if static class is trusted. + * + * @param string $class_name + * @param object $compiler compiler object + * + * @return boolean true if class is trusted + */ + public function isTrustedStaticClass($class_name, $compiler) + { + if (isset($this->static_classes) + && (empty($this->static_classes) || in_array($class_name, $this->static_classes)) + ) { + return true; + } + $compiler->trigger_template_error("access to static class '{$class_name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if static class method/property is trusted. + * + * @param string $class_name + * @param string $params + * @param object $compiler compiler object + * + * @return boolean true if class method is trusted + */ + public function isTrustedStaticClassAccess($class_name, $params, $compiler) + { + if (!isset($params[ 2 ])) { + // fall back + return $this->isTrustedStaticClass($class_name, $compiler); + } + if ($params[ 2 ] === 'method') { + $allowed = $this->trusted_static_methods; + $name = substr($params[ 0 ], 0, strpos($params[ 0 ], '(')); + } else { + $allowed = $this->trusted_static_properties; + // strip '$' + $name = substr($params[ 0 ], 1); + } + if (isset($allowed)) { + if (empty($allowed)) { + // fall back + return $this->isTrustedStaticClass($class_name, $compiler); + } + if (isset($allowed[ $class_name ]) + && (empty($allowed[ $class_name ]) || in_array($name, $allowed[ $class_name ])) + ) { + return true; + } + } + $compiler->trigger_template_error("access to static class '{$class_name}' {$params[2]} '{$name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if PHP modifier is trusted. + * + * @param string $modifier_name + * @param object $compiler compiler object + * + * @return boolean true if modifier is trusted + */ + public function isTrustedPhpModifier($modifier_name, $compiler) + { + if (isset($this->php_modifiers) + && (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers)) + ) { + return true; + } + $compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting"); + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if tag is trusted. + * + * @param string $tag_name + * @param object $compiler compiler object + * + * @return boolean true if tag is trusted + */ + public function isTrustedTag($tag_name, $compiler) + { + // check for internal always required tags + if (in_array( + $tag_name, + array( + 'assign', 'call', 'private_filter', 'private_block_plugin', 'private_function_plugin', + 'private_object_block_function', 'private_object_function', 'private_registered_function', + 'private_registered_block', 'private_special_variable', 'private_print_expression', + 'private_modifier' + ) + ) + ) { + return true; + } + // check security settings + if (empty($this->allowed_tags)) { + if (empty($this->disabled_tags) || !in_array($tag_name, $this->disabled_tags)) { + return true; + } else { + $compiler->trigger_template_error("tag '{$tag_name}' disabled by security setting", null, true); + } + } elseif (in_array($tag_name, $this->allowed_tags) && !in_array($tag_name, $this->disabled_tags)) { + return true; + } else { + $compiler->trigger_template_error("tag '{$tag_name}' not allowed by security setting", null, true); + } + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if special $smarty variable is trusted. + * + * @param string $var_name + * @param object $compiler compiler object + * + * @return boolean true if tag is trusted + */ + public function isTrustedSpecialSmartyVar($var_name, $compiler) + { + if (!in_array($var_name, $this->disabled_special_smarty_vars)) { + return true; + } else { + $compiler->trigger_template_error( + "special variable '\$smarty.{$var_name}' not allowed by security setting", + null, + true + ); + } + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if modifier plugin is trusted. + * + * @param string $modifier_name + * @param object $compiler compiler object + * + * @return boolean true if tag is trusted + */ + public function isTrustedModifier($modifier_name, $compiler) + { + // check for internal always allowed modifier + if (in_array($modifier_name, array('default'))) { + return true; + } + // check security settings + if (empty($this->allowed_modifiers)) { + if (empty($this->disabled_modifiers) || !in_array($modifier_name, $this->disabled_modifiers)) { + return true; + } else { + $compiler->trigger_template_error( + "modifier '{$modifier_name}' disabled by security setting", + null, + true + ); + } + } elseif (in_array($modifier_name, $this->allowed_modifiers) + && !in_array($modifier_name, $this->disabled_modifiers) + ) { + return true; + } else { + $compiler->trigger_template_error( + "modifier '{$modifier_name}' not allowed by security setting", + null, + true + ); + } + return false; // should not, but who knows what happens to the compiler in the future? + } + + /** + * Check if constants are enabled or trusted + * + * @param string $const constant name + * @param object $compiler compiler object + * + * @return bool + */ + public function isTrustedConstant($const, $compiler) + { + if (in_array($const, array('true', 'false', 'null'))) { + return true; + } + if (!empty($this->trusted_constants)) { + if (!in_array(strtolower($const), $this->trusted_constants)) { + $compiler->trigger_template_error("Security: access to constant '{$const}' not permitted"); + return false; + } + return true; + } + if ($this->allow_constants) { + return true; + } + $compiler->trigger_template_error("Security: access to constants not permitted"); + return false; + } + + /** + * Check if stream is trusted. + * + * @param string $stream_name + * + * @return boolean true if stream is trusted + * @throws SmartyException if stream is not trusted + */ + public function isTrustedStream($stream_name) + { + if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) { + return true; + } + throw new SmartyException("stream '{$stream_name}' not allowed by security setting"); + } + + /** + * Check if directory of file resource is trusted. + * + * @param string $filepath + * @param null|bool $isConfig + * + * @return bool true if directory is trusted + * @throws \SmartyException if directory is not trusted + */ + public function isTrustedResourceDir($filepath, $isConfig = null) + { + if ($this->_include_path_status !== $this->smarty->use_include_path) { + $_dir = + $this->smarty->use_include_path ? $this->smarty->ext->_getIncludePath->getIncludePathDirs($this->smarty) : array(); + if ($this->_include_dir !== $_dir) { + $this->_updateResourceDir($this->_include_dir, $_dir); + $this->_include_dir = $_dir; + } + $this->_include_path_status = $this->smarty->use_include_path; + } + $_dir = $this->smarty->getTemplateDir(); + if ($this->_template_dir !== $_dir) { + $this->_updateResourceDir($this->_template_dir, $_dir); + $this->_template_dir = $_dir; + } + $_dir = $this->smarty->getConfigDir(); + if ($this->_config_dir !== $_dir) { + $this->_updateResourceDir($this->_config_dir, $_dir); + $this->_config_dir = $_dir; + } + if ($this->_secure_dir !== $this->secure_dir) { + $this->secure_dir = (array)$this->secure_dir; + foreach ($this->secure_dir as $k => $d) { + $this->secure_dir[ $k ] = $this->smarty->_realpath($d . DIRECTORY_SEPARATOR, true); + } + $this->_updateResourceDir($this->_secure_dir, $this->secure_dir); + $this->_secure_dir = $this->secure_dir; + } + $addPath = $this->_checkDir($filepath, $this->_resource_dir); + if ($addPath !== false) { + $this->_resource_dir = array_merge($this->_resource_dir, $addPath); + } + return true; + } + + /** + * Check if URI (e.g. {fetch} or {html_image}) is trusted + * To simplify things, isTrustedUri() resolves all input to "{$PROTOCOL}://{$HOSTNAME}". + * So "http://username:password@hello.world.example.org:8080/some-path?some=query-string" + * is reduced to "http://hello.world.example.org" prior to applying the patters from {@link $trusted_uri}. + * + * @param string $uri + * + * @return boolean true if URI is trusted + * @throws SmartyException if URI is not trusted + * @uses $trusted_uri for list of patterns to match against $uri + */ + public function isTrustedUri($uri) + { + $_uri = parse_url($uri); + if (!empty($_uri[ 'scheme' ]) && !empty($_uri[ 'host' ])) { + $_uri = $_uri[ 'scheme' ] . '://' . $_uri[ 'host' ]; + foreach ($this->trusted_uri as $pattern) { + if (preg_match($pattern, $_uri)) { + return true; + } + } + } + throw new SmartyException("URI '{$uri}' not allowed by security setting"); + } + + /** + * Check if directory of file resource is trusted. + * + * @param string $filepath + * + * @return boolean true if directory is trusted + * @throws SmartyException if PHP directory is not trusted + */ + public function isTrustedPHPDir($filepath) + { + if (empty($this->trusted_dir)) { + throw new SmartyException("directory '{$filepath}' not allowed by security setting (no trusted_dir specified)"); + } + // check if index is outdated + if (!$this->_trusted_dir || $this->_trusted_dir !== $this->trusted_dir) { + $this->_php_resource_dir = array(); + $this->_trusted_dir = $this->trusted_dir; + foreach ((array)$this->trusted_dir as $directory) { + $directory = $this->smarty->_realpath($directory . '/', true); + $this->_php_resource_dir[ $directory ] = true; + } + } + $addPath = $this->_checkDir($filepath, $this->_php_resource_dir); + if ($addPath !== false) { + $this->_php_resource_dir = array_merge($this->_php_resource_dir, $addPath); + } + return true; + } + + /** + * Remove old directories and its sub folders, add new directories + * + * @param array $oldDir + * @param array $newDir + */ + private function _updateResourceDir($oldDir, $newDir) + { + foreach ($oldDir as $directory) { + // $directory = $this->smarty->_realpath($directory, true); + $length = strlen($directory); + foreach ($this->_resource_dir as $dir) { + if (substr($dir, 0, $length) === $directory) { + unset($this->_resource_dir[ $dir ]); + } + } + } + foreach ($newDir as $directory) { + // $directory = $this->smarty->_realpath($directory, true); + $this->_resource_dir[ $directory ] = true; + } + } + + /** + * Check if file is inside a valid directory + * + * @param string $filepath + * @param array $dirs valid directories + * + * @return array|bool + * @throws \SmartyException + */ + private function _checkDir($filepath, $dirs) + { + $directory = dirname($this->smarty->_realpath($filepath, true)) . DIRECTORY_SEPARATOR; + $_directory = array(); + if (!preg_match('#[\\\\/][.][.][\\\\/]#', $directory)) { + while (true) { + // test if the directory is trusted + if (isset($dirs[ $directory ])) { + return $_directory; + } + // abort if we've reached root + if (!preg_match('#[\\\\/][^\\\\/]+[\\\\/]$#', $directory)) { + // give up + break; + } + // remember the directory to add it to _resource_dir in case we're successful + $_directory[ $directory ] = true; + // bubble up one level + $directory = preg_replace('#[\\\\/][^\\\\/]+[\\\\/]$#', DIRECTORY_SEPARATOR, $directory); + } + } + // give up + throw new SmartyException(sprintf('Smarty Security: not trusted file path \'%s\' ', $filepath)); + } + + /** + * Loads security class and enables security + * + * @param \Smarty $smarty + * @param string|Smarty_Security $security_class if a string is used, it must be class-name + * + * @return \Smarty current Smarty instance for chaining + * @throws \SmartyException when an invalid class name is provided + */ + public static function enableSecurity(Smarty $smarty, $security_class) + { + if ($security_class instanceof Smarty_Security) { + $smarty->security_policy = $security_class; + return $smarty; + } elseif (is_object($security_class)) { + throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security."); + } + if ($security_class === null) { + $security_class = $smarty->security_class; + } + if (!class_exists($security_class)) { + throw new SmartyException("Security class '$security_class' is not defined"); + } elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) { + throw new SmartyException("Class '$security_class' must extend Smarty_Security."); + } else { + $smarty->security_policy = new $security_class($smarty); + } + return $smarty; + } + + /** + * Start template processing + * + * @param $template + * + * @throws SmartyException + */ + public function startTemplate($template) + { + if ($this->max_template_nesting > 0 && $this->_current_template_nesting++ >= $this->max_template_nesting) { + throw new SmartyException("maximum template nesting level of '{$this->max_template_nesting}' exceeded when calling '{$template->template_resource}'"); + } + } + + /** + * Exit template processing + */ + public function endTemplate() + { + if ($this->max_template_nesting > 0) { + $this->_current_template_nesting--; + } + } + + /** + * Register callback functions call at start/end of template rendering + * + * @param \Smarty_Internal_Template $template + */ + public function registerCallBacks(Smarty_Internal_Template $template) + { + $template->startRenderCallbacks[] = array($this, 'startTemplate'); + $template->endRenderCallbacks[] = array($this, 'endTemplate'); + } +} diff --git a/sysplugins/smarty_template_cached.php b/sysplugins/smarty_template_cached.php new file mode 100644 index 0000000000000000000000000000000000000000..508d27f3669d39b5372d7c5c5782cecb6814b554 --- /dev/null +++ b/sysplugins/smarty_template_cached.php @@ -0,0 +1,257 @@ +<?php +/** + * Created by PhpStorm. + * User: Uwe Tews + * Date: 04.12.2014 + * Time: 06:08 + */ + +/** + * Smarty Resource Data Object + * Cache Data Container for Template Files + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ +class Smarty_Template_Cached extends Smarty_Template_Resource_Base +{ + /** + * Cache Is Valid + * + * @var boolean + */ + public $valid = null; + + /** + * CacheResource Handler + * + * @var Smarty_CacheResource + */ + public $handler = null; + + /** + * Template Cache Id (Smarty_Internal_Template::$cache_id) + * + * @var string + */ + public $cache_id = null; + + /** + * saved cache lifetime in seconds + * + * @var integer + */ + public $cache_lifetime = 0; + + /** + * Id for cache locking + * + * @var string + */ + public $lock_id = null; + + /** + * flag that cache is locked by this instance + * + * @var bool + */ + public $is_locked = false; + + /** + * Source Object + * + * @var Smarty_Template_Source + */ + public $source = null; + + /** + * Nocache hash codes of processed compiled templates + * + * @var array + */ + public $hashes = array(); + + /** + * Flag if this is a cache resource + * + * @var bool + */ + public $isCache = true; + + /** + * create Cached Object container + * + * @param Smarty_Internal_Template $_template template object + * + * @throws \SmartyException + */ + public function __construct(Smarty_Internal_Template $_template) + { + $this->compile_id = $_template->compile_id; + $this->cache_id = $_template->cache_id; + $this->source = $_template->source; + if (!class_exists('Smarty_CacheResource', false)) { + include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php'; + } + $this->handler = Smarty_CacheResource::load($_template->smarty); + } + + /** + * @param Smarty_Internal_Template $_template + * + * @return Smarty_Template_Cached + */ + public static function load(Smarty_Internal_Template $_template) + { + $_template->cached = new Smarty_Template_Cached($_template); + $_template->cached->handler->populate($_template->cached, $_template); + // caching enabled ? + if (!$_template->caching || $_template->source->handler->recompiled + ) { + $_template->cached->valid = false; + } + return $_template->cached; + } + + /** + * Render cache template + * + * @param \Smarty_Internal_Template $_template + * @param bool $no_output_filter + * + * @throws \Exception + */ + public function render(Smarty_Internal_Template $_template, $no_output_filter = true) + { + if ($this->isCached($_template)) { + if ($_template->smarty->debugging) { + if (!isset($_template->smarty->_debug)) { + $_template->smarty->_debug = new Smarty_Internal_Debug(); + } + $_template->smarty->_debug->start_cache($_template); + } + if (!$this->processed) { + $this->process($_template); + } + $this->getRenderedTemplateCode($_template); + if ($_template->smarty->debugging) { + $_template->smarty->_debug->end_cache($_template); + } + return; + } else { + $_template->smarty->ext->_updateCache->updateCache($this, $_template, $no_output_filter); + } + } + + /** + * Check if cache is valid, lock cache if required + * + * @param \Smarty_Internal_Template $_template + * + * @return bool flag true if cache is valid + */ + public function isCached(Smarty_Internal_Template $_template) + { + if ($this->valid !== null) { + return $this->valid; + } + while (true) { + while (true) { + if ($this->exists === false || $_template->smarty->force_compile || $_template->smarty->force_cache) { + $this->valid = false; + } else { + $this->valid = true; + } + if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_CURRENT + && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime) + ) { + // lifetime expired + $this->valid = false; + } + if ($this->valid && $_template->compile_check === Smarty::COMPILECHECK_ON + && $_template->source->getTimeStamp() > $this->timestamp + ) { + $this->valid = false; + } + if ($this->valid || !$_template->smarty->cache_locking) { + break; + } + if (!$this->handler->locked($_template->smarty, $this)) { + $this->handler->acquireLock($_template->smarty, $this); + break 2; + } + $this->handler->populate($this, $_template); + } + if ($this->valid) { + if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) { + // load cache file for the following checks + if ($_template->smarty->debugging) { + $_template->smarty->_debug->start_cache($_template); + } + if ($this->handler->process($_template, $this) === false) { + $this->valid = false; + } else { + $this->processed = true; + } + if ($_template->smarty->debugging) { + $_template->smarty->_debug->end_cache($_template); + } + } else { + $this->is_locked = true; + continue; + } + } else { + return $this->valid; + } + if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED + && $_template->cached->cache_lifetime >= 0 + && (time() > ($_template->cached->timestamp + $_template->cached->cache_lifetime)) + ) { + $this->valid = false; + } + if ($_template->smarty->cache_locking) { + if (!$this->valid) { + $this->handler->acquireLock($_template->smarty, $this); + } elseif ($this->is_locked) { + $this->handler->releaseLock($_template->smarty, $this); + } + } + return $this->valid; + } + return $this->valid; + } + + /** + * Process cached template + * + * @param Smarty_Internal_Template $_template template object + * @param bool $update flag if called because cache update + */ + public function process(Smarty_Internal_Template $_template, $update = false) + { + if ($this->handler->process($_template, $this, $update) === false) { + $this->valid = false; + } + if ($this->valid) { + $this->processed = true; + } else { + $this->processed = false; + } + } + + /** + * Read cache content from handler + * + * @param Smarty_Internal_Template $_template template object + * + * @return string|false content + */ + public function read(Smarty_Internal_Template $_template) + { + if (!$_template->source->handler->recompiled) { + return $this->handler->readCachedContent($_template); + } + return false; + } +} diff --git a/sysplugins/smarty_template_compiled.php b/sysplugins/smarty_template_compiled.php new file mode 100644 index 0000000000000000000000000000000000000000..37d8f0a9efe2e931148873654c2e11c86ffd33a4 --- /dev/null +++ b/sysplugins/smarty_template_compiled.php @@ -0,0 +1,257 @@ +<?php + +/** + * Smarty Resource Data Object + * Meta Data Container for Template Files + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + * @property string $content compiled content + */ +class Smarty_Template_Compiled extends Smarty_Template_Resource_Base +{ + /** + * nocache hash + * + * @var string|null + */ + public $nocache_hash = null; + + /** + * get a Compiled Object of this source + * + * @param Smarty_Internal_Template $_template template object + * + * @return Smarty_Template_Compiled compiled object + */ + public static function load($_template) + { + $compiled = new Smarty_Template_Compiled(); + if ($_template->source->handler->hasCompiledHandler) { + $_template->source->handler->populateCompiledFilepath($compiled, $_template); + } else { + $compiled->populateCompiledFilepath($_template); + } + return $compiled; + } + + /** + * populate Compiled Object with compiled filepath + * + * @param Smarty_Internal_Template $_template template object + **/ + public function populateCompiledFilepath(Smarty_Internal_Template $_template) + { + $source = &$_template->source; + $smarty = &$_template->smarty; + $this->filepath = $smarty->getCompileDir(); + if (isset($_template->compile_id)) { + $this->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . + ($smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'); + } + // if use_sub_dirs, break file into directories + if ($smarty->use_sub_dirs) { + $this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . DIRECTORY_SEPARATOR . $source->uid[ 2 ] . + $source->uid[ 3 ] . DIRECTORY_SEPARATOR . $source->uid[ 4 ] . $source->uid[ 5 ] . + DIRECTORY_SEPARATOR; + } + $this->filepath .= $source->uid . '_'; + if ($source->isConfig) { + $this->filepath .= (int)$smarty->config_read_hidden + (int)$smarty->config_booleanize * 2 + + (int)$smarty->config_overwrite * 4; + } else { + $this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 + + (($smarty->merge_compiled_includes && $source->type === 'extends') ? + (int)$smarty->extends_recursion * 4 : 0); + } + $this->filepath .= '.' . $source->type; + $basename = $source->handler->getBasename($source); + if (!empty($basename)) { + $this->filepath .= '.' . $basename; + } + if ($_template->caching) { + $this->filepath .= '.cache'; + } + $this->filepath .= '.php'; + $this->timestamp = $this->exists = is_file($this->filepath); + if ($this->exists) { + $this->timestamp = filemtime($this->filepath); + } + } + + /** + * render compiled template code + * + * @param Smarty_Internal_Template $_template + * + * @return string + * @throws Exception + */ + public function render(Smarty_Internal_Template $_template) + { + // checks if template exists + if (!$_template->source->exists) { + $type = $_template->source->isConfig ? 'config' : 'template'; + throw new SmartyException("Unable to load {$type} '{$_template->source->type}:{$_template->source->name}'"); + } + if ($_template->smarty->debugging) { + if (!isset($_template->smarty->_debug)) { + $_template->smarty->_debug = new Smarty_Internal_Debug(); + } + $_template->smarty->_debug->start_render($_template); + } + if (!$this->processed) { + $this->process($_template); + } + if (isset($_template->cached)) { + $_template->cached->file_dependency = + array_merge($_template->cached->file_dependency, $this->file_dependency); + } + if ($_template->source->handler->uncompiled) { + $_template->source->handler->renderUncompiled($_template->source, $_template); + } else { + $this->getRenderedTemplateCode($_template); + } + if ($_template->caching && $this->has_nocache_code) { + $_template->cached->hashes[ $this->nocache_hash ] = true; + } + if ($_template->smarty->debugging) { + $_template->smarty->_debug->end_render($_template); + } + } + + /** + * load compiled template or compile from source + * + * @param Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + * + * @throws Exception + */ + public function process(Smarty_Internal_Template $_smarty_tpl) + { + $source = &$_smarty_tpl->source; + $smarty = &$_smarty_tpl->smarty; + if ($source->handler->recompiled) { + $source->handler->process($_smarty_tpl); + } elseif (!$source->handler->uncompiled) { + if (!$this->exists || $smarty->force_compile + || ($_smarty_tpl->compile_check && $source->getTimeStamp() > $this->getTimeStamp()) + ) { + $this->compileTemplateSource($_smarty_tpl); + $compileCheck = $_smarty_tpl->compile_check; + $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF; + $this->loadCompiledTemplate($_smarty_tpl); + $_smarty_tpl->compile_check = $compileCheck; + } else { + $_smarty_tpl->mustCompile = true; + @include $this->filepath; + if ($_smarty_tpl->mustCompile) { + $this->compileTemplateSource($_smarty_tpl); + $compileCheck = $_smarty_tpl->compile_check; + $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF; + $this->loadCompiledTemplate($_smarty_tpl); + $_smarty_tpl->compile_check = $compileCheck; + } + } + $_smarty_tpl->_subTemplateRegister(); + $this->processed = true; + } + } + + /** + * compile template from source + * + * @param Smarty_Internal_Template $_template + * + * @throws Exception + */ + public function compileTemplateSource(Smarty_Internal_Template $_template) + { + $this->file_dependency = array(); + $this->includes = array(); + $this->nocache_hash = null; + $this->unifunc = null; + // compile locking + if ($saved_timestamp = (!$_template->source->handler->recompiled && is_file($this->filepath))) { + $saved_timestamp = $this->getTimeStamp(); + touch($this->filepath); + } + // compile locking + try { + // call compiler + $_template->loadCompiler(); + $this->write($_template, $_template->compiler->compileTemplate($_template)); + } catch (Exception $e) { + // restore old timestamp in case of error + if ($saved_timestamp && is_file($this->filepath)) { + touch($this->filepath, $saved_timestamp); + } + unset($_template->compiler); + throw $e; + } + // release compiler object to free memory + unset($_template->compiler); + } + + /** + * Write compiled code by handler + * + * @param Smarty_Internal_Template $_template template object + * @param string $code compiled code + * + * @return bool success + * @throws \SmartyException + */ + public function write(Smarty_Internal_Template $_template, $code) + { + if (!$_template->source->handler->recompiled) { + if ($_template->smarty->ext->_writeFile->writeFile($this->filepath, $code, $_template->smarty) === true) { + $this->timestamp = $this->exists = is_file($this->filepath); + if ($this->exists) { + $this->timestamp = filemtime($this->filepath); + return true; + } + } + return false; + } + return true; + } + + /** + * Read compiled content from handler + * + * @param Smarty_Internal_Template $_template template object + * + * @return string content + */ + public function read(Smarty_Internal_Template $_template) + { + if (!$_template->source->handler->recompiled) { + return file_get_contents($this->filepath); + } + return isset($this->content) ? $this->content : false; + } + + /** + * Load fresh compiled template by including the PHP file + * HHVM requires a work around because of a PHP incompatibility + * + * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + */ + private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl) + { + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) + ) { + opcache_invalidate($this->filepath, true); + } elseif (function_exists('apc_compile_file')) { + apc_compile_file($this->filepath); + } + if (defined('HHVM_VERSION')) { + eval('?>' . file_get_contents($this->filepath)); + } else { + include $this->filepath; + } + } +} diff --git a/sysplugins/smarty_template_config.php b/sysplugins/smarty_template_config.php new file mode 100644 index 0000000000000000000000000000000000000000..850ae32e7c992ff9691acf4c0b110518c981e287 --- /dev/null +++ b/sysplugins/smarty_template_config.php @@ -0,0 +1,100 @@ +<?php +/** + * Smarty Config Source Plugin + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + */ + +/** + * Smarty Config Resource Data Object + * Meta Data Container for Template Files + * + * @package Smarty + * @subpackage TemplateResources + * @author Uwe Tews + */ +class Smarty_Template_Config extends Smarty_Template_Source +{ + /** + * array of section names, single section or null + * + * @var null|string|array + */ + public $config_sections = null; + + /** + * scope into which the config variables shall be loaded + * + * @var int + */ + public $scope = 0; + + /** + * Flag that source is a config file + * + * @var bool + */ + public $isConfig = true; + + /** + * Name of the Class to compile this resource's contents with + * + * @var string + */ + public $compiler_class = 'Smarty_Internal_Config_File_Compiler'; + + /** + * Name of the Class to tokenize this resource's contents with + * + * @var string + */ + public $template_lexer_class = 'Smarty_Internal_Configfilelexer'; + + /** + * Name of the Class to parse this resource's contents with + * + * @var string + */ + public $template_parser_class = 'Smarty_Internal_Configfileparser'; + + /** + * initialize Source Object for given resource + * Either [$_template] or [$smarty, $template_resource] must be specified + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty $smarty smarty object + * @param string $template_resource resource identifier + * + * @return Smarty_Template_Config Source Object + * @throws SmartyException + */ + public static function load( + Smarty_Internal_Template $_template = null, + Smarty $smarty = null, + $template_resource = null + ) { + static $_incompatible_resources = array('extends' => true, 'php' => true); + if ($_template) { + $smarty = $_template->smarty; + $template_resource = $_template->template_resource; + } + if (empty($template_resource)) { + throw new SmartyException('Source: Missing name'); + } + // parse resource_name, load resource handler + list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_config_type); + // make sure configs are not loaded via anything smarty can't handle + if (isset($_incompatible_resources[ $type ])) { + throw new SmartyException("Unable to use resource '{$type}' for config"); + } + $source = new Smarty_Template_Config($smarty, $template_resource, $type, $name); + $source->handler->populate($source, $_template); + if (!$source->exists && isset($smarty->default_config_handler_func)) { + Smarty_Internal_Method_RegisterDefaultTemplateHandler::_getDefaultTemplate($source); + $source->handler->populate($source, $_template); + } + return $source; + } +} diff --git a/sysplugins/smarty_template_resource_base.php b/sysplugins/smarty_template_resource_base.php new file mode 100644 index 0000000000000000000000000000000000000000..52bfba2525bd2d059bb1cb63ad9ee19c20322e25 --- /dev/null +++ b/sysplugins/smarty_template_resource_base.php @@ -0,0 +1,152 @@ +<?php + +/** + * Smarty Template Resource Base Object + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ +abstract class Smarty_Template_Resource_Base +{ + /** + * Compiled Filepath + * + * @var string + */ + public $filepath = null; + + /** + * Compiled Timestamp + * + * @var integer|bool + */ + public $timestamp = false; + + /** + * Compiled Existence + * + * @var boolean + */ + public $exists = false; + + /** + * Template Compile Id (Smarty_Internal_Template::$compile_id) + * + * @var string + */ + public $compile_id = null; + + /** + * Compiled Content Loaded + * + * @var boolean + */ + public $processed = false; + + /** + * unique function name for compiled template code + * + * @var string + */ + public $unifunc = ''; + + /** + * flag if template does contain nocache code sections + * + * @var bool + */ + public $has_nocache_code = false; + + /** + * resource file dependency + * + * @var array + */ + public $file_dependency = array(); + + /** + * Content buffer + * + * @var string + */ + public $content = null; + + /** + * Included sub templates + * - index name + * - value use count + * + * @var int[] + */ + public $includes = array(); + + /** + * Flag if this is a cache resource + * + * @var bool + */ + public $isCache = false; + + /** + * Process resource + * + * @param Smarty_Internal_Template $_template template object + */ + abstract public function process(Smarty_Internal_Template $_template); + + /** + * get rendered template content by calling compiled or cached template code + * + * @param \Smarty_Internal_Template $_template + * @param string $unifunc function with template code + * + * @throws \Exception + */ + public function getRenderedTemplateCode(Smarty_Internal_Template $_template, $unifunc = null) + { + $smarty = &$_template->smarty; + $_template->isRenderingCache = $this->isCache; + $level = ob_get_level(); + try { + if (!isset($unifunc)) { + $unifunc = $this->unifunc; + } + if (empty($unifunc) || !function_exists($unifunc)) { + throw new SmartyException("Invalid compiled template for '{$_template->template_resource}'"); + } + if ($_template->startRenderCallbacks) { + foreach ($_template->startRenderCallbacks as $callback) { + call_user_func($callback, $_template); + } + } + $unifunc($_template); + foreach ($_template->endRenderCallbacks as $callback) { + call_user_func($callback, $_template); + } + $_template->isRenderingCache = false; + } catch (Exception $e) { + $_template->isRenderingCache = false; + while (ob_get_level() > $level) { + ob_end_clean(); + } + if (isset($smarty->security_policy)) { + $smarty->security_policy->endTemplate(); + } + throw $e; + } + } + + /** + * Get compiled time stamp + * + * @return int + */ + public function getTimeStamp() + { + if ($this->exists && !$this->timestamp) { + $this->timestamp = filemtime($this->filepath); + } + return $this->timestamp; + } +} diff --git a/sysplugins/smarty_template_source.php b/sysplugins/smarty_template_source.php new file mode 100644 index 0000000000000000000000000000000000000000..16b47f23c13f0473ca2b25a7cb43c86ea25cf8b2 --- /dev/null +++ b/sysplugins/smarty_template_source.php @@ -0,0 +1,213 @@ +<?php + +/** + * Smarty Resource Data Object + * Meta Data Container for Template Files + * + * @package Smarty + * @subpackage TemplateResources + * @author Rodney Rehm + */ +class Smarty_Template_Source +{ + /** + * Unique Template ID + * + * @var string + */ + public $uid = null; + + /** + * Template Resource (Smarty_Internal_Template::$template_resource) + * + * @var string + */ + public $resource = null; + + /** + * Resource Type + * + * @var string + */ + public $type = null; + + /** + * Resource Name + * + * @var string + */ + public $name = null; + + /** + * Source Filepath + * + * @var string + */ + public $filepath = null; + + /** + * Source Timestamp + * + * @var integer + */ + public $timestamp = null; + + /** + * Source Existence + * + * @var boolean + */ + public $exists = false; + + /** + * Source File Base name + * + * @var string + */ + public $basename = null; + + /** + * The Components an extended template is made of + * + * @var \Smarty_Template_Source[] + */ + public $components = null; + + /** + * Resource Handler + * + * @var \Smarty_Resource + */ + public $handler = null; + + /** + * Smarty instance + * + * @var Smarty + */ + public $smarty = null; + + /** + * Resource is source + * + * @var bool + */ + public $isConfig = false; + + /** + * Template source content eventually set by default handler + * + * @var string + */ + public $content = null; + + /** + * Name of the Class to compile this resource's contents with + * + * @var string + */ + public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler'; + + /** + * Name of the Class to tokenize this resource's contents with + * + * @var string + */ + public $template_lexer_class = 'Smarty_Internal_Templatelexer'; + + /** + * Name of the Class to parse this resource's contents with + * + * @var string + */ + public $template_parser_class = 'Smarty_Internal_Templateparser'; + + /** + * create Source Object container + * + * @param Smarty $smarty Smarty instance this source object belongs to + * @param string $resource full template_resource + * @param string $type type of resource + * @param string $name resource name + * + * @throws \SmartyException + * @internal param \Smarty_Resource $handler Resource Handler this source object communicates with + */ + public function __construct(Smarty $smarty, $resource, $type, $name) + { + $this->handler = + isset($smarty->_cache[ 'resource_handlers' ][ $type ]) ? $smarty->_cache[ 'resource_handlers' ][ $type ] : + Smarty_Resource::load($smarty, $type); + $this->smarty = $smarty; + $this->resource = $resource; + $this->type = $type; + $this->name = $name; + } + + /** + * initialize Source Object for given resource + * Either [$_template] or [$smarty, $template_resource] must be specified + * + * @param Smarty_Internal_Template $_template template object + * @param Smarty $smarty smarty object + * @param string $template_resource resource identifier + * + * @return Smarty_Template_Source Source Object + * @throws SmartyException + */ + public static function load( + Smarty_Internal_Template $_template = null, + Smarty $smarty = null, + $template_resource = null + ) { + if ($_template) { + $smarty = $_template->smarty; + $template_resource = $_template->template_resource; + } + if (empty($template_resource)) { + throw new SmartyException('Source: Missing name'); + } + // parse resource_name, load resource handler, identify unique resource name + if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]([\s\S]*)$/', $template_resource, $match)) { + $type = $match[ 1 ]; + $name = $match[ 2 ]; + } else { + // no resource given, use default + // or single character before the colon is not a resource type, but part of the filepath + $type = $smarty->default_resource_type; + $name = $template_resource; + } + // create new source object + $source = new Smarty_Template_Source($smarty, $template_resource, $type, $name); + $source->handler->populate($source, $_template); + if (!$source->exists && isset($_template->smarty->default_template_handler_func)) { + Smarty_Internal_Method_RegisterDefaultTemplateHandler::_getDefaultTemplate($source); + $source->handler->populate($source, $_template); + } + return $source; + } + + /** + * Get source time stamp + * + * @return int + */ + public function getTimeStamp() + { + if (!isset($this->timestamp)) { + $this->handler->populateTimestamp($this); + } + return $this->timestamp; + } + + /** + * Get source content + * + * @return string + * @throws \SmartyException + */ + public function getContent() + { + return isset($this->content) ? $this->content : $this->handler->getContent($this); + } +} diff --git a/sysplugins/smarty_undefined_variable.php b/sysplugins/smarty_undefined_variable.php new file mode 100644 index 0000000000000000000000000000000000000000..6d31a8a05552ef49ae7f0e52c2f95c9c4ddbb68d --- /dev/null +++ b/sysplugins/smarty_undefined_variable.php @@ -0,0 +1,33 @@ +<?php + +/** + * class for undefined variable object + * This class defines an object for undefined variable handling + * + * @package Smarty + * @subpackage Template + */ +class Smarty_Undefined_Variable extends Smarty_Variable +{ + /** + * Returns null for not existing properties + * + * @param string $name + * + * @return null + */ + public function __get($name) + { + return null; + } + + /** + * Always returns an empty string. + * + * @return string + */ + public function __toString() + { + return ''; + } +} diff --git a/sysplugins/smarty_variable.php b/sysplugins/smarty_variable.php new file mode 100644 index 0000000000000000000000000000000000000000..914d99bd72dc0f1961fc850ec11d9a66f87392e9 --- /dev/null +++ b/sysplugins/smarty_variable.php @@ -0,0 +1,47 @@ +<?php + +/** + * class for the Smarty variable object + * This class defines the Smarty variable object + * + * @package Smarty + * @subpackage Template + */ +class Smarty_Variable +{ + /** + * template variable + * + * @var mixed + */ + public $value = null; + + /** + * if true any output of this variable will be not cached + * + * @var boolean + */ + public $nocache = false; + + /** + * create Smarty variable object + * + * @param mixed $value the value to assign + * @param boolean $nocache if true any output of this variable will be not cached + */ + public function __construct($value = null, $nocache = false) + { + $this->value = $value; + $this->nocache = $nocache; + } + + /** + * <<magic>> String conversion + * + * @return string + */ + public function __toString() + { + return (string)$this->value; + } +} diff --git a/sysplugins/smartycompilerexception.php b/sysplugins/smartycompilerexception.php new file mode 100644 index 0000000000000000000000000000000000000000..f7ad39b93124e862df4dad8fb04b2bb770593598 --- /dev/null +++ b/sysplugins/smartycompilerexception.php @@ -0,0 +1,45 @@ +<?php + +/** + * Smarty compiler exception class + * + * @package Smarty + */ +class SmartyCompilerException extends SmartyException +{ + /** + * @return string + */ + public function __toString() + { + return ' --> Smarty Compiler: ' . $this->message . ' <-- '; + } + + /** + * The line number of the template error + * + * @type int|null + */ + public $line = null; + + /** + * The template source snippet relating to the error + * + * @type string|null + */ + public $source = null; + + /** + * The raw text of the error message + * + * @type string|null + */ + public $desc = null; + + /** + * The resource identifier or template name + * + * @type string|null + */ + public $template = null; +} diff --git a/sysplugins/smartyexception.php b/sysplugins/smartyexception.php new file mode 100644 index 0000000000000000000000000000000000000000..7f7b9aa435d19818b744e3c63f832000d95d7a8e --- /dev/null +++ b/sysplugins/smartyexception.php @@ -0,0 +1,19 @@ +<?php + +/** + * Smarty exception class + * + * @package Smarty + */ +class SmartyException extends Exception +{ + public static $escape = false; + + /** + * @return string + */ + public function __toString() + { + return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- '; + } +} diff --git a/templates/add_eti.tpl b/templates/add_eti.tpl new file mode 100644 index 0000000000000000000000000000000000000000..ff6a305d58b67ceb1a241c951bab0ae382911c9b --- /dev/null +++ b/templates/add_eti.tpl @@ -0,0 +1,117 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <h2 style = "text-align: center;">{$mensaje}</h2> + <div class="clearfix"></div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="add_eti.php?variable={$id_admin}&accion=1&id={$sujeto[0]}" method="post"> + + <!-- DNI --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" disabled type="text" + value="{$sujeto[0]}"> + </div> + </div> + + <div class="x_panel"> + <h2 style = "text-align: center;">Etiología</h2> + <div class="clearfix"></div> + <!-- Etiologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text"> + </div> + </div> + + <!-- Fecha lesion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="fecha_lesion" required type="date"> + </div> + </div> + + <!-- Cuadrantes --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="cuadrantes" type="text"> + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text"> + </div> + </div> + + + <!-- Patologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" required name="patologia"> + <option value=""></option> + {foreach item=element from=$patologias} + <option value="{$element}">{$element}</option> + {/foreach} + </select> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + function cancel() { + window.location.href="pac_reg.php?variable={$id_admin}&id={$sujeto[0]}"; + } + +</script> +{include file="footer.tpl"} diff --git a/templates/add_gestor.tpl b/templates/add_gestor.tpl new file mode 100644 index 0000000000000000000000000000000000000000..63b1e1bd17f54743f7827c3681196f5b0db459c0 --- /dev/null +++ b/templates/add_gestor.tpl @@ -0,0 +1,121 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="page-title"> + <div class="title_left"> + </div> + + </div> + <div class="clearfix"></div> + + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_title"> + <h2> {$mensaje}<small></small></h2> + <div class="clearfix"></div> + </div> + <div class="x_content"> + + <form class="form-horizontal form-label-left" action="add_gestor.php?variable={$id_admin}" method="post"> +{literal} + <!-- id_admin --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" pattern="[0-9]{8}[A-Z]" required maxlength="30" name="dni_trabajador" placeholder="Introduzca un número válido 8 num + Letra"> + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="100" type="text" name="nombre"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="200" type="text" name="apellidos"> + </div> + </div> + + <!-- login --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="15" type="text" name="login"> + </div> + </div> + + <!-- titulacion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="20" type="text" name="titulacion"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="pass"> + </div> + </div> + + <!-- Repass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="passrw"> + </div> + </div> + + <!-- Permisos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" pattern="[01]{1}" required type="text" name="permisos" placeholder="0:Trabajador - 1:Administrador"> + </div> + </div> +{/literal} + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Validar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + function cancel() { + window.location.href="result.php?variable={$id_admin}"; + } + +</script> +{include file="footer.tpl"} diff --git a/templates/add_pac.tpl b/templates/add_pac.tpl new file mode 100644 index 0000000000000000000000000000000000000000..742c4d6ada92a383021ad52d428fcab813d4262c --- /dev/null +++ b/templates/add_pac.tpl @@ -0,0 +1,177 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <h2 style = "text-align: center;">{$mensaje}</h2> + <div class="clearfix"></div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="add_pac.php?variable={$id_admin}" method="post"> + + <!-- DNI --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" required type="text" + value="{$sujeto[0]}"> + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="{$sujeto[1]}" + {* <span class="fa fa-clock-o form-control-feedback right" aria-hidden="true"></span> *}> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="apellidos" required type="text" value="{$sujeto[2]}"> + </div> + </div> + + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="edad" required type="date" value="{$sujeto[4]}"> + </div> + </div> + + + <!-- Sexo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" {if $sujeto[3] == "M"} checked="" value="{$sujeto[3]}" {else} value="M" {/if} name="sexo" style="margin-left: 0px;"> + </div> + </div> + </div> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" {if $sujeto[3] == "F"} checked="" value="{$sujeto[3]}" {else} value="F" {/if} name="sexo" style="margin-left: 0px;" > + </div> + </div> + </div> + + <!-- Anotaciones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text" value="{$sujeto[5]}"> + </div> + </div> + + + <div class="x_panel"> + <h2 style = "text-align: center;">Etiología</h2> + <div class="clearfix"></div> + <!-- Etiologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text"> + </div> + </div> + + <!-- Fecha lesion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="fecha_lesion" required type="date"> + </div> + </div> + + <!-- Cuadrantes --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="cuadrantes" type="text"> + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text"> + </div> + </div> + + + <!-- Patologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" required name="patologia"> + <option value=""></option> + {foreach item=element from=$patologias} + <option value="{$element}">{$element}</option> + {/foreach} + </select> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + //estado(); + function cancel() { + window.location.href="result.php?variable={$id_admin}"; + } + +</script> +{include file="footer.tpl"} diff --git a/templates/add_reg.tpl b/templates/add_reg.tpl new file mode 100644 index 0000000000000000000000000000000000000000..c9711fb376f7ca49c9dc4928abdb589bdce69555 --- /dev/null +++ b/templates/add_reg.tpl @@ -0,0 +1,175 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + + + <!-- tabla para seleccionar sujeto --> + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, "asc" ]]"> + + <thead> + <tr> + <td>DNI</td> + <td>Nombre</td> + <td>Apellidos</td> + <td>Sexo</td> + <td >Edad</td> + <td>Anotaciones del paciente</td> + + </tr> + </thead> + + <tbody> + {foreach from=$campos item=element} + <tr > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]}</td> + <td>{$element[3]}</td> + <td>{$element[4]} ({$element[6]|date_format:"%d/%m/%Y"})</td> + <td>{$element[5]}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + </div> + <h2 style = "text-align: center;">Información del paciente</h2> + <form class="form-horizontal form-label-left" action="add_reg_val.php?variable={$id_admin}" method="post"> + <!-- DNI --> + + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="dni_paciente" type="text" value="{$sujeto[0]}" readonly="readonly" > + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="nombre" type="text" value="{$sujeto[1]}" readonly="readonly"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="apellidos" type="text" value="{$sujeto[2]}" readonly="readonly" > + </div> + </div> + + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="date" value="{$sujeto[4]}" readonly="readonly" > + </div> + </div> + + + + <!-- ensayo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" name="ensayo" required> + <option value=""></option> + {foreach item=element from=$ensayos} + <option value="{$element}">{$element}</option> + {/foreach} + </select> + </div> + </div> + + <!-- Simetria --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text"> + </div> + </div> + + <!-- Anotaciones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text"> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + {if $sujeto[0]!=""}<button id="send" type="submit" class="btn btn-success">Iniciar</button>{/if} + {if $sujeto[0]!=""}<button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button>{/if} + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + //estado(); + function cancel() { + window.location.href="pac_reg.php?variable={$id_admin}&id={$sujeto[0]}"; + } + function limpiar() { + window.location.href="add_reg.php?variable={$id_admin}"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="add_reg.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0]; + } ); + } ); + +</script> +{include file="footer.tpl"} diff --git a/templates/add_reg_val.tpl b/templates/add_reg_val.tpl new file mode 100644 index 0000000000000000000000000000000000000000..e0ba8c6d583b39636d144a4f48bc9e48fdd1c49a --- /dev/null +++ b/templates/add_reg_val.tpl @@ -0,0 +1,196 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://arduiacob.i234.me:8240/{$get}" target="esp"> + <button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button> + </form> + </div> + </div> + </div> + + <div class="col-md-4 col-sm-4 col-xs-4"> + + <div class="x_panel"> + <div class="x_content"> + <iframe name="esp" id="esp" src="http://arduiacob.i234.me:8240/{$get}" ></iframe> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://arduiacob.i234.me:8240/{$get}" target="esp"> + <button type="submit" formmethod="get" formnovalidate>Reset ESP</button> + </form> + <div > + <img style='height: 300px;' src="{$imagen}"> + </div> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <div > + <h2><strong>Colocación sensores:</strong></h2> + <h2>{$coloc_sensores}</h2> + </div> + </div> + </div> + </div> + + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + </div> + </div> + </div> + + <div class="col-md-6 col-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <h1>{$segundos}:00</h1> + </div> + </div> + <div class="x_panel"> + <div class="x_content"> + <button type="submit" formmethod="get" id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button> + <button type="submit" formmethod="get" id="salir" class="btn btn-danger" onclick="salir()" formnovalidate>Salir</button> + </div> + </div> + </div> + <div class="col-md-6 col-sm-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <div id="foto"> + Aviso + </div> + </div> + </div> + </div> + </div> + </div> +</div> + +<script type="text/javascript"> +window.onload = function() { + var oFrame = document.getElementById("esp"); + oFrame.contentWindow.document.onclick = function() { + alert("frame contents clicked"); + }; +}; +</script> + +<script type="text/javascript"> + let h1 = document.querySelector("h1"); + + let centesimas = 0; + let segundos = {$segundos}; + + var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); + var snd2 = new Audio("media/audio/check.mp3"); + + var intervalo = 0; + var intervaloBase = segundos/{$repeticiones}; + var repSg = segundos-1; + var repCnt = 99; + var estado = 0; + $('#done').hide(); + + console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", {$repeticiones}); + function run(){ + if (estado ==0){ + if((centesimas == 0) &&( segundos == 0)){ + check(); + h1.style.color = 'red'; + $("#foto").html("<h1><strong>FIN</strong></h1>"); + $('#done').show(); + estado = 1; + // función para hacer un delay antes del windows location + // esperamos 2 segundos + function stateChange(newState) { + setTimeout(function () { + if (newState == -1) { + /* + * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde. + * / + $.post("comprobar_post.php", {literal} { + recarga:'info' , + puesto: {/literal}{$puesto}{literal}, + linea: '{/literal}{$linea}{literal}', + cambio: {/literal}{$prox_cambio}{literal}, + serie: '{/literal}{$serie}{literal}', + foto: '{/literal}{$imagen}{literal}', + posicion_ant: {/literal}{$posicion}{literal} + } {/literal} , + function(data){ + //recarga titulo y barcode + $("#resultado").html(data); + }); + //*/ + alert("Saliendo"); + window.location.href="result.php?variable={$id_admin}"; + } + }, 2000); + } + + }else{ + // Comprobamos que llegamos a una repetición y ponemos un aviso + if(centesimas == repCnt && segundos == repSg) { + console.log("intervalo = ", repSg,":",repCnt); + $("#foto").html("<h1><strong>{$ensayo}</strong></h1>"); + beep(); + } + // quitamos el aviso 1seg despues y preparamos la siguiente repeticion + if(centesimas == repCnt && segundos == repSg - 1) { + intervalo = intervalo + intervaloBase; + repSg = {$segundos} - Math.trunc(intervalo) - 1; + repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100); + console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas); + $("#foto").html("<h1><strong>Reposo</strong></h1>"); + } + + if(centesimas == 0){ + --segundos; + centesimas = 99; + }else{ + --centesimas; + } + h1.innerHTML = segundos +':'+centesimas; + + } + + } + } + + function inicio(){ + $('#salir').hide(); + $('#init').hide(); + segundos = {$segundos}; + setInterval(run, 10); + } + function done() { + window.location.href="ver_datos_paciente.php?variable={$id_admin}&id={$id_prueba}"; + } + function salir() { + window.location.href="add_reg.php?variable={$id_admin}&id={$dni_paciente}&id_prueba={$id_prueba}&accion=1"; + } + function beep() { + snd1.play(); + } + function check(){ + snd2.play(); + } +</script> +{include file="footer.tpl"} diff --git a/templates/barra.tpl b/templates/barra.tpl new file mode 100644 index 0000000000000000000000000000000000000000..fcff28b81721e6ec7b07929ff1c057dcf74ba469 --- /dev/null +++ b/templates/barra.tpl @@ -0,0 +1,149 @@ +<!-- Barra de menu --> +{if $id_admin == 4100001} +<body class="nav-sm"> +{else} +<body class="nav-md"> +{/if} + <div class="container body"> + <div class="main_container"> + + <!-- Contenedor total --> + <div class="col-md-3 left_col menu_fixed"> + <div class="left_col scroll-view"> + <div class="navbar nav_title" style="border: 0;"> + <a data-toggle="tooltip" data-placement="bottom" title="Inicio" href="result.php?variable={$id_admin}" class="site_title"><i class="fa fa-home"></i> <span style="font-size: 0.8em; ">Sensores de presión</span></a> + </div> + <div class="clearfix"></div> + + <!-- menu profile quick info --> + <div class="profile clearfix"> + <div class="profile_pic"> + <img src="{$imagen_id}" alt="Foto trabajador" class="img-circle profile_img"> + </div> + <div class="profile_info"> + <span>Bienvenido,</span> + <h2>{$nombre}</h2> + </div> + </div> + <!-- /menu profile quick info --> + + <br/> + + <!-- sidebar menu --> + <div id="sidebar-menu" class="main_menu_side hidden-print main_menu"> + <div class="menu_section"> +<!-- GENERAL --> + <h3>General</h3> + <ul class="nav side-menu"> + <!-- AÑADIR PACIENTES --> + <li><a href="add_pac.php?variable={$id_admin}">Añadir pacientes</a></li> + <!-- REALIZAR PRUEBA --> + <li><a href="add_reg.php?variable={$id_admin}">Realizar prueba</a></li> + <!-- GESTIONAR ENSAYOS --> + <li><a href="ges_ens.php?variable={$id_admin}">Gestionar ensayos</a></li> + <!-- GESTIONAR PATOLOGIAS --> + <li><a href="ges_pat.php?variable={$id_admin}">Gestionar patologías</a></li> + + +<!-- OTROS --> + <h3>Otros</h3> + <ul class="nav side-menu"> + +<!-- PAGINAS ADICIONALES --> + + <li><a data-toggle="tooltip" data-placement="top" title="Gestión de Sujetos Sanos"><i class="fa fa-bug" ></i> Gestión de sujetos <span class="fa fa-chevron-down"></span></a> + <ul class="nav child_menu"> + <li><a href="prueba_sujeto.php?variable={$id_admin}">Añadir prueba a sujeto</a></li> + <li><a href="ver_pruebas_sujetos.php?variable={$id_admin}">Ver pruebas de sujetos</a></li> + </li> + </ul> + </li> + </ul> + </div> + </div> + + <!-- /sidebar menu --> + + <!-- /menu footer buttons --> + <div class="sidebar-footer hidden-small"> + <!-- Quito la configuración de perfil + <a data-toggle="tooltip" data-placement="top" title="Settings" href="mod_perfil.php?variable={$id_admin}"> + <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> + </a> Quito la pantalla completa + <a data-toggle="tooltip" data-placement="top" title="FullScreen"> + <span class="glyphicon glyphicon-fullscreen" aria-hidden="true" onclick="fullscreen()"></span> + </a> --> + <!-- Quito el bloqueo + <a data-toggle="tooltip" data-placement="top" title="Lock"> + <span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span> + </a> --> + <a data-toggle="tooltip" data-placement="top" title="Logout" href="log_out.php"> + <span class="glyphicon glyphicon-off" aria-hidden="true"></span> + </a> + </div> + <!-- /menu footer buttons --> + </div> + </div> + + <!-- top navigation --> + <div class="top_nav"> + <div class="nav_menu"> + <nav> + <div class="nav toggle"> + <a id="menu_toggle"><i class="fa fa-bars"></i></a> + </div> + <!-- Aquí se muestra la información de cargando que habrá que modificar--> + <ul class="nav navbar-nav navbar-left"><h4 id="titulo" style="margin-top: 19px;" ><!-- <i class="fa fa-spinner fa-spin fa-fw"></i> Cargando. Espere --> </h4></ul> + <ul class="nav navbar-nav navbar-right"> + <!-- Aquí se muestra la información de cargando que habrá que modificar--> + <li class=""> + <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + <img src="{$imagen_id}" alt="Foto trabajador"> + <span class=" fa fa-angle-down"></span> + </a> + <ul class="dropdown-menu dropdown-usermenu pull-right"> + <li><a href="mod_pass.php?variable={$id_admin}"><i class="fa fa-cogs pull-right"></i>Cambiar contraseña</a></li> + + <li><a href="log_out.php"><i class="fa fa-sign-out pull-right"></i> Cerrar sesión</a></li> + + </ul> + </li> + <!-- Modificar Usuarios si se tiene permiso--> + {if $permisos == 1 } + <li class=""> + <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Gestión + <span class=" fa fa-angle-down"></span> + </a> + <ul class="dropdown-menu dropdown-usermenu pull-right"> + <li><a href="add_gestor.php?variable={$id_admin}">Añadir trabajador</a></li> + <li><a href="mod_gestor.php?variable={$id_admin}">Modificar trabajador</a></li> + + </ul> + </li> + {/if} + + </ul> + </nav> + </div> + </div> + <!-- /top navigation --> + + <!-- page content --> + <div class="right_col" role="main" id="contenido"> + +<!-- +<script type="text/javascript"> + $(document).ready(function(){ + /** + * Determinar si una imagen existe por la propiedad naturalHeight + * la cual sera diferente de 0 si esta existe + **/ + $('img').each(function(){ + if($(this)[0].naturalHeight == 0){ + $(this).attr('src','media/images/no_image/no_image.png'); + } + }); +}); +</script> +--> \ No newline at end of file diff --git a/templates/endTabla.tpl b/templates/endTabla.tpl new file mode 100644 index 0000000000000000000000000000000000000000..28dcd7919b8dabee174591841b1eb2f6e3f6b0fe --- /dev/null +++ b/templates/endTabla.tpl @@ -0,0 +1,88 @@ + <!-- Se cierra la tabla --> + + <!-- Ahora hay que cerrar las etiquetas--> + </table> + +<script type="text/javascript"> + + $(document).ready(function() { + var columnas= [ + { width: '7%', targets: 0 }, + { width: '7%', targets: 1 }, + { width: '46%', targets: 2 }, + { width: '10%', targets: 3 }, + { width: '10%', targets: 4 }, + { width: '10%', targets: 5 , render: $.fn.dataTable.render.moment('YYYY-MM-DD hh:mm:ss', 'DD-MM-YYYY hh:mm:ss')},//hora + { width: '10%', targets: 6 } + ]; + $('#datatable').DataTable({ + dom: 'Bfrtip', + lengthMenu: [ + [ 100, 250, 500, -1 ], + [ '100 filas', '250 filas', '500 filas', 'Todas las filas' ] + ], + autoWidth: true, + fixedHeader: false, + columnDefs: columnas, + FixedColumns: true , + buttons: [ + 'pageLength', + { + extend: 'collection', + text: 'Exportar', + buttons: [ + 'copy', + { + extend: 'pdf', + text: 'PDF', + exportOptions: { + modifier: { + page: 'current' + } + }, + message: 'PDF creado por Paula & co.', + header: true, + title: 'Prioridades del Kaizen', + //orientation: 'landscape', + download: 'open', + customize: function(doc) { + doc.defaultStyle.fontSize = 6; //<-- set fontsize to 16 instead of 10 + doc.pageOrientation = 'landscape'; + doc.styles.tableHeader.fontSize = 7; + doc.styles.tableHeader.color ='white'; + doc.styles.title.fontSize = 10; + //console.log(doc.content.table.margin); + + //doc.styles.table.alignment = 'center'; + // NO VA doc.styles.table.width = 50; + } + }, + 'csv', 'excel', + { + extend: 'print', + text: 'Imprimir', + autoPrint: true, + exportOptions: { + columns: ':visible', + }, + customize: function (win) { + $(win.document.body).find('table').addClass('display').css('font-size', '7px'); + $(win.document.body).find('tr:nth-child(odd) td').each(function(index){ + $(this).css('background-color','#D0D0D0'); + }); + //mio + $(win.document.body).find('h1').css('font-size','20px'); + $(win.document.body).find('h1').css('margin-bottom','20px'); + $(win.document.body).find('h1').css('text-align','center'); + } + + } + ] + } + ] + + }); + + } ); + +</script> diff --git a/templates/footer.tpl b/templates/footer.tpl new file mode 100644 index 0000000000000000000000000000000000000000..6ecec10e03720a88abfd20bad1da436ca79f1ce4 --- /dev/null +++ b/templates/footer.tpl @@ -0,0 +1,33 @@ + <!-- Java Script... --> + + + <!--******************************************************** + <script type="text/javascript" src="/sources/dropzone/dist/dropzone.js"></script>--> + + + <script type="text/javascript" src="/sources/js/custom.min.iacob.js"></script> + <!-- ECharts --> + <script type="text/javascript" src="/sources/echarts/dist/echarts.min.js"></script> + + + <!-- hemos traducido parte del fichero para la barra de búsqueda --> + <script type="text/javascript" src="/sources/js/jquery.dataTables.es.min.js"></script> + + + <!-- para datatables --> + + <script type="text/javascript" src="/sources/js/dataTables.bootstrap.min.js"></script> + <script type="text/javascript" src="/sources/js/dataTables.fixedColumns.min.js"></script> + + <!-- para los botones pdf excel csv print... --> + + <!-- hemos traducido parte del fichero para el boton "show" --> + <script type="text/javascript" src="/sources/Buttons-1.3.1/js/dataTables.buttons.es.min.js"></script> + <script type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.flash.min.js"></script> + <script type="text/javascript" src="/sources/JSZip-3.1.3/jszip.min.js"></script> + + <script type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.html5.min.js"></script> + <script type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.print.min.js"></script> + +</body> +</html> \ No newline at end of file diff --git a/templates/ges_ens.tpl b/templates/ges_ens.tpl new file mode 100644 index 0000000000000000000000000000000000000000..001fbbe5914a91e6ac6dcc90547c4354daa8dbeb --- /dev/null +++ b/templates/ges_ens.tpl @@ -0,0 +1,198 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + {if $mod_campos} + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + <div class="clearfix"></div> + <form class="form-horizontal form-label-left" action="ges_ens_val.php?variable={$id_admin}&id={$mod_campos[0]}" method="post"> +{literal} + <!-- id_ensayo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_ensayo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="id_ensayo" required disabled type="text" + {/literal}value="{$mod_campos[0]}" >{literal} + </div> + </div> + + <!-- Tipo/Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" {/literal}value="{$mod_campos[1]}" >{literal} + </div> + </div> + + <!-- Colocacion Sensores --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación sensores * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea class="form-control col-md-7 col-xs-12" rows="3" data-validate-length-range="300" name="coloc_sensores" required type="text">{/literal}{$mod_campos[2]}{literal}</textarea> + </div> + </div> + + <!-- Duracion --> + <!--<div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duracion * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="duracion" required type="decimal" {/literal}value="{$mod_campos[3]}" >{literal} + </div> + </div>--> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duración * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" required name="duracion"> + <option value=""></option> + <option value="10">10</option> + <option value="30">30</option> + <option value="45">45</option> + <option value="60">60</option> + <option value="75">75</option> + <option value="90">90</option> + </select> + </div> + </div> + + <!-- Repeticiones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="decimal" {/literal}value="{$mod_campos[4]}" >{literal} + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text" {/literal}value="{$mod_campos[5]}" >{literal}</textarea> + </div> + </div> +{/literal} + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + <button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button> + </div> + </div> + </form> + + </div> + {else} + + <!-- tabla para seleccionar patologia --> + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + <div class="clearfix"></div> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, "asc" ]]"> + + <thead> + <tr> + <td>id_ensayo</td> + <td>Tipo / Nombre</td> + <td>Colocación Sensores</td> + <td>Duración</td> + <td>Repeticiones</td> + <td>Comentarios</td> + <td>Fecha creación</td> + <td>Fecha modificación</td> + </tr> + </thead> + + <tbody> + {foreach from=$campos item=element} + <tr > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]}</td> + <td>{$element[3]}</td> + <td>{$element[4]}</td> + <td>{$element[5]}</td> + <td>{$element[6]|date_format:"%d/%m/%Y"}</td> + <td>{$element[7]|date_format:"%d/%m/%Y"}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + <div class="col-md-6 col-md-offset-3"> + <button onclick="n_ensayo()" type="button" class="btn btn-primary">Nuevo ensayo</button> + </div> + </div> + {/if} + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + //estado(); + function cancel() { + window.location.href="ges_ens.php?variable={$id_admin}"; + } + function eliminar() { + var reply=confirm("¿Seguro que desea borrar el ensayo? \nSe borrarán todas las pruebas asociadas a este ensayo.") + if (reply==true) + { + window.location.href="ges_ens.php?variable={$id_admin}&id={$mod_campos[0]}&accion=1"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + function n_ensayo() { + window.location.href="ges_ens_nuevo.php?variable={$id_admin}"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ges_ens.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0]; + } ); + } ); + +</script> + {include file="footer.tpl"} diff --git a/templates/ges_ens_nuevo.tpl b/templates/ges_ens_nuevo.tpl new file mode 100644 index 0000000000000000000000000000000000000000..cbc3f75631bfedd749375ad8fe7834305dc68e59 --- /dev/null +++ b/templates/ges_ens_nuevo.tpl @@ -0,0 +1,108 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_title"> + <h2> {$mensaje}<small></small></h2> + <div class="clearfix"></div> + </div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="ges_ens_nuevo.php?variable={$id_admin}" method="post"> + + <!-- Tipo / Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo (Nombre) *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" > + </div> + </div> + + <!-- Colocacion sensores --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación Sensores *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="300" name="coloc_sensores" required type="text" > + </div> + </div> + + + <!-- Duracion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duración * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" required name="duracion"> + <option value=""></option> + <option value="10">10</option> + <option value="30">30</option> + <option value="45">45</option> + <option value="60">60</option> + <option value="75">75</option> + <option value="90">90</option> + </select> + </div> + </div> + + <!-- Repeticiones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="number" placeholder="Número de repeticiones"> + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="textarea" > + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + //estado(); + function cancel() { + window.location.href="ges_ens.php?variable={$id_admin}"; + } + +</script> +{include file="footer.tpl"} diff --git a/templates/ges_pat.tpl b/templates/ges_pat.tpl new file mode 100644 index 0000000000000000000000000000000000000000..1f8dfecf14ceafef44cb577b56fe36f34cb0f9b5 --- /dev/null +++ b/templates/ges_pat.tpl @@ -0,0 +1,134 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> + + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + {if $mod_campos} + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + <div class="clearfix"></div> + <form class="form-horizontal form-label-left" action="ges_pat_val.php?variable={$id_admin}&id={$mod_campos[0]}" method="post"> +{literal} + <!-- id_patologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_patologia + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="id_patologia" required disabled type="text" + {/literal}value="{$mod_campos[0]}" >{literal} + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" {/literal}value="{$mod_campos[1]}" >{literal} + </div> + </div> + + <!-- Descripción --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" {/literal}value="{$mod_campos[2]}" >{literal} + </div> + </div> +{/literal} + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + <button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button> + </div> + </div> + </form> + + </div> + {else} + + <!-- tabla para seleccionar patologia --> + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + <div class="clearfix"></div> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, "asc" ]]"> + + <thead> + <tr> + <td>id_patologia</td> + <td>Nombre</td> + <td>Descripción</td> + </tr> + </thead> + + <tbody> + {foreach from=$campos item=element} + <tr > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + <div class="col-md-6 col-md-offset-3"> + <button onclick="n_patologia()" type="button" class="btn btn-primary">Nueva patologia</button> + </div> + </div> + {/if} + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + + function cancel() { + window.location.href="ges_pat.php?variable={$id_admin}"; + } + function eliminar() { + var reply=confirm("¿Seguro que desea borrar la patologia?") + if (reply==true) + { + window.location.href="ges_pat.php?variable={$id_admin}&id={$mod_campos[0]}&accion=1"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + function n_patologia() { + window.location.href="ges_pat_nueva.php?variable={$id_admin}"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ges_pat.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0]; + } ); + } ); + +</script> +{include file="footer.tpl"} diff --git a/templates/ges_pat_nueva.tpl b/templates/ges_pat_nueva.tpl new file mode 100644 index 0000000000000000000000000000000000000000..9d29034a215da1d44714ca7f8d6afcd3d9769ad4 --- /dev/null +++ b/templates/ges_pat_nueva.tpl @@ -0,0 +1,72 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_title"> + <h2> {$mensaje}<small></small></h2> + <div class="clearfix"></div> + </div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="ges_pat_nueva.php?variable={$id_admin}" method="post"> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" > + </div> + </div> + + <!-- Descripción --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" > + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + //estado(); + function cancel() { + window.location.href="ges_pat.php?variable={$id_admin}"; + } + +</script> +{include file="footer.tpl"} diff --git a/templates/head.tpl b/templates/head.tpl new file mode 100644 index 0000000000000000000000000000000000000000..5c5e0384e63b61512675945ee76c618c6408cbe2 --- /dev/null +++ b/templates/head.tpl @@ -0,0 +1,67 @@ +<html lang="es"> +<head> + <link rel="icon" href="media/images/favicon/sensor.png"> + <title>TFG. Sensor de presión</title> + + <title>{$titulo}</title> + <meta charset="utf-8"> + <!-- Al ser un entorno Mobile first, tendremos que corregir la escala y ancho de inicio del dispositivo --> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + + <!-- Estilo bootstrap...--> + + <link rel="stylesheet" type="text/css" href="/sources/css/bootstrap-datetimepicker.min.css"/> + <link rel="stylesheet" type="text/css" href="/sources/bootstrap/dist/css/bootstrap.css"/> + <link rel="stylesheet" type="text/css" href="/sources/css/daterangepicker.css"/> + + <!-- para datatables --> + <link rel="stylesheet" type="text/css" href="/sources/css/dataTables.bootstrap.min.css"/> + <link rel="stylesheet" type="text/css" href="/sources/css/fixedColumns.dataTables.min.css"/> + + <!-- para los botones pdf excel... --> + + <link rel="stylesheet" type="text/css" href="/sources/Buttons-1.3.1/css/buttons.dataTables.min.css"/> + + <!-- ******************************************************--> + + <!-- Font Awesome --> + <link rel="stylesheet" type="text/css" href="/sources/font-awesome/css/font-awesome.min.css"> + + <!-- Teclado virtual --> + + <link rel="stylesheet" href="css/styles.css"> + + <!-- Custom Theme Style --> + <link rel="stylesheet" type="text/css" href="/sources/css/custom.iacob.css"> + + + <!-- ******************************************************** --> + + <!-- Nuestro estilo propio... --> + + <link rel="stylesheet" type="text/css" href="/sources/css/estilo.css"/> + + <!-- jquery + <script type="text/javascript" src="/sources/jQuery-3.2.1/jquery-3.2.1.js"></script>--> + <!-- --> + <script type="text/javascript" src="/sources/jquery/dist/jquery.min.js"></script> + <script type="text/javascript" src="/sources/js/bootstrap.js"></script> + <!-- Select2 -> + <script type="text/javascript" src="/sources/select2/dist/js/select2.full.min.js"></script> + + <!-- Graficos... --> + + <script src="/sources/Chart.js/dist/Chart.bundle.js"></script> + <!-- including ECharts file --> + <script type="text/javascript" src="/sources/echarts/dist/echarts.min.js"></script> + + <style> + canvas { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + } + </style> + <!-- --> +</head> diff --git a/templates/inicio.tpl b/templates/inicio.tpl new file mode 100644 index 0000000000000000000000000000000000000000..814a4c53f8e9e81c350fa6e273a719c9e5c14286 --- /dev/null +++ b/templates/inicio.tpl @@ -0,0 +1,47 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} +<div class="row"> + <div class="x_panel"> + <div class="x_title"> + <h2> Bienvenido a la {$titulo}<small></small></h2> + <div class="clearfix"></div> + </div> + + <div class="x_content"> + <form class="form-horizontal form-label-left" action="login.php" method="post"> + + <!-- Mensaje en caso de error de autenticación --> + <div class="x_title"> + <p style="color:red;">{$mensaje}</p> + <div class="clearfix"></div> + </div> + + <!-- Usuario --> + <div class="item form-group"> + <label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Nick de usuario + </label> + <div class="col-md-3 col-sm-3 col-xs-3"> + <input class="select2_single form-control" name="login"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Contraseña + </label> + <div class="col-md-3 col-sm-3 col-xs-3"> + <input class="select2_single form-control" required maxlength="40" type="password" name="pass"> + </div> + </div> + <div class="item form-group"> + <div class="col-md-6 col-sm-6 col-xs-12"></div> + <div class="col-md-3 col-sm-3 col-xs-3"> + <button type="submit" class="p1" class="btn btn-success">Enviar</button> + </div> + </div> + </form> + </div> + </div> +</div> + {include file="footer.tpl"} diff --git a/templates/login.tpl b/templates/login.tpl new file mode 100644 index 0000000000000000000000000000000000000000..7395fc054e4ecebb2c1f0cd06ce3788496c74ab2 --- /dev/null +++ b/templates/login.tpl @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html lang="es"> +<head> + <meta charset="UTF-8"> + <title>{$titulo}</title> +</head> +<body> + <script> + window.location.href='result.php?variable={$id_admin}'; + </script> +</body> +</html> \ No newline at end of file diff --git a/templates/mod_gestor.tpl b/templates/mod_gestor.tpl new file mode 100644 index 0000000000000000000000000000000000000000..5038accdb8342ba731db6bb037c8ef6a518c3d5d --- /dev/null +++ b/templates/mod_gestor.tpl @@ -0,0 +1,186 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="page-title"> + <div class="title_left"> + </div> + + </div> + <div class="clearfix"></div> + + <div class="row"> + {if $mod_campos} + <div class="col-md-4 col-sm-4 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <div class="x_title"> + <h2> {$mensaje}<small></small></h2> + <div class="clearfix"></div> + </div> + + <div class="profile_pic"> + <img src="{$mod_campos[6]}" alt="..." class="img-circle profile_img"> + </div> + </div> + </div> + </div> + <div class="col-md-8 col-sm-8 col-xs-12"> + {else} + <div class="col-md-12 col-sm-12 col-xs-12"> + {/if} + <div class="x_panel"> + {if $mod_campos} + <div class="x_content"> + <form class="form-horizontal form-label-left" action="mod_gestor_val.php?variable={$id_admin}&id={$mod_campos[0]}" method="post"> + {literal} + <!-- dni_trabajador --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI Trabajador * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="9" name="id_ensayo" required disabled type="text" + {/literal}value="{$mod_campos[0]}" >{literal} + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="40" type="text" name="nombre" {/literal} value="{$mod_campos[2]}">{literal} + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="50" type="text" name="apellidos" {/literal} value="{$mod_campos[3]}">{literal} + </div> + </div> + + <!-- login --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="10" type="text" name="login" {/literal} value="{$mod_campos[1]}">{literal} + </div> + </div> + + <!-- titulacion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="20" type="text" name="titulacion" {/literal} value="{$mod_campos[4]}">{literal} + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres" name="pass"> + </div> + </div> + + <!-- Repass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres" name="passrw"> + </div> + </div> + + <!-- Permisos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="1" required type="text" name="permisos" placeholder="0:R - 1:RW - 2:RWX" {/literal} value="{$mod_campos[5]}">{literal} + </div> + </div> + {/literal} + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Validar</button> + </div> + </div> + </form> + </div> + + {else} + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, "asc" ]]"> + + <thead> + <tr> + <td>DNI</td> + <td>Foto</td> + <td>Login</td> + <td>Nombre</td> + <td>Apellidos</td> + </tr> + </thead> + + <tbody> + {foreach from=$campos item=element} + <tr > + <td>{$element[0]}</td> + <td> + <div class="profile_pic"> + <img style="padding: 0; margin-top: 0;" src="{$element[6]}" alt="..." class="img-circle profile_img"> + </div> + </td> + <td>{$element[1]}</td> + <td>{$element[2]}</td> + <td>{$element[3]}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + </div> + {/if} + </div> + </div> + </div> + </div> +</div> + +<script type="text/javascript"> + function cancel() { + window.location.href="result.php?variable={$id_admin}"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ -1 ], + [ 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="mod_gestor.php?variable={$id_admin}&nombre="+table.rows('.selected').data()[0][0]; + } ); + } ); +</script> +{include file="footer.tpl"} diff --git a/templates/mod_pass.tpl b/templates/mod_pass.tpl new file mode 100644 index 0000000000000000000000000000000000000000..a92dd55873981cf809326eba8034381142178795 --- /dev/null +++ b/templates/mod_pass.tpl @@ -0,0 +1,88 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="page-title"> + <div class="title_left"> + </div> + + </div> + <div class="clearfix"></div> + + <div class="row"> + <div class="col-md-4 col-sm-4 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <div class="x_title"> + <h2> {$mensaje}<small></small></h2> + <div class="clearfix"></div> + </div> + + <div class="profile_pic"> + <img src="{$imagen}" alt="..." class="img-circle profile_img"> + </div> + </div> + </div> + </div> + <div class="col-md-8 col-sm-8 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="mod_pass.php?variable={$id_admin}" method="post"> + {literal} + + <!-- Old Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña antigua * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="oldpass"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña nueva * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="pass"> + </div> + </div> + + <!-- Repass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita nueva contraseña * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="passrw"> + </div> + </div> + + {/literal} + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> + +<script type="text/javascript"> + function cancel() { + window.location.href="result.php?variable={$id_admin}"; + } + +</script> +{include file="footer.tpl"} \ No newline at end of file diff --git a/templates/pac_reg.tpl b/templates/pac_reg.tpl new file mode 100644 index 0000000000000000000000000000000000000000..3d3aa2e42b67a70dc88ed7256216eb3f8b854ee9 --- /dev/null +++ b/templates/pac_reg.tpl @@ -0,0 +1,190 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<div class="" role="main"> + <form class="form-horizontal form-label-left" action="mod_pac.php?variable={$id_admin}" method="post"> + + <!-- tabla para seleccionar sujeto --> + <div class="x_content"> + <h4 style = "text-align: center;">{$mensaje}</h4> + </div> + + <div class="row"> + <div class="col-md-6 col-sm-6 col-xs-24"> + <!-- DNI --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 "> + <input id="name" class="form-control col-md-10 col-xs-15" pattern="[0-9]{8}[A-Z]" data-validate-length-range="10" name="dni" readonly="readonly" type="text" + value="{$sujeto[0]}"> + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="{$sujeto[1]}"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="apellidos" required type="text" value="{$sujeto[2]}"> + </div> + </div> + </div> + + <div class="col-md-6 col-sm-6 col-xs-24"> + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" data-validate-words="1" name="edad" required type="date" value="{$sujeto[4]}"> + </div> + </div> + <!-- Sexo --> + <div class="item form-group"> + <div class="col-md-6 col-sm-6 col-xs-12" > + <div class="radio"> + <label for="name" style="margin-left: 50px;"><b>Sexo Masculino  </b> + <input type="radio" {if $sujeto[3] == "M"} checked="" value="{$sujeto[3]}" {else} value="M" {/if} name="sexo" style="margin-left: 15px;"></label> + <label for="name" style="margin-left: 50px;"><b>Sexo Femenino  </b> + <input type="radio" {if $sujeto[3] == "F"} checked="" value="{$sujeto[3]}" {else} value="F" {/if} name="sexo" style="margin-left: 15px;"> </label> + </div> + </div> + </div> + + <!-- Anotaciones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones del paciente + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text">{$sujeto[5]}</textarea> + </div> + </div> + </div> + </div> + <div class="form-group"> + <div class="col-md-7 col-md-offset-4"> + <button id="send" type="submit" class="btn btn-success">Guardar cambios</button> + <button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar paciente</button> + <button onclick="realizar_prueba()" type="button" class="btn btn-info">Realizar prueba</button> + <button onclick="n_etiologia()" type="button" class="btn btn-info">Añadir etiología</button> + </div> + </div> + </form> + + <div class="ln_solid"></div> + + <div class="x_content"> + <div class=""> + <h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 0, "desc" ]]" style="font-size:13px; "> + <thead> + <tr> + <td>id_prueba</td> + <td>Prueba</td> + <td>Fecha - Hora</td> + <td>Simetría</td> + <td>Anotaciones</td> + </tr> + </thead> + + <tbody> + {foreach from=$entrada item=element} + <tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]|date_format:"%d/%m/%Y %H:%M:%S"}</td> + <td>{$element[3]}</td> + <td>{$element[4]}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + </div> + <div class="x_content"> + <div class=""> + <h4 style = "text-align: center;">LISTADO DE ETIOLOGÍAS</h4> + <table id="etiologias" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, "desc" ]]" style="font-size:13px; "> + <thead> + <tr> + <td>id_etiologia</td> + <td>Descripción</td> + <td>Fecha aparición parálisis</td> + <td>Cuadrantes afectados</td> + <td>Comentarios de la etiología</td> + <td>Patología asociada</td> + </tr> + </thead> + + <tbody> + {foreach from=$etiologia item=element} + <tr data-toggle="tooltip" data-placement="top" > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]|date_format:"%d/%m/%Y"}</td> + <td>{$element[3]}</td> + <td>{$element[4]}</td> + <td>{$element[5]}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + </div> +</div> + + +<script type="text/javascript"> + + function eliminar() { + var reply=confirm("¿Seguro que desea borrar el paciente, se borrarán las pruebas y etiologías asociadas?") + if (reply==true) + { + window.location.href="result.php?variable={$id_admin}&id={$sujeto[0]}&accion=1"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + + function realizar_prueba(){ + window.location.href="add_reg.php?variable={$id_admin}&id={$sujeto[0]}"; + } + + function n_etiologia(){ + window.location.href="add_eti.php?variable={$id_admin}&id={$sujeto[0]}"; + } + + + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ver_datos_paciente.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0]; + } ); + } ); +</script> +{include file="footer.tpl"} diff --git a/templates/prueba_sujeto.tpl b/templates/prueba_sujeto.tpl new file mode 100644 index 0000000000000000000000000000000000000000..890094636bc671931a2704ef0fde918d548cc8ac --- /dev/null +++ b/templates/prueba_sujeto.tpl @@ -0,0 +1,130 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<script type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +</script> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + + + <h2 style = "text-align: center;">Información del sujeto {$mensaje}</h2> + <form class="form-horizontal form-label-left" action="prueba_sujeto_val.php?variable={$id_admin}" method="post"> + + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Edad* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="number" required placeholder="En años"> + </div> + </div> + + <!-- Sexo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" name="sexo" value="M" required style="margin-left: 0px;"> + </div> + </div> + </div> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" name="sexo" value="F" style="margin-left: 0px;"> + </div> + </div> + </div> + + <!-- Anotaciones Sujeto--> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios del sujeto + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_sujeto" type="text"></textarea> + </div> + </div> + + + + <!-- ensayo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" name="ensayo" required> + <option value=""></option> + {foreach item=element from=$ensayos} + <option value="{$element}">{$element}</option> + {/foreach} + </select> + </div> + </div> + + <!-- Simetria --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text"> + </div> + </div> + + <!-- Anotaciones prueba--> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_prueba" type="text"></textarea> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Iniciar</button> + <button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<script type="text/javascript"> + //estado(); + function cancel() { + window.location.href="result.php?variable={$id_admin}"; + } + function limpiar() { + window.location.href="prueba_sujeto.php?variable={$id_admin}"; + } + +</script> +{include file="footer.tpl"} diff --git a/templates/prueba_sujeto_val.tpl b/templates/prueba_sujeto_val.tpl new file mode 100644 index 0000000000000000000000000000000000000000..708f01a051e117164d103f05cc1e81e374bed02a --- /dev/null +++ b/templates/prueba_sujeto_val.tpl @@ -0,0 +1,197 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://192.168.1.240/{$get}" target="esp"> + <button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button> + </form> + </div> + </div> + </div> + + <div class="col-md-4 col-sm-4 col-xs-4"> + + <div class="x_panel"> + <div class="x_content"> + <iframe name="esp" id="esp" src="http://192.168.1.240/" ></iframe> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://192.168.1.240/" target="esp"> + <button type="submit" formmethod="get" formnovalidate>Reset ESP</button> + </form> + <div > + <img style='height: 300px;' src="{$imagen}"> + </div> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <div > + <h2><strong>Colocación sensores:</strong></h2> + <h2>{$coloc_sensores}</h2> + </div> + </div> + </div> + </div> + + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + </div> + </div> + </div> + + <div class="col-md-6 col-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <h1>{$segundos}:00</h1> + </div> + </div> + <div class="x_panel"> + <div class="x_content"> + <button type="submit" formmethod="get" id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button> + <button type="submit" formmethod="get" id="salir" class="btn btn-danger" onclick="salir_sujeto()" formnovalidate>Salir</button> + </div> + </div> + </div> + <div class="col-md-6 col-sm-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <div id="foto"> + Aviso + </div> + </div> + </div> + </div> + </div> + </div> +</div> + +<script type="text/javascript"> +window.onload = function() { + var oFrame = document.getElementById("esp"); + oFrame.contentWindow.document.onclick = function() { + alert("frame contents clicked"); + }; +}; +</script> + +<script type="text/javascript"> + let h1 = document.querySelector("h1"); + + let centesimas = 0; + let segundos = {$segundos}; + + var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); + var snd2 = new Audio("media/audio/check.mp3"); + + var intervalo = 0; + var intervaloBase = segundos/{$repeticiones}; + var repSg = segundos-1; + var repCnt = 99; + var estado = 0; + $('#done').hide(); + + console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", {$repeticiones}); + function run(){ + if (estado ==0){ + if((centesimas == 0) &&( segundos == 0)){ + check(); + h1.style.color = 'red'; + $("#foto").html("<h1><strong>FIN</strong></h1>"); + $('#done').show(); + estado = 1; + // función para hacer un delay antes del windows location + // esperamos 2 segundos + function stateChange(newState) { + setTimeout(function () { + if (newState == -1) { + /* + * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde. + * / + $.post("comprobar_post.php", {literal} { + recarga:'info' , + puesto: {/literal}{$puesto}{literal}, + linea: '{/literal}{$linea}{literal}', + cambio: {/literal}{$prox_cambio}{literal}, + serie: '{/literal}{$serie}{literal}', + foto: '{/literal}{$imagen}{literal}', + posicion_ant: {/literal}{$posicion}{literal} + } {/literal} , + function(data){ + //recarga titulo y barcode + $("#resultado").html(data); + }); + //*/ + alert("Saliendo"); + window.location.href="result.php?variable={$id_admin}"; + } + }, 2000); + } + + }else{ + // Comprobamos que llegamos a una repetición y ponemos un aviso + if(centesimas == repCnt && segundos == repSg) { + console.log("intervalo = ", repSg,":",repCnt); + $("#foto").html("<h1><strong>{$ensayo}</strong></h1>"); + beep(); + } + // quitamos el aviso 1seg despues y preparamos la siguiente repeticion + if(centesimas == repCnt && segundos == repSg - 1) { + intervalo = intervalo + intervaloBase; + repSg = {$segundos} - Math.trunc(intervalo) - 1; + repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100); + console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas); + $("#foto").html("<h1><strong>Reposo</strong></h1>"); + } + + if(centesimas == 0){ + --segundos; + centesimas = 99; + }else{ + --centesimas; + } + h1.innerHTML = segundos +':'+centesimas; + + } + + } + } + + function inicio(){ + $('#salir').hide(); + $('#init').hide(); + segundos = {$segundos}; + setInterval(run, 10); + } + function done() { + window.location.href="ver_datos_sujeto.php?variable={$id_admin}&id={$id_prueba}"; + } + function salir_sujeto() { + window.location.href="prueba_sujeto.php?variable={$id_admin}&id_prueba={$id_prueba}&accion=1"; + history.back(); + } + function beep() { + snd1.play(); + } + function check(){ + snd2.play(); + } +</script> +{include file="footer.tpl"} diff --git a/templates/result.tpl b/templates/result.tpl new file mode 100644 index 0000000000000000000000000000000000000000..a6d7b77f6d5b5e8f85cd55b24bc259ba6cc1b851 --- /dev/null +++ b/templates/result.tpl @@ -0,0 +1,138 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<div class="" role="main"> + <div class="tablas" id="recarga"> + <h4 style = "text-align: center;">LISTADO DE PACIENTES</h4> + <div class="clearfix"></div> + <table id="datatable" class="table table-striped table-condensed table-bordered" cellspacing="0" width="100%" data-order="[[ 1, "asc" ]]" style="font-size:13px; "> + <thead> + <tr> + <td>DNI</td> + <td>Nombre</td> + <td>Apellidos</td> + <td>Sexo</td> + <td>Edad</td> + <td>Anotaciones</td> + </tr> + </thead> + + <tbody> + {foreach from=$entrada item=element} + <tr onclick="selecion()" data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]}</td> + <td>{$element[3]}</td> + <td>{$element[4]} ({$element[6]|date_format:"%d/%m/%Y"})</td> + <td>{$element[5]}</td> + </tr> + {/foreach} + </tbody> + </table> <!-- Se cierra la tabla --> + + <script type="text/javascript"> + + $(document).ready(function() { + var columnas; + if (window.innerWidth > 280) { + columnas= [ + { width: '10%', targets: 0 }, + { width: '10%', targets: 1 }, + { width: '10%', targets: 2 }, + { width: '10%', targets: 3 }, + { width: '10%', targets: 4 }, + { width: '10%', targets: 5 } + ]; + } else { + columnas= [ + //no hago nada dejo que el tamaño se auto ajuste + ]; + } + $('#datatable').DataTable({ + dom: 'Bfrtip', + lengthMenu: [ + [ 100, 250, 500, -1 ], + [ '100 filas', '250 filas', '500 filas', 'Todas las filas' ] + ], + autoWidth: false, + fixedHeader: false, + columnDefs: columnas, + FixedColumns: true , + buttons: [ + 'pageLength', + { + extend: 'collection', + text: 'Exportar', + buttons: [ + 'copy', + { + extend: 'pdf', + text: 'PDF', + exportOptions: { + modifier: { + page: 'current' + } + }, + message: 'PDF creado por Mantenimiento M3.', + header: true, + title: 'Prioridades del Kaizen', + //orientation: 'landscape', + download: 'open', + customize: function(doc) { + doc.defaultStyle.fontSize = 6; + doc.pageOrientation = 'landscape'; + doc.styles.tableHeader.fontSize = 7; + doc.styles.tableHeader.color ='white'; + doc.styles.title.fontSize = 10; + } + }, + 'csv', 'excel', + { + extend: 'print', + text: 'Imprimir', + autoPrint: true, + exportOptions: { + columns: ':visible', + }, + customize: function (win) { + $(win.document.body).find('table').addClass('display').css('font-size', '7px'); + $(win.document.body).find('tr:nth-child(odd) td').each(function(index){ + $(this).css('background-color','#D0D0D0'); + }); + //mio + $(win.document.body).find('h1').css('font-size','20px'); + $(win.document.body).find('h1').css('margin-bottom','20px'); + $(win.document.body).find('h1').css('text-align','center'); + } + + } + ] + } + ] + + }); + + } ); + + </script> + </div> +</div> + + + <script type="text/javascript"> + function selecion(){ + $(document).ready(function() { + var table = $('#datatable').DataTable(); + $('#datatable tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="pac_reg.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0] ; + } ); + } ); + } + </script> + {include file="footer.tpl"} diff --git a/templates/ver_datos_paciente.tpl b/templates/ver_datos_paciente.tpl new file mode 100644 index 0000000000000000000000000000000000000000..d5cd7681f8e69544d5fa1a2627b1958f86040cf6 --- /dev/null +++ b/templates/ver_datos_paciente.tpl @@ -0,0 +1,151 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<div class="" role="main"> + <div class="x_content"> + <canvas id="myChart"></canvas> + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> + <script> + const labels = [{$etiquetas}]; + const tension = 0.3; + const data = { + labels: labels, + datasets: [{ + label: 'Sensor 1', + data: [{$s1}], + fill: false, + borderColor: 'rgb(75, 192, 192)', + tension: tension + },{ + label: 'Sensor 2', + data: [{$s2}], + fill: false, + borderColor: 'rgb(255, 45, 0)', + tension: tension + },{ + label: 'Sensor 3', + data: [{$s3}], + fill: false, + borderColor: 'rgb(255, 255, 0 )', + tension: tension + },{ + label: 'Sensor 4', + data: [{$s4}], + fill: false, + borderColor: 'rgb(0, 255, 46 )', + tension: tension + },{ + label: 'Sensor 5', + data: [{$s5}], + fill: false, + borderColor: 'rgb(0, 27, 255 )', + tension: tension + },{ + label: 'Sensor 6', + data: [{$s6}], + fill: false, + borderColor: 'rgb(255, 0, 240 )', + tension: tension + }] + }; + + const config = { + type: 'line', + data, + options: { + responsive: true, + elements: { + point:{ + pointBorderWidth:0.1, + pointHitRadius:0.1, + pointBorderColor:'rgba(0, 0, 0, 0)', + pointBackgroundColor:'rgba(0, 0, 0, 0)', + + } + }, + plugins: { + title: { + display: true, + text: '{$tipo} de {$nombre}, a fecha de: {$fecha|date_format:"%d/%m/%Y %H:%M:%S"} ', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 30, + weight: 'bold', + lineHeight: 1.5, + } + } + }, + scales: { + x: { + display: true, + title:{ + display: true, + text: 'Tiempo (ms)', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 20, + weight: 'bold', + lineHeight: 1.2, + } + } + }, + y: { + display: true, + title:{ + display: true, + text: 'Señal', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 20, + weight: 'bold', + lineHeight: 1.2, + } + } + } + } + } + }; + + var myChart = new Chart( + document.getElementById('myChart'), + config + ); + </script> + <div class="form-group"> + <div class="col-md-7 col-md-offset-4"> + <button onclick="salir()" type="button" class="btn btn-warning">Salir</button> + <button onclick="borrar()" type="button" class="btn btn-danger">Borrar prueba</button> + </div> + </div> + </div> +</div> + + +<script type="text/javascript"> + function salir(){ + window.location.href="pac_reg.php?variable={$id_admin}&id={$dni_paciente}"; + } + + function borrar(){ + var reply=confirm("¿Seguro que desea borrar la prueba?") + if (reply==true) + { + window.location.href="borrar_prueba.php?variable={$id_admin}&id={$id_prueba}"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + +</script> + +{include file="footer.tpl"} diff --git a/templates/ver_datos_sujeto.tpl b/templates/ver_datos_sujeto.tpl new file mode 100644 index 0000000000000000000000000000000000000000..25c595ed7a04e4dec9746531c5baf8e2e3fcf00f --- /dev/null +++ b/templates/ver_datos_sujeto.tpl @@ -0,0 +1,151 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<div class="" role="main"> + <div class="x_content"> + <canvas id="myChart"></canvas> + <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> + <script> + const labels = [{$etiquetas}]; + const tension = 0.3; + const data = { + labels: labels, + datasets: [{ + label: 'Sensor 1', + data: [{$s1}], + fill: false, + borderColor: 'rgb(75, 192, 192)', + tension: tension + },{ + label: 'Sensor 2', + data: [{$s2}], + fill: false, + borderColor: 'rgb(255, 45, 0)', + tension: tension + },{ + label: 'Sensor 3', + data: [{$s3}], + fill: false, + borderColor: 'rgb(255, 255, 0 )', + tension: tension + },{ + label: 'Sensor 4', + data: [{$s4}], + fill: false, + borderColor: 'rgb(0, 255, 46 )', + tension: tension + },{ + label: 'Sensor 5', + data: [{$s5}], + fill: false, + borderColor: 'rgb(0, 27, 255 )', + tension: tension + },{ + label: 'Sensor 6', + data: [{$s6}], + fill: false, + borderColor: 'rgb(255, 0, 240 )', + tension: tension + }] + }; + + const config = { + type: 'line', + data, + options: { + responsive: true, + elements: { + point:{ + pointBorderWidth:0.1, + pointHitRadius:0.1, + pointBorderColor:'rgba(0, 0, 0, 0)', + pointBackgroundColor:'rgba(0, 0, 0, 0)', + + } + }, + plugins: { + title: { + display: true, + text: '{$tipo} de {$nombre}, a fecha de: {$fecha|date_format:"%d/%m/%Y %H:%M:%S"} ', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 30, + weight: 'bold', + lineHeight: 1.5, + } + } + }, + scales: { + x: { + display: true, + title:{ + display: true, + text: 'Tiempo (ms)', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 20, + weight: 'bold', + lineHeight: 1.2, + } + } + }, + y: { + display: true, + title:{ + display: true, + text: 'Señal', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 20, + weight: 'bold', + lineHeight: 1.2, + } + } + } + } + } + }; + + var myChart = new Chart( + document.getElementById('myChart'), + config + ); + </script> + <div class="form-group"> + <div class="col-md-7 col-md-offset-4"> + <button onclick="salir()" type="button" class="btn btn-warning">Salir</button> + <button onclick="borrar()" type="button" class="btn btn-danger">Borrar prueba</button> + </div> + </div> + </div> +</div> + + +<script type="text/javascript"> + function salir(){ + window.location.href="ver_pruebas_sujetos.php?variable={$id_admin}"; + } + + function borrar(){ + var reply=confirm("¿Seguro que desea borrar la prueba?") + if (reply==true) + { + window.location.href="borrar_prueba_sujeto.php?variable={$id_admin}&id={$id_prueba}"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + +</script> + +{include file="footer.tpl"} diff --git a/templates/ver_pruebas_sujetos.tpl b/templates/ver_pruebas_sujetos.tpl new file mode 100644 index 0000000000000000000000000000000000000000..af6204f8af5776fe1988dbcb671040d0c478f7b6 --- /dev/null +++ b/templates/ver_pruebas_sujetos.tpl @@ -0,0 +1,66 @@ +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + {include file="head.tpl"} + <!-- Barra de menu --> + {include file="barra.tpl"} + + <!-- Zona Central --> +<div class="" role="main"> + <h4 style = "text-align: center;">{$mensaje}</h4> + + <div class="ln_solid"></div> + + <div class="x_content"> + <div class=""> + <h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, "desc" ]]" style="font-size:13px;"> + <thead> + <tr> + <td width="80">id_prueba</td> + <td width="200">Tipo</td> + <td width="120">Fecha - Hora</td> + <td width="80">Sexo</td> + <td width="80">Edad</td> + <td>Simetria</td> + <td>Anotaciones</td> + </tr> + </thead> + + <tbody> + {foreach from=$entrada item=element} + <tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" > + <td>{$element[0]}</td> + <td>{$element[1]}</td> + <td>{$element[2]|date_format:"%d/%m/%Y"}</td> + <td>{$element[3]}</td> + <td>{$element[4]}</td> + <td>{$element[5]}</td> + <td>{$element[6]}</td> + </tr> + {/foreach} + </tbody> + </table> + </div> + </div> +</div> + + +<script type="text/javascript"> + + + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ver_datos_sujeto.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0]; + } ); + } ); +</script> +{include file="footer.tpl"} diff --git a/templates_c/145144529a8d2b4be7493fd8bcedd9b43fc5c59a_0.file.inicio.tpl.php b/templates_c/145144529a8d2b4be7493fd8bcedd9b43fc5c59a_0.file.inicio.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..5402b2b1446c9cbd7082fa4a65f80ee42114c085 --- /dev/null +++ b/templates_c/145144529a8d2b4be7493fd8bcedd9b43fc5c59a_0.file.inicio.tpl.php @@ -0,0 +1,76 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-01 10:51:06 + from '/volume1/web/velostat/templates/inicio.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_6297287ae0f201_59560290', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '145144529a8d2b4be7493fd8bcedd9b43fc5c59a' => + array ( + 0 => '/volume1/web/velostat/templates/inicio.tpl', + 1 => 1654017270, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_6297287ae0f201_59560290 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> +<div class="row"> + <div class="x_panel"> + <div class="x_title"> + <h2> Bienvenido a la <?php echo $_smarty_tpl->tpl_vars['titulo']->value;?> +<small></small></h2> + <div class="clearfix"></div> + </div> + + <div class="x_content"> + <form class="form-horizontal form-label-left" action="login.php" method="post"> + + <!-- Mensaje en caso de error de autenticación --> + <div class="x_title"> + <p style="color:red;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</p> + <div class="clearfix"></div> + </div> + + <!-- Usuario --> + <div class="item form-group"> + <label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Nick de usuario + </label> + <div class="col-md-3 col-sm-3 col-xs-3"> + <input class="select2_single form-control" name="login"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Contraseña + </label> + <div class="col-md-3 col-sm-3 col-xs-3"> + <input class="select2_single form-control" required maxlength="40" type="password" name="pass"> + </div> + </div> + <div class="item form-group"> + <div class="col-md-6 col-sm-6 col-xs-12"></div> + <div class="col-md-3 col-sm-3 col-xs-3"> + <button type="submit" class="p1" class="btn btn-success">Enviar</button> + </div> + </div> + </form> + </div> + </div> + <?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/15ac0ec4075859219bc813f249c66f9ae8e25cd3_0.file.result.tpl.php b/templates_c/15ac0ec4075859219bc813f249c66f9ae8e25cd3_0.file.result.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..5d1aee9e0d412e04cd55ae4b06150d0f0ab343b7 --- /dev/null +++ b/templates_c/15ac0ec4075859219bc813f249c66f9ae8e25cd3_0.file.result.tpl.php @@ -0,0 +1,189 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-07 19:35:32 + from '/volume1/web/velostat/templates/result.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_629f8c6448db59_66315122', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '15ac0ec4075859219bc813f249c66f9ae8e25cd3' => + array ( + 0 => '/volume1/web/velostat/templates/result.tpl', + 1 => 1654623318, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_629f8c6448db59_66315122 (Smarty_Internal_Template $_smarty_tpl) { +$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),)); +?> +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<div class="" role="main"> + <div class="tablas" id="recarga"> + <h4 style = "text-align: center;">LISTADO DE PACIENTES</h4> + <div class="clearfix"></div> + <table id="datatable" class="table table-striped table-condensed table-bordered" cellspacing="0" width="100%" data-order="[[ 1, "asc" ]]" style="font-size:13px; "> + <thead> + <tr> + <td>DNI</td> + <td>Nombre</td> + <td>Apellidos</td> + <td>Sexo</td> + <td>Edad</td> + <td>Anotaciones</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['entrada']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr onclick="selecion()" data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?> + (<?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[6],"%d/%m/%Y");?> +)</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> <!-- Se cierra la tabla --> + + <?php echo '<script'; ?> + type="text/javascript"> + + $(document).ready(function() { + var columnas; + if (window.innerWidth > 280) { + columnas= [ + { width: '10%', targets: 0 }, + { width: '10%', targets: 1 }, + { width: '10%', targets: 2 }, + { width: '10%', targets: 3 }, + { width: '10%', targets: 4 }, + { width: '10%', targets: 5 } + ]; + } else { + columnas= [ + //no hago nada dejo que el tamaño se auto ajuste + ]; + } + $('#datatable').DataTable({ + dom: 'Bfrtip', + lengthMenu: [ + [ 100, 250, 500, -1 ], + [ '100 filas', '250 filas', '500 filas', 'Todas las filas' ] + ], + autoWidth: false, + fixedHeader: false, + columnDefs: columnas, + FixedColumns: true , + buttons: [ + 'pageLength', + { + extend: 'collection', + text: 'Exportar', + buttons: [ + 'copy', + { + extend: 'pdf', + text: 'PDF', + exportOptions: { + modifier: { + page: 'current' + } + }, + message: 'PDF creado por Mantenimiento M3.', + header: true, + title: 'Prioridades del Kaizen', + //orientation: 'landscape', + download: 'open', + customize: function(doc) { + doc.defaultStyle.fontSize = 6; + doc.pageOrientation = 'landscape'; + doc.styles.tableHeader.fontSize = 7; + doc.styles.tableHeader.color ='white'; + doc.styles.title.fontSize = 10; + } + }, + 'csv', 'excel', + { + extend: 'print', + text: 'Imprimir', + autoPrint: true, + exportOptions: { + columns: ':visible', + }, + customize: function (win) { + $(win.document.body).find('table').addClass('display').css('font-size', '7px'); + $(win.document.body).find('tr:nth-child(odd) td').each(function(index){ + $(this).css('background-color','#D0D0D0'); + }); + //mio + $(win.document.body).find('h1').css('font-size','20px'); + $(win.document.body).find('h1').css('margin-bottom','20px'); + $(win.document.body).find('h1').css('text-align','center'); + } + + } + ] + } + ] + + }); + + } ); + + <?php echo '</script'; ?> +> + </div> +</div> + + + <?php echo '<script'; ?> + type="text/javascript"> + function selecion(){ + $(document).ready(function() { + var table = $('#datatable').DataTable(); + $('#datatable tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id="+table.rows('.selected').data()[0][0] ; + } ); + } ); + } + <?php echo '</script'; ?> +> + <?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/15bc92026fa23060a308aa78bb9dfe52e6927371_0.file.ges_ens.tpl.php b/templates_c/15bc92026fa23060a308aa78bb9dfe52e6927371_0.file.ges_ens.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..1c290323eceafdfdb52c7828c7b2e3cfecedef2b --- /dev/null +++ b/templates_c/15bc92026fa23060a308aa78bb9dfe52e6927371_0.file.ges_ens.tpl.php @@ -0,0 +1,249 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-07 19:47:46 + from '/volume1/web/velostat/templates/ges_ens.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_629f8f42b6d300_18587096', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '15bc92026fa23060a308aa78bb9dfe52e6927371' => + array ( + 0 => '/volume1/web/velostat/templates/ges_ens.tpl', + 1 => 1654624063, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_629f8f42b6d300_18587096 (Smarty_Internal_Template $_smarty_tpl) { +$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),)); +?> +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + <div class="clearfix"></div> + <form class="form-horizontal form-label-left" action="ges_ens_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +" method="post"> + + <!-- id_ensayo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_ensayo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="id_ensayo" required disabled type="text" + value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +" > + </div> + </div> + + <!-- Tipo/Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[1];?> +" > + </div> + </div> + + <!-- Colocacion Sensores --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación sensores * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea class="form-control col-md-7 col-xs-12" rows="3" data-validate-length-range="300" name="coloc_sensores" required type="text"><?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[2];?> +</textarea> + </div> + </div> + + <!-- Duracion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duracion * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="duracion" required type="decimal" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[3];?> +" > + </div> + </div> + + <!-- Repeticiones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="decimal" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[4];?> +" > + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[5];?> +" ></textarea> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + <button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button> + </div> + </div> + </form> + + </div> + <?php } else { ?> + + <!-- tabla para seleccionar patologia --> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + <div class="clearfix"></div> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, "asc" ]]"> + + <thead> + <tr> + <td>id_ensayo</td> + <td>Tipo / Nombre</td> + <td>Colocación Sensores</td> + <td>Duración</td> + <td>Repeticiones</td> + <td>Comentarios</td> + <td>Fecha creación</td> + <td>Fecha modificación</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?> +</td> + <td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[6],"%d/%m/%Y");?> +</td> + <td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[7],"%d/%m/%Y");?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + <div class="col-md-6 col-md-offset-3"> + <button onclick="n_ensayo()" type="button" class="btn btn-primary">Nuevo ensayo</button> + </div> + </div> + <?php }?> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + //estado(); + function cancel() { + window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + function eliminar() { + var reply=confirm("¿Seguro que desea borrar el ensayo? \nSe borrarán todas las pruebas asociadas a este ensayo.") + if (reply==true) + { + window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +&accion=1"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + function n_ensayo() { + window.location.href="ges_ens_nuevo.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id="+table.rows('.selected').data()[0][0]; + } ); + } ); + +<?php echo '</script'; ?> +> + <?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/26155bdc414dedbfe8097c8bcba8253443b04dbf_0.file.mod_gestor.tpl.php b/templates_c/26155bdc414dedbfe8097c8bcba8253443b04dbf_0.file.mod_gestor.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..d76c7c2aa0233a1163c5bf34fe5074061dc8a818 --- /dev/null +++ b/templates_c/26155bdc414dedbfe8097c8bcba8253443b04dbf_0.file.mod_gestor.tpl.php @@ -0,0 +1,243 @@ +<?php +/* Smarty version 3.1.38, created on 2022-05-31 19:14:46 + from '/volume1/web/velostat/templates/mod_gestor.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62964d06dbdfd6_75887266', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '26155bdc414dedbfe8097c8bcba8253443b04dbf' => + array ( + 0 => '/volume1/web/velostat/templates/mod_gestor.tpl', + 1 => 1654017270, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62964d06dbdfd6_75887266 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="page-title"> + <div class="title_left"> + </div> + + </div> + <div class="clearfix"></div> + + <div class="row"> + <?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> + <div class="col-md-4 col-sm-4 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <div class="x_title"> + <h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +<small></small></h2> + <div class="clearfix"></div> + </div> + + <div class="profile_pic"> + <img src="media/images/personal/<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +.png" alt="..." class="img-circle profile_img"> + </div> + </div> + </div> + </div> + <div class="col-md-8 col-sm-8 col-xs-12"> + <?php } else { ?> + <div class="col-md-12 col-sm-12 col-xs-12"> + <?php }?> + <div class="x_panel"> + <?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="mod_gestor_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +" method="post"> + + <!-- dni_trabajador --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI Trabajador * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="9" name="id_ensayo" required disabled type="text" + value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +" > + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="40" type="text" name="nombre" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[2];?> +"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="50" type="text" name="apellidos" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[3];?> +"> + </div> + </div> + + <!-- login --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="10" type="text" name="login" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[1];?> +"> + </div> + </div> + + <!-- titulacion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" required maxlength="20" type="text" name="titulacion" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[4];?> +"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres" name="pass"> + </div> + </div> + + <!-- Repass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres" name="passrw"> + </div> + </div> + + <!-- Permisos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="1" required type="text" name="permisos" placeholder="0:R - 1:RW - 2:RWX" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[5];?> +"> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Validar</button> + </div> + </div> + </form> + </div> + + <?php } else { ?> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, "asc" ]]"> + + <thead> + <tr> + <td>DNI</td> + <td>Foto</td> + <td>Login</td> + <td>Nombre</td> + <td>Apellidos</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td> + <div class="profile_pic"> + <img style="padding: 0; margin-top: 0;" src="media/images/personal/<?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +.png" alt="..." class="img-circle profile_img"> + </div> + </td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + </div> + <?php }?> + </div> + </div> + </div> + </div> +</div> + +<?php echo '<script'; ?> + type="text/javascript"> + function cancel() { + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ -1 ], + [ 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="mod_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&nombre="+table.rows('.selected').data()[0][0]; + } ); + } ); +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a_0.file.footer.tpl.php b/templates_c/2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a_0.file.footer.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..4701c5ec85c40c97c92a4b6b5b5b916d688fc5cf --- /dev/null +++ b/templates_c/2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a_0.file.footer.tpl.php @@ -0,0 +1,119 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 13:43:02 + from '/volume1/web/velostat/templates/footer.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1dcc6296863_93373508', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a' => + array ( + 0 => '/volume1/web/velostat/templates/footer.tpl', + 1 => 1654774975, + 2 => 'file', + ), + ), + 'includes' => + array ( + ), +),false)) { +function content_62a1dcc6296863_93373508 (Smarty_Internal_Template $_smarty_tpl) { +?> <!-- Java Script... --> + + + <!--******************************************************** + + <?php echo '<script'; ?> + type="text/javascript" src="/sources/fastclick/lib/fastclick.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/nprogress/nprogress.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/dropzone/dist/dropzone.js"><?php echo '</script'; ?> +>--> + <!-- jquery.inputmask + <?php echo '<script'; ?> + type="text/javascript" src="/sources/jquery.inputmask/dist/min/jquery.inputmask.bundle.min.js"><?php echo '</script'; ?> +>--> + + + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/custom.min.iacob.js"><?php echo '</script'; ?> +> + <!-- ECharts --> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/echarts/dist/echarts.min.js"><?php echo '</script'; ?> +> + + + <!-- hemos traducido parte del fichero para la barra de búsqueda --> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/jquery.dataTables.es.min.js"><?php echo '</script'; ?> +> + + <!-- <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/moment.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/fullcalendar-3.5.1/fullcalendar.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/fullcalendar-3.5.1/locale/es.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/datetime.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/transition.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/collapse.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/bootstrap-datetimepicker.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/daterangepicker.js"><?php echo '</script'; ?> +>--> + + + + <!-- para datatables --> + + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/dataTables.bootstrap.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/dataTables.fixedColumns.min.js"><?php echo '</script'; ?> +> + + <!-- para los botones pdf excel csv print... --> + + <!-- hemos traducido parte del fichero para el boton "show" --> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/Buttons-1.3.1/js/dataTables.buttons.es.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.flash.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/JSZip-3.1.3/jszip.min.js"><?php echo '</script'; ?> +> + + <?php echo '<script'; ?> + type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.html5.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.print.min.js"><?php echo '</script'; ?> +> + +</body> +</html><?php } +} diff --git a/templates_c/345219ed2de3d5f763786a4b5459439094ef0f62_0.file.add_reg.tpl.php b/templates_c/345219ed2de3d5f763786a4b5459439094ef0f62_0.file.add_reg.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..c80a863835537f7fd31d90e3401952536cf3c224 --- /dev/null +++ b/templates_c/345219ed2de3d5f763786a4b5459439094ef0f62_0.file.add_reg.tpl.php @@ -0,0 +1,244 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 15:25:07 + from '/volume1/web/velostat/templates/add_reg.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1f4b35fbd58_36987265', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '345219ed2de3d5f763786a4b5459439094ef0f62' => + array ( + 0 => '/volume1/web/velostat/templates/add_reg.tpl', + 1 => 1654781102, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62a1f4b35fbd58_36987265 (Smarty_Internal_Template $_smarty_tpl) { +$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),)); +?> +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + + + <!-- tabla para seleccionar sujeto --> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, "asc" ]]"> + + <thead> + <tr> + <td>DNI</td> + <td>Nombre</td> + <td>Apellidos</td> + <td>Sexo</td> + <td >Edad</td> + <td>Anotaciones del paciente</td> + + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?> + (<?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[6],"%d/%m/%Y");?> +)</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + </div> + <h2 style = "text-align: center;">Información del paciente</h2> + <form class="form-horizontal form-label-left" action="add_reg_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + <!-- DNI --> + + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="dni_paciente" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +" readonly="readonly" > + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="nombre" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[1];?> +" readonly="readonly"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="apellidos" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[2];?> +" readonly="readonly" > + </div> + </div> + + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="date" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[4];?> +" readonly="readonly" > + </div> + </div> + + + + <!-- ensayo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" name="ensayo" required> + <option value=""></option> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['ensayos']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?> +"><?php echo $_smarty_tpl->tpl_vars['element']->value;?> +</option> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </select> + </div> + </div> + + <!-- Simetria --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text"> + </div> + </div> + + <!-- Anotaciones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text"> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[0] != '') {?><button id="send" type="submit" class="btn btn-success">Iniciar</button><?php }?> + <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[0] != '') {?><button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button><?php }?> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + //estado(); + function cancel() { + window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"; + } + function limpiar() { + window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id="+table.rows('.selected').data()[0][0]; + } ); + } ); + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/3d61182dbd577100504984bebb40a5601d3a37a6_0.file.ver_pruebas_sujetos.tpl.php b/templates_c/3d61182dbd577100504984bebb40a5601d3a37a6_0.file.ver_pruebas_sujetos.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..51c0f55e7c4d0c9f413e5a33fc94683269cabf19 --- /dev/null +++ b/templates_c/3d61182dbd577100504984bebb40a5601d3a37a6_0.file.ver_pruebas_sujetos.tpl.php @@ -0,0 +1,116 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-07 20:03:41 + from '/volume1/web/velostat/templates/ver_pruebas_sujetos.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_629f92fd5cd7f2_62336760', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '3d61182dbd577100504984bebb40a5601d3a37a6' => + array ( + 0 => '/volume1/web/velostat/templates/ver_pruebas_sujetos.tpl', + 1 => 1654625010, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_629f92fd5cd7f2_62336760 (Smarty_Internal_Template $_smarty_tpl) { +$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),)); +?> +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<div class="" role="main"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + + <div class="ln_solid"></div> + + <div class="x_content"> + <div class=""> + <h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, "desc" ]]" style="font-size:13px;"> + <thead> + <tr> + <td width="80">id_prueba</td> + <td width="200">Tipo</td> + <td width="120">Fecha - Hora</td> + <td width="80">Sexo</td> + <td width="80">Edad</td> + <td>Simetria</td> + <td>Anotaciones</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['entrada']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[2],"%d/%m/%Y");?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[6];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + </div> +</div> + + +<?php echo '<script'; ?> + type="text/javascript"> + + + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ver_datos_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id="+table.rows('.selected').data()[0][0]; + } ); + } ); +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/478051947e1a0b67b97cd373065cddf4f166d358_0.file.ver_datos.tpl.php b/templates_c/478051947e1a0b67b97cd373065cddf4f166d358_0.file.ver_datos.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..e41ffa845d331ef3530cd321edb8a611aaa9fc2f --- /dev/null +++ b/templates_c/478051947e1a0b67b97cd373065cddf4f166d358_0.file.ver_datos.tpl.php @@ -0,0 +1,204 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-07 19:59:32 + from '/volume1/web/velostat/templates/ver_datos.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_629f9204b67ea6_05958572', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '478051947e1a0b67b97cd373065cddf4f166d358' => + array ( + 0 => '/volume1/web/velostat/templates/ver_datos.tpl', + 1 => 1654624764, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_629f9204b67ea6_05958572 (Smarty_Internal_Template $_smarty_tpl) { +$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),)); +?> +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<div class="" role="main"> + <div class="x_content"> + <canvas id="myChart"></canvas> + <?php echo '<script'; ?> + src="https://cdn.jsdelivr.net/npm/chart.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> +> + const labels = [<?php echo $_smarty_tpl->tpl_vars['etiquetas']->value;?> +]; + const tension = 0.3; + const data = { + labels: labels, + datasets: [{ + label: 'Sensor 1', + data: [<?php echo $_smarty_tpl->tpl_vars['s1']->value;?> +], + fill: false, + borderColor: 'rgb(75, 192, 192)', + tension: tension + },{ + label: 'Sensor 2', + data: [<?php echo $_smarty_tpl->tpl_vars['s2']->value;?> +], + fill: false, + borderColor: 'rgb(255, 45, 0)', + tension: tension + },{ + label: 'Sensor 3', + data: [<?php echo $_smarty_tpl->tpl_vars['s3']->value;?> +], + fill: false, + borderColor: 'rgb(255, 255, 0 )', + tension: tension + },{ + label: 'Sensor 4', + data: [<?php echo $_smarty_tpl->tpl_vars['s4']->value;?> +], + fill: false, + borderColor: 'rgb(0, 255, 46 )', + tension: tension + },{ + label: 'Sensor 5', + data: [<?php echo $_smarty_tpl->tpl_vars['s5']->value;?> +], + fill: false, + borderColor: 'rgb(0, 27, 255 )', + tension: tension + },{ + label: 'Sensor 6', + data: [<?php echo $_smarty_tpl->tpl_vars['s6']->value;?> +], + fill: false, + borderColor: 'rgb(255, 0, 240 )', + tension: tension + }] + }; + + const config = { + type: 'line', + data, + options: { + responsive: true, + elements: { + point:{ + pointBorderWidth:0.1, + pointHitRadius:0.1, + pointBorderColor:'rgba(0, 0, 0, 0)', + pointBackgroundColor:'rgba(0, 0, 0, 0)', + + } + }, + plugins: { + title: { + display: true, + text: '<?php echo $_smarty_tpl->tpl_vars['tipo']->value;?> + de <?php echo $_smarty_tpl->tpl_vars['nombre']->value;?> +, a fecha de: <?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['fecha']->value,"%d/%m/%Y %H:%M:%S");?> + ', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 30, + weight: 'bold', + lineHeight: 1.5, + } + } + }, + scales: { + x: { + display: true, + title:{ + display: true, + text: 'Tiempo', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 20, + weight: 'bold', + lineHeight: 1.2, + } + } + }, + y: { + display: true, + title:{ + display: true, + text: 'Señal', + color: '#9', + font: { + family: 'Helvetica Neue', + size: 20, + weight: 'bold', + lineHeight: 1.2, + } + } + } + } + } + }; + + var myChart = new Chart( + document.getElementById('myChart'), + config + ); + <?php echo '</script'; ?> +> + <div class="form-group"> + <div class="col-md-7 col-md-offset-4"> + <button onclick="salir()" type="button" class="btn btn-warning">Salir</button> + <button onclick="borrar()" type="button" class="btn btn-danger">Borrar prueba</button> + </div> + </div> + </div> +</div> + + +<?php echo '<script'; ?> + type="text/javascript"> + function salir(){ + history.back(); + //window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['dni_paciente']->value;?> +"; + } + + function borrar(){ + var reply=confirm("¿Seguro que desea borrar la prueba?") + if (reply==true) + { + window.location.href="borrar_prueba.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?> +"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + +<?php echo '</script'; ?> +> + +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/6059d6d227d8662e9e78e3b220f9209dfa254a5e_0.file.login.tpl.php b/templates_c/6059d6d227d8662e9e78e3b220f9209dfa254a5e_0.file.login.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..8e642e55355744795018e324d220db7508e5d129 --- /dev/null +++ b/templates_c/6059d6d227d8662e9e78e3b220f9209dfa254a5e_0.file.login.tpl.php @@ -0,0 +1,40 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-01 10:54:43 + from '/volume1/web/velostat/templates/login.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_629729533962a5_63438249', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '6059d6d227d8662e9e78e3b220f9209dfa254a5e' => + array ( + 0 => '/volume1/web/velostat/templates/login.tpl', + 1 => 1654017270, + 2 => 'file', + ), + ), + 'includes' => + array ( + ), +),false)) { +function content_629729533962a5_63438249 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> +<html lang="es"> +<head> + <meta charset="UTF-8"> + <title><?php echo $_smarty_tpl->tpl_vars['titulo']->value;?> +</title> +</head> +<body> + <?php echo '<script'; ?> +> + window.location.href='result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +'; + <?php echo '</script'; ?> +> +</body> +</html><?php } +} diff --git a/templates_c/6f12640b330c3190e957a7923de4fa93d876fcac_0.file.prueba_sujeto.tpl.php b/templates_c/6f12640b330c3190e957a7923de4fa93d876fcac_0.file.prueba_sujeto.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..801a0e3dc691898c9bdc522badd9ae9e474a7e9f --- /dev/null +++ b/templates_c/6f12640b330c3190e957a7923de4fa93d876fcac_0.file.prueba_sujeto.tpl.php @@ -0,0 +1,177 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 14:45:55 + from '/volume1/web/velostat/templates/prueba_sujeto.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1eb83b91f64_59608715', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '6f12640b330c3190e957a7923de4fa93d876fcac' => + array ( + 0 => '/volume1/web/velostat/templates/prueba_sujeto.tpl', + 1 => 1654778750, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62a1eb83b91f64_59608715 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + + + <h2 style = "text-align: center;">Información del sujeto <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h2> + <form class="form-horizontal form-label-left" action="prueba_sujeto_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Edad* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="number" required placeholder="En años"> + </div> + </div> + + <!-- Sexo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" name="sexo" value="M" required style="margin-left: 0px;"> + </div> + </div> + </div> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" name="sexo" value="F" style="margin-left: 0px;"> + </div> + </div> + </div> + + <!-- Anotaciones Sujeto--> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios del sujeto + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_sujeto" type="text"></textarea> + </div> + </div> + + + + <!-- ensayo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" name="ensayo" required> + <option value=""></option> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['ensayos']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?> +"><?php echo $_smarty_tpl->tpl_vars['element']->value;?> +</option> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </select> + </div> + </div> + + <!-- Simetria --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text"> + </div> + </div> + + <!-- Anotaciones prueba--> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_prueba" type="text"></textarea> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Iniciar</button> + <button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + //estado(); + function cancel() { + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + function limpiar() { + window.location.href="prueba_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/83d760623fc7756601facaac13319e4f02e250c9_0.file.add_gestor.tpl.php b/templates_c/83d760623fc7756601facaac13319e4f02e250c9_0.file.add_gestor.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..83697d2d7f3a0d30c21a817983a7fb56dfac1efe --- /dev/null +++ b/templates_c/83d760623fc7756601facaac13319e4f02e250c9_0.file.add_gestor.tpl.php @@ -0,0 +1,156 @@ +<?php +/* Smarty version 3.1.38, created on 2022-05-31 19:14:42 + from '/volume1/web/velostat/templates/add_gestor.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62964d02be5dc6_40683017', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '83d760623fc7756601facaac13319e4f02e250c9' => + array ( + 0 => '/volume1/web/velostat/templates/add_gestor.tpl', + 1 => 1654017269, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62964d02be5dc6_40683017 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="page-title"> + <div class="title_left"> + </div> + + </div> + <div class="clearfix"></div> + + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_title"> + <h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +<small></small></h2> + <div class="clearfix"></div> + </div> + <div class="x_content"> + + <form class="form-horizontal form-label-left" action="add_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + <!-- id_admin --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" pattern="[0-9]{8}[A-Z]" required maxlength="30" name="dni_trabajador" placeholder="Introduzca un número válido 8 num + Letra"> + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="100" type="text" name="nombre"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="200" type="text" name="apellidos"> + </div> + </div> + + <!-- login --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="15" type="text" name="login"> + </div> + </div> + + <!-- titulacion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="20" type="text" name="titulacion"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="pass"> + </div> + </div> + + <!-- Repass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="passrw"> + </div> + </div> + + <!-- Permisos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="select2_single form-control" pattern="[012]{1}" required type="text" name="permisos" placeholder="0:R - 1:RW - 2:RWX"> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Validar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + function cancel() { + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/852385741bddf884fc5ca64b0d046b2e58a8c8e8_0.file.add_reg_val.tpl.php b/templates_c/852385741bddf884fc5ca64b0d046b2e58a8c8e8_0.file.add_reg_val.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..de711ed33ba48971ebb8d940d97c0cb1196d8bf0 --- /dev/null +++ b/templates_c/852385741bddf884fc5ca64b0d046b2e58a8c8e8_0.file.add_reg_val.tpl.php @@ -0,0 +1,252 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 14:53:34 + from '/volume1/web/velostat/templates/add_reg_val.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1ed4ea943f1_41326319', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + '852385741bddf884fc5ca64b0d046b2e58a8c8e8' => + array ( + 0 => '/volume1/web/velostat/templates/add_reg_val.tpl', + 1 => 1654779206, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62a1ed4ea943f1_41326319 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://192.168.1.240/<?php echo $_smarty_tpl->tpl_vars['get']->value;?> +" target="esp"> + <button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button> + </form> + </div> + </div> + </div> + + <div class="col-md-4 col-sm-4 col-xs-4"> + + <div class="x_panel"> + <div class="x_content"> + <iframe name="esp" id="esp" src="http://192.168.1.240/" ></iframe> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://192.168.1.240/" target="esp"> + <button type="submit" formmethod="get" formnovalidate>Reset ESP</button> + </form> + <div > + <img style='height: 300px;' src="<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?> +"> + </div> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <div > + <h2><strong>Colocación sensores:</strong></h2> + <h2><?php echo $_smarty_tpl->tpl_vars['coloc_sensores']->value;?> +</h2> + </div> + </div> + </div> + </div> + + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + </div> + </div> + </div> + + <div class="col-md-6 col-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <h1><?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> +:00</h1> + </div> + </div> + <div class="x_panel"> + <div class="x_content"> + <button type="submit" formmethod="get" id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button> + <button type="submit" formmethod="get" id="salir" class="btn btn-danger" onclick="salir()" formnovalidate>Salir</button> + </div> + </div> + </div> + <div class="col-md-6 col-sm-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <div id="foto"> + Aviso + </div> + </div> + </div> + </div> + </div> + </div> +</div> + +<?php echo '<script'; ?> + type="text/javascript"> +window.onload = function() { + var oFrame = document.getElementById("esp"); + oFrame.contentWindow.document.onclick = function() { + alert("frame contents clicked"); + }; +}; +<?php echo '</script'; ?> +> + +<?php echo '<script'; ?> + type="text/javascript"> + let h1 = document.querySelector("h1"); + + let centesimas = 0; + let segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> +; + + var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); + var snd2 = new Audio("media/audio/check.mp3"); + + var intervalo = 0; + var intervaloBase = segundos/<?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?> +; + var repSg = segundos-1; + var repCnt = 99; + var estado = 0; + $('#done').hide(); + + console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", <?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?> +); + function run(){ + if (estado ==0){ + if((centesimas == 0) &&( segundos == 0)){ + check(); + h1.style.color = 'red'; + $("#foto").html("<h1><strong>FIN</strong></h1>"); + $('#done').show(); + estado = 1; + // función para hacer un delay antes del windows location + // esperamos 2 segundos + function stateChange(newState) { + setTimeout(function () { + if (newState == -1) { + /* + * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde. + * / + $.post("comprobar_post.php", { + recarga:'info' , + puesto: <?php echo $_smarty_tpl->tpl_vars['puesto']->value;?> +, + linea: '<?php echo $_smarty_tpl->tpl_vars['linea']->value;?> +', + cambio: <?php echo $_smarty_tpl->tpl_vars['prox_cambio']->value;?> +, + serie: '<?php echo $_smarty_tpl->tpl_vars['serie']->value;?> +', + foto: '<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?> +', + posicion_ant: <?php echo $_smarty_tpl->tpl_vars['posicion']->value;?> + + } , + function(data){ + //recarga titulo y barcode + $("#resultado").html(data); + }); + //*/ + alert("Saliendo"); + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + }, 2000); + } + + }else{ + // Comprobamos que llegamos a una repetición y ponemos un aviso + if(centesimas == repCnt && segundos == repSg) { + console.log("intervalo = ", repSg,":",repCnt); + $("#foto").html("<h1><strong><?php echo $_smarty_tpl->tpl_vars['ensayo']->value;?> +</strong></h1>"); + beep(); + } + // quitamos el aviso 1seg despues y preparamos la siguiente repeticion + if(centesimas == repCnt && segundos == repSg - 1) { + intervalo = intervalo + intervaloBase; + repSg = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> + - Math.trunc(intervalo) - 1; + repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100); + console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas); + $("#foto").html("<h1><strong>Reposo</strong></h1>"); + } + + if(centesimas == 0){ + --segundos; + centesimas = 99; + }else{ + --centesimas; + } + h1.innerHTML = segundos +':'+centesimas; + + } + + } + } + + function inicio(){ + $('#salir').hide(); + $('#init').hide(); + segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> +; + setInterval(run, 10); + } + function done() { + window.location.href="ver_datos_paciente.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?> +"; + } + function salir() { + window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['dni_paciente']->value;?> +&id_prueba=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?> +&accion=1"; + } + function beep() { + snd1.play(); + } + function check(){ + snd2.play(); + } +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/a340c089a3c33d39af545ca1dda6ba4981614187_0.file.mod_pass.tpl.php b/templates_c/a340c089a3c33d39af545ca1dda6ba4981614187_0.file.mod_pass.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..3ba58e8e226a1a8ab01588a63105126502677572 --- /dev/null +++ b/templates_c/a340c089a3c33d39af545ca1dda6ba4981614187_0.file.mod_pass.tpl.php @@ -0,0 +1,124 @@ +<?php +/* Smarty version 3.1.38, created on 2022-05-31 19:14:52 + from '/volume1/web/velostat/templates/mod_pass.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62964d0c7647a0_10580964', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'a340c089a3c33d39af545ca1dda6ba4981614187' => + array ( + 0 => '/volume1/web/velostat/templates/mod_pass.tpl', + 1 => 1654017270, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62964d0c7647a0_10580964 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="page-title"> + <div class="title_left"> + </div> + + </div> + <div class="clearfix"></div> + + <div class="row"> + <div class="col-md-4 col-sm-4 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <div class="x_title"> + <h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +<small></small></h2> + <div class="clearfix"></div> + </div> + + <div class="profile_pic"> + <img src="media/images/personal/<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +.png" alt="..." class="img-circle profile_img"> + </div> + </div> + </div> + </div> + <div class="col-md-8 col-sm-8 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="mod_pass.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + + <!-- Old Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña antigua * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="oldpass"> + </div> + </div> + + <!-- Pass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña nueva * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="pass"> + </div> + </div> + + <!-- Repass --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita nueva contraseña * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="passrw"> + </div> + </div> + + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> + +<?php echo '<script'; ?> + type="text/javascript"> + function cancel() { + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7_0.file.ges_pat_nueva.tpl.php b/templates_c/ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7_0.file.ges_pat_nueva.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..3f968c550bfc4a2c5e915ca658b1bf32dc3f8827 --- /dev/null +++ b/templates_c/ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7_0.file.ges_pat_nueva.tpl.php @@ -0,0 +1,109 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 14:58:17 + from '/volume1/web/velostat/templates/ges_pat_nueva.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1ee6913af94_79641532', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7' => + array ( + 0 => '/volume1/web/velostat/templates/ges_pat_nueva.tpl', + 1 => 1654017270, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62a1ee6913af94_79641532 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_title"> + <h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +<small></small></h2> + <div class="clearfix"></div> + </div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="ges_pat_nueva.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" > + </div> + </div> + + <!-- Descripción --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" > + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + //estado(); + function cancel() { + window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/b530caa1abef0c4158762b9094485c175b74cac8_0.file.add_pac.tpl.php b/templates_c/b530caa1abef0c4158762b9094485c175b74cac8_0.file.add_pac.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..d0b5522eba2cf97e4cba2417fdc292123c427f91 --- /dev/null +++ b/templates_c/b530caa1abef0c4158762b9094485c175b74cac8_0.file.add_pac.tpl.php @@ -0,0 +1,230 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 15:42:41 + from '/volume1/web/velostat/templates/add_pac.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1f8d142fbb8_07040983', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'b530caa1abef0c4158762b9094485c175b74cac8' => + array ( + 0 => '/volume1/web/velostat/templates/add_pac.tpl', + 1 => 1654782144, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62a1f8d142fbb8_07040983 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <h2 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h2> + <div class="clearfix"></div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="add_pac.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + <!-- DNI --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" required type="text" + value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"> + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[1];?> +" + > + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="apellidos" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[2];?> +"> + </div> + </div> + + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="edad" required type="date" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[4];?> +"> + </div> + </div> + + + <!-- Sexo --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "M") {?> checked="" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?> +" <?php } else { ?> value="M" <?php }?> name="sexo" style="margin-left: 0px;"> + </div> + </div> + </div> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino* + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <div class="radio"> + <input type="radio" <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "F") {?> checked="" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?> +" <?php } else { ?> value="F" <?php }?> name="sexo" style="margin-left: 0px;" > + </div> + </div> + </div> + + <!-- Anotaciones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[5];?> +"> + </div> + </div> + + + <div class="x_panel"> + <h2 style = "text-align: center;">Etiología</h2> + <div class="clearfix"></div> + <!-- Etiologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text"> + </div> + </div> + + <!-- Fecha lesion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="fecha_lesion" required type="date"> + </div> + </div> + + <!-- Cuadrantes --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="cuadrantes" type="text"> + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text"> + </div> + </div> + + + <!-- Patologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" required name="patologia"> + <option value=""></option> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['patologias']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?> +"><?php echo $_smarty_tpl->tpl_vars['element']->value;?> +</option> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </select> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + //estado(); + function cancel() { + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/b56ffecaeb77cc372a48f7469792f42936b73f5f_0.file.prueba_sujeto_val.tpl.php b/templates_c/b56ffecaeb77cc372a48f7469792f42936b73f5f_0.file.prueba_sujeto_val.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..7c9a7401fdef4ad11d07ca23680b62d515f6a550 --- /dev/null +++ b/templates_c/b56ffecaeb77cc372a48f7469792f42936b73f5f_0.file.prueba_sujeto_val.tpl.php @@ -0,0 +1,252 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 14:46:24 + from '/volume1/web/velostat/templates/prueba_sujeto_val.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1eba0b8f6f9_13894005', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'b56ffecaeb77cc372a48f7469792f42936b73f5f' => + array ( + 0 => '/volume1/web/velostat/templates/prueba_sujeto_val.tpl', + 1 => 1654778519, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62a1eba0b8f6f9_13894005 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://192.168.1.240/<?php echo $_smarty_tpl->tpl_vars['get']->value;?> +" target="esp"> + <button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button> + </form> + </div> + </div> + </div> + + <div class="col-md-4 col-sm-4 col-xs-4"> + + <div class="x_panel"> + <div class="x_content"> + <iframe name="esp" id="esp" src="http://192.168.1.240/" ></iframe> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <form action="http://192.168.1.240/" target="esp"> + <button type="submit" formmethod="get" formnovalidate>Reset ESP</button> + </form> + <div > + <img style='height: 300px;' src="<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?> +"> + </div> + </div> + </div> + </div> + <div class="col-md-4 col-sm-4 col-xs-4"> + <div class="x_panel"> + <div class="x_content"> + <div > + <h2><strong>Colocación sensores:</strong></h2> + <h2><?php echo $_smarty_tpl->tpl_vars['coloc_sensores']->value;?> +</h2> + </div> + </div> + </div> + </div> + + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_content"> + </div> + </div> + </div> + + <div class="col-md-6 col-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <h1><?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> +:00</h1> + </div> + </div> + <div class="x_panel"> + <div class="x_content"> + <button type="submit" formmethod="get" id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button> + <button type="submit" formmethod="get" id="salir" class="btn btn-danger" onclick="salir_sujeto()" formnovalidate>Salir</button> + </div> + </div> + </div> + <div class="col-md-6 col-sm-6 col-xs-6"> + <div class="x_panel"> + <div class="x_content"> + <div id="foto"> + Aviso + </div> + </div> + </div> + </div> + </div> + </div> +</div> + +<?php echo '<script'; ?> + type="text/javascript"> +window.onload = function() { + var oFrame = document.getElementById("esp"); + oFrame.contentWindow.document.onclick = function() { + alert("frame contents clicked"); + }; +}; +<?php echo '</script'; ?> +> + +<?php echo '<script'; ?> + type="text/javascript"> + let h1 = document.querySelector("h1"); + + let centesimas = 0; + let segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> +; + + var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); + var snd2 = new Audio("media/audio/check.mp3"); + + var intervalo = 0; + var intervaloBase = segundos/<?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?> +; + var repSg = segundos-1; + var repCnt = 99; + var estado = 0; + $('#done').hide(); + + console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", <?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?> +); + function run(){ + if (estado ==0){ + if((centesimas == 0) &&( segundos == 0)){ + check(); + h1.style.color = 'red'; + $("#foto").html("<h1><strong>FIN</strong></h1>"); + $('#done').show(); + estado = 1; + // función para hacer un delay antes del windows location + // esperamos 2 segundos + function stateChange(newState) { + setTimeout(function () { + if (newState == -1) { + /* + * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde. + * / + $.post("comprobar_post.php", { + recarga:'info' , + puesto: <?php echo $_smarty_tpl->tpl_vars['puesto']->value;?> +, + linea: '<?php echo $_smarty_tpl->tpl_vars['linea']->value;?> +', + cambio: <?php echo $_smarty_tpl->tpl_vars['prox_cambio']->value;?> +, + serie: '<?php echo $_smarty_tpl->tpl_vars['serie']->value;?> +', + foto: '<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?> +', + posicion_ant: <?php echo $_smarty_tpl->tpl_vars['posicion']->value;?> + + } , + function(data){ + //recarga titulo y barcode + $("#resultado").html(data); + }); + //*/ + alert("Saliendo"); + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + }, 2000); + } + + }else{ + // Comprobamos que llegamos a una repetición y ponemos un aviso + if(centesimas == repCnt && segundos == repSg) { + console.log("intervalo = ", repSg,":",repCnt); + $("#foto").html("<h1><strong><?php echo $_smarty_tpl->tpl_vars['ensayo']->value;?> +</strong></h1>"); + beep(); + } + // quitamos el aviso 1seg despues y preparamos la siguiente repeticion + if(centesimas == repCnt && segundos == repSg - 1) { + intervalo = intervalo + intervaloBase; + repSg = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> + - Math.trunc(intervalo) - 1; + repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100); + console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas); + $("#foto").html("<h1><strong>Reposo</strong></h1>"); + } + + if(centesimas == 0){ + --segundos; + centesimas = 99; + }else{ + --centesimas; + } + h1.innerHTML = segundos +':'+centesimas; + + } + + } + } + + function inicio(){ + $('#salir').hide(); + $('#init').hide(); + segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?> +; + setInterval(run, 10); + } + function done() { + window.location.href="ver_datos_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?> +"; + } + function salir_sujeto() { + window.location.href="prueba_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id_prueba=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?> +&accion=1"; + history.back(); + } + function beep() { + snd1.play(); + } + function check(){ + snd2.play(); + } +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/b5f656167d06e27e9ec6ed576a814f80af41a00f_0.file.barra.tpl.php b/templates_c/b5f656167d06e27e9ec6ed576a814f80af41a00f_0.file.barra.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..32f6e082ce620a96c20a6688d49883a2431fab1e --- /dev/null +++ b/templates_c/b5f656167d06e27e9ec6ed576a814f80af41a00f_0.file.barra.tpl.php @@ -0,0 +1,189 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 13:43:02 + from '/volume1/web/velostat/templates/barra.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1dcc6280608_32924378', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'b5f656167d06e27e9ec6ed576a814f80af41a00f' => + array ( + 0 => '/volume1/web/velostat/templates/barra.tpl', + 1 => 1654774975, + 2 => 'file', + ), + ), + 'includes' => + array ( + ), +),false)) { +function content_62a1dcc6280608_32924378 (Smarty_Internal_Template $_smarty_tpl) { +?><!-- Barra de menu --> +<?php if ($_smarty_tpl->tpl_vars['id_admin']->value == 4100001) {?> +<body class="nav-sm"> +<?php } else { ?> +<body class="nav-md"> +<?php }?> + <div class="container body"> + <div class="main_container"> + + <!-- Contenedor total --> + <div class="col-md-3 left_col menu_fixed"> + <div class="left_col scroll-view"> + <div class="navbar nav_title" style="border: 0;"> + <a data-toggle="tooltip" data-placement="bottom" title="Inicio" href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" class="site_title"><i class="fa fa-home"></i> <span style="font-size: 0.8em; ">Sensores de presión</span></a> + </div> + <div class="clearfix"></div> + + <!-- menu profile quick info --> + <div class="profile clearfix"> + <div class="profile_pic"> + <img src="<?php echo $_smarty_tpl->tpl_vars['imagen_id']->value;?> +" alt="Foto trabajador" class="img-circle profile_img"> + </div> + <div class="profile_info"> + <span>Bienvenido,</span> + <h2><?php echo $_smarty_tpl->tpl_vars['nombre']->value;?> +</h2> + </div> + </div> + <!-- /menu profile quick info --> + + <br/> + + <!-- sidebar menu --> + <div id="sidebar-menu" class="main_menu_side hidden-print main_menu"> + <div class="menu_section"> +<!-- GENERAL --> + <h3>General</h3> + <ul class="nav side-menu"> + <!-- AÑADIR PACIENTES --> + <li><a href="add_pac.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Añadir pacientes</a></li> + <!-- REALIZAR PRUEBA --> + <li><a href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Realizar prueba</a></li> + <!-- GESTIONAR ENSAYOS --> + <li><a href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Gestionar ensayos</a></li> + <!-- GESTIONAR PATOLOGIAS --> + <li><a href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Gestionar patologías</a></li> + + +<!-- OTROS --> + <h3>Otros</h3> + <ul class="nav side-menu"> + +<!-- PAGINAS ADICIONALES --> + + <li><a data-toggle="tooltip" data-placement="top" title="Gestión de Sujetos Sanos"><i class="fa fa-bug" ></i> Gestión de sujetos <span class="fa fa-chevron-down"></span></a> + <ul class="nav child_menu"> + <li><a href="prueba_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Añadir prueba a sujeto</a></li> + <li><a href="ver_pruebas_sujetos.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Ver pruebas de sujetos</a></li> + </li> + </ul> + </li> + </ul> + </div> + </div> + + <!-- /sidebar menu --> + + <!-- /menu footer buttons --> + <div class="sidebar-footer hidden-small"> + <!-- Quito la configuración de perfil + <a data-toggle="tooltip" data-placement="top" title="Settings" href="mod_perfil.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"> + <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> + </a> Quito la pantalla completa + <a data-toggle="tooltip" data-placement="top" title="FullScreen"> + <span class="glyphicon glyphicon-fullscreen" aria-hidden="true" onclick="fullscreen()"></span> + </a> --> + <!-- Quito el bloqueo + <a data-toggle="tooltip" data-placement="top" title="Lock"> + <span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span> + </a> --> + <a data-toggle="tooltip" data-placement="top" title="Logout" href="log_out.php"> + <span class="glyphicon glyphicon-off" aria-hidden="true"></span> + </a> + </div> + <!-- /menu footer buttons --> + </div> + </div> + + <!-- top navigation --> + <div class="top_nav"> + <div class="nav_menu"> + <nav> + <div class="nav toggle"> + <a id="menu_toggle"><i class="fa fa-bars"></i></a> + </div> + <!-- Aquí se muestra la información de cargando que habrá que modificar--> + <ul class="nav navbar-nav navbar-left"><h4 id="titulo" style="margin-top: 19px;" ><!-- <i class="fa fa-spinner fa-spin fa-fw"></i> Cargando. Espere --> </h4></ul> + <ul class="nav navbar-nav navbar-right"> + <!-- Aquí se muestra la información de cargando que habrá que modificar--> + <li class=""> + <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + <img src="<?php echo $_smarty_tpl->tpl_vars['imagen_id']->value;?> +" alt="Foto trabajador"> + <span class=" fa fa-angle-down"></span> + </a> + <ul class="dropdown-menu dropdown-usermenu pull-right"> + <li><a href="mod_pass.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"><i class="fa fa-cogs pull-right"></i>Cambiar contraseña</a></li> + + <li><a href="log_out.php"><i class="fa fa-sign-out pull-right"></i> Cerrar sesión</a></li> + + </ul> + </li> + <!-- Modificar Usuarios si se tiene permiso--> + <?php if ($_smarty_tpl->tpl_vars['permisos']->value == 1 || $_smarty_tpl->tpl_vars['permisos']->value == 2 || $_smarty_tpl->tpl_vars['permisos']->value == 3 || $_smarty_tpl->tpl_vars['permisos']->value == 4) {?> + <li class=""> + <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Gestión + <span class=" fa fa-angle-down"></span> + </a> + <ul class="dropdown-menu dropdown-usermenu pull-right"> + <li><a href="add_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Añadir trabajador</a></li> + <li><a href="mod_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +">Modificar trabajador</a></li> + + </ul> + </li> + <?php }?> + + </ul> + </nav> + </div> + </div> + <!-- /top navigation --> + + <!-- page content --> + <div class="right_col" role="main" id="contenido"> + +<!-- +<?php echo '<script'; ?> + type="text/javascript"> + $(document).ready(function(){ + /** + * Determinar si una imagen existe por la propiedad naturalHeight + * la cual sera diferente de 0 si esta existe + **/ + $('img').each(function(){ + if($(this)[0].naturalHeight == 0){ + $(this).attr('src','media/images/no_image/no_image.png'); + } + }); +}); +<?php echo '</script'; ?> +> +--><?php } +} diff --git a/templates_c/be38c18a1f6216cb3f0917cd661938f22cc80d66_0.file.ges_pat.tpl.php b/templates_c/be38c18a1f6216cb3f0917cd661938f22cc80d66_0.file.ges_pat.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..c115ecd641c45f5703d179db60ef8067237e6d9a --- /dev/null +++ b/templates_c/be38c18a1f6216cb3f0917cd661938f22cc80d66_0.file.ges_pat.tpl.php @@ -0,0 +1,188 @@ +<?php +/* Smarty version 3.1.38, created on 2022-05-31 19:15:02 + from '/volume1/web/velostat/templates/ges_pat.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62964d1676c609_46537970', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'be38c18a1f6216cb3f0917cd661938f22cc80d66' => + array ( + 0 => '/volume1/web/velostat/templates/ges_pat.tpl', + 1 => 1654017270, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62964d1676c609_46537970 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> + + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + <div class="clearfix"></div> + <form class="form-horizontal form-label-left" action="ges_pat_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +" method="post"> + + <!-- id_patologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_patologia + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="id_patologia" required disabled type="text" + value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +" > + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[1];?> +" > + </div> + </div> + + <!-- Descripción --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[2];?> +" > + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + <button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button> + </div> + </div> + </form> + + </div> + <?php } else { ?> + + <!-- tabla para seleccionar patologia --> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + <div class="clearfix"></div> + <div class="tablas"> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, "asc" ]]"> + + <thead> + <tr> + <td>id_patologia</td> + <td>Nombre</td> + <td>Descripción</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + <div class="col-md-6 col-md-offset-3"> + <button onclick="n_patologia()" type="button" class="btn btn-primary">Nueva patologia</button> + </div> + </div> + <?php }?> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + + function cancel() { + window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + function eliminar() { + var reply=confirm("¿Seguro que desea borrar la patologia?") + if (reply==true) + { + window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?> +&accion=1"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + function n_patologia() { + window.location.href="ges_pat_nueva.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id="+table.rows('.selected').data()[0][0]; + } ); + } ); + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/ca87c448aeb6614657c25f99529a77ce08340f70_0.file.ges_ens_nuevo.tpl.php b/templates_c/ca87c448aeb6614657c25f99529a77ce08340f70_0.file.ges_ens_nuevo.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..ab972b719e359a1bba498387528c93b35e713f8c --- /dev/null +++ b/templates_c/ca87c448aeb6614657c25f99529a77ce08340f70_0.file.ges_ens_nuevo.tpl.php @@ -0,0 +1,136 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-01 19:00:27 + from '/volume1/web/velostat/templates/ges_ens_nuevo.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62979b2bbf22b1_34197800', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'ca87c448aeb6614657c25f99529a77ce08340f70' => + array ( + 0 => '/volume1/web/velostat/templates/ges_ens_nuevo.tpl', + 1 => 1654017269, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62979b2bbf22b1_34197800 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <div class="x_title"> + <h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +<small></small></h2> + <div class="clearfix"></div> + </div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="ges_ens_nuevo.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + <!-- Tipo / Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo (Nombre) *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" > + </div> + </div> + + <!-- Colocacion sensores --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación Sensores *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="300" name="coloc_sensores" required type="text" > + </div> + </div> + + <!-- Duracion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duración *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="duracion" required type="number" placeholder="En segundos"> + </div> + </div> + + <!-- Repeticiones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="number" placeholder="Número de repeticiones"> + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="textarea" > + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + //estado(); + function cancel() { + window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0_0.file.head.tpl.php b/templates_c/cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0_0.file.head.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..f8691fe17f85f269490e927fc40d70b4aa7f0329 --- /dev/null +++ b/templates_c/cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0_0.file.head.tpl.php @@ -0,0 +1,121 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-09 13:43:02 + from '/volume1/web/velostat/templates/head.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62a1dcc6236938_52152568', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0' => + array ( + 0 => '/volume1/web/velostat/templates/head.tpl', + 1 => 1654774975, + 2 => 'file', + ), + ), + 'includes' => + array ( + ), +),false)) { +function content_62a1dcc6236938_52152568 (Smarty_Internal_Template $_smarty_tpl) { +?><html lang="es"> +<head> + <link rel="icon" href="media/images/favicon/sensor.png"> + <title>TFG. Sensor de presión</title> + + <title><?php echo $_smarty_tpl->tpl_vars['titulo']->value;?> +</title> + <meta charset="utf-8"> + <!-- Al ser un entorno Mobile first, tendremos que corregir la escala y ancho de inicio del dispositivo --> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + + <!-- Estilo bootstrap...--> + + <link rel="stylesheet" type="text/css" href="/sources/css/bootstrap-datetimepicker.min.css"/> + <link rel="stylesheet" type="text/css" href="/sources/bootstrap/dist/css/bootstrap.css"/> + <link rel="stylesheet" type="text/css" href="/sources/css/daterangepicker.css"/> + + <!-- para datatables --> + <link rel="stylesheet" type="text/css" href="/sources/css/dataTables.bootstrap.min.css"/> + <link rel="stylesheet" type="text/css" href="/sources/css/fixedColumns.dataTables.min.css"/> + + <!-- para los botones pdf excel... --> + + <link rel="stylesheet" type="text/css" href="/sources/Buttons-1.3.1/css/buttons.dataTables.min.css"/> + + <!-- ******************************************************--> + + <!-- Font Awesome --> + <link rel="stylesheet" type="text/css" href="/sources/font-awesome/css/font-awesome.min.css"> + + <!-- NProgress --> + <link href="/sources/nprogress/nprogress.css" rel="stylesheet"> + + <!-- FullCalendar + <link href="/sources/fullcalendar-3.5.1/fullcalendar.min.css" rel="stylesheet"> + <link href="/sources/fullcalendar-3.5.1/fullcalendar.print.css" rel="stylesheet" media="print">--> + + <!-- Teclado virtual --> + + <link rel="stylesheet" href="css/styles.css"> + + <!-- Dropzone.js + <link href="/sources/dropzone/dist/min/dropzone.min.css" rel="stylesheet">--> + + <!-- Select2 --> + <link href="/sources/select2/dist/css/select2.min.css" rel="stylesheet"> + + <!-- jQuery custom content scroller --> + <link rel="stylesheet" type="text/css" href="/sources/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.min.css"/> + + <!-- Custom Theme Style --> + <link rel="stylesheet" type="text/css" href="/sources/css/custom.iacob.css"> + + + <!-- ******************************************************** --> + + <!-- Nuestro estilo propio... --> + + <link rel="stylesheet" type="text/css" href="/sources/css/estilo.css"/> + + <!-- jquery + <?php echo '<script'; ?> + type="text/javascript" src="/sources/jQuery-3.2.1/jquery-3.2.1.js"><?php echo '</script'; ?> +>--> + <!-- --> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/jquery/dist/jquery.min.js"><?php echo '</script'; ?> +> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/js/bootstrap.js"><?php echo '</script'; ?> +> + <!-- Select2 -> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/select2/dist/js/select2.full.min.js"><?php echo '</script'; ?> +> + + <!-- Graficos... --> + + <?php echo '<script'; ?> + src="/sources/Chart.js/dist/Chart.bundle.js"><?php echo '</script'; ?> +> + <!-- including ECharts file --> + <?php echo '<script'; ?> + type="text/javascript" src="/sources/echarts/dist/echarts.min.js"><?php echo '</script'; ?> +> + + <style> + canvas { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + } + </style> + <!-- --> +</head> +<?php } +} diff --git a/templates_c/dee8e5acb41e48b79d987651a1a1c9e360905bd7_0.file.add_eti.tpl.php b/templates_c/dee8e5acb41e48b79d987651a1a1c9e360905bd7_0.file.add_eti.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..19210df099fd5abaeaab7c3654f5f2b5eb18c77c --- /dev/null +++ b/templates_c/dee8e5acb41e48b79d987651a1a1c9e360905bd7_0.file.add_eti.tpl.php @@ -0,0 +1,166 @@ +<?php +/* Smarty version 3.1.38, created on 2022-05-31 19:14:38 + from '/volume1/web/velostat/templates/add_eti.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_62964cfe3aaeb5_50186086', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'dee8e5acb41e48b79d987651a1a1c9e360905bd7' => + array ( + 0 => '/volume1/web/velostat/templates/add_eti.tpl', + 1 => 1654017269, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_62964cfe3aaeb5_50186086 (Smarty_Internal_Template $_smarty_tpl) { +?><!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<?php echo '<script'; ?> + type="text/javascript"> + + function limita(maximoCaracteres) { + var elemento = document.getElementById("texto"); + if(elemento.value.length >= maximoCaracteres ) { + return false; + } + else { + return true; + } + } + +<?php echo '</script'; ?> +> + +<div class="" role="main"> + <div class=""> + <div class="row"> + <div class="col-md-12 col-sm-12 col-xs-12"> + <div class="x_panel"> + <h2 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h2> + <div class="clearfix"></div> + <div class="x_content"> + <form class="form-horizontal form-label-left" action="add_eti.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&accion=1&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +" method="post"> + + <!-- DNI --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" disabled type="text" + value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"> + </div> + </div> + + <div class="x_panel"> + <h2 style = "text-align: center;">Etiología</h2> + <div class="clearfix"></div> + <!-- Etiologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text"> + </div> + </div> + + <!-- Fecha lesion --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" name="fecha_lesion" required type="date"> + </div> + </div> + + <!-- Cuadrantes --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="cuadrantes" type="text"> + </div> + </div> + + <!-- Comentarios --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text"> + </div> + </div> + + + <!-- Patologia --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología * + </label> + <div class="col-md-6 col-sm-6 col-xs-12" > + <select class="select2_single form-control" required name="patologia"> + <option value=""></option> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['patologias']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?> +"><?php echo $_smarty_tpl->tpl_vars['element']->value;?> +</option> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </select> + </div> + </div> + + <div class="ln_solid"></div> + <div class="form-group"> + <div class="col-md-6 col-md-offset-3"> + <button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button> + <button id="send" type="submit" class="btn btn-success">Guardar</button> + </div> + </div> + + </form> + </div> + </div> + </div> + </div> + </div> +</div> +<?php echo '<script'; ?> + type="text/javascript"> + function cancel() { + window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"; + } + +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/templates_c/f20fa418a5fd1530964bc1ba2ac6d095cf136488_0.file.pac_reg.tpl.php b/templates_c/f20fa418a5fd1530964bc1ba2ac6d095cf136488_0.file.pac_reg.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..81740ed6c27f598c37f68ff3a4ef2e2d225720e4 --- /dev/null +++ b/templates_c/f20fa418a5fd1530964bc1ba2ac6d095cf136488_0.file.pac_reg.tpl.php @@ -0,0 +1,266 @@ +<?php +/* Smarty version 3.1.38, created on 2022-06-07 19:56:25 + from '/volume1/web/velostat/templates/pac_reg.tpl' */ + +/* @var Smarty_Internal_Template $_smarty_tpl */ +if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ( + 'version' => '3.1.38', + 'unifunc' => 'content_629f9149421806_63465682', + 'has_nocache_code' => false, + 'file_dependency' => + array ( + 'f20fa418a5fd1530964bc1ba2ac6d095cf136488' => + array ( + 0 => '/volume1/web/velostat/templates/pac_reg.tpl', + 1 => 1654624571, + 2 => 'file', + ), + ), + 'includes' => + array ( + 'file:head.tpl' => 1, + 'file:barra.tpl' => 1, + 'file:footer.tpl' => 1, + ), +),false)) { +function content_629f9149421806_63465682 (Smarty_Internal_Template $_smarty_tpl) { +$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),)); +?> +<!DOCTYPE html> + <!-- El head con los estilos y el javascript genérico --> + <?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + <!-- Barra de menu --> + <?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +?> + + <!-- Zona Central --> +<div class="" role="main"> + <form class="form-horizontal form-label-left" action="mod_pac.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +" method="post"> + + <!-- tabla para seleccionar sujeto --> + <div class="x_content"> + <h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?> +</h4> + </div> + + <div class="row"> + <div class="col-md-6 col-sm-6 col-xs-24"> + <!-- DNI --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 "> + <input id="name" class="form-control col-md-10 col-xs-15" pattern="[0-9]<?php echo 8;?> +[A-Z]" data-validate-length-range="10" name="dni" readonly="readonly" type="text" + value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"> + </div> + </div> + + <!-- Nombre --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[1];?> +"> + </div> + </div> + + <!-- Apellidos --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="apellidos" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[2];?> +"> + </div> + </div> + </div> + + <div class="col-md-6 col-sm-6 col-xs-24"> + <!-- Edad --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span> + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" data-validate-words="1" name="edad" required type="date" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[4];?> +"> + </div> + </div> + <!-- Sexo --> + <div class="item form-group"> + <div class="col-md-6 col-sm-6 col-xs-12" > + <div class="radio"> + <label for="name" style="margin-left: 50px;"><b>Sexo Masculino  </b> + <input type="radio" <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "M") {?> checked="" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?> +" <?php } else { ?> value="M" <?php }?> name="sexo" style="margin-left: 15px;"></label> + <label for="name" style="margin-left: 50px;"><b>Sexo Femenino  </b> + <input type="radio" <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "F") {?> checked="" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?> +" <?php } else { ?> value="F" <?php }?> name="sexo" style="margin-left: 15px;"> </label> + </div> + </div> + </div> + + <!-- Anotaciones --> + <div class="item form-group"> + <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones del paciente + </label> + <div class="col-md-6 col-sm-6 col-xs-12"> + <textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text"><?php echo $_smarty_tpl->tpl_vars['sujeto']->value[5];?> +</textarea> + </div> + </div> + </div> + </div> + <div class="form-group"> + <div class="col-md-7 col-md-offset-4"> + <button id="send" type="submit" class="btn btn-success">Guardar cambios</button> + <button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar paciente</button> + <button onclick="realizar_prueba()" type="button" class="btn btn-info">Realizar prueba</button> + <button onclick="n_etiologia()" type="button" class="btn btn-info">Añadir etiología</button> + </div> + </div> + </form> + + <div class="ln_solid"></div> + + <div class="x_content"> + <div class=""> + <h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4> + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 0, "desc" ]]" style="font-size:13px; "> + <thead> + <tr> + <td>id_prueba</td> + <td>Prueba</td> + <td>Fecha - Hora</td> + <td>Simetría</td> + <td>Anotaciones</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['entrada']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[2],"%d/%m/%Y %H:%M:%S");?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + </div> + <div class="x_content"> + <div class=""> + <h4 style = "text-align: center;">LISTADO DE ETIOLOGÍAS</h4> + <table id="etiologias" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, "desc" ]]" style="font-size:13px; "> + <thead> + <tr> + <td>id_etiologia</td> + <td>Descripción</td> + <td>Fecha aparición parálisis</td> + <td>Cuadrantes afectados</td> + <td>Comentarios de la etiología</td> + <td>Patología asociada</td> + </tr> + </thead> + + <tbody> + <?php +$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['etiologia']->value, 'element'); +$_smarty_tpl->tpl_vars['element']->do_else = true; +if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) { +$_smarty_tpl->tpl_vars['element']->do_else = false; +?> + <tr data-toggle="tooltip" data-placement="top" > + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?> +</td> + <td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[2],"%d/%m/%Y");?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?> +</td> + <td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?> +</td> + </tr> + <?php +} +$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?> + </tbody> + </table> + </div> + </div> +</div> + + +<?php echo '<script'; ?> + type="text/javascript"> + + function eliminar() { + var reply=confirm("¿Seguro que desea borrar el paciente, se borrarán las pruebas y etiologías asociadas?") + if (reply==true) + { + window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +&accion=1"; + } + else + { + //AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL + } + + } + + function realizar_prueba(){ + window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"; + } + + function n_etiologia(){ + window.location.href="add_eti.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?> +"; + } + + + $(document).ready(function() { + $('#example').DataTable({ + lengthMenu: [ + [ 10, 25, 100, -1 ], + [ '10 filas', '25 filas', '100 filas', 'Todas las filas' ] + ] + }); + var table = $('#example').DataTable(); + + $('#example tbody').on( 'click', 'tr', function () { + $(this).toggleClass('selected'); + window.location.href="ver_datos_paciente.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?> +&id="+table.rows('.selected').data()[0][0]; + } ); + } ); +<?php echo '</script'; ?> +> +<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false); +} +} diff --git a/velostat.workspace.code-workspace b/velostat.workspace.code-workspace new file mode 100644 index 0000000000000000000000000000000000000000..876a1499c09dc083612f43c53c0ae71b9c30c5b1 --- /dev/null +++ b/velostat.workspace.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/ver_datos_paciente.php b/ver_datos_paciente.php new file mode 100644 index 0000000000000000000000000000000000000000..7b33e4e6d897e6c043a2e4a4fa9a4b5b3010d63a --- /dev/null +++ b/ver_datos_paciente.php @@ -0,0 +1,104 @@ +<?php session_start(); +require('include.php'); +require_once("funciones.php"); +/* +* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos +* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + +$id_admin=$_GET["variable"]; + $id_prueba =$_GET["id"]; + // Comprueba que sigue en la sesión + $html=new Smarty; + + barra(); + + + $sql="SELECT id_datos_pruebas_pacientes, s1, s2, s3, s4, s5, s6, `timestamp` + FROM DATOS_PRUEBAS_PACIENTES + WHERE `id_prueba`='$id_prueba' + ORDER BY `timestamp`ASC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_datos_pruebas_pacientes'], + $row['timestamp'], + $row['s1'], + $row['s2'], + $row['s3'], + $row['s4'], + $row['s5'], + $row['s6'] + ]; + $labels.=$row['timestamp'].","; + $s1.=$row['s1'].","; + $s2.=$row['s2'].","; + $s3.=$row['s3'].","; + $s4.=$row['s4'].","; + $s5.=$row['s5'].","; + $s6.=$row['s6'].","; + $x++; + } + $html->assign("etiquetas",$labels); + $html->assign("s1",$s1); + $html->assign("s2",$s2); + $html->assign("s3",$s3); + $html->assign("s4",$s4); + $html->assign("s5",$s5); + $html->assign("s6",$s6); + $html->assign("entrada",$entrada); + } + + $result = $conex->query("SELECT tipo FROM `ENSAYOS`,`PRUEBAS_PACIENTES` WHERE ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo AND PRUEBAS_PACIENTES.id_prueba ='$id_prueba'"); + $row = $result->fetch_assoc(); + $tipo=$row['tipo']; + + + /*$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre + FROM ETIOLOGIAS, PATOLOGIAS + WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia + ORDER BY fecha_lesion DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $etiologia[$x]=[ + $row['id_etiologia'], + $row['etiologia'], + $row['fecha_lesion'], + $row['cuadrantes'], + $row['comentarios'], + $row['nombre'] + ]; + $x++; + } + $html->assign("etiologia",$etiologia); + }*/ + + + $sql="SELECT nombre, PACIENTES.dni_paciente as dni_paciente, fecha FROM PACIENTES, PRUEBAS_PACIENTES WHERE PACIENTES.dni_paciente=PRUEBAS_PACIENTES.dni_paciente AND PRUEBAS_PACIENTES.id_prueba='$id_prueba'"; + $result=$conex->query($sql); + $row = $result->fetch_assoc(); + $dni_paciente = $row['dni_paciente']; + $nombre = $row['nombre']; + $fecha = $row['fecha']; + + + $html->assign("id_admin",$id_admin); + $html->assign("id_prueba",$id_prueba); + $html->assign("dni_paciente",$dni_paciente); + $html->assign("nombre",$nombre); + $html->assign("tipo",$tipo); + $html->assign("fecha",$fecha); + + $html->display("ver_datos_paciente.tpl"); +} +else @header('location:index.php'); +?> diff --git a/ver_datos_sujeto.php b/ver_datos_sujeto.php new file mode 100644 index 0000000000000000000000000000000000000000..8dd7e9d4ff15914d589e9e93d7d4b37f24b25c26 --- /dev/null +++ b/ver_datos_sujeto.php @@ -0,0 +1,103 @@ +<?php session_start(); +require('include.php'); +require_once("funciones.php"); +/* +* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos +* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + +$id_admin=$_GET["variable"]; + $id_prueba_sujeto =$_GET["id"]; + // Comprueba que sigue en la sesión + $html=new Smarty; + + barra(); + + + $sql="SELECT id_datos_pruebas_sujetos, s1, s2, s3, s4, s5, s6, `timestamp` + FROM DATOS_PRUEBAS_SUJETOS + WHERE `id_prueba_sujeto`='$id_prueba_sujeto' + ORDER BY `timestamp`ASC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_datos_pruebas_sujetos'], + $row['timestamp'], + $row['s1'], + $row['s2'], + $row['s3'], + $row['s4'], + $row['s5'], + $row['s6'] + ]; + $labels.=$row['timestamp'].","; + $s1.=$row['s1'].","; + $s2.=$row['s2'].","; + $s3.=$row['s3'].","; + $s4.=$row['s4'].","; + $s5.=$row['s5'].","; + $s6.=$row['s6'].","; + $x++; + } + $html->assign("etiquetas",$labels); + $html->assign("s1",$s1); + $html->assign("s2",$s2); + $html->assign("s3",$s3); + $html->assign("s4",$s4); + $html->assign("s5",$s5); + $html->assign("s6",$s6); + $html->assign("entrada",$entrada); + } + + $result = $conex->query("SELECT tipo FROM `ENSAYOS`,`PRUEBAS_SUJETOS` WHERE ENSAYOS.id_ensayo=PRUEBAS_SUJETOS.id_ensayo AND PRUEBAS_SUJETOS.id_prueba_sujeto ='$id_prueba_sujeto'"); + $row = $result->fetch_assoc(); + $tipo=$row['tipo']; + + + /*$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre + FROM ETIOLOGIAS, PATOLOGIAS + WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia + ORDER BY fecha_lesion DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $etiologia[$x]=[ + $row['id_etiologia'], + $row['etiologia'], + $row['fecha_lesion'], + $row['cuadrantes'], + $row['comentarios'], + $row['nombre'] + ]; + $x++; + } + $html->assign("etiologia",$etiologia); + }*/ + + + $sql="SELECT SUJETOS.id_sujeto as nombre, fecha FROM SUJETOS, PRUEBAS_SUJETOS WHERE SUJETOS.id_sujeto =PRUEBAS_SUJETOS.id_sujeto AND PRUEBAS_SUJETOS.id_prueba_sujeto ='$id_prueba_sujeto'"; + $result=$conex->query($sql); + $row = $result->fetch_assoc();; + $nombre = "Sujeto ".$row['nombre']; + $fecha = $row['fecha']; + + + $html->assign("id_admin",$id_admin); + $html->assign("id_prueba",$id_prueba_sujeto); + $html->assign("dni_paciente",$dni_paciente); + $html->assign("nombre",$nombre); + $html->assign("tipo",$tipo); + $html->assign("fecha",$fecha); + + $html->display("ver_datos_sujeto.tpl"); +} +else @header('location:index.php'); +?> diff --git a/ver_pruebas_sujetos.php b/ver_pruebas_sujetos.php new file mode 100644 index 0000000000000000000000000000000000000000..8467241d5a2ff38a9ed1ad685868714360e60f84 --- /dev/null +++ b/ver_pruebas_sujetos.php @@ -0,0 +1,48 @@ +<?php session_start(); +require('include.php'); +require_once("funciones.php"); +/* +* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos +* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA +*/ +if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){ + $id_admin=$_GET["variable"]; + $id_paciente=$_GET["id"]; + // Comprueba que sigue en la sesión + $html=new Smarty; + + barra(); + + + $sql="SELECT SUJETOS.edad, SUJETOS.sexo, tipo, fecha, simetria, PRUEBAS_SUJETOS.anotaciones, PRUEBAS_SUJETOS.id_prueba_sujeto + FROM ENSAYOS, PRUEBAS_SUJETOS, SUJETOS + WHERE ENSAYOS.id_ensayo=PRUEBAS_SUJETOS.id_ensayo AND SUJETOS.id_sujeto = PRUEBAS_SUJETOS.id_sujeto + ORDER BY fecha DESC + "; + if($result=$conex->query($sql)){ + // rellenamos array con tabla obtenida de las pruebas + //Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])), + $x = 0; + while ($row = $result->fetch_assoc()){ + $entrada[$x]=[ + $row['id_prueba_sujeto'], + $row['tipo'], + $row['fecha'], + $row['sexo'], + $row['edad'], + $row['simetria'], + $row['anotaciones'] + ]; + $x++; + } + $html->assign("entrada",$entrada); + }else{ + $mensaje="Error al capturar las pruebas sobre los sujetos"; + } + + + $html->assign("id_admin",$id_admin); + $html->display("ver_pruebas_sujetos.tpl"); +} +else @header('location:index.php'); +?>