mirror of
https://github.com/misterunknown/ifm.git
synced 2025-08-11 10:34:00 +02:00
misterunknown: complete refactor of code including splitting it up to multiple files and build a compiler
This commit is contained in:
35
compiler.php
Normal file
35
compiler.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
// This compiles the source files into one file
|
||||
|
||||
$IFM_CONFIG = "src/config.php";
|
||||
$IFM_INCLUDES = "src/includes.php";
|
||||
$IFM_MAIN = "src/main.php";
|
||||
$IFM_STYLE = "src/style.css";
|
||||
$IFM_JS = "src/ifm.js";
|
||||
$IFM_OTHER_PHPFILES = array("src/zip_file.php");
|
||||
|
||||
$filename = "ifm.php";
|
||||
|
||||
// config
|
||||
file_put_contents($filename, file_get_contents($IFM_CONFIG));
|
||||
|
||||
// includes
|
||||
$content_includes = file($IFM_INCLUDES);
|
||||
unset($content_includes[0]);
|
||||
file_put_contents($filename, $content_includes, FILE_APPEND);
|
||||
|
||||
// other php classes
|
||||
foreach ( $IFM_OTHER_PHPFILES as $file) {
|
||||
$content_file = file($file);
|
||||
unset($content_file[0]);
|
||||
file_put_contents($filename, $content_file, FILE_APPEND);
|
||||
}
|
||||
|
||||
// main
|
||||
$content_main = file($IFM_MAIN);
|
||||
unset($content_main[0]);
|
||||
$content_main = implode($content_main);
|
||||
$content_main = str_replace("@@@COMPILE:style.css@@@", file_get_contents($IFM_STYLE), $content_main);
|
||||
$content_main = str_replace("@@@COMPILE:ifm.js@@@", file_get_contents($IFM_JS), $content_main);
|
||||
file_put_contents($filename, $content_main, FILE_APPEND);
|
54
src/config.php
Normal file
54
src/config.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/* =======================================================================
|
||||
* Improved File Manager
|
||||
* ---------------------
|
||||
* License: This project is provided under the terms of the MIT LICENSE
|
||||
* http://github.com/misterunknown/ifm/blob/master/LICENSE
|
||||
* =======================================================================
|
||||
*
|
||||
* config
|
||||
*/
|
||||
|
||||
class IFMConfig {
|
||||
|
||||
// 0 = no/not allowed;; 1 = yes/allowed;; default: no/forbidden;
|
||||
|
||||
// action controls
|
||||
const upload = 1; // allow uploads
|
||||
const remoteupload = 1; // allow remote uploads using cURL
|
||||
const delete = 1; // allow deletions
|
||||
const rename = 1; // allow renamings
|
||||
const edit = 1; // allow editing
|
||||
const chmod = 1; // allow to change rights
|
||||
const extract = 1; // allow extracting zip archives
|
||||
const download = 1; // allow to download files and skripts (even php scripts!)
|
||||
const selfdownload = 1; // allow to download this skript itself
|
||||
const createdir = 1; // allow to create directorys
|
||||
const createfile = 1; // allow to create files
|
||||
const zipnload = 1; // allow to zip and download directorys
|
||||
|
||||
// view controls
|
||||
const multiselect = 1; // implement multiselect of files and directories
|
||||
const showlastmodified = 0; // show the last modified date?
|
||||
const showfilesize = 1; // show filesize?
|
||||
const showowner = 1; // show file owner?
|
||||
const showgroup = 1; // show file group?
|
||||
const showpath = 0; // show real path of directory (not only root)?
|
||||
const showrights = 2; // show permissions 0 -> not; 1 -> octal, 2 -> human readable
|
||||
const showhtdocs = 1; // show .htaccess and .htpasswd
|
||||
const showhiddenfiles = 1; // show files beginning with a dot (e.g. ".bashrc")
|
||||
|
||||
// general config
|
||||
const auth = 0;
|
||||
const auth_source = 'inline;admin:$2y$10$0Bnm5L4wKFHRxJgNq.oZv.v7yXhkJZQvinJYR2p6X1zPvzyDRUVRC';
|
||||
const defaulttimezone = "Europe/Berlin"; // set default timezone
|
||||
|
||||
// development tools
|
||||
const ajaxrequest = 1; // formular to perform an ajax request
|
||||
|
||||
static function getConstants() {
|
||||
$oClass = new ReflectionClass(__CLASS__);
|
||||
return $oClass->getConstants();
|
||||
}
|
||||
}
|
764
src/ifm.js
Normal file
764
src/ifm.js
Normal file
@@ -0,0 +1,764 @@
|
||||
// declare ifm object
|
||||
if(!ifm) {
|
||||
var ifm = {
|
||||
IFM_SCFN: "<?=basename($_SERVER['SCRIPT_NAME'])?>", // IFM_SCFM = ifm script file name; used for querying via AJAX
|
||||
config: jQuery.parseJSON('<?php echo json_encode(IFMConfig::getConstants()); ?>'), // serialize the PHP config array, so we can use it in JS too
|
||||
editor: null, // global ace editor
|
||||
fileChanged: false, // was our file edited?
|
||||
icons: { // base64 encoded icons we use dynamically
|
||||
"edit.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABSUlEQVRYhe2WwXHCMBREnzMUQAekAyjBR7aKQAfpIHQQOsAlcNsrJbiEpINQATlEyng82MbC2Bf+xZIsa9/89ZeUrdfrCyOF7aw+9jKWeFPMYuMa3VAhqTHLk2fgCfAEGBVAUinpfTIAYAl8StpMBRDjECFm1962bRy3hu1M0go4hXZ9zYMksngWDL0TSpoDJbCoAO2Aj8q080MsCOKnKB7GLrZ3wDaKA/nDLGhaN2QC4Mt2ObgFkgrgrWXK2fY8dga1QNK+QxxgU+2MagGwtX3sBOhrR6jpQ9c820V97G4LQq3vU78fw4ItLdlJtqBS68s2cduFpEaAZAts/wCvXeJd6yQBSMolldV6ThFPBgByYBkg6nbdLH4PwCo86xC9xKHhJ+wBcA2iV6QCLIBv4MhfJZwS10kDGPLuMPmt+D8DDzyAWmPyDPwC+nuENdH916UAAAAASUVORK5CYII=",
|
||||
"delete.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOS8wORSGd5kAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABvElEQVRIic2XwXWCQBCGP23AEmIHwQrCkTlJOrAUStEKoqe5YgWJHcQSqMAcGCLowO4m5r3873Fhh/mY3ZlhmF0uF0ISkRLI7Xp2TE5ADdSqug/5m01BRWQDVMBT8M2uOgOVqm6ToCKyBLbASwLsVkdgo6qfQaiIZLRbtfgFsFMD5Kr6MQo14PsDYLda9cHzHnBJG+FfqDb/QyjtGXpbeqDdphg1Zn+rhfm/Qi1LvaTZqWpXLiFwd34lsHPWX4zzHWnlGB1UdQNg5zEFHiSMPedFXAHMiqIogbeQIxjN7Fi7Tq9zi8DTgjYBsu6GE3EqECCfgobA5x8AAfJZURTh5jtS5H2lNJV5yMB0F/FPgSnQDjz2BdnHAlOhDVCOrJXEN5Bo6OSZRtTxHfSUChSRTEQ+A+U0ptOc6SY/VYdPhOvYUz0FjSn8mAZyD7WZ5uwtRhb+GNgL5qyq+6mGvxaRbQDogu25tWNXQW9yEJEa//N2oN2umDps7OU84FFVcxiWzAb/HNaRQMzOAzbmnwHUprY80nmq8v5UOGgOlgArErpLQA03Q9kdtAfOaOfW3+gIZF4X+z8TvgN/6L/MF/xGCeyc7nXSAAAAAElFTkSuQmCC",
|
||||
"rename.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90LCg4yKKhCpaUAAAA0SURBVEjHY2AYBaOAAPhPSAETrV0w9C1gJCU8yTSXIgv+ExIbjeQRlopGi4qBsWAUDDwAAFa3BxIYZJ1rAAAAAElFTkSuQmCC",
|
||||
"folder.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QsNDSQmzPO7lQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAA4UlEQVRIx+3UTUpDMRQF4O/Vh4NacCK4AzcgjjvTeXfhplxM9yA4bAeCE6kKBRE1TmIJIa/VtB0o70xCbn5Ocu69h/+CZsP8G+FP/aTFGK8xHpL4M+7i2q8xyEgucI8FnuL4gnNc4rCGpM10f8CssG+GCa7xiIMNuQuYY5qTrEv8Ajc4jmdCYW8aG+Kqi2QdQpTwJxhiWZKrtuxLcg3SfNeQhG2qa2/oSXoS8Lmje9/TUm+zJjvFCUaVl4ek449KJB/RCM8qmzR3hduSRTTxBbtAiJK9dflQ0+Gye7WeHit8AWWYKkhEW9GBAAAAAElFTkSuQmCC",
|
||||
"extract.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAADdElEQVRYhb2XT2hcVRTGf/dlOpmAk+aPulKqtWbRSCeQzN7lHEVNUFARSQQVihVdZNHu7CpU3GhQii0YsQsFbVO7OKIbV2KdiSQipYZSFRHSIclMmC4SM8xxkTfjdPJm5r1J6rd795x3vu+dc8+95zkzo1OIyByAqk51GsPbI/kkMFkV8r8JEJG3ffIqJv21yHBRSyAiU8AnTcyvqOrcXRMgIuPApTZuE6o6v+8CRGQE+B442MZ1A3hcVRf3TYCIPAQshiCvFzGiqn/si4AGMSeBmSbm11X1XJR4UUpwD/ADcBToauJWAb4DplR1JUzcUG0oIh+wk9Yk8HIL12lgGPhNRM6ISE+72C0zICIvAR8BZeANVf3cXw98SVWdb58GTgO3gdeAK6oa+E5gBkTkMRH5FTgLXAQOVcnDQFXfA/qBq8BXwFUReSDI944MiEgMuAA8CywBz6jq3wECW2agwfcoMA88CHwGnFDVf6p2r87xOFAAngCeVNWxIPKoUNVrqjoETAHPA7dEpLaP6kswC/wOHFbVb/dKHCDkC+B+4C9gLkhAl5kNm9lN/8hthfejkIuIJyJPmdmKmQ3X896xCZ1zHpA0sy8zmcyifwIG4R3g05DkvcB14LKZ9fkcNezqAucczrkuMztmZjdE5Lx/CNWgqkV/CJkALjch7hGRc0ChUqkcAZzn7W66Whc029m243DbOTetqh+3/2YQkRfN7EMzO+gFsfJfx8TaBXPOOXbKcjaTyZx0zj2nqj83IX7EzBQ4YmaBX9yI0BORL+RhM/tJRC76ta0nvwDcMLNHnXOhyCFEBhpEwE63jAMrInIa2DKzM8AB5xxhiTsSUCfEAT1mNgNY486+6wIahOw6fqOgpjyfz6dKpVKoO3wvKJVKK/l8PlV93nUdp1KpVwcHB2e7u7sT+0m8tbW1uba29ubS0tL5+vWm80A6nb7U19f3dCwW67i+AOVyuVIsFr/OZrMTQfaWA8nQ0NChgYGB+f7+/pFOyAuFwuL6+vr48vLyn818Qs2E6XT6hXg8Ptvb23tvGOKNjY3i9vb28Ww223aIiTQVj42NzSSTyelEIhHYPeVyuVIoFN7N5XKnwsaMVN9cLncqkUjcl8/nv2m0ra6u/hiLxQajkEMH/wVVjI6OHovH41c2Nzdvep731sLCwi+dxPkX2tx+GgyXg18AAAAASUVORK5CYII=",
|
||||
"download.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABKUlEQVRYhe2WYW6DMAyFn1t2t/jE73JtvR80kxcItRsY0zRLkQIh8Yf9bBAzw5l2OdX7P8BvAJgAQFVPUSJJmZp7PwUideIBbgA+/OKBzm/VTxsBkOxGQVXDXkiGzgiLUFUFc4oegXGPwi4iELBdU3R6GR4FEI7SOymoZphfYCglIwBV6UO9YwGwod6Fo0xZViNpfp8HmDCXUNQk+TyAL+jVTvhtIQExZBUgUg0C4O6udxGhRH/Jnp3Qh9xIDpdxF6AjMGvmCwCSUNXut6C1rTKsb9wL0ZoITVWvUeevALyj6FpaD1s5NADX5Hn7ANQcknwkIOS5J9WgVgH8IUEIafaMASQhJKv8EEAQYsg5AMDMXo5Sip9fSilWSpF27Z0R7oRH2Z/9JQvbJ445zsQeb09hAAAAAElFTkSuQmCC",
|
||||
"zipnload.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAADY0lEQVRYhe2XTWhcVRTHf/flzfBiVJgEzMKCoi5cNdFkNm6MujDHEhA3CmIEsQtBiG6EgtpiW+pOQSulBbGgUFzYFBdHUSlupJKkzgjiSlFBJiSPwUkaMumLc1zMm/CYeZP5CnTjfzUz99zz/82999wPZ2bcSvn9dBKRBvUVYFFVP+kXwPUzAgmAhr4HnlbVf3rN5fXsnq5Hgff76XhQAAAv3mqAvvQ/QNdVICLDwFngBdqXbwS8q6pvHyiAiMwDHwBGfbUfbxP6ETAP3AReVtXLAwGISB74FLgH+Ax4BXgEuNqmy2PAD8B56iN1HZhT1dWeAERkHPgYmAF+BV4Hnoib76V9yV0E/og/XwXOAfcDl1X12Y4AIuIBrwFngBCYV9Xv4rYCMNHunzSpqKqTcb8ngc+BIeDV5m17rwpE5ClgFTgNvKOqdzfMY80AxW7M41gAVPVrYJT6GjonIn+KyEMtANQPlr+BQ6p6ujlrvM93gigCM81ngqr+q6rHgLuAKrDSAhBFUc3MDpvZjyLyYFr2BEQlpbmSZt6QiOTN7Ccze8DMai0AmUwm65zzqC+aX0Tkiojc1iVEJ/NvgWtmdp9zznPODbUANOScA/DMbM7MyiJyQkSyTRCFBETDvJBifHJ2djYys8cBz/NaN969Kkg54wGIh6vsnHse+EZV9+JEZDIBlDSeM7MLZjbmeV7qrqmqriuAGALnnJnZdefcjKreSIsTkUPAF2b2MDAUj2aqGgBdHUZxIgdMmVlFRN4TkaDJ/DzwV61Wm3bO7WueVE93wsT6WDCzl0TkKJAxs7NmdofneS5tng8MIAHinHN3mtkloAYM9Wo8EEAShPoW27f2sEul0pGNjY1wkGTdaHNzc7VUKh1pfG85DScmJt4cHR19KwiCbEvvAVStVm+Wy+WTxWLxVPL3lokrFoungiAYD8NwMYqigZ9NURRZGIaLQRCMN5tDhwvJ1NTU4UwmczGXy032Y16pVH7b2dl5ZmVl5ed2MV1dyfL5/HPDw8MXRkZGbu/GeGtr68b29vbRpaWlS51ie3qaTU9Pn8nlcm/4vp9ac7u7u7X19fUPC4XCQrc5eyre5eXlY77vj62trX3V3BaG4TXf98d6MYc+H6dQXx/ZbPbLarX6u+d5C/vN8376DwVwjx4C5CXzAAAAAElFTkSuQmCC",
|
||||
"rar.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABCtJREFUeNrEVu1vU1Ucfrq+rC8r9oV2LYyuZTDLy7Yik/gyMmamMkI2EiXgFzMSQ/zqB43xm1/8G0xEJcTE+I0PJmbzw5ZJYmIKUQrDrYzbQTug23oHt7ftbtdezz233DVmvbdtGj3Jk57z63N+57nPedWJoojqMv2tfsblHz6FBkueW0Y+m7j67kflS2q8f49HA9WYutI2I2qUJw9mxWtf6CmmvnmLxu7f+lK88aNHJP2/1xJQjbYaNFXodICpXUdhMOqUeE/vBLzelye1RFSXNjRR2q0vYW/vMIVn38B2MksI4aOXGhJRQ0BZFSWBxfP0HEWO/UuOS3a2+6DvONKQiJ0FiGVVmMy74A+dpHD5++S4NDVGJ3GhuyJisi4RzTlQZMmX/0ZR4G5X4kSA3gqdyVMRcVQW4VEXYdjZgJKqbeaOLoRe+ZzWTdaAzBelxWmEzmCv+jIR4b5JIHaViFjATlvUsPMQ6gKKBQbrzFe0bnMPwd19gbqQiv+AzOM5Mu4WEVWAWOIhErfMVi8MeoaIEDYI8RNtAaK6AJNlL/zhT2ndaAlQfuDQZXCZWM0+3jAQnZqI1OcA+QJVB/IMWQdP0eGdwLPkFezqPE/OAxucna81vKVrrIGiaiedzobOw9/Jc23wafKb2IZFVZg7eskOiMpu5FY0+Qpa5YBUFuc+gN07TI5jO2yO/qYdqLEGBNVOW0UOHLtMcA2e4IQmv4k1oJ6QW7sDYVOu82xSk9+EA5uqnaQpEipj5vnnmvzGHSipf9FqMorgkQ8J3seN65c1+Y07QE4x1evY7MbaSgyrj6JkKkRNfssFBA4OIUvmnrn7C068/VnrBYgl7YSHjp9riN9SB1pZajjA/98CcvR35uevkV5Z2r7R9vRg5OzHtM4sRvHH7E/o7TuJY6+P09jdm9O4c/NXhW+zuyjfZnc2dhdIAqgIcs0GD0YwcmYSb45epGLSyXn6X4q5DYfbR35jCl8kt6gUk/gSpKcas/D7dr76BfAySAKey8gDV5ywWE30v/RjBpFXR8BnN8CuMvK0kROxuJlX+IJQgNVqVvLVvwhLWeVdkOM5JO6zJJmAU++Mw2bRI5WIoUiSo5yHw7UbifgtRAaH6J0gCHmkluexwa6T2BsIhkLb+ep3gKOQpqCbJBg9PQaT0UASx2l85eEi5c1OX8dGZo20H8h9yptwOJwYHTuDPV1dSCz9reSi+eoX8IyC3Hv0nDfoC+g/dhjxhXtg1x8hlXyIwRMRvHdhHGNnR8HzWRqX74Qt2ncgEibTwyF+78+qfHXvAlY+8QJO2GxG2vb7zOgfCGL1SQIHDnSStoXGLWbQeLGwht1uI2k7lfjxwR7kcpySrwEBaVnAPr305lHaPfvbX9wGBBnl7SrH5UeM26VX+H6fzH3RrlvA/NLSf3YQ/SPAAKb1rEjyCBGCAAAAAElFTkSuQmCC",
|
||||
"sql.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABHVJREFUeNq8V0tPG1cU/mw8Mx6/BhwS8wgQEaBQiIBYEXlIbUOVtF1VWWTBos9tpaoPqd31J2TRbFp10aqVEmVR0S7aKqEBNY8SFNImLUlT2kAIJAQDtjG2Bxt7pudem5QGO1zbqEc6YriPc797znfOPbaYpon18v7Jr4Z21/qeQ4ESWo4hGIl+ceLtV9940rrHz+MD6/W9j78cMouQsyM3zI8+O2PS/s83A7BerdhC6WpqQLW3/PXNQKyXLQVQ4XHhQEczgdCEQdgKPWQ2tIzphTAWI1FMB4KIxXW4VAWLoTCO+NuhuRwEogXDY+MMBDbjhLAH9GQKy3oSd+fDiMQTSKYMOFU7nA6VxhOI0pxdkVHhdsK3rZyDEPGEMIDpxQgmAyHYJRtcDgUy/bXLEqkM1a5AspVxddB3OQPh1YTCYRVh6lrqxBNJhGM6pVwcOn3ryVUkV1eRSqVhMEZbLByYk4EgPvi85ZuCsG0lCUdvT+DO/TkOJp02CFyKgCbgpjDNLy0zEGFa9u6mAMwcYx5VRpCKTT5RVRU37z1EkrzS09aIPbvr/jPfS/pJ/0CXkAc2VCsSyQI0VnowHggjQTfj6wy6qWFgNZ3mIQlH4zjqb0NzbRUaa3ZsbR1YiCUwE45BKbOSNxRYrZmtKXJ1gm5N+KA5VVy5NYHTQyPCYRP2AE9Funl8haVcAjGm9L1CN2exjlOsY/EVmtOxq2pbXhtiAEployluQzgN3XYJZRaLkNHWhpq8qVw0ANlq4SRUJAmyzUYcsPC8RxaUQYRMplZx7FA3uigDSgJAxN6g81kSqlIZKlwqr3iqXebVkBUfF5VlX4WGq3/exenBkZw2CuCAIAn13CRs2OHNa0MMgGGWxEwznw1RAIa50V9OxYaluBgJn6qrzmlDHEAO9BqVYpdSgWBUR3QlidlgBA7ZBp2yYyVhh+aogpdewacbqqHSs2yU4oG0kR+9lwjItL5Sy7vmSfsFPfCvgW+HLuP25DQqyzUcOehHfVWmxg8MX8Mvf/zFs+FQdwf2tjXz8Uu/jmH6YQB9L/UWX4jS/JExcfbnUZwjbW7YianZOZz67jwf7x+8hG9Id/q2Uxek4OSpftyauMfn5qk1m3ow98jGei04BCyOrNtp2VWH/Z3tGL4+xucu0y2Pv3AYB7vaH6XtwPAomuprYWTLsGgYcgJI0fPK5Nl9nTyvz/wwiJm5efT2dPO5xXCEd8Br67weN8ZDS/x/kw5mVW9trjgSpjPofxq9zhn9wZt9vLP58MSn2NfRyr2yQAcyrtwPLGB8aoaDYPtYN4RsR1SCBzKbo1TZLly7wQ8LLi1nGhObhGf8nfj6xwvY09yI38cnOLi3+o7xfSxsi7T2+4tXsr8V3AS6rbgQPL/fz295Z+YBeULBay+/CI/LycdlegNu/j2Jxroavrb//EW888pxaG4Xb0iZV5jUbK9Ed1tLcQCYHO7Zy/XxuQNESqZrwt4ENtfV2sQ1n72COFCISPREF7MvJ4BzV3/D/yX/CDAAE5LxKkkMp6oAAAAASUVORK5CYII=",
|
||||
"aac.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABMhJREFUeNq8V11Mm1UYftp+/aU/tKy/o2MbLaz8jAkscVkUNMYLTUycemVMZrLojV5464WJ8UqjMc4lJsaoNy7b4p2Ziz/LyIT5E3RAu4nrCkQKg1LY+t9+La3vOYRCoaU/Gk9yaL/3e885T5/3fZ/3ICkUCtg+egfPXevptg2jzhFaiSMUin/p+/31l/fy23meUM7pnbefrPd8XLw0ias/+E73DHyMaiC2D2kFnHVP9vf4YCs87RoG4otaAZRloJBH/YMQuD0OuF0tEK75TwO1MVEWwHq+fgQstlZ7Myz71JArZEiL0zWBqMBAoSEAmiYFHAdMkAlSAiHg0te3qoIoCyDfIAMSqYSDsLcaIQgyvCgXcOGid08Q5UOw3gAAYk3CsloigVotp3AYOBMvUTi+Oj9ZEUR5BtbrD0GeGLjy7TRu3lwsMpLLriMRz8Bi0WFmLsqq4wG9eqMqgFwNDIRXYojHMjh4eB9mA2Fo5FLIyG7UyiGXy7YcrVqgvQUnHj6Id9+/fuw/CcGfvgX8MhpA30AbnG0mypkCWlo0CC3HEZy9j75+B6w2XeM6wKirNEZ+vA3fVBAqlZLHnfkyJgL+MPY7myGhHJiauIcTJxXkIzQIIFfKwPivAcSiKcwFVhCJpKGiJNvUC+ZrNGn44YmECJlUCq1Wgbv+VRzxmBsFUMrA+M93sbjwgEpMSYcrt5VrgfvGYmksL0Vhs+spDAk4DzRjbS21a5+aAWR3hKBQoSjylCvMl8U7lcoiGsmgiX69hDpMJp3btU/DOVCogCCf3yq1lVAcOp2Kg2BlLJNJ9sylKgzkSp7NFj0EKq04HbSbgRzC4QQvPXYgw8pyoYkUcec+DTMw9EQX/2SxHh25Q3SLW0lIvpT4SCaYTQKLtYkApeF06v4FA2J55CqlgEcf78Bt7yJRnthggHxlFHOdnmJP14vQchKGZiXUKmnFfaoCEKss7Opx8KwXxTz3jVDc11bTvBFZrWqiX6i6R0MMbB8mqv1NX71ODmOzoq71VQCs19+M6l9SWxWYLVoolXIE5++X+Oj1KugNasqFGDKZnVVTfk1DOfDcCwO0mYBPP7lOsU4V7Y8MueFyW3Dlshc+70YLVpL2P3vqIVJCE39mwC6c/40SM1bfrVjMZvm0O/RchO78tYRD1FI37Wyyw6cm59HuMhdtni4bVYMK585exQfvfYelexGy2YvvawdAyNl0uSyYmw0jQE2ot7e1aG8/bEY6ncXYqB8dnTbISAiY3e22YuKPv3lYotS8Pv/sJ1z+ZrK4rnYAYpbPTo+d02+16qnRGLi6MXtHp5VrPzucDVeHhduZNLO7xOZ6Jseb39msGQArI7NZB6NRw8XGQLQy9es8YuPvPN37SfnoNtTWQl0vQW3Xzu3eqXn00yVFp1VCIHU688oQnnr6KH9XqTQrJmH/YBsWgmv46MPvue3U84MYPH6I6I3yS+dZsjNQR/ucOPPqML+A3qCQdHU78OZbz/A17P2NMf+eoiQp98/pyWNNw61OE5JJkRQuzu1qjQLMthqOQ0Pfg/NrxTVuCgV7TiU3egTzY/5+St7tY2wiMeIdf+2x6gyQDszMhEptESa5ybK/4pYvWPK8c23dOjA9K+L/Gv8IMAA+baRs/m86owAAAABJRU5ErkJggg==",
|
||||
"doc.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABKdJREFUeNrMV1tMHFUY/nZmdmZ3dne4L7CwcmmxFGgsiYkGihGjD30wUYvyYIJgUhN9IeqzNe0zMT6pD6a3xBfSxltq1TRFbamtGlMDhaJGrq3gUmAX9jazu+M/Z2G7hdmySzbWk/x7zvkv53zz32bWous60of41CtDQmHZk8hxJCIhouBJbeh03/30Nt8nmCk5WnO+H9GpMdj+mepd6ezBdiDSB4c8jmda96O+vLzX2tlz4oEAqKlyo+uJdtTlACKvANxlRWjc5cWLOYDIKwDF5UC1x50TiLwCkGwiiouUJIh6L7o6tgchZCgW9htevEXLBNWYvj4bFIe9uoHJ4+Eg1Lk/wEkyKy+B52G3SyiGkjqpC+04c2m4dzJDdQjmtZqcLZyAsG8WuqZCj8fACQJkd21KrvpuITR5Axbayw+34tOLw7g2OkEY41C1GEKhCPyBNZQqCuYW7/Sis2eFzN7M2gNSkRu8ZMfqzDgsRrysNoillSm5anjIKjKAFpq/WeKBpWXE1wJY+/5zODueBa8UUmORIe6rhHb9h/3ZhSCtWQl2F7nYjkQ0jLgaQUKNEhCJZtpHQ6RgXQdzG07PLraOLfvAyQ6I3oadlqF+D1mdRaRJT0cx1laXGE/1L8Ja6gFnkxkIdXkBekxlMm1hBmLd3i3nZA/ACHIaSa51AETRwB3Gi4UCsBaVw1pcAYvhBQMEecGQaaQj1e7dck72VWBkfNrgyeWcKDH3xzWiSBBaMACHZzcECo+6NM9yRFtZAEcgLXYHeAP0pnOyBmAxQSvKLkSYi3kEqTJEpYQu4ygEDnahTiWp+ZPeEStqTM/IIQSJLSTKCnQLqXMW8oJKeVFwV1ZQCp0XWBi0wBIkt9f0jOwBGI1nEwm8SH3AmgIhUPPZkElKKTlGYCA42QnB5jQ9I4cciJuyRcmBSNxPOWEDT+7f0BMoPwS7E7HwGqTi8oz22QNImLtLpjBIoo2KQdii4yp/CAkKDS/aM9pnDYBLZH4Cfr3xYJOOkf2gijCT5RVAvod5GT5oAKA33/8CwJn+59HWUMXWgXAUA1/9jI+HrkORJRw71IGXHmtkssFrN3Hk7CUEQlE0V5fh6KEDzM6wOXL2MgavjufWiIx3v0FGVxs4dxWVr7+Pvo++pEsPoMlThKMvtKO5qgR73v6QkbE2eIbN8cMH8ePELLPpP/Uts3FJfPK83EOgUz4k2P7K+BSu/D6Lg/vq0P14E/o++AyB1SDTGvhiGCfeeA6DwyPwlii0v8z4X/86gT1EOwiBdvetaCTk5r0RkrVgis/W6cA39Hf8LohpSaL+rRseoLUi8mjxujE6dZt54/DTj6b0jLXBG52cozyIoG23h/GbPcW48O6rZMsldbP1QPLDIvnE3R2PoK2xBt6yQgyP/YXzP41gZt6Hk2+9jAvHXkt+jlNS9r73CX3/reKd0+dwvL8bN6bn0VJTgfO/jDF+pmEx+3NaUFbB/hy21FSiwJHsbv5gGKPTf9+j295Uz2YDWPookG1oqfVg1reMGaKN4ffNf6dePNW5vQe0pAdG/py+b/wu/3bTlL/iV0kW2HkfCK4G/rNG9K8AAwD5lUIY8UX0jwAAAABJRU5ErkJggg==",
|
||||
"xlsx.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABGNJREFUeNrEV12IG1UU/mYymWQmGTebTdyku7audtdsy6ppVywo6IIFKViL+1IfLC0tgiJUpAhisfjzpj7UB6X7oviHCIpVkILKttAilK2KEprgz3a73d12f5rN5j8zmfHem2Y2WSfJBHbxwOHOufe793733HPOzHCGYaBWRt8cHFc6xUfRphTzZZQK5Y++fi1+qBlu7X6CFWgg6m93f8xNZqCm3AefeiOCViRqhcc6yvYtQxjYspWS+PB/IRDy9WB4YFdbJIT1JODzdMGndFRNQgItr2NdCUguGcHbQrVdLUkI1pHa/uZ0itMhwuNW1g41JWHLA4WchrJmVIgZlda41ToEDm5ZQD6jged4iIILcMM2CVsElheLSM4XoJZ06GWDqA6NEBKcHHwBN4I9MpILeZyPnUV8OkaIkXFdQ1EtIltIk0h3QpYklqJEDrVNILTZwzaZjC0jR05Kk0eAjv77/FB8IsNEdgbw/U9nICsCtg0HVye7KtrrlzD9p3bQHgGLGHDwHPq2+fD3H0kUSNWjJKbiKQySjcllIPHbEjwdTkQfDhHPWGe3QK7LZhBaRyFP1u25y4vJyyvM1lQD8zNZ5LMaHA4eQ7uCLCYazTfWoxDJihOBsETIcOAdHG5M55BOlrB1yEdO2H5d4xtSbaLdvTIkr2CSoFkge5wt51m5wJKAbrRW0eVgm1MSxUIZM+Rl1GqObQ8YBN1M56ezKJLa0Bl0mSRukjTNpErN59omYDTWzHKJFZ3wnV4SCzLc0qon6CtZ04yGc63uoC0P0BMuXc+j83Y3nCLP+rpoQJLsoiTo5nNXMg3nW7nAMg11vd5WS2UUSKqlb5YqgUdSzcSQRV2SQL6ISIEiJLIrKq79kyEV0gXZ62yZhkIjD9RKLqWyMiy6HcxeWSoS9ztYX4o809NLJAt049ZpSbmmnuLCHLuiZgwaeKAe6e0ULTG06HSFpKZ5XreWXQLlsoGNENtXoG8UAYsSbesKNtIFlmlIPz6ovjv6M1OR95rPO+/Yw9oqhuruyOH/YCkupPTXYW0XIprPVF/47EFmP/3AcdZS2yeF6zB9XVE8vv0ITv7wHMbjX6DPH8WJb/axvn33v4ixcy+bWMO2B0gMVPX4V0/i3t5H8PGF15ldTdHq+NRCgtlHd3+Akch+LKzMYp5o4vol+OUwfp06a2KtGFgTUHVT3xo9jcTcJRx46ASzqwFaHd/U0Y/3fzyGo5+M4NtfxvDqE59C5DwY6N6BXDGNuwNRE2voNj2gEjDVMFmcyntnXmLtyOB+M0DHDk8wvZGcwfOPvcN0745ncXriFE4+M47z8e/w+YW3cWzPKTh5D1vPKgs4q59Tj8/Ffk77woNIZ1NYJC6VXQq6/b3MDiibTHx8ZoKNbQ7cw058dTGBSM8w66dC+xfTs2yskFHx5SsxrmUaltSKrxJXYzV9KSxnUux5dunaGjwdu2jav19Zff5r7nLNd4bNOqDRF8tGlAGL+vKvAAMAJXfR/4Li3LAAAAAASUVORK5CYII=",
|
||||
"qt.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABC5JREFUeNq8V0tvG1UU/jx+ZBzH09px7EmbhqRxHLcJVZRCq1YipVICgQohVUIsumlXrFnBggVIrZT+gKpICBUhdQMLFhEIVEQpK6xSUoEMSZykuEmbxPGr9jjjjO0xd25jx49x7IkNVzrynTvn8Z3vnnvuWJfP51E6rruv3XUN869C4xBCAlKbwhcfLn10ZS+9yngGNaWJj6e0xsefXz/EY1/w8jSuoh6I0sGgVYMk1v/KUfSc6r08PXD1VnMAFJo0ikKs7QUbvG8eIyCONAzCUCv+fobFboH1EEfZEKNiQ9vRMgYUMZmN4JxWOL1OjF46iU63oy4TTAvjg9HrwFpMFISrQRCqAGQ5r1mU46XT6cAYmAoQY3uCUK+BXH5fp8A/48fKgxU6l3MyslIO6WQalq4OxIMxBUScaL5fF4Asy5rjuyeHEH8cq1rvIOLwkiN6zo170z+O/mcMGNoMcAx2abdTZSC3y0A6JtJf1mau62xjfp1WYzKcRDKUgLxTnZ5zXli7uP0BePCpD/zYIfRPuOlzRswg8eQZUhHS+yMphBbWsZ1KIxKMwMAakCZzZQsVoc9JEa6hbtIjOjQAyO4CYA+wWLoTwKNfliCltsG06YkwSIUFMKyeBtKTNc95Lw4cPghLpwVGswnSlkQrc5vY5ElCpT7rAshlc8V5GwFwsM+GrWgKFqeFAlAC9p7tB9fNkSPWhbnv/fBODZf5+GNmFi4PT2tDYbTUZ30GMrvKJs6EgQseLP6wAPfrHlXdvNILMrnqXkKyLly/le/3ZqBE2dzZjvXZpxDWkmXrlTWjvAsvbyL+JAZJlBAKrNFCzOdlnHhjtKZtXQA6PYPAt/PoPO5QdRKa2yDNJ4jg/UcQogKp/OcFyB/rpsUZXY3g1LtnNAKQdpUNZgPZRz2yYhax5SjdfyGUpE1HOXZKtoyJgcPthHfyOOx9DhhZY01/mgHoyVFStjGx+owGldISoTwHnZH0fCuLo+NudI8cbjhggwCyZc+Db3kRCYSxFU6BtZtpxrY+O1iOVdVvuhNWZqDQ7hxx1dVrGYDsdu2M7KQnZNJZJNeTzx2QLeJ4a5mOGE8TEZsAoEIpx3M4feU0DagMBYDvlg/t9nacvPRSme7i3UUEfg40ASBdDWBgfADhpTAefjVLWq0RZ947i96Xj2D+zgJmPpjB0KQHnokhOtcyGHUAmSrhh3kEfgpQahNrCeU/AA1YeF/o9Wq2BWmKgUK1K59dtDCN+jLdXEbe01bbFojVaDf+3oD7/CCWya344sUT6HBY8Pvt34q68s5lo2arHcBWdRb3P/fhtU+m0DPWU1wbI8Xn/8a/c9nINW33AaA6i82/Qrj9zpfgR3jyXSDRtbdvXCzqLnw3h3/uLavaagcg1Hay+utKcf7Z+M3iPC7EWteIEpsJ/F/jXwEGAJKrp7XHKu9HAAAAAElFTkSuQmCC",
|
||||
"bmp.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABCxJREFUeNrEVs1PG1cQ/y1eYwcw4CQ0gYACh6i4SmksFVRQFExyKIVD+w+0Ndc2oY3yB9CovbSnNj20SlrhHlu1KvSEWhWjKEpcVVENB0w4gAnNB1EIXza21+vdzntre9eJsXdjlI40em/fzpv5vXkz80ZQVRVGEj4aDdoPHfLBImUSCSi7uwFc+XqklNzT9sRiQq6+Pqv2kVhchLy87E+PXkA5EEaqwj7S6+0dcLnq/Ri9MP6/AHj1pSYMejyWQOwrgFZ3A95oO4Y3CUSdSRCi5WB7+BCJYBAqBV3N0BBsR4/m/7lratDmdue/pyIRf6xMTBQFoBijNpmENDfHR/H4ccR/+pHPq7teg0DGFUN0O+12NLnqCnSVAyGWShVlawuxQIAb5HTzpjbaqyFFIpDv34fj9GlUnzypKbPZUOtwaDoKQMzvCaIkADY6zp2D9FcIyvb2s55K7CLxx++A08llJ2fn8Hd0BRlFgSTL2EmlsB6L4zBdTSweZzGxSdsulr+CXLGor0dmY4MMJfmpGdlaWqBKEhxnz0IlA5zo1GJDA6Z2doCUpCuqJm8cZHwQzo4OJEOhU5Y8wCg9P0/G7agiJcqTJ7D39CDz4AGkUAjO4eGCfTZDAFZUB5gHcsyM23t7Ye/v53MWeKLXCyWTQSocLpAtx6aDkN1h/lQ+H4TWVh5UIp0498/W3Q2Z0lFoa4PQ2PjctaOqOAA1z2g5lp+rDY36/HATeaMZ8u3bBfKl2DwAVTHFqqcTajyOzOIdU/LmK6GimPNfnQs4cABYXQU2t+gZpSLkojUnrbnNXUtxABRgJYml36NHwL171EAI2lpsR2PKEE5UG0BvAmpr9wnAJtUQqv9gBYnlO+9eBJ4Ze+qgaomuLopYm1UA2StQSMnjxxobQYkW3rA18tSRI1YByNq4vq4xO6koPl+eCQZ9lq+AGa2tq6xJYDpKxFRpACzCGVdKlgHIMl4UlQSgfvChngRSCiPT05hYWsIn3T0Yo1I8Mv0nAgsLGKcn2/9yJwYmJ7hs8O13CtS5v/8Om7mX01RPyABkQQz88jOEK18hQK/ir4NvaeuK5tL+5mb+7WtueWYf2+P+9htEKW39J07s6dXiANKyxkTvd3r4iT8+5cXI1JS2nq2Ufs8raKdmo536hvxd5+6byckZPa3TVgDIaY1zZZmUhtfWMD44yNfHevtw+cYN/ttHDUpubgSgXrqEjfPnEaUCFpid1fWZioG0LvxD+B/MrKxgZnkJwXff0/8RsMvXr2N8aBjea9cwRr2h0c3CZ59WEIQGANxolr68dUv/RyedWIhg7MwZhP9dxUw0qrv8KR3WAUhaXzdw9aqeBckEwtmHpuOLz/kYpX7RS8HG5C/+Nknu3tD3SVLlHpihd74YRdlLmKXw3bsFI9+3fWd/6sCLoP8EGAAao3IQDslXAwAAAABJRU5ErkJggg==",
|
||||
"c.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfJJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/6vm73yP1D/fEIOQMZMDFQE+spyDJJC/AmEHIEMqOoAIX5eBgsdVZIcQVUH8HJxMkgICZDkCKo6gIOdjUGAj4dBHOQIbeIcQTUHgBIUKwszAzcHO4MgyBHCEEdIEHAEEzEplRgMNoyRkYGVlQXFEZYEHMFCzSg4c+Mew92nLxn+AR309+8/hl+//zB8+/kTnDbefPwMcsQHoLJCgg74T4blJprKoIIIr5oZ63cbEBUCGKUVEUCAhwuMSQVUzQXkAKqFAHUdMBoCA+2Af/8GOgoYBjoE/v4bYAeM+ET499+/we+Am/cfM+w+fobh24+fDIaaqgyulsZkOYAJuwP+48XX7j5k6Jy3HNgCYmeQFhdl2LjvCMOGvUcI6qNaCBy9cIXBUl+bIc7fHcxXlZdh4AI2QsiJOuwO+PsXr6Y37z8yqAEthanTVVUkSh8JDsDvEyE+XoY3Hz7C1Z26fJ2BExgCuqpK1HHAHwIOMNHRYJi6fD0DKLdyAlvCB89cZAhwsiWojwQH4A9KeSkJhvQwf4Yj5y6BQ8LX0ZrBylCHoD6qOQDiCHEgdiVJD9XSAM0Lol2nL9HNAQABBgDE9HIxf4Gv2QAAAABJRU5ErkJggg==",
|
||||
"tiff.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA/VJREFUeNrEVktPFFkU/orqBw3dPLWNgFF34rBQIyJiZugEnc2YOOP8AOYHiPEXyPyE0ejCjbhzofERFxqd0C6MMMZYA6MgRqVBnhFtoN9djzn3FtXdRdPdVd0knuSm7jn3nHu/+u45p0rQNA25IlwYGHY2N/fCpijxONRYbAiXr/xRzG/zeY6tnHwnTtg9H/GpKaQ/feqXB86jFIhcqcI2Sue+ffD66voxcP7GdwHQ4ffj5/Z2WyC2FUBbQz2621ptgXDYPSQ1OYnkixd87gkE4CDaDWmsrcGexsaM/nhioj9SIie2BKDkZKq6uor02JheIfSG8fsP+Lz61CkIe/dmfFl2e5xO+H3e3JwvCaIoA8ryMqK3bkFLJLJGl4s/Es+eISVJcPf0wNXRoW8miqh1u+E31R3waHKiP1oAxJYAVOOt6DDP2bOIP3wILZnM94vFEH/yBEJ9PWfg/r9jeDkdgqKqSMoyIhSzEoliZ00NotEoy4kwhV0sCcBoFkJdHZLPn0OjDUH0MhH374e2vs6BqWtrOjDyE5ua8IiaEZKpHLbcQBMbTaimuMTIyCFLDBgA1PUI5LnPtJETVbSJ+vUrXER5+s1/SNIVuPv6THFidbXtyqkqlIR8RNb5mzt//AmO492UhA3QvF6Ih49AWQ0j9fZt1tfCsJyEKqOcMVFbC0ffaQi79LQSu3v0NYcD4tFjSL/8h4q/DQL5lStbApA3AMDj4cMAhJ07svOW3fxu5VevIJw8WTaAqkIMWBmgPqDRVaizs9b8LfeBAs55QgzASX3h/XtgcRGg/IDPR12KkpHypewroEIuHsVKb3YGWFri+cCFSpOPhQVdZyAOtAMl8qMAA8omQKSHqYfE4voh1IC4OF1F2qiqM/PDQcpesUwG0tRUqB2D6t8cJVq7IvYiLN6/yy4AWX9++wZQt8vQXK4Y+1kHsHEF7GCvt7LD2R6KUiaAjT5QsdgGIOuU9ba0mMxhyv5wKoUG+kpKKyt568H5eRxqbkYDfZINkb584TFlARj+5Uze0p/Ufi91HoNw7WreOrO9Pve7yRa4d5cDKwuAcPkv9La2Ypg2ZXMmg11dJp/AndsIzs2ZQY6OYHB0tIK/4nQ6O4z7y+hqVmcsETht4AIGj3ZmbJe6jnPb8K+/mfeyy4A+V8w2o01v6Bf/fgppaRnT9O9o2IbGx3GTRjiZMO9lGUAuWqOGDZtqZkCi+w2GQqbwEPWP4McPFXwLcgHIitmmbNLZ+mZ6FaUg5dYA5JSNNBtC4Pr1jG2IquDe+BjXmV1anDf5H6ZkDbO/6CKlZ4uBMM2Da+8y+jTr7UbdT73LC5VmZir/IyqVONsp/wswAIdBPQwwI8qgAAAAAElFTkSuQmCC",
|
||||
"xml.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABC9JREFUeNrElvtPFFcUx7/gAhb2xUNWF9nFfbA8DKzSqNtGKyYmhjRNmiY16Q+NTRp/Mibq7038A9of2h9q0jQ1bdKmTVObNGqkRalFBaHIYmFFYVmWRxdBFlgEFtmZnnvdmS52XGbIht7km7lz5twzn7n3zLk3SxRFpLZzn31zw1lmOQyNLRp7ipn5hYufnH7/g3R+L76PG1J19tOvb4gbaNc6/OJHX3wv0viv1gNIVTYy2LwuO3YUmU6sB5HaMgpQaNTDt7tSE0RGAQz5r8BSZCIIt2qIjAJszcuFmWbBUmRWDZFRgBzdFhRszdMEka0mU9UqOysLuTk6TRC6TM5A14MghsYnIRBMIiFg5dkqluJx6Ck3dHMxBjFLbmfWBRA38PKD9VUYn46m9blw6Vevqhn4T7VSaAuLS/zLWJt8EoWluBAOa6lmcE1JOBWdww/XWnHy/McIjUdk+/W797iNPWM+WpqqGeh9GMQdfz+6A4+SliwY9QWyn217Kbf91t7NtbfaDV99DeoqHRsEIC3HV3C7pw9dfQ8xMxfj9oqyHRTchVdrPSgyGeRc8Xlr4dllI98BghxEcCzCdbWtk3wrcWT/Hu0zEJmewa17ffzeuq0YR19rQNWu8pfOEivDR30NXA+GR/FL6x3EV57xGI37vNoBWFVjpZUFWVqOo7XTzxNvt6sCebk5isHmF57ir0ch3B8MQRRE5Op0tFT5aZNaEUAQgBKzGafeext9QyH0D41gLDKF1rt+rlqCOFBXzfPgeXLOot0fwGB4XI7htu9EDfm5yq08nsYc+Je4xmnnYl/XQ+sbCIYRIKBqhw0G+jrWhsITCI5OwGwoILsd1U6bDCeuU1WUAQRRYafLx8GGOi4GwJZH8rOWFqPp0H446WvTxVC/BKKQdpDHUb7GjwGoGachB0RsVlMESAjCpgFkK8+AIOtSyx8ITUR4nxWam3/28j67smeSX+o9+2skv1SpBkjQEkhiy/Ht5RbEFpfx5U9XUGgycntb93003+5CP/0V7P67Ky34+fot3g8Mj/DnqXESL1lWRYBVopXU9IYP07NzOP/5RdR7XHDZyridhXNXlNNvOUIQI7wvjWXQ4gtxVjXNQCKxRo379uDJ7DwOU0mVbKy6uQlmIDSKgeGwvPFIz0R+KFkbRwOAIIuV38s322nzMeLH5t9lO72B7xGLVKZHI4/h3GmVx7ITEZKnolSpXwJylsRebt1WgnMnjvNy3DMwyO1iMlckCKNeL49lS8BsfHZI4b8fc7vq33A1OV3R+RjGJqdw/NgROvHq8O6xRnT0BmhXtGN7STFy6AC6t8aDialpPsZBlZBdTQY98mgzu9rWkdxNS/BW4+vaAQwF+fjwnTdlG9vzmVi/6dAB2d9utXAb82VXb5WLSymmukKUEP7fStjc2btpAP8IMAAuNAN4g8DU6gAAAABJRU5ErkJggg==",
|
||||
"dxf.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABS1JREFUeNq8l3tMW1Ucx79tb2/ftOVZHmNsjMmy8cqcEccWNHGa+IeJi/zhY8Esm2RmKD7m4iYZSzQubpiYCDMacTjdXzPRLPMx4zYDGhOngEKW8TQgtBYKLX33ttffvcXSlgItJDvJL9z7O+f8zuf8ft9zLpXwPI/oJmkful6ZqaxFis3s5gS7gSMlD640Ln49JtGg0/dnQyuXpgTwwZ+z+G7KXetsG+wgiOeSnZdwlad+nMKQI5D04r0zPlwem8f+Ag0Ks1T1ECDWA7A7V43DXRYK6lw1gDMQwpu3ZsSM7cxg0Visw6YUIBKW4PVyIyrTFThDae2x+endAC0TZu22eGH2cNhfpBXfm3+3waRhUJHGIF8rQ4FaDqkEaJOgfqhtEKuVg0ksFGBfvhrFaXI099hw+GcrTlemQ0MQZ/6ag5MLoWfWD5NKhiEnh9ZdGej+xwUdK8EmPQMJlJRaCc4TxO1VIFZUWrFOjg+rswiExcu3bHiFUp2jZnBuVyZ65wK4PO7GE5QJYZygbblMAoMiDFFjUuCF4jRsz1GvWI6EAHyUCbtuqTBCQzV2BoGWSiMqjCwu1mSLYF8SxLdTnshcAUJPEBupJA/kEMQWHcpNy0MkLEEo9qjimtkLi5/H2UoDshUysV9NC7VT6k9RSd69PY9ihoeUD+HmpEcsYZDMw/GY9YaQRWPVrKze3TY4R+GaVtdAtMopSPuIE+W06zIDu6Rv2B3Ew7kqNGzWYNjuj4mTRpZDWi3NBB4p0uFYt7kyqQwEo1KgoiI1bdWhddCJ1/rsOLlNBy3tSGgtAw6xLIdocRX5dtDJSbUl1ECQj7X7aPcnSnXom+dwtNeOIVcQF8c94u4hkeB4vwMOykb8vHhbM4AQ/CNacIdBju16ORppwS+mvDhYpMF75XrwBHGQwHodXMoACUvAxX0wPqbF/w3waNuqhYZSvU3HYMwTwt4Mudh/6h4tOia8OEllqstVos6UfCmWAVh8vjrtx3U68++UaKCgK07o25POYk/UOMHfUKhCqZZB56QXo54gGjaoRNg1aSBAIhRMqHGn2YdDBSrkK6QR/3K228Dgjc1qWIjs+LBbnB/dnwIAYKcgb417Kagc1XSpCL5kLI+V4hhlo0Apw4kxD67aApG+pEvgJ9r3p/xIp9vv2WxWfE+lCUGfN7H4wS7FpekAxnw8nlzQS1IAl2YCGCfRNeey8AZ5rLXV0NexiEr3iTWAc2a6pFhZcgA3XTwaM+UQJOQNYV0tk4R4lLLYOcsRAJMEgEyKR3UyGEkdnnXsPr4dMMjQ0u9LAiAYQhl914VL7m60hCVwBhfz3navNqbv1T9cBMeL/s/GfPiFRFZXqEBtthxHfnMuGf/2gAcTK+wmIYA9bvwNEpFVUHIBi7NVGjz9qxPnR7w4sFGBGRKrsPiLPa7IvAFHEP2O8IvFH1oSb1UAW1ztv7EE0EcBr1j8uLBTC6NSgq/MAVTT0XqpREkfJh/uuBezFly4Jc2+UIw/aQArFwswR/eA4PvfH5CExwzQt7hCL0MXKTx6TlmaTDShfT7pTx3AHAcgZETwbVCGL85ROptu+vtYjhzj9FxPGrgy7YqMbx31kvnWLkIrF5u2x3NYVOlDdM8rw/fEHAffPqP4vOUnO+7s1WPiIT0U38+KPldoaYyUAPxxGXgmj408G6/NIm/hZ1tVlwNWykBTvxsdFZrIvBH6hyU+RkoA4KJ+rH5tW9I9RzKL9n/6t0+05cavAYDH3WqJAWzzdw3gPwEGABOQlW22oU1lAAAAAElFTkSuQmCC",
|
||||
"avi.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABEJJREFUeNq8V1tvG0UU/nZjb3zJpb7bSUpsxyHQqKKktIrUSuEBJMRf6EsR4omnvlQ8oIoHkMorf6DlGQkJUSncxOUBKZS0iiiBkF5ofEl8SWynXt+9a85MW+P1mmbXiTjW0cycmXPmm3POnB0L7XYb3fRx7KMfAvPBV2GS5KyMck6+/t7999961rre/Sz9Fr32wRtm98edz9Zw99u/Ll6d+RAHgegmEUdFdLC5N0/AE/MyENcOB4C5ySQzx7rDLpy6cNoUCPGI9ufkdDsReMFPIBYMgzgyDzCW7FaM+UcJRMAwCPEI94c4JMDmlEyB6AtAVdummWWhIAgQLaIpEH2vYVttm78EKrD+5ToStxL8RqiKilZDQe1RDU6fE8WtAgNRpKWXDgZAymYp9vocivGCTj4yCXhfDCKyNIufrn53ypAHVMW8ByzDFnhnfeb1+gPQeqBWqMJit8Bisx5oML2x/eRatlGX6wifiR4OgLxTws1PfsbL75yFK+rmsma1if1UEeU9qv+7MjIbaext7UJRFaiUDNUSAbZZ4DruxnML4QEAtP4FII1IvF27vopGpQ5BElEv1zB8zAZ5r4ThcTvk3UfwzPgoBH5ejJweJ/fCw1sPNLYMA1BaSqcvWEUeX+uYBGlcgigNwak6CYAd0+eitLEXubsZjE+64CMA3ZRaT2psGfdAU6s0cXYKoTNTSP4SR3hJH9N6qUZhU3R6bVXVyQYCwPKgQQlVzVf6GlSfnJLNZe9nIecpNyg8cq40GAClR8nudWDzxgakUUk316y1kLuXw84fKRRSeR6iGuUIv5YRn269QQCqri4MkWHmUjYnZ0ucs5sZpP/coVKsQBobRmRxBp6wl29stUl9bRkC0Kq3NGOH34HkShwCrU7//iMUijdLTrWtwBvzITg/Af9s4Jk2zHmgoVW2exw4fn4ape19VKm229x2OEjmjni4q/vpHKoSKg193Manj3E2stYMif8Vgl6GAIyFRmGlRwcbs9busmvWsPmn61irs2EYALmzl4Mngjh94RVEzkX42OF2YPHtRQiiwMeeqIfPK3WFt2y+14ZxAHS1etk/50diNQE/vfnYOLWW4t8Eb8zLx77nfUivp1Hdr3ZC02vDMACl1tSwSKdkJ7z3/SZ/bPhpMybf+W0b7mk373soIbcJFOvzq0sAeu0MnAPs1IwC8yE0Kw0EKBxMnrydROhkCE7/CHd5YjXeibXSbA2eA8y13Rw6OcH+dnEv1OUGJl+a4PKtlYf8r1ZsKYYkPcUqVKqZ/PEhFJ0d4x6otDos0m9qYQq/XruJb658ha+vLMPqkBAib7D5BH2gIuejiK9sdXQeh7GlsfNUbqwSlptdCAUsX75BFTDdmfvi3c/RKDd4//anq9hc3kD+73xHj63vHpsvxXJT069kypr57J1Mp1+UCyg+0D5GkyuJw1XCcr6M/4v+EWAASsVNgE0Xzt8AAAAASUVORK5CYII=",
|
||||
"zip.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA9dJREFUeNqsV0tPE1EU/voUGQstpbRFRSUEeQnF9zOIT2Ki/gGNLlwYd2pITFxoYnRr4soYXRhXbmWhaJT4SFDxgVEWqI3EGCtqaWttpdN2xjt32mkLzO2t9iaHzj1zzpnvfufcey4GWZaRP+5eM521ObvOWKx2lDKSYhjR4JtR8ti7+4gU1rOb+T3zXEYt6y7C4e1hfvDG6ZzrwfMphAIP4R8+5PsVnRwavCoyQeQPow7OomKdZ9Akq7PZW9HRvs9nNlsJCKP9PwAUHwubezTRglldqHZvKwmEWZ8BiekY/f4obyapPpYqGIXlBATQAfjejd0qmg4dACSgzAbgWbYlD69EfQwmAcaKhVTFC8KsX6lsAPHQ4wLAio/BaCVpcGpaFYRMQAzogpibATlNFpVmAli28lQeAWnqA5hUFizIAyGjMf7L9/7DPaUmeokqzJcCsAEEP13Qnr2t/dQn9O0R/K9BfWVJJJhi5ICIQEoBguD0xWLBIfKym4MBKbMi/eFt6S9gzOHegMbOE7r2rmZgfOS0j7MGCGRFWDUwNQjX8ov4MX4czqUnqc7hXs/ecmSXlFADSWawutZrqKjqpr/FbAu3NxcAhQF2UINsUqsllQCsZQagpKDYqvzPjqHKsxuxqadoWnuJ8/tSKQyI7O6XlPDp1Tn63LRGLHcKknQbsUZ4chypZHZhvAB4GVDolxPsXRCL5vpCcAy2miYOAmS+bigrDKRFXYlHPpMPdmHHgQeo8WyCGJ9i2mtSEgPStP5C0glEgt/w88sI+Q3AZLYy7UsvQiWnjICVQjU61h3G2PB1uBevRrWjvrwAZClBVskO6F3SRUVlZLrcRSjyrajUwc/AtNrJyg4gzcuAkoK4Nv0e8GNo4HKBSe/eoxh7eQ913ka0r9qFm1dy3VGw1WDzrkOwO+uLpsCoXwNxTex2B3r3HKZisVbAXuOhOtq0lGM7A9a3vo/aCAuq8O7FnYIYVPhT8KcgBWbSd2rr6jDy5DY9Tjdu2090aTVg9uKR2b70IkLvE6nZaeRPwR9yqfldoJrwj2Pi41ts3NoHYb5JfZ/tGRnb0ef31RQssMHX0zcrxly3rLkZoJTljtpwKITRF4/RtqIT9fWu3Dt6b0ho857tO+Fye/LiRGc3OT4GYsQ5ok3fvBwm//uJ+DEZwEMiyujsbid/U7RnZG3lGX7/vAtkKUpsTdq8ocGB2tr5BTYWY4zqBcFCbENobVuEyookfdbvRUneFIQIW7lu2LBI2SyVM6wiGT0putQkWporqU5OsRjgBDDxNUCq3FD2cyg2PbsG/gowAPGGQK+e//OKAAAAAElFTkSuQmCC",
|
||||
"jpg.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABCFJREFUeNrEV+tPU2cY/x1O762ltgtMRVdcCLLEjAW2GLy1JPtOEzPjPrVm+7INjH8BS7YP20fxD9C5GJNt7mK8JcaA31iI0pEwgaB0KCKMabm1tKfnnD3vWzjtwULPqc32pE9Oz3t5nt9zfd8jqKqKYhLO9PRbA4EQTJKcTkNJpS6i73xsu3Wb9VlKLdrR0WFWP9ITE8g+norKPd0oB6KYalBFat23D06PJ4qe7gv/C4B36+vwYfMBUyCqCmDvTh869jaYAmExqyQ7Nobs8DDUtTW4IxHU+HzanN/tQsP6O0u1O2Nj0bUyOVESgFKUqcriIiRKMF4hdjtS167x/46jR4HaWm0ty26XzYY67w6drHIgSgLYUC/Pz2P1yhVurUZWK3+sDQ5CmpqC/fBhWJua8sJEER67A/DCMAjLtrVKFtmOHEH290Gomeyrtf/yJVLXr8N14gTf89sfIxhK/AVZUZCRJCxnMlhcWcUbLheeplMsJ5K07azxEHi9UEiJqqia5WJjI9TlZdg7OwlURlsn+v24Tc0IGlABYN5gHAjA8fZ+5rVWUx5QSJH06BFXXkMKlBcvYCOXSw8eQBodhf3YMd0+0eEwXTkly1AmAJxXVrhy6/HjEA8ehEAZrno8EA8dQm7mKbKTk4W1Bth4FVAMuSdcboihEISGhjxaygk+Z7FAfP8DSFSOqKuD4HZX3DtKe4Bizlih5MHuPdq77v9bQcDpRO7+fW2sHBv2gLzugbLU0gJ1ZATy7CxQX1+RB0p3QkU2tpuyn1fHn6PAk2lgp5+OUg8PEYo6pHkAchkPsPJjCufmtPIES1jGG8TyghIXoqUKHpDpPUk9JEs1Tn0BqZSuK5Y+NGjtw4dAczOBECv0gERC5uaBpcU8CG2XwTMsu75/m/zYAkAu/2TWLi9RUxOMK91MQpE84wDkgqVuz+tdEpgMWa4QANU559cl0wByOfxXZAhAf1cX7s3M4MuhIaiffa6NJ+iwity6yZ+91JqjB5rhs9kR/2cBsbt3EV9YqPBOyAAUM2ujrDuuAwtf/QlC3znE6cLS296O3rY2hHbtwnuXL+fHKfMvhDtflWPYA3SZ2HQ+50tzY5zFlP1n4/SLtryD2O1bSNBxzShGXqlqCLiiIg/0f3QyHwK6L0Z+voqu2GkkV1N8vv/UxwjR9wGvwG+/qTAEZF2rP0DCThUsVQoeCH9/CcLXX6HxfB/ilBu/jo/jTHsbnw9f+g6RH38oeLKYzYQgsfA3gt5aDH/yKYJ0sMTIUk1ITtYJPHvzBn4hsFNfdCNBLTsUDOIiuytsoVTXp0p9nMLl4h+nPqcDrW/uRvz5MyTT+ZtxqHG/7l33aUaJ6HM4t5ynM2RAPdcXNpyESXoOLI3rpgYmxre0Jj49XaU+YMB11aJ/BRgAins+q6BEqrIAAAAASUVORK5CYII=",
|
||||
"eps.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABDFJREFUeNrEVk1sE0cU/myv1/lz7PyVND/FRmoFVZTaQglVggi5VdCq0JxBhnsCSPTccKt6qaAHJC4EKqVqKg69oVZl3UuKGqGYHEiJkHAgPzQixEns2F7bu30zG9u7jdl4nVR90mh2Z97M++bN9948m6qq0Ivt0ojkbGo6CYuSSyahbG2N4cZ3F8z0/m1PKKXk7uuzah/JuTlknz8PZUaGsRsIvdixj9Lj88Ptrg9hZPj2/wKg650WfPLhEUsg9hVAR4MHH3d0WAIhWCbbq1dIShJUIl3NqVNwtLYW5hpqatDZ0LDNNuD+7GxocxdOlASg6FmbSkGemeG9cPAgEhM/8m+x+yPYyLiiY3e16ESLuy4/wjBwEHETEIJZqCjr64iPjXGDXCYntd4pQp6dRXZpCa7jxyF2dfFhh92BWpdrx35mIEwBsF4kA5nINJSNjZ2eSm4h+esvQFUV1/358QymovPIKQrkbBbxdBqr8QRa6GoSiXhIHRmO0bIru19BPlnU17PkQoZS/NT8lG1tUGUZYn9/cQGdWvB4cH9zE0jLxXGRvNHIWiNcfh9SDx8GLHmASebJEzLuhJ02Ud68gbO3F7nlZWSmp1F1+rRhnSNPQAtif5sH8o0ZF44ehXNggH8z4gnBIJRcDulIxKC7WyubhOwOC6fq64f9kJ8zWqAT5+ccPT3IUjjaOjth83orzh320gDUQoPPV/hWPd7id3MLeeNdZB89MuibtfIBqEpZTT1yGGoigdzTv8rSLz8TKkp5/qtzA9XVwMICsE5h2kgkrKNEJDgpLZZ3LaUBEMFMhWIcS8vA4iKrILQxFoKs5YVyA+hNQG3tPgGIUQ6h/A+WkPKG7GSc0m9pL9IelC3R3U2MdVgFoBQ3ef1aa3pQgoU37O8V4MABqwCyWr+6qjWbzZpRQ42n28/yFTCjtXV7KxLYHiacMgfAGM7aXsUygGzRZSfp8dFLlAgYo1cu0NxcGIsQR2Ky9gh5RZHPMb2oPioqBSB9+plh6trUFMJLi4bxmJxGcGKCjLsgnfmc93nd0ak/9waAyeC9ewgvLhS90t6h8evGdc3o0BBC73+geYgSUvCHcVwOBPHVsWMY/WOyAgAZI4BvT5zgbmdyRXpQYPVoTy88VAv4qG6Irq0hsrKCS4EApC+G8PvLlwh+f3fHXmV6IGP4jVAhOk/lGXc35X7vdkgOtLfz/jq5euxxBF5XFQbHx+Hz1GOg8z1MnzsP/82bBD5l1QNGAHeoJAvPzxf+fdvpdfDuHYPe7TNn4aUUfPanCUSpeLlMT3agqdGwtiIAEp2kQEKqAcLRaEm9aw9+g3ThItaufrntuWWEnz2r4ArkYl03eOuWMQxja4ilktq4To8bfPEC/m++RqC1jetEqHSrLAx1JwvPPS2pEt4oPR6jtW+bqzgM/0v5R4ABAMVhWs13gzHRAAAAAElFTkSuQmCC",
|
||||
"mp4.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABINJREFUeNq8VltvW0UQ/nyOr3HipLFjO01b4jR3V5AmVRWBUFtRaETpS1UqoUqoiEeeEBLwgARIBYV/0D4BQqgPSEhQUKhKVW4KqUQapCg0sXNznJsvsR3f7fgcs7vOcezEqX2SwEijPTs7O/PN7M7sUWSzWRTSZ62fPLDYrWchk6LeKGK+6Bfvz3zwxpP0tvtTllI6/9GAXP8Y/+ZvLIy4rg/iBsqBKCQOB0UksObnW2BsNV0fPH7j8/0BoGmSyTSx9c2HcPJanywQ3AH5Z6Sv18PcaUaPDBAHlgHKap0KBnMNLAxEb0UguAP0D45XQKtXb4KwVASiJABRzMpmWl4KhQKckpMFomQZZoXsnqpg4s4E3KNu9i0KIjJpAclwEvqGaoRcQQoiRDTfLgtAFEXZ/ltf7EBoIbhDXt0EmLoA25lW/Dr4c89/lgGlRglTW4P8fSUzIGxlIBlMsFF7SFfWmGdqhaV/zeVHKpaCuHk72890oqbBsDcAozcfwtp7GLbzrWy+kdhAeGkdsTXS+9di8DpWEfVFEPaFodQqkYwl2RFSZvNIApaORtIjqmUAyGwB0NZqMXPPibnfZpAmUQlZEZpaDWL+KDgtzxzpSHbsLz+Nqvoq6I16qHRqLIzNw0oc0+rIkoAKbZYFIGSE/LeGAKgjLTYeiEFv1oPT8OAJH3vWBkOjgZRYAyZ/mkDngL34Ho1mWSal16/QZnkAG1vKaoMaLRfbMXPXgeMX2kvq0iwU7pEqSaBRb74T29effAQFyjpjFTxjy4iuRIrk26uGrvlnfQgtBZFOpOF1riLijRD/Ivoun951b9kMKHgOzh+nYOw2lYzCO+khzceF6d8dSMXpzRfBq3kYbSZSCUkEFtfAq3h5GRDSW8pKnZLUOI9MIoPgbICdf5RERpuOZ2qVRcupOZjbreS2W8iTbIJKq9rVnmwAPCkleo/Ci+vMaTqZJpdLgELFoZq0WHOXFY0nmip2WCGATNG87VIn1pz+XEnRZ7dajZrDBmgN2pL6++6E2yOgaTefsJTVOzAAmVQuohprDTlPJRKhJOHEjjn9BZNIkuUNEz0D0Q/MB/cAYDOl/W/2s3F+ZB6Phx6j+2I3MWrA9INpOH9xou/aqaJ9j24/godUBTu2F9rQ3N+MoQ+H5P+SZZIbjCmtL68zQ3ROnUtdTVofvjWMO+99D/dfbvS+1svketKS6Z5CW5J+hQAyjCn5HD421h2pK3orpPUjJ5vQdq4NR08dheuhi8mfudLDvgttSfqyAaQiKTYabUY47zt2ADh2+inyDnRhfngOY+QIbM+1oLapFnN/zO4DAHlyKeecCZi6O4nuV+xYGV/Jy6T1+5/ew+3Xv8afN4eRCMTRczX303P2nXNsfPXW1SJ7lV3CeKbgXRDhJz2g4wKwPLaUl0k6Qkoo0v/qypdstNgteOnjgfxcXhXEc2i/e+tb8g+QZhxeCCHhi+dlVGfo3R8QmAvk9QvJ94+XrZdaKw8gmtvkHffkZXFPbIdsccS9q2FqQ9ojGwD9vfq/6F8BBgA06BrIMls3JAAAAABJRU5ErkJggg==",
|
||||
"ppt.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA1BJREFUeNrEljtsE0EQhv/143BwnKflkBijiMbQREhBFIgABQ0t1AFSIV4FLVQ0oaAkHUhBUKQDpQpNhEQUChcRQgIchOIg4Yg8HL/kxK+7ZXfvjO/ss3PnOGGlO69n52Y//zM7PkIphX4sXD/1wddLL8PmKOYJCrt4dfHt8kQzv9r9XGZO4VHZ7v5YW3EgseG99fFaGHtB6IcDbRxDoyPoHvJziOn/AuDyhxAaO28Lor0APQOQgmFbEG0FcBztgbs/ZAvCZTX4bppXsFbJ2sVvlTk7ASBSBxy+frg1a2iMH6tPDAINC9MywPoPgiLbRGGxFfZdVtS5zG5lDWzQ5QbxdApZ3Rpg6AKHWGx4OswBaL1p+CxFIQf8WiLqOttl4AQQGAaySSD2DdhYnEc6+oVRyaDlAih7QM6lIHV1w7GZ4hAp9uTDlhTg44iXyUwI21vVnk3F8PUCwZMKVhbmVFVYrgJDDDCoObDn+kaA5SXnGUsKUNqk0AhPgQpBdL6SB3ASKsQhzCh5CDp76N4nx26lEx0E0eVKKTMAsUCFg9tt8eharQE9QEWJiq/MNk+uEdXGbk4Hhf9Y8zgtp0DkXVvPZwi2YqwIE/zPiCvAUiEBx0+zuat5nJYB9BDiBzuBroD6jLePikK1EqN1BTQBOITHR9EVpLbgrdWA0rwKCa12wqa+rQIodO+jUIFQ6AEAUIWYCyNXU8AnpZ3GvvtTwOSFKB0jKOWNdVBgp2CTtWBvgMLTe8AKdPjZ1aBdOCXWkpR2KmASzNnRPJDSTgAq49CGKYAsV1PQP/EG0vA5FSyfQWZuEjuf32HwyXLVPxVHcuYu/Hdmja/qqxEkpsftv5LxP5bKxRtLZn4K8cdh8em7+kjY+dh6OS7sxbXv6Lz0QMy5jQ8+33wxbohlXYEyMVQapapN5JlW1xWmlJhrPUH4aOoZYtguwrKxtXZfuS8uZTeLxOzkv/XA7dfis7wdx/r0PfWXyvUx7NdADcD2+ykk56bq/OLPbyD/M1JTP/UxbAOUS0YAfir0Nn3DqrVXFDDzt65AqZq/PzNPIe9kDTY+Vp/dROF3tM6+E4uKtVp7ozedBgDVeW4lakqe/RoxtcvpLIrpyP76QDZHD60R/RVgACYfj45WfzRkAAAAAElFTkSuQmCC",
|
||||
"java.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABDdJREFUeNq8l+tPm1Ucx78tTy+09EZLGQWMUNJQHMIcJFOZYxnZnJcRfYdxy4jxnZqob/0DnEZfqC+WGGXZjCGZcWICCZLJdFtcRQuDjVs7oJRCu9JSoGtX2qf1PAdLCq60T6n7JSfn9Hdun+d3vudSQSKRQKp9+OWlQWN5aSt42sr6A/jXghc+f+9M527tds5HHanpgy8uDiZysH7L7cS5Sz8lSP+uTACpSYg8mqmyDLWV+85mgki1vAJolEXYb3yCF0ReAG6NTtBcISuEvljNCyIvAFctVppLJSJoFHJeEHsGmHW5EXoYoWWmoAAyqZgXhDAbpaZLd+yz+Pjbbrz12kkEQ2EIBQKIGIYXBJPrl1/7axRdPf3obD+OywPXsREHNmIs7rk8iBM4Nh5HNBpDOLKBBASQSyUcRIB0fT8jQCLD5OMz87jYexXvdLTj/OVefPT2GyjVarC4vLJrv/NXBhqzisB/TqsdNu/2or6minyVFAwJeYlGBalYhGqDnnckcxLhQXMNAsEQdGRihhGh+5ffcxZxTiLUqhToPNWGW2NT6HjxCCJRNivRZi3CdAswNG6Hy+tHs9mIilIdBeF+v9zSBPuCmy6D5a6NAMXQcbwlqwjw0gB347n9q/h7ag7jc67kDQiDToMyIsImczVOPnsA5777OaOOcgJoa65Hzw0rWFJfQy4ezjighxtR6NQKLPkC6LeM4dThpr0BkC2c1l5oqIVtwQOHx7/lKyViVMplBCSG0ydaMo6RhQbS03OHzfDsIkpURVu+GQJzrNEEg1a9a9/sI8Bux39ATrObkw6oZVI0Vhnw5tFm+NZDW/VahQxipgDroQicywFUaFUoIsdx7gA71o8pEMJQrMJqOIKhmUWo5VL4gmFapyyUwOlfR5RlISB3gVwihsO3CrNBlz8RMkIhzOWbA3rWQgiTta4oliCWXGhBFEqRFCLSrpjAKQvFexMhu4uCdEXSjIOy2SowF4B8WxqA7eHzBVY3xaZW0bIvsAbTk5Xb/Jw53fdJWUnrOavcp8/tLuAikJo+IY+OG9YxWu4ZvIlvfuyDdXyaqD5M6zh/MBTCV99fgUQspvmnXd3UlzpO9gBE0akpKUyuPDXrxKGGOgxP2mAo0dI6r38F1gkbLTsW3TRvMBmpb+c4WQLEaZpf8tCnVnJrjkzYablcr8P03AJt87SpmkJNzznxetth/DFyd/OJTi6q25P2rbFYlkcEYqQxl77+oRe/WoapTyISY2TKDgOZfH7pPvWNkAmanqpF33ULbA4X6oxVGJ2ewX7yWIkTHS14lukyJcfjAcDSdKb9BIbuTKKqogwH6ky451zEq63P4dihgzT3EhHqyS3I2fPP1MO7EqDlV/5tQ19PBDY53qNM8Kg/p2dfOtL6f2y5C32/Xfvs3dNHM27DdOF6bOfAwJ+jjw3gHwEGAHqNwb/xcTeoAAAAAElFTkSuQmCC",
|
||||
"dat.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArBJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/6vm73qP1D/fEIOQMZMDFQEBipyDJLCAgmEHIEMqOoAQX4eBisdVZIcQVUH8HJxMogLCZDkCKo6gIONjUGAl5tBjARHUNUBrCzMDFwc7AyCyI4Q4sfrCCZiUiqxmImRkYGNlQXVEbpqeB3BQs0QOHPjHsPdpy8Z/gEd8/fvP4Zff/4wfP/5i4GXm5Ph9cfPIEd8ACorJOiA/2RYbqOvwfDszXuc8k5APGP9bgOiQgCjtCIqAbIyKEmJkayPqomQHEC1EKCuA0ZDYKAd8O/fQEcBw0CHwN9/A+yAEZ8I//77N3gc8PjFK4ZvP36C2aBqVlYCtby/+eAxijiIjwyw6SEiGyKiYNnWvSiGWhvqMCQGeILZj4CO65y7nEFEgJ+hozANLAbiIwN1BVmG0sQI0hzwBykEQE7xsbdk8HGwAodG68zFDHpqygz6GioM567dYjAA0iAHPnj2gkEG6NMZ9cUMt4D8voWrwGx084iqDf/+/QvHsNYOiC0lKsygKi/D8Oj5SzD/wo07DCpy0gxqQLGj56/A9fyDWohsDgiT4IB/cAy0Hd7CQea/fveB4cnL1/A0cvHmXbgahAP+oZpFrAP+ABXD8H9omgCxHz1/xXD70VMGSRFhhgtACznZ2RnevP8Eln/38RNYHqTuLzQNIZvzB4cDsKcBpOACBf/Oo6fAGASMtdUZNJTkGSYsXg1m+zlag8VB/JOXrzH4OljDffsHR7CT5AAvO0uGH8CGJbjZxc7GIAlMByB5b6A4jA0C0T6uYHUgvpiwIENqiC/5DkCOLzEhQaxycpLiKHw+bm4wBvFZWVjA8n+JqFOwOmDX6Ut0KwkBAgwARJcLEDF1yEIAAAAASUVORK5CYII=",
|
||||
"dwg.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABVxJREFUeNq0V2tsFFUU/mb21c4+2i3ttlJa+gChoeAmgGKUUEkU/6gRYsRHig/8Uw2RpkZDIvEHqEUpSIKmRgyh8Meo/DNpizYSGgxWQNAKtrS0Fmi3Zbvt7mz3NTOeO9vHdjttZ8We5GzuPffce757XneWUxQFicR90dnizk6rQIrUH4wxvkzDx1C13DebXrI9o5ZS1QOLsMxhSglA7aW7MHjD7lujkRZ83jEniETitYTV5z1o7BN1G2e6jLcX2bDuPqubRAxE5n8GsK3EjtorPuJhBKLynAd0jkZxtH0ENhOP1Vkm7FrhSAmEJoAdyx04tCEbrZ4Qqi/cRac/Orn23U0RtVd9CMRklQ/QOM9qxDa6vUswYEOuJSUQvHaiAGucFpzalAsr3YyBODcQit/2+ggabwexm2QMSH9IwsEHs2kTkGbksNieGgh+LnQ2I4+69YuwlW63l8JR/ZsXj+Sm49TGXNrJoXUorK4xPZbbHAcIptRAaFaBkjSvLLGpxpjL31mVSQY51D+UjQMU+xPdAQQkBbaJMkYCCFho5sARwN12R4xXB+CbF4CchKCB4j4QlvGJ2wnBwE2u15RlqCH6vm8MpUYFvCLj59tjk2dECJiP9mWTFavZ4BYj0mm1T6TiARbj03RormCEK80wbW2A1po9YTxbIODlQgE3RiIzzsoSgBInsLnQjvo/vBW6QiAluCDHzOOj1Zk41BFA1SUf3l9pR4nVoK598JcfAarSF8h4OnmmPMsyZ8kJRl5fEpLnpnERldfOYisGqCe82z6KpsEwDt6gsERkFNuMePWiD5dHYzP2JbPuJExWFkmwvzOAzTkWFFMoDncHVfm+FXaaG3CsN4g91/x4nTzxlGt2Lyh6AcSSHowPu0TkUPx3FKTDSq5eSRn+p1/CSls8FFVFAsocRhztGcPVQAxvFsb19ADgtQFM8de3QugOyaguFmCh2meyAgLzZI55mt5Gpxkfr7CpujV/i+gMytPWGSuKTgBRSkLGPw1H8YM3irfpRk6q/Qn5bJxv4bGvVEBBugHvUY6w/YnrioYPjNoAgF6q35OeCLZTR1tGB87zJk2SidrhW/lpaCLjX96JoJ08sT3HBIHnZvSXWQEMk7+OkfE1lOGbMowIy0qq3yfqvpJ0HvUDUdTeCqOSQqY7CY8PRSHTTZ7JJONS6sYnyEWJWJNnxld0Xl0/NamIzhB0kOIu6p8sj0My7onYGW9km9BMVfOjrAMAJ5jxfIYB6TQeu4fbJ9OjAo8bZn5+AEowAhclTFDC/06SRh1qlmFAkunjAsgXOJWdFk6VMWZzmdKJjZmc6U3oJ+sl6jLWdCj7TE5kerNbXvzFr3zbF1YSqYf6MZNP0MS4zRudJt9zVVSSicmYjquhR0m2p5mEQ1SGwfGE2dLqh5Wa0Im1VtxPudHkieIJlwkZdNsrIxLWOo2qPqNPO0LYXy6g4Z8wTvbGn+aXCszIt/JoI92o3k44KDEAU+Ob1JSuBSTkUV3/7o8nRym9B+d9MbQRZ6XF+34bvYiMznpj6r7nlpjVyhuiHzaP6s0BD91IHPcAGzNm38VMdmHcSDl54wy16bPDMWxdbFZl5+iWI6RrN3PqnmEyunOpBY/nmuJn6O2Eg/TtJ457YJXDgKV084epKVVeEdE73hi2UG0/fTEAHx3cvN4+ue9ITxh1ZQL6wiJ+HZUmWztb0w0gQod2ifHNjetsU39CAnHZ8b4wXlliUfXODMb/M+xuD6rzvdeD6CK9b9xWVX64O4TPbobUNa1ezGn9OUV+VgUWgoZGobxWxM3rAcSUBbEPvSGA178wAGIz2+u/AgwAyZMrFfMyhh4AAAAASUVORK5CYII=",
|
||||
"tga.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABEpJREFUeNrEVktPG1cU/myPHwGbjJOSBAIKUKLiKKWxUpBAkWLDolWywFlkkUUre1+IUH4A7U8g3Re3UhZNFyWVWpAiSlaJUYtwWODABkJSAoiHCRgbezzTc+/4SY2ZAdoe6XjuPXPnnM/ndY9BURQUkuF+37j57FkPdFI6Hoe8uxvEw28D5c7ttyeUOuTo7NRrH/G5OUjz8/5UXy8OA1FIRpwgfdrQCIejyo++3qH/BcDH56rxmcsFuw4QJwqgznkaHfUX8bkOEILuZFteRnx8HAolXcWtWzBduJB756yoQL3TmduPRiL+nUNyoiQAuTBrEwkkp6f5U7h0CbHHP/K1pfUTGMi4XJDdNrMZ1Q47CvN8JDLjj5UBIZQrFXlrCzvBIDfI6flz9Wm2IBmJQFpagvXGDViuXlWVmUyotFpxLquHs8I9cRCIsgDYr7W7G8mJCcjv3//TUxSG+NOngM3Gv3nychp/LLxGWpaRlCRs7+1hYyeGagpNLBZjORGlz/oPD0G2WTgcSG9uckMg9zIy1dZCSSZh7eqCQgZ486qqgkAgRre3gb1kXpHFCpxhfAa2xkYkQqFrujzAKDUzw40bSYm8sQFzezvS794hGQrBdvt20XemggQ8Vh9gHsgyM27u6ID55k2+ZoknuN2Q02nshcNFZw9jzUnIYpj7Vx4PDHV1PB8E+sfZd6a2NkhUjob6ehhE8ci9w1gagJJj1F7MrZXTYn79QTV5owbS5GTR+XKsHYAia2LF1QIlFkN6blbTee2dUJa1+c/uAE6dAt68AaJbVDV2XjmwkcypLSylAVCClaUEld/qCvDXEtWgQZXtbKtMFcLJagOuuIDKyhMCEKUewvoBa0is3nkAybjRXFqzTDqoW6K1lTLWpBeAnFeytqZyIShBxx22sgqcP68XgKQ+19dVZm4WhKPVmaFAn+4QMKOV9uMNCUxHmZwqD4BlOOPjkm4AkoT/ig4E8DW12oG29iKxd3gY4fU1Lve3fASRbju2D4yNIcwSlWioq5vetSDw+xiCr14dcSZkAF68gOHhIJ69fYtvJkLqevE1Bq5fh6emBu5Hj7gsTFk+5O1SvUbso2s3SDdoT0NDTpZjzR5ISYV3s9oZMzK/6woCo6NY2Njk+8DISO6or7mZPwcn/8TUF19CNJoQzcwMOj2QyjMDwPpCZi/SyBXdjfH1+N27UB484Mz2PU1N5JEViIKZG/Y1NRbr0gwglcpzzgPqfnh2FvcpDGzt/eF73Pnpce4b3+XLlBcWDHR2IEpds+fD5mJd2kOQKg4BK6OMrP+3X/HzvXuY/6oXC9SePRTr4NQUfGRMpLHMO/QdojTE+lpc/JxIbTiaHWo1A0jm57r+X56oCjKyhdVVuAcHcY0SUaRb787yEv3bBBpoHHNTUkYzw+vw9Et42Z2RShbp0+2B8OJiySP75QzYfnpGc8LR+sAB8fo36G8BBgCR4ZBlNt6kMwAAAABJRU5ErkJggg==",
|
||||
"ai.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA8lJREFUeNq8ls9vE0cUx7+7O7v2Ok5s49hJqZ3QBCcEJBoFxKWiooeqPVWVqgoOVIUDUtVLVfFv9NBTOXAAqT3AAQFCAqmiDeJHVR9AISJVfpQmJU5KghOcjRPvb3e8BhPw7GZNDE96smd23nufee/N7nDlchkb5a/0V8NypuMQGhRjeQ3mUvHsntwvx73WvRqPsBZt/+7jRuPj6dVRKH9MHhvDUWwGsVF4NFGin/RB7okdG0sdPfPWACzVgPpYcf6LOzoRPzLYEAQboOxf5y6NYPr0LeRvTkFIxiANdDcEsaUMFO7Poji5AIHjwFc0EgZJJSlEF+KHKxDRTSF4dqfavlQZf1wNzHOgP+CCAfDbohSiA9LuZxDveUMQ1xL4kPSX+2CrJpS7/0K5MQ6OEPAt8kuO40eApXMjrqeDDWD7I9AWV5G/NgZRFhFMx1C4kMXan1O0M2mGdB3ltRKslSJIIgwup1QyUaBm328K8OrLgiWrD+awNDwJ3qDBeB4ChQ4kS9CvjDhzYn8SQiYBtIVoqpII7+/Dfz/9PugrA5X6esmT3yawem8WROBp/Wlw2gOE0P8mEPn8fZjZR5A+HfCVRTaAxQawNRPzF0egz63QoDQgOHoC8Ex5SJl2cB1hiJ/tdvXh7xjaNlNXRnPQZgtO50uRIDq/PgAxItMxzUKAgHRFXW0d3WoGxNYgDVbdMQlJ0GeWwOmWMxa7o7537QPAYi7WF5Xquaca6mnH+p1pkEoP0F4g/QlXu8YBTLYjLVdNf+tgGur9uRqMEA7Qbpdc7RoGsBmOrKIGY15BS28C1oICjjakEBRB0lHwqTamzRYyYNbNrY8vgNAXjhQLQRudRyAdgTS0HVyL6GrT1BKoU3m0DXWhlJ2BTAOLfXHPcm2xBPW7iXzUCzWbg/xhN/3shphrmpcBvd45JwHywZTr8+ZmwGhegNcD0Axvo3eS4OUA9H9ma3NST5qekkWUVa0hAN4NwEvjJw47yrWEXpoTEts87fxnQHfPQCCzw7mxlEYnEBjoRXE4+6J3DMvT1j+A6u4kuCcDdXwa6sQ0wh8MQbl2ewO46WnrG8Aq6a4GocFdMJ88hfguvfelO8GFw3S8XCudl63vHrBKBlNJRxKkPeZ89UgsApteueS9/c6zKoDlavt8jb8SrLF30XpwCNrDHB6d/NEZJ7/5Am2H9mP5/PVa6dxsGyvBKtvJ8sXbyP/8a+35wqnLCO5MOeOZb3+A+ncOdrEZAHm2k/X8w7p1xkyhekm9/mDTYIJfAH7dejOvPa5+6n8BBgCfpiX4nmuUOAAAAABJRU5ErkJggg==",
|
||||
"dmg.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABCJJREFUeNrEVk1sG0UU/vyzxt41ifPjOJsfJ07jtE4axSEBHEGxS6sgVaKphEQRF4JU9cYBCSQQNw6cuCIkVMQhCLWiEgJxSUUJJcCBNGpom6pNcJIqbUpsUjvxT+K/LLOz9hJQ7NkFC0Z6mpm333vz7Zs3M88gSRL2tksfm6bqxWAIOtt24i62kytzZHj0uTO78XK4v69n3g80fOJb5oIT7yimLk8Qo2cuI3ztXSRWP/VHouGpyXPGiiT2NmMZnkyxPGKgYuYMqq657Vl4Dxzxk4lMwvEvCLBba0+QirN9QNWZ+E6InWO6SJj3V+8yCWytf6844Ip4srcGiwsmewshQT/5F8PTX8g5oZ+AxCYgdh2hvb2hv4gnBDgHjLZ2OhY76baEJs/98AnJh1erHoF0bFpxYCnhCQETD6PF+SdJJRLjhATKkTDvH4ACk4Dnsbdob+HdCl7eAgNhY7ITEtBMokwE2AQ2lt+jvVD/NBo6TtMo3F+cwMMHVwiZPCGVgVRIQsrFSW+CwDsIibh8NF/XkANsAuKhN2nPWd0U7/adReLhjbJ450Hg6uSYX2MS5pkECrl11LS8guT65xRv5gTUuQK6j3OZHMgxDWvbXoO1ZpCMrJrwOo8h26HBwCvnJb+tCV/1CCxMv4xHXeTNym+ivf/takcgyzSMR25QqXUOa8LrjEBlhzupB8hmlHEuJzHx/yACmcpv/9ZdZItrRlZnmXjdr6FUyFaUTDqGVu8LCL34FbmKm5n4kmiPwO5ORda7hRy2NtaQ2lwlWyEx8fq3gOFQdA8i9tsdzF35AIcD49UnIBXYDn1Dp6hoxVc1AtVsZY5h+n8mkE9jfvYSbhIptZ7+ZzA4chIXPnqDzg8PjaKPyNTXHyKyFqa602ffx/LCVfz83XnV7onQS/D0DOvNgRSpL5Tr+OiJcXLmd/DjN+fBC4JSA9gdZNEF9PqfoovL81QyjntLs3TxvsEgmkQPlhfn6NzpEilGFwEUb7fGpibae3uHcH9lXnnbm9uw8utNxKLLdM7bayiBFfL3Mq534Mmi7Si8vgHwNk7xqTkJSSWj3u/yWC69OKNaJwiCTXkPfl/9S/2QzaTgqHNQm1vXZzD/ywzVh0bHSBRa9dyECVpSqWMisjNBsBaTNIPOri7M/HQZjwdG1ArK4aihuOz2Bjo6WhE8drzoI0196NiCTfV+v/jZhPJXpB3wktAvLdFvtbVKFBobBaJTIuDr82Dxzm18efECnE1ORCNRZYtskuJTO4EYGhs4+HrbVF0g0E2SUMLQcDeJBAeetyFLvtusGbjddfD5RJiNSTx/cgRra1Gk0ztE342WFic4i1ygZvQQiKKhHkTse7RJWuW622UT+Y8TOHTQTrElnTw2m1Ccl2xjFWvcfQncCof/s4voDwEGAMErAZwENZiuAAAAAElFTkSuQmCC",
|
||||
"php.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA8JJREFUeNrElltIFFEYx/+6s+vOrKvrbrhr2y5526SWSqKLlRSFdPNJeyuiICKCguo96KXooR7qJYguFBQ9REUQiJhBGRlR2YXspqmFZeZ1dS85M5057pxm1ZyddakPDnPON993zm++75zvTIYsy9DK4TNXGou97rUwKP3DI+gbCl06dWDHrunsJq5HFdp26PTlRjkFqWtukY+cuy4T/4t6ANqWiTTKohI/Cpy5O/UgtJJWAGeOHRXBUkMQaQWwCzzcTochiLQCWLMscORkG4JIK4CZM8FmzWIQKxaUwqMDkZnMTk22ZWZkwGLmGITHRSKhA8Gl8qUj4Qjav3aj0FsAG29l+qetbfj09TskAiOKEmK/xhCORune6B0cViAGiNlBXYAJpQI/+gdx/2kLW7yx+Tl9JoTSZIKvwI3NlctR5PUwPyUaQhzy7M36xUlFYGK1Onb+Op1MmzneZoMsJdp9/zmAi7fqyIJZGA1HqW5P7UYEi/1/jaZuCsLRGELRX+AFIfmCFCjEvq2b0DswBIFEYDrRjcCHrm7wPG9oj4jy+ByuXPvU9d/IHujpHyYhFQwBeFxOyEna6kaAI8dKILs435EzDkTCqidLygqn/WqDAGYCYMP2qgr8GArhxoMXupP63a6ZAUiSxoAz0wiYOQ4uezbts1Dn2eFx2BGKxPCxu5fpIzERFlIVU4+AJoNmpbLZBKobicVoX/ulQV8++kfC6B4aZfoQKT55HD8DAM35DridcOeMn3kHKSgbFpbgcdu38es3W2D66vIAOvvIhrVwdDyxRhhLgfwnByZTBlnIynR23oyqBb5JtlaLCQGPY5J/intAxr+SKQFESfq/AFIcoHdgEE3PXzP9vLl+lBX60NreRd+tLg9S/e3GJqwi/VmOXNpXRRmvitsY+h8YIylQmnK53LrXRCIiY3g0ghMXruHNpw68bevAw2evmJ1io9iq/Z6+Qepz9W4DbjY8ZHaGUyDFi8mWNRX02fWth3x9JyvX2lTRf4D4eMWi+QjM9dFi1Pq5C5unSenUAKKYkIo79x8hHIngvTIZue8/dHyh/b1HTyakTfV79OI13pH395qfYd2ycqY3ACAlAEhknGW2YP+2GhTNmU0nL/V7ybiWvj9w/HQcQGKnSPGpWV+J5QvnM33SAGNxBzGet6qVSxPeKQvIGjvVVh0vDZah2OdNmMsggMjKcJFvNhurkkvuBM8sF9MrNoqtMtb2Uz6GqnO+Mw+7a6snTba4rIQ2Va/YqH7a/gwA/nMhqn/y8p8B/BZgAOnDW8QALqzQAAAAAElFTkSuQmCC",
|
||||
"html.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4tJREFUeNrkl81PE1EQwKfQFkpboEChUChI+SiCgCACUQMa8WD0YMLJBIOJEg9+oP4BxguJIRijMfEGkYPEmOAJgyhgjPINgQhVPhoQqEWFypcIdHd979ktbdnSblPx4CST93Z23rzfzs7OywoYhgF7ufmgvk2rjioGnmJeXoWFpZW6u1fPnd/Jz3k/YrDXG/cftzFeSHPXIHOn/jmD1te6A7BXP/ChpMRFgy5OVe4Owl58CqAIlkGGVsMLwqcA8iAJRIaF8oLwKUBggAgUcikvCJ8CCP39IShQzAvCz5NK9VT9BAIQCYW8IIS+zEDvRwNMzM4BjWAomobNTQusrW8AAwKQBgZgiB/I7bpbAMaLzQ9n6cD43byjz6PGlmyPMrCtW3HI3LwZosIVZL7ycw1k6AtIjInkDc6rCL+ZF+FpcztU3K6B1u4Bm31y1kRs+B724VW4nmRgaNQAHYMj0K8fs1oEoFFF2vyCZVJie9XZTzQnLRmydVrI35fmJYB1bO0agN7hUVhYXCbXCepoFDwJDqSnQliI3OYXq1JC1bULyPcTghwHw4yJ6Iu3PZCXkQrH8vejHiHmn4F3A8NkDEebnSouBN2eOJdZwm24pDCX6KRxDlre95E66RsZg73aeIiPieIPgFvr+sYm0DQD7T2DMI/eb3pyAoSQlG8X7PthfJJkbQkdz2LUEwLEIggUi10WNicA+oSJXD57BsanjTCCgk6gsWNQTzRJo4aCrDRQKkKJ39LKKnQO6WEY+bGiQU+Mnzxdm+AQ08Ma2KLVoiMWK95EP/EZ9IYpMCAYpSIEIpCyAPqJKZCg95yWqIFsVCfB1iwxbroKdwao7bgyiYQUFFbDzBeSWtYP94DjBTmgQ5vvFMNzADeNKEGtcvCTIoAUVKA0w7+Het0JfXaCchkpmv7vAXbvFfi5ygDWi7eqHeZTRhMZWW1oek3G6toGco/1W/u1bvNn17vKKjcARRF1nofKZVBZVkrmpSeK4GDmn8NmdHIaBtBBdQmdiPaCj2l2PRvDQwCaKJZ79c+IYhGLRJAYG0PmMcpwiI4IJ/OqygqYNn0lo2NHpW2xKIpHBizI2WJdUFKYR9TZjuvEYhcUH9lctcSusbgAEHIDUNuajrOdIkG3rp2fHsvDJ41kPJKbCaeLD3ECCLh+TstPFhX/jYqva3rTXnOl7Kj7z5D6x33gZffQrgH8FmAAw5hI/7HfF0AAAAAASUVORK5CYII=",
|
||||
"aiff.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABGdJREFUeNq8V0lvW1UU/jzF80hrO4OVMiRNm4S4aUoWBdLSigiJDUK0CPET4BdUAgkJRASsYIHEgj1C6qalKpuE4JAiHDokFRnstrRxbMeO53iKB859djzEz7Gfi3qlm+uce871977znfOuRcViEbVjdOK72fcvjZ2DwLFy30/Td4c+nl9Z+jjSzO/g90n5nC5fGoPg8dNdBHw7dv/O3uzI6W8PBVE7xM1QCp4UN/lKH0aPa+30kYEwPAUA4ZP9eXGoB29OD+HUsKFtELwACoWC4MlAmK16jJzqx/RbJ3Bm7Lm2QPBqoFgoCpYAS4NSKUN3rwESiRgymQRS2Zp90Rk4VBPSZgx0AkAsFkGp6oKlh0BICUSXlNZVu+OWrykIXgD5fAcAyqyJRCIoFDJKh67KhFRin3N4OBDkEmnNQF54CgrEwI1fVnH79laFkXyugN3dDIgGmIwKeyic/pG23mkJINcGA8FAHKGdXQwOWfHQHYSMClEiE0Mjl0ClktV4qoHnTZg804+Zr+cN/0sK/lnx4JbDjbHT/Zwvy7fVqsW2PwH/ZhTDo1b02vRtMcfPwF6+acDNa/ewse6jPMu5vDNfxoRrIwgLgdDrlbh31wu1WgaNVt4hgFw9A84/3YjHUnjkDiAWTUOuLFGcp2phviaTCsdeMCEaSROYJI4cUcPlCmFk1NIpA7l6AIsubHkiUKrlUCnlNeVa5HzjsTQ8TyJEuwFeTxx6owKB7WTDOW0D2DuQgmKToihQ/pkvoz6VyiEWy0BvUEBMpcgqYO+QVArSQKEJgkJZA4lElp44AS3lPBbL0trVUkuHM5CrDzSbdVxDSSQyjQyQbzSSon0xpweGNZ3OQa2RNZzTMQNTF09yayaTw+yv95FM7VVFSL5sTSaZLYfuHi38/iR6ezVPwUCWXzzU6nFhehgryx4SW6zEAPlSx4WKyo61Xu9WgnQgh1olaXpOSwDZFoGDxy1cvbN3FvONUmmGQxmu9i0WJa3Slmd0xEDtYLW/72ukJ2ZTSHwLAHk8q9GkD1SfQKdTQEd0B7bjnAjZOGrWIENKZ/8fNWvrYjefhLl9ubz6QopFU1Se6c408NrUAGw2IxYW3Fj661/O9sGHk/jD4cLjxyG8+954XexXX97k9mvHjevLCAYTQgCUyoxdLF4aMGP+t3W8cWEIiwuuujdmrlznn392reGM3ymGxXVWBZkSgPGJfm51zK/j9alBEp4aPm+kcmfYF9uVT96uxH565WqZuUFu1traB1DWgN1uw9/OR9QJS3l+2d5HtAcrXXCfgR++n+PWcDhZiV2iOBZbe56gMjTS03bT5ZLN8YljnP3sqwO4+rOzIQVrq96GM3Yo53z2tkV44mQPPJshzHxxnbMplV2Y+eYy9144CICv6bD9dpqRiO/H6Vm7+lyfzUT9PUsXjKp6920qunqzNZXKcraNNV/dGXyxbCzc2Z1bdn50vi0NPHiw3WDns0Wjybb8BKVg9WH2mXXC/wQYAD/xvI05S4jPAAAAAElFTkSuQmCC",
|
||||
"odf.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAz5JREFUeNrEVktoE0EY/iaP5mGSJqUllbSltUiKIohCTiqtBy9iffTkQVTw2B5EL9WDeKgUehKCJ0Fb71VELIiPYsVDBNFDbapQiza29hHTbJtsstldZ3ebTVJjk92G5odhXv/M/833PxgiiiLyZaKn443TI3ZCo6RZglQSD4+NTl/eSm+zPVMxJf9hXqt9/JoxIBqtvfT2nB+lQOSLARWUpq6j8LT5JBAPqgKgxtuG1tPdmkBUFIDBVQ9L8z5NICoKgFhsMHoaFRDdp8oCUVEAMJhAbLsUEC37ywJRWQCEAMZ8EKWZMBVPVn32F8dfYHXys3KBwEPkUhAScVjq6mCc+y2BiNHNq6UB6BBvs4BE/DkQL75fewCY/mg8WBYDog4GDEbA4dZ+cNsMZFjQlxNwtLe5RNjdG6U5SeuCTS8ADQ9hFonKWDRCMENDICNQ43a6aBRhdQAtewhMZg0AtLjA3VSo3MBuVEWrnBYl7ywLAA1osH8IMmmAT9GH1dBmoWs04JglAkEKenrI4gScDSLc3vIfURIAGyNILCsGpUCTjCcpmHRC0bNKRr3U93WiLgaLx4CQG1ppYFldhdvORhEsQ2Rm7NnIF/QFcVEAQhkvqHGIZetqd4FAsFNSnAEe1QVQfQaEajNQbRfwfM4Fzq5eODr7lPo+G0J8bADcQhjOTrre1afqJT+NIva4Xx7vvj1dcN/8Lb9GF2SU3n7orGx8MXgG3PwUPD2D8Jy/h4Wh4zT9FJCRm376+fCh8fprpCNhrL0flteX719A6ntI36eUzyhNMsi8Gwb7c0qeR5/egdHtg7klQAM1p5teimD1ZRC1J2/Ic0nqrzyCb2Babtn7NDCQcwGfYNS5wDAbaUpUANm9zfPZax35fzV9DETHgnCf6IVodslzx5GLEJIMkj/CaqZkdSW92PiI+lJza0Dd08xAhlP6lVcjsLYH0DYYQvJbCLa9AcyP9CMdj6uZ0n43LPfcSgRLz4IQuFwxy96jPQs4hTJ+lcHs0EVYmztgsLmQmuuVXSJRGp14AubLB/VM4mtIpVs6k5oLq/ds9dP5D4DC+fpM+F+dhQhY2or+kiZD26sDa+vijhWivwIMAKDMd2+CfSkwAAAAAElFTkSuQmCC",
|
||||
"h.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAchJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/6vm73yP1D/fEIOQMZMDFQEBiryDJLCAgmEHIEMqOoAQX4eBisdVZIcQVUH8HJxMogJCUAdwU+UI6jqAA42NgZBXm6oI9QYJIUIO4KqDmBlYWbg4mBHOEKXsCOYiEmpxGImRkYGNlYWVEcQCAkWaobAmRv3GO4+fcnwD+iYv3//Mfz684fh+49f4LTx+uNnkCM+AJUVEnTAfzIst9HXYHj25j1OeScgnrF+twFRIYBRWhGVAFkZlKTESNZH1URIDqBaCFDXAaMhMNAO+PdvoKOAYaBD4O+/AXbAiE+Ef+mYCplwOYAQXr/3MMOrd+/B7Gt3HzIcOnuJoB6iHfDv33+CeMO+o0AHfASzr99/yHDk3GWCeoiOgj9ERgHIVyC1IMP/k6CPcBr4+5cozX0LV8HZqvIyROsjwgHE+SQvOohBRU6GYfuRkwx3Hj4hWh/hKPhLbBT8B6uFRwH1HEA4KJVkpRhYgQ1QkFp+Xh4GCRFhovRRzQEpwT5wtQYaKmD8h95pgGYl4a7Tl+jmAIAAAwC4QbCaDpQyqwAAAABJRU5ErkJggg==",
|
||||
"cpp.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/6vm73qP1D/fEIOQMZMDFQEBqryDJLCAgmEHIEMqOoAIT4eBmsdNZIcQVUH8HJxMogJ8zNYkeAIqjqAg42VQYCHm0GcBEdQ1QEsLMwMXBzsEEcIgRyhStARTMSkVGIxEyMjAxsrC8QRvCBHCBB0BAs1Q+DMjXsMd5++ZPgHdMzfv/8Yfv35w/D95y9g2uBgeP2BCeSID0BlhQQd8J8My231NRievnmPU94JiGes321AVAhglFZEAHZgAlSSEiNZH1UTIVkJl1ohQF0HjIbAQDvg37+BjgKGgY6CfwMeBf8G2AEDnQj/DnQIIDvg24+fDEfPX2H4/uMHg6GmKoOsBKS837T/KFyNsAA/g7WhDl5xEtMAJArefPjI0DR9IQMnBwe4jt+w7yhDdmQAg6GGKpgNcgxI/OaDxwyv339g8HOwxilOkgP+QENg9/EzDDJAw4riw8D8LQeOMbx69wEuH+ruwKCmIAsWv3H/MYOXHX5xknPBo+evGNTkZeB8LzsLFPlVO/aDfXrr4RMGb6AcIXHi08Dfv2Cak52N4ev3H3D+k5dvgNHBxiDMzwfmS4uJMAgB2aa6mgwWeppwdbjEiY+CvxAXa6soAuP0CIMU0EAOoGOWb9vLYKqjwRDobAuWNwGyVeSkUfTgEyfZAUZa6gxv3n9kWL/nMLBt9xPsIBcLE7g8KLdgswCXONEO+A1sTMKAo7kRGKPLtxWkYagFAVziJKaBAS6ILtx5SDcHAAQYABHcpCu5tn1VAAAAAElFTkSuQmCC",
|
||||
"exe.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABG1JREFUeNq8V19MU1cY//XPbS30L7SlLbQpQoEodbCF4XQ62YMuuof9y97mZrLEmCVL0Oxpe3FPcw/GTJdsiXFGHxZ9kGWyLIaRGpBlKrouTEQHItWOP9VSKvQPtL0795SWXuC2vY3Zl3y595zvd873O9/3nXPulbAsi1w5cvK8p666ahdEyuyzBQTD82ePf7r/QD7can+0I1cPf3POw5YgV67/xR47/xNLxv9QiECuSvEcpcFuRaPd8lEhErnyXAkYtGq46xyiSIgmMBMMYdw/lW1/fvIMTl/6lfTPQlOmgrlCL4qEvFjHC9EYLvb0obvvOmptVTh6aD9u3rmPkQk/Vb1Ojxcb62BQl1O8Oz2MI4F8hVk0gXPdvei7PQQFw8AfCOLjL0/Qfq7NiUwmg1wug0qlyI4phoS0mErldO+rbWAYhaBKCQGpRAKFXE5JcJHIpMNuqhBMR8EIPJp+grINSvQODoFRKARxXAQGRx5gzD+NFCGcTKWwtJRANL5Ix8tlUo5EiEA7CxLIPSpOXPgF0djicriFCbDE4TXvXV5fx0vNaNtUn35HM77r6mkpKgKZ0+pfkutkijhetXKVksGBNztQX2PhTj+c6fYQ7CwPs7OlCXu2vkCwitK34YPJAAk7s0bf2dVOnXNSQfb+J+/ugVZdxsNscTkLOi8Yge3uBtiMBnT130JoPpK1V2g1vDN9A3HosJgxPhXI9nlHfZCQonRajOIjwOao02qCyaCjacioj6QmF8OR8wfneJg7E5PouTXMw4mOQJxU8e1/fAjOR3kF+Mfdh7SyNzttmAk9g8d7b90C3Wgzr739xBDgnvf8AbASKRSr8nlteJxqRnLtSkZOyTvMlaURIDuKCiOTo72pFn1/jxV9V6hVSrz9ihuLS0loyHtmLnERyMmYy2bE46dhWPRqzJPzYMQfyDuh3WQgp6GMKgu2tF2QSvJpv7bJufLlE4kjFIkJTjgdjiC+mCDRK+6iXZ9AnrxFEqnswVRr1GFzdSWm5hYw+HAaNQY1GiwGyKSSvHMUXYTryb4ttWSVURoJs0ZFsVXaMuxwVUO7fBOyRToXJJAsUDlGtZJqLrZcKS84TjSBp6E5PAmFebZGpx2PpmboOVCp1yESi9M21y+EL2EbpkPYTz5Afvb8zrOdPvoZhsd8uHx1AF91HsS3P3ZBRci4HDWCeNEEEssR4Ig0kBUc/vB9nq2jvRUD3iGcIs651X9x8APaL4QvIQKpbDFxDo6fvUDbNRYT3tud/mfZt3Mrvr94mT4N5HLixuTDi6uBZDK7HVVKJers1elbUK/N2nyTM/R5f+Ix3igCLy4FyZUUVOg02L29jWcLzoVx9aYXb72+A1cGbuDPkVG4XRsF8aIJLCVWVjTq86Pz2Kms7esjh3Dpt35YTZXY1tqMhVgMXb39cNqsgvgSIpAm0NJUTya2rLFta2mmBLj3jpdbKYZ7F8KXUAPpsGnLy6mutjmsVTxcps2QT/L18KIJeEcn8H/JfwIMAB89dfI9JzO2AAAAAElFTkSuQmCC",
|
||||
"_page.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA9JJREFUeNrElktoE1EUhv87j2QmD5uaVPsyrbXaGsXHQlBKoSKC6EZcVMFNi1IURBHBlYsorhQUXOnCF4puFNpNQRFSBR/gA7uxxSIt2oei1bZW7SPNeGfunckkpElGoh56embu3Nx8c/5zzw3RNA12Iyc7Yk3VoSY4tIGxn7pfQ3Rna7Z56d9nDNgd0faY9gcW7erVVl56qtHPX80FYHcBBbRttRXYsbquJReE3aRsD0nHePJmdATwBwCXag01hUTEGnzWfZVPwtrSSkiEtHRE25FLDt2yZ0AmQN8L4NUDoPMKMNzHxkyXSDK11Es8AuoCLjRHKrFrTX1emcgIoHEnsxPAIP3S/jeAxw+87AL50APiJobrAOZc3YrcAsp9IpYXyQZE87rcEFklqA4G0D89DbE4BH9lGK6aOngXl1rPS10khdotEhQrAgQ6rPvuyBKIVI7bWeSQMlcqixH6RsWbt0D1euELFONpLIYN4fKk5lQG+66SaD5VmhUCBiHSf3tW6RBouTkPhDSfBLrVU4D6+lprfLK2BkO9vdiyNmLch2XBmqvH690f0DUwigSliieAqTkNkzMapmfmUFHkaxmKto/RaUdzAiQSbNmwkkzx6+FR9H/9geHx73g9+BBlRX4cb1xJ58rG80MblqL708S8cratL8PWG4/X5ZWBBI8vB7/g+cg39Hy2Laz6jTAyA9x79xEHIwHjfoEio7Eq6Lh3ZK2Bge+/UOJTDM9ktUEV6Z21IABzfNHO7ctyLjD3NwH+hWUG4EV45s592vFokUluFkX9Wo/0Y4JIo8gioftPoE4IuwYx/szYsNhL3eM8A4/evqfdRWUuUwiXm8FINhATRgcwYAhzG0SFR8bGRQ4A4pzg7vF9BUt1fB5dMwLM8rnPet6lptpIs5CMREi+sfXWtvbMryu9suH5A3Da5rP0BPTQ41b1Agp1N02jS2FS6JJkqol0MGpHIiEcXhVyAsBi78XTBZPAXDM/AL4LXrzlEghiWqEJ7LgjGSrfkoBYoVyVUe5xIME0l6D1/GXWenUZFI9NAoVJYO0GOasEbXVBtK0I5g8wwzPw5ELhJDDXzAtgKv6fO+EUl2D7sRN8F/jYLlBU9qPUksCVuSGZEvCtuLdmoeGOAU4d2J/aA1L2f1oPMPuAVX/JfrBIkaw18wL4GWe/CGrCSwqWanNNRwDnrl5jle82K5+nXrZVv5X6tPTbzoNNJT7qXicALF1V1ctSt1tK15N4PxBTT0Ir/cRSwUNlNNfMC2CST27c1FAwCSadAEzMav93G9563v3PAH4LMACMNVxnrM+YQAAAAABJRU5ErkJggg==",
|
||||
"png.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABJFJREFUeNrEVu1PU1cY/92+UAoUyltrgGBJ/ACDuErETE1Gu4Hbhy2h++BXyx8gs/+B/gUy3Zf5BV2ymS1xa40f5tBQE40IM7l0Gyhmk4EIGsECfW/v7Z5zb3tbSN8x25Oc3HPPec5zfuc5z/M7D5dMJpEt3JdjU9rmZhvKFCEchhgKXcWly6OF9Pbup8mlZDhxotz9EV5cRPz5c2di7CyKgcgWFd6hDFi6UGeod2Ls7MT/AqDP1IpPe3rKAvFOAXQYG3C8ox2flAFCU+4msSdPEH34UOrr7XZoLBZlrrG2Bp2NjUiH2e2FBWegSEzkBCBkRaq4tYW4zydnCJ0w7Lkp9auHh8EdPKjosujWa7VoNdQhO86LgSjoAeH1awSvX0cyGs0MVlVJn8i9e4jxPHQnT6Kqr082plajVqeDaY+d2wvzeUHkBCCmT0Wb6R0OhG/d2g0irRcKITw5Ca6hQfKAZ86H2aV/IIgiookEArRmIxBES00NAsEgiwk/LXMVBZAmC66+HtEHD5AkgyD3MlF3dSG5swP9yAjE7W0ZGOmpm5rwC5ERorEsb+mAJtaaUE3rItPT1pI8kAYg7gSQWH1BhrRQkRFxcxNV5PL4n38gSlegGxratU5dXV125qjyBaHUAjvSybUfDkLzwXEKQiOSdXVQH+mHsOVHbH4+o1tCKzkIReZy5onaWmiGToEzy2GlOjogz2k0UB89hvjsDCV/BzjSq1Rye0BMSk3U1yDZ2qr8o61d6Sfb2sA1NyPx+LEyVqyVzgOiUBr8zk7gdx+ElWWgvb0iD+TmgdQVFBUKTGiJF549A9bXAYoPGAzEUhSMFC+VAxCKAGCpx0796pUUD5JQakptbU3+ZyC6e4Ai8ZHHA3uuQKB/P3FIKCxvEgrK4yluyH0IQfZM73uUn+oKPRAnUiE6Br0HkkFlVYlvGDsIW28ylwsgIX/fvgWI7cBxpW9ayF7pAITMSVlg7UeYDUGoEIBeL7f9StkAErLLrEQ0Rnpemfgp8vmNDalvIxLi37yBPxaDhdLOSK9meo71rS0tu/TLz4IUgIvE/7Ysghn3zcF1/z6mPvsc3persLvdcB46hEFiSLuH+t3dmPjoY0WfgWTj/hxPeeGakAFgjR6QC4+mwV36CqOTv+Lc4fcVcDba1GY+IJMW6VmNjdLmLnolmf6R77+TvGMzmzP2SgYQj8uNDLPTnR84hjNEKkvbW/J46komqCyTUpb0Rqg29K6sYPy3WRhVahg1Wjg8HvBr6xl7lXjAQsXGIF2Dn4oNx40byklcd+5Ic2d6eyU95gkpXmjeShQ9dfq01JxUIe/LA9fm5mD/9hocP/4AfnVVOcnS5gbGZx7BQuUY03MvLMBqMuFcfz+8f/+Frq8vg2dUza6ogAc0eQHIpZGcQrkWJwRcuHsXThYXpMe/WMHozz9hwvEFLg6fkkESfbupesq3eX4AMbmuc930wB+JKP9psV+5An79JV1LhPrfKGuuzszATc+z9UAbrQvT/a9VmIYpxPzycs5p7+LTTKrt0fHTWu/2033WA4kE/iv5V4ABAGwMbZQpCDPqAAAAAElFTkSuQmCC",
|
||||
"iso.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABJlJREFUeNq8VutPHFUU/zGzD7rLwuyDXXZXyNbFgi0qmEKgD9rGRyVE8RETTfygif+A/4Dxo99MjIlfaqwxmmg06SOWQGpolNoIDWgToKWFAi3v0h1YFtjd2R3P3JVlhtmls6vpTU7m3jPnnvu7v3PuubdElmWoW+9XfJ/Lf+IkCmzJhIjoyt9/UffU6Q/TYj673esxhVp6znB9chHt4dwVuf97t0zzh0mEvQCohctjVpR4vI14qra9kQZ9e4FQNw7/YyuxeOEPdRUEIg+AdBEio8QsgC87mAERNgaCyxOowoVAlPB2cKXVKhDHHwnClJ+B3E1cGsH9m79AXByBlIhl9XahHC5/CJzFk9X5QyzjG29P/K6AyHk6TLkJSOVcfOrGN5gbv5SJN4nZsvNvM3oXCNQCvINA7CQzYdoG8TV93zDGQA4A90a/xcp0N6zWPHUgCUQWfsOkUglkCXI6Tm5ikJMifXnYbcLrPWfEz+jvRwYASJphTByDOHsJFmv+ZDKZHZCkNUTu97Kx78k3KSz12f+VdcD1nq5GgwxoAYhz3bS4toJtRKNYi2RCWu4UYHM4qOfacZFYgNP3/iOPbu4cSCe19MYGYS1VMbK2jo1NJ1pe/YKNhy9/DN60SEAqsjap+AhSyVVwvK1wAGoGEhs3affanJh7GMHzL3+O20PfsXFzx6f48/xb8FSVaeykrUlYbPVFMCAnVGwoCaWlP01JZbWV01EcY2PepLjhdXZsrsqXcQZUITBZqpCMax0r+TA+eBatnZ9QLdjAzOgFptttx/HlGl8FhGAHNcfxVJackOKRrE5we7E0cw6LU31UC8qQlmbhDfiQiKscW53sZKAYBuS0dpLgewHzd37U6Jyeyu0sUQ4ZvQe01bPC16TzUwCALc243NOApekr2FyfN3Qr7ivzwx1s1/kxfhml4jrZ3/Ae5YOX7XQvUWwU21w+CkhCPXKeK8GB597BwswA5qcGkZK0DnmTFd7gswiGjzNbGNh9/hCkNnPTRXwFQs3w0UKx6CJWV+5l4u2uht3hA2+2sgso3/z/xIBmtzzlheBlonnGGdy1gSTcxONqeUIQ04z7Ln4Jrz+MA8+0o7/3LJbm7hDlLjQd6UIwdIgK0BaGr13A3VsDzH5/XQua2l6DWX2BFHIKlBiqhSihkprErRu/0kX0AKc6P0BlVQ2G/zjH/g9d/RmRBzM4+uK7TJS+otP5McyAtK5/IVFREVxeJBJbjIFgdRihcD2znZ0eQ8uxDgSeqPk3h9ow0N+t82M8CVNR/QuJSmog6MfRk6cxOzOJkalRepdxeKnzbTr/WzCb5Ow8pa/odH6M50BUdz0rT6zBqz1seLj1CC1wEOd/+oGxITidGB8dgsfjYP+VvqKTiwewupsSUsbhD7hwrX8QYmSFQpGE2WxGRQWPpw/VMv3l7ouZFxS9lNqONefwYxhARDOuqRFgt5vhqSxF+4kGLC+LtLgJgYAHJm4d/qpSvNJxGNPTC8y+tbUWNnupzk8BAJa1AKoVM4np3fTsc7u2Xz7rpMsk2j46cfV1en1RAEYnJh5bIfpHgAEAxCmxxOZWjoQAAAAASUVORK5CYII=",
|
||||
"mid.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABGBJREFUeNq8V9lvG0Uc/tZer4/Yjo8kdmwnjkRKTTA0avJACOKQKlr1BQlUJISQyjs88CdwvCBVAgEvCInjgaqtQOLBKoIXqirlUqBJSdUqiZM0zeEj9bmO4/XFzBQ7Gx9Zr4s60njWv/125pvvd8wuV61WIW9PTH72S/Bx9/NQ2WJxEbGY+PXCX2+/eRiucT2+Fej9d19Uuz4uXppHKLRwNjjxKZRIyJumDU/Vnf4+O+2Fb9BISXz1QASqFfWdMjgS8OLllwLwe00dk2jpgnKlotoF1Lcujw39fQYIAo/vf7h1FlB2B99agWpXBEw9ArzDTvC8FjpC4tJ3NxVJtCRQ6VIBTsMxEoM+O7S8Bq8LWly4uHAoidYuKHdBgKjG0aDiOBiNOrgGbeC1Gryh4/Ht+fm2JForUFbvggpR4MfLt3H9+lZdkVKxjJxYwIDLgpU7GRqYKXLrHUUCpQ4U2IlnkbiXw6MBN1bDO9CRNNDqNLCbddDptPtAlxl4xImpp0bw4bmr4/+LC24tbOL3mTCOTfgZtkLkdzpNSCby2FhN4thxD1xuC7pOQypdu/ZT6AaWFqMwGATmd4oVswWsryXhHbKBIzFwY24bU9MCwfBdEigdVGD2jzCymTzWwnGk03swGIV6vaBYu8PEFs/lJOj1PMxmActL9xB4rL9bAgcVmP1tGVubKZJierK4XpauVYbNZvcQjWTgIyS2NrMYGrYhQdzROE/HBIoNLqi2SYoK8T/FUn/n80Vk0gX0kN1zpMAX9kpN83SugFRqSrHWBavKsKIoIR4VYbEY2M6tVj20Wq5pns4VaJBuYMDKUkskOd2kAMGmU3lSfHgmuZYUH7rzHlIRi926oDELnjsxxkbq65kri0zuehASLB0zGUqOw6DHgmh0FyMj1kOz6XAF2khnIBF+4uQY5v5eRzyWu68AwZJNkx3rGIHtLRG9Nj0EHdd2HkUCksKDY0EPi3pJqjBsmgRfMrHHDiKXy0jI8IpzdKWAvDlI7tewdpvAuprnFQiU8bBamzqwvwOr1QBrrxGFQpH4XWz67xuykzHLsP0D+/Wf2gqFrmOgWL8+GvDj6WdGySt3Ft98eQ1Pjo9iYtKPu+sJXDj/J145c5yNtNHrWqOLU3ssmlFPoCDzIT2aacC53FZm7+szs/+0CNVw8or3wXshNp55dRKnTgfxxedX1b8VF4m8tU6P23xeQmQ7Da+nF/4RJ1ZW4uyFg96/XzdKrMuf/XVmiWSE9cBcnbtAFgOV/8778HIMw34nyfMUdnMFZqvh5IdOo00+V1dpSBWgu11cjODkqSA5ZqN1Ww0nJ1CzTU2PkpMxqZiSioWottidtR14vHZcDs3D63Mwm9SCwLmPX2MjddsnH/2sWJC4Vh+n0+M99Y9Th9MMk0nAxt0Ejhx1s9FIXkgabbT5hhz1eagtvysdmPvaXO7KP7NvvaAqBiKRVP365sIGG9Pp3SZbo/2BCtHtVemhVcJ/BRgAbVC5kaUn48MAAAAASUVORK5CYII=",
|
||||
"gif.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABB1JREFUeNrEVu1PU2cU/11u6QttoS0lOG2kTbZElA+NCXGDD8I2ls1sCc7Ez/UPoM6/YNsfYHS67YOZgU/6bQO/zIwPlMREQzWpjIljcTA0GpBq0ZbS3red597e20ILvX3JdpKT3ufpeZ7ze87zO+c5nKIoKBXufHSmtbNzCDWKlM1C3tqawJWr5/az2+3PUsnIPTBQq39kl5YgLi9HhOgYqoEolRY0UfpDIbjb2yOIjo3/LwD6urrwWe9RuN3mQTQVQMDbgROBQ/i0txcukyAstTrJP36M3N276rdjeBiWYND4z9PWhsNerzH+dXExkq7CiYoApBKmypubEObntQzp6ED21i312z4yAq6nx7Bl7Ha0tqLL7dL5bgrEvhGQ1teRuXkTSi5XnLRa1Z/t2VnkEwnYBgdh7evTNuN5OG22kpzTYNzeB0RFALJ+KnJmP3UK29O/EYh8ud3WFrLT02pkWASmHs4jvvIPJFlGThSRIeDJdAZ+uppMJh1RomMpWnahKgC9WHDt7RDv34ci05jCy4SnVFPevoVjdBTSy5faArLjfT7cpmKEUqBWioaPqQ+2UBDb9+6FTUVAByCTI+HJE9V5S6cPcvIVrBRyYWEBudkYbB+P7FjH2+01Z07LXiRUNZ1WnbeePAnL+x8AzjYoLhf448chpTaRf/SoaGtCTZNQpjtUI9HmBD80BC4Q0E44MKj9Z7GA7++HMDdHyR8A53TWXTsqR4DunKlM5MHBQ8a49Fuhb67TD/HBA2OumpqvA4UIVJWewwDVCOlv4kkwVFcEKtcBWTK3mtitZsfyMrCxQc+oG1SDqUQSGT2eBgBIVSLACtPTVWBtzUhPMMIyxQttbCMQ9CagCj/MRUCiMaUkWJ6/fg1QAVJFd77XHn8tAceOEXv5OiMgUFHZSJLTVxoIY5XJN4xxaW0d6O6uFYCo/bLTpkg5zrzT3cKV7GcegFQ8qdPVWJPA9pCkOgE4HJo2KjUDEMtD5qGXMez3I0UZkEgmd8zFnj9HkFKQqS4rRFqm9aXhLgCRI0cw/uFHO+a8139CmLqfmc+/APfjD4i8+x6+pvKsy7fxOL6JzzUOIOzvUp1foAbk8sOEOp45cwZD3QfUaBj2herJXfmuCZVQKAIYDWk932XqCzx2GzxEqtNTU1h5s4kg9QGGfaF2KNHzGpCLFxsAIArlNYHmwt53MHP2rBbiO3cQW10t2hfshm/cKN+j5rZcEAydXFxUp76iHiBGj07o+6vFIqPnN7MtXAGzYVq6h6Hmr6BonHj2FOd++Rnjp7/EpZFPjPnJPxboShxFez3VBKEJHMjvbEAnqPGY/H0e4QMHkdrOIvFCe3A89OoNX7um2k/ENZvda+skYfkpUjQXe/PnnnMr1MI3rx8QRfxX8q8AAwC7ohz5ZBJ6IAAAAABJRU5ErkJggg==",
|
||||
"mp3.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABK1JREFUeNq8V2tMW2UYfnq/QKEtUFhHYVO2OWTCBtlcWJxzc7/NFhOzuGT+nxr9Z6KJhhhj4g8zSRZ/mBmjJppopjH6Y0NRYdME5Coy2oIMxqW0SGlLL6cX3+8rLb3SnhPjm5ye853v/d73+Z738p3KEokEMuVIV+9PbY82PAmR4lrzw+Xyfzw5/OILu+nl+lMWUup567xY//jiyzH03Zq80tb5AUqByBR5EZyiL/Z7vKsRrS16BuJGuQAKMpCIQ7wQgpbDVrS01ECptF8BymOiIIBYXDwCFtv6PUZYanVQqZUEYqYsEEUYSEgCoK9Qw9pkJudyqNUKIuVeSRAFAcQlMiCTyziIhkYTFEoFlMREIDixK4jCIYhJAECsyVhWy2TQ6VSot1YTCDkuX1bis8/HioIozEBMfAjixMAP309jZGQpzUhUiCHgD8NSX4nZv72sOjZo6pWSAKJlMOBe88HvC2PfQ7WYc7qhV8mhoPemShVUKsWOIjnHwzU4eWIf3n3vl47/JAR/TT7AbwNOtHc2w9ZsppxJoKZGD9eqH4tz/6D9mBX1DQbpfYBRV0z6b09hcnwRWq2Gx53pMiYcdjcabUbIKAfGR5dxsltNOkqJAKLZDAz97oRvM4jlBxu0Sx+0lGSpfsF0TWY9Oa9GIBCBQi5HZaWaAHnwyOE6qQCyGRi668ASOddVaCjDNRnlmuC6Pl8Iqys+NOypIoAB2JqMWF8P5tkpG4CQE4JEkaKIU64wXRbv4JaAzc0wKmj3MjphwqFonp3y+0AegMIIGANM10+ltubyw1ClxaY3nC7jmFQAESGaNa6zVEFJpcUc5TLAdN3uAJWenCckwxoKCcSEKs+O5Co4fa6V31msB/pnEAxGdpKQdCnxsUUhoJWoqdVT/EOw2Qy7VtPuORApjFyrUeKJpw5iamKJKA8kc4B0FRRzQxXFnj4vPO4gqo2UrFp5UTulQ1BiYWublbJ+k/TiXNdLcfd4Qqigg6iuTguDQVXShiQGMsVMtZ/SrSKHJqNa1PoSAGLiDyPxS3brA9Ht7K+ERqOi0gpSjYfyxo02U3pN6h0TDeVKncVAeeJDOByVngOXnj/B78ND8/jx9jTOnW+FhQzfGXBgkA6ji88ey1p38+sR2GdcePnVs3zMnH94/WfelER9FUcEgV9MWLJ1djXzMXOeOi1T859+chdv93yH8bEFPHPhKHT65J56r/VxJliuZNorC4BAyIVt6uZm1/h9r9WIlWVvGkBqvu3IXpw6dQCPtdsw+sd9uIn2N1+/iasvJVlwzKxm2SuPgYjALyaBQBjLSxt0wJjhdLp2GNie7zjahNNnDvHnb78ZSa+99v4t/q7loCXLnug+wJw57Ks4+3Qrbnz0K7ppt0kASZ3rvX1wOlxp/a7j+/Hcpcfxxmtf8bGF2vhoZF5kDpDxlAPm7P68hz9PTy1lMBBNH90pfXaNDM/zVt3zzkU+f2fQnmUvV2SF/px2d1TwP6eNNjP1+Ag3yJ7t91bS79Y9fhw41IDFhXU6iiNZNnR6NdfLnRscDfRPDF09U/ZpODu7Q63Xu5X37s/JxYK7inijaX1JjWhhRcD/Jf8KMABvVrSjMVvF5QAAAABJRU5ErkJggg==",
|
||||
"mpg.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABIhJREFUeNq8V0tvW0UU/mynTmzHduJ3YioSx6nrhqShSCxK0xYhpILIgkplw4KyQmKDWIEEy4LCkh+AYMVDXVWIBRQJAlKrFvUdJ3VDguO2sX39SMCO42vfe82ZsezYiRP7tm6PNPLM3DPzffPNOTNjTblcRr194f/st4m3Jk9CpSVCcVa++Xjp03f38tuO19XMafzMJNTbTYg58ewMzqEViXrTolNGCxs65oN7fODszMi5rx+PAJNJZWHC2ob6MX56Ana/o20S2g7hczPZTHAddGHy7RfaJtExBVjRG/bB4jLDrYKEtoP40Oo06DHp60gcaUmiKQFFKasuLL00Gg20Xdo6Eu6WJJqmYVkuP1IWhH4M4f61+7yuyAqkoozCfwWYnL1YX1ljJNbJ88OWBBRFUY3vfzWA9ejajv5eL+AIAsMn/Jid+XXyiSnQ1d0Fx6hT/bimCshbCmxm8pAKEsyDlj0nyqVy2EhlkaWSS2ahlCtxUS4rCBwPwuyyqCAgbRG4NDML9/MDOHRmgrfTSymwYye1KBBgjgNnomm+bQqBFTYKtAAZOkrJQnaT93sODNAZ0ftoCvTR6SaEEojP/YzihghNt44mlXld26PjAEY6gAbGvXCOung0ugMDuHnhGv9lKvBMkZX2CciSXKvrCNBKJLKxf2F0mThg/7ANPX0G2EYcHDB6NYKDp8YaxvPUJNDq7Vc/Z2sCpS1nBvrM1BBWZpfx7AkfdlOsfkwlkBUYrEYeEx5SYvv3vbegzpkdLA8vR5GLZRv6G8BotSLle2o5ifXVNR54D25HEQ/HuGIu3yl1WVDPtsdmxPz5O7AHHTtWIRVKSNxN0OGzgoWLIej0OoibIsxuM4xWE8S8yMnttvrdCRTluoyQ0W3u5nuZuitwkJyQxVo0g3QkjSIB6un70IvDcAU8sA859pxPNQGD0wRJlLC2lIEwF4fM0o2yQLNPC6u3D94j+9G/39YWWPsECLDeRqcDSC+m+d4yJQy0LZZBKz/9mvk/NgGp2DihlmR3jrla+nWMgCzKlOc98B728vbS7NKO9uDhQRjoLGBWomBcvbXKj2xmZo+Z4qFCWAgLyMazKhUgSfVGPXxTlbyP/hWl/bbW2uFfwhibHmsY46SL6MpXVygmvJh4c6LWz8Zc/+46EvMJNQRKlDqV1aSXUzDZjeilO53V7T4H/86JXAzjHhX7iB1H33sJGnreMPAbP9zAA/YuIBubfg56eqBUx7StQDWahXASvfS6sZCsrF4hUCEXoDcAK8xSi0mYHCZej1z6h/8GXwvyO6OYE2tj2iNQ2CKQmI9j9JUDcPidmLswxyet7nWS9le4J6CULyFyOUJKVQh004o30nm6H4IVP/JhcdP2m1DaLNVSK0bB5Z30QlhI1PrYd2ZxInf7/C0s/DTP3w1MBWavf/4GPIc8+PPLP2oPnOqY9hTISzwTqvVMJIPYnVhDX+XOUGr1qn3/zrc4+v4xTH1wvNZ3lYJzu1/VNM3+nNK9fhJPwJKLwu8f/f3Jy60VyJbwtKwpAXaHPy37X4ABAGC+9Cq7Qyj+AAAAAElFTkSuQmCC",
|
||||
"ods.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA9pJREFUeNrEl1tME1kYx/9th06ZtpRKay8KGimoq0YFNiGbiBrfWNR4SZQXozEaEx+8ZB+MMSbqmxoffdjd7O6DWfVlE5UY3WSVmjUYucULQrmooBbFaqAFepnOjOccoamAOFOrfMlJ55zvcn7nO9+ZOdUpioJ02XJq8W2r3bgGGiUelZCISX/9c7xj13R2E+fjpjIqXTlL6/zofzaM8Btl5+aTi/AliHTRI4tSVloBt8NNIf6cEQCPfS5WL1+rCSKrAPlCAeY7fZogsgog8GY48lwEolg1hH7qSs2gEb8czgiLyUYg3GMQawiEa1qIrGZAr9OD5/g0CB+qWCY+D8FlE+D/tnp0vGiDrMiQpCTiYgzD8TBsQj5ChhCFGCRmh74JwOy5ZgwMP8BAdIKC/9gWFNjQ2fp+hboMKNoBDAYdLDajZj9OzetyOhHjMqIjJN3RJExmDtZ849cDaJHBUAyyTKBlBa/7RvCwYYBASeBzDaQWFAhWDiXLCmDJM2oA0LAFTq+QenbDjEKflfmbBE5VzCkB5AnGsqRgNCIiKcosEFVzOXqMhEWE38eRSEiQRAU5Jj2cnlw455gnxdBWA2nesVEJQ6E4jCS4Tq9js4+EE4iRzy8F4wUDXEVm5NmNU/pnWIRpp4js5exC4RO9zcGzwhPJyvPs/CSfrz8FKlZgImC0aVmt+hqQ8d0k4wx8UwB5pgEkaaYzkAZgyrFiTn4JomIEwcGu1LiXjOUSHZWJOrvZg1mCB6/IWIzoMt6CH+f9jI3LD5KJLKzf87YFfzQcYUE3LD2AYmdZyqex9zouNZ1iPtsrjqXGz/v3oyfUou1GJCUV1ujk/sAlHLxciZN1m2Anq6oorGY6eu5vtP3OdGdu7iATV+MHVxUqiqrh77zMxh+9uoNVvm2peKozkCTGJa4ytvK6B7+xsYGhIO49rcNSbxX+e3KRAdBMUdveUABdb1rgsfnQ0FOHreWHCKwbna+bmU8yqWjMAKmB8TrgDWbWp83EWdinmj7TX3LxSenG+4H+Zpy7uQ+tvfXwkS3aU3U6ZaMegHx02l82YTQRwZbyw6zvtfpQWVyD1uf1rM8yQAOP6Urd5eh9G8DRmguoXFCDux3X0BFsQqmrnNnQpnoLxDHji3fPovanX/Dr7ibWpwHvtF9legqwvmwva+w+GLiGxu5bLGO7157AuiW1bPzfh3+n4ql/D4w5+B9fQWPXLRQ5FmI0HkEf2etxueA/Tf4HfDyG6Trq09bXCIfVi1AkiFA4qP0YJtKIE+IQBofvT7Lp7m//bNDgu5esZfwiSpL73feSDwIMAGIj/teVICR3AAAAAElFTkSuQmCC",
|
||||
"_blank.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWBJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/7vXLzhP1D/fEIOQMZMDFQEarKSDBqyEgmEHIEMqOoAIT4eBl1lOZIcQVUH8HBxMogJCZDkCKo6gIOdlUGAl5skR1DVASzMzAxcHGwkOYKJmJRKLGZiZGRgZWEhyREs1AyBMzfuMdx9+pLhH9Axf//9Y/j9+w/D95+/GP4zMDJwc7CDHAFSlkjQAf/JsNxGX4Ph2Zv3eNVsOnwmgTgH/CfdCRxsrAxKUmJ41XCys9E2EZKVcKkVAsSA/0Q7gFbexeIxuobA0IkCYBYe4BCgVSr4T2wI/P1HI/uJTIT/hm0iJDYK/tIsFf4fWAcQHQL//v0f2ET4h1ZRQHQa+Pt3YEPg798BTgN/aOYAYtMAraKA+BAYtmmASAfsOn2JJg54/+krhhhAgAEAOOceVk7I96wAAAAASUVORK5CYII=",
|
||||
"py.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4VJREFUeNq8lttP03AUx7+uXdsNEQe66QYqsInKRYlX4oOSKC9qTDT6YrwlPviiifjsg3+APqgxSmI0mmCMRk00EC9IYgQ1ireIQryAoEamwBjDXVhXf+0y3KXtWrZwkl+6/nrO7/fp95ydX6cJgoB4O3r6Smupw7YeOm14dAxDXt+lk4f37FfzS95Pmogf9acutwqTsHvP3wrHGq4JJP5iOoD4YUAWrap0HmyWvH3pIOItqwAFedNRU+7UBZFVgFyzCbaCmVgjQczQBEHr3cQ95EHL81cJczkmE0b8IThmW2CZMV2aW1PuwrPOTyIE1ApTF8CYP4CjJ85L12SzWCxYXb6QwLATc1ogDFoqNTZ6fw6AYViwbOqgKBoGwzQwNC1BiEpE0+FSTYcuBQwGA5zzHAlzfzxeaVAUhZddX/HlxwAiBJbneQTHw/AHQlJtDHp9IoSHhBxJC5DUKvDdPYizN5oxODIqC8YQBcRNyZui0DZL8QXO3XqwTJMCyd3q3edv8JEiYxlWVSExqsRu1VXUmlJAk7wyLJPWr6WjE3fbX6NuVRU2rqycPECyApSBAsdG355jjNI1EBqfeM4xDLkPSQqIfo/fdmPDiooMAJLuFy2wo+NzH4KhMKwkzwPDXlL5VII/y3Kqa2SkgFhc9Tvq0O8ewtOPPfD8DaRdOOXUywQgZoWk0zFffoDlONVFa6ucmQFEIsoBRqNRyjNDU8jPNSc8mzMzF0uKrFIzUltDQw0IqgAsFy3IYfLXnDgPWCMoAmUkQ9BcAUoK8Mr4ZrI5FwynzPPieZBjUo3VDqCSvxULbPjpGYN/PBHCYmaRn8OpxmZchDGbm2fOqPLTAvCRCKbKNAP0/3LjatOj/82puAhrqytw4WYzttauRRm5/xsI4kzjLWysWY7qxa7JfxNGIkLK8JHm09XTB9f8QnLizcb99pf48LVP+t3Y1CL53H70RPpYWVrmlF1DswJhGQViqmxaV0PO+CC6e/vxm3yeifdtb97jdmsbHj7tQP3enbLx+lLA8zKqRBc9ePyEdDWRv+PqysVgjDR2b6lDw/U7qF1VjdIiu2y8ToCIIsChXduibZlIbyIdUfStcBZLc5WuYtlY3QBhXi4F0RwWO+yKfqJPODsAvEwLplFC5A0ryCs+E33COuTXBWDNt+DA9s2KG4jPlGKzUgNT2ojuv3g3ZQD/BBgAc9DojqN2L1sAAAAASUVORK5CYII=",
|
||||
"otp.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAz9JREFUeNrElk1ME0EUx//bLW3pB7QULdJCqImBkpgYSYgnIokx8aJBbiaIJt6IB6968CSYeMSbJCoevMnBRBMS0OhFqzF6IEBiamMoVMSCrS277e6Os9uvXah0tzQyyWTz3r4385v/zLxdhhACdXs73PPK5SGnYbBlOQb8Nh4NPFu+ulfczvnMlYK6+0Sj82M1YkIi0XzlzcVuVINQNxPq2AKDA/AEAzLEwwMBsPiCCF44bwiirgCmJi8snaEChF8XRF0BGGsjWHebIYi6AsBkBtPoKED06oKoLwDDAKwKoqMXXVUgzJUva23zr7+exe+FL/kBJBEkx0PKJGFt8YJd+SFDbNGXN6oD1NB8HRIyyRdAsvL75uPA8if2hC4FSA0KmFjA6TaeuG8FBA7g0wxyPIHFDtjd9QAwsJDUOqMoRsAgEQMi9AgIUh4GLIHNCbR3MrA1GgAwsgXugDb4EFeoijblWlQdUxcAPdDgNhkI2bI6rJX66IFLJ6hfoDE0qYGuurmNwO3Tv4iqANkUg9QqA7OdKAdNbtsUJpvJx1lcgNdHYG8hNSlY+QxIqg+Mg8B7TDuii66So2AiDzhaya6cfR9CSccKLE4a5NQXa3wLJAb/q1VWQMTBAhy8AtJBK7BjC1i3n/YAxK0V2mP5xLYQTLYm7Z9x9L3GL9FCIcQXjQOIYnkLms7dhOPUaMlOv3uM5MtxuM/egqWrX5O3drt7l78Yb2wLhPyz4UhImXxjagT8tzCswX60XnuC9McZ/HwwosT47yyX3heLUGr+PpJzk7CfHIJn+C62no/XpoCz5wz4SBiZrx+Uui4/ZdtK/dzKkurMMGXV5OpIFXAOXoftaD+EzZhGUX0K5Iq3gU5rc5Vs5fNCbdmv9smKlXIogNnjh5VCCOkUNmbGNLG6/glFId9Tn+dgaQ/B3jek2PJTtmV/MSavWDlHBkiGZxCbvIz41Bi470uaWF0KCAViIbqIzflpHL40oXS5yXYmurircAkqBYjKrukairnynq09ncDG7DQavH7kfsWUrv7OR++NgqfnoZgTp/FiJqUZY68/nX8A7LDjMXDxWOU/ooWwxk5HlvZfiP6kyX+rhH8FGACobH4ptuQwXAAAAABJRU5ErkJggg==",
|
||||
"flv.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABFpJREFUeNq8V81vG0UU/9mxnbWduP6o7U0aaOqkzqcCKQgJqFRKi4iEcuIACA7wFyAuCCEkOABqT5w5lStCogc+ikqlkgIVEYIUoiofdhIndtIk/sjWXn/Gu2ZmULy7qRN3ksCznnbn7Zs3v/fmvTdjU61Wg54u935yMzgkPgdOkjdl5JPyF+8tfPDWfnq717M0Urr40Rjv+pj+6g7mr8+9eannYzQDoSczjoqIY+GxfnhDPgriyuEA0DBxMg2sr9uLx14b5QJhPqL1GbUdd0IcELlAHFkEKNvsVhwT27lAmI9wfZgtZrS22TQQrzYH0RCAqta4mWahyWRCi6VFAzEYxAgB4dkHRMMyrCk1/iJQgbvf3EX8jzirCFVRsV2uopQtwUlyIxuXKAiJqL7TFICqqtwATj57CvlU3iATCLcT9g92oOf5MCYu3Xj8P4uA3eNgzEuNI6BoEaiWtlEtViF47E2NbcXTqOQrKBfKSMVSrO1S7jvXj3a/62AAJj/7FeKZTpy62FuXpaMpVAoVSIkMNuc3UM6XkF5OwyJYUCLvqqJAIUlB7dDtFPs64PS2cQCoagCEYwIWfoxg6dYC8a4MhRhsdbeS/ZbJU4CcluHqdCF8vh8OrwPuLg8ryZWpGB4dPYlsMku2VDXYbApAqSr191YCwN3tQSGThyPgZB4JZOHO0S5a43CdcGNhYh79Y0MGG2szqywCTo+TPfU2m0dgW1O2uWzoeSmM2MQius+F9ihB1TCnLiML0xzwdvke+L5/BHTKdp8D61NrkJa2oDzT2IhKqobOSS0mkSeRymdkbETWWTXlUlk8/cZZg00uAKYWMyLfzSE4KjY0sjm7QZrPMqI/z7PtKRfLLAnFgU6sz91DJpHGU68ofGWoVLQJFrsFltYWlKQScqskochP3sxBWtnCxtw6KsUKzDYzAmERwb4gvN3HYRWse9rjBtBCSotmdTZxH+lIklWBqiowWc1w+tsQIodOx/CJh17wIQFUDePQi6chLW8ht3YfTnLIUI895PIhuISG+ofuhLs9sLXbEBgOMj6op1wAqmXNI7vbTlioj4skF4pSkey1B9n1HGnV/+ruHtN5tDPmiIwfgC6k4qCI3vNaG47ejCLyUwRPvP4kJq9MIhPLMPnpC2H2PnNtho1HXh5BZimDLZKs/ABKVV2NK0gvpnH789sNt2pHN/77CkJnQ5i+Og0HObhcogt3vpwy2OIAsK3rCSp8pOWOXx5n46tvf21I1h3dxJ8JDI0Pw+awwv0Ibd0FBvxgOaCPADlEpLjEvNn9TR+B7FqW6QUHgvCHA1idSjT1fm8AxW0dAAUVuYx7f689uAUkWfW6i7eiCJC+EAj7cePTvwzf+AAUdBEgW1Ajl069bIcuvP9C/f36hz8g9ksMZ0hy0v+JqdnkIcqwoCGf/36WnYR6GaVr735rGNOMp7chKqfP3fp8AGRtsiQ3LqPEb3EuORcAeov5v+gfAQYArQrnb6qUzVMAAAAASUVORK5CYII=",
|
||||
"dotx.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABE1JREFUeNrEV11oHFUU/mZ2dmZndjfZTXbNrgmt2iQmlSCtAQsNtIL6JEjtQ32xtOSp+GyhIIpVKMUX82h9qPRNRaUmiFilrVRRqbUoIRtjTdOkWZvuZrP/P/PnvXeTyW47uzsLCR64zLlnz7nnu+dvZjnTNFFLh98dvuwPigfRJpWLOiol/eMv3oodb6b3oD/BTmlwT1e7/hGfz0FNe469cnoIrUDUEo8tpKd2jmBwZz8Fcf5/ARAJ9GJ0cF9bIIStBBDwdiPg79zYEhBomY4tBSBLCsIdkVpRSxCCfaW275yauF0ivB7/gz81BeEoAqWCBl0zq8DM6tNcf7oEDh5FQDGnged4iIIEeOAYhCMAa4kyUislqBUDhm6SZUAjgAQ3h0DIg3CvgtT9Iq5NX0FscZoAI78bGspqGflSllS6G4ossxYldLxtAJEdXuZkfnoNBXJT2jwCDAw83QV/QGQ6Q8+E8PX330DxC9g9Gt40lqqrr0vG4px2zBkAmxpw8Rwe3x3ArT9TKJGpR0EsxNIYJo5JMjB7Mwlvpxt7xiIkMvbdLZB0OSxC+yrkybm9T/gwP5Nhe001EV/IoVLW4XLxGNkXZjXRyN7cikGk+N0IRWUChgPv4pCIF5FNVdA/EiA3bH+u8Q2hNlk9fQpkn2CBoF2geN0t7exCYAvAMFsvUXIx5xREuaTjLnkZtbJxHAGTaDdbK4t5lMlsCIYlC8QqadNcutLc1jEAs/HKrVXY0Ik+5iO1oMAjb0aCvpI1zWxoa5eDtiJAb5j8t4jgIx64RZ7JumlBku6iIKjz+O1cQ3u7ENi2oWHU79WKjlJeQ3a1Ui080mqWDjlUkgXyRUQGFAGRz6hY+idHJqQExedu2YZCowjUUiGtsjEselxsn0mWSfhdTJYmPL29TLrAMNdvS8Y1jRQX5ViKmiFoEIF6TV9QtNWhQ6c7Ijft87qznALQdRPbQY5TYGwXAJsR7SgF2xkC+xSQduoNDuKNFy9Ysve/PYq7qb8w0ncA4/vP1sk+OPKzpff3/Ru4OvsJxsfO4tSXL+DMoUs4PXUIq/m48xTQfhZ5L+MnLp3AQM9eBmbiuxPM+bmrJyGLPiY7+dnzTOfZXS8x/V9uTWFu5QYwBuac0kp6ueGnHt+oCDfqIBb/DZM3P2J8f3gve/6+cAU/zU0xPtrRz3QoJbPLjKf2F358h8ne/PxltmeFbTqchLpqsDRs8AGph/G5YsaSiVw1QtlChu3rbMk6uv9ttn/v8EVLZhoOI6BSg/UInBu/jjNHJnHx+of4YeYrSzbx2mVcm53E/L0Y07+3umTZPjf8KuNfP38AhXIW0c4BJrfrAs7uz6k3IB1UJD92hJ6sTkJyyJ3ErKUz1Dv6kCzU8Sh7JjLLzC5B0kF1auWlnIpPT01zLYuwQtBW1DTWcr/adtMftx+WLyeXNjshPmMrN5zOAY2+WLZjDNjMl/8EGAAeHq79x7LEMQAAAABJRU5ErkJggg==",
|
||||
"xls.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABENJREFUeNrEl21oW1UYx//3JbnpTdKkvbcu2WadXbHrJq5v85Mvq4iw6ZDqhO2D+IIO/WbFL4LzpfugiPhFQVRQQdgEcSCTWcSxVabD4bYy1q3LCtO2prRN29slTW6Sm3s952TJbmuSJlnYHnhIzrnPOed3nrfccJZlwS5PH2g/7m1wbkeFkkxkkNIz3xx+e/SFUnYrzxMLGd3T2Vjp+Zi6GsO1aev5pwY2YTUIu/CooXS19SCgBijE17cFIOhfj+0dvRVB1BTALyu4S22tCKKmALLkhlq/hkE8vLU8CL5wplahZJ1DdMLj8jGIDU3XIZTSEGI5N9PjBjKGlS2h/KEW+5TqBIgOHomYAZ7jIYkSQCDy0gEMDR8nEChYHWUBaJEkFmZ0pFMmzIyJTMYiQCY5XESg2Q3Z68DCbAInR05gdGIEpkVtDCTTOmLJKHxuHyLaLPWERrbrrxiAHtK0TsbVEQ1xclPAZNFr2eKH1+9kNq33NeLobz8TWw/Wb6y/sVjKaoviQ+jcfEd5HrD+PyXwHO7e7EdoeJ54AgxiciyK9m4FBvFGaHgOSlDGpi61osQVy2mX+YwlKbuuxYPxUJR5IJkwMPVPDNpcEk6XSA5Xiq6tWRlSl6sBF4HhwAs8pieWkEmb2LJNgShWXtVisTIsJSpxdVRLI6ln2B0cToHBVHj56vsAJ3Cs9GhIqCcoCPXEauvKBzCtkjpDDuM4wKdIeYjZcIL0gnTJdTXxgDars6ajkrKkWe90CXmI8N8xGCQfbtoDJqEtpDEthUWS8Y2BOhJ3nnmhaa2cTUiyU0o3MT0ZL7q+/CQ0l4/TqQz0JQPR+RSLPem4zCa3qUCz3zBZA4kupFjb9qsSZI+juipYSRtfTLM2TN1N5RrxghIU2Nwi6wFk3hJIC74eb9Kq56YScG0UqyzDFQCeBmdBG1HkoJBwFH3/M63qAOiPza2S2w5QuAoIAFW/FMCBJ35BS2MnJN7Dvm9e8yAbf9T3R94up9137mQ29NmrD3zK1tifVwwQiYYxeOFLPLn1NTzW/iLGZs7g/MRQPklXAuzteQsH/xzAm4cfRYMcRE/zjlUBCobAMG4YH7v4HbZteBz3E33/6LPsWS5EdjsqV6bPoq+zH+cnh/DtqQE2rioEtI5z6uTdqHN4Uef0QhI8bC53G7sd1Y8HX8GRc18wu30PfYgd97607HnZAPQFI6e9bXsQJ69Vv144hGd6+tlcbjO7XbC+FZ89dxqj//6Fr4bexe9XfkLrHV3LbMoPQTpr3Ky2YVfXPrzz/V5EYmG8t/sQHmnfg/FIiD1/Y+fn+TUf/PgyTl4+gv19BzExF0JbsBufDL6e36uYcIX+nLr9EvtzqtavhUxcPx65DPuYJieFswu9eQ5alrJrqOfssqQlT/yw/1Lvqh5IpbLU4cjksnn7WIueLnijsfClm29Ehm7cskb0nwADAEWS1VX7MfgcAAAAAElFTkSuQmCC",
|
||||
"odt.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA5VJREFUeNrkl01ME0EUx//bdvsBCkUpIG1BQBs0qODBKPhVozF40QMalAQwejAeTDwZjXowJkbxaEzUg2JiYmKM9WKiByB8GMVEERQFVMSgKLSkhVLabnfX2SlgC61sK8rBl7zszLz5+O1/Z9/sMqIoItTU26rqVXrDVsRogtdDfOwWV3/74O/6TV9PFalTYtGWWNeH73MntIN91U5rJWaDCDUF5tB2FBUiNz2jmrVW3pwXgGxjGso2FxOIdNkQcwqQZkhBfl4WgShBjkyIOQVIWpgIU6aBQJixVyaEIvJOjc81WjUWpSQRiDTZEFEUEONw8kopldDpNL8gcs0o2/R7CJWcd1WeiXhQ14Lnb7og8Dz8XAAejxeuETdSk5LQb3dUw1rpJB2PzwrAxLG82piHxw4X4BieFtEBCTqoCzLAvW4qlKUA4lBAGPdAFAQoF+jBsGrZ46IACDEt7v36ASKRnXcOIeD4QTeWMOoEPzgAVm8Am5YJ1rI6FoDYFNBm5gULZgu9cN96CYEA1pQX3rGn7c8U4P1e6oLfB0alglKtA+8ZBTfUD85lB0i7irSplyyFxrxclpKRAQQ+fGHOD/fwABQKJb0zKc6PjwZBSEzBKKBJNQbl1qdGnCNGAGHGW5FsMIeLRJ65b8QO0TcOrcEERqmKOHZOFFAwzIw2qUmbnBp1zJ8B8AH8K4sCwM8vAMNz8wugCHD/uQJiYN4B/PRakJWB8xU7UZyfDRc5Wq8/aUXNgwYas52sou2SSbHLtkZce/wMg7Vnw+Z6+r4Pey7UxgjABQFqj+1DS+cn7D53AwXZGbCdOYwv3+242/iSHBcCau7X4RLxkhVLaay5oweGA6dRsjIHttOHaDmub0KR86HYYoLZoMepmzZa7/jQh7v1L1C+aQ2tSxlPJMlHKje3d6Hl7UeUrrXQ+uQjpOUQj0GBX5O4nM6pdteom56UdDLpxCQJa2rikHooQHxfxeSQedP1ES63B0d2baT1ZFaJcus6NLe9o3WqgJQxJ2IFOUZ0dPcGYxOPkJZDXa4CHDly7cRPXL2Di0crULp+DbLSF6NvYBBX7j2icWkP7N++ASWrLDTW1NaJh43PJzK5f2qe2YyJ9HOq5LxTP6f6BYlYvSwbTvcY2sk+mDSpTYpJNj02OaaRQIVleFbb4K+rtc6qAB8il2PYh/rW4Rl9XnV2R72raGPAamVuQk3CX0k6kb62fwowAMCC60T7iz9lAAAAAElFTkSuQmCC",
|
||||
"rb.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA75JREFUeNrElltsDGEUx//b7qW1ut1d7ba2tm26aOtaJRFEqOBBKoQnkbhGhIQEiSfhxQMe3B88uMQ94cGDxIOWkqLUbVurLFalRVTRdt12Z2dnnPnotLYzzF7USb5k5vu+Pec35/uf861OFEX0tk0HTta483KmI0br+PwVnwJfPPRYsXv9kk61fdHx9Eqb1i6YHWt8XK5vhOdZc1lbR6Bm4/4Tf4TobSlIohXnO1GSP7iMHiUIa78D2DLMGO3OjwkiqQAZA9LhsGXGBJFUAJPJACtlIQpiT78ASOrWp6ZiQJqxB6KIQSyjLByLCUByFutgznQ6GPT6Hgi7BOFCiStXFUKfjK//HuLgef6K9QL/mzYIBBQRBITDPFsToYM5zSRBSKW54a8AYgzBg1wY+89dgiE1BcFgEKeu38KSypkYSiUZbYcuVJVpykB0t1KzEAWvuuullJswoaQIxy9WE0QIuZT6IqcD/7QPhCi91zw+3Gj0Ic8xCL6Wt3H5iSsDHB/BmSv1RC9i6thi3PA04VNXACMLh+CWp4tmRc1ZTFHTgNrQkdJrvX6kUc3PKC+F92UrExp+rXU7UPptwmUYpi+/86wVTa1tyLFZcLq6DqOozNJNRhnAnG76GVClVOMG4CMCrnib8fHzN5S7h6DR/5pVQG2DDxNHDWdCvNf0HCOo+fypV2gCoBLuM162B2CkJlPgsLLABTl2ef+1+15MGVPCIKQsiCo+tItQ4cTa6cvtA9Nx78VrdFHDEfgwSqnWOY6jhsOhqr4BFeUjae3LLw2I8VeBEOmLW5iVidt0/lw4IveAJ1R6we9B6EQB44qL0N4RwKyJZRiWn0f7+AQAFM4rJyMN88YP0+SU43lFHwn1AakC/oUpAkTUFPM/AVrfvcc36vPd5sp1MNV/7OzCh85An/mEAASh7xHsPHL2NwApyI4Nq1H74BGq6+7La1nWTGxds1QzhCIAr3IEldMmoXL6ZAoWxJZ9h/Hq7TsZ9tC2Tb/NDy90JXAEEWXB1TU8xtU7D+R3Zzbdgs0t7PlizU26E0KwZ1rYvJoPjQDKGbBZMuB0ZMHf8gabVyyC0WCQy62m/mFP0+ropCs6O/7bUOr70UMytysPy+fPweDsLOw6epbNdx/B9vWr2JAgPU/9qj60aUAlfQK7lCKYWzEZe0+cR4PPz+YkAW7cdVAWZ6m7QNVH3AArF1bSfwAjW3PYbVi3eCGbdwwaikJnrrzPahnIssAnWwNS0N5r3e+SWcxmTRrSDHD5bmO/dcIfAgwAVH1RCx1x63cAAAAASUVORK5CYII=",
|
||||
"txt.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo1JREFUeNpi/P//PwMyKJ68eL+7ub4DA4ngzpMXDHefvrwAZDr25cV9wKUO3T4WbIrczPQYyAFfvv0wePn+4/6iSYvwOgIZMDFQEajLSTJoykkaAJkgRwjQ3QGCfDwMuspyJDmCqg7g5eRgEBXiJ8kRVHUAOzsrgwAPN0mOoJoDQKmbhZmZgYuDHcURGgQcwUJMViEWMDEyMrCyQBwBA3oMciDK4Maj5+DcAWR/IOgAcsGZG/dAZQHYA3/+/WP4/fsPw/efv8By3BzsBl9//JwPZAYSDgEyLLfR12B49uY9XjUz1u8WoFkUcLCxMihJiZEebQwDDKiaCIeRA0Z8FACz8EBHwUCHwN9/A+yAEZ8N//77N3gccPPBYxQ5UFUrLMDP8PjFKwZ1BVmwGIgNq4LffPiEol5WQgyleibSAYgo6Jy7HLXhCbQ0KyKAYc7abQzWBtoMakB+z4KVDHUZ8QwXbtxm2HTgGIr6koRwBnVFOfJDYEZ9McMtYCj0LVwFZsNAqLsDw6KNOxjO37jD4GRuxCAlLgLGXvaWYLVq8jIMPg5WBKMUa2349+9fFPwPagCymK6qIoMQPx8wyD8yeNmao8iBEjEIo5tDfAiglQMIByDEv//8yfD24yeG7z9+Mjx6/pJBRU4GORuBs/JfIsoTrCHwB6gRGcPSBLLY1kMnGIT4eBnsTPQZ1u4+hCL3H+zo/xjmkOCAvygY5hMY/xEw1R86cxEYx9YMzhYmDO8+fmY4cPo8XP4/NATQzSE6CtAViwkLMqSG+MLFQS3f3OhgBklRYTA/JzqI4Qew8QmT97KzZOBgZ8NpKclpgJWFhUFOUhwuzsfNDca4+GJCgljNIdoBu05foltJCBBgAP9zlklycj+AAAAAAElFTkSuQmCC",
|
||||
"hpp.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkFJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/6vm73qP1D/fEIOQMZMDFQEBqryDJLCAgmEHIEMqOoAIT4eBisdNZIcQVUH8HJxMIgL8ZPkCKo6gIONjUGAlxvqCFWiHEFVB7CwMDNwcbBDHSFAlCOYiEmpxGImRkYGNlYWkhzBQs0QOHPjHsPdpy8Z/gEd8/fvP4Zff/4wfP/5C5w2Xn9gAjniA1BZIUEH/CfDclt9DYanb97jlHcC4hnrdxsQFQIYpRURgJ2NlUFJSoxkfVRNhGQlXGqFAHUdMBoCA+2Af/8GOgoYBjoK/g2wA/7SMQ4GZyIc8BBAdsCm/UcZrA11GIQF+Blu3n/M8ObDRzD/6PkrDG+BbBDg5OAAi4GqYVziJGZDRBRs2HeUQVVelkGQj4/h+v2HYEdY6mszHDl3GeiYTwwiAnwMj1+8Yjh37RZDaWIETnGSHPAHLQpAIQISAznsP1QeRFvqazH4OFgx3HrwmKFv4Sq84iSGAKoGkCEwoCovA5YHJdTjF6+CLXn88jVBcdLSwN+/KPwgFzsGGXERhpOXrjO8+/gZIg/0qiAfL4OyrDSDjqoSg7meJn5xUhzw+w+qiyVFhRkUpKUYbj54wvD24yewPCgyQJa4Wpmi6MMlTloaQHMxqH0HEvsHbXyC2CD6H5SNXoZgEyfbAW0FaXAxRzNDMAaxk4N9sDoWlziJaWCAC6Jdpy/RzQEAAQYAgGvRHyAyjTUAAAAASUVORK5CYII=",
|
||||
"pdf.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABFpJREFUeNq8V0tvG1UU/ublsT3x2E5IiFXTRLilCVQoQRWUBRIsWbAAgiKVTbtg2SrtL0BsEa3YsEKseBQqxIJusoBKhLRFSAQVnKQSEknjNA117Pj9mBfnju2xE8b1Q6bHOr6POdfnu98599wxZ1kWWuWT6OSNAM+/ih6laJqkxu/Ufe3STmK/nd1hf6Kb0ZTo6dU/7ukarFFlZms3e+NyJPpIEK3Co0/ZLOSwnHyAdLXizD393CRmpyIz1GUgQv8rgPVMCrulIu6TNkQaH8exU9M9gegbAEexPBkcRkBsRlEaGYM8MdkTiL4BiByPjdw+KobRnAuNwBOJEogJxE5NYfZEZxBivwCekH1IVkpQWhgQFBXS6LgzjtWamZW7O1eoPTdQAGFZRoYS0C9KTTq9fojqyAG7Ooizl+mLTsa5gQHg6CNw7Lspa4s/IrFyB5ZWgVkuwaSToucy0HkBqt9zlkLBjubFgQDQTYPygEOuWkXQI+NJQUT5hyWU2tA8Qem2zvMzA2HAoBOQLpch0P53iwVEFAUyJaXMCR2OHNfdKbA6aLJYtBfGQmEwl2upPeiW2XHdQI4h232Kik+AaA/KXkwGQ6joOtYJRJHKcc/HudcFaXLOLpQxop0JAzGhhrCZ3bdBjHh94HgOJtkwTngKTZhsgpKnewDt6NIo8faI/pDXSyeAxx6BKWhV5CpVclRz+k+pQOGwbKYsCnnJ0KFR/wWqkhCELgFY7hCS+byd+XnK/AwloYeKkE+ScJTCoEi1elClypgs0x1RyKNKV7TEsSib2KYx1GD/DJQ1DQVyHPb74Sc6JdoN2/XhNWw+ogRszVKhYsUqTFVziACuaJXeAaQKBeQrZTuWEhWUkM/fMVQNYYnK9FG2rgDMevsgsw+dKBVpV1XK9DGi0MRgpQ0AC3mKMXMq8rzdqkS9RxJhdtz3AACwC7ZI8a6VXBMKZb3i88HA4EVsV2zUoSGbfoEYYGpYFvC4AOj2dcfBMzwM9dlpZz67ugY9m4UveoQ02kzU2784/eHTLx34rdZn3QOo7zY4PYUXr37eLETk/KfX30Bk7i08s3DhALCb8+/a4FrtmVyfONb7OyGrXEz1esJ9dzSG6ydnUUxs4wg5ZxUvSTtrzItqAMcXzttrmCzNn7GfMW38ltYmhK4MaHXHDSZOXLwASVXhJ+qzWwkoT0VtEMxOy2bw97VvMUrUN9a98vWXdhu/8rGtPYegYpoOE61xXf30M9z95hqev7Rgu2rYMaCt41/f/wDp+CryiYQz1xOAct1xtd5+Pzd/6JhadkFidjIxE3tnDhuLi8663T/j2Ll12+U9jusOQMk06gDMA+PWHIm8fBrvbW/a44fxOJY//Ih221x3eI3tTBC7A1Cs03bvzh/44s23nXFDfvvqKv76edkZb9285fSZ/UNioOxCvSp0GYKCodfadAp7S0v/fb6xgfukrn/ZXOwdAC4vJa4AwpKMxyX/CjAALhkSt6rwJ9IAAAAASUVORK5CYII=",
|
||||
"wav.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABNBJREFUeNq8V9tTW0UY/+Vycg+Ek5ZwSbmUQqGUAYGKRcexddoX7ZNatcPYMuObOo5/hjO+VcdHXxxn2jp2Os7oiwpqLYWGS6egpEBJS7gFEi4JEMhJ4rdLE0tyDuRExzOz2W/3+3b39103q0kmk3j2a2r/vOdkY8krUPkFliIIBCIjRJ4ZHfxoVUku8zyNHICb376nGsC16/fxy09jCISkfUFknqdVwKm6sd/n291orLW2ENmTK3BZAMmE+sYQHGsow7nz9WhuKGg52Xb1q1wA6OUm44mEWg9w0xaXFsJ1yAyDQQ+9/uEV4CrIFd2qASQTybwAWCwGlB0RodPrIBh01B8MQhZAIk8LaLQaWKwGlJY7yAJaCAKzhHdfEPIuiOcBgKymYWml0cBkNnB36HQMhA56QacIQt4CcfUuSJAFfvxhHMPDc2mLSFIcG+FtaHR6iA7jFQpMlpqfHAhAysEC4fUogssRVB09hOmpZVgELXQ0X2QTuNbpr9gG1DjxQkcVPv3st5b/xAWPJgLo/XkcLW2VOFIpclOLTguWFiPwT6+gubUMrhI78k5DKRZXXNB3ewKDA9MwmYzc70w2FNrA1MQyqqpFAp/EkGcWpzsrYLMb8wQg7bWAp3+KTL6F+dlV0jIMo1lI1wsmK4oWrvHaWhQ6rRYOhwk+3yrqGw7nC2CvBTx9k5ijw81WIyxm4zPpuhtoYQq0xYUwxYNIIMNwVxRiKbABqVbMD0AswwVJhaRIUKwwWab91mYM6+vbKCTto1sS4lIia5/c60AWAHkEzAJMNhqNkcYRmKkSRqMSVURBdh8VFpCyclypYjLZWf8apR6loU5DQZngwExmfdY+uQPIiIGLXad5H6K8H7jzCJtbO+mCxWTZ4ZvkgnA4BpfLilBwCyWl1qx9cgewI7/QXmDGy2ePY+zBHDc5ywImqyXN7QUGfruvrGzDbhdgteoV98kBwP6ma2wqw8yTld1AI9m1VaqKwSjVBiq5oonS0HjgHvsC2Nk+eLHLZU/L2kjbggI7rwG5rv9XFpANSCkJCj/V67RKWeAoMsH8NJJZY7nOFGQ069k4JZeiM+Uy53IGsEMWuNTVge73X+S0o8iMN95qRV29i49Zz8YpudcvNHEZNmbzp+jmYzRrlVUi54fDURUAYjHcuO5J02XlhZx2ux18fPbVegz0T6P6qJPPe70LuNzdyXnf3xrBsdpiTrN2orEURpPA6dxdQEE0+XCR01aqbufON+LLL3pQd7yE8/iVPBnAmxfbcffOFP4cnePVkPEG7/lgNOpRU3OYglLD17C1MYXAVHABFZX1TU7X1rl4P/N4mfdMOz6eCfI+GIwgEmEpKOxqTmsHPT68c6njH1lay+ZVX0a//+rFaxea4aH7n81d+6YfXZc7Oa+ictf8jM+rJP0nqD9RivsjTzBwdwqtbVVooHfCrZtD+15KikHImnd8no9Hhh/z8fCQj4/76YC33+1Ab89f+PiDr3n77sY9tJ+q5nK+6WXKIIEKVjn6/phI7yf3yb4NX3rOxt+GZrrV3G4Rfn+IX7cplzCzO522PfMpXmpOdFr5O8E/s5Lm3x6O9D7wfHjm4Er41F+sX1vd3MMbG/XzfmE+++2Z4inxc46BmcUY/q/vbwEGAPq/yA7qiPz6AAAAAElFTkSuQmCC",
|
||||
"tgz.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABApJREFUeNrEV1tPG0cYPb6D12DHdxyuAduAczEVtElLIIpUVelDkKpWldqHJlKVPvQpP6E/olIeSJqHSn1skvYB0geoi6qWooaGKBEOaR0VCCF015g1vqy929lZQjDgXS9C7UhHnvn2zOzZ8818GhskScLOdve6acLdNHwOOltu4ylyfOrmO5+Kl9V4u99HAzsxPmqckDQauzwrjY+ep/jt+6s0tvD7F9LUN14SM36lJWAnjFVoqhAKabCLCYrM2v3teGd4BH5f9JKWiJ3NiAM0m92J5sgwha/51KvF7MfQfeISERGpWUQVAaIqSkUOmdUERZb7Q4nLdtqCMDliRMTlmkUYqyRKFdY6J4LHhijcoZNKnKTAYHHBWN+mS8SBHBAFDptsgqKQ2XJAFmBkYLD6dIkw729AWdU2s60B3pZB2re7jit8SRZggcHcWPFl8p7A3E0iIon9jqh5/xSoC5BKLAQ+Qfslm7jFF7H0+GuwzxIyAZKYJ2EeEnGrzh6A2ZQiIoppQrxag4CSugNWB1xNbyonglgt81t7rmCDnas6x98NzIyPxGt0QF2AKLCwMl1w+EewvjhK+WYLgyOB07qP9P57QBTUZxnsCPTeUHJtDmrz9QrQcqDOEUWBnyf2RyGWcpp8/Q5IRc2JycRHaAicg8kgIdTz+SE7UIOl6dU5CqdvAKHolcNOgboDPJtEsaD0BUHU5B9gExZUJxXzpA5svZNbmdfk6y7F8oJq4NN/IxR+D8Mf3oFkcGjyX6L2FJQLGpVQQIZ9hiwRQoqxJv8AmzCvOqklfBbs83nM/vglIn0faPL174FyTnPiyTMf6+IfqgOH2aqcgtz/LKCcpb9/zc8glZypeNZ35iJc3hCSc1NYSj2gsaPtxxE5odwPJr67VsFvj/SjI9qvU0Bpk/76Ak1g7IO49+sYXO4gOsJx2O02TI1dR3aDQ+w15e/DdOIWsuvPET99AbG4IoRjVzD7yxjCvQPb6+lwgFduO/UWAj8sFisYhoHX70eW57D09BHeff8zMA4n5b198RNYrXV0nswRSJmcTnyLgcELCDW3bK+now7we29Icrkl8c3MCg0x9SY6nvzhDh27jngQ73+LlOYiJu/eJu4F0d7RsXetmipheaMCyhWrQPvORhvlrC4v0HFvrJukyYr0Pyt0PDs9SdPU/8bre9epPQXruy0hwQKNm8mHn+qL4eefJtDW3kafLi2S0nw0iMeP7iH15wK6Il14eF/ZvF6fBz6/W+8e4CrGra0usgcs2/HOTje8nhiWl9foeGgoBqerAWsvOPT0NpNInl5KlZpiIvMMegW8qBTQItNKFfHGBoKoY2sk34Dz8JAP9bgdu1Yr7VlPU8DDJ0/+s0L0rwADAAJRbvBnmfMWAAAAAElFTkSuQmCC",
|
||||
"psd.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABHZJREFUeNq0lm1MW1UYx/9tb2mh0NJSeW2RktJhx8sICIqJGbqwzaigY1/8hLrIBzPfEmOIfpi6xBgT4z6YLMaERd0HlyWaGN9gGxgTBlIzXhwZIqMUBJECXSl9f/Hc0/ZK4bbc1vk0T07POc//3N99zrnnHFEkEsFOazn97mBFWelhpGmbTifr4+Rvm+XjM45kcbufx/AFPft0R7rPx+DoGPr/WDzErK/0kepTQnVi3EVrNJkAg7mz6cUzfXcF4OLwOLrOX8KH18aw6nLvO1hdoRJH62sRMZi7hUKIk80T64XKXGz7AhiYsaL70gC+mJjl+vY4+ZUo5WjVqdOCSJmBB416KGRZ/2Zkahan+0exHQjyxqtkDCrUCjyUBkRKAPbhnQ3VCW23HS68fu1XuHkgsiRiqLOjEEIzwT8FO/yZ5hoU5SkS+tc8Prx3/SbJRIiLo4OJRZAxUQhDDKK9vgbhFBCMkG/1lbYm9P54natrs2VY3HLjs6k59DRUxTRAv2USE3MLCJNKMBShgG63H2WSMGzyXBaC3R9e3TcD4UiiHyzW4klzJddvJxlgISbXHPjJ9jeNaa6rRXGZAaIcDSSKAsiUWmgKimDU69FecwCnjj0KsUh8KKMMsPZ8kxlT9juwbns5iAK5DAPzf+GgVgW1PAvlpSVp7x28GQgRAD5/h0xFS6l2x1ohoCLgq5nFpJqdLhyA5JTP5YwExyvLuDhPMERX4ILTjV/+tCfVxV0wQDAcTuomjRIdRh0X6w2FaDm8ZE+pY104QCic0o8bSmHMz03Q+AjIwO2VlDrBAAESvJ+fMOkhl0gSdDMbW1glizSZRjCAnwTv5wqGweOVpXu0847tpBrBG1Ey2t1WoVTg/iINffP4fqiRSwXrkwL4YgtLiNXfo6LO2rLLA6lYnJaeF8AbCCET05DDa5msAbVMimxGkjmAJ8lxK8TypBLMbrpQla/IHMD9HwBYk4qFj8EL4PIHaJlD3qZ8x5vYyAp3x6ZHmyODViHjbdOpsmn91pozQwBfFECfn4PXHq5OyEzv9xMwF6rQ84CRaz979TdMr97BUVMJTtTqE8Y6dXkUbn8wvcPIQTLAuiuWxscuDOHkxZ9JRhg0lxfQh389vUTbh212HKkqpvHxbTkez9oT5jJuPMEA614/dWdM1FVbjpN199L/c2SBvT04hSPGYnzXfRhjS+t46+okjaeHU0xv2/LgU8scOsw6bjzBU7Dh89FyKxAFeK4xehn5aGQGn0/OQ6fMgWVlA9VaJT5ob8DLrQdQde4buGMZiOt31zWCAbxRQTwDBe9fTui39BzDlzcX0HtlnN4Bzz5STzXeYJDTq8iO+FKLCects9x4ggEcMYHL50+oc3fEH8bQ19mKFxqjC/HcyC0a442tmfU3urjYN6/cgMMXSO8rCHs8tLyxsIK2T77l6nG7MDKNoRkbuX7nwbq5RdxF2/tGpzH4+yIXN0SO54w+Q3ii9z4HKYc2+L9lK+mzLtv3bcsI4L6QE/+LifY2/SPAABKNFpctNOXhAAAAAElFTkSuQmCC",
|
||||
"key.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA7pJREFUeNrEVs1PE0EU/81uaUuhQAEBLYYaTYBEjAmJxIMEjPFigl83E0DvcDDxYPgDxMiJyE0TFA8ejErwYKIgRj0YDCRGGzFRIEq1GGhpF0pLuzvO7tJtC/3YJY2+ZHZndt/Hb37vzcsQSimS5e3Fhkm7g7bBoGyGCSIbuNf65OuVbHrb45nSKdU3i0bj49ccB5+v9PKbC/XIBSJZOORRattb4ThQK4MY/i8AzNUuuM52GAKRVwBcSSUs+xsNgdgVACFIEYvu/E4sheAdNUkgnDlBGAKw5KH4PE3hnqFYXqJpvJlACosYiGoGogGujtwgTHqDT72iELVdE8y7wUYCBMe2UkEIwMsgisGDMcG+uzrYY2yMgUDa05EeQLrNiUQJklFY7D+vXyDg/qg6kETQaARSKAhLeQX4xSWZiVX28+quGCjgSQ4NipU3z5UZIwD7DqXuorQJ+DrDH9XFwLZmhVCAAdBVLaqhxQwUl1FdG9PNAG+gXDmiX1dXDYisz/NEv1cpkoZGIwC228aYQwPxIW4C0TBzbskTgKJKCqt9W134WUPyEjjqKMy2NIeC10eCLgC8WR6Jj2E/waZAlFyHltm7msJWSXP60V8DUmaDCAu88p1oZz+6AfgXCKQYq/wqCqOSFoBEswFQ4u6Q8CqBbU+eAFApc8VxBRkcWWlWO2MMZLkQWUoB65pcB8nBwXaf3S5vDMhSvJeBcDC9rYAFRWpBUClPACQdjjizMX1jDGztjC9zglhLEPN+Ua9crhZI4aCylucpzWd1kenXKm9x1aM6r2lUG9mWvW4AoqimwNZ0AeYDLVgZ7oS9rQe2493wsbn8v6zrQYrN2uRtJSBXWKLoc6xzOZiOMDmEiGfWYApi8eNIlGZiPXIexe298D++jshiwtny3U5E5qcS3Y8Fr7k2oehbGPDN37MQ3t03noI4A3JRFextgOPiTWy4xyF8GEVyFyg90wdpQ1Dm/mc3lICBl0Own+yFyeGEd/Cc5ssYA1FoADhWA6HP47AdPgVz3TGEvyV2HGZsxHxqvqNrgmIXeD2CoubzCH4aR/jH7O6KUIwlqlvO3+87Pai61I/yjj78vHVO0wu+f5oCSLMPCYixEfdj+FYsX7nlIZ8Gkd3p5Ln3UT9M5U7YT3RrV3Jn7wgODs4qo+x0T8KOqrbxdXzoZyCq5s33dhT89ISyFgMCFga6tP8LA90pNtEVj2bnfdivsBBfZ7vtZgCw9fZ6Ur6vzyVyKrinMtKarLerGlhbp/hX8leAAQC8cZ87yOHNmgAAAABJRU5ErkJggg==",
|
||||
"ott.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA5NJREFUeNrEl1tIFFEYx/+7Mzs7u17Wy65rmkoXMjLCeoksKn0IeqqIMhBM6623Hooe6imC0Kdegh6iC0VFRPaQFYEalVBEN0QTovJSqO3qrrq3GWemc2bdm47tzGr5wcfO9+03c37nzznfmTEpioJk4+qOdrJ5rt0waHI4SDxwXey82fy3urnjsVpFWZt3GR0fkR+94McGmny1jUgHkWxmLKHt2VKN1cXFTZbaxmvLAlBR6sbhndsNQSwpQJEzH+vXlBmCWFKAnNwslJYUGYIwa6/UzNxqtaAgP8cQxAIKKBk42VIMA57nZyFcKsShNBCsnr2qzxQ87HiNNz39kCUZoigiGArDNxmAMzcXQx5PE2obfaTwZFoAUwbDc6Vr8MzrB7zjc/7hARsPrsoN8dPLal0KIAMFTIwFjMNp+L5FA4RHfkD8PQyiOVFOAetwQQlNAwKJTWawJRVg3WVGAWTdALy7XHVq4uggacl9kANT4EiOpYqEApAnRmHOcy09gCLNQJgYg0wGAblm7Dmwk3PEbOF0P1MbQJZSQiE4hUhgEjOhKXUg6izHQ5r2QQmHVKktZHCIAiTvCGyVmxe5BuQErUQeSult2XlgC1dAEsKQyNEb9PyMnpzlleAKihe8P0OAhAIMaS4MY4/nGZas9mwHOOKSGAFjsc5TbPG7gMqswxgzo7vWIICE/2XanVASlxfAvNwAppllBlDmADhsVmwsd8MfjKBnaFTNlRU6UO50pNQNevyauSF6SBkDEOLXR3ZU43zDHjjsvBp3fxnA0Uv3UL9tA04dSH17bn34QjPX2vbCIICYAKCDX3nSjdYHHShz5ePR2WOor9mIlvvPVW87dxzdvd/RQv6nRnOnD9ahZsMq7D9/NbOXUgpAvWbdSnXmLXefqvHgr1Hc6XqHvVsq4zW06ymkEcVi1WljovnkXNKk0vcBMRz9nV0LuZwZk4FgdD3wluhxHauh17QZxeJYI0uuMayAEFH91fse+KeDuNC8T42rVhbhSN1WPH79Pl6jzpQ0rlisujSrQHKO1upVYEZIkJ+5fBsXTzTA235FjV9+7MOt9s54jUIOKpnMOPkeGtN8cm7BNymtj1NGjKR8nOZl27FpbQV8RI3PXwdS6mnePx3AwIgn8YVU7IQjO2terWSxdgkdN2rTKiDNIfeOh9H5dlxzBh96++flvg0Oa0+Xnpy6tqHV/k+6ntbb9h8BBgC+gfbonYrxkgAAAABJRU5ErkJggg==",
|
||||
"css.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABFBJREFUeNrMVl1Mm2UUflrpD6UUSgu01A7Gjx2jwTlDGJsTF3+SQWaCWeayGJ0mXsxEjcMLr4w33i1q1CWLu8C4xE0yZYlzqHXWuSAWNwRkvw4cjo111JbSUlpGW8/7IrVrv7ZfWWM8zcn39fy87/Od9/y8kmg0injq/OCQvcZU/giyJI9vDu5Z/8fvvPLs8+nsEvfjgnje+/4n9ugK6BvHcPTNg59Fyb8rE4B4liKH1FizCoaSot2ZQMRTTgGUaNRoaajLCkROAWgKVCjXFWcFIqcAlAo5tIUFWYHICoA/MI+hS2O46XIL6mR596AgXxkDsaGhNiMIqZhMZdw/fA7b976FN979CLb+s0n6sWs3IJVIIJPlxUAYdNqMIPLEfr2tfxDFmkLUr16FB+rrkvRGfQnOXBzH2HUnIgQoHI5g4fYiAqEQClVKuLw+BmKGTF/LCCAqIMtXKmghFTp374CK3hNttm56EF+dHsCxgUG03L+WcyId6LGtExWBpG5FpJDLoaLQ5lOiCemL1So0W+/D2dGL0FM5VleU5a4PBEMLuO50QUkg0i5GOcBsLk9M4q4aUXxyTU27caD7OOSUXE1Wi2CCLjPLA9YL/pqZxXuHvkjSiwcQx6GFBczNL5VYRZnuDl0iK+h4GmoruS3zSdSvKAJmYxl2tT8KqVSKvl/PpY2A0+XB6JWr0FK17Hn6ybuIQIKj2VBKjUWL21RW6QAEKVpSiRR1lSZoKCnFABCsgkhEoM1SckkoyYR0y+T1BbiNQiZPayciB5J/EpIz/nn4PLx+f5L+ltvDu6EkzRqiAUSoiyWyrriI6xwjF3D+ykSS/sczIxgnAIxYsgqtIf4IBM5r03ordFoNfP7A0gYJNpbVZlSU6mAq18NYqhNcQzSAVAljqTKntEmnyxpAWGwG5YD+rwCWQhgIBnGSZv+lq9doAiqxbctG6glLQ+ZLe1+SnNl399rhmvFCT0m7Y+sWrs+6DFkEGO8/fAwTU7fQ3toCbVEh9nUdoZtPALaffkHf0CiXs2vY/sM93L6rpxf++SCXT9x04kjv97G1UkVVOALhMCad07hMX7jv9T38LlBjrkBzYz0NJRkfzYFgCH9OObmMMfNhzYr5uTwz2P54K/dj8uyPgGp2ju54jNiG4X9q2KjX8fcm6xrqdBE4fruAo9+eotZ7L17e9RQ6HtuMHwaGcNIxyMd32+Zm7pP1ESzSJhq1mr9P09ew/z4C9LntVOw5RxF4aWcH3n71RfxO85/lw8Gjx1FNkep8bide6GjDidMO7rvMoiOwSGHTqAvw0PpGfEjn29SwhqbcH3ymtrfmocpkRPfXdpr7Xri9ProlKVCmK4GBvvbTE9/F7BmYxZUcwbJT28MbUF9difHJG9i4zoq1NVVcZ6GL6TPbnuDyKpOB27E7AHsa6FLimfXdYb8CAP+Gy2ws55yoSyVvtNSmXEs0ANvAyH/WiP4WYABfuhLeCCyEDAAAAABJRU5ErkJggg==",
|
||||
"ics.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABPJJREFUeNq0V1toHFUY/s45M7PXbDYmaZqk2aatNmkNgvWhvvTBglXwQbFEwVqkEpWEKHmJwSYIlRqsrbb0QdA3hQgqSB9aFAUpfeoF8YJgW5PFpGmM2d1c2GaTnZ2Z439mNzaX3WYKm7P8e2bOnvPvN99/HSalxPLx9idD37TGGp7yGXrGcSSDhyEEZ1Mzc0Z8YuozwXkfHSooXTou3WtGtx+9eXjFWW21MkPTIgef2FtRGQpW4D7GzzfimJ5N995ZNHNSOv2MecIOXmTNMXMW7neYloXW5kbsbm446kj5ITHrCYGGMg3pAJXhIHbF6mGaud7rtyZNweXAekyUDwB9wgE/NlVH8VjrdjI56795a1Lpf4cwyA0HoP6CHBfRcAhZMuGenc3KBfuuj01anKMkE2VlQNcEgsRCNGe7gPa0bFPTPZlYC0CFpVy6lJ7+XD0dhSwEF27gVUWCMHQBwxDQNA5NiL4/Rycs8suBDWNAo6f/Y2QMC9kscpYNy7ZhEhMZuvcZGvmHrz+9kM3Q1kHPAKRn/iUe2RFDJOiHTUy49iZhBXZ0wbH34Z04d+nqM+sDYMv1Sq/+hxDZvm177J77/IZhbpgJHMcpnaopDJRZij1QEQB3XdUrA+tbSBbixHMY5jeXE8Cy4EL5ndCDj3jOhHIF6nIyQNHhyQdoj6PEyUs5hgosx7sJpFvaZEHKwwBK6tJKH8hL+QAUd4YiiYipsgZGuVxJuUzgAhHcgxNmMhgfPI05Owebcfe0XN7hsYKVVt2X2reUWdRvVm2DBwayJqa//BqLMzNwdN1dsuczLjMiFII0TdgLC3mmSCv3+8B9PurjTEhalwo0eRynusB1I4+KvFlttzte82YCfzSCAJewqcJJ6vWqXzpIfukgde48RE0tatqfQ2j3LiyOjiHx1bfIJZLQm+pR++Lz8G/bioW/4u66fecOmVEDsx1XL9c1T00plKk0JYSaWybqjxzC5pdfcK8fPPU+mnq6IJjEls4OtHx6BrpfR/NAL+ran4WTTCLW04kdJ45BSIvEyeviK+pcaQbUJnpwKLCMZk4o5OIinLk5VO17HFUH9mP4lQ7MnP8OlU/uR9XTB+CLhhFqI0ZG/kbi8y+QuXoNvqZGGBFlMssFK/MV2gMDtEnTGTUYd4Wrw1aOaG+BeXsC1vAwgkR57vffMNFPTU4qicnjgy6Itos/or6nG7nxcQjqP3QfdUVC9QSsKAO8KAO0qhcOKVGLjFCwzDwENZ1G0IBIzyHQUEd2b0cwtsVVNHboMMaPvAo5O4PYyQ8QaKyHsLLEJnNBwBMDLgC2TGiTYUCLRGBeuex6fE1XJwItD6FuoB+bj70LoyKExtOnUNvdBSs+AjMeVz0aNGrFdGX/AgDOPCUi5CmjQ4xmSUqcsVE3GjB5G6mBo4h2v4Xw0BCcdBrTx9+DM3wDsydPIPr6G9h64QIkef/c2bNg//5DbFE4uuWdoZgRijshQdUVXBUO1Gqlz3zsZhVfTTXMSxeR+vUXiLpNsBMJ1zmNB6pg/vA9ktcuu2FqT1MOSSUoOgL58FN1BcWdsAgAycKOiYiThblUDtOZ/KwSk5+OzM9C3kyCEc3w6eptkmbKGbMpcsgp9boMptZlzs2GvFCIBNa+L64BYGqG+OnRffDlTDj/G42t6hZYiXajxLrMf82EK9cUl/8EGAAluAAKvGl1cAAAAABJRU5ErkJggg==",
|
||||
"rtf.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAApVJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/7vWLThP1D/fEIOQMZMDFQE6nKSDOqyEgmEHIEMqOoAQT4eBl1lOQYFCRGiHUFVB/BycTKICQkwmGgoMUgKCxDlCKo6gIONlUGQhxvoCH4Ga101ohxBNQeAEhQLCzMDJwcb3BFWOoQdwURMSiUGgw1jZGRgY2UBOoId7AhxYcKOYKFmFJy5cY/h7tOXDP+ADvr79x/D7z9/GL79/AVMGxwMrz8wgRzxAaiskKAD/pNhuY2+BsOzN+9xyjsB8Yz1uw2ICgGM0orIBKgkJUayPqrmAnIA1UKAug4YDYGBdsC/fwMdBQwDHQJ//w2wA0Z8Ivz779/gccDbDx8Z3nz4BOeLCPAxCAvwY4iDgKyEGFj824+fKGJcwOqZxGyIiILD5y4zbNp/DEW+NDGC4eaDR1jFN+0/CpR7jCKmriBLmgP+IIUAyDFqQAOK4sPA/JaZixiu33vI4ONgxeBlZ8nQt3AVg5q8DJgPK8Z97C3hfHTziIuCv39REuTjF68Y+hasBPOfvHjNEOJqD1cDaxEh87ccPA7GqkCHFcSGkJEGkMoBUJbkZGdnkBQTYTh4+gJDarA3g5KMFEINUB7WAoLxzXU1Gcz0NBm4gPr+EihTsEfBX9QoEOLnZfB3tAE2OtgYlmzdw1ADdADIUbAgB6mB6QHxBfh4GRSlpTDMIrpB8gcYnDD8DxrEILaVoS7YETuOnITL/4eGAC4+MiYhBBCKDTRUGDQU5cBirMBmd0qID8OHT1/gakAJkYOdDSefvHIAKdj4uLnBGCaGzhcTEkTRg84nywG7Tl+iW0kIEGAAQRvYtNeeH38AAAAASUVORK5CYII=",
|
||||
"ots.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA6xJREFUeNrEV0toE2EQ/tJs0iRNmjSNtkkbC9quSn1WihefBz3oQaygCCLqSbyIiAcFRSx4ERXBgxcRBEVEfKC9qNAK4oNIRaVYG7RobWM1sY+kee3L/f90Y5Ju211NdWD4d+af+efLzPyzWYMkScilba0L2x0V5nXQSamEgHRS6Lh9onv9VHaF8Rg1I3a5W298hHpj4EYs61pOLbgig9ir1a8ERaTGusVoqKvfQ0D8FwDVrho0syt1gWCKCcBVVgmXw6mIMghgunIUFYDVbIPHUZVpNo0gGPVO1R+cuJgYM+zW8nzlNCCKmoESQwnMTGk+iAySSUEUFcDTrg5093XJGRTBizxSXBJjySiMMMFmsZLGJGZ7ZwTA7NoyfI+9wfdEwUZphmvdVvQF+T3aAPxBDxiNBtid5qmvHGPQ2oTaESTjPHhOoj42uwlGlSBT/a6/KkF0KI3EGA9RlOgaDkXApQXEYxzs5SYwZgP89U5U1dp1zgGNCXC4zJQV8s9zYDiSgqfaqn6epBGAWGAov+UQj3LZGcGYSmjKI4NJqhd4keodLhPmsM4J/ronoZRzwo/+OERBQqmNoasCRhi3cVdZ4KwshdXGqPr/UQ/k9qDHZ5uwz6dF+dcn6B7pfu3TUyrOLTCaDPK9t+m+Mdp7QMQ/I/UMCNKMBJO0Z0D6vxkQZqgE2jNQgKDC5oVb5p/xEIZkJjTP0zTBb2AkiAQXze59DHdO29yTAPj9vGXpQTTXbcbAcA98LhaBz2249+YCNszflwEyqwn9w0Ek5cB3Zf3+VRdhMdmRSMfgLvPi7OPdMuhvOm/BeAZIwDX1O3Dm4e4sgCMbr+LlpzZcbD9Abc5vf4E7r8/j449OCsbnbMCxOxtoJnY2H8fcyuUIRNv0DSKez5g2elcjONiJL+EPVCYrkYle0WUAS9SH6L4O9eD01kd49/UJ3sr84lOb/hII4wDkPzbUSZGVQ4g+VycIGZsYH8Xp+7uwxL8WbFUTWpoOwetkcStwbtISqH4X8JxIubO3HWz1CnjLG6hMViITvWKjACDPi3xr0NpyD+/7X+HG87N4FnyAGldD1lbzLVBK0Dv4AQ/fXsfhTZfQF+mBv5KlMtEXZoz4dPUFMLZsFMe3XEMkFoLfzeJyx8nseWovKYPax2lZhSXv49Tj8MJT7kN4dADhaCjPfkHNClr7eCqWp1N6JlefjKZx82iXYdoMcOn8ORCK9FNWo3e9AU06XU3IpfiZmYQqE/aXAAMASAvvftCvl/IAAAAASUVORK5CYII=",
|
||||
"yml.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAphJREFUeNpi/P//PwMyKJ68eL+ytLgDA4ng/eevDO8+fVnQlxeXiE8dun1gAWRcNGnR/v9kgJ0nL/6vm73yP1D/fEIOQMZMDFQEBiryDJLCAgmEHIEMqOoAQT4eBisdVQZJIX6iHUFVB/ByczKICQkwWOmqEe0IqjqAg42NQZCXmyRHUNUBrCzMDFwc7HBHWOoQdgQTMSmVWMzEyMjAxsoCd4S4MMgR+NMECzVD4MyNewx3n75k+Ad0zN+//xh+/fnD8P3HLwZeLk6G1x8/gxzxAaiskKAD/pNhuY2+BsOzN+9xyjsB8Yz1uw2ICgGM0oqoBMjKoCQlRrI+qiZCcgDVQoC6DhgNgYF2wL9/Ax0FDAMdAn//DbADRnwi/EvHVMiEywEgvH7vYYZrdx/C+YfOXgJjkBhI7tW792BxdD4yGxmT4ID/cDx33TaGL9++Mzx49hLMFuTjZbh+7yHDrmNnGA6fvQxWs2HfETD/5bsPUP5ROBsZkxwC3vaWDBwcbGDDV2zfx+BkbsSgIi8DTqSqCrIMNx48Bqt79OIVg4yEGLD8+A/3KYxNXgj8/QvHsb5uDFsOHmd4+/4jg5etOVgMlEhlxEQYHgMtvgEMDX01ZbDYP5BFQHmIA/6hmAMTJy4RIpUDkiLCDKpy0mCfs7GyguVg2VRPVYnh+MWrDCpyMgxvL32EWvoPyQH/yEuEf4AakfF/aJDC+CA2CCvJSjFcunWPQUtZAazmL1QNCDx68ZrhJjCKQPgzMA39weEYFuwOQA0uCWAo8PPywMVBbBDQUFJg0Hr4BNgaZgGrYQU2SEFqIA67C8Yg4OdozSAlKkK+A7zsLFDEDTRU4HLBrvZgcWQ1KcE+BM0kOg0MSEm46/QlujkAIMAA7+kxX/dcFXgAAAAASUVORK5CYII="
|
||||
},
|
||||
currentDir: "", // this is the global variable for the current directory; it is used for AJAX requests
|
||||
// --------------
|
||||
// main functions
|
||||
// --------------
|
||||
refreshFileTable: function () {
|
||||
if(document.getElementById("multiseloptions"))$("#multiseloptions").remove();
|
||||
var id=ifm.generateGuid();
|
||||
ifm.task_add("Refresh", id);
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: "api=getFiles&dir="+ifm.currentDir,
|
||||
dataType: "json",
|
||||
success:
|
||||
function(data) {
|
||||
$("#filetable tbody tr").remove();
|
||||
for(i=0;i<data.length;i++) {
|
||||
var newrow = "<tr>";
|
||||
var multisel = '';
|
||||
if(ifm.config.multiselect == 1) {
|
||||
multisel = '<input type="checkbox" ';
|
||||
multisel += (!ifm.inArray(data[i].name, ["..", "."]))?'id="'+data[i].name+'" name="multisel"':'style="visibility:hidden"';
|
||||
multisel += '>';
|
||||
}
|
||||
if(data[i].type=="file")
|
||||
newrow += '<td>'+multisel+'<a href="'+ifm.pathCombine(ifm.currentDir,data[i].name)+'"><img src="'+ifm.icons[data[i].picture]+'" alt=""> '+data[i].name+'</td>';
|
||||
else
|
||||
newrow += '<td>'+multisel+'<a onclick="ifm.changeDirectory(\''+data[i].name+'\')"><img src="'+ifm.icons[data[i].picture]+'" alt=""> '+data[i].name+'</td>'
|
||||
if(ifm.config.download == 1) {
|
||||
if(data[i].type != "dir")
|
||||
newrow += '<td class="download-link">\
|
||||
<form style="display:none;" id="fdownload'+i+'" method="post">\
|
||||
<fieldset>\
|
||||
<input type="hidden" name="dir" value="'+ifm.currentDir+'">\
|
||||
<input type="hidden" name="filename" value="'+data[i].name+'">\
|
||||
<input type="hidden" name="api" value="downloadFile">\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
<a onclick="$(\'#fdownload'+i+'\').submit();"><img src="'+ifm.icons["download.png"]+'" style="width:19px;" alt="download"></a>\
|
||||
</td>';
|
||||
else
|
||||
newrow += '<td></td>'; // empty cell for download link
|
||||
}
|
||||
if(data[i].lastmodified) newrow += '<td>'+data[i].lastmodified+'</td>';
|
||||
if(data[i].filesize) newrow += '<td>'+data[i].filesize+'</td>';
|
||||
if(data[i].fileperms) {
|
||||
newrow += '<td><input type="text" name="newperms" value="'+data[i].fileperms+'"';
|
||||
if(ifm.config.chmod == 1)
|
||||
newrow += ' onkeypress="ifm.changePermissions(event, \''+data[i].name+'\');"';
|
||||
else
|
||||
newrow += " readonly";
|
||||
newrow += '></td>';
|
||||
}
|
||||
if(data[i].owner) newrow += '<td>'+data[i].owner+'</td>';
|
||||
if(data[i].group) newrow += '<td>'+data[i].group+'</td>';
|
||||
if(ifm.inArray(1,[ifm.config.edit, ifm.config.rename, ifm.config.delete, ifm.config.zipnload, ifm.config.extract])) {
|
||||
newrow += '<td>';
|
||||
if(data[i].name != ".." && data[i].name != ".") {
|
||||
if(data[i].type == "dir") {
|
||||
if(ifm.config.zipnload == 1)
|
||||
newrow += '<form method="post" style="display:inline-block;padding:0;margin:0;border:0;">\
|
||||
<fieldset style="display:inline-block;padding:0;margin:0;border:0;">\
|
||||
<input type="hidden" name="dir" value="'+ifm.currentDir+'">\
|
||||
<input type="hidden" name="filename" value="'+data[i].name+'">\
|
||||
<input type="hidden" name="api" value="zipnload">\
|
||||
<button type="submit"><img src="'+ifm.icons["zipnload.png"]+'" alt="zip&load"></button>\
|
||||
</fieldset>\
|
||||
</form>';
|
||||
}
|
||||
else if(data[i].name.toLowerCase().substr(-4) == ".zip") {
|
||||
if(ifm.config.extract == 1) newrow += '<button onclick="ifm.extractFileDialog(\''+ifm.JSEncode(data[i].name)+'\');return false;"><img src="'+ifm.icons["extract.png"]+'" alt="extract" /></button>';
|
||||
}
|
||||
else {
|
||||
if(ifm.config.edit == 1) newrow += '<button onclick="ifm.showLoading();ifm.editFile(\''+ifm.JSEncode(data[i].name)+'\');return false;"><img src="'+ifm.icons["edit.png"]+'" alt="edit" /></button>';
|
||||
}
|
||||
if(ifm.config.rename == 1) newrow += '<button onclick="ifm.renameFileDialog(\''+ifm.JSEncode(data[i].name)+'\');return false;"><img src="'+ifm.icons["rename.png"]+'" alt="rename" /></button>';
|
||||
if(ifm.config.delete == 1) newrow += '<button onclick="ifm.deleteFileDialog(\''+ifm.JSEncode(data[i].name)+'\');return false;"><img src="'+ifm.icons["delete.png"]+'" alt="delete" /></button>';
|
||||
}
|
||||
newrow += '</td></tr>';
|
||||
}
|
||||
$("#filetable tbody").append(newrow);
|
||||
}
|
||||
// bind multiselect handler
|
||||
if(ifm.config.multiselect == 1) {
|
||||
$("input[name=multisel]").on("change", function(){ ifm.handleMultiSelect(); });
|
||||
}
|
||||
// bind Fancybox
|
||||
var piclinks = $('a[href$=".bmp"],a[href$=".gif"],a[href$=".jpg"],a[href$=".jpeg"],a[href$=".png"],a[href$=".BMP"],a[href$=".GIF"],a[href$=".JPG"],a[href$=".JPEG"],a[href$=".PNG"]');
|
||||
piclinks.attr('rel', 'fancybox').fancybox();
|
||||
var xOffset = 10;
|
||||
var yOffset = 30;
|
||||
piclinks.hover(function(e){this.t = this.title;this.title = "";var c = (this.t != "") ? "<br/>" + this.t : "";$("body").append("<p id='mdPicPreview'><img src='"+ this.href +"' alt='Image preview' />"+ c +"</p>");$("#mdPicPreview").css("top",(e.pageY - xOffset) + "px").css("left",(e.pageX + yOffset) + "px").fadeIn("fast");},function(){this.title = this.t;$("#mdPicPreview").remove();});
|
||||
piclinks.mousemove(function(e){$("#mdPicPreview").css("top",(e.pageY - xOffset) + "px").css("left",(e.pageX + yOffset) + "px");});
|
||||
},
|
||||
error: function(response) { ifm.showMessage("General error occured: No or broken response", "e"); },
|
||||
complete: function() { ifm.task_done(id); }
|
||||
});
|
||||
},
|
||||
changeDirectory: function(newdir) {
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "getRealpath",
|
||||
dir: ifm.pathCombine(ifm.currentDir, newdir)
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
ifm.currentDir = data.realpath;
|
||||
ifm.refreshFileTable();
|
||||
$("#currentDir").val(ifm.currentDir);
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured: No or broken response", "e"); }
|
||||
});
|
||||
},
|
||||
showFileForm: function () {
|
||||
var filename = arguments.length > 0 ? arguments[0] : "newfile.txt";
|
||||
var content = arguments.length > 1 ? arguments[1] : "";
|
||||
var overlay = '<div class="overlay">\
|
||||
<form id="showFile">\
|
||||
<fieldset>\
|
||||
<label>Filename:</label>\
|
||||
<input type="text" name="filename" value="'+filename+'" />\
|
||||
<div id="content" name="content"></div>\
|
||||
<div id="showFileButtons"><button onclick="ifm.saveFile();ifm.closeFileForm();return false;">Save</button>\
|
||||
<button onclick="ifm.saveFile();return false;">Save without closing</button>\
|
||||
<button onclick="ifm.closeFileForm();return false;">Close</button>\
|
||||
<select id="aceTheme">\
|
||||
<option value="chrome">chrome</option>\
|
||||
<option value="eclipse">eclipse</option>\
|
||||
<option value="ambiance">ambiance</option>\
|
||||
<option value="clouds_midnight">clouds_midnight</option>\
|
||||
<option value="mono_industrial">mono_industrial</option>\
|
||||
<option value="monokai">monokai</option>\
|
||||
<option value="terminal">terminal</option>\
|
||||
<option value="twilight">twilight</option>\
|
||||
</select>\
|
||||
<select id="aceMode">\
|
||||
<option value="apache_conf">apache_conf</option>\
|
||||
<option value="c_cpp">c_cpp</option>\
|
||||
<option value="csharp">csharp</option>\
|
||||
<option value="css">css</option>\
|
||||
<option value="html">html</option>\
|
||||
<option value="html_completions">html_completions</option>\
|
||||
<option value="ini">ini</option>\
|
||||
<option value="java">java</option>\
|
||||
<option value="javascript">javascript</option>\
|
||||
<option value="json">json</option>\
|
||||
<option value="mysql">mysql</option>\
|
||||
<option value="perl">perl</option>\
|
||||
<option value="php">php</option>\
|
||||
<option value="python">python</option>\
|
||||
<option value="sql">sql</option>\
|
||||
<option value="text">text</option>\
|
||||
</select>\
|
||||
</div>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>';
|
||||
$(document.body).prepend(overlay);
|
||||
$("#aceTheme").change(function() { ifm.editor.setTheme("ace/theme/"+this.value); });
|
||||
$("#aceMode").change(function() { ifm.editor.getSession().setMode("ace/mode/"+this.value); });
|
||||
if(filename=="")$("#showFile input[name=filename]").focus();
|
||||
else $("#showFile #content").focus();
|
||||
$(".overlay").on("remove", function () { ifm.editor = null; ifm.fileChanged = false; });
|
||||
ifm.bindOverlayClickEvent();
|
||||
// Start ACE
|
||||
ifm.editor = ace.edit("content");
|
||||
ifm.editor.getSession().setValue(content);
|
||||
var modelist = ace.require('ace/ext/modelist');
|
||||
var settingsMenu = ace.require('ace/ext/settings_menu');
|
||||
settingsMenu.init();
|
||||
ifm.editor.getSession().setUseWorker(false);
|
||||
ifm.editor.getSession().setMode(modelist.getModeForPath(filename).mode);
|
||||
ifm.editor.commands.addCommands([{
|
||||
name: "showSettingsMenu",
|
||||
bindKey: {win: "Ctrl-q", mac: "Command-q"},
|
||||
exec: function(editor) {
|
||||
ifm.editor.showSettingsMenu();
|
||||
},
|
||||
readOnly: true
|
||||
}]);
|
||||
var curMode = ifm.editor.getSession().getMode().$id;
|
||||
console.log("curMode: "+curMode);
|
||||
$("#aceMode option[value="+curMode.substring(curMode.lastIndexOf('/')+1)+"]").attr("selected", true);
|
||||
ifm.editor.focus();
|
||||
ifm.editor.on("change", function() { ifm.fileChanged = true; });
|
||||
},
|
||||
closeFileForm: function() {
|
||||
ifm.fileChanged = false;
|
||||
ifm.editor = null;
|
||||
ifm.hideSaveQuestion();
|
||||
ifm.removeOverlay();
|
||||
},
|
||||
removeOverlay: function() {
|
||||
$('.overlay').remove();
|
||||
},
|
||||
createDirForm: function() {
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="createDir">\
|
||||
<fieldset>\
|
||||
<label>Directoy name:</label>\
|
||||
<input type="text" name="dirname" value="" />\
|
||||
<button onclick="ifm.createDir();$(\'.overlay\').remove();return false;">Save</button><button onclick="$(\'.overlay\').remove();return false;">Cancel</button>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
ajaxRequestDialog: function() {
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="ajaxrequest">\
|
||||
<fieldset>\
|
||||
<label>URL</label><br>\
|
||||
<input type="text" id="ajaxurl" required><br>\
|
||||
<label>Data</label><br>\
|
||||
<textarea id="ajaxdata"></textarea><br>\
|
||||
<label>Method</label><br>\
|
||||
<input type="radio" name="arMethod" value="GET">GET</input><input type="radio" name="arMethod" value="POST" checked="checked">POST</input><br>\
|
||||
<button onclick="ifm.ajaxRequest();return false;">Request</button>\
|
||||
<button onclick="$(\'.overlay\').remove();return false;">Close</button><br>\
|
||||
<label>Response</label><br>\
|
||||
<textarea id="ajaxresponse"></textarea>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
ajaxRequest: function() {
|
||||
ifm.showLoading();
|
||||
$.ajax({
|
||||
url : $("#ajaxurl").val(),
|
||||
cache : false,
|
||||
data : $('#ajaxdata').val().replace(/\n/g,"&"),
|
||||
type : $('#ajaxrequest input[name=arMethod]:checked').val(),
|
||||
success : function(response) { $("#ajaxresponse").text(response); },
|
||||
error : function(e) { ifm.showMessage("Error: "+e, "e"); console.log(e); },
|
||||
complete: function() { ifm.hideLoading(); }
|
||||
});
|
||||
},
|
||||
saveFile: function() {
|
||||
var _content = ifm.editor.getValue();
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "saveFile",
|
||||
dir: ifm.currentDir,
|
||||
filename: $("#showFile input[name^=filename]").val(),
|
||||
content: _content
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("File successfully edited/created.", "s");
|
||||
ifm.refreshFileTable();
|
||||
} else ifm.showMessage("File could not be edited/created:"+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); }
|
||||
});
|
||||
ifm.fileChanged = false;
|
||||
},
|
||||
editFile: function(name) {
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
dataType: "json",
|
||||
data: ({
|
||||
api: "getContent",
|
||||
dir: ifm.currentDir,
|
||||
filename: name
|
||||
}),
|
||||
success: function(data) {
|
||||
if(data.status == "OK" && data.data.content != null) {
|
||||
ifm.showFileForm(data.data.filename, data.data.content);
|
||||
}
|
||||
else if(data.status == "OK" && data.data.content == null) {
|
||||
ifm.showMessage("The content of this file cannot be fetched.", "e");
|
||||
}
|
||||
else ifm.showMessage("Error: "+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("This file can not be displayed or edited.", "e"); },
|
||||
complete: function() { ifm.hideLoading(); }
|
||||
});
|
||||
},
|
||||
deleteFileDialog: function(name) {
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="deleteFile">\
|
||||
<fieldset>\
|
||||
<label>Do you really want to delete the file '+name+'?\
|
||||
<button onclick="ifm.deleteFile(\''+ifm.JSEncode(name)+'\');$(\'.overlay\').remove();return false;">Yes</button><button onclick="$(\'.overlay\').remove();return false;">No</button>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
deleteFile: function(name) {
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "deleteFile",
|
||||
dir: ifm.currentDir,
|
||||
filename: name
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("File successfully deleted", "s");
|
||||
ifm.refreshFileTable();
|
||||
} else ifm.showMessage("File could not be deleted", "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); }
|
||||
});
|
||||
},
|
||||
createDir: function() {
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "createDir",
|
||||
dir: ifm.currentDir,
|
||||
dirname: $("#createDir input[name^=dirname]").val()
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("Directory sucessfully created.", "s");
|
||||
ifm.refreshFileTable();
|
||||
}
|
||||
else {
|
||||
ifm.showMessage("Directory could not be created: "+data.message, "e");
|
||||
}
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured.", "e"); }
|
||||
});
|
||||
},
|
||||
renameFileDialog: function(name) {
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="renameFile">\
|
||||
<fieldset>\
|
||||
<label>Rename '+name+' to:</label>\
|
||||
<input type="text" name="newname" />\
|
||||
<button onclick="ifm.renameFile(\''+ifm.JSEncode(name)+'\');$(\'.overlay\').remove();return false;">Rename</button><button onclick="$(\'.overlay\').remove();return false;">Cancel</button>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
renameFile: function(name) {
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "renameFile",
|
||||
dir: ifm.currentDir,
|
||||
filename: name,
|
||||
newname: $("#renameFile input[name^=newname]").val()
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("File successfully renamed", "s");
|
||||
ifm.refreshFileTable();
|
||||
} else ifm.showMessage("File could not be renamed: "+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); }
|
||||
});
|
||||
},
|
||||
extractFileDialog: function(name) {
|
||||
var fuckWorkarounds="";
|
||||
if(fuckWorkarounds.lastIndexOf(".") > 1)
|
||||
fuckWorkarounds = name.substr(0,name.length-4);
|
||||
else fuckWorkarounds = name;
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="extractFile">\
|
||||
<fieldset>\
|
||||
<label>Extract '+name+' to:</label>\
|
||||
<button onclick="ifm.extractFile(\''+ifm.JSEncode(name)+'\', 0);$(\'.overlay\').remove();return false;">here</button>\
|
||||
<button onclick="ifm.extractFile(\''+ifm.JSEncode(name)+'\', 1);$(\'.overlay\').remove();return false;">'+fuckWorkarounds+'/</button>\
|
||||
<button onclick="$(\'.overlay\').remove();return false;">Cancel</button>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
extractFile: function(name, t) {
|
||||
var td = (t == 1)? name.substr(0,name.length-4) : "";
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "extractFile",
|
||||
dir: ifm.currentDir,
|
||||
filename: name,
|
||||
targetdir: td
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("File successfully extracted", "s");
|
||||
ifm.refreshFileTable();
|
||||
} else ifm.showMessage("File could not be extracted. Error: "+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); }
|
||||
});
|
||||
},
|
||||
uploadFileDialog: function() {
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="uploadFile">\
|
||||
<fieldset>\
|
||||
<label>Upload file</label><br>\
|
||||
<input type="file" name="ufile" id="ufile"><br>\
|
||||
<label>new filename</label>\
|
||||
<input type="text" name="newfilename"><br>\
|
||||
<button onclick="ifm.uploadFile();$(\'.overlay\').remove();return false;">Upload</button>\
|
||||
<button onclick="$(\'.overlay\').remove();return false;">Cancel</button>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
uploadFile: function() {
|
||||
var ufile = document.getElementById('ufile').files[0];
|
||||
var data = new FormData();
|
||||
var newfilename = $("#uploadFile input[name^=newfilename]").val();
|
||||
data.append('api', 'uploadFile');
|
||||
data.append('dir', ifm.currentDir);
|
||||
data.append('file', ufile);
|
||||
data.append('newfilename', newfilename);
|
||||
var id = ifm.generateGuid();
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: data,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
dataType: "json",
|
||||
xhr: function(){
|
||||
var xhr = $.ajaxSettings.xhr() ;
|
||||
xhr.upload.onprogress = function(evt){ ifm.task_update(evt.loaded/evt.total*100,id); } ;
|
||||
xhr.upload.onload = function(){ console.log('Uploading '+newfilename+' done.') } ;
|
||||
return xhr ;
|
||||
},
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("File successfully uploaded", "s");
|
||||
if(data.cd == ifm.currentDir) ifm.refreshFileTable();
|
||||
} else ifm.showMessage("File could not be uploaded: "+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); },
|
||||
complete: function() { ifm.task_done(id); }
|
||||
});
|
||||
ifm.task_add("Upload "+ufile.name, id);
|
||||
},
|
||||
changePermissions: function(e, name) {
|
||||
if(e.keyCode == '13')
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "changePermissions",
|
||||
dir: ifm.currentDir,
|
||||
filename: name,
|
||||
chmod: e.target.value
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("Permissions successfully changed.", "s");
|
||||
ifm.refreshFileTable();
|
||||
}
|
||||
else {
|
||||
ifm.showMessage("Permissions could not be changed: "+data.message, "e");
|
||||
}
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured.", "e"); }
|
||||
});
|
||||
},
|
||||
remoteUploadDialog: function() {
|
||||
$(document.body).prepend('<div class="overlay">\
|
||||
<form id="uploadFile">\
|
||||
<fieldset>\
|
||||
<label>Remote upload URL</label><br>\
|
||||
<input type="text" id="url" name="url" required><br>\
|
||||
<label>Filename (required)</label>\
|
||||
<input type="text" id="filename" name="filename" required><br>\
|
||||
<label>Method</label>\
|
||||
<input type="radio" name="method" value="curl" checked="checked">cURL<input type="radio" name="method" value="file">file</input><br>\
|
||||
<button onclick="ifm.remoteUpload();$(\'.overlay\').remove();return false;">Upload</button>\
|
||||
<button onclick="$(\'.overlay\').remove();return false;">Cancel</button>\
|
||||
</fieldset>\
|
||||
</form>\
|
||||
</div>');
|
||||
// guess the wanted filename, because it is required
|
||||
// e.g http:/example.com/example.txt => filename: example.txt
|
||||
$("#url").on("change keyup", function(){
|
||||
$("#filename").val($(this).val().substr($(this).val().lastIndexOf("/")+1));
|
||||
});
|
||||
// if the filename input field was edited manually remove the event handler above
|
||||
$("#filename").on("keyup", function() { $("#url").off(); });
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
remoteUpload: function() {
|
||||
var filename = $("#filename").val();
|
||||
var id = ifm.generateGuid();
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "remoteUpload",
|
||||
dir: ifm.currentDir,
|
||||
filename: filename,
|
||||
method: $("input[name=method]:checked").val(),
|
||||
url: encodeURI($("#url").val())
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
ifm.showMessage("File successfully uploaded", "s");
|
||||
ifm.refreshFileTable();
|
||||
} else ifm.showMessage("File could not be uploaded:<br />"+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); },
|
||||
complete: function() { ifm.task_done(id); }
|
||||
});
|
||||
ifm.task_add("Remote upload: "+filename, id);
|
||||
},
|
||||
// --------------------
|
||||
// additional functions
|
||||
// --------------------
|
||||
showMessage: function(m, t) {
|
||||
var message = '<div id="mess"><div class="';
|
||||
if(t == "e") message += "message_error";
|
||||
else if(t == "s") message += "message_successful";
|
||||
else message += "message";
|
||||
message += '">'+m+'</div></div>';
|
||||
$(document.body).prepend(message);
|
||||
$("#mess").delay(2000).fadeOut('slow');
|
||||
setTimeout(function() { // remove the message from the DOM after 3 seconds
|
||||
$('#mess').remove();
|
||||
}, 3000);
|
||||
},
|
||||
showLoading: function() {
|
||||
var loading = '<div id="loading">'+ifm.loadingAnim+'</div>';
|
||||
if(document.getElementById("loading")==null)$(document.body).prepend(loading);
|
||||
},
|
||||
hideLoading: function() {
|
||||
$("#loading").remove();
|
||||
},
|
||||
pathCombine: function(a, b) {
|
||||
if(a == "" && b == "") return "";
|
||||
if(b[0] == "/") b = b.substring(1);
|
||||
if(a == "") return b;
|
||||
if(a[a.length-1] == "/") a = a.substring(0, a.length-1);
|
||||
if(b == "") return a;
|
||||
return a+"/"+b;
|
||||
},
|
||||
bindOverlayClickEvent: function() {
|
||||
$(".overlay").off('click');
|
||||
$(".overlay *").off('click');
|
||||
$(".overlay").click(function() {
|
||||
var isFileForm = !!$(".overlay #showFile")[0];
|
||||
var isSaveQuestion = !!$("#savequestion")[0];
|
||||
if(isFileForm && !isSaveQuestion && ifm.fileChanged) {
|
||||
ifm.showSaveQuestion();
|
||||
}
|
||||
else if(isFileForm && isSaveQuestion) {
|
||||
ifm.hideSaveQuestion();
|
||||
ifm.closeFileForm();
|
||||
}
|
||||
else { ifm.removeOverlay(); }
|
||||
});
|
||||
$(".overlay *").click(function(e) { e.stopPropagation(); });
|
||||
},
|
||||
showSaveQuestion: function() {
|
||||
var a = '<div id="savequestion"><label>Do you want to save this file?</label><br><button onclick="ifm.saveFile();ifm.closeFileForm(); return false;">Save</button><button onclick="ifm.closeFileForm();return false;">Dismiss</button>';
|
||||
$(document.body).prepend(a);
|
||||
ifm.bindOverlayClickEvent();
|
||||
},
|
||||
hideSaveQuestion: function() { $("#savequestion").remove(); },
|
||||
handleMultiSelect: function() {
|
||||
var amount = $("input[name=multisel]:checked").length;
|
||||
if(amount > 0) {
|
||||
if(document.getElementById("multiseloptions")===null) {
|
||||
$(document.body).prepend('<div id="multiseloptions">\
|
||||
<div style="font-size:0.8em;background-color:#00A3A3;padding:2px;">\
|
||||
<a style="color:#FFF" onclick="$(\'input[name=multisel]\').attr(\'checked\', false);$(\'#multiseloptions\').remove();">[close]</a>\
|
||||
</div>\
|
||||
<ul><li><a onclick="ifm.multiDelete();"><img src="'+ifm.icons['delete.png']+'" alt=""> delete (<span class="amount"></span>)</a></li></ul></div>\
|
||||
');
|
||||
$("#multiseloptions").draggable();
|
||||
//$("#multiseloptions").resizable({ghost: true, minHeight: 50, minWidth: 100});
|
||||
}
|
||||
$("#multiseloptions .amount").text(amount);
|
||||
}
|
||||
else {
|
||||
if(document.getElementById("multiseloptions")!==null)
|
||||
$("#multiseloptions").remove();
|
||||
}
|
||||
},
|
||||
multiDelete: function() {
|
||||
var jel = $("input[name=multisel]:checked");
|
||||
if(jel.length == 0) {
|
||||
ifm.showMessage("No files chosen");
|
||||
return;
|
||||
}
|
||||
var ids = [];
|
||||
for(var i = 0; i < jel.length; i++) ids.push(jel[i].id);
|
||||
$.ajax({
|
||||
url: ifm.IFM_SCFN,
|
||||
type: "POST",
|
||||
data: ({
|
||||
api: "deleteMultipleFiles",
|
||||
dir: ifm.currentDir,
|
||||
filenames: ids
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.status == "OK") {
|
||||
if(data.errflag == 1)
|
||||
ifm.showMessage("All files successfully deleted.", "s");
|
||||
else if(data.errflag == 0)
|
||||
ifm.showMessage("Some files successfully deleted. "+data.message);
|
||||
else
|
||||
ifm.showMessage("Files could not be deleted. "+data.message, "e");
|
||||
ifm.refreshFileTable();
|
||||
} else ifm.showMessage("Files could not be deleted:<br />"+data.message, "e");
|
||||
},
|
||||
error: function() { ifm.showMessage("General error occured", "e"); }
|
||||
});
|
||||
},
|
||||
inArray: function(needle, haystack) {
|
||||
for(var i = 0; i < haystack.length; i++) { if(haystack[i] == needle) return true; } return false;
|
||||
},
|
||||
task_add: function(name,id) { // uFI stands for uploadFileInformation
|
||||
if(!document.getElementById("waitqueue")) {
|
||||
$(document.body).prepend('<div id="waitqueue"></div>');
|
||||
$("#waitqueue").on("mouseover", function() { $(this).toggleClass("left"); });
|
||||
}
|
||||
$("#waitqueue").append('<div id="'+id+'"><div class="progress"></div> '+name+'</div>');
|
||||
$("#"+id+" .progress").progressbar({value: false});
|
||||
},
|
||||
task_done: function(id) {
|
||||
$("#"+id).remove();
|
||||
if($("#waitqueue>div").length == 0) {
|
||||
$("#waitqueue").remove();
|
||||
}
|
||||
},
|
||||
task_update: function(progress, id) {
|
||||
$("#"+id+" .progress").progressbar({ value: progress});
|
||||
},
|
||||
generateGuid: function() {
|
||||
var result, i, j;
|
||||
result = '';
|
||||
for(j=0; j<20; j++) {
|
||||
i = Math.floor(Math.random()*16).toString(16).toUpperCase();
|
||||
result = result + i;
|
||||
}
|
||||
return result;
|
||||
},
|
||||
JSEncode: function(s) {
|
||||
return s.replace(/'/g, '\\x27').replace(/"/g, '\\x22');
|
||||
},
|
||||
// static button bindings and filetable initial filling
|
||||
init: function() {
|
||||
// fill file table
|
||||
this.refreshFileTable();
|
||||
// bind static buttons
|
||||
$("#refresh").click(function(){
|
||||
ifm.refreshFileTable();
|
||||
});
|
||||
$("#createFile").click(function(){
|
||||
ifm.showFileForm();
|
||||
});
|
||||
$("#createDir").click(function(){
|
||||
ifm.createDirForm();
|
||||
});
|
||||
$("#upload").click(function(){
|
||||
ifm.uploadFileDialog();
|
||||
});
|
||||
},
|
||||
// ---------------
|
||||
// further members
|
||||
// ---------------
|
||||
loadingAnim: '<div id="loadingAnim"><div class="blockG" id="rotateG_01"></div><div class="blockG" id="rotateG_02"></div><div class="blockG" id="rotateG_03"></div><div class="blockG" id="rotateG_04"></div><div class="blockG" id="rotateG_05"></div><div class="blockG" id="rotateG_06"></div><div class="blockG" id="rotateG_07"></div><div class="blockG" id="rotateG_08"></div></div>'
|
||||
}
|
||||
}
|
||||
$(document).ready(function() {ifm.init()}); // init ifm
|
189
src/includes.php
Normal file
189
src/includes.php
Normal file
File diff suppressed because one or more lines are too long
810
src/main.php
Normal file
810
src/main.php
Normal file
@@ -0,0 +1,810 @@
|
||||
<?php
|
||||
|
||||
/* =======================================================================
|
||||
* Improved File Manager
|
||||
* ---------------------
|
||||
* License: This project is provided under the terms of the MIT LICENSE
|
||||
* http://github.com/misterunknown/ifm/blob/master/LICENSE
|
||||
* =======================================================================
|
||||
*
|
||||
* main
|
||||
*/
|
||||
|
||||
class IFM {
|
||||
const VERSION = '2.0';
|
||||
|
||||
public function __construct() {
|
||||
session_start();
|
||||
}
|
||||
|
||||
/*
|
||||
this function contains the client-side application
|
||||
*/
|
||||
|
||||
public function getApplication() {
|
||||
print '<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>IFM - improved file manager</title>
|
||||
<meta charset="utf-8"><script>'.IFMIncludes::getJquery().'</script>
|
||||
<script>'.IFMIncludes::getJqueryUI().'</script>
|
||||
<script>'.IFMIncludes::getAce().'</script>
|
||||
<script>'.IFMIncludes::getJqueryFancybox().'</script>
|
||||
<style type="text/css">
|
||||
'; ?>
|
||||
@@@COMPILE:style.css@@@
|
||||
<?php
|
||||
print ''.IFMIncludes::getJqueryUICSS()."\n".IFMIncludes::getJqueryFancyboxCSS().'
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
'; ?>
|
||||
@@@COMPILE:ifm.js@@@
|
||||
<?php print '
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<table id="tooltab">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="cell_content">
|
||||
Content of <span id="docroot">';
|
||||
if(IFMConfig::showpath == 1) print getScriptRoot().'/'; else print '/';
|
||||
print '</span><input id="currentDir" type="text">
|
||||
</td>
|
||||
<td class="cell_buttons">
|
||||
<div>';
|
||||
// refresh button - always shows
|
||||
print '<button id="refresh">';
|
||||
echo ('<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAACdUlEQVRYhcWXMXraQBCFf/tLDzkBugHKCVA7FdwgpEkbpU1jfAPdILqBSTWtfIIoJwjcwHTpSLEjWJaVjAT+/Bqh1czs29m3M8vdfr/nPXE/xElEUhFZvRsBYAnkIjK+lsCHgX4LYATkwApcVoAUSMymBmpV3XQFuuurAZvot73ugB/AV2Da4vIMFKq6vhWBAvjWy+lIZKGqL/7gEA0sBvgAzIAq1M2rBEQk8X6nwKTDfIdb6Z+W71PgZCs6CdhRy7yhZYf5g6qOVTVT1RT4CDxG7GYicojTSkBESiBR1dIb7kr/SSxVfVHVFfAJlxkfi6iTTTwWkcqMcm886Zgc3zYgUnNOfN5KAChxgsl9xarqRlUT3Iq+A78Cv5Gf2oBEhdPGGU4KkR2xObANUu8Hq3FFpjCfBU4nGa4oRf1w4pu1EhCRjOP5XrUEiRFaW3BEJBGRcXjWDXXM389A6QUtzywvI7O50PSwHfcAtneT8OON4RegQy1oROirtHojAqk9d3jZbgjMQ+s3QLPIwtdIrB1He7zVgQpY9dWI+U6BLXZ6GsTqQBYL4gnsp4hsRGTV40KytOdF3XBqRzKGRjwT4AFoiCRtMxvJHPhiNeQEDYGwe62t84WogveREfkrImVLRnKgbNu2hkARjI9wvTus75tYEENro1LVaJ8A70YkIjXxa9WWYxXLjFwMj9b9esE/BUtcisMJJnRfQsCd7TCLF+EgQhNIhltxXxQt9f9yAh6JFHeTCS8RPv55vwevHjpuxabojGMJBSfCCtctP9vYoL1/lUAX7A7whFt9MjT9MPyvWWXPwXt/FQGb9Jkr9r7BoC24Jf4DVBHtitmrnbcAAAAASUVORK5CYII=" alt="refresh" />');
|
||||
print '</button>';
|
||||
// upload button
|
||||
if(IFMConfig::upload == 1) {
|
||||
print '<button id="upload">';
|
||||
print '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABNUlEQVRYhe1W4c6DIAw8lD1cn/ge7lPZj4lhVaDIFrLku8RERdqjPU5cCAEjMQ3N/k/gJwiIyNu9iHgRCSIyX33zUQIiApJpEg/gbx9eRGQCAJK3SWQJVJJHrL0kLgkYk3+EhCsZkSF5ipnkFufFBdwm0Jj8RMKKkghdY3Lg1Y6mCb4yvgFISzSr8VU9N/9YihpIsa8s/TiQ7DYyF0KwKtfhVZGDADqdlOTRAl3aHAGNKfPeijUSWG5MdjhroDmGFmEtYE2EVhxxUgILyUduRkaEtV2Ui7Nhb53XgwUHO/W6JN5oyxfx3uI0r0ChJMLVYsc92yiKcLm6rI74rROR2RGHH8laNaD/DTmYK3AiUOhdIGlxzCOORQeaQNFaew6fCbLb0KPfWpsxXITm88C3MLwCwwk8Af8Lgc7C878GAAAAAElFTkSuQmCC" alt="Upload" />';
|
||||
print '</button>';
|
||||
}
|
||||
// create file button
|
||||
if(IFMConfig::createfile == 1) {
|
||||
print '<button id="createFile">';
|
||||
print '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABDUlEQVRYhe2VsRGCQBBFn475WYIlUAIhm9mBlkIp0oHZppZACZQgFWjgoSdzCo4sJPejm+UP+2//8lkVRXFjJqjqql9bz9X8EzbdIaZuKojIxykvPoEkIAlIApKATaz4LbnG4JdUjQqYIpZFZAeUwD6oXYEzUKpqA0YWiEgG1MABcMEj52u159hYALRh426iwXsdcBGRbHILROTE45ZDcEBpYcF+mPLiWlkQnWJY8z2chQU/iY8K+BMt4EIhkSV8cs0sGImzhQU7HhngBqgtFl+BT7jcN+hE3XpTbYFcVRuTJFTVGsiAKhTizxWQeY7JEnYiGuAIr51S1W2ft/jvOAlYXMBzCWcMnzcsPoE7bQ1jbIj6ZSQAAAAASUVORK5CYII=" alt="create file" />';
|
||||
print '</button>';
|
||||
}
|
||||
// create directory button
|
||||
if(IFMConfig::createdir == 1) {
|
||||
print '<button id="createDir">';
|
||||
print '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABP0lEQVRYhe2WsVWEQBCGP3zmZweeHdiBGBhMJLHRdSAlUMJZgS1ANCl2gBV4diAV7AUc7+3dAwGZPQzuD4dd/n9nZv/ZyDnHkrhalP0i4CIAuAYQkTVQAauR+2pgrao/cwW0GcgnkHNYm80lB4icc4hIaDN4VNWy68P/6IEOfKhqvJSAGqgClaVQ1cQPdJUgB14DkAPcnAbO3QPlGAGz7/Yv2A0JKIDkdJEhng6m1yugAm4DCngBvkRk0yfgXHgXkRSOnfCTpkbPlkyqGgF9bnvnZyC3Jh+BzBcQsvv7kLRO+A3cW/21TXtfzCvHyh/HsZWAKfBngdn18xtuoAmbW2BEuqPjEAMCCksfyP6wZ2uWAQARKYGHkcvfVDW1dsKEZp6MIgfDHvAhIjGQcmxsNc043vrvwyACpmDxR+niAvY9F2dckINLRQAAAABJRU5ErkJggg==" alt="create directory" />';
|
||||
print '</button>';
|
||||
}
|
||||
// create options button
|
||||
print ' <div id="options"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOC8xOC8wOaw6EPwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAACh0lEQVRYhcWWzXHbMBCFP2VSgEqQKzBdgZXjnuwORFdguYOkAitpwHIH8ukdzVRgugKrg6gD5YClAoIgTf9k9GY0GiyweMv9xWS/33NMfDkqO/D1vYpmVgBPkehMUv1fDDCzOVACS0k7F58mx06B2s9PgRWwllQN3f1qCMzsDngEFv7foEiOxuvDeTNbf8iAlMQN6jXA9+O986ELx4RgQ3B/g9LMdsA8OTd38jKRb4Yun4wpQzP7A0xfPZhHIem5b7PjAf+KOfAT2Eja0vXCWGwlPXvFlMAFUEm6ag60PODZ/phcUgNb4DKR76K9GSHuqZe2/j9L5N+a6kg9kEuYgnZSbYGrXHn5B9xFhClxgwVQQVIFkn4Q6rcPa0LD6ZC7fgWc+bk+VMCyWWST0MwWmUtqgut2HYWu/pQQyrRU13H8oacPSLqnm3Q3Y8hdfwfcJOJVSg6RBzxT41+cD1tJJ2PIY5jZC+08+E3wZA3Ukuo4CePBkuLhreSR3nW0Pqf9YZOxrXiU69+jd/T3wMEASRNC7EtCKcazPW1CY5HqVX536Vz9syAzWE68LY+Cmc2Al0jUKUHIhMDMpj1TbahB5ZCeL6NRfkA6C/oaSIN7SalhHfgjZNGz3Wpo6Sy4HSAHWLiRy1w43O0rwtTrQ+E8VzkD1rRdvyOM4hn/HiAXwIWZPdBO1CJDXBMm5CzDA2SS0MxuXWkj6cFlTwx7pg+1pDMzOyV82CVD74EcMtn8VgxWz5hGlIvndUZWkx/DQ/kwyoBlsi4l/cIfFBEa16ZGlB81ICZa+aiGdgIe1m5EvFcxgFcN8AvnwHdJ8YzPGuCYEzxRJDodjHqW5+CZfSD1WfJmvNuAz8Jf0AgKZKIIqsQAAAAASUVORK5CYII=" alt="options" /><ul>';
|
||||
$options = false;
|
||||
if(IFMConfig::remoteupload == 1) {
|
||||
print '<li><a onclick="ifm.remoteUploadDialog()">Remote upload</a></li>';
|
||||
$options = true;
|
||||
}
|
||||
if(IFMConfig::ajaxrequest == 1) {
|
||||
print '<li><a onclick="ifm.ajaxRequestDialog()">AJAX Request</a></li>';
|
||||
$options = true;
|
||||
}
|
||||
if(!$options) print '<li>No options available</li>';
|
||||
print '</ul></div>';
|
||||
print '<span id="version">ver '.IFM::VERSION.'</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table id="filetable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Filename</th>';
|
||||
if(IFMConfig::download == 1) print '<th><!-- column for download link --></th>';
|
||||
if(IFMConfig::showlastmodified == 1) print '<th>last modified</th>';
|
||||
if(IFMConfig::showfilesize == 1) print '<th>Filesize</th>';
|
||||
if(IFMConfig::showrights > 0)print '<th>Permissions</th>';
|
||||
if(IFMConfig::showowner == 1) print '<th>Owner</th>';
|
||||
if(IFMConfig::showgroup == 1) print '<th>Group</th>';
|
||||
if(in_array(1,array(IFMConfig::edit,IFMConfig::rename,IFMConfig::delete,IFMConfig::zipnload,IFMConfig::extract))) print '<th><!-- column for buttons --></th>';
|
||||
print '</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</tbody>
|
||||
</table>
|
||||
<footer>IFM - improved file manager | ifm.php hidden | <a href="http://github.com/misterunknown/ifm">Visit the project on GitHub</a></footer>
|
||||
</body>
|
||||
</html>
|
||||
';
|
||||
}
|
||||
|
||||
/*
|
||||
main functions
|
||||
*/
|
||||
|
||||
private function handleRequest() {
|
||||
if($_REQUEST["api"] == "getRealpath") {
|
||||
if( isset( $_REQUEST["dir"] ) && $_REQUEST["dir"] != "" )
|
||||
$this->getRealpath( $_REQUEST["dir"] );
|
||||
else
|
||||
echo json_encode(array("realpath"=>""));
|
||||
}
|
||||
elseif( $_REQUEST["api"] == "getFiles" ) {
|
||||
if( isset( $_REQUEST["dir"] ) && $this->isPathValid( $_REQUEST["dir"] ) )
|
||||
$this->getFiles( $_REQUEST["dir"] );
|
||||
else
|
||||
$this->getFiles( "" );
|
||||
}
|
||||
else {
|
||||
if( isset( $_REQUEST["dir"] ) && $this->isPathValid( $_REQUEST["dir"] ) ) {
|
||||
switch( $_REQUEST["api"] ) {
|
||||
case "createDir": $this->createDir( $_REQUEST["dir"], $_REQUEST["dirname"] ); break;
|
||||
case "saveFile": $this->saveFile( $_REQUEST ); break;
|
||||
case "getContent": $this->getContent( $_REQUEST ); break;
|
||||
case "deleteFile": $this->deleteFile( $_REQUEST ); break;
|
||||
case "renameFile": $this->renameFile( $_REQUEST ); break;
|
||||
case "downloadFile": $this->downloadFile( $_REQUEST ); break;
|
||||
case "extractFile": $this->extractFile( $_REQUEST ); break;
|
||||
case "uploadFile": $this->uploadFile( $_REQUEST ); break;
|
||||
case "changePermissions": $this->changePermissions( $_REQUEST ); break;
|
||||
case "zipnload": $this->zipnload( $_REQUEST); break;
|
||||
case "remoteUpload": $this->remoteUpload( $_REQUEST ); break;
|
||||
case "deleteMultipleFiles": $this->deleteMultipleFiles( $_REQUEST ); break;
|
||||
default: echo json_encode(array("status"=>"ERROR", "message"=>"No valid api action given")); break;
|
||||
}
|
||||
} else {
|
||||
print json_encode(array("status"=>"ERROR", "message"=>"No valid working directory"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function run() {
|
||||
if ( $this->checkAuth() ) {
|
||||
if ( ! isset($_REQUEST['api']) ) {
|
||||
$this->getApplication();
|
||||
} else {
|
||||
$this->handleRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
api functions
|
||||
*/
|
||||
|
||||
private function getFiles($dir) {
|
||||
// SECURITY FUNCTION (check that we don't operate on a higher level that the script itself)
|
||||
$dir=$this->getValidDir($dir);
|
||||
// now we change in our target directory
|
||||
$this->chDirIfNecessary($dir);
|
||||
// unset our file and directory arrays
|
||||
unset($files); unset($dirs); $files = array(); $dirs = array();
|
||||
// so lets loop over our directory
|
||||
if ($handle = opendir(".")) {
|
||||
while (false !== ($result = readdir($handle))) { // this awesome statement is the correct way to loop over a directory :)
|
||||
if( $result == basename( $_SERVER['SCRIPT_NAME'] ) && $this->getScriptRoot() == getcwd() ) { } // we don't want to see the script itself
|
||||
elseif( ( $result == ".htaccess" || $result==".htpasswd" ) && IFMConfig::showhtdocs != 1 ) {} // check if we are granted to see .ht-docs
|
||||
elseif( $result == "." ) {} // the folder itself will also be invisible
|
||||
elseif( $result != ".." && substr( $result, 0, 1 ) == "." && IFMConfig::showhiddenfiles != 1 ) {} // eventually hide hidden files, if we should not see them
|
||||
elseif( ! @is_readable( $result ) ) {}
|
||||
else { // thats are the files we should see
|
||||
$item = array();
|
||||
$i = 0;
|
||||
$item["name"] = $result;
|
||||
$i++;
|
||||
if( is_dir($result) ) {
|
||||
$item["type"] = "dir";
|
||||
} else {
|
||||
$item["type"] = "file";
|
||||
}
|
||||
if( is_dir( $result ) ) {
|
||||
$item["picture"] = "folder.png";
|
||||
} else {
|
||||
$type = substr( strrchr( $result, "." ), 1 );
|
||||
$item["picture"] = $this->getTypePicture( $type );
|
||||
}
|
||||
if( IFMConfig::showlastmodified == 1 ) { $item["lastmodified"] = date( "d.m.Y, G:i e", filemtime( $result ) ); }
|
||||
if( IFMConfig::showfilesize == 1 ) {
|
||||
$item["filesize"] = filesize( $result );
|
||||
if( $item["filesize"] > 1073741824 ) $item["filesize"] = round( ( $item["filesize"]/1073741824 ), 2 ) . " GB";
|
||||
elseif($item["filesize"]>1048576)$item["filesize"] = round( ( $item["filesize"]/1048576 ), 2 ) . " MB";
|
||||
elseif($item["filesize"]>1024)$item["filesize"] = round( ( $item["filesize"]/1024 ), 2 ) . " KB";
|
||||
else $item["filesize"] = $item["filesize"] . " Byte";
|
||||
}
|
||||
if( IFMConfig::showrights > 0 ) {
|
||||
if( IFMConfig::showrights == 1 ) $item["fileperms"] = substr( decoct( fileperms( $result ) ), -3 );
|
||||
elseif( IFMConfig::showrights == 2 ) $item["fileperms"] = $this->filePermsDecode( fileperms( $result ) );
|
||||
if( $item["fileperms"] == "" ) $item["fileperms"] = " ";
|
||||
}
|
||||
if( IFMConfig::showowner == 1 ) {
|
||||
if ( function_exists( "posix_getpwuid" ) && fileowner($result) !== false ) {
|
||||
$ownerarr = posix_getpwuid( fileowner( $result ) );
|
||||
$item["owner"] = $ownerarr['name'];
|
||||
} else $item["owner"] = "";
|
||||
}
|
||||
if( IFMConfig::showgroup == 1 ) {
|
||||
if( function_exists( "posix_getgrgid" ) && filegroup( $result ) !== false ) {
|
||||
$grouparr = posix_getgrgid( filegroup( $result ) );
|
||||
$item["group"] = $grouparr['name'];
|
||||
} else $item["group"] = "";
|
||||
}
|
||||
if( is_dir( $result ) ) $dirs[] = $item;
|
||||
else $files[] = $item;
|
||||
}
|
||||
}
|
||||
closedir( $handle );
|
||||
}
|
||||
usort( $dirs, array( $this, "sortByName" ) );
|
||||
usort( $files, array( $this, "sortByName" ) );
|
||||
echo json_encode( array_merge( $dirs, $files ) );
|
||||
}
|
||||
|
||||
// creates a directory
|
||||
private function createDir($w, $dn) {
|
||||
if( $dn == "" ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid directory name") );
|
||||
} elseif( strpos( $dn, '/' ) !== false ) echo json_encode( array( "status" => "ERROR", "message" => "No slashes allowed in directory names" ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $w );
|
||||
if( @mkdir( $dn ) ) {
|
||||
echo json_encode( array( "status" => "OK", "message" => "Directory successful created" ) );
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Could not create directory" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// save a file
|
||||
private function saveFile(array $d) {
|
||||
if( isset( $d['filename'] ) && $d['filename'] != "" ) {
|
||||
// if you are not allowed to see .ht-docs you can't save one
|
||||
if( IFMConfig::showhtdocs != 1 && substr( $d['filename'], 0, 3 ) == ".ht" ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit or create htdocs" ) );
|
||||
}
|
||||
// same with hidden files
|
||||
elseif( IFMConfig::showhiddenfiles != 1 && substr( $d['filename'], 0, 1 ) == "." ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit or create hidden files" ) );
|
||||
}
|
||||
elseif(strpos($d['filename'],'/')!==false) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Filenames cannot contain slashes." ) );
|
||||
} else {
|
||||
if( isset( $d['content'] ) ) {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
// work around magic quotes
|
||||
$content = get_magic_quotes_gpc() == 1 ? stripslashes( $d['content'] ) : $d['content'];
|
||||
if( @file_put_contents( $d['filename'], $content ) !== false ) {
|
||||
echo json_encode( array( "status" => "OK", "message" => "File successfully saved" ) );
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Could not write content" ) );
|
||||
}
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Got no content" ) );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No filename specified" ) );
|
||||
}
|
||||
}
|
||||
|
||||
// gets the content of a file
|
||||
// notice: if the content is not JSON encodable it returns an error
|
||||
private function getContent( array $d ) {
|
||||
if( IFMConfig::edit != 1 ) echo json_encode( array( "status" => "ERROR", "message" => "No permission to edit files" ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
if( file_exists( $d['filename'] ) ) {
|
||||
$content = @file_get_contents( $d['filename'] );
|
||||
$utf8content = mb_convert_encoding( $content, 'UTF-8', mb_detect_encoding( $content, 'UTF-8, ISO-8859-1', true ) );
|
||||
echo json_encode( array( "status" => "OK", "data" => array( "filename" => $d['filename'], "content" => $utf8content ) ) );
|
||||
} else echo json_encode( array( "status" => "ERROR", "message" => "File not found" ) );
|
||||
}
|
||||
}
|
||||
|
||||
// deletes a file or a directory (recursive!)
|
||||
private function deleteFile( array $d ) {
|
||||
if( IFMConfig::delete != 1 ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to delete files" ) );
|
||||
}
|
||||
else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
if( is_dir( $d['filename'] ) ) {
|
||||
$res = rec_rmdir( $d['filename'] );
|
||||
if( $res != 0 ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to delete files" ) );
|
||||
} else {
|
||||
echo json_encode( array( "status" => "OK", "message" => "Directoy successful deleted" ) );
|
||||
}
|
||||
}
|
||||
else{
|
||||
if( @unlink( $d['filename'] ) ) {
|
||||
echo json_encode( array( "status" => "OK", "message" => "File successful deleted" ) );
|
||||
} else {
|
||||
echo json_encode( array( "status"=>"ERROR", "message" => "File could not be deleted" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// deletes a bunch of files or directories
|
||||
private function deleteMultipleFiles( array $d ) {
|
||||
if( IFMConfig::delete != 1 || IFMConfig::multiselect != 1 ) echo json_encode( array( "status" => "ERROR", "message" => "No permission to delete multiple files" ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
$err = array(); $errFLAG = -1; // -1 -> no files deleted; 0 -> at least some files deleted; 1 -> all files deleted
|
||||
foreach( $d['filenames'] as $file ) {
|
||||
if( is_dir($file) ){
|
||||
$res = $this->rec_rmdir( $file );
|
||||
if( $res != 0 )
|
||||
array_push( $err, $file );
|
||||
else
|
||||
$errFLAG = 0;
|
||||
} else {
|
||||
if( @unlink($file) )
|
||||
$errFLAG = 0;
|
||||
else
|
||||
array_push($err, $file);
|
||||
}
|
||||
}
|
||||
if( empty( $err ) ) {
|
||||
echo json_encode( array( "status" => "OK", "message" => "Files deleted successfully", "errflag" => "1" ) );
|
||||
}
|
||||
else {
|
||||
$errmsg = "The following files could not be deleted:<ul>";
|
||||
foreach($err as $item)
|
||||
$errmsg .= "<li>".$item."</li>";
|
||||
$errmsg .= "</ul>";
|
||||
echo json_encode( array( "status" => "OK", "message" => $errmsg, "flag" => $errFLAG ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// renames a file
|
||||
private function renameFile( array $d ) {
|
||||
if( IFMConfig::rename != 1 ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
||||
} else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
if( strpos( $d['newname'], '/' ) !== false )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No slashes allowed in filenames" ) );
|
||||
elseif( IFMConfig::showhtdocs != 1 && ( substr( $d['newname'], 0, 3) == ".ht" || substr( $d['filename'], 0, 3 ) == ".ht" ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to rename this file" ) );
|
||||
elseif( IFMConfig::showhiddenfiles != 1 && ( substr( $d['newname'], 0, 1) == "." || substr( $d['filename'], 0, 1 ) == "." ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to rename file" ) );
|
||||
else {
|
||||
if( @rename( $d['filename'], $d['newname'] ) )
|
||||
echo json_encode( array( "status" => "OK", "message" => "File successful renamed" ) );
|
||||
else
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "File could not be renamed" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// provides a file for downloading
|
||||
private function downloadFile( array $d ) {
|
||||
if( IFMConfig::download != 1 )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to download files" ) );
|
||||
elseif( IFMConfig::showhtdocs != 1 && ( substr( $d['filename'], 0, 3 ) == ".ht" || substr( $d['filename'],0,3 ) == ".ht" ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message"=>"Not allowed to download htdocs" ) );
|
||||
elseif( IFMConfig::showhiddenfiles != 1 && ( substr( $d['filename'], 0, 1 ) == "." || substr( $d['filename'],0,1 ) == "." ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to download hidden files" ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $d["dir"] );
|
||||
header( "Content-Type: application/octet-stream" );
|
||||
header( "Content-Disposition: attachment; filename=\"" . $d["filename"] . "\"" );
|
||||
@readfile( $d["filename"] );
|
||||
}
|
||||
}
|
||||
|
||||
// extracts a zip-archive
|
||||
private function extractFile( array $d ) {
|
||||
if( IFMConfig::extract != 1 )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to extract files" ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
if( ! file_exists( $d['filename'] ) || substr( $d['filename'],-4 ) != ".zip" )
|
||||
echo json_encode( array( "status" => "ERROR","message" => "No valid zip file found" ) );
|
||||
else {
|
||||
if( ! isset( $d['targetdir'] ) )
|
||||
$d['targetdir'] = "";
|
||||
if( strpos( $d['targetdir'], "/" ) !== false )
|
||||
echo json_encode( array( "status" => "ERROR","message" => "Target directory must not contain slashes" ) );
|
||||
else {
|
||||
switch( $d['targetdir'] ){
|
||||
case "":
|
||||
if( $this->unzip( $_POST["filename"] ) )
|
||||
echo json_encode( array( "status" => "OK","message" => "File successfully extracted." ) );
|
||||
else
|
||||
echo json_encode( array( "status" => "ERROR","message" => "File could not be extracted" ) );
|
||||
break;
|
||||
default:
|
||||
if( ! mkdir( $d['targetdir'] ) )
|
||||
echo json_encode( array( "status" => "ERROR","message" => "Could not create target directory" ) );
|
||||
else {
|
||||
chdir( $d['targetdir'] );
|
||||
if( ! $this->unzip( "../" . $d["filename"] ) ) {
|
||||
chdir( ".." );
|
||||
rmdir( $d['targetdir'] );
|
||||
echo json_encode( array( "status" => "ERROR","message" => "Could not extract file" ) );
|
||||
}
|
||||
else {
|
||||
chdir( ".." );
|
||||
echo json_encode( array( "status" => "OK","message" => "File successfully extracted" ) );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// uploads a file
|
||||
private function uploadFile( array $d ) {
|
||||
if( IFMConfig::upload != 1 )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to upload files" ) );
|
||||
elseif( !isset( $_FILES['file'] ) )
|
||||
echo json_encode( array( "file" => $_FILE,"files" => $_FILES ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
$newfilename = ( isset( $d["newfilename"] ) && $d["newfilename"]!="" ) ? $d["newfilename"] : $_FILES['file']['name'];
|
||||
if( IFMConfig::showhtdocs != 1 && ( substr( $newfilename, 0, 3 ) == ".ht" || substr( $newfilename,0,3 ) == ".ht" ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to upload htdoc file" ) );
|
||||
elseif( IFMConfig::showhiddenfiles != 1 && ( substr( $newfilename, 0, 1 ) == "." || substr( $newfilename,0,1 ) == "." ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to upload hidden file" ) );
|
||||
else {
|
||||
if( $_FILES['file']['tmp_name'] ) {
|
||||
if( is_writable( getcwd( ) ) ) {
|
||||
if( move_uploaded_file( $_FILES['file']['tmp_name'], $newfilename ) )
|
||||
echo json_encode( array( "status" => "OK", "message" => "The file ".$_FILES['file']['name']." was uploaded successfully", "cd" => $d['dir'] ) );
|
||||
else
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "File could not be uploaded" ) );
|
||||
}
|
||||
else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "File could not be uploaded since it has no permissions to write in this directory" ) );
|
||||
}
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No file found" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// change permissions of a file
|
||||
private function changePermissions( array $d ) {
|
||||
if( IFMConfig::chmod != 1 ) echo json_encode( array( "status" => "ERROR", "message" => "No rights to change permissions" ) );
|
||||
elseif( ! isset( $d["chmod"] )||$d['chmod']=="" ) echo json_encode( array( "status" => "ERROR", "message" => "Could not identify new permissions" ) );
|
||||
elseif( ! isPathValid( pathCombine( $d['dir'],$d['filename'] ) ) ) { echo json_encode( array( "status" => "ERROR", "message" => "Not allowed to change the permissions" ) ); }
|
||||
else {
|
||||
chDirIfNecessary( $d['dir'] ); $chmod = $d["chmod"]; $cmi = true;
|
||||
if( ! is_numeric( $chmod ) ) {
|
||||
$cmi = false;
|
||||
$chmod = str_replace( " ","",$chmod );
|
||||
if( strlen( $chmod )==9 ) {
|
||||
$cmi = true;
|
||||
$arr = array( substr( $chmod,0,3 ),substr( $chmod,3,3 ),substr( $chmod,6,3 ) );
|
||||
$chtmp = "0";
|
||||
foreach( $arr as $right ) {
|
||||
$rtmp = 0;
|
||||
if( substr( $right,0,1 )=="r" ) $rtmp = $rtmp + 4; elseif( substr( $right,0,1 )<>"-" ) $cmi = false;
|
||||
if( substr( $right,1,1 )=="w" ) $rtmp = $rtmp + 2; elseif( substr( $right,1,1 )<>"-" ) $cmi = false;
|
||||
if( substr( $right,2,1 )=="x" ) $rtmp = $rtmp + 1; elseif( substr( $right,2,1 )<>"-" ) $cmi = false;
|
||||
$chtmp = $chtmp . $rtmp;
|
||||
}
|
||||
$chmod = intval( $chtmp );
|
||||
}
|
||||
}
|
||||
else $chmod = "0" . $chmod;
|
||||
|
||||
if( $cmi ) {
|
||||
try {
|
||||
chmod( $d["filename"], (int)octdec( $chmod ) );
|
||||
echo json_encode( array( "status" => "OK", "message" => "Permissions changed successfully" ) );
|
||||
} catch ( Exception $e ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Error while changing permissions" ) );
|
||||
}
|
||||
}
|
||||
else echo json_encode( array( "status" => "ERROR", "message" => "Could not determine permission format" ) );
|
||||
}
|
||||
}
|
||||
|
||||
// zips a directory and provides it for downloading
|
||||
// it creates a temporary zip file in the current directory, so it has to be as much space free as the file size is
|
||||
private function zipnload( array $d ) {
|
||||
if( IFMConfig::zipnload != 1 )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to download directories" ) );
|
||||
else {
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
if( ! file_exists( $d['filename'] ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Directory not found" ) );
|
||||
else {
|
||||
unset( $zip );
|
||||
$dfile = uniqid( "ifm-tmp-" ) . ".zip"; // temporary filename
|
||||
$zip = new zip_file( $dfile );
|
||||
$zip->add_files( $d['filename'] );
|
||||
$zip->create_archive( );
|
||||
header( "Content-Disposition: attachment; filename=\"".$d['filename'].".zip\"" );
|
||||
echo file_get_contents( $dfile );
|
||||
unlink( $dfile ); // delete temporary file
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// uploads a file from an other server using the curl extention
|
||||
private function remoteUpload( array $d ) {
|
||||
if( IFMConfig::remoteupload != 1 )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to remote upload files" ) );
|
||||
elseif( !isset( $d['method'] ) || !in_array( $d['method'], array( "curl", "file" ) ) )
|
||||
echo json_encode( array( "status" => "error", "message" => "No valid method given. Valid methods: ['curl', 'file']" ) );
|
||||
elseif( $d['method']=="curl" && $this->checkCurl( ) == false )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "cURL extention not installed. Please install the cURL extention to use remote file upload." ) );
|
||||
elseif( $d['method']=="curl" && $this->checkCurl( ) == true ) {
|
||||
$filename = ( isset( $d['filename'] )&&$d['filename']!="" )?$d['filename']:"curl_".uniqid( );
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
$ch = curl_init( );
|
||||
if( $ch ) {
|
||||
if( $this->allowedFileName( $filename ) == false )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "This filename is not allowed due to the config." ) );
|
||||
elseif( filter_var( $d['url'], FILTER_VALIDATE_URL ) === false )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "The passed URL is not valid" ) );
|
||||
else {
|
||||
$fp = fopen( $filename, "w" );
|
||||
if( $fp ) {
|
||||
if( !curl_setopt( $ch, CURLOPT_URL, $d['url'] ) || !curl_setopt( $ch, CURLOPT_FILE, $fp ) || !curl_setopt( $ch, CURLOPT_HEADER, 0 ) || !curl_exec( $ch ) )
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Failed to set options and execute cURL" ) );
|
||||
else {
|
||||
echo json_encode( array( "status" => "OK", "message" => "File sucessfully uploaded" ) );
|
||||
}
|
||||
curl_close( $ch );
|
||||
fclose( $fp );
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Failed to open file" ) );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => "Failed to init cURL." ) );
|
||||
}
|
||||
}
|
||||
elseif( $d['method']=='file' ) {
|
||||
$filename = ( isset( $d['filename'] ) && $d['filename']!="" ) ? $d['filename'] : "curl_".uniqid( );
|
||||
$this->chDirIfNecessary( $d['dir'] );
|
||||
try {
|
||||
file_put_contents( $filename, file_get_contents( $d['url'] ) );
|
||||
echo json_encode( array( "status" => "OK", "message" => "File successfully uploaded" ) );
|
||||
} catch( Exception $e ) {
|
||||
echo json_encode( array( "status" => "ERROR", "message" => $e->getMessage() ) );
|
||||
}
|
||||
}
|
||||
else echo json_encode( array( "status" => "error", "message" => "Corrupt parameter data" ) );
|
||||
}
|
||||
|
||||
//apis
|
||||
|
||||
/*
|
||||
help functions
|
||||
*/
|
||||
|
||||
public function checkAuth() {
|
||||
if(IFMConfig::auth == 1 && $_SESSION['auth'] !== true) {
|
||||
$login_failed = false;
|
||||
if(isset($_POST["user"]) && isset($_POST["pass"])) {
|
||||
if($this->checkCredentials($_POST["user"], $_POST["pass"])) {
|
||||
$_SESSION['auth'] = true;
|
||||
}
|
||||
else {
|
||||
$_SESSION['auth'] = false;
|
||||
$login_failed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if($_SESSION['auth'] !== true) {
|
||||
if(isset($_POST["api"]) && $login_failed === true)
|
||||
echo json_encode(array("status"=>"ERROR", "message"=>"authentication failed"));
|
||||
elseif(isset($_POST["api"]) && $login_failed !== true)
|
||||
echo json_encode(array("status"=>"ERROR", "message"=>"not authenticated"));
|
||||
else
|
||||
$this->loginForm($login_failed);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private function checkCredentials($user, $pass) {
|
||||
list($src, $srcopt) = explode(";", IFMConfig::auth_source, 2);
|
||||
switch($src) {
|
||||
case "inline":
|
||||
list($uname, $hash) = explode(":", $srcopt);
|
||||
break;
|
||||
case "file":
|
||||
if(@file_exists($srcopt) && @is_readable($srcopt)) {
|
||||
list($uname, $hash) = explode(":", fgets(fopen($srcopt, 'r')));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return password_verify($pass, trim($hash))?($uname == $user):false;
|
||||
}
|
||||
|
||||
private function loginForm($loginFailed=false) {
|
||||
print '<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>IFM - improved file manager</title>
|
||||
<meta charset="utf-8">
|
||||
<style type="text/css">
|
||||
* { box-sizing: border-box; font-family: Arial, sans-serif; }
|
||||
html { text-align: center; }
|
||||
body { margin:auto; width: auto; display: inline-block; }
|
||||
form { padding: 1em; border: 1px dashed #CCC; }
|
||||
button { margin-top: 1em; }
|
||||
div.err { color: red; font-weight: bold; margin-bottom: 1em; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>IFM - Login</h1>
|
||||
<form method="post">';
|
||||
if($loginFailed){ print '<div class="err">Login attempt failed. Please try again.</div>'; }
|
||||
print '<label>username:</label> <input type="text" name="user" size="12"><br>
|
||||
<label>password:</label> <input type="password" name="pass" size="12"><br>
|
||||
<button type="submit">login</button>
|
||||
</form>
|
||||
</body>
|
||||
</html>';
|
||||
}
|
||||
|
||||
private function getValidDir($dir) {
|
||||
if( $this->getScriptRoot() != substr( realpath( $dir ), 0, strlen( $this->getScriptRoot() ) ) ) {
|
||||
return "";
|
||||
} else {
|
||||
return ( file_exists( realpath( $dir ) ) ) ? substr( realpath( $dir ), strlen( $this->getScriptRoot() ) + 1 ) : "";
|
||||
}
|
||||
}
|
||||
|
||||
private function filePermsDecode( $perms ) {
|
||||
$oct = str_split( strrev( decoct( $perms ) ), 1 );
|
||||
$masks = array( '---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx' );
|
||||
return(
|
||||
sprintf(
|
||||
'%s %s %s',
|
||||
array_key_exists( $oct[ 2 ], $masks ) ? $masks[ $oct[ 2 ] ] : '###',
|
||||
array_key_exists( $oct[ 1 ], $masks ) ? $masks[ $oct[ 1 ] ] : '###',
|
||||
array_key_exists( $oct[ 0 ], $masks ) ? $masks[ $oct[ 0 ] ] : '###')
|
||||
);
|
||||
}
|
||||
|
||||
private function isPathValid($p) {
|
||||
if( $p == "" ) {
|
||||
return true;
|
||||
} elseif( $this->getScriptRoot() == substr( realpath( $p ), 0, strlen( $this->getScriptRoot() ) ) ) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function getScriptRoot() {
|
||||
return realpath( substr( $_SERVER["SCRIPT_FILENAME"], 0, strrpos( $_SERVER["SCRIPT_FILENAME"], "/" ) ) );
|
||||
}
|
||||
|
||||
private function chDirIfNecessary($d) {
|
||||
if( substr( getcwd(), strlen( $this->getScriptRoot() ) ) != $this->getValidDir($d) ) {
|
||||
chdir( $d );
|
||||
}
|
||||
}
|
||||
|
||||
private function getTypePicture( $type ) {
|
||||
switch( $type ) {
|
||||
case "aac": return "aac.png"; break;case "ai": return "ai.png"; break;case "aiff": return "aiff.png"; break;
|
||||
case "avi": return "avi.png"; break;case "bmp": return "bmp.png"; break;case "c": return "c.png"; break;
|
||||
case "cpp": return "cpp.png"; break;case "css": return "css.png"; break;case "dat": return "dat.png"; break;
|
||||
case "dmg": return "dmg.png"; break;case "doc": return "doc.png"; break;case "dotx": return "dotx.png"; break;
|
||||
case "dwg": return "dwg.png"; break;case "dxf": return "dxf.png"; break;case "eps": return "eps.png"; break;
|
||||
case "exe": return "exe.png"; break;case "flv": return "flv.png"; break;case "gif": return "gif.png"; break;
|
||||
case "h": return "h.png"; break;case "hpp": return "hpp.png"; break;case "html": return "html.png"; break;
|
||||
case "ics": return "ics.png"; break;case "iso": return "iso.png"; break;case "java": return "java.png"; break;
|
||||
case "jpg": return "jpg.png"; break;case "key": return "key.png"; break;case "mid": return "mid.png"; break;
|
||||
case "mp3": return "mp3.png"; break;case "mp4": return "mp4.png"; break;case "mpg": return "mpg.png"; break;
|
||||
case "odf": return "odf.png"; break;case "ods": return "ods.png"; break;case "odt": return "odt.png"; break;
|
||||
case "otp": return "otp.png"; break;case "ots": return "ots.png"; break;case "ott": return "ott.png"; break;
|
||||
case "pdf": return "pdf.png"; break;case "php": return "php.png"; break;case "png": return "png.png"; break;
|
||||
case "ppt": return "ppt.png"; break;case "psd": return "psd.png"; break;case "py": return "py.png"; break;
|
||||
case "qt": return "qt.png"; break;case "rb": return "rb.png"; break;case "rtf": return "rtf.png"; break;
|
||||
case "sql": return "sql.png"; break;case "tga": return "tga.png"; break;case "tgz": return "tgz.png"; break;
|
||||
case "tiff": return "tiff.png"; break;case "txt": return "txt.png"; break;case "wav": return "wav.png"; break;
|
||||
case "xls": return "xls.png"; break;case "xlsx": return "xlsx.png"; break;case "xml": return "xml.png"; break;
|
||||
case "yml": return "yml.png"; break;case "zip": return "zip.png"; break;
|
||||
default: return "_blank.png"; break;
|
||||
}
|
||||
}
|
||||
|
||||
private function getRealpath($dir) {
|
||||
if( $this->getScriptRoot() != substr( realpath( $_POST["dir"] ), 0, strlen( $this->getScriptRoot() ) ) ) {
|
||||
echo json_encode( array( "realpath" => "" ) );
|
||||
} else {
|
||||
$rp = substr( realpath( $_POST["dir"] ), strlen( $this->getScriptRoot() ) + 1 );
|
||||
if( $rp == false ) $rp = "";
|
||||
echo json_encode( array( "realpath" => $rp ) );
|
||||
}
|
||||
}
|
||||
private function rec_rmdir( $path ) {
|
||||
if( !is_dir( $path ) ) {
|
||||
return -1;
|
||||
}
|
||||
$dir = @opendir( $path );
|
||||
if( !$dir ) {
|
||||
return -2;
|
||||
}
|
||||
while( ( $entry = @readdir( $dir ) ) !== false ) {
|
||||
if( $entry == '.' || $entry == '..' ) continue;
|
||||
if( is_dir( $path . '/' . $entry ) ) {
|
||||
$res = rec_rmdir( $path . '/' . $entry );
|
||||
if( $res == -1 ) { @closedir( $dir ); return -2; }
|
||||
else if( $res == -2 ) { @closedir( $dir ); return -2; }
|
||||
else if( $res == -3 ) { @closedir( $dir ); return -3; }
|
||||
else if( $res != 0 ) { @closedir( $dir ); return -2; }
|
||||
} else if( is_file( $path . '/' . $entry ) || is_link( $path . '/' . $entry ) ) {
|
||||
$res = @unlink( $path . '/' . $entry );
|
||||
if( !$res ) { @closedir( $dir ); return -2; }
|
||||
} else { @closedir( $dir ); return -3; }
|
||||
}
|
||||
@closedir( $dir );
|
||||
$res = @rmdir( $path );
|
||||
if( !$res ) { return -2; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
// combines two parts to a valid path
|
||||
private function pathCombine( $a, $b ) {
|
||||
if( $a=="" && $b=="" )
|
||||
return "";
|
||||
else
|
||||
return ltrim( rtrim( $a, '/' ) . '/' . ltrim( $b, '/' ), '/' );
|
||||
}
|
||||
|
||||
// check if filename is allowed
|
||||
private function allowedFileName( $f ) {
|
||||
if( IFMConfig::showhtdocs != 1 && substr( $f, 0, 3 ) == ".ht" )
|
||||
return false;
|
||||
elseif( IFMConfig::showhiddenfiles != 1 && substr( $f, 0, 1 ) == "." )
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// sorting function for file and dir arrays
|
||||
private function sortByName( $a, $b ) {
|
||||
if( strtolower( $a['name'] ) == strtolower( $b['name'] ) ) return 0;
|
||||
return ( strtolower( $a['name'] ) < strtolower( $b['name'] ) ) ? -1 : 1;
|
||||
}
|
||||
|
||||
// unzip an archive
|
||||
private function unzip( $file ) {
|
||||
$zip = new ZipArchive;
|
||||
$res = $zip->open( $file );
|
||||
if( $res === true ) {
|
||||
$zip->extractTo( './' );
|
||||
$zip->close();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// is cURL extention avaliable?
|
||||
private function checkCurl() {
|
||||
if( ! function_exists( "curl_init" ) &&
|
||||
!function_exists( "curl_setopt" ) &&
|
||||
!function_exists( "curl_exec" ) &&
|
||||
!function_exists( "curl_close" ) ) return false;
|
||||
else return true;
|
||||
}
|
||||
|
||||
///helper
|
||||
}
|
||||
|
||||
/*
|
||||
start program
|
||||
*/
|
||||
|
||||
$ifm = new IFM();
|
||||
$ifm->run();
|
46
src/style.css
Normal file
46
src/style.css
Normal file
@@ -0,0 +1,46 @@
|
||||
* { -moz-box-sizing: border-box; box-sizing: border-box; } html, body { font-family: Arial, non-serif; font-weight: 100; font-size: 12pt; background: #FFF;}
|
||||
footer { margin-top:20px; margin-bottom:10px; border:1px #CCC dashed; padding:3px; color:#222; font-size:0.6em; }
|
||||
footer a { color:#00E; } a { text-decoration:none; color: #000; cursor: pointer; } a:hover { color: #333; } img { vertical-align:middle; border:0; }
|
||||
button > img { width: 19px; } a > img { width: 25px; } #multiseloptions a > img { width:19px; } button { margin: 1px; margin-top: 10px; padding: 10px; border: 1px solid black; }
|
||||
#tooltab button, #filetable button { margin:1px; padding:1px 4px; background: none; border: 0; } #version { font-size:0.8em; }
|
||||
#mess { position: fixed; top: 2em; left: 50%; z-index: 10; }
|
||||
#mess>div { position:relative; left:-50%;display: inline-block; padding: 25px; background-color: #EEE; border-radius: 10px; box-shadow:#333 3px 3px 10px; }
|
||||
#mess .message_error { background: #ff0000; /* Old browsers */ background: -moz-linear-gradient(top, #ff0000 0%, #ff7777 100%); /* FF3.6+ */
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff0000), color-stop(100%,#ff7777)); /* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, #ff0000 0%,#ff7777 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #ff0000 0%,#ff7777 100%); /* Opera 11.10+ */
|
||||
background: -ms-linear-gradient(top, #ff0000 0%,#ff7777 100%); /* IE10+ */ background: linear-gradient(to bottom, #ff0000 0%,#ff7777 100%); /* W3C */
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff0000', endColorstr='#ff7777',GradientType=0 ); /* IE6-9 */ }
|
||||
#mess .message_successful { background: #ff0000; /* Old browsers */ background: -moz-linear-gradient(top, #00dd00 0%, #77ee77 100%); /* FF3.6+ */
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00dd00), color-stop(100%,#77ee77)); /* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, #00dd00 0%,#77ee77 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #00dd00 0%,#77ee77 100%); /* Opera 11.10+ */
|
||||
background: -ms-linear-gradient(top, #00dd00 0%,#77ee77 100%); /* IE10+ */ background: linear-gradient(to bottom, #00dd00 0%,#77ee77 100%); /* W3C */
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00dd00', endColorstr='#77ee77',GradientType=0 ); /* IE6-9 */ }
|
||||
#tooltab { clear: both; padding: 3px; width: 100%; border-collapse:collapse; margin-bottom:3px; }
|
||||
#tooltab .cell_content { } #tooltab .cell_buttons { text-align: right; width:300px; } #options ul { text-align: left; }
|
||||
#tooltab input[type="text"], textarea { width: 75%; margin-left: 5px; } #tooltab tr { height: 50px; } #currentDir { height: 30px; }
|
||||
td.cell_buttons > div { position: fixed; top: 10px; right: 10px; background: #FFF; padding: 10px; border-radius: 5px; box-shadow: 1px 1px 10px #000; }
|
||||
#options { display: inline-block; position: relative; } #options img { width: 20px; } #options ul { display: none; }
|
||||
#options:hover>ul { display: inline-block; position: absolute; padding: 3px; border: 1px solid #CCC; background-color: #FFF; list-style-type:none; margin:0;
|
||||
min-width:200px; right:0; top:0; } #options ul li:before { content: '\2192\00A0' }
|
||||
#filetable { padding:5px; width:100%; border-collapse: collapse;} #filetable thead { border: 1px solid #00A3A3; }
|
||||
#filetable td { text-align:left; } #filetable tbody { border: 1px solid #EEE; }
|
||||
#filetable td:not(:first-child):last-child { text-align: right; } #filetable td:not(:first-child):not(:last-child) { text-align: center; }
|
||||
#filetable th { background-color: #00A3A3; color: #FFF; padding: 5px; text-align:left; text-align: center; font-weight: normal; font-size:0.9em;}
|
||||
#filetable tr:nth-child(2n) { background-color: #EBEBEB;} #filetable tbody tr.selected { border: 1px dashed #777 !important; background-color: #FFE4C4; }
|
||||
#filetable tbody tr:last-child { border-bottom: 1px solid #EBEBEB; }
|
||||
#filetable input[type^=text] { width:90px; } .download-link { font-size: 0.9em; } .overlay { z-index:5; } .overlay fieldset { border: 0; background-color: white;}
|
||||
.overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; text-align: center; background-color: rgba(0,0,0,0.7);}
|
||||
.overlay form { width: 80%; margin: 3em auto; text-align: left; } .overlay form fieldset { position:relative; }
|
||||
.overlay form#showFile { height:80%; } .overlay form#showFile fieldset { height:100%; } .overlay select { float:right; margin-top:10px; padding:10px; }
|
||||
.overlay div#content { height: calc(100% - 100px); }
|
||||
.overlay input[type=text], .overlay textarea { margin: 2px 0; border: solid 1px #ccc; padding: 0.4em; background-color: #f5f5f5; width: 100%;}
|
||||
#waitqueue{display:inline-block;position:fixed;padding:0;font-size:0.8em;bottom:5px; right:5px;border-radius:5px;background-color:#CCC;box-shadow:1px 1px 10px #000;}
|
||||
#waitqueue>div{padding:5px 10px 5px 5px;}#waitqueue>div>div{width:120px;height:14px;display:inline-block;vertical-align:bottom;} #waitqueue.left { left:5px !important; right:auto; }
|
||||
#multiseloptions { border:1px solid #000; box-shadow:#333 3px 3px 10px; position:fixed; top:25%; left:60%; background:#FFF; padding:0; z-index:1; overflow:hidden; }
|
||||
#multiseloptions p { margin:0; padding:2px; background-color:#DDD; } #multiseloptions ul { margin:0;padding:2px 2px 2px 10px;list-style:none; }
|
||||
#mdPicPreview{position:absolute;border:1px solid #ccc;background:#333;padding:5px;display:none;color:#fff;max-width:30em;}
|
||||
#mdPicPreview img { max-width:100%;}
|
||||
|
||||
#loading { position:fixed; top:calc(50% - 49px); left:calc(50% - 45px); border-radius:5px; border:1px solid #EEE; padding:12px 15px; background:#FFF; }
|
||||
#savequestion { position: absolute; top:40%; left:50%; margin-left:-125px;margin-top:-55px; background-color:#FFF; border: 1px solid #CCC; z-index:10; padding:20px; text-align: center; }
|
||||
#loadingAnim{position:relative;width:30px;height:36px}.blockG{position:absolute;background-color:#FFF;width:5px;height:11px;-moz-border-radius:4px 4px 0 0;-moz-transform:scale(0.4);-moz-animation-name:fadeG;-moz-animation-duration:1.04s;-moz-animation-iteration-count:infinite;-moz-animation-direction:linear;-webkit-border-radius:4px 4px 0 0;-webkit-transform:scale(0.4);-webkit-animation-name:fadeG;-webkit-animation-duration:1.04s;-webkit-animation-iteration-count:infinite;-webkit-animation-direction:linear;-ms-border-radius:4px 4px 0 0;-ms-transform:scale(0.4);-ms-animation-name:fadeG;-ms-animation-duration:1.04s;-ms-animation-iteration-count:infinite;-ms-animation-direction:linear;-o-border-radius:4px 4px 0 0;-o-transform:scale(0.4);-o-animation-name:fadeG;-o-animation-duration:1.04s;-o-animation-iteration-count:infinite;-o-animation-direction:linear;border-radius:4px 4px 0 0;transform:scale(0.4);animation-name:fadeG;animation-duration:1.04s;animation-iteration-count:infinite;animation-direction:linear}#rotateG_01{left:0;top:13px;-moz-animation-delay:.39s;-moz-transform:rotate(-90deg);-webkit-animation-delay:.39s;-webkit-transform:rotate(-90deg);-ms-animation-delay:.39s;-ms-transform:rotate(-90deg);-o-animation-delay:.39s;-o-transform:rotate(-90deg);animation-delay:.39s;transform:rotate(-90deg)}#rotateG_02{left:4px;top:5px;-moz-animation-delay:.52s;-moz-transform:rotate(-45deg);-webkit-animation-delay:.52s;-webkit-transform:rotate(-45deg);-ms-animation-delay:.52s;-ms-transform:rotate(-45deg);-o-animation-delay:.52s;-o-transform:rotate(-45deg);animation-delay:.52s;transform:rotate(-45deg)}#rotateG_03{left:13px;top:1px;-moz-animation-delay:.65s;-moz-transform:rotate(0deg);-webkit-animation-delay:.65s;-webkit-transform:rotate(0deg);-ms-animation-delay:.65s;-ms-transform:rotate(0deg);-o-animation-delay:.65s;-o-transform:rotate(0deg);animation-delay:.65s;transform:rotate(0deg)}#rotateG_04{right:4px;top:5px;-moz-animation-delay:.78s;-moz-transform:rotate(45deg);-webkit-animation-delay:.78s;-webkit-transform:rotate(45deg);-ms-animation-delay:.78s;-ms-transform:rotate(45deg);-o-animation-delay:.78s;-o-transform:rotate(45deg);animation-delay:.78s;transform:rotate(45deg)}#rotateG_05{right:0;top:13px;-moz-animation-delay:.9099999999999999s;-moz-transform:rotate(90deg);-webkit-animation-delay:.9099999999999999s;-webkit-transform:rotate(90deg);-ms-animation-delay:.9099999999999999s;-ms-transform:rotate(90deg);-o-animation-delay:.9099999999999999s;-o-transform:rotate(90deg);animation-delay:.9099999999999999s;transform:rotate(90deg)}#rotateG_06{right:4px;bottom:3px;-moz-animation-delay:1.04s;-moz-transform:rotate(135deg);-webkit-animation-delay:1.04s;-webkit-transform:rotate(135deg);-ms-animation-delay:1.04s;-ms-transform:rotate(135deg);-o-animation-delay:1.04s;-o-transform:rotate(135deg);animation-delay:1.04s;transform:rotate(135deg)}#rotateG_07{bottom:0;left:13px;-moz-animation-delay:1.1700000000000002s;-moz-transform:rotate(180deg);-webkit-animation-delay:1.1700000000000002s;-webkit-transform:rotate(180deg);-ms-animation-delay:1.1700000000000002s;-ms-transform:rotate(180deg);-o-animation-delay:1.1700000000000002s;-o-transform:rotate(180deg);animation-delay:1.1700000000000002s;transform:rotate(180deg)}#rotateG_08{left:4px;bottom:3px;-moz-animation-delay:1.3s;-moz-transform:rotate(-135deg);-webkit-animation-delay:1.3s;-webkit-transform:rotate(-135deg);-ms-animation-delay:1.3s;-ms-transform:rotate(-135deg);-o-animation-delay:1.3s;-o-transform:rotate(-135deg);animation-delay:1.3s;transform:rotate(-135deg)}@-moz-keyframes fadeG{0%{background-color:#000}100%{background-color:#FFF}}@-webkit-keyframes fadeG{0%{background-color:#000}100%{background-color:#FFF}}@-ms-keyframes fadeG{0%{background-color:#000}100%{background-color:#FFF}}@-o-keyframes fadeG{0%{background-color:#000}100%{background-color:#FFF}}@keyframes fadeG{0%{background-color:#000}100%{background-color:#FFF}}
|
400
src/zip_file.php
Normal file
400
src/zip_file.php
Normal file
@@ -0,0 +1,400 @@
|
||||
<?php
|
||||
|
||||
// zip class (for zipnload)
|
||||
class archive {
|
||||
function __construct($name) {
|
||||
$this->options = array(
|
||||
'basedir' => ".",
|
||||
'name' => $name,
|
||||
'prepend' => "",
|
||||
'inmemory' => 0,
|
||||
'overwrite' => 0,
|
||||
'recurse' => 1,
|
||||
'storepaths' => 1,
|
||||
'followlinks' => 0,
|
||||
'level' => 3,
|
||||
'method' => 1,
|
||||
'sfx' => "",
|
||||
'type' => "",
|
||||
'comment' => "",
|
||||
'maxsize' => memory_get_usage()
|
||||
);
|
||||
$this->files = array();
|
||||
$this->exclude = array();
|
||||
$this->exclude_regexp = array();
|
||||
$this->storeonly = array();
|
||||
$this->error = array();
|
||||
}
|
||||
function set_options($options) {
|
||||
foreach ($options as $key => $value)
|
||||
$this->options[$key] = $value;
|
||||
if (!empty($this->options['basedir'])) {
|
||||
$this->options['basedir'] = str_replace("\\", "/", $this->options['basedir']);
|
||||
$this->options['basedir'] = preg_replace("/\/+/", "/", $this->options['basedir']);
|
||||
$this->options['basedir'] = preg_replace("/\/$/", "", $this->options['basedir']);
|
||||
}
|
||||
if (!empty($this->options['name'])) {
|
||||
$this->options['name'] = str_replace("\\", "/", $this->options['name']);
|
||||
$this->options['name'] = preg_replace("/\/+/", "/", $this->options['name']);
|
||||
}
|
||||
if (!empty($this->options['prepend'])) {
|
||||
$this->options['prepend'] = str_replace("\\", "/", $this->options['prepend']);
|
||||
$this->options['prepend'] = preg_replace("/^(\.*\/+)+/", "", $this->options['prepend']);
|
||||
$this->options['prepend'] = preg_replace("/\/+/", "/", $this->options['prepend']);
|
||||
$this->options['prepend'] = preg_replace("/\/$/", "", $this->options['prepend']) . "/";
|
||||
}
|
||||
}
|
||||
function create_archive() {
|
||||
$this->make_list();
|
||||
if ($this->options['inmemory'] == 0) {
|
||||
$pwd = getcwd();
|
||||
chdir($this->options['basedir']);
|
||||
if ($this->options['overwrite'] == 0 && file_exists($this->options['name'] . ($this->options['type'] == "gzip" || $this->options['type'] == "bzip" ? ".tmp" : ""))) {
|
||||
$this->error[] = "File {$this->options['name']} already exists.";
|
||||
chdir($pwd);
|
||||
return 0;
|
||||
} else
|
||||
if ($this->archive = @fopen($this->options['name'] . ($this->options['type'] == "gzip" || $this->options['type'] == "bzip" ? ".tmp" : ""), "wb+"))
|
||||
chdir($pwd);
|
||||
else {
|
||||
$this->error[] = "Could not open {$this->options['name']} for writing.";
|
||||
chdir($pwd);
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
$this->archive = "";
|
||||
switch ($this->options['type']) {
|
||||
case "zip" :
|
||||
if (!$this->create_zip()) {
|
||||
$this->error[] = "Could not create zip file.";
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case "bzip" :
|
||||
if (!$this->create_tar()) {
|
||||
$this->error[] = "Could not create tar file.";
|
||||
return 0;
|
||||
}
|
||||
if (!$this->create_bzip()) {
|
||||
$this->error[] = "Could not create bzip2 file.";
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case "gzip" :
|
||||
if (!$this->create_tar()) {
|
||||
$this->error[] = "Could not create tar file.";
|
||||
return 0;
|
||||
}
|
||||
if (!$this->create_gzip()) {
|
||||
$this->error[] = "Could not create gzip file.";
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case "tar" :
|
||||
if (!$this->create_tar()) {
|
||||
$this->error[] = "Could not create tar file.";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ($this->options['inmemory'] == 0) {
|
||||
fclose($this->archive);
|
||||
if ($this->options['type'] == "gzip" || $this->options['type'] == "bzip")
|
||||
unlink($this->options['basedir'] . "/" . $this->options['name'] . ".tmp");
|
||||
}
|
||||
}
|
||||
function add_data($data) {
|
||||
if ($this->options['inmemory'] == 0)
|
||||
fwrite($this->archive, $data);
|
||||
else
|
||||
$this->archive .= $data;
|
||||
}
|
||||
function exclude_file($name) {
|
||||
$ret = false;
|
||||
// Check for exclusion regexps
|
||||
if (!empty($this->exclude_regexp)) {
|
||||
foreach ($this->exclude_regexp as $pattern) {
|
||||
if (preg_match('|^' . $pattern . '$|', $name)) {
|
||||
$ret = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->options['maxsize'] > 0) {
|
||||
if (filesize($this->options['basedir'] . "/" . $name) > $this->options['maxsize']) {
|
||||
$ret = true;
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
function make_list() {
|
||||
foreach ($this->files as $key => $value) {
|
||||
if ($this->exclude_file($value['name'])) {
|
||||
unset($this->files[$key]);
|
||||
}
|
||||
}
|
||||
if (!empty($this->exclude)) {
|
||||
foreach ($this->files as $key => $value) {
|
||||
foreach ($this->exclude as $current) {
|
||||
if ($value['name'] == $current['name']) {
|
||||
unset($this->files[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!empty($this->storeonly))
|
||||
foreach ($this->files as $key => $value)
|
||||
foreach ($this->storeonly as $current)
|
||||
if ($value['name'] == $current['name'])
|
||||
$this->files[$key]['method'] = 0;
|
||||
unset($this->exclude, $this->storeonly);
|
||||
}
|
||||
function add_files($list) {
|
||||
$temp = $this->list_files($list);
|
||||
foreach ($temp as $current)
|
||||
$this->files[] = $current;
|
||||
}
|
||||
function exclude_regexp_files($patterns) {
|
||||
$this->exclude_regexp = explode("|", $patterns);
|
||||
}
|
||||
function exclude_files($list) {
|
||||
$temp = $this->list_files($list);
|
||||
foreach ($temp as $current)
|
||||
$this->exclude[] = $current;
|
||||
}
|
||||
function store_files($list) {
|
||||
$temp = $this->list_files($list);
|
||||
foreach ($temp as $current)
|
||||
$this->storeonly[] = $current;
|
||||
}
|
||||
function list_files($list) {
|
||||
if (!is_array($list)) {
|
||||
$temp = $list;
|
||||
$list = array(
|
||||
$temp
|
||||
);
|
||||
unset($temp);
|
||||
}
|
||||
$files = array();
|
||||
$pwd = getcwd();
|
||||
chdir($this->options['basedir']);
|
||||
foreach ($list as $current) {
|
||||
$current = str_replace("\\", "/", $current);
|
||||
$current = preg_replace("/\/+/", "/", $current);
|
||||
$current = preg_replace("/\/$/", "", $current);
|
||||
if (strstr($current, "*")) {
|
||||
$regex = preg_replace("/([\\\^\$\.\[\]\|\(\)\?\+\{\}\/])/", "\\\\\\1", $current);
|
||||
$regex = str_replace("*", ".*", $regex);
|
||||
$dir = strstr($current, "/") ? substr($current, 0, strrpos($current, "/")) : ".";
|
||||
$temp = $this->parse_dir($dir);
|
||||
//print "dir: ".$dir; print_r($temp);print "EOL<br>\n";
|
||||
foreach ($temp as $current2) {
|
||||
//print "$regex : ".$current2['name']." <br>\n";
|
||||
if (preg_match("/^{$regex}$/i", $current2['name']))
|
||||
$files[] = $current2;
|
||||
}
|
||||
unset($regex, $dir, $temp, $current);
|
||||
} else
|
||||
if (@ is_dir($current)) {
|
||||
$temp = $this->parse_dir($current);
|
||||
foreach ($temp as $file)
|
||||
$files[] = $file;
|
||||
unset($temp, $file);
|
||||
} else
|
||||
if (@ file_exists($current))
|
||||
$files[] = array(
|
||||
'name' => $current,
|
||||
'name2' => $this->options['prepend'] .
|
||||
preg_replace("/(\.+\/+)+/", "", ($this->options['storepaths'] == 0 && strstr($current, "/")) ? substr($current, strrpos($current, "/") + 1) : $current),
|
||||
'type' => @ is_link($current) && $this->options['followlinks'] == 0 ? 2 : 0,
|
||||
'ext' => substr($current, strrpos($current, ".")),
|
||||
'stat' => stat($current)
|
||||
);
|
||||
}
|
||||
chdir($pwd);
|
||||
unset($current, $pwd);
|
||||
usort($files, array(
|
||||
"archive",
|
||||
"sort_files"
|
||||
));
|
||||
return $files;
|
||||
}
|
||||
function parse_dir($dirname) {
|
||||
if ($this->options['storepaths'] == 1 && !preg_match("/^(\.+\/*)+$/", $dirname))
|
||||
$files = array(
|
||||
array(
|
||||
'name' => $dirname,
|
||||
'name2' => $this->options['prepend'] .
|
||||
preg_replace("/(\.+\/+)+/", "", ($this->options['storepaths'] == 0 && strstr($dirname, "/")) ? substr($dirname, strrpos($dirname, "/") + 1) : $dirname),
|
||||
'type' => 5,
|
||||
'stat' => stat($dirname)
|
||||
)
|
||||
);
|
||||
else
|
||||
$files= array();
|
||||
$dir = @ opendir($dirname);
|
||||
while ($file = @ readdir($dir)) {
|
||||
$fullname = $dirname . "/" . $file;
|
||||
if ($file == "." || $file == "..")
|
||||
continue;
|
||||
else
|
||||
if (@ is_dir($fullname)) {
|
||||
if (empty($this->options['recurse']))
|
||||
continue;
|
||||
$temp = $this->parse_dir($fullname);
|
||||
foreach ($temp as $file2)
|
||||
$files[] = $file2;
|
||||
} else
|
||||
if (@ file_exists($fullname))
|
||||
$files[] = array(
|
||||
'name' => $fullname,
|
||||
'name2' => $this->options['prepend'] .
|
||||
preg_replace("/(\.+\/+)+/", "", ($this->options['storepaths'] == 0 && strstr($fullname, "/")) ? substr($fullname, strrpos($fullname, "/") + 1) : $fullname),
|
||||
'type' => @ is_link($fullname) && $this->options['followlinks'] == 0 ? 2 : 0,
|
||||
'ext' => substr($file, strrpos($file, ".")),
|
||||
'stat' => stat($fullname)
|
||||
);
|
||||
}
|
||||
@ closedir($dir);
|
||||
return $files;
|
||||
}
|
||||
function sort_files($a, $b) {
|
||||
if ($a['type'] != $b['type'])
|
||||
if ($a['type'] == 5 || $b['type'] == 2)
|
||||
return -1;
|
||||
else
|
||||
if ($a['type'] == 2 || $b['type'] == 5)
|
||||
return 1;
|
||||
else
|
||||
if ($a['type'] == 5)
|
||||
return strcmp(strtolower($a['name']), strtolower($b['name']));
|
||||
else
|
||||
if ($a['ext'] != $b['ext'])
|
||||
return strcmp($a['ext'], $b['ext']);
|
||||
else
|
||||
if ($a['stat'][7] != $b['stat'][7])
|
||||
return $a['stat'][7] > $b['stat'][7] ? -1 : 1;
|
||||
else
|
||||
return strcmp(strtolower($a['name']), strtolower($b['name']));
|
||||
return 0;
|
||||
}
|
||||
function download_file() {
|
||||
if ($this->options['inmemory'] == 0) {
|
||||
$this->error[] = "Can only use download_file() if archive is in memory. Redirect to file otherwise, it is faster.";
|
||||
return;
|
||||
}
|
||||
switch ($this->options['type']) {
|
||||
case "zip" :
|
||||
header("Content-Type: application/zip");
|
||||
break;
|
||||
case "bzip" :
|
||||
header("Content-Type: application/x-bzip2");
|
||||
break;
|
||||
case "gzip" :
|
||||
header("Content-Type: application/x-gzip");
|
||||
break;
|
||||
case "tar" :
|
||||
header("Content-Type: application/x-tar");
|
||||
}
|
||||
$header = "Content-Disposition: attachment; filename=\"";
|
||||
$header .= strstr($this->options['name'], "/") ? substr($this->options['name'], strrpos($this->options['name'], "/") + 1) : $this->options['name'];
|
||||
$header .= "\"";
|
||||
header($header);
|
||||
header("Content-Length: " . strlen($this->archive));
|
||||
header("Content-Transfer-Encoding: binary");
|
||||
header("Cache-Control: no-cache, must-revalidate, max-age=60");
|
||||
header("Expires: Sat, 01 Jan 2000 12:00:00 GMT");
|
||||
print ($this->archive);
|
||||
}
|
||||
function save_file($filename, $path = '') {
|
||||
if ($this->options['inmemory'] == 0) {
|
||||
$this->error[] = "Can only use save_file() if archive is in memory.";
|
||||
return;
|
||||
}
|
||||
if ($fhandle = @fopen($path . $filename, 'w')) {
|
||||
if (@fwrite($fhandle, $this->archive)) {
|
||||
if (@fclose($fhandle))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}else {
|
||||
return -2;
|
||||
}
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
class zip_file extends archive {
|
||||
function __construct($name) {
|
||||
$this->archive($name);
|
||||
$this->options['type'] = "zip";
|
||||
}
|
||||
function create_zip() {
|
||||
$files = 0;
|
||||
$offset = 0;
|
||||
$central = "";
|
||||
if (!empty($this->options['sfx']))
|
||||
if ($fp = @ fopen($this->options['sfx'], "rb")) {
|
||||
$temp = fread($fp, filesize($this->options['sfx']));
|
||||
fclose($fp);
|
||||
$this->add_data($temp);
|
||||
$offset += strlen($temp);
|
||||
unset($temp);
|
||||
} else
|
||||
$this->error[] = "Could not open sfx module from {$this->options['sfx']}.";
|
||||
$pwd = getcwd();
|
||||
chdir($this->options['basedir']);
|
||||
foreach ($this->files as $current) {
|
||||
if ($current['name'] == $this->options['name'])
|
||||
continue;
|
||||
$timedate = explode(" ", date("Y n j G i s", $current['stat'][9]));
|
||||
$timedate = ($timedate[0] - 1980 << 25) | ($timedate[1] << 21) | ($timedate[2] << 16) | ($timedate[3] << 11) | ($timedate[4] << 5) | ($timedate[5]);
|
||||
$block = pack("VvvvV", 0x04034b50, 0x000A, 0x0000, (isset($current['method']) || $this->options['method'] == 0) ? 0x0000 : 0x0008, $timedate);
|
||||
//if ($current['stat'][7] == 0 && $current['type'] == 5) {
|
||||
if ($current['type'] == 5) {
|
||||
$block .= pack("VVVvv", 0x00000000, 0x00000000, 0x00000000, strlen($current['name2']) + 1, 0x0000);
|
||||
$block .= $current['name2'] . "/";
|
||||
$this->add_data($block);
|
||||
$central .= pack("VvvvvVVVVvvvvvVV", 0x02014b50, 0x0014, $this->options['method'] == 0 ? 0x0000 : 0x000A, 0x0000, (isset($current['method']) || $this->options['method'] == 0) ? 0x0000 : 0x0008, $timedate, 0x00000000, 0x00000000, 0x00000000, strlen($current['name2']) + 1, 0x0000, 0x0000, 0x0000, 0x0000, $current['type'] == 5 ? 0x00000010 : 0x00000000, $offset);
|
||||
$central .= $current['name2'] . "/";
|
||||
$files++;
|
||||
$offset += ( 31 + strlen($current['name2']));
|
||||
} else
|
||||
if ($current['stat'][7] == 0) {
|
||||
$block .= pack("VVVvv", 0x00000000, 0x00000000, 0x00000000, strlen($current['name2']), 0x0000);
|
||||
$block .= $current['name2'];
|
||||
$this->add_data($block);
|
||||
$central .= pack("VvvvvVVVVvvvvvVV", 0x02014b50, 0x0014, $this->options['method'] == 0 ? 0x0000 : 0x000A, 0x0000, (isset($current['method']) || $this->options['method'] == 0) ? 0x0000 : 0x0008, $timedate, 0x00000000, 0x00000000, 0x00000000, strlen($current['name2']), 0x0000, 0x0000, 0x0000, 0x0000, $current['type'] == 5 ? 0x00000010 : 0x00000000, $offset);
|
||||
$central .= $current['name2'];
|
||||
$files++;
|
||||
$offset += ( 30 + strlen($current['name2']));
|
||||
} else
|
||||
if ($fp = @ fopen($current['name'], "rb")) {
|
||||
$temp = fread($fp, $current['stat'][7]);
|
||||
fclose($fp);
|
||||
$crc32 = crc32($temp);
|
||||
if (!isset($current['method']) && $this->options['method'] == 1) {
|
||||
$temp = gzcompress($temp, $this->options['level']);
|
||||
$size = strlen($temp) - 6;
|
||||
$temp = substr($temp, 2, $size);
|
||||
} else
|
||||
$size= strlen($temp);
|
||||
$block .= pack("VVVvv", $crc32, $size, $current['stat'][7], strlen($current['name2']), 0x0000);
|
||||
$block .= $current['name2'];
|
||||
$this->add_data($block);
|
||||
$this->add_data($temp);
|
||||
unset($temp);
|
||||
$central .= pack("VvvvvVVVVvvvvvVV", 0x02014b50, 0x0014, $this->options['method'] == 0 ? 0x0000 : 0x000A, 0x0000, (isset($current['method']) || $this->options['method'] == 0) ? 0x0000 : 0x0008, $timedate, $crc32, $size, $current['stat'][7], strlen($current['name2']), 0x0000, 0x0000, 0x0000, 0x0000, 0x00000000, $offset);
|
||||
$central .= $current['name2'];
|
||||
$files++;
|
||||
$offset += ( 30 + strlen($current['name2']) + $size);
|
||||
} else
|
||||
$this->error[] = "Could not open file {$current['name']} for reading. It was not added.";
|
||||
}
|
||||
$this->add_data($central);
|
||||
$this->add_data(pack("VvvvvVVv", 0x06054b50, 0x0000, 0x0000, $files, $files, strlen($central), $offset, !empty($this->options['comment']) ? strlen($this->options['comment']) : 0x0000));
|
||||
if (!empty($this->options['comment']))
|
||||
$this->add_data($this->options['comment']);
|
||||
chdir($pwd);
|
||||
return 1;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user