From 1e3ae2fbbbb583fdc96c2a9d712d4e7a7fa1c757 Mon Sep 17 00:00:00 2001 From: "George Frederick \"Buzz\" Beurling" Date: Thu, 19 Mar 2020 19:07:26 -0400 Subject: [PATCH] File Explorer update + Permission update --- .env.example | 4 +- app/GoogleDriveFile.php | 216 ++++++++++++ .../Controllers/GoogleDriveController.php | 228 +++++++++---- app/Http/Kernel.php | 1 + app/Http/Middleware/CheckFilePerm.php | 62 ++++ app/Http/helpers.php | 1 + composer.json | 1 + composer.lock | 105 +++++- config/breadcrumbs.php | 75 +++++ ..._163558_create_google_drive_file_table.php | 38 +++ public/css/custom.css | 19 +- public/images/C-CMS.png | Bin 0 -> 28940 bytes public/images/C-CMS_G.png | Bin 0 -> 38581 bytes public/js/plugins/drive-explorer.js | 77 ++++- resources/custom.css | 19 +- resources/views/admin/configs/perso.blade.php | 23 +- .../files/Google Drive/explorer.blade.php | 45 ++- .../admin/files/Google Drive/index.blade.php | 13 +- .../files/Google Drive/permission.blade.php | 269 +++++++++++++++ .../Google Drive/permission/edit.blade.php | 70 ++++ resources/views/admin/ocom/index.blade.php | 2 +- resources/views/admin/ocom/show.blade.php | 2 +- .../views/admin/schedule/event/add.blade.php | 6 +- resources/views/admin/update.blade.php | 103 ++++++ resources/views/errors/401.blade.php | 97 +----- resources/views/errors/403.blade.php | 9 + resources/views/errors/404.blade.php | 97 +----- resources/views/errors/419.blade.php | 9 + resources/views/errors/429.blade.php | 9 + resources/views/errors/500.blade.php | 96 +----- resources/views/errors/503.blade.php | 9 + resources/views/errors/layout.blade.php | 194 +++++++++++ .../views/layouts/admin/header.blade.php | 2 +- routes/api.php | 1 + routes/breadcrumbs.php | 311 ++++++++++++++++++ routes/web.php | 120 +++---- 36 files changed, 1899 insertions(+), 434 deletions(-) create mode 100644 app/Http/Middleware/CheckFilePerm.php create mode 100644 config/breadcrumbs.php create mode 100644 database/migrations/2020_03_17_163558_create_google_drive_file_table.php create mode 100644 public/images/C-CMS.png create mode 100644 public/images/C-CMS_G.png create mode 100644 resources/views/admin/files/Google Drive/permission.blade.php create mode 100644 resources/views/admin/files/Google Drive/permission/edit.blade.php create mode 100644 resources/views/errors/403.blade.php create mode 100644 resources/views/errors/419.blade.php create mode 100644 resources/views/errors/429.blade.php create mode 100644 resources/views/errors/503.blade.php create mode 100644 resources/views/errors/layout.blade.php create mode 100644 routes/breadcrumbs.php diff --git a/.env.example b/.env.example index aaf8f7e5..c8049e0e 100644 --- a/.env.example +++ b/.env.example @@ -33,8 +33,8 @@ MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null -NEXMO_KEY=4587feffd # Votre Clé Nexmo API -NEXMO_SECRET=54dasf4e8fa4s4fd4f5s # Votre Mot de passe Nexmo API +NEXMO_KEY= # Votre Clé Nexmo API +NEXMO_SECRET= # Votre Mot de passe Nexmo API PUSHER_APP_ID= PUSHER_APP_KEY= diff --git a/app/GoogleDriveFile.php b/app/GoogleDriveFile.php index 495bd2f4..9ab0b2ca 100644 --- a/app/GoogleDriveFile.php +++ b/app/GoogleDriveFile.php @@ -3,9 +3,25 @@ namespace App; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Storage; +use League\Flysystem\FileNotFoundException; +use mysql_xdevapi\Exception; class GoogleDriveFile extends Model { + protected $primaryKey = 'id'; // or null + + public $incrementing = false; + + // In Laravel 6.0+ make sure to also set $keyType + protected $keyType = 'string'; + + protected $casts = [ + 'rank_permission' => 'array', + 'job_permission' => 'array', + 'user_permission' => 'array', + ]; + public static function icon($extension) { $icon = "fas fa-file"; @@ -37,4 +53,204 @@ class GoogleDriveFile extends Model } return $icon; } + + public static function checkConfig() + { + $configNull = (\Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_ID')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_SECRET')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_REFRESH_TOKEN')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_FOLDER_ID')) != ""); + $configOk = true; + + if ($configNull) + { + try { + \Storage::cloud()->listContents("/", false); + } + catch (\Exception $e) + { + $configOk = false; + } + } + + return $configNull && $configOk; + } + + public static function findByName($name) + { + return GoogleDriveFile::where('name','=',$name)->get()->first(); + } + + public static function findByPath($path) + { + return GoogleDriveFile::where('path','=',$path)->get()->first(); + } + + public static function findByPathInDrive($path,$current_directory = '/') + { + if ($path != "") + { + $exploded_path = explode('/',$path); + if ($exploded_path[0] == "") + { + array_splice($exploded_path,0,1); + } + $contents = collect(Storage::cloud()->listContents($current_directory, false)); + + $dir = $contents->where('type', '=', 'dir') + ->where('name', '=', $exploded_path[0]) + ->first(); + + if ( ! $dir) + { + return false; + } + else + { + array_splice($exploded_path,0,1); + $newPath = implode('/',$exploded_path); + if ($newPath == "") + { + return $dir['basename']; + } + else + { + return GoogleDriveFile::findByPathInDrive($newPath,$dir['basename']); + } + } + } + return true; + } + + public static function createByPathInDrive($path,$current_directory = '/') + { + if ($path != "") + { + $exploded_path = explode('/',$path); + $size = count($exploded_path); + if ($size > 1) + { + $parent = self::findByName($exploded_path[$size-2]); + \Storage::cloud()->createDir($parent->id.'/'.$exploded_path[$size-1]); + } + else + { + \Storage::cloud()->createDir('/'.$exploded_path[$size-1]); + } + return self::findByPathInDrive($path); + } + return false; + } + + public function setPermission($subject, $value) + { + $explodedSubject = explode('.',$subject); + $subject = $explodedSubject[0]; + $id = $explodedSubject[1]; + + $permission = null; + if ($subject == 'rank') + { + $permission = $this->rank_permission; + } + elseif ($subject == 'job') + { + $permission = $this->job_permission; + } + elseif ($subject == 'user') + { + $permission = $this->user_permission; + } + + [$id] = $value; + + if ($subject == 'rank') + { + $this->rank_permission = $permission; + } + elseif ($subject == 'job') + { + $this->job_permission = $permission; + } + elseif ($subject == 'user') + { + $this->user_permission = $permission; + } + $this->save(); + } + + public function getAllPermission($subject) + { + $permission = null; + if ($subject == 'rank') + { + $permission = $this->rank_permission; + } + elseif ($subject == 'job') + { + $permission = $this->job_permission; + } + elseif ($subject == 'user') + { + $permission = $this->user_permission; + } + + return $permission; + } + + public function getPermission($subject) + { + $explodedSubject = explode('.',$subject); + $subject = $explodedSubject[0]; + $id = $explodedSubject[1]; + + if (isset($this->getAllPermission($subject)[$id])) + { + return $this->getAllPermission($subject)[$id]; + } + else + { + return ''; + } + } + + public function canUser($user, $permission = 'r') + { + if (strpos($this->getPermission('rank.0'),$permission) !== false) + { + return true; + } + if (strpos($this->getPermission('user.'.$user->id),$permission) === false) + { + if (strpos($this->getPermission('job.'.$user->job->id),$permission) === false) + { + if (strpos($this->getPermission('rank.'.$user->rank->id),$permission) === false) + { + return false; + } + + } + } + return true; + } + + public function canAuthUser($perm = 'r') + { + return $this->canUser(\Auth::user(),$perm); + } + + public static function getPermForUser($folder,$user,$perm = 'r') + { + $dir = \App\GoogleDriveFile::find($folder); + if ($dir == null) + { + return false; + } + else + { + return $dir->canUser($user,$perm); + } + } + + public static function getPermForAuthUser($folder,$perm = 'r') + { + return self::getPermForUser($folder,\Auth::user(),$perm); + } } diff --git a/app/Http/Controllers/GoogleDriveController.php b/app/Http/Controllers/GoogleDriveController.php index 505e804f..4200201e 100644 --- a/app/Http/Controllers/GoogleDriveController.php +++ b/app/Http/Controllers/GoogleDriveController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\GoogleDriveFile; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Psy\Util\Str; @@ -245,9 +246,6 @@ class GoogleDriveController extends Controller $contents = collect(Storage::cloud()->listContents($folder, $recursive)); } - //dd($contents); - //$meta = collect(Storage::cloud()->listContents($folder, true)); - //dd($meta); return view('admin.files.Google Drive.explorer',['directories' => $contents->where('type', '=', 'dir')->sortByDesc('name'), 'files' => $contents->where('type', '=', 'file'), 'currentDir' => $folder]); } @@ -256,7 +254,7 @@ class GoogleDriveController extends Controller $error = []; if(\App\Config::getData('is_Google_Drive_enabled') == "true") { - if ($this->checkConfig()) + if (GoogleDriveFile::checkConfig()) { $structure = $this->getFileStructure(); $this->checkStructure($structure,'/','/',$error); @@ -273,61 +271,135 @@ class GoogleDriveController extends Controller return $error; } - public function checkStructure($structure,$parent,$id,&$error) + public function checkStructure() { - $mydir = $this->listLockDirectory($id); + $structure = $this->getFileStructure(); - foreach ($structure as $key => $value) + foreach ($structure as $directory => $value) { - $found = false; - $newDirID = null; - $p = null; - foreach ($mydir as $dir) + $basename = GoogleDriveFile::findByPathInDrive($directory); + if ($basename == false) { - $p = $dir['basename']; - if ($dir['extension'] == $key) + $basename = GoogleDriveFile::createByPathInDrive($directory); + } + + $googleDriveFile = GoogleDriveFile::findByPath($directory); + if ($googleDriveFile == null) + { + $googleDriveFile = new GoogleDriveFile(); + $googleDriveFile->id = $basename; + $googleDriveFile->type = 'directory'; + $googleDriveFile->rank_permission = $value['rank']; + $googleDriveFile->job_permission = []; + $googleDriveFile->user_permission = []; + $googleDriveFile->path = $directory; + $name = explode('/',$directory); + $googleDriveFile->name = $name[count($name)-1]; + $googleDriveFile->save(); + } + else + { + if ($googleDriveFile->id != $basename) { - $found = true; - $newDirID = $dir['basename']; - break; + $googleDriveFile->id = $basename; + $googleDriveFile->save(); } } - if (!$found) - { - array_push($error,'Dossier 🔒.'.$key.' manquant... Le dossier a été créer'); - \Storage::cloud()->createDir($parent.'/🔒.'.$key); - $tempdir = $this->listLockDirectory($parent); - $p = $tempdir->where('extension','=',$key)->first()['basename']; - } - if ($value != []) - { - $this->checkStructure($value,$p,$newDirID,$error); - } } } + public function editPermission($folder) + { + $f = GoogleDriveFile::find($folder); + if ($f == null) + { + $metadata = \Storage::cloud()->getMetadata($folder); + $f = new GoogleDriveFile(); + $f->id = $folder; + $f->type = 'directory'; + $f->name = $metadata['name']; + $f->rank_permission = [1 => 'rwp']; + $f->job_permission = []; + $f->user_permission = []; + $f->path = $this->recreatePath($folder); + $f->save(); + } + return view('admin.files.Google Drive.permission',['dir' => $f]); + } + public function getFileStructure() { return collect([ - 'Privé' => [ - 'Cadet' => [], - 'ETAMAS' => [], - 'Officier' => [], - 'Staff' => [ - 'Guide' => [] - ] + '🔒.Privé' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] ], - 'Publique' => [ - 'Fichier' => [], - 'Image' => [] + '🔒.Privé/🔒.Cadet' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Privé/🔒.ETAMAS' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Privé/🔒.Officier' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Privé/🔒.Staff' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Privé/🔒.Staff/🔒.Guide' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Publique' => [ + 'rank' => [1 => 'rwp',0 => 'r'], + 'job' => [], + 'user' => [] + ], + '🔒.Publique/🔒.Fichier' => [ + 'rank' => [1 => 'rwp',0 => 'r'], + 'job' => [], + 'user' => [] + ], + '🔒.Publique/🔒.Image' => [ + 'rank' => [1 => 'rwp',0 => 'r'], + 'job' => [], + 'user' => [] + ], + '🔒.Système' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Système/🔒.Fichier' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Système/🔒.Image' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Système/🔒.Image/🔒.Nouvelle' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] + ], + '🔒.Système/🔒.Image/🔒.Profil' => [ + 'rank' => [1 => 'rwp'], + 'job' => [], + 'user' => [] ], - 'Système' => [ - 'Fichier' => [], - 'Image' => [ - 'Nouvelle' => [], - 'Profil' => [] - ] - ] ]); } @@ -340,24 +412,70 @@ class GoogleDriveController extends Controller return $dir; } - public function checkConfig() + public function recreatePath($folder) { - $configNull = (\Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_ID')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_SECRET')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_REFRESH_TOKEN')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_FOLDER_ID')) != ""); - $configOk = true; - - if ($configNull) + $path = []; + $name = []; + $directories = collect(json_decode($this->getPathArray(),true)); + foreach ($directories as $dir) { - try { - $contents = collect(Storage::cloud()->listContents("/", false)); - } - catch (\Exception $e) + $path[$dir['basename']] = $dir['dirname']; + $name[$dir['basename']] = $dir['name']; + } + $realPath = $name[$folder]; + $foo = $folder; + while ($foo != "") + { + $bar = explode('/',$path[$foo]); + $foo = $bar[count($bar)-1]; + if ($foo != "") { - $configOk = false; + $realPath = $name[$foo].'/'.$realPath; } } + return $realPath; + } - return $configNull && $configOk; + public function editPermissionModal($folder,$subject,$id) + { + $dir = GoogleDriveFile::find($folder); + $foo = null; + $perm = null; + if ($subject == 'rank') + { + if ($id == 0) + { + $foo = new \App\Rank(); + $foo->name = "Utilisateur non authentifié"; + $foo->id = 0; + if (isset($dir->rank_permission[$id])) + { + $perm = $dir->rank_permission[$id]; + } + else + { + $perm = ""; + } + } + else + { + $foo = \App\Rank::find($id); + $perm = $dir->rank_permission[$id]; + } + } + elseif ($subject == 'job') + { + $foo = \App\Job::find($id); + $perm = $dir->job_permission[$id]; + } + else + { + $foo = \App\User::find($id); + $perm = $dir->user_permission[$id]; + } + return view('admin.files.Google Drive.permission.edit',['folder' => $dir,'subject' => $foo,'perm' => $perm,'s' => $subject]); } + } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 649e7b55..75cf88dd 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -62,5 +62,6 @@ class Kernel extends HttpKernel 'staff' => \App\Http\Middleware\AccesStaff::class, 'admin' => \App\Http\Middleware\AccesAdmin::class, 'perm' => \App\Http\Middleware\CheckPerm::class, + 'fileperm' => \App\Http\Middleware\CheckFilePerm::class, ]; } diff --git a/app/Http/Middleware/CheckFilePerm.php b/app/Http/Middleware/CheckFilePerm.php new file mode 100644 index 00000000..d4234769 --- /dev/null +++ b/app/Http/Middleware/CheckFilePerm.php @@ -0,0 +1,62 @@ +d); + if ($dir != null) + { + if (\Auth::check()) + { + if ($dir->canUser(\Auth::user(),$permission) == false) + { + clog('navigate','danger','Vous n\'avez pas la permission d\'accéder a ce fichier',\Auth::user()->id); + return redirect('/admin')->with('error','Vous n\'avez pas la permission d\'accéder a ce fichier'); + } + } + else + { + if (strpos($dir->getPermission('rank.0'),$permission) === false) + { + clog('navigate','danger','Un utilisateur non authentifié a tenter de télécharger un fichier privé','0'); + abort(401,'Vous n\'avez pas la permission d\'accéder a ce fichier'); + } + } + return $next($request); + } + if (\Auth::check()) + { + if (\Auth::user()->permission('config_edit')) + { + return $next($request); + } + } + abort(401,'Vous n\'avez pas la permission d\'accéder a ce fichier'); + } + abort(500); + } + else + { + clog('navigate','danger','Google Drive n\'est pas activé ou les identifiants sont incorrect',\Auth::user()->id); + return redirect('/admin')->with('error','Google Drive n\'est pas activé ou les identifiants sont incorrect'); + } + } +} diff --git a/app/Http/helpers.php b/app/Http/helpers.php index 27040d95..53df07dc 100644 --- a/app/Http/helpers.php +++ b/app/Http/helpers.php @@ -48,6 +48,7 @@ function clog(string $type,string $result,string $event,$user_id = null,$obj_typ $log->user_id = \Auth::User()->id; } + if ($obj_type != null) { $log->logable_type = $obj_type; diff --git a/composer.json b/composer.json index fef011c9..28efb949 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "php": "^7.2", "barryvdh/laravel-dompdf": "^0.8.4", "barryvdh/laravel-ide-helper": "v2.6.6", + "davejamesmiller/laravel-breadcrumbs": "5.3.1", "fideloper/proxy": "^4.0", "guzzlehttp/guzzle": "^6.3", "laravel/framework": "^6.0", diff --git a/composer.lock b/composer.lock index d7541ca9..c05ca5ee 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "57f87b1252c823a7d2a41bf3f850e726", + "content-hash": "1f2a06232956fd23a3faa4bba05f8f95", "packages": [ { "name": "barryvdh/laravel-dompdf", @@ -483,6 +483,65 @@ ], "time": "2020-03-01T12:26:26+00:00" }, + { + "name": "davejamesmiller/laravel-breadcrumbs", + "version": "5.3.1", + "source": { + "type": "git", + "url": "https://github.com/davejamesmiller/laravel-breadcrumbs.git", + "reference": "40a73bc9b32fbbee18938dc92228dea161365245" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/davejamesmiller/laravel-breadcrumbs/zipball/40a73bc9b32fbbee18938dc92228dea161365245", + "reference": "40a73bc9b32fbbee18938dc92228dea161365245", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "illuminate/support": "^5.6|^6.0", + "illuminate/view": "^5.6|^6.0", + "php": ">=7.1.3" + }, + "require-dev": { + "orchestra/testbench": "^3.6", + "php-coveralls/php-coveralls": "^1.0", + "phpunit/phpunit": "^7.0|^8.0", + "spatie/phpunit-snapshot-assertions": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "DaveJamesMiller\\Breadcrumbs\\BreadcrumbsServiceProvider" + ], + "aliases": { + "Breadcrumbs": "DaveJamesMiller\\Breadcrumbs\\Facades\\Breadcrumbs" + } + } + }, + "autoload": { + "psr-4": { + "DaveJamesMiller\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/davejamesmiller/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "time": "2019-10-20T18:25:39+00:00" + }, { "name": "dnoegel/php-xdg-base-dir", "version": "v0.1.1", @@ -1073,6 +1132,50 @@ ], "time": "2020-02-13T22:36:52+00:00" }, + { + "name": "facade/ignition-contracts", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "time": "2019-08-30T14:06:08+00:00" + }, { "name": "fideloper/proxy", "version": "4.3.0", diff --git a/config/breadcrumbs.php b/config/breadcrumbs.php new file mode 100644 index 00000000..d6acba13 --- /dev/null +++ b/config/breadcrumbs.php @@ -0,0 +1,75 @@ + 'breadcrumbs::bootstrap4', + + /* + |-------------------------------------------------------------------------- + | Breadcrumbs File(s) + |-------------------------------------------------------------------------- + | + | The file(s) where breadcrumbs are defined. e.g. + | + | - base_path('routes/breadcrumbs.php') + | - glob(base_path('breadcrumbs/*.php')) + | + */ + + 'files' => base_path('routes/breadcrumbs.php'), + + /* + |-------------------------------------------------------------------------- + | Exceptions + |-------------------------------------------------------------------------- + | + | Determine when to throw an exception. + | + */ + + // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) + 'unnamed-route-exception' => false, + + // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) + 'missing-route-bound-breadcrumb-exception' => false, + + // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) + 'invalid-named-breadcrumb-exception' => true, + + /* + |-------------------------------------------------------------------------- + | Classes + |-------------------------------------------------------------------------- + | + | Subclass the default classes for more advanced customisations. + | + */ + + // Manager + 'manager-class' => DaveJamesMiller\Breadcrumbs\BreadcrumbsManager::class, + + // Generator + 'generator-class' => DaveJamesMiller\Breadcrumbs\BreadcrumbsGenerator::class, + +]; diff --git a/database/migrations/2020_03_17_163558_create_google_drive_file_table.php b/database/migrations/2020_03_17_163558_create_google_drive_file_table.php new file mode 100644 index 00000000..b614ee24 --- /dev/null +++ b/database/migrations/2020_03_17_163558_create_google_drive_file_table.php @@ -0,0 +1,38 @@ +string('id'); + $table->index('id'); + $table->string('type'); + $table->string('name'); + $table->string('path')->default(''); + $table->string('rank_permission'); + $table->string('job_permission'); + $table->string('user_permission'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('google_drive_file'); + } +} diff --git a/public/css/custom.css b/public/css/custom.css index 9a08cf67..ac524cb8 100644 --- a/public/css/custom.css +++ b/public/css/custom.css @@ -57,6 +57,10 @@ cursor: pointer; } +.no-cursor { + cursor: default; +} + .word-wrap { white-space: normal; word-break: break-word; @@ -140,7 +144,7 @@ top: 36px; left: 36px; width: 0; - height: 0; + height: 0;progress-bar opacity: 1; } 100% { @@ -1816,3 +1820,16 @@ td{ h2 { text-transform: capitalize !important; } + +.breadcrumb { + margin: auto; + background-color: transparent; +} + +.navbar-wrapper { + max-width: 75%; +} +.progress-bar-top { + margin-bottom: -4px; + border-radius: 6px 6px 0px 0px; +} \ No newline at end of file diff --git a/public/images/C-CMS.png b/public/images/C-CMS.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7972a9a0a710e97c5cdd4a67da0946fe021359 GIT binary patch literal 28940 zcmYIubzB_566O+I7l#Cw;O-7Vf&_PhL$KiP?h+)pTX2`)?(S|2ERq0=yWZyAdv|~A z%x`CUy1J^r(ymBlMQL=D4=4Zt09{r_QWXGrcLM;xz#}0*pP2FyB13P;4l+8<001h^ zzaI=BBa09KKvA-ikWf~(w0E(0wzPL3mz9tpcW|;dx3Vz<06f;R)hyK2{^ASYZC#6h zi3mvgVy}vaM6N0x9e|ra!$5(IDHlPJzlx{QizOumM>LWb0UH||5QC?}gcgOeg1ARf z5F1<=5jFO-<6UUI)Nyw(`TBcV?25|2uB*aMBgV+Ut@t8+N0`w?k_OKC$zX6ZL)Ae8iLSTAa68OF# z1>ge2ykf>2A z%pxQKmV$uFY0W4pfHoTd*Zj)>KVXF!z$U9@E(54-2J}o}qSgbD&;V>I5ux+|IB$T_ z2o;qFAS4}t`}tB!=z_5t^N;~5sq}iGR%(8!KwTteM?@_x7E-z?Spr5}9^-e$8DcDb zp6Ty70=a^C6q@0!+?!#~+b<;Sl%+~ z`Mz588TM$s*gW_NJ>T7IckNOKa_9$2!`*N9O})_b$*O!3J0c?@YVDor%6k=Y0eOn9Kfj1ON;qsae#=8bpVY007CnK!(~+ zMAyB9Og#w1z3>~osLw_`A>z~ned3tnDBl8zos8%!gT(2=CTmF;j93@MNVs}bEW;8V zFj)FDS}=qifRDyVIlXipfyi*5Mv!ofDb^xjOro@@Vvz{aL+>eiW#F)*smVtpa8)S3 zByh{Ht467lYsipX3Ol{y57+zLmLNC+;0SsS>yTzo3anQVUO@XT(OSy;A>?xb>dZG6 z_KZ0Eyv!M=#t*_VJo$$+6_&uYI1!0qww^zPh@1m9Y%D|l;&psX$cd)ob(EE86+<6t zH7jA;BX3Nn>)he61EqS9dEnf|$&E=r$!N=KE3U|tk`q&NVXYzaBEyEL^wCl#mVRlZ zX~TLLAT;4%57(AqqFTa^!(qkrj*uAOrN)kw;Gk`de|TD%D@6vP>?S z4^)YxYu~Kv5&4st$QegM_pUmc4(?yGoJev@jAN_Z&_mum+9WH7$$m!hhI%ur`xP z6;o%l=Ena@|4ID=d+m;f9)=e@9AQECK9dlU(Bi#2VNIHR@%#Dc_rvOJyzIwmhv~p{ zdkt-dCI%n8gfWz4xn!DTA_i9Vvhw2ct#VY2D~)mWxH1DZ-|EjAoNC}QKc*i!#B|@N$b%dv(!YemXCa2s-`p{YnzQRPyQ!!5u^7sHX25JeVk~(JR7S1Gxui z>Lyox+!)%^UP#)bh0DwG`6W2zIJFv7uae9~5y5GW_gOBA$cJ<#saJkcTexTRyYxiG zT=K2#W_s4;DXA&i6*3hn71GC@Jk^kr?BY(TcAcj{j8DUIw0gAC7I9PX*@tSYYMUh} zCHM-$0yotx<<><+`R$VK-F79XX*pd60Xg#aC0m}IhmXX*tS{;>wvQz@(rDTU4QSK| z>u6JiLWA6n_Ch4A!|N9+68imO5=F+z#;H3Y39Yk2g^Qnmd5GgK8?i|LC656zA`nHHno_^ z*6)2S);VqJunYaluT!M0@m0U!b5(ZL$EEhF_7bd;R>efciku~j{@RPC(WbKI_qF>g z2D-fZxpCCr z@tV8I&TPo+gOsk0xf7fxP;|$N3ap#m)~`Z7#pJbq!uu2#R28(}TSZ|xauQ!f zad((Dl`v(65vuI>XK4n}_`o>2-w%y8G(1!*Of=RZLi@ukdn&j4?1qFhNb*rKMRF_C zf?bKfhFOlAL8P4JyU-eM8&{j?5R19a#G-b#wyez;Vty8eY92eAF3>aNDttG47ZvPH zkj6Tq@8Fp~)ps3Qf?vjh%_NW_CLf{5mvsIKlc5wp=Hn%f`^Q)m&pwhq3rf~mp4o^M z2|Wf<#Y-6m1+Skc2_4*?)PtNwO#7`Nv}N%f^62uLnF2ZZ8E)jZ9Kr&f?7=@1;vL1y zDHIZ$ERHM=%-zN-%|h#62koMpSxJ)-N39#;E8%sRQJTby|EPbZTV_D4w=mN(@1Bet z<4>u`VVs0aG>oms^JbmpzCp12uy=ko6@`7#VkXf(=&bzCUoYh7xsC$HgJ%rWM5q*M ziE3i7T~w-oXr)&Bb<%h#SO*&Pjs^AphOs_I)j-(~^*!ELhUhD4v+96;8$X6+6N%tO zMpfgk6Qtt#uh4CH>=T9Ck9DVSBsG>*477fmHlH*9d$7fvql=MJo_dgqVTZoD)`$+$ zY=qq0O0Bb|PSUNn2RBKy7Iq7@beNTlPE87ms{c~IR)19IIi1`5ZM=MMH+xFt-Eqrx zvbe6>arYuJ+O@6$qoJ^9zG(I&`_ynJS{+&b_deyxR=-No))6ucI|uuMNQKd~+`6zx zGAFFA8n?uFER8Wt*7cfw=FW`HgRb!-YiO6sLDF;Y?;SGejuc&B%`L{eatCpq%#Fl? zg!Q|4#%0FmOtp+BT@&3lr3sPQrK2scXX$k^U>28#0}gZ*TLvzeG8_Q=8YFo)`FUON%-D!ke8}UiNo`cQ+vXO+P2v zm#OjgRd?Fcst%w?s-?U8`5_Op~2Iy2{&;-3HZ45 zxbZObu;Uy)5q|z%QKy%`&m|Jm-==AD2wn?b$EykOS^e%8kC&%r(`NHiFH;k{ZGDPf zj(U#Y*Q^iq4Uu+@dT_EETx&i-dfhkNNzMvEK&3q&a(}uv%ZIufwV9Hq#P^AbZ*Z__ zSI?%L%hyjj!@ zWGKg`fWDLK#H7r)2gj9nyuCh%5p4P1`Dj*_mdjy@BT@WXK&2=MFBf{UVT~oNLhMPP zx*_EFML<4ifJ6}zugV${f#UaA#zFPD5td=KTYdLxdcDrU*i0i96Z&zH0TR}OI=HOF zD=~TTkA1hfIgiQt_Ldm8M#BGIwm7ywM{PM+1XUj+BG|xgzQqw?&E=~0) z6f;5kosN!%$5EMcT_x8r6%*r+-r(tvg6$~rc?>xJT_I((T+9boZje8Sgl^wSp8jA8 zGWBOx>ngRg^BnQej%O#TCfkbQ*Z)U> zZ;Zp|UgKnIlOnId9dgujzM}E5#3|6iinIxc1%IL**LW z0n{30|C6VI9OpL~LkyCmtQuA5bz&ypH*l_8^?%#!LtSgBV*5G95|A`vq4V(`^!DL= zob|WLhS&c_*nr%G5rADO;NfxMi5Dy8Vo}15vEg#Y-J%>pUEJMV=}Vl_fP;{yPO++&2tjzU+JnB}A0)`>&zz zIrdzj4@g%3-?o1$#I)~pCAD65`*>~6E?cQHpX|QHA2*Z!@Q>qv%Hb%*vEJOgTa@}0 z%jZy=SJm@kP}2sqh4TNQ^GUhZ(5sA7(9H#mL%KbVSmb)Smu9Iu*+gwFE#E= z@~&h0silc`JeU(LRoe#te{8@cjyX^N-k-_84FRFiqz5CebGlgS{(n)x-J`SW%*85+ z{FUtGuf*R?R1&Cju@bzY|1UN|-az)KIbKI5v1Fo%GW2;*GCTJd&QPt14#Ypwg7WcC zTu1?A{@2Cw)7k487hplG$ChhPl{81N0K2=LwNfyu{WR@=2Zm%j^%RQv=Q&5mCkah`bRP?{m`_i zVZVl!utbTX5}Vt}Z!v;*zg?$C&VTbJUw|_?oXx*b(jLiUb6Pa*9oJ;;j$19=IX@I& z&V<&P))c9g(6$_vTiib!S_hasVnEk4ASg#jMHzfzV>wH?mP;8f`W8}IDd+R%3*YtD zg|XRIb@2KmJ=6KburUwI&qlGYcgA4j+^CNNkq@2w-WRA zQiH|2aZVENH+FTehTmv0m4zVm=0irKAP39vS_NXzTZxKvqk=LBMLTg)^J zv~a2s<4tRKUAcUQdIG)Lhq;R7Gbl-mM%#8M4o19FJo^z!b*^fEq1BBxzzBDZ@r1%-?GpHsQp zj}nhT(%#$u#ntx;D&L?WVl$~dc6)=ytp|z>o|lwF1;tlIZ0P8R-Do1K`2z~O)_oqo zm)}%F$XqpN?CBa6Q>H7mB4U4$YNF?$COCYtV)}~BGadY&CRZLr}u0QPG1p}vy|IFA`eqDs8!~1xn5(SUS zlJ_N5oz$z8VYBTe-n!Q0Vo^&Wjqk!`DCY0LPX8fb@M8EE9mNje52Bjih@bu+RRr`r zQ)!R0PRmx)=(XQ>%Jttc5HaqZ4N#QBB*Le_;JE1>a2(Ka%_^K;Um)-ob#$jU&Pqc` zW7Rc2mDj|<&w#c{J)Ou*ySB7?vpeTCEBw_};k(nyxCb@+Cq84xSee3+L`+xo8ZVVW@yBMpU;axeIJQ~9P^)pDwe-~;*5&3?V zBhiPKYT09a#rhZ709F^GJ@!)##kJh3zDm=7^8TL(rl8KI zQP3fg#&W8aPEC%5s?5nsonF>< zYpun9kqFezOEMz{+2rUKhDq&@$=YmHwxRRjG1APoxt?pi|B|G8aa+O1j6Y6RH6R?OYB3M~<=OHoo9uT4vy#{HDLHUp9 zrpWZ7P&9wK-An2x0aHDwW@#*5(ggdbQH1s_a&wEPx& zxt}bnDIl%mOa~-F$3|^)^ht-P1ds$gT4LtEn ziUJRS2PPdX6U-^hLHXB$pz#3dfP<#FN9yy8a`=Ffz;>q>{jsehKH^N+%6ERXPvJT} zpXqN(R0&$%wczpz%2PEoKp-$Ng&{54w{Ip0@)yX8X)jnH_X z2tt;j3G-vJ}`?=oq607hk1+aUBT{4t`~#`H(09+F#4o_B^03=YYiRd8EP zg3jr%0}RJY`)AMdN=gNmD$#{s^QU>GqG@Idq*S{=vXHg%@jsH66daDap&h84$L$gd zyp*lDmWNL5g9XX1cP@u@FD;MxFz_fFe<4sQFIT&7CdkVE;?7O;TX7wsOPFj z#21$R^ZwWavoWvh@oSHLw>}benfTSGPOnw*X%Zf>WdZ*qiv2B zpK|&_-76S&504XlBE0Mxa=i;PoFy-mVj#^U?Qbm@oVtdjrEuzX%^%!yXNbY;;F?i= z6bDoX?sHsod{Izw5q#N#VT4Xb1^CdjJuv} zyGPO6*~vo~ON7_`x(ZixYuH&#bQ?kbx-@_uNqSYThtDX8jO3PdyW5TSEAk)Ij_62W z2F`%DV3cFm2Xpte{S%c1x(fm{$H`4T$L4lvZ zx?%J*89qvm7P8XP???>N0cY%-r`c@z`ra_PJHl?hs78S=e(&5Gfp_x0qVmsbHCx@z zCsU6^C^XE^FcUFjhi-^|utU`i)#1+V#wostE7MH6+m;rq^*vM8Ad$emJ=1Sy$*La_ z*3>>8&Xmr&p~sqh7!6;cM#ed7ugUO`M9VnS;tr7-eOud-GqSln8%R6aD@qgvx-`$4Dq58r50e}5R^)C$cBCW|U)9L>8O6D+pXGhC+t={;`k$u(fb{0%7sj*>T zEdxC1iSZz*5B9&00owI&7$hhzU-pN|+S!~BNH*Mb$(SlSg|Dz!Zs+oP^-zW+$?->u z9lN{xnlqyh=R{;GxJ&h*!`bf&RgJ(g3D(l63$WD(WVx6A9!nqA8{+0TYZ&>sxl~hQ z;@mm5ri4|IScRdLfUe>=MgTT;o+R>H^I-IsTH|1N_1(fa7W1BfarSXTslKJp4C*W4 z&kXNA2IDgyV2jYMQi^#aptWShiFOf|4m{rAe@RI~Dt-A#_t5wc04#%ZWEkn!^tQ8wD>ce~(Bx>sz^dHkiI@MUrK49Fk&i4%XOE40%@CI5Sssan1hYgM+oy<-^ez_DjM(=Id`GAXMVB_)+t z(jX^-+QF@*y){h}Cw;j2=I`_~W2XcxuKdLeL%(X6J=3z`b<33AiS$acpL092<2IaN zMk`u~nx+gI47+>n81zubP=)-|@Eojv&U}~{l{K5n`bz6ttKqpFc&c7n8)RLr6WeXI zF)c#mc6xm`6{pgAN&2r!lKO`>nei-NvkI;IxI;WttXlKuw1{9dBH2mKmweuLCeUg2 z_I~|L`(x;h_Y?RNNXuAmko*WqBisrmxz*o01W>H;;ef>;157=~Cv#>!{47tg;I0qY z3b^kCR;E``5}B%L0&6^yo15oJZq1BL7Fp{-{kYw(5o-K4-6aG8-ukg+aXOnq1S2Tn zs=4oclBB~sL3Y1zO!PcRdP8_KQ9B~Nv4dFL^!1=;d=!cw1Ah?BYd8McP}};XsAy}~ zd4mAO(AdMF5@7Cyq18sm|ICc>xAnB?dXvbA&JvkZslGSq{+KO#|L-U^+co$NuVZv= zO^DiKvsCnyS$`PU_vM^8`7&xUYO+fc9P`1QBrB|^^dV2CLn-;v83v4}Fj(fuN#$nN zUE-RJ%lv!(zaA1kjs4SXItqnqT|~53L?@pdX4&+47fJaV>yKGr(|$M_kmkmXBB7do zcSX9}Gs-@Z1uobA>Q!a=c`~$9(QkmNuUJP(gE-bhEef@^wv!t$#m)%|oXR=v=$8})vl;0IORRQpJph5xhpWmo202L3&8a#-0~@IE)w^G+_M6 z%6i~?WaRHhhuJ6^VfT^cM+|sR8)^tti(WP4iNEr84KqboV$9uS7!j8qtZ@>evW=&^ zuaZfi#te6;q4m`hB4)DmC=lv4Sh-nrp_!hoqMyH1Q^R)?4WsJ6Yan{vbp;7~ zw>>Fu|AgGCQ;$HnmJ)m-lpY)i?{s#H?^9!rOk+laagg$YV5UZKhlS;4 zFm%h}c)l7>#ESIqu|{w)n92_>!2q#6*kZ#^EL^~_F`@y%@nfQKYYpUf@`EcV`^zk~ zQJbR%anh{YfY47kF%t6z^3Y00K=w+#fPM4708&DJ?CKUuV1iQ% z9LRUMmsGa>$9+Y;v4qm&bs)W3o_MII-|xjTwHHf$1>89f%nY7MqcyIx;avYNf0UQ0 zY)I?n*p|)8Ok(%?Y_0&+)uuZMpHBY91Z7XFQ!y9=L?4PMx{o^5>KG* zyAVhneUirr*52lcd1=Jy2hfgN-3=bS6fnyb{z&vN`EV@Cp3)rUx&CQOQM;psc8aIn-=aTkm+7l|v|{!WPNrK& zujJ*Y%bk|0j_%{y8kQL{(_(Pwd%}`|Q;et6=J8eHeUQA>2BfTc$Jecs8OsF2pk2(vrg04VQ*ZaE6(?bN1TuXF0#{!p8du-ybgu@b z@r2Wm>B*V<{R2cVko~vQSB+cbJe6$Q>9J>H z(7en$=On=Z*#eGDvuk*B`U@?2r*}Ki+}3&3$G`Nj%qIm9&u*tR()b%_U!M98b0t)N zx({|anbo-a#Ak5x*82PVb_z|)Jt8n@poAtGsnj>D&v(D!O=SI5$mhj1J(zI*v+$QT zrf{{a(xB>&=7Id-oPcZUC?_CMq@d zNqhq$jli)h&ZO@@rd9KUoN(6)rzLZU`r&fnlT)N+md)m?pJm{@xK ziAJfn?Yu+&*35rFpeg88dQK)b5;nKmC--NLEH<&pW>~$;HJ_%-hEKW%d)Wq(v9G?7 z4*9P)>NkmH#5GLnTIo7u2kQjUdpzEWYP85_-a^mt^2tP>l}SemREu(<9*oM$3e|Gn zJZ`gVE>I&a1o>Fp$$mIaFueyCT4`C^wNpB)Ug^G+1CFIkZr2U-z>WudlsxghTrb9a zNDk&e@umn*Vb;QVmapd~6lx);>6q(R3f;P<=zg9{NoG`XEw9$$OmbCOKW#r+A9KQg zd$!QgthAhLbLC#?da-%(UYGj)J$JtI=><2&Gk#A(Xe_+r0mT#uNrJyoiQ$h}_VPjl zf76}FhoBD&f0zHoiRO-Y^7MS46aE;_3j8dquihIHd7Zqxk2w^#i+*X*mrCZ>(EKS) z(h`=P(cLZ!38IS&w%<)|KMBm9_a*^MjK->_Z zLogPs51Virm^h!P181@SMC#D+_ZObG&HHUx2a-Me9Q+mo8s&_~EWN))IuDGv9|!}A zKBU@Iw^wsy@}|DMH8uKr3pUx?4?jO>UCc_yXQ3rCmZ&wKPG>n!X=ZR|n(Gfmd{Hp{56Tp-=^ng+5Y(rBo3xkAxfm|fR7WJOD6Lx?aSb{sI%3@s@Kz+9(Nvk zpX|948ibO~@PHY2**gx{q%#5&-zLMK_BOvs*)s8Urbl-%BeQe&X@YWVf-yY$4GWR38w@Lr;(YRAP&?RHP zyC)|=8!JN9aG4aj-4XV6+Qz_AG%b~{XBdL@ru)e*Yc&lC0hL`*_y-$?5U=qZ@>2oE zke@aAP}eBge3T*E);QS{VYbqQFiJEzQ=5xU@3JA;knI5zBPx$ALtn8%b{Z$*Hg*)Q zj^vLInPs|n1QYcqq~5nSMCR|A3Aw&KUZ3ub{gw}gbQ4^u5IvS5%jRpOv!>=GQHiHzT1b7 zS&dDUm}hG@DEPRh9aII^_PZ1Dna(0D&I#eOtZzqzGtDxNQ1}IF#6lJ;4x36RX&o=G z@RNQF_(>>kU*yNdd&l~s4rFgUn$_vByFlO$2XSKG64_~!p^*X4iu4Ka6@G%rzVxC0 zH6FoOD2B}CuaML99$J40RXf&ON{VQmVC%Z?f~OjafX2N*c;wAgw*N>fs&~3LR93QM8_E7nNZACr8B*}%_$7&IDZg(zhl&{DiBBRyojzWvBKf5*JC^` zGI*S=*ifkp`(~7Q@Ee5>k?A}aCa5XdmyOe| zlg%x`pcN6k4dx0~A!=aqGz{dK4MWck)&07rn8G@(#FffHEVL3i7;SuEa(~j0O-)ms zr(Wio#MnHCuNUbS-q@>|w;>WRzuHhj%e%P{4U0HM{pNO@yxRTt&g(8LofF4$<-A=8 z@2LZCVsoMDNw7jwNA>7R`RI7*C3|-;_+pdba9UJwuHBvN_N=?7DEKBE_x4OQ@%6=c zB8^&6&=z~hd_8iW?Mopyd&4<@fK=gUbUueX9)5nSmf@cmMlzXAiDBq(bOCoCA26pc zdj%WV7*VrHZZ{(xoi+~YDuEC$`-9pu#|f0-Eu@+_92M^@KBHz^rGC#1iEPrLN;WCj zF8Nx7&ynJ}nPhCAcn`L-V2eHsC7sa3?RSC;7PR{AS0=8?7gGC$`&S+1AMIPF~z#lR8mxx`$J4!e~&OOaAd@)HWu*4!Grzm>73pSn$atFxefji^Ov&*HHy zZt(Hse0HY3l7e?~VyLw@M7)IrYgBB%+);45QsFV$<#}G=aoKkzcTaEa1Il7ZH-jv4 z$|iRQU6FIBzJF}8>kQcHWG+@}F4f~dd+!Y*F8ID^b}LLvxq;X8eKEy2EB~@&#(v$r ze$a0716t^7jo-<-y{^+~>qpP)*;^M#+rn$?+ZGFJR|`t_YsOG43HRtoDb}ulpiCyu zJaV;j^S>HF?fVGFcOvNpw_R@@r&RJjUL|M&MeL09?ouB58@9mvY>%b5UJ&!WqV{hp zlrxI(qUkDnq_6H_Sb4Q3|G(*qrvL(rTkhp!h4T zW_-W|UGA6>>_3ot=i(Te7KCQW(+v5T7m_XK2044o%g0!${>sQ!uf-Fgm9iHea_|2l zt-4{Sgh#xeQl`Y~c>^~!TAeenip8Jg6Bzk@?-y=v>>c5Yq(e6wB@*bYozEiW6`pT? zT;5lLSatS*;akfv5x?=djS`3)99Ih9TIl&i*b` zHbqnTM3+6L<=XLX)$#=l3}U2iRsR#hN`0d03JsIfjnfT}!uQ+1e%q-t9QbC&edr zU*N`+jiCD_-2iCTEej-c`W@ni)MwC!gwy)PI)-)pk=${*h6^R%v+RR~h4EogULyT= zzNhw{z!P%TgM^YeXQj&Qk(2uBD?6GTQv@x%`Q8R@8}~EuQp^@_3Oi(0P;^pmx`lF% z1;^{LpXnO%&2-XP%&Hoh7+b}1xCPg3ztju35nHqt1w?h)X1dNRkZGqZ&evC(RNwrz zPOYi>p;5IK#8=Mw*8F`DU%TDCxz6ou$nk2^AX*1H?g;b-i`q1(knMWHH#IgYTkquL zupvIrD>VD|Bg_L?#e{y(zNV;{UGMr6SYs*!aJ0JPr*BCjLVn*Ufe+UFZ zc92t@bCH~V^&n1U$IRn$*M(VdB1h{!zZKJ-9S=bz?^|=WXt)CDU*#{BEWs zn7s?hj`M!Do_J$$xUwK^%yT?EQDnOe1YQ z>7Uv0(+>4Udlk9On`K;gh`ZUs#sLYc@{t`P(HL>Sdr#KQAmO-$J4tk&@K7%u8&yBd!<{mGbe|P&Zgnv1?A; zLkIaUF#Zs|JMihRIiy5(R;Lins{_2o13>L|UBZ^e`t; z8(-4%B?PAH-;Fu9Oy7!Pnt`N+Q$d}30D8nmxBHh3B;O@Sk4vg=wouB>lEuPh(Ed=mFzsAOz~D>9vv-^{rLuEE^3$p3A8WWt8T{bsT4 zhIA}x6?2GD4yqP#!9UXUU=^?7)*e)rj3?wmaWvR=SWz>G9AhhhGzd=uar-Vkt2@|6 zxI@p>U+KcU3uIX3I@jS8sWV9x93MK9hp#rVe_1f!!5tDN=X>^ECz3jaGJk8)guh6|H;U)7hZH%c+kC4IpO-66k25CkH&ZHwH?}; zY!czt7;DD~MQL45=N!~&EJb~J)K~QK0_K@yEv|@6iM~nq@qS^2X7iZxVY_y~x0qZr zUnC~y)w{f^4FcRjM?>G0;Jf5VxQ!PsjtkaVU25fxVe-jnMU{o$hB0~v?ax~S;0L?> zC59II8{X{>>WskVh4FpII3-k?mDk(>f_-*JxtgK&s0$p6PnrCg7&b{aq}9vcxVF^-G|8frIhkW4Y#}4tb^Sa&niicY~?4(vx6x z^P_;|deiYah(}QQUwR!h>bAid>ek1P&`Gq~l9_{xZWNCxPkPC|b56Y#te_X$j{dlw z)^a*4iA8occMMpLsoSqg=N7~NKEzQ;L+!?DL{j)LRz0NI} zUxg>jE>3*e;oUR$k1wWSc(v90H=iv&(&(fUsIrYNXYqwZhT+)TI6ZX2&5(JRikoV6nz z7xZXgT_uf<>i$`f+tkcZBC0Coe%q|qyu2IPGi<=0R?En@FlI9_8)psZo#KwYbfp|HoT|9 ztHjJOXUMZbqYW+VKSTrEpU!k0+!;v1?j+4;1D10PLy_w0(O4*Ff!Ha{bv-L(88Lw32(;eBVkL`4DP!zFQ)#f`1VHBQzuvvAYIO|-7+nH)V<1s#7Lgil^s)c*Hbp=BQ9nLF(_4C8) z&D>|p7xg;Ua}S^y<7l|D6QO(N-DeS8Q(jWo*tQezoNkkh@QfW1g!;Qjm8syC8X1vO zuntwWuL#1G0gjCCktz8#PXd3SCLL~QPUS+o+2};i%9E#+i{dXZ>34>u)u1|V;dBsW z64ekkQSp&^zGx$;@cUwCmfxeIB)`bRFTrd9eQ3+l782J`$maLyAo%8)isgNq^(FDe zz2GWc-GBd>^gK{!wyL{_d@e_SxSV)!=lXr<=DBXQnl+)-s0jPwndlSmgT!qQwxfFC zJLN|w_Qu*!@H&ER4&Cu&8KjnS+QsRpvI~q{1M>jxNfLYc%e{S|<~+YhYbKiB%qkTGG}h5Pg`kh8+bar8Sqb(#9qIrNhc8pU>nw3XV~pBkFu{0z#)Hmh zmGSy8?Ub7aGo3=_@gvN@X`PV|0xkjY-b}TPjtfD)nuAe9mA8=PuT@`d>!6)FUmf&Z z!B&EHMa86zUw^Ne{I+ghDp!V{3qGBAX}t81TK}1WNioAinZIL(B7D2C^W@Ut45PNg z|G|>6`B6vHalF2%HR<mGb#tYrCFqx~9ipc2&awKli^IQ=PwW~K_8EcZ2k`py&$ zfv{ZG(G1?2n&hNLDU?(mTZ*lpiM-lZ2RFZ&80qCf|H&};k{-W7DYqxJF4k94`lYxx z0Hy3bkdF6R$d*Y?r1=$?#>brKEfhu0*j1ArpL{#cBt^#__<)12(B)%O{#kDwtFKgI z9)Ik!D|x-%-(((NOFmv*(oNA|ZGKQt%QF3T0KmD@MxhIAuiB^eTtOeg8NMKm=J_yM zY&OoXUegtG{;>~>Ql!klmz7!9Puk<;??21dCxw5Ck)Is6{=#%dWz;&}CFl@GlSnpp z?-2%Rp~Y}Eq1#Rgd=4b^JOn*@fFLh)hZyn^%Dg!PDPT%Nzj>T#94zHH{^VXfXQ58^XlQEo) z=emmqrMjtRSqR~X8TNj5i(~sNw%#uLRvid`cXd(VCq00J4{b!fDxAj_zn_L_bIp{# z7Z;Ngi8#mjx|v-vzMC^L`a`xyKGpXPAOLr*FV6!uQv6C>6li&v3gS^mOf%2iaxfeQ*tt>EPAT#hT zJ$vp4MRv~VXo#4f?V%}?wY6qNWfvKJPDip_SS+ujdfkgy05|E{@`A|vlScKzd- z9rkW9Pw+xi_fO$%z+5E7-gF=b%w1*m>iyw@7wS;VaOB~+Ff7R=TA%ODg|K`Vw!e00 zdg$9)e|!6=$g45sZ~~7}(blA~QNpm38%#Evo7G$0xVOZM%EnLG;n<4v94r;2oouSx zJ3N+oqESSZcr=%XPPSKC=Jj_Sf9h)(Ue}Kfi^)z8IL>xA{eMxPCO9`4$%mRGiv}#~ z-6kUp0g9fPt}tnkSA6#%!RpwFiyn9mjISRBqv?u7Ce7YVM8`8Ny5m6$z(H=EEY~HU zvD9VxPR!n7pNHTq-&>zPQ!lCqa+HjRmT-m6_oWaE&uJJzy<6dsw}v+(bGO`^e07Y= z!b(KPI|2{lyW}wK9d@Ja@h<$HZySYHt;WWhDqmr`J@~p9&WnXdS_0{uiiPtRc%4?? zN*-~rF!#quz$XoFXob5Jl0Il@>x~bI^=5IQ7a2c+l-Rh!w5reQX}yx>&Y8%p2tp)1 zFPp*6q=+_V{w2dsvzuH0s{s-3BRtd1heZB+bLv`ZoBHX z`XjwvQitf5u?9K+3<=)LR+mKL<@hsW3~kl>TaH2z1nuM#fUL9jD{^5YKymYH`#>@s zAhd6x(}k`2aofuvTn$_WqmoA9aRtM8m;zOAx*v- z!Zw=Op^Tik9^WHDzFeQGhuN@?<7Ng&dBMLTLS;`mtIo^c`zRm{yIP<|b3qW?;#6vm% zAZld(`u1sShgC`W1CFc}>=1IBF*W_ozW%MPIvM4qRKECMmp`>|eC1=9lpx|FiSUoO z47gK^(8@BFELz_;HP_u$z*sv8PWIn#`(DsIBKIyo;z`cUl_Q(IZY7&AFg+nw+KKHz zgY1cq2F4Wo3TG&R2b0MtOIW6T47lG_D_r`tNvh`(3s=+?GcLkh74__t6-$yz-tI*a z)Qk1xEkHVC4YhPKCR8+;S{)rwP+_@n!h+t3r8X=pMOjl$uur<7r z*UO=*#;wLG=_jio4DDDQM>6#BqQ9ZUejoI7bjAsj)Qn@=E=-sPzR0590B>5Dn8$X` zA>w?WjeIl7;sleRnnrPs^n16GnU=d&RoNhxZ}>;D|9wQcg8hf5ZZUleEp*Xg16Ya6&Z#l>*?!mVGd2hE{{CNz>9j zYJM3PFjX}nQX39e)yfas+$~cmWcvh{W#AP&BsU&>s zPG)+4RPj&J-_okC1=vG+EG#>fiSH~0y)Rg&UaDHc&4}Nf%vOkmz8RY=dh7H;8(z?a z5y5DgWW_76AxmjGJ~fQRi|jf9%V83&z|hG!0f+}J`$Y{i1w{fAd^Z-Q3`m1gR`&S~ z-xtc8Q7r+E^+x18JI`dk34n&D6DK&(*ALBQ^QVz5g2AG-+y4J4>Z=2y`kuGxZUmN) zRfMHuK}t%I5LhV*35lhoB&E9>>7`q`m5>fu5Co;9y9A_RY2J%|zQ6Y`mV0;4oqNvA zoO5QLd5(4z@ijeT>|Ri~HBcB$7zd_?@BG=G+UqMDHe%6hGPG#O{m}D8h54+Xh@+$x zKV8~pZaOQ8Qwe|<_px$nB^q6xo?GY41NYw>P{z?T@t(SIG>tr#_P4vczg(~ zP)}alo~VCyW?A1zI^} zzu14yLZzlh`IJLPXM@k)$by7{t#pfwDSKzZFfkOo3v)RY4H`aIJbV@uD3e2MPp&#j zS~&E5y@kA2jenA;GYIPZYD7RH`4tr^s-)d`r?b_O5i&hwGYGR^6R{SngO&*>FDcB4 zU?vJ;z50P!#%C zuBR=ROd9o6htVLZ=u%+fFhR&@MDwj19!X?r6H)W(Pc$lcBJKEu7u~lc)tiG8HQS_+vNyh->cFL12H`QW!@Du|H(p5ZSZjIeetP}Ywn1?98|Q6~^KTu*szz>@84%l$e)c|PVFqo%L*!NhW^?$3y)4B;yVcWcN4#&pN$Zg<#jwIeo5( zBE^M}H`@JV@U#xp5j~`M_n8LbwN3`>sV4H}K`hW}uwE8w2o@t)Y1z6?|IE<}?I`Ph zrt7O{ATj+tQdjVUklY;G7x>h8GU5NpO7O!*c6&mmShLBXemvpXJYXI^`&Ok%*y2mI zRq+)+)!Eu2 z&aD?gcv297GawCov>1r_c6{q$me=9Ci7F{lljK*b-+-7L9!<6hzuS`owDUS>J8|(| z?Vc>`Oo5l#2sV|`*HO+9_QM|J#%My~Mc+Hv%Sp_q7A-WnR}7QfH9@Q&lE(FOcARuibSG2m%&rmf-@WX6QEaUNLhzkP?p|Hv4$L5u0ge z5*2Z%pH>CqD)6l})Iu}$2RJa6U9u$mVFPWoAj+txY=NoJ_i)_a#9mHsX#a~RAAHAd1I`d?bjPP>^QyU_*fpg{?xtFab3IQc61F@ zH|_$DYV)T5Q954Ha`+AHbjLE*!7YKGSH_eB#R8<_B&u5Y0a4x++AZK<+k=4xQ$`eW zFzAVclq!!OKe*f5{1iG!R86DqK-%u!fs`bttK}mpk$`fBRxL?{Yd~QlBZ3{F2xbjn zxw`Velhs`wwC#5=CnAst1pgd=iCPIj<>Y!T3yQMMg*Qz#!^p^0_*J8hk4O9ZL@LlK z?_N9HjC1;3#ALTmvNmaBx7h-J6lSINJ0!wKp0L#3f zJYxfY^QJa0gb-6skI+#0H#J_Gt?HGy(o+d{7Cfb{=|Vu8-EYoym?1p%^tohAwf#&` z2k5YrR3y~Ig{I>KSgSRrMl@F(+MdybUWw{CI4%3M$RjwSn_I6SdbyO?!v?UPjI`4S zHqpqVc)xAiwHsoXddbsCTT+TI7}nkl+E}1S=p6nR^>z%A&3#XddH7(&rZE+2K`Q2F z{z8t|`4p(iksT#1lgCebS)ytzlrP`jd5wzgE~q9IzT0Tn*H!RFUBYhqojW8ZE;U+Y z`9wRPH_8Wl23>{D-0NhypU_u|Zchd2uF_t+5i$~lj3_Jm{mPD3;5f~VHBtBDb-=6h zs8u&4N?1S5MilzB^mTG!i~Llwee|&pCmC?Z*?gX-s=A*q(CS*U@=M8?;C<*mMVe)# z2tjMM6oU)=UX2GJhi#xE9`8%+;%B^LvJ(i$f_XU#i@LRgQR>95taF735Q@q1a)i7- z;F{DZ9C@T@q~-2|K8@}6ryD4)%#M9#NDhlH(|xDtO$ETQappU@SXy?LmPgp7m=iYs`%i#cb?;fNehh zwrt=A06ZQ@D=S`)l02Gh?h~^a7UpSBd8SleQzo9s-JDp}Mu*IKX7b_%U}rMVd=v2T z2WTI^B{K9DjHxwC!8uP)^dkG&12-xlEo==RXk$WfWhpb@Frro%(~NBjG7(EA9h^+s zP1ykoIOCLd0w{b$QYLnNJQy!>r)`9LPu|Iq<>^4hSo2qswg<6LTT|VDP(D5$I^HUrmsrJC?qd!9s^z=xu>VlEw*)s3Yal%i5%k;@Eb!v zv>=gB-{S!b7VVJfUykY|;2+!JRuB{O-74likt0?dH$pxklz%lH&1oh=J0$!~;+PO-8+v{d=o#4o4zq59l`~^_pr#web{`Xjr zf+MdCBGG+PZl$;G?&8G>J?0f1Mz8^Z1$;<%j(Ij{X2`o(p5RmVqLOwvVG^rl75TXt zZtgVK7Rq9^s}_sx6`bn77uy^@h)-aWx8em_Y-pl0G1-&hsNa)&SLpL`pmW2c(f_sy zFaBP0AjQY-*8vVTZiHu|erhwn5YE8nCu^9n&+uZ~NN{HX2nbXmpeA?{9$r?iACnE5 z$R1wr-sH%~s-yx}EA)JW!$-(U_muw%M~h_&L<}zq+Ho*sR^7{toh! z_-6M(zGyje;wdV@$2!K-F=}6U=UdVSpU)NEZj%MqZn#Ad+4+X+-RBi#Y>wlaXpm$} z`CVG)aV`4F+B!d&FQ@G`5%@Kcva_PUXI^IrFqO@DMc z6u*G0IZC+SxAF9;2%L114hY~l1Vlog;bPn`esc2ltDlpj)R`oVjg9rft?`2%MsVpV z9#fVj(eeAU>&H2@NdC(A=dD^;5=F9#-_%0@m~Qi4Oy27n**<@*Fr#@^wn8E1;;hsZ9aihL{=t@G<8e0<%DYPU;Ve+^u+D>(^Tb4-go{`|9x2N;`}~>a*Y+UdnjRelnXa;z zUvsPByDv?Ty$tutAN1qgPN+%=zT#Fp0 z!Qy*9zJ{U$q_O535>(dTTaq@M>go+gpM2=L9EP>1nPFiZW6a>xvIrC!XY`%s4d-c9 zG{G{?s2XPZNv5U<$?@8q2Dn#%+E`Aj@ie8)KO1u&fOvD5mdgsaj_x}HT&;75tEW-@ ziIlPM3{zQqosEq>>}U0JQZcSm3n{OzEf2fC^X5k-2z1i$;JUKznFTO_AI&gwEG{?s>fPB^9?z!4OGXDgsb+L5etAoWZ|yBZxn zoIPYov{&Df>UQtv#TO$nXY>keCjRN}B2P^^)+U#zb5zX~Q>keq zO9dq6!lqdY>*~>`k`}2;Hwo*yG}EpWT_gu4t6&tI#69R-eS{dk~T) zN>Zk5e&LwaqpO!7%KBkwnI1jgPkSb)-kt$?;Yt?$lbL)*;>DXrUdk&`w zeh#Jy21W8*^fIDZ$o91=+;xb6-3JswAKjp0xON)mucn>!5IgyPH)KWTr3qy_$x4d) zy_JG1A1tY=bX)JV*qaVs3h&2WtPxALkTufT%sc`UjJ=eYrH~5@` z$ehve4SON_I=;H&uKNv}%9*PGoNnQ7sDCQh zA@Y(1Y4qq%Y_shgI?P6$H<}mS^>XxmV`xewPOa#lPb@$&I$M^Hhj@5+MARc0_;R-R z^|4#q8T_8vH?D{LgSK}Pz@tg|>JF3#G374Rw1kykUc3*WG+Z3TJFcQsZ??*Oo>sR3XA~}kxRL%B zJlWACcV#ys^^IfM=&ys_#>4>6^`^{@Q0PcUonPVc?;}P5b8-1Pa}&R$tqmE5nt1c? zy?iFUPIq_A&3QQqcJ=NANjoP39W?k0&W3vSX|Z0QTQu%?Qk_3`Giw^ytGH$`BJL9T zwu>eS;eUCy)p(44>Ho(kadcn}1b&9d>Le_Uh; zMuU00_ccd*hq=|fLmyB>7*(i~z@6dH%WOX66&}gUNLsEc#k%ZArSI79c6Ui&2!UnO zDWx|b!1&>x7ZdH!JYB4#>g_xL=UoF~Cq_yH~|^mzD>c9XDKN&>_aVws)R6 z7u29{^aKON5u1Ds zae&Vy3mNHn#B(_@v#0O2A(pbB2R{^b>->`r0{IV%jWCiKkj{qTTQv2pG=(=_az*2o z%ft%r2M)B=IiOahQu9H)2iZVT5gsM^QZJre(Dy$Z`$^a~!uIGlg`90d6NGjxVGAwxQX)br}bmw$>=ws2$ zfUvpZG2(|Tfwcpwuz3(5|9j)JXQcv?q4R|PjFap_yzy9rcvi3UAl))#YxtC2zEd0r zvel@}L3B^^E^XwS!QBi9d?%j?sOVfdy}nfZP>cQ6+VztGd+1&to-2hEIWfPV#3wr` z|Eao##aSn0KG7$pX{rmS;rqioQ+7a73Jdn-A`0X#beG0;%f;EnZ>P@XYV%*F4mhEU z-DqDm30Q5%qDD!M6vujw)nFs+%d-+a_yiQ+DJjbO@%m{P zk(7$2Z{^yhvMiRhnf(-rmiPnZ5DPlM-?wG(*`(E|x)Gp+M6I9BwAafYrPa{D z;cDp}EC`F$#e|`MIf;vaO1EdbDt0+Zd;XE&dvpj+wRxdTfr(n_^YZd@yBv)8YtCl?G$*viwbTxP5`Yi|XNlpiQw zKlGZxn~(IZSJFZBp$X3@rtxwZCu}J^%&d(TH}am1-MyoE_LXZDi&{m5x%OSA%zQ z)eP}vI6+=_plPbKxg*z5N`4<1hZZbQv~6v`-my*er?e8x`9Z_RLXX0_QMiwR5eGye zgdPmf2)bJGUgT;ie8qz)?x)kG?-$-;?}0YFB=a10wLps~#^PP#&YvQQ>K=W5mOar5 zG1uwizJI|Al7DP`FYkGV?~O39_IhYL~J zva*cG1C;&pqpPD>vfbDjGYrR^%p9l+>CThTlw<&|`!R$?I^5642e% z$;x}Gki*gIkQc{oI@B|GdNy#&r}VrTL!{xJd4FX<8GLc~1Ld%(YWs}}EX(E~`?iBM zTR)~P1F2~p1~0@2ci`Q?!#ep7)Zb9Lo^K>b_j7} z+wg($*F?TKrKw{DSAM42z$Vus<^JQZ&@3L)OkR|Ok!*%tEBJ|PyLxSi0)P;%~<~00$x_SgEMBkdWzrTryOO6eb{L3MK*)fJ5b3BUm`z!;oZpJn|!OI zr4YMTpqniCeFgPoskvyyD<9L)9CEse3uI&=Ea%%=0m>pi&^mq{4n3(fg7IFXx!x!U$_Q;|Ge%b z?`G)(?OJ+yKI3nab=eQw1v+H?9S}MYVMyM-=}kN)L$3P~J}kQ}-S>JMWYT-wH93Y) zt{Z$)JJ7bC>DsGWzZ0vzeuqbZNAM$5E0oK>D>YG|Cy>mV`I0KP1mpXj=OZPT%@#dj zy_!{VcDjeC!HOAwGtg~T5~w}nJ;0{mYwW4?dFG`k%R@Uw zi$M)l6FmkPMKyc8o2u{g(bVHr}J?anGh|kIuI^L67^Erz||-I>Z{>Ow7#8<*Q4ftOu(JCJKsaDqiU` zcYBK-rdYJXH>VQi&%9pH#`X`*3>zDA^mPmA zL4S@M?H$Q@5XP=KqkOr@jJF{=$!$SbGZ^L=01-*g+Y2JtX6@q~AqbYL&f?<-?7y0j zJ27sokhTr2Mb{|qQFYJ9)HZ3;#MQ~MCdtM-?J-+=Ll!eH6ffe6vXzUByQP{|Vs02j zR0&ad032dKSusg>nBLCoX}eGR;yP*9p9FOC(5S_ZV0^6B>_07L3NGJTNIvnwWg-QI1=xP9YvsDjY zc;Z*vU_4k{ik>pFuo8!{1D5*4Dn*CBN1oH|4aa*|PVXLi^o7`D#aWI>s7rv4ed#t6 z=}-qf)!C|kE{~&GI=Hc2CGYg>jiFKv4SH=r^DZ6o>>$5H-AuB!FzIen{Qjd+t^4{q zn|)O&WXCH?foVg|9fnnIjmafN2?{*WVUKl~1;>Q@Q4)ZYS6rsR=&m!E@wFhQoZsh} zrY}f3iNU>-x2=KU?Z4$HJ?{w-QPOcpe4{r|Ga`dLd8W>Y^a;^9jB_L-`6|g`Cdu1w z^RwDm2sJ;Gd3+pFO1m%61Ell7>Ll4Vc6-=SoCBvTQaum+RCf_h_VhDwd` zdw8+N%gE;7IxZrwfSQ{2^bT$H(R0o`Y6Mlc0H2RkG*r#T$|%F!>2mdT$1_i|>Rib8TmOeW8nR-j^1siPQZIIams%{5|U~gx$bJUq+B{r!@sm z3~v4Nd1~ulDX4oFK9UWQJ1Fm~c=AnvO(L@mN1#i5?WhB9`LTvH(DI>SPY}m|HGU0* zk8Xu+oG0SRwi0xJ?UA_iWHaBuli`wX9I{^uk+4 z(i4F6sV|#4n2atlNrC}pGFSwc0_3^yY}0J^(gRwbvN+eIqlJK6IZ zh#TQ8CBYUgqXe!85Ln6vY#!={4rFKFcX^XdFf4a!SqWUoSkNhfH06anw8X;@ld)DF z27sONK|dzu2?D%3%3MsQtM)jp6pEyS!64CEvOm*;rr+t8c#=ghD5M1>q!DD*7Opiu{CLLvacJnwlq9w7Aa|j2HE+AiFj}wH)I8i52Wj$ z+^RN_si}JHz!Qk;8xkMY^Mup=;`eazYlq5v7h&>%>=qP!>qawBPJQ2Hu^3NrKJ)~> zQkva^HOyQt2$7u%`^mg0RtwtL*PfmG&rMm>`Z^}znWP2iRYv^G5tB<~DQ`{*PqyvU zG<*0gE%h3YM+`p@dpmol16s1Wt~^+N9PYMb*>M||Rx7!$Gba_ou8;*R3gSOp$mhJ4p;?ylZ%n?fFD~)WYOEopBzO1}+Dtnct{iV!}6( zcZ31g9n>)9pwA$^PiCj>Q(K(N3?r$Y)(XLQpefh zY;<_cqe4j;( z*8N@O9o#Nc*#Y>Ovy^qSa zk!FH-`jb2!WH~zRSo-oaz|u#a1kh3jg=7>*ZzlJSmHhG3Xzf8jlGtBOL*4A@miRjH zvBT36?sy6d4PGqSn@`m`UY+W(w04LrHY{))T<)#Coz{2{$ij4?$*bv4cB}HxeDJM` zoScBBEW?MmpHZ{|(VC2=d&(fB}e8c>@?m>X`dteY6$@ zr1#qt2!8Ac>X$%`@~O>&K_D^xbe)3<`$XkupvV!Z3YGA5oNR6ofry#X=6GTKGGlu6 zQDY^|Is#q(m=+kuJ95-?OkDUizBSa-g?VrUj8$)9KI5vED~$n2c7CW@Mm<)Q{c`Th z5m4MDAs>6wSE}i``SX!KouG1t9r~2t*EB)aqDTX!&sK(qow%3mx?{^Hzr@fB@9!E* zz4_ubfPg+?S2yLTzAU)@4TOyFU!cv`-3mf8as%UFL@fv;A;sx4>XPIc!8@|+#p zyEq>YN0j;jjuU@?Bw%~L@^-uu??O(#im!}L9RiP`$GE6Ezx~EIkE#cgHR)^iBYrlU!UugP|tP;wC zc=DN^tW-65ikY?QqhivWMoDc5ogmlN*c2=fC$dD_j`)#0PobMboNLCmo)|M*`<7h(MlU*= zo^tZbXCA$V!`u z+Tnw~U9!9WgA|_h#2p*itm?I^sXH^;nZ)$EHI8PYS{2`nkJcH4?0CA8xrwK03%RDI zPLAH=zA6%8eU$%X-&5oBtOkoD^t6m^bLE_*(=?)2ezWGwG$Wpj-D?5m+{-%@^CQ7$4=3q1h3vf$giT^aCYo59Gx zHTrxe>t{ZpTCpnU>7TN$5aJ4*nmj&EZSy)8TUsGIWs}j5ih#6{<>f6^wT@;I)V!4p z?-j47EXwRC{)q$-*&`1}$01_PP&9US)#4u{92&1xk~p@DH7qeLEyKr3Oc*q+CkAt! ze-{GQoGKlh>^Lleo4<^2G30z9*r~SkQbk2%ts(dM(l^dWe@bF77iMn3=eO-KV8i$o zq@Mkmz2NDdU1tb!c)1~|^+d6F}7)Iv$9t2qL2R`4+=DmX06hC|0~))n!nbB;CO%HT z3;EtCpYhpO=0f~wz0zhp0FgGi?~0m@?xN2A>_;Z69Yh?zog+Rv+uRve*12h zaj`bA6t8sb^S>L}pDZ!kuan#POEvoO!_`S4)^?`EljQz4 zW7NCx4?v6LngMU{$YaL<%}H9xilB-_S14t=o5wtU0C@MG0qqAX-mkI%m+@q`rd;c( ztA74Jt zm;J9XHZ51!azl`k*eQ+Y*dVGtTyfuQq#P_ z0(%#r{u@XpInj-bA45N~A8-zwy9&GlUu*+#86t*a6!*W8X6kL+{qke@$A;ECp?V1} zNE{TyIPM8BR^J_0K>j>PDHkQH9COLlb|=o=2?k!(Uhbx|@*);n=oA#kyTHtRH#|LP zFVljMF_IKX9(<=KdoB4c5B_UEg6g6>^wEY-7x{H>IK5ra^UyKI|AtP6R_X@ij!MjY zV=r_f8&Ul7Kg|eZnkWw+yyU<;N}nw#?EIEw1^%zcm@*#8Goj`QzFk3t=bF3e?TR!1 z_ZwA!HUJZs>5`F9w*>cWLuy>>e@|h-AB=~D_+~RKWldR zdE~SAMafqG->AUT2zkP?JfjOzFGQVkWC=fm|1%bBSS;hu_w8}!K6UmF6M3s#?xr}v zSn~WffAL=IHsvgjUBYLCKC}Gq`%hP=U+YPt7{#blT{GkJgjoLT64=$A@A|?Bfz418+^I@D*b=0%1}_|Kc@|$ zFf~sO_b6msOtn}%of$vEcL-%~j`fbA2_X+!#JgjK?SDs#n5mt^Rd z!LV?dFL?3&;^hC|Fgi3P{yR>0zJ>i*eJfBog@?~9V!HUBTH%3v0=qze`iq{t4+y6m z*ZQ{(losK8Z{;O!!G&0G-p0w7FZ=#K3BRgHeI2foyM$fidz=OdFKEnA0Wtt>qnE!X zHyox{im4Tz#|y+MA^vZ@r(b8GawXwZF56BkLiVmr$5!Xx`z#+3Dui5LuIx3LdA}IoX^%2k6}j97yaK=*`< literal 0 HcmV?d00001 diff --git a/public/images/C-CMS_G.png b/public/images/C-CMS_G.png new file mode 100644 index 0000000000000000000000000000000000000000..368234923535532e5830d82a532ff98fcde06306 GIT binary patch literal 38581 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 QFG}d3Gm-Gv(f8v20Usw>`~Uy| literal 0 HcmV?d00001 diff --git a/public/js/plugins/drive-explorer.js b/public/js/plugins/drive-explorer.js index 29b6d35e..b362f2ec 100644 --- a/public/js/plugins/drive-explorer.js +++ b/public/js/plugins/drive-explorer.js @@ -1,8 +1,9 @@ -var folderHistory = []; +var folderHistory = false; var path = ''; var currentFolder = ''; var folderGoBack = []; - +var permissionModalHtml = null; +var progressBar = 0; function init(folder) { loadFolder(folder); @@ -10,18 +11,32 @@ function init(folder) } function loadHistory() { + updateProgressBar(progressBar+5); + let btnBack = $('#backbtn'); + btnBack.prop('disabled','true'); $.ajax({ type: 'GET', url: '/api/drive/patharray?api_token=' + api_token, success: function (rawpath) { + updateProgressBar(progressBar+30); var path = JSON.parse(rawpath); Object.keys(path).forEach(function (item) { var dir = path[item].dirname.split('/'); folderGoBack[path[item].basename] = dir[dir.length - 1]; }); + folderHistory = true; + updateProgressBar(progressBar+10); + if(!currentFolder == '' || !currentFolder == 'root') + { + btnBack.removeAttr('disabled'); + } + updateProgressBar(progressBar+5); }, error: function () { - showNotification('error', 'Impossible de charger la hiérachie des dossiers', 'top', 'center') + if (folderHistory) + { + showNotification('error', 'Impossible de charger la hiérachie des dossiers', 'top', 'center') + } } }); } @@ -30,26 +45,35 @@ function loadFolder(folder) { if (folder != undefined) { showLoader(); + updateProgressBar(progressBar+5); $.ajax({ type: 'GET', url: '/api/drive/folders/'+folder+'?api_token=' + api_token, success: function (template) { // Load Explorer Content + updateProgressBar(progressBar+30); $(".drive-explorer").html(template); currentFolder = folder; window.history.pushState("object or string", "Page Title", "/admin/drive/"+folder); + updateProgressBar(progressBar+5); hideLoader(); $('.currentDir').attr('value',folder); - if(currentFolder == '' || currentFolder == 'root') + if (folderHistory) { - $('#backbtn').prop('disabled','true'); - } - else - { - $('#backbtn').removeAttr('disabled'); + if((currentFolder == '' || currentFolder == 'root')) + { + $('#backbtn').prop('disabled','true'); + } + else + { + console.log('wtf'); + console.log(folderGoBack); + $('#backbtn').removeAttr('disabled'); + } } + updateProgressBar(progressBar+10); }, error: function () { showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center') @@ -123,3 +147,38 @@ function deleteFolder(folder) function refreshFolder() { loadFolder(currentFolder); } + +function editPermission(folder,subject,id) +{ + $('#permissionModal').on('hidden.bs.modal', function (e) { + $('#permissionModalHtml').html(permissionModalHtml); + }); + + $.ajax({ + type: 'GET', + url: '/api/drive/'+folder+'/permission/'+subject+'/'+id+'?api_token=' + api_token, + success: function (modal) { + permissionModalHtml = $('#permissionModalHtml').html(); + $('#permissionModalHtml').html(modal); + $('#permissionModal').modal('show'); + }, + error: function () { + showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center') + } + }); +} + +function updateProgressBar(value) +{ + progressBar = value; + let bar = $('#progress-bar'); + bar.css('width',value+"%"); + if (progressBar >= 100) + { + $('.progress').fadeOut(1500); + } + else + { + $('.progress').fadeIn(650); + } +} diff --git a/resources/custom.css b/resources/custom.css index 9a08cf67..ac524cb8 100644 --- a/resources/custom.css +++ b/resources/custom.css @@ -57,6 +57,10 @@ cursor: pointer; } +.no-cursor { + cursor: default; +} + .word-wrap { white-space: normal; word-break: break-word; @@ -140,7 +144,7 @@ top: 36px; left: 36px; width: 0; - height: 0; + height: 0;progress-bar opacity: 1; } 100% { @@ -1816,3 +1820,16 @@ td{ h2 { text-transform: capitalize !important; } + +.breadcrumb { + margin: auto; + background-color: transparent; +} + +.navbar-wrapper { + max-width: 75%; +} +.progress-bar-top { + margin-bottom: -4px; + border-radius: 6px 6px 0px 0px; +} \ No newline at end of file diff --git a/resources/views/admin/configs/perso.blade.php b/resources/views/admin/configs/perso.blade.php index 2484d716..e8cc80d1 100644 --- a/resources/views/admin/configs/perso.blade.php +++ b/resources/views/admin/configs/perso.blade.php @@ -4,7 +4,7 @@
-

Configuration Générale

+

Apparence

@@ -27,27 +27,6 @@
@endsection -@section('breadcrumb') - -@endsection - @section('custom_scripts') + + +@endsection diff --git a/resources/views/admin/files/Google Drive/permission/edit.blade.php b/resources/views/admin/files/Google Drive/permission/edit.blade.php new file mode 100644 index 00000000..7f5ea4a3 --- /dev/null +++ b/resources/views/admin/files/Google Drive/permission/edit.blade.php @@ -0,0 +1,70 @@ + + + @csrf + @method('patch') + + + \ No newline at end of file diff --git a/resources/views/admin/ocom/index.blade.php b/resources/views/admin/ocom/index.blade.php index 5af37ff6..70ec4e88 100644 --- a/resources/views/admin/ocom/index.blade.php +++ b/resources/views/admin/ocom/index.blade.php @@ -60,7 +60,7 @@ {{$ocom->objectif_rendement}} {{$ocom->objectif_competence}} - + edit
- Modifier + Modifier
diff --git a/resources/views/admin/schedule/event/add.blade.php b/resources/views/admin/schedule/event/add.blade.php index a96e71de..89b7f805 100644 --- a/resources/views/admin/schedule/event/add.blade.php +++ b/resources/views/admin/schedule/event/add.blade.php @@ -65,10 +65,10 @@
- Remove + Remove - Select file - Change + Select file + Change diff --git a/resources/views/admin/update.blade.php b/resources/views/admin/update.blade.php index 97235b41..5b315dcc 100644 --- a/resources/views/admin/update.blade.php +++ b/resources/views/admin/update.blade.php @@ -2,6 +2,109 @@ @section('content')
+
+
+
+
+
+

3.2.5

+

2019-10-19

+
+
+ STABLE +
+
+
+
+
+
+

+ Nouveauté +

    +
  • +
    +
    + +
    +
    + Ajout d'un breadcrumb +
    +
    +
  • +
  • +
    +
    + +
    +
    + Ajout de la base de donnée des cours +
    +
    +
  • +
  • +
    +
    + +
    +
    + Mise à jour des pages d'erreurs +
    +
    +
  • +
  • +
    +
    + +
    +
    + Mise à jour de l'horaire vers la version 3 +
    +
    +
  • +
  • +
    +
    + +
    +
    + Mise à jour du système de fichier vers Google Drive +
    +
    +
  • +
  • +
    +
    + +
    +
    + Mise à jour du système de permission +
    +
    +
  • +
+

+
+
+

+ Bug +

    +
  • +
    +
    + +
    +
    + Correction de multiples bugs +
    +
    +
  • +
+

+
+
+
+
+
diff --git a/resources/views/errors/401.blade.php b/resources/views/errors/401.blade.php index c6aa79dc..bdd6555f 100644 --- a/resources/views/errors/401.blade.php +++ b/resources/views/errors/401.blade.php @@ -1,90 +1,9 @@ - - - - +@extends('errors.layout') - Error - - - - - - - - -
-
-
-

401

-
-
- -
-
-
- Oups ... Vous n'avez pas l'autorisation de venir ici {{ $exception->getMessage() }}
-
-
- - - \ No newline at end of file +@section('title', __('Non autorisé')) +@section('code') + 401 +@endsection +@section('message', 'Nous sommes désolé, vous n\'avez pas l\'autorisation d\'être ici.') +@section('error',$exception->getMessage()) +@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/401') diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php new file mode 100644 index 00000000..5f47ae61 --- /dev/null +++ b/resources/views/errors/403.blade.php @@ -0,0 +1,9 @@ +@extends('errors.layout') + +@section('title', __('Accès refusé')) +@section('code') +403 +@endsection +@section('message', 'Nous sommes désolé, le serveur a compris la requête, mais refuse de l\'exécuter.') +@section('error',$exception->getMessage()) +@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/403') diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php index 15a38e3a..8881ccc8 100644 --- a/resources/views/errors/404.blade.php +++ b/resources/views/errors/404.blade.php @@ -1,90 +1,9 @@ - - - - +@extends('errors.layout') - Error - - - - - - - - -
-
-
-

404

-
-
- -
-
-
- Oups ... Il n'y a malheureusement rien là {{ $exception->getMessage() }}
-
-
- - - \ No newline at end of file +@section('title', __('Page introuvable')) +@section('code') + 404 +@endsection +@section('message', 'Nous sommes désolé, la page demandée ne semble pas exister.') +@section('error',$exception->getMessage()) +@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/404') diff --git a/resources/views/errors/419.blade.php b/resources/views/errors/419.blade.php new file mode 100644 index 00000000..b7f2983a --- /dev/null +++ b/resources/views/errors/419.blade.php @@ -0,0 +1,9 @@ +@extends('errors.layout') + +@section('title', __('Page expiré')) +@section('code') + 419 +@endsection +@section('message', 'Nous sommes désolé, la page a expiré.') +@section('error',$exception->getMessage()) +@section('url','') diff --git a/resources/views/errors/429.blade.php b/resources/views/errors/429.blade.php new file mode 100644 index 00000000..68db5362 --- /dev/null +++ b/resources/views/errors/429.blade.php @@ -0,0 +1,9 @@ +@extends('errors.layout') + +@section('title', __('Trop de requêtes')) +@section('code') + 429 +@endsection +@section('message', 'Nous sommes désolé, mais le client a émis trop de requêtes. ') +@section('error',$exception->getMessage()) +@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/429') diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php index 257a17f6..f90bae92 100644 --- a/resources/views/errors/500.blade.php +++ b/resources/views/errors/500.blade.php @@ -1,90 +1,10 @@ - - - - +@extends('errors.layout') - Error +@section('title', __('Erreur interne')) +@section('code') + 500 +@endsection +@section('message', 'Nous sommes désolé, le serveur a rencontré une exception.') +@section('error',$exception->getMessage()) +@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/500') - - - - - - - -
-
-
-

500

-
-
- -
-
-
- Oups ... Le serveur n'aime pas ça, svp laisser lui le temps de soufler {{ $exception->getMessage() }}
-
-
- - - \ No newline at end of file diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php new file mode 100644 index 00000000..541ea11e --- /dev/null +++ b/resources/views/errors/503.blade.php @@ -0,0 +1,9 @@ +@extends('errors.layout') + +@section('title', __('Service indisponible')) +@section('code') + 503 +@endsection +@section('message', 'Nous sommes désolé, mais le service est temporairement indisponible ou en maintenance.') +@section('error',$exception->getMessage()) +@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/503') \ No newline at end of file diff --git a/resources/views/errors/layout.blade.php b/resources/views/errors/layout.blade.php new file mode 100644 index 00000000..39ff71a7 --- /dev/null +++ b/resources/views/errors/layout.blade.php @@ -0,0 +1,194 @@ + + + + + + + + + + @yield('title') - C-CMS + + + + + + + + + + + + + + + + + + +
+ + {{ Breadcrumbs::render() }} +
+
+

Oops! @yield('title')

+

@yield('code')

+ + + +
+

@yield('message')

+

@yield('error')

+
+
+ + + + diff --git a/resources/views/layouts/admin/header.blade.php b/resources/views/layouts/admin/header.blade.php index aee8ac07..0b4bb47b 100644 --- a/resources/views/layouts/admin/header.blade.php +++ b/resources/views/layouts/admin/header.blade.php @@ -13,7 +13,7 @@ foreach (Auth::user()->unreadNotifications as $notification) { view_list
- @yield('breadcrumb') + {{ Breadcrumbs::render() }}