diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cea7250 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Dario Weinberger & Raphael Payet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b00592 --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +
+ +

+ +

+ +

+ + Website + + Website + + + + +

+ +
+ +
+ +Wikipedia article comparison tool. This tool allows you to compare the data contained in the infoboxes as well as statistics of 2 different wikipedia articles. + + +## Demo + + + + +
+ + +

Access online demo : [radar.dariow.fr](https://radar.dariow.fr)

+ +
+ + +## Dependencies + + +We use docker containers, so it will be necessary to have Docker and Docker compose. + +Installation Guides: +- [docker](https://docs.docker.com/) +- [docker-compose](https://docs.docker.com/compose/install/) + +## Install +Configure logins and passwords in the ".env" located in the root of the project (PLEASE USE STRONG PASSWORDS): + +```yml +# Root password +DATABASE_ROOT_PASSWORD=changeme # NEED TO CHANGE ! + +# User to use +DATABASE_USER=radar + +# User password +DATABASE_PASSWORD=changeme # NEED TO CHANGE ! + +# Database name +DATABASE=rappaurio + +``` + +And do the same for the ".env" inside the "app-rappaurio" folder : + +```yml +# Root password +DATABASE_ROOT_PASSWORD=changeme # NEED TO CHANGE ! + +# MariaDB hostname +DATABASE_HOST=db + +# User to use +DATABASE_USER=radar + +# User password +DATABASE_PASSWORD=changeme # NEED TO CHANGE ! + +# Database name +DATABASE=rappaurio + +# Token private Key +JWT_SECRET=hsdgbniojksdgoijosidgjoisdg # NEED TO CHANGE ! + +JWT_EXPIRES_IN=86400000 +JWT_COOKIE_EXPIRES_IN=86400000 +``` + +Building images using docker-compose.yml: + +```shell +docker-compose build +``` +Launching containers using the docker-compose.yml file: + +```shell +docker-compose up -d + +``` + +The site is now available locally on https://localhost:8888 + +Or at the ip address of your machine [https://\:8888]() diff --git a/app-rappaurio/.env b/app-rappaurio/.env new file mode 100644 index 0000000..4132a86 --- /dev/null +++ b/app-rappaurio/.env @@ -0,0 +1,20 @@ +# Root password +DATABASE_ROOT_PASSWORD=changeme # NEED TO CHANGE ! + +# MariaDB hostname +DATABASE_HOST=db + +# User to use +DATABASE_USER=radar + +# User password +DATABASE_PASSWORD=changeme # NEED TO CHANGE ! + +# Database name +DATABASE=rappaurio + +# Token private Key +JWT_SECRET=hsdgbniojksdgoijosidgjoisdg # NEED TO CHANGE ! + +JWT_EXPIRES_IN=86400000 +JWT_COOKIE_EXPIRES_IN=86400000 \ No newline at end of file diff --git a/app-rappaurio/Dockerfile b/app-rappaurio/Dockerfile new file mode 100644 index 0000000..cf6c278 --- /dev/null +++ b/app-rappaurio/Dockerfile @@ -0,0 +1,20 @@ +# pull the Node.js Docker image +FROM node:alpine + +# create the directory inside the container +WORKDIR /usr/src/app + +# copy the package.json files from local machine to the workdir in container +COPY package*.json ./ + +# run npm install in our local machine +RUN npm install + +# copy the generated modules and all other files to the container +COPY . . + +# our app is running on port 5000 within the container, so need to expose it +EXPOSE 5000 + +# the command that starts our app +CMD ["npm", "start"] diff --git a/app-rappaurio/app.js b/app-rappaurio/app.js new file mode 100644 index 0000000..a5aabf4 --- /dev/null +++ b/app-rappaurio/app.js @@ -0,0 +1,63 @@ +var createError = require('http-errors'); +var express = require('express'); +var path = require('path'); +var cookieParser = require('cookie-parser'); +var logger = require('morgan'); +const mysql = require('mysql'); +const dotenv = require('dotenv'); + +var app = express(); + +dotenv.config({ path : './.env'}) + +// Create database connection +const db = mysql.createConnection({ + host: process.env.DATABASE_HOST, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE +}); + + +// Connecting our databse and checking everything works fine +db.connect( (error)=>{ + if(error){ + console.log(error) + } + else{ + console.log("MySQL database connected...") + } +}) + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'hbs'); + +app.use(logger('dev')); +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +// Define Routes +app.use('/', require('./server/routes/index')); +app.use('/auth', require('./server/routes/auth')); + + +// catch 404 and forward to error handler +app.use(function(req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function(err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('contains/404'); +}); + +module.exports = app; diff --git a/app-rappaurio/bin/www b/app-rappaurio/bin/www new file mode 100644 index 0000000..3d610e0 --- /dev/null +++ b/app-rappaurio/bin/www @@ -0,0 +1,91 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('app-rappaurio:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '5000'); +app.set('port', port); +console.log("Server started on port : " + port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/app-rappaurio/package-lock.json b/app-rappaurio/package-lock.json new file mode 100644 index 0000000..c3ede18 --- /dev/null +++ b/app-rappaurio/package-lock.json @@ -0,0 +1,1292 @@ +{ + "name": "app-rappaurio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "app-rappaurio", + "version": "0.0.0", + "dependencies": { + "axios": "^1.5.1", + "bcryptjs": "^2.4.3", + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "hbs": "^4.2.0", + "http-errors": "~1.6.3", + "jsonwebtoken": "^9.0.2", + "morgan": "~1.9.1", + "mysql": "^2.18.1", + "wikiapi": "^1.19.4" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cejs": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/cejs/-/cejs-4.5.5.tgz", + "integrity": "sha512-226z/O8jdaPl0Byk7JZvpblvrlWxc010Uz1Ev+hHcJwvRaM9T8pL8eVyp3qlMSq4V6eVI9mBzsETcFVooLov/g==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==" + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hbs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.2.0.tgz", + "integrity": "sha512-dQwHnrfWlTk5PvG9+a45GYpg0VpX47ryKF8dULVd6DtwOE6TEcYQXQ5QM6nyOx/h7v3bvEQbdn19EDAcfUAgZg==", + "dependencies": { + "handlebars": "4.7.7", + "walk": "2.3.15" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/raw-body/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "node_modules/wikiapi": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/wikiapi/-/wikiapi-1.19.4.tgz", + "integrity": "sha512-gh6M026re+FxkQS6DEjTTii/zs3VGvCT8HYkIG17NsNGPW9hiZT8uWovU/uu0JUKZ3OXdy+JD94Jk4ko++AZ8Q==", + "dependencies": { + "cejs": "latest" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/app-rappaurio/package.json b/app-rappaurio/package.json new file mode 100644 index 0000000..818aacc --- /dev/null +++ b/app-rappaurio/package.json @@ -0,0 +1,26 @@ +{ + "name": "app-rappaurio", + "version": "1.2.0", + "description": "Require nodejs 14 or higher", + "main": "app.js", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "author": "Dario WEINBERGER & Raphael PAYET", + "license": "ISC", + "dependencies": { + "axios": "^1.5.1", + "bcryptjs": "^2.4.3", + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "hbs": "^4.2.0", + "http-errors": "~1.6.3", + "jsonwebtoken": "^9.0.2", + "morgan": "~1.9.1", + "mysql": "^2.18.1", + "wikiapi": "^1.19.4" + } +} diff --git a/app-rappaurio/public/images/blog-details-02.jpg b/app-rappaurio/public/images/blog-details-02.jpg new file mode 100644 index 0000000..19b8ffb Binary files /dev/null and b/app-rappaurio/public/images/blog-details-02.jpg differ diff --git a/app-rappaurio/public/images/icon.png b/app-rappaurio/public/images/icon.png new file mode 100644 index 0000000..f68e072 Binary files /dev/null and b/app-rappaurio/public/images/icon.png differ diff --git a/app-rappaurio/public/images/log-wiki-cust.png b/app-rappaurio/public/images/log-wiki-cust.png new file mode 100644 index 0000000..3556d37 Binary files /dev/null and b/app-rappaurio/public/images/log-wiki-cust.png differ diff --git a/app-rappaurio/public/images/log-wiki.svg b/app-rappaurio/public/images/log-wiki.svg new file mode 100644 index 0000000..4375542 --- /dev/null +++ b/app-rappaurio/public/images/log-wiki.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-rappaurio/public/images/logo-2.svg b/app-rappaurio/public/images/logo-2.svg new file mode 100644 index 0000000..38be9ee --- /dev/null +++ b/app-rappaurio/public/images/logo-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app-rappaurio/public/images/logo.svg b/app-rappaurio/public/images/logo.svg new file mode 100644 index 0000000..433375d --- /dev/null +++ b/app-rappaurio/public/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app-rappaurio/public/images/wikipedia-dark.png b/app-rappaurio/public/images/wikipedia-dark.png new file mode 100644 index 0000000..f038bcb Binary files /dev/null and b/app-rappaurio/public/images/wikipedia-dark.png differ diff --git a/app-rappaurio/public/images/wikipedia.png b/app-rappaurio/public/images/wikipedia.png new file mode 100644 index 0000000..0c7f025 Binary files /dev/null and b/app-rappaurio/public/images/wikipedia.png differ diff --git a/app-rappaurio/public/js/bundle.js b/app-rappaurio/public/js/bundle.js new file mode 100644 index 0000000..16110aa --- /dev/null +++ b/app-rappaurio/public/js/bundle.js @@ -0,0 +1,16 @@ +(()=>{var __webpack_modules__=({"./src/js/index.js":/*!*************************!*\ +!*** ./src/js/index.js ***! +\*************************/((__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_glightbox_dist_css_glightbox_min_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/glightbox/dist/css/glightbox.min.css */ \"./node_modules/glightbox/dist/css/glightbox.min.css\");\n/* harmony import */ var _css_animate_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../css/animate.css */ \"./src/css/animate.css\");\n/* harmony import */ var _css_style_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../css/style.css */ \"./src/css/style.css\");\n/* harmony import */ var glightbox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! glightbox */ \"./node_modules/glightbox/dist/js/glightbox.min.js\");\n/* harmony import */ var glightbox__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(glightbox__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var wowjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! wowjs */ \"./node_modules/wowjs/dist/wow.js\");\n/* harmony import */ var wowjs__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(wowjs__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\nwindow.wow = new (wowjs__WEBPACK_IMPORTED_MODULE_4___default().WOW)({\n live: false\n});\nwindow.wow.init({\n offset: 50\n}); //========= glightbox\n\nvar lightbox = glightbox__WEBPACK_IMPORTED_MODULE_3___default()({\n href: 'https://www.youtube.com/watch?v=r44RKWyfcFw&fbclid=IwAR21beSJORalzmzokxDRcGfkZA1AtRTE__l5N4r09HcGS5Y6vOluyouM9EM',\n type: 'video',\n source: 'youtube',\n //vimeo, youtube or local\n width: 900,\n autoplayVideos: true\n});\n\n(function () {\n 'use strict'; // ==== darkToggler\n\n var darkTogglerCheckbox = document.querySelector('#darkToggler');\n var html = document.querySelector('html');\n\n var darkModeToggler = function darkModeToggler() {\n darkTogglerCheckbox.checked ? html.classList.remove('dark') : html.classList.add('dark');\n };\n\n darkModeToggler();\n darkTogglerCheckbox.addEventListener('click', darkModeToggler); // ======= Sticky\n\n window.onscroll = function () {\n var ud_header = document.querySelector('.header');\n var sticky = ud_header.offsetTop;\n\n if (window.pageYOffset > sticky) {\n ud_header.classList.add('sticky');\n } else {\n ud_header.classList.remove('sticky');\n } // show or hide the back-top-top button\n\n\n var backToTop = document.querySelector('.back-to-top');\n\n if (document.body.scrollTop > 50 || document.documentElement.scrollTop > 50) {\n backToTop.style.display = 'flex';\n } else {\n backToTop.style.display = 'none';\n }\n }; // ===== responsive navbar\n\n\n var navbarToggler = document.querySelector('#navbarToggler');\n var navbarCollapse = document.querySelector('#navbarCollapse');\n navbarToggler.addEventListener('click', function () {\n navbarToggler.classList.toggle('navbarTogglerActive');\n navbarCollapse.classList.toggle('hidden');\n }); //===== close navbar-collapse when a clicked\n\n document.querySelectorAll('#navbarCollapse ul li:not(.submenu-item) a').forEach(function (e) {\n return e.addEventListener('click', function () {\n navbarToggler.classList.remove('navbarTogglerActive');\n navbarCollapse.classList.add('hidden');\n });\n }); // ===== Sub-menu\n\n var submenuItems = document.querySelectorAll('.submenu-item');\n submenuItems.forEach(function (el) {\n el.querySelector('a').addEventListener('click', function () {\n el.querySelector('.submenu').classList.toggle('hidden');\n });\n }); // ===== Faq accordion\n\n var faqs = document.querySelectorAll('.single-faq');\n faqs.forEach(function (el) {\n el.querySelector('.faq-btn').addEventListener('click', function () {\n el.querySelector('.icon').classList.toggle('rotate-180');\n el.querySelector('.faq-content').classList.toggle('hidden');\n });\n }); // ====== scroll top js\n\n function scrollTo(element) {\n var to = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500;\n var start = element.scrollTop;\n var change = to - start;\n var increment = 20;\n var currentTime = 0;\n\n var animateScroll = function animateScroll() {\n currentTime += increment;\n var val = Math.easeInOutQuad(currentTime, start, change, duration);\n element.scrollTop = val;\n\n if (currentTime < duration) {\n setTimeout(animateScroll, increment);\n }\n };\n\n animateScroll();\n }\n\n Math.easeInOutQuad = function (t, b, c, d) {\n t /= d / 2;\n if (t < 1) return c / 2 * t * t + b;\n t--;\n return -c / 2 * (t * (t - 2) - 1) + b;\n };\n\n document.querySelector('.back-to-top').onclick = function () {\n scrollTo(document.documentElement);\n };\n})(); // Document Loaded\n\n\ndocument.addEventListener('DOMContentLoaded', function () {});\n\n//# sourceURL=webpack://startup-tailwind/./src/js/index.js?");}),"./node_modules/glightbox/dist/js/glightbox.min.js":/*!*********************************************************!*\ +!*** ./node_modules/glightbox/dist/js/glightbox.min.js ***! +\*********************************************************/(function(module){eval("!function(e,t){ true?module.exports=t():0}(this,(function(){\"use strict\";function e(t){return(e=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=e[s]=e[s]||[],l={all:n,evt:null,found:null};return t&&i&&P(n)>0&&o(n,(function(e,n){if(e.eventName==t&&e.fn.toString()==i.toString())return l.found=!0,l.evt=n,!1})),l}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.onElement,n=t.withCallback,s=t.avoidDuplicate,l=void 0===s||s,a=t.once,h=void 0!==a&&a,d=t.useCapture,c=void 0!==d&&d,u=arguments.length>2?arguments[2]:void 0,g=i||[];function v(e){T(n)&&n.call(u,e,this),h&&v.destroy()}return C(g)&&(g=document.querySelectorAll(g)),v.destroy=function(){o(g,(function(t){var i=r(t,e,v);i.found&&i.all.splice(i.evt,1),t.removeEventListener&&t.removeEventListener(e,v,c)}))},o(g,(function(t){var i=r(t,e,v);(t.addEventListener&&l&&!i.found||!l)&&(t.addEventListener(e,v,c),i.all.push({eventName:e,fn:v}))})),v}function h(e,t){o(t.split(\" \"),(function(t){return e.classList.add(t)}))}function d(e,t){o(t.split(\" \"),(function(t){return e.classList.remove(t)}))}function c(e,t){return e.classList.contains(t)}function u(e,t){for(;e!==document.body;){if(!(e=e.parentElement))return!1;if(\"function\"==typeof e.matches?e.matches(t):e.msMatchesSelector(t))return e}}function g(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||\"\"===t)return!1;if(\"none\"===t)return T(i)&&i(),!1;var n=x(),s=t.split(\" \");o(s,(function(t){h(e,\"g\"+t)})),a(n,{onElement:e,avoidDuplicate:!1,once:!0,withCallback:function(e,t){o(s,(function(e){d(t,\"g\"+e)})),T(i)&&i()}})}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(\"\"===t)return e.style.webkitTransform=\"\",e.style.MozTransform=\"\",e.style.msTransform=\"\",e.style.OTransform=\"\",e.style.transform=\"\",!1;e.style.webkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.OTransform=t,e.style.transform=t}function f(e){e.style.display=\"block\"}function p(e){e.style.display=\"none\"}function m(e){var t=document.createDocumentFragment(),i=document.createElement(\"div\");for(i.innerHTML=e;i.firstChild;)t.appendChild(i.firstChild);return t}function y(){return{width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}}function x(){var e,t=document.createElement(\"fakeelement\"),i={animation:\"animationend\",OAnimation:\"oAnimationEnd\",MozAnimation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\"};for(e in i)if(void 0!==t.style[e])return i[e]}function b(e,t,i,n){if(e())t();else{var s;i||(i=100);var l=setInterval((function(){e()&&(clearInterval(l),s&&clearTimeout(s),t())}),i);n&&(s=setTimeout((function(){clearInterval(l)}),n))}}function S(e,t,i){if(I(e))console.error(\"Inject assets error\");else if(T(t)&&(i=t,t=!1),C(t)&&t in window)T(i)&&i();else{var n;if(-1!==e.indexOf(\".css\")){if((n=document.querySelectorAll('link[href=\"'+e+'\"]'))&&n.length>0)return void(T(i)&&i());var s=document.getElementsByTagName(\"head\")[0],l=s.querySelectorAll('link[rel=\"stylesheet\"]'),o=document.createElement(\"link\");return o.rel=\"stylesheet\",o.type=\"text/css\",o.href=e,o.media=\"all\",l?s.insertBefore(o,l[0]):s.appendChild(o),void(T(i)&&i())}if((n=document.querySelectorAll('script[src=\"'+e+'\"]'))&&n.length>0){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}}else{var r=document.createElement(\"script\");r.type=\"text/javascript\",r.src=e,r.onload=function(){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}},document.body.appendChild(r)}}}function w(){return\"navigator\"in window&&window.navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i)}function T(e){return\"function\"==typeof e}function C(e){return\"string\"==typeof e}function k(e){return!(!e||!e.nodeType||1!=e.nodeType)}function E(e){return Array.isArray(e)}function A(e){return e&&e.length&&isFinite(e.length)}function L(t){return\"object\"===e(t)&&null!=t&&!T(t)&&!E(t)}function I(e){return null==e}function O(e,t){return null!==e&&hasOwnProperty.call(e,t)}function P(e){if(L(e)){if(e.keys)return e.keys().length;var t=0;for(var i in e)O(e,i)&&t++;return t}return e.length}function M(e){return!isNaN(parseFloat(e))&&isFinite(e)}function z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,t=document.querySelectorAll(\".gbtn[data-taborder]:not(.disabled)\");if(!t.length)return!1;if(1==t.length)return t[0];\"string\"==typeof e&&(e=parseInt(e));var i=[];o(t,(function(e){i.push(e.getAttribute(\"data-taborder\"))}));var n=Math.max.apply(Math,i.map((function(e){return parseInt(e)}))),s=e<0?1:e+1;s>n&&(s=\"1\");var l=i.filter((function(e){return e>=parseInt(s)})),r=l.sort()[0];return document.querySelector('.gbtn[data-taborder=\"'.concat(r,'\"]'))}function X(e){if(e.events.hasOwnProperty(\"keyboard\"))return!1;e.events.keyboard=a(\"keydown\",{onElement:window,withCallback:function(t,i){var n=(t=t||window.event).keyCode;if(9==n){var s=document.querySelector(\".gbtn.focused\");if(!s){var l=!(!document.activeElement||!document.activeElement.nodeName)&&document.activeElement.nodeName.toLocaleLowerCase();if(\"input\"==l||\"textarea\"==l||\"button\"==l)return}t.preventDefault();var o=document.querySelectorAll(\".gbtn[data-taborder]\");if(!o||o.length<=0)return;if(!s){var r=z();return void(r&&(r.focus(),h(r,\"focused\")))}var a=z(s.getAttribute(\"data-taborder\"));d(s,\"focused\"),a&&(a.focus(),h(a,\"focused\"))}39==n&&e.nextSlide(),37==n&&e.prevSlide(),27==n&&e.close()}})}function Y(e){return Math.sqrt(e.x*e.x+e.y*e.y)}function q(e,t){var i=function(e,t){var i=Y(e)*Y(t);if(0===i)return 0;var n=function(e,t){return e.x*t.x+e.y*t.y}(e,t)/i;return n>1&&(n=1),Math.acos(n)}(e,t);return function(e,t){return e.x*t.y-t.x*e.y}(e,t)>0&&(i*=-1),180*i/Math.PI}var N=function(){function e(i){t(this,e),this.handlers=[],this.el=i}return n(e,[{key:\"add\",value:function(e){this.handlers.push(e)}},{key:\"del\",value:function(e){e||(this.handlers=[]);for(var t=this.handlers.length;t>=0;t--)this.handlers[t]===e&&this.handlers.splice(t,1)}},{key:\"dispatch\",value:function(){for(var e=0,t=this.handlers.length;e=0)console.log(\"ignore drag for this touched element\",e.target.nodeName.toLowerCase());else{this.now=Date.now(),this.x1=e.touches[0].pageX,this.y1=e.touches[0].pageY,this.delta=this.now-(this.last||this.now),this.touchStart.dispatch(e,this.element),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;var t=this.preV;if(e.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();var i={x:e.touches[1].pageX-this.x1,y:e.touches[1].pageY-this.y1};t.x=i.x,t.y=i.y,this.pinchStartLen=Y(t),this.multipointStart.dispatch(e,this.element)}this._preventTap=!1,this.longTapTimeout=setTimeout(function(){this.longTap.dispatch(e,this.element),this._preventTap=!0}.bind(this),750)}}}},{key:\"move\",value:function(e){if(e.touches){var t=this.preV,i=e.touches.length,n=e.touches[0].pageX,s=e.touches[0].pageY;if(this.isDoubleTap=!1,i>1){var l=e.touches[1].pageX,o=e.touches[1].pageY,r={x:e.touches[1].pageX-n,y:e.touches[1].pageY-s};null!==t.x&&(this.pinchStartLen>0&&(e.zoom=Y(r)/this.pinchStartLen,this.pinch.dispatch(e,this.element)),e.angle=q(r,t),this.rotate.dispatch(e,this.element)),t.x=r.x,t.y=r.y,null!==this.x2&&null!==this.sx2?(e.deltaX=(n-this.x2+l-this.sx2)/2,e.deltaY=(s-this.y2+o-this.sy2)/2):(e.deltaX=0,e.deltaY=0),this.twoFingerPressMove.dispatch(e,this.element),this.sx2=l,this.sy2=o}else{if(null!==this.x2){e.deltaX=n-this.x2,e.deltaY=s-this.y2;var a=Math.abs(this.x1-this.x2),h=Math.abs(this.y1-this.y2);(a>10||h>10)&&(this._preventTap=!0)}else e.deltaX=0,e.deltaY=0;this.pressMove.dispatch(e,this.element)}this.touchMove.dispatch(e,this.element),this._cancelLongTap(),this.x2=n,this.y2=s,i>1&&e.preventDefault()}}},{key:\"end\",value:function(e){if(e.changedTouches){this._cancelLongTap();var t=this;e.touches.length<2&&(this.multipointEnd.dispatch(e,this.element),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(e.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout((function(){t.swipe.dispatch(e,t.element)}),0)):(this.tapTimeout=setTimeout((function(){t._preventTap||t.tap.dispatch(e,t.element),t.isDoubleTap&&(t.doubleTap.dispatch(e,t.element),t.isDoubleTap=!1)}),0),t.isDoubleTap||(t.singleTapTimeout=setTimeout((function(){t.singleTap.dispatch(e,t.element)}),250))),this.touchEnd.dispatch(e,this.element),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=null}}},{key:\"cancelAll\",value:function(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}},{key:\"cancel\",value:function(e){this.cancelAll(),this.touchCancel.dispatch(e,this.element)}},{key:\"_cancelLongTap\",value:function(){clearTimeout(this.longTapTimeout)}},{key:\"_cancelSingleTap\",value:function(){clearTimeout(this.singleTapTimeout)}},{key:\"_swipeDirection\",value:function(e,t,i,n){return Math.abs(e-t)>=Math.abs(i-n)?e-t>0?\"Left\":\"Right\":i-n>0?\"Up\":\"Down\"}},{key:\"on\",value:function(e,t){this[e]&&this[e].add(t)}},{key:\"off\",value:function(e,t){this[e]&&this[e].del(t)}},{key:\"destroy\",value:function(){return this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener(\"touchstart\",this.start),this.element.removeEventListener(\"touchmove\",this.move),this.element.removeEventListener(\"touchend\",this.end),this.element.removeEventListener(\"touchcancel\",this.cancel),this.rotate.del(),this.touchStart.del(),this.multipointStart.del(),this.multipointEnd.del(),this.pinch.del(),this.swipe.del(),this.tap.del(),this.doubleTap.del(),this.longTap.del(),this.singleTap.del(),this.pressMove.del(),this.twoFingerPressMove.del(),this.touchMove.del(),this.touchEnd.del(),this.touchCancel.del(),this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null,window.removeEventListener(\"scroll\",this._cancelAllHandler),null}}]),e}();function W(e){var t=function(){var e,t=document.createElement(\"fakeelement\"),i={transition:\"transitionend\",OTransition:\"oTransitionEnd\",MozTransition:\"transitionend\",WebkitTransition:\"webkitTransitionEnd\"};for(e in i)if(void 0!==t.style[e])return i[e]}(),i=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,n=c(e,\"gslide-media\")?e:e.querySelector(\".gslide-media\"),s=u(n,\".ginner-container\"),l=e.querySelector(\".gslide-description\");i>769&&(n=s),h(n,\"greset\"),v(n,\"translate3d(0, 0, 0)\"),a(t,{onElement:n,once:!0,withCallback:function(e,t){d(n,\"greset\")}}),n.style.opacity=\"\",l&&(l.style.opacity=\"\")}function B(e){if(e.events.hasOwnProperty(\"touch\"))return!1;var t,i,n,s=y(),l=s.width,o=s.height,r=!1,a=null,g=null,f=null,p=!1,m=1,x=1,b=!1,S=!1,w=null,T=null,C=null,k=null,E=0,A=0,L=!1,I=!1,O={},P={},M=0,z=0,X=document.getElementById(\"glightbox-slider\"),Y=document.querySelector(\".goverlay\"),q=new _(X,{touchStart:function(t){if(r=!0,(c(t.targetTouches[0].target,\"ginner-container\")||u(t.targetTouches[0].target,\".gslide-desc\")||\"a\"==t.targetTouches[0].target.nodeName.toLowerCase())&&(r=!1),u(t.targetTouches[0].target,\".gslide-inline\")&&!c(t.targetTouches[0].target.parentNode,\"gslide-inline\")&&(r=!1),r){if(P=t.targetTouches[0],O.pageX=t.targetTouches[0].pageX,O.pageY=t.targetTouches[0].pageY,M=t.targetTouches[0].clientX,z=t.targetTouches[0].clientY,a=e.activeSlide,g=a.querySelector(\".gslide-media\"),n=a.querySelector(\".gslide-inline\"),f=null,c(g,\"gslide-image\")&&(f=g.querySelector(\"img\")),(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)>769&&(g=a.querySelector(\".ginner-container\")),d(Y,\"greset\"),t.pageX>20&&t.pageXo){var a=O.pageX-P.pageX;if(Math.abs(a)<=13)return!1}p=!0;var h,d=s.targetTouches[0].clientX,c=s.targetTouches[0].clientY,u=M-d,m=z-c;if(Math.abs(u)>Math.abs(m)?(L=!1,I=!0):(I=!1,L=!0),t=P.pageX-O.pageX,E=100*t/l,i=P.pageY-O.pageY,A=100*i/o,L&&f&&(h=1-Math.abs(i)/o,Y.style.opacity=h,e.settings.touchFollowAxis&&(E=0)),I&&(h=1-Math.abs(t)/l,g.style.opacity=h,e.settings.touchFollowAxis&&(A=0)),!f)return v(g,\"translate3d(\".concat(E,\"%, 0, 0)\"));v(g,\"translate3d(\".concat(E,\"%, \").concat(A,\"%, 0)\"))}},touchEnd:function(){if(r){if(p=!1,S||b)return C=w,void(k=T);var t=Math.abs(parseInt(A)),i=Math.abs(parseInt(E));if(!(t>29&&f))return t<29&&i<25?(h(Y,\"greset\"),Y.style.opacity=1,W(g)):void 0;e.close()}},multipointEnd:function(){setTimeout((function(){b=!1}),50)},multipointStart:function(){b=!0,m=x||1},pinch:function(e){if(!f||p)return!1;b=!0,f.scaleX=f.scaleY=m*e.zoom;var t=m*e.zoom;if(S=!0,t<=1)return S=!1,t=1,k=null,C=null,w=null,T=null,void f.setAttribute(\"style\",\"\");t>4.5&&(t=4.5),f.style.transform=\"scale3d(\".concat(t,\", \").concat(t,\", 1)\"),x=t},pressMove:function(e){if(S&&!b){var t=P.pageX-O.pageX,i=P.pageY-O.pageY;C&&(t+=C),k&&(i+=k),w=t,T=i;var n=\"translate3d(\".concat(t,\"px, \").concat(i,\"px, 0)\");x&&(n+=\" scale3d(\".concat(x,\", \").concat(x,\", 1)\")),v(f,n)}},swipe:function(t){if(!S)if(b)b=!1;else{if(\"Left\"==t.direction){if(e.index==e.elements.length-1)return W(g);e.nextSlide()}if(\"Right\"==t.direction){if(0==e.index)return W(g);e.prevSlide()}}}});e.events.touch=q}var H=function(){function e(i,n){var s=this,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(t(this,e),this.img=i,this.slide=n,this.onclose=l,this.img.setZoomEvents)return!1;this.active=!1,this.zoomedIn=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.img.addEventListener(\"mousedown\",(function(e){return s.dragStart(e)}),!1),this.img.addEventListener(\"mouseup\",(function(e){return s.dragEnd(e)}),!1),this.img.addEventListener(\"mousemove\",(function(e){return s.drag(e)}),!1),this.img.addEventListener(\"click\",(function(e){return s.slide.classList.contains(\"dragging-nav\")?(s.zoomOut(),!1):s.zoomedIn?void(s.zoomedIn&&!s.dragging&&s.zoomOut()):s.zoomIn()}),!1),this.img.setZoomEvents=!0}return n(e,[{key:\"zoomIn\",value:function(){var e=this.widowWidth();if(!(this.zoomedIn||e<=768)){var t=this.img;if(t.setAttribute(\"data-style\",t.getAttribute(\"style\")),t.style.maxWidth=t.naturalWidth+\"px\",t.style.maxHeight=t.naturalHeight+\"px\",t.naturalWidth>e){var i=e/2-t.naturalWidth/2;this.setTranslate(this.img.parentNode,i,0)}this.slide.classList.add(\"zoomed\"),this.zoomedIn=!0}}},{key:\"zoomOut\",value:function(){this.img.parentNode.setAttribute(\"style\",\"\"),this.img.setAttribute(\"style\",this.img.getAttribute(\"data-style\")),this.slide.classList.remove(\"zoomed\"),this.zoomedIn=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.onclose&&\"function\"==typeof this.onclose&&this.onclose()}},{key:\"dragStart\",value:function(e){e.preventDefault(),this.zoomedIn?(\"touchstart\"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset),e.target===this.img&&(this.active=!0,this.img.classList.add(\"dragging\"))):this.active=!1}},{key:\"dragEnd\",value:function(e){var t=this;e.preventDefault(),this.initialX=this.currentX,this.initialY=this.currentY,this.active=!1,setTimeout((function(){t.dragging=!1,t.img.isDragging=!1,t.img.classList.remove(\"dragging\")}),100)}},{key:\"drag\",value:function(e){this.active&&(e.preventDefault(),\"touchmove\"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.img.isDragging=!0,this.dragging=!0,this.setTranslate(this.img,this.currentX,this.currentY))}},{key:\"onMove\",value:function(e){if(this.zoomedIn){var t=e.clientX-this.img.naturalWidth/2,i=e.clientY-this.img.naturalHeight/2;this.setTranslate(this.img,t,i)}}},{key:\"setTranslate\",value:function(e,t,i){e.style.transform=\"translate3d(\"+t+\"px, \"+i+\"px, 0)\"}},{key:\"widowWidth\",value:function(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth}}]),e}(),V=function(){function e(){var i=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e);var s=n.dragEl,l=n.toleranceX,o=void 0===l?40:l,r=n.toleranceY,a=void 0===r?65:r,h=n.slide,d=void 0===h?null:h,c=n.instance,u=void 0===c?null:c;this.el=s,this.active=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.direction=null,this.lastDirection=null,this.toleranceX=o,this.toleranceY=a,this.toleranceReached=!1,this.dragContainer=this.el,this.slide=d,this.instance=u,this.el.addEventListener(\"mousedown\",(function(e){return i.dragStart(e)}),!1),this.el.addEventListener(\"mouseup\",(function(e){return i.dragEnd(e)}),!1),this.el.addEventListener(\"mousemove\",(function(e){return i.drag(e)}),!1)}return n(e,[{key:\"dragStart\",value:function(e){if(this.slide.classList.contains(\"zoomed\"))this.active=!1;else{\"touchstart\"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset);var t=e.target.nodeName.toLowerCase();e.target.classList.contains(\"nodrag\")||u(e.target,\".nodrag\")||-1!==[\"input\",\"select\",\"textarea\",\"button\",\"a\"].indexOf(t)?this.active=!1:(e.preventDefault(),(e.target===this.el||\"img\"!==t&&u(e.target,\".gslide-inline\"))&&(this.active=!0,this.el.classList.add(\"dragging\"),this.dragContainer=u(e.target,\".ginner-container\")))}}},{key:\"dragEnd\",value:function(e){var t=this;e&&e.preventDefault(),this.initialX=0,this.initialY=0,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.active=!1,this.doSlideChange&&(this.instance.preventOutsideClick=!0,\"right\"==this.doSlideChange&&this.instance.prevSlide(),\"left\"==this.doSlideChange&&this.instance.nextSlide()),this.doSlideClose&&this.instance.close(),this.toleranceReached||this.setTranslate(this.dragContainer,0,0,!0),setTimeout((function(){t.instance.preventOutsideClick=!1,t.toleranceReached=!1,t.lastDirection=null,t.dragging=!1,t.el.isDragging=!1,t.el.classList.remove(\"dragging\"),t.slide.classList.remove(\"dragging-nav\"),t.dragContainer.style.transform=\"\",t.dragContainer.style.transition=\"\"}),100)}},{key:\"drag\",value:function(e){if(this.active){e.preventDefault(),this.slide.classList.add(\"dragging-nav\"),\"touchmove\"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.el.isDragging=!0,this.dragging=!0,this.doSlideChange=!1,this.doSlideClose=!1;var t=Math.abs(this.currentX),i=Math.abs(this.currentY);if(t>0&&t>=Math.abs(this.currentY)&&(!this.lastDirection||\"x\"==this.lastDirection)){this.yOffset=0,this.lastDirection=\"x\",this.setTranslate(this.dragContainer,this.currentX,0);var n=this.shouldChange();if(!this.instance.settings.dragAutoSnap&&n&&(this.doSlideChange=n),this.instance.settings.dragAutoSnap&&n)return this.instance.preventOutsideClick=!0,this.toleranceReached=!0,this.active=!1,this.instance.preventOutsideClick=!0,this.dragEnd(null),\"right\"==n&&this.instance.prevSlide(),void(\"left\"==n&&this.instance.nextSlide())}if(this.toleranceY>0&&i>0&&i>=t&&(!this.lastDirection||\"y\"==this.lastDirection)){this.xOffset=0,this.lastDirection=\"y\",this.setTranslate(this.dragContainer,0,this.currentY);var s=this.shouldClose();return!this.instance.settings.dragAutoSnap&&s&&(this.doSlideClose=!0),void(this.instance.settings.dragAutoSnap&&s&&this.instance.close())}}}},{key:\"shouldChange\",value:function(){var e=!1;if(Math.abs(this.currentX)>=this.toleranceX){var t=this.currentX>0?\"right\":\"left\";(\"left\"==t&&this.slide!==this.slide.parentNode.lastChild||\"right\"==t&&this.slide!==this.slide.parentNode.firstChild)&&(e=t)}return e}},{key:\"shouldClose\",value:function(){var e=!1;return Math.abs(this.currentY)>=this.toleranceY&&(e=!0),e}},{key:\"setTranslate\",value:function(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];e.style.transition=n?\"all .2s ease\":\"\",e.style.transform=\"translate3d(\".concat(t,\"px, \").concat(i,\"px, 0)\")}}]),e}();function j(e,t,i,n){var s=e.querySelector(\".gslide-media\"),l=new Image,o=\"gSlideTitle_\"+i,r=\"gSlideDesc_\"+i;l.addEventListener(\"load\",(function(){T(n)&&n()}),!1),l.src=t.href,\"\"!=t.sizes&&\"\"!=t.srcset&&(l.sizes=t.sizes,l.srcset=t.srcset),l.alt=\"\",I(t.alt)||\"\"===t.alt||(l.alt=t.alt),\"\"!==t.title&&l.setAttribute(\"aria-labelledby\",o),\"\"!==t.description&&l.setAttribute(\"aria-describedby\",r),t.hasOwnProperty(\"_hasCustomWidth\")&&t._hasCustomWidth&&(l.style.width=t.width),t.hasOwnProperty(\"_hasCustomHeight\")&&t._hasCustomHeight&&(l.style.height=t.height),s.insertBefore(l,s.firstChild)}function F(e,t,i,n){var s=this,l=e.querySelector(\".ginner-container\"),o=\"gvideo\"+i,r=e.querySelector(\".gslide-media\"),a=this.getAllPlayers();h(l,\"gvideo-container\"),r.insertBefore(m('
'),r.firstChild);var d=e.querySelector(\".gvideo-wrapper\");S(this.settings.plyr.css,\"Plyr\");var c=t.href,u=null==t?void 0:t.videoProvider,g=!1;r.style.maxWidth=t.width,S(this.settings.plyr.js,\"Plyr\",(function(){if(!u&&c.match(/vimeo\\.com\\/([0-9]*)/)&&(u=\"vimeo\"),!u&&(c.match(/(youtube\\.com|youtube-nocookie\\.com)\\/watch\\?v=([a-zA-Z0-9\\-_]+)/)||c.match(/youtu\\.be\\/([a-zA-Z0-9\\-_]+)/)||c.match(/(youtube\\.com|youtube-nocookie\\.com)\\/embed\\/([a-zA-Z0-9\\-_]+)/))&&(u=\"youtube\"),\"local\"===u||!u){u=\"local\";var l='\")}var r=g||m('
'));h(d,\"\".concat(u,\"-video gvideo\")),d.appendChild(r),d.setAttribute(\"data-id\",o),d.setAttribute(\"data-index\",i);var v=O(s.settings.plyr,\"config\")?s.settings.plyr.config:{},f=new Plyr(\"#\"+o,v);f.on(\"ready\",(function(e){a[o]=e.detail.plyr,T(n)&&n()})),b((function(){return e.querySelector(\"iframe\")&&\"true\"==e.querySelector(\"iframe\").dataset.ready}),(function(){s.resize(e)})),f.on(\"enterfullscreen\",R),f.on(\"exitfullscreen\",R)}))}function R(e){var t=u(e.target,\".gslide-media\");\"enterfullscreen\"===e.type&&h(t,\"fullscreen\"),\"exitfullscreen\"===e.type&&d(t,\"fullscreen\")}function G(e,t,i,n){var s,l=this,o=e.querySelector(\".gslide-media\"),r=!(!O(t,\"href\")||!t.href)&&t.href.split(\"#\").pop().trim(),d=!(!O(t,\"content\")||!t.content)&&t.content;if(d&&(C(d)&&(s=m('
'.concat(d,\"
\"))),k(d))){\"none\"==d.style.display&&(d.style.display=\"block\");var c=document.createElement(\"div\");c.className=\"ginlined-content\",c.appendChild(d),s=c}if(r){var u=document.getElementById(r);if(!u)return!1;var g=u.cloneNode(!0);g.style.height=t.height,g.style.maxWidth=t.width,h(g,\"ginlined-content\"),s=g}if(!s)return console.error(\"Unable to append inline slide content\",t),!1;o.style.height=t.height,o.style.width=t.width,o.appendChild(s),this.events[\"inlineclose\"+r]=a(\"click\",{onElement:o.querySelectorAll(\".gtrigger-close\"),withCallback:function(e){e.preventDefault(),l.close()}}),T(n)&&n()}function Z(e,t,i,n){var s=e.querySelector(\".gslide-media\"),l=function(e){var t=e.url,i=e.allow,n=e.callback,s=e.appendTo,l=document.createElement(\"iframe\");return l.className=\"vimeo-video gvideo\",l.src=t,l.style.width=\"100%\",l.style.height=\"100%\",i&&l.setAttribute(\"allow\",i),l.onload=function(){l.onload=null,h(l,\"node-ready\"),T(n)&&n()},s&&s.appendChild(l),l}({url:t.href,callback:n});s.parentNode.style.maxWidth=t.width,s.parentNode.style.height=t.height,s.appendChild(l)}var U=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.defaults={href:\"\",sizes:\"\",srcset:\"\",title:\"\",type:\"\",videoProvider:\"\",description:\"\",alt:\"\",descPosition:\"bottom\",effect:\"\",width:\"\",height:\"\",content:!1,zoomable:!0,draggable:!0},L(i)&&(this.defaults=l(this.defaults,i))}return n(e,[{key:\"sourceType\",value:function(e){var t=e;if(null!==(e=e.toLowerCase()).match(/\\.(jpeg|jpg|jpe|gif|png|apn|webp|avif|svg)/))return\"image\";if(e.match(/(youtube\\.com|youtube-nocookie\\.com)\\/watch\\?v=([a-zA-Z0-9\\-_]+)/)||e.match(/youtu\\.be\\/([a-zA-Z0-9\\-_]+)/)||e.match(/(youtube\\.com|youtube-nocookie\\.com)\\/embed\\/([a-zA-Z0-9\\-_]+)/))return\"video\";if(e.match(/vimeo\\.com\\/([0-9]*)/))return\"video\";if(null!==e.match(/\\.(mp4|ogg|webm|mov)/))return\"video\";if(null!==e.match(/\\.(mp3|wav|wma|aac|ogg)/))return\"audio\";if(e.indexOf(\"#\")>-1&&\"\"!==t.split(\"#\").pop().trim())return\"inline\";return e.indexOf(\"goajax=true\")>-1?\"ajax\":\"external\"}},{key:\"parseConfig\",value:function(e,t){var i=this,n=l({descPosition:t.descPosition},this.defaults);if(L(e)&&!k(e)){O(e,\"type\")||(O(e,\"content\")&&e.content?e.type=\"inline\":O(e,\"href\")&&(e.type=this.sourceType(e.href)));var s=l(n,e);return this.setSize(s,t),s}var r=\"\",a=e.getAttribute(\"data-glightbox\"),h=e.nodeName.toLowerCase();if(\"a\"===h&&(r=e.href),\"img\"===h&&(r=e.src,n.alt=e.alt),n.href=r,o(n,(function(s,l){O(t,l)&&\"width\"!==l&&(n[l]=t[l]);var o=e.dataset[l];I(o)||(n[l]=i.sanitizeValue(o))})),n.content&&(n.type=\"inline\"),!n.type&&r&&(n.type=this.sourceType(r)),I(a)){if(!n.title&&\"a\"==h){var d=e.title;I(d)||\"\"===d||(n.title=d)}if(!n.title&&\"img\"==h){var c=e.alt;I(c)||\"\"===c||(n.title=c)}}else{var u=[];o(n,(function(e,t){u.push(\";\\\\s?\"+t)})),u=u.join(\"\\\\s?:|\"),\"\"!==a.trim()&&o(n,(function(e,t){var s=a,l=new RegExp(\"s?\"+t+\"s?:s?(.*?)(\"+u+\"s?:|$)\"),o=s.match(l);if(o&&o.length&&o[1]){var r=o[1].trim().replace(/;\\s*$/,\"\");n[t]=i.sanitizeValue(r)}}))}if(n.description&&\".\"===n.description.substring(0,1)){var g;try{g=document.querySelector(n.description).innerHTML}catch(e){if(!(e instanceof DOMException))throw e}g&&(n.description=g)}if(!n.description){var v=e.querySelector(\".glightbox-desc\");v&&(n.description=v.innerHTML)}return this.setSize(n,t,e),this.slideConfig=n,n}},{key:\"setSize\",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=\"video\"==e.type?this.checkSize(t.videosWidth):this.checkSize(t.width),s=this.checkSize(t.height);return e.width=O(e,\"width\")&&\"\"!==e.width?this.checkSize(e.width):n,e.height=O(e,\"height\")&&\"\"!==e.height?this.checkSize(e.height):s,i&&\"image\"==e.type&&(e._hasCustomWidth=!!i.dataset.width,e._hasCustomHeight=!!i.dataset.height),e}},{key:\"checkSize\",value:function(e){return M(e)?\"\".concat(e,\"px\"):e}},{key:\"sanitizeValue\",value:function(e){return\"true\"!==e&&\"false\"!==e?e:\"true\"===e}}]),e}(),$=function(){function e(i,n,s){t(this,e),this.element=i,this.instance=n,this.index=s}return n(e,[{key:\"setContent\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(c(t,\"loaded\"))return!1;var n=this.instance.settings,s=this.slideConfig,l=w();T(n.beforeSlideLoad)&&n.beforeSlideLoad({index:this.index,slide:t,player:!1});var o=s.type,r=s.descPosition,a=t.querySelector(\".gslide-media\"),d=t.querySelector(\".gslide-title\"),u=t.querySelector(\".gslide-desc\"),g=t.querySelector(\".gdesc-inner\"),v=i,f=\"gSlideTitle_\"+this.index,p=\"gSlideDesc_\"+this.index;if(T(n.afterSlideLoad)&&(v=function(){T(i)&&i(),n.afterSlideLoad({index:e.index,slide:t,player:e.instance.getSlidePlayerInstance(e.index)})}),\"\"==s.title&&\"\"==s.description?g&&g.parentNode.parentNode.removeChild(g.parentNode):(d&&\"\"!==s.title?(d.id=f,d.innerHTML=s.title):d.parentNode.removeChild(d),u&&\"\"!==s.description?(u.id=p,l&&n.moreLength>0?(s.smallDescription=this.slideShortDesc(s.description,n.moreLength,n.moreText),u.innerHTML=s.smallDescription,this.descriptionEvents(u,s)):u.innerHTML=s.description):u.parentNode.removeChild(u),h(a.parentNode,\"desc-\".concat(r)),h(g.parentNode,\"description-\".concat(r))),h(a,\"gslide-\".concat(o)),h(t,\"loaded\"),\"video\"!==o){if(\"external\"!==o)return\"inline\"===o?(G.apply(this.instance,[t,s,this.index,v]),void(s.draggable&&new V({dragEl:t.querySelector(\".gslide-inline\"),toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:this.instance}))):void(\"image\"!==o?T(v)&&v():j(t,s,this.index,(function(){var i=t.querySelector(\"img\");s.draggable&&new V({dragEl:i,toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:e.instance}),s.zoomable&&i.naturalWidth>i.offsetWidth&&(h(i,\"zoomable\"),new H(i,t,(function(){e.instance.resize()}))),T(v)&&v()})));Z.apply(this,[t,s,this.index,v])}else F.apply(this.instance,[t,s,this.index,v])}},{key:\"slideShortDesc\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=document.createElement(\"div\");n.innerHTML=e;var s=n.innerText,l=i;if((e=s.trim()).length<=t)return e;var o=e.substr(0,t-1);return l?(n=null,o+'... '+i+\"\"):o}},{key:\"descriptionEvents\",value:function(e,t){var i=this,n=e.querySelector(\".desc-more\");if(!n)return!1;a(\"click\",{onElement:n,withCallback:function(e,n){e.preventDefault();var s=document.body,l=u(n,\".gslide-desc\");if(!l)return!1;l.innerHTML=t.description,h(s,\"gdesc-open\");var o=a(\"click\",{onElement:[s,u(l,\".gslide-description\")],withCallback:function(e,n){\"a\"!==e.target.nodeName.toLowerCase()&&(d(s,\"gdesc-open\"),h(s,\"gdesc-closed\"),l.innerHTML=t.smallDescription,i.descriptionEvents(l,t),setTimeout((function(){d(s,\"gdesc-closed\")}),400),o.destroy())}})}})}},{key:\"create\",value:function(){return m(this.instance.settings.slideHTML)}},{key:\"getConfig\",value:function(){k(this.element)||this.element.hasOwnProperty(\"draggable\")||(this.element.draggable=this.instance.settings.draggable);var e=new U(this.instance.settings.slideExtraAttributes);return this.slideConfig=e.parseConfig(this.element,this.instance.settings),this.slideConfig}}]),e}(),J=w(),K=null!==w()||void 0!==document.createTouch||\"ontouchstart\"in window||\"onmsgesturechange\"in window||navigator.msMaxTouchPoints,Q=document.getElementsByTagName(\"html\")[0],ee={selector:\".glightbox\",elements:null,skin:\"clean\",theme:\"clean\",closeButton:!0,startAt:null,autoplayVideos:!0,autofocusVideos:!0,descPosition:\"bottom\",width:\"900px\",height:\"506px\",videosWidth:\"960px\",beforeSlideChange:null,afterSlideChange:null,beforeSlideLoad:null,afterSlideLoad:null,slideInserted:null,slideRemoved:null,slideExtraAttributes:null,onOpen:null,onClose:null,loop:!1,zoomable:!0,draggable:!0,dragAutoSnap:!1,dragToleranceX:40,dragToleranceY:65,preload:!0,oneSlidePerOpen:!1,touchNavigation:!0,touchFollowAxis:!0,keyboardNavigation:!0,closeOnOutsideClick:!0,plugins:!1,plyr:{css:\"https://cdn.plyr.io/3.6.12/plyr.css\",js:\"https://cdn.plyr.io/3.6.12/plyr.js\",config:{ratio:\"16:9\",fullscreen:{enabled:!0,iosNative:!0},youtube:{noCookie:!0,rel:0,showinfo:0,iv_load_policy:3},vimeo:{byline:!1,portrait:!1,title:!1,transparent:!1}}},openEffect:\"zoom\",closeEffect:\"zoom\",slideEffect:\"slide\",moreText:\"See more\",moreLength:60,cssEfects:{fade:{in:\"fadeIn\",out:\"fadeOut\"},zoom:{in:\"zoomIn\",out:\"zoomOut\"},slide:{in:\"slideInRight\",out:\"slideOutLeft\"},slideBack:{in:\"slideInLeft\",out:\"slideOutRight\"},none:{in:\"none\",out:\"none\"}},svg:{close:'',next:' ',prev:''},slideHTML:'
\\n
\\n
\\n
\\n
\\n
\\n
\\n

\\n
\\n
\\n
\\n
\\n
\\n
',lightboxHTML:'
\\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
'},te=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.customOptions=i,this.settings=l(ee,i),this.effectsClasses=this.getAnimationClasses(),this.videoPlayers={},this.apiEvents=[],this.fullElementsList=!1}return n(e,[{key:\"init\",value:function(){var e=this,t=this.getSelector();t&&(this.baseEvents=a(\"click\",{onElement:t,withCallback:function(t,i){t.preventDefault(),e.open(i)}})),this.elements=this.getElements()}},{key:\"open\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(0===this.elements.length)return!1;this.activeSlide=null,this.prevActiveSlideIndex=null,this.prevActiveSlide=null;var i=M(t)?t:this.settings.startAt;if(k(e)){var n=e.getAttribute(\"data-gallery\");n&&(this.fullElementsList=this.elements,this.elements=this.getGalleryElements(this.elements,n)),I(i)&&(i=this.getElementIndex(e))<0&&(i=0)}M(i)||(i=0),this.build(),g(this.overlay,\"none\"===this.settings.openEffect?\"none\":this.settings.cssEfects.fade.in);var s=document.body,l=window.innerWidth-document.documentElement.clientWidth;if(l>0){var o=document.createElement(\"style\");o.type=\"text/css\",o.className=\"gcss-styles\",o.innerText=\".gscrollbar-fixer {margin-right: \".concat(l,\"px}\"),document.head.appendChild(o),h(s,\"gscrollbar-fixer\")}h(s,\"glightbox-open\"),h(Q,\"glightbox-open\"),J&&(h(document.body,\"glightbox-mobile\"),this.settings.slideEffect=\"slide\"),this.showSlide(i,!0),1===this.elements.length?(h(this.prevButton,\"glightbox-button-hidden\"),h(this.nextButton,\"glightbox-button-hidden\")):(d(this.prevButton,\"glightbox-button-hidden\"),d(this.nextButton,\"glightbox-button-hidden\")),this.lightboxOpen=!0,this.trigger(\"open\"),T(this.settings.onOpen)&&this.settings.onOpen(),K&&this.settings.touchNavigation&&B(this),this.settings.keyboardNavigation&&X(this)}},{key:\"openAt\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.open(null,e)}},{key:\"showSlide\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];f(this.loader),this.index=parseInt(t);var n=this.slidesContainer.querySelector(\".current\");n&&d(n,\"current\"),this.slideAnimateOut();var s=this.slidesContainer.querySelectorAll(\".gslide\")[t];if(c(s,\"loaded\"))this.slideAnimateIn(s,i),p(this.loader);else{f(this.loader);var l=this.elements[t],o={index:this.index,slide:s,slideNode:s,slideConfig:l.slideConfig,slideIndex:this.index,trigger:l.node,player:null};this.trigger(\"slide_before_load\",o),l.instance.setContent(s,(function(){p(e.loader),e.resize(),e.slideAnimateIn(s,i),e.trigger(\"slide_after_load\",o)}))}this.slideDescription=s.querySelector(\".gslide-description\"),this.slideDescriptionContained=this.slideDescription&&c(this.slideDescription.parentNode,\"gslide-media\"),this.settings.preload&&(this.preloadSlide(t+1),this.preloadSlide(t-1)),this.updateNavigationClasses(),this.activeSlide=s}},{key:\"preloadSlide\",value:function(e){var t=this;if(e<0||e>this.elements.length-1)return!1;if(I(this.elements[e]))return!1;var i=this.slidesContainer.querySelectorAll(\".gslide\")[e];if(c(i,\"loaded\"))return!1;var n=this.elements[e],s=n.type,l={index:e,slide:i,slideNode:i,slideConfig:n.slideConfig,slideIndex:e,trigger:n.node,player:null};this.trigger(\"slide_before_load\",l),\"video\"===s||\"external\"===s?setTimeout((function(){n.instance.setContent(i,(function(){t.trigger(\"slide_after_load\",l)}))}),200):n.instance.setContent(i,(function(){t.trigger(\"slide_after_load\",l)}))}},{key:\"prevSlide\",value:function(){this.goToSlide(this.index-1)}},{key:\"nextSlide\",value:function(){this.goToSlide(this.index+1)}},{key:\"goToSlide\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.prevActiveSlide=this.activeSlide,this.prevActiveSlideIndex=this.index,!this.loop()&&(e<0||e>this.elements.length-1))return!1;e<0?e=this.elements.length-1:e>=this.elements.length&&(e=0),this.showSlide(e)}},{key:\"insertSlide\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;t<0&&(t=this.elements.length);var i=new $(e,this,t),n=i.getConfig(),s=l({},n),o=i.create(),r=this.elements.length-1;s.index=t,s.node=!1,s.instance=i,s.slideConfig=n,this.elements.splice(t,0,s);var a=null,h=null;if(this.slidesContainer){if(t>r)this.slidesContainer.appendChild(o);else{var d=this.slidesContainer.querySelectorAll(\".gslide\")[t];this.slidesContainer.insertBefore(o,d)}(this.settings.preload&&0==this.index&&0==t||this.index-1==t||this.index+1==t)&&this.preloadSlide(t),0===this.index&&0===t&&(this.index=1),this.updateNavigationClasses(),a=this.slidesContainer.querySelectorAll(\".gslide\")[t],h=this.getSlidePlayerInstance(t),s.slideNode=a}this.trigger(\"slide_inserted\",{index:t,slide:a,slideNode:a,slideConfig:n,slideIndex:t,trigger:null,player:h}),T(this.settings.slideInserted)&&this.settings.slideInserted({index:t,slide:a,player:h})}},{key:\"removeSlide\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(e<0||e>this.elements.length-1)return!1;var t=this.slidesContainer&&this.slidesContainer.querySelectorAll(\".gslide\")[e];t&&(this.getActiveSlideIndex()==e&&(e==this.elements.length-1?this.prevSlide():this.nextSlide()),t.parentNode.removeChild(t)),this.elements.splice(e,1),this.trigger(\"slide_removed\",e),T(this.settings.slideRemoved)&&this.settings.slideRemoved(e)}},{key:\"slideAnimateIn\",value:function(e,t){var i=this,n=e.querySelector(\".gslide-media\"),s=e.querySelector(\".gslide-description\"),l={index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlide,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},o={index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideConfig:this.elements[this.index].slideConfig,slideIndex:this.index,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)};if(n.offsetWidth>0&&s&&(p(s),s.style.display=\"\"),d(e,this.effectsClasses),t)g(e,this.settings.cssEfects[this.settings.openEffect].in,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger(\"slide_changed\",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}));else{var r=this.settings.slideEffect,a=\"none\"!==r?this.settings.cssEfects[r].in:r;this.prevActiveSlideIndex>this.index&&\"slide\"==this.settings.slideEffect&&(a=this.settings.cssEfects.slideBack.in),g(e,a,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger(\"slide_changed\",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}))}setTimeout((function(){i.resize(e)}),100),h(e,\"current\")}},{key:\"slideAnimateOut\",value:function(){if(!this.prevActiveSlide)return!1;var e=this.prevActiveSlide;d(e,this.effectsClasses),h(e,\"prev\");var t=this.settings.slideEffect,i=\"none\"!==t?this.settings.cssEfects[t].out:t;this.slidePlayerPause(e),this.trigger(\"slide_before_change\",{prev:{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlideIndex,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},current:{index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideIndex:this.index,slideConfig:this.elements[this.index].slideConfig,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)}}),T(this.settings.beforeSlideChange)&&this.settings.beforeSlideChange.apply(this,[{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},{index:this.index,slide:this.activeSlide,player:this.getSlidePlayerInstance(this.index)}]),this.prevActiveSlideIndex>this.index&&\"slide\"==this.settings.slideEffect&&(i=this.settings.cssEfects.slideBack.out),g(e,i,(function(){var t=e.querySelector(\".ginner-container\"),i=e.querySelector(\".gslide-media\"),n=e.querySelector(\".gslide-description\");t.style.transform=\"\",i.style.transform=\"\",d(i,\"greset\"),i.style.opacity=\"\",n&&(n.style.opacity=\"\"),d(e,\"prev\")}))}},{key:\"getAllPlayers\",value:function(){return this.videoPlayers}},{key:\"getSlidePlayerInstance\",value:function(e){var t=\"gvideo\"+e,i=this.getAllPlayers();return!(!O(i,t)||!i[t])&&i[t]}},{key:\"stopSlideVideo\",value:function(e){if(k(e)){var t=e.querySelector(\".gvideo-wrapper\");t&&(e=t.getAttribute(\"data-index\"))}console.log(\"stopSlideVideo is deprecated, use slidePlayerPause\");var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:\"slidePlayerPause\",value:function(e){if(k(e)){var t=e.querySelector(\".gvideo-wrapper\");t&&(e=t.getAttribute(\"data-index\"))}var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:\"playSlideVideo\",value:function(e){if(k(e)){var t=e.querySelector(\".gvideo-wrapper\");t&&(e=t.getAttribute(\"data-index\"))}console.log(\"playSlideVideo is deprecated, use slidePlayerPlay\");var i=this.getSlidePlayerInstance(e);i&&!i.playing&&i.play()}},{key:\"slidePlayerPlay\",value:function(e){var t;if(!J||null!==(t=this.settings.plyr.config)&&void 0!==t&&t.muted){if(k(e)){var i=e.querySelector(\".gvideo-wrapper\");i&&(e=i.getAttribute(\"data-index\"))}var n=this.getSlidePlayerInstance(e);n&&!n.playing&&(n.play(),this.settings.autofocusVideos&&n.elements.container.focus())}}},{key:\"setElements\",value:function(e){var t=this;this.settings.elements=!1;var i=[];e&&e.length&&o(e,(function(e,n){var s=new $(e,t,n),o=s.getConfig(),r=l({},o);r.slideConfig=o,r.instance=s,r.index=n,i.push(r)})),this.elements=i,this.lightboxOpen&&(this.slidesContainer.innerHTML=\"\",this.elements.length&&(o(this.elements,(function(){var e=m(t.settings.slideHTML);t.slidesContainer.appendChild(e)})),this.showSlide(0,!0)))}},{key:\"getElementIndex\",value:function(e){var t=!1;return o(this.elements,(function(i,n){if(O(i,\"node\")&&i.node==e)return t=n,!0})),t}},{key:\"getElements\",value:function(){var e=this,t=[];this.elements=this.elements?this.elements:[],!I(this.settings.elements)&&E(this.settings.elements)&&this.settings.elements.length&&o(this.settings.elements,(function(i,n){var s=new $(i,e,n),o=s.getConfig(),r=l({},o);r.node=!1,r.index=n,r.instance=s,r.slideConfig=o,t.push(r)}));var i=!1;return this.getSelector()&&(i=document.querySelectorAll(this.getSelector())),i?(o(i,(function(i,n){var s=new $(i,e,n),o=s.getConfig(),r=l({},o);r.node=i,r.index=n,r.instance=s,r.slideConfig=o,r.gallery=i.getAttribute(\"data-gallery\"),t.push(r)})),t):t}},{key:\"getGalleryElements\",value:function(e,t){return e.filter((function(e){return e.gallery==t}))}},{key:\"getSelector\",value:function(){return!this.settings.elements&&(this.settings.selector&&\"data-\"==this.settings.selector.substring(0,5)?\"*[\".concat(this.settings.selector,\"]\"):this.settings.selector)}},{key:\"getActiveSlide\",value:function(){return this.slidesContainer.querySelectorAll(\".gslide\")[this.index]}},{key:\"getActiveSlideIndex\",value:function(){return this.index}},{key:\"getAnimationClasses\",value:function(){var e=[];for(var t in this.settings.cssEfects)if(this.settings.cssEfects.hasOwnProperty(t)){var i=this.settings.cssEfects[t];e.push(\"g\".concat(i.in)),e.push(\"g\".concat(i.out))}return e.join(\" \")}},{key:\"build\",value:function(){var e=this;if(this.built)return!1;var t=document.body.childNodes,i=[];o(t,(function(e){e.parentNode==document.body&&\"#\"!==e.nodeName.charAt(0)&&e.hasAttribute&&!e.hasAttribute(\"aria-hidden\")&&(i.push(e),e.setAttribute(\"aria-hidden\",\"true\"))}));var n=O(this.settings.svg,\"next\")?this.settings.svg.next:\"\",s=O(this.settings.svg,\"prev\")?this.settings.svg.prev:\"\",l=O(this.settings.svg,\"close\")?this.settings.svg.close:\"\",r=this.settings.lightboxHTML;r=m(r=(r=(r=r.replace(/{nextSVG}/g,n)).replace(/{prevSVG}/g,s)).replace(/{closeSVG}/g,l)),document.body.appendChild(r);var d=document.getElementById(\"glightbox-body\");this.modal=d;var g=d.querySelector(\".gclose\");this.prevButton=d.querySelector(\".gprev\"),this.nextButton=d.querySelector(\".gnext\"),this.overlay=d.querySelector(\".goverlay\"),this.loader=d.querySelector(\".gloader\"),this.slidesContainer=document.getElementById(\"glightbox-slider\"),this.bodyHiddenChildElms=i,this.events={},h(this.modal,\"glightbox-\"+this.settings.skin),this.settings.closeButton&&g&&(this.events.close=a(\"click\",{onElement:g,withCallback:function(t,i){t.preventDefault(),e.close()}})),g&&!this.settings.closeButton&&g.parentNode.removeChild(g),this.nextButton&&(this.events.next=a(\"click\",{onElement:this.nextButton,withCallback:function(t,i){t.preventDefault(),e.nextSlide()}})),this.prevButton&&(this.events.prev=a(\"click\",{onElement:this.prevButton,withCallback:function(t,i){t.preventDefault(),e.prevSlide()}})),this.settings.closeOnOutsideClick&&(this.events.outClose=a(\"click\",{onElement:d,withCallback:function(t,i){e.preventOutsideClick||c(document.body,\"glightbox-mobile\")||u(t.target,\".ginner-container\")||u(t.target,\".gbtn\")||c(t.target,\"gnext\")||c(t.target,\"gprev\")||e.close()}})),o(this.elements,(function(t,i){e.slidesContainer.appendChild(t.instance.create()),t.slideNode=e.slidesContainer.querySelectorAll(\".gslide\")[i]})),K&&h(document.body,\"glightbox-touch\"),this.events.resize=a(\"resize\",{onElement:window,withCallback:function(){e.resize()}}),this.built=!0}},{key:\"resize\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if((e=e||this.activeSlide)&&!c(e,\"zoomed\")){var t=y(),i=e.querySelector(\".gvideo-wrapper\"),n=e.querySelector(\".gslide-image\"),s=this.slideDescription,l=t.width,o=t.height;if(l<=768?h(document.body,\"glightbox-mobile\"):d(document.body,\"glightbox-mobile\"),i||n){var r=!1;if(s&&(c(s,\"description-bottom\")||c(s,\"description-top\"))&&!c(s,\"gabsolute\")&&(r=!0),n)if(l<=768)n.querySelector(\"img\");else if(r){var a=s.offsetHeight,u=n.querySelector(\"img\");u.setAttribute(\"style\",\"max-height: calc(100vh - \".concat(a,\"px)\")),s.setAttribute(\"style\",\"max-width: \".concat(u.offsetWidth,\"px;\"))}if(i){var g=O(this.settings.plyr.config,\"ratio\")?this.settings.plyr.config.ratio:\"\";if(!g){var v=i.clientWidth,f=i.clientHeight,p=v/f;g=\"\".concat(v/p,\":\").concat(f/p)}var m=g.split(\":\"),x=this.settings.videosWidth,b=this.settings.videosWidth,S=(b=M(x)||-1!==x.indexOf(\"px\")?parseInt(x):-1!==x.indexOf(\"vw\")?l*parseInt(x)/100:-1!==x.indexOf(\"vh\")?o*parseInt(x)/100:-1!==x.indexOf(\"%\")?l*parseInt(x)/100:parseInt(i.clientWidth))/(parseInt(m[0])/parseInt(m[1]));if(S=Math.floor(S),r&&(o-=s.offsetHeight),b>l||S>o||ob){var w=i.offsetWidth,T=i.offsetHeight,C=o/T,k={width:w*C,height:T*C};i.parentNode.setAttribute(\"style\",\"max-width: \".concat(k.width,\"px\")),r&&s.setAttribute(\"style\",\"max-width: \".concat(k.width,\"px;\"))}else i.parentNode.style.maxWidth=\"\".concat(x),r&&s.setAttribute(\"style\",\"max-width: \".concat(x,\";\"))}}}}},{key:\"reload\",value:function(){this.init()}},{key:\"updateNavigationClasses\",value:function(){var e=this.loop();d(this.nextButton,\"disabled\"),d(this.prevButton,\"disabled\"),0==this.index&&this.elements.length-1==0?(h(this.prevButton,\"disabled\"),h(this.nextButton,\"disabled\")):0!==this.index||e?this.index!==this.elements.length-1||e||h(this.nextButton,\"disabled\"):h(this.prevButton,\"disabled\")}},{key:\"loop\",value:function(){var e=O(this.settings,\"loopAtEnd\")?this.settings.loopAtEnd:null;return e=O(this.settings,\"loop\")?this.settings.loop:e,e}},{key:\"close\",value:function(){var e=this;if(!this.lightboxOpen){if(this.events){for(var t in this.events)this.events.hasOwnProperty(t)&&this.events[t].destroy();this.events=null}return!1}if(this.closing)return!1;this.closing=!0,this.slidePlayerPause(this.activeSlide),this.fullElementsList&&(this.elements=this.fullElementsList),this.bodyHiddenChildElms.length&&o(this.bodyHiddenChildElms,(function(e){e.removeAttribute(\"aria-hidden\")})),h(this.modal,\"glightbox-closing\"),g(this.overlay,\"none\"==this.settings.openEffect?\"none\":this.settings.cssEfects.fade.out),g(this.activeSlide,this.settings.cssEfects[this.settings.closeEffect].out,(function(){if(e.activeSlide=null,e.prevActiveSlideIndex=null,e.prevActiveSlide=null,e.built=!1,e.events){for(var t in e.events)e.events.hasOwnProperty(t)&&e.events[t].destroy();e.events=null}var i=document.body;d(Q,\"glightbox-open\"),d(i,\"glightbox-open touching gdesc-open glightbox-touch glightbox-mobile gscrollbar-fixer\"),e.modal.parentNode.removeChild(e.modal),e.trigger(\"close\"),T(e.settings.onClose)&&e.settings.onClose();var n=document.querySelector(\".gcss-styles\");n&&n.parentNode.removeChild(n),e.lightboxOpen=!1,e.closing=null}))}},{key:\"destroy\",value:function(){this.close(),this.clearAllEvents(),this.baseEvents&&this.baseEvents.destroy()}},{key:\"on\",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||!T(t))throw new TypeError(\"Event name and callback must be defined\");this.apiEvents.push({evt:e,once:i,callback:t})}},{key:\"once\",value:function(e,t){this.on(e,t,!0)}},{key:\"trigger\",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=[];o(this.apiEvents,(function(t,s){var l=t.evt,o=t.once,r=t.callback;l==e&&(r(i),o&&n.push(s))})),n.length&&o(n,(function(e){return t.apiEvents.splice(e,1)}))}},{key:\"clearAllEvents\",value:function(){this.apiEvents.splice(0,this.apiEvents.length)}},{key:\"version\",value:function(){return\"3.1.0\"}}]),e}();return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new te(e);return t.init(),t}}));\n\n//# sourceURL=webpack://startup-tailwind/./node_modules/glightbox/dist/js/glightbox.min.js?");}),"./node_modules/glightbox/dist/css/glightbox.min.css":/*!***********************************************************!*\ +!*** ./node_modules/glightbox/dist/css/glightbox.min.css ***! +\***********************************************************/((__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://startup-tailwind/./node_modules/glightbox/dist/css/glightbox.min.css?");}),"./src/css/animate.css":/*!*****************************!*\ +!*** ./src/css/animate.css ***! +\*****************************/((__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://startup-tailwind/./src/css/animate.css?");}),"./src/css/style.css":/*!***************************!*\ +!*** ./src/css/style.css ***! +\***************************/((__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://startup-tailwind/./src/css/style.css?");}),"./node_modules/wowjs/dist/wow.js":/*!****************************************!*\ +!*** ./node_modules/wowjs/dist/wow.js ***! +\****************************************/(function(){eval("(function() {\n var MutationObserver, Util, WeakMap, getComputedStyle, getComputedStyleRX,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n Util = (function() {\n function Util() {}\n\n Util.prototype.extend = function(custom, defaults) {\n var key, value;\n for (key in defaults) {\n value = defaults[key];\n if (custom[key] == null) {\n custom[key] = value;\n }\n }\n return custom;\n };\n\n Util.prototype.isMobile = function(agent) {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent);\n };\n\n Util.prototype.createEvent = function(event, bubble, cancel, detail) {\n var customEvent;\n if (bubble == null) {\n bubble = false;\n }\n if (cancel == null) {\n cancel = false;\n }\n if (detail == null) {\n detail = null;\n }\n if (document.createEvent != null) {\n customEvent = document.createEvent('CustomEvent');\n customEvent.initCustomEvent(event, bubble, cancel, detail);\n } else if (document.createEventObject != null) {\n customEvent = document.createEventObject();\n customEvent.eventType = event;\n } else {\n customEvent.eventName = event;\n }\n return customEvent;\n };\n\n Util.prototype.emitEvent = function(elem, event) {\n if (elem.dispatchEvent != null) {\n return elem.dispatchEvent(event);\n } else if (event in (elem != null)) {\n return elem[event]();\n } else if ((\"on\" + event) in (elem != null)) {\n return elem[\"on\" + event]();\n }\n };\n\n Util.prototype.addEvent = function(elem, event, fn) {\n if (elem.addEventListener != null) {\n return elem.addEventListener(event, fn, false);\n } else if (elem.attachEvent != null) {\n return elem.attachEvent(\"on\" + event, fn);\n } else {\n return elem[event] = fn;\n }\n };\n\n Util.prototype.removeEvent = function(elem, event, fn) {\n if (elem.removeEventListener != null) {\n return elem.removeEventListener(event, fn, false);\n } else if (elem.detachEvent != null) {\n return elem.detachEvent(\"on\" + event, fn);\n } else {\n return delete elem[event];\n }\n };\n\n Util.prototype.innerHeight = function() {\n if ('innerHeight' in window) {\n return window.innerHeight;\n } else {\n return document.documentElement.clientHeight;\n }\n };\n\n return Util;\n\n })();\n\n WeakMap = this.WeakMap || this.MozWeakMap || (WeakMap = (function() {\n function WeakMap() {\n this.keys = [];\n this.values = [];\n }\n\n WeakMap.prototype.get = function(key) {\n var i, item, j, len, ref;\n ref = this.keys;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n item = ref[i];\n if (item === key) {\n return this.values[i];\n }\n }\n };\n\n WeakMap.prototype.set = function(key, value) {\n var i, item, j, len, ref;\n ref = this.keys;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n item = ref[i];\n if (item === key) {\n this.values[i] = value;\n return;\n }\n }\n this.keys.push(key);\n return this.values.push(value);\n };\n\n return WeakMap;\n\n })());\n\n MutationObserver = this.MutationObserver || this.WebkitMutationObserver || this.MozMutationObserver || (MutationObserver = (function() {\n function MutationObserver() {\n if (typeof console !== \"undefined\" && console !== null) {\n console.warn('MutationObserver is not supported by your browser.');\n }\n if (typeof console !== \"undefined\" && console !== null) {\n console.warn('WOW.js cannot detect dom mutations, please call .sync() after loading new content.');\n }\n }\n\n MutationObserver.notSupported = true;\n\n MutationObserver.prototype.observe = function() {};\n\n return MutationObserver;\n\n })());\n\n getComputedStyle = this.getComputedStyle || function(el, pseudo) {\n this.getPropertyValue = function(prop) {\n var ref;\n if (prop === 'float') {\n prop = 'styleFloat';\n }\n if (getComputedStyleRX.test(prop)) {\n prop.replace(getComputedStyleRX, function(_, _char) {\n return _char.toUpperCase();\n });\n }\n return ((ref = el.currentStyle) != null ? ref[prop] : void 0) || null;\n };\n return this;\n };\n\n getComputedStyleRX = /(\\-([a-z]){1})/g;\n\n this.WOW = (function() {\n WOW.prototype.defaults = {\n boxClass: 'wow',\n animateClass: 'animated',\n offset: 0,\n mobile: true,\n live: true,\n callback: null,\n scrollContainer: null\n };\n\n function WOW(options) {\n if (options == null) {\n options = {};\n }\n this.scrollCallback = bind(this.scrollCallback, this);\n this.scrollHandler = bind(this.scrollHandler, this);\n this.resetAnimation = bind(this.resetAnimation, this);\n this.start = bind(this.start, this);\n this.scrolled = true;\n this.config = this.util().extend(options, this.defaults);\n if (options.scrollContainer != null) {\n this.config.scrollContainer = document.querySelector(options.scrollContainer);\n }\n this.animationNameCache = new WeakMap();\n this.wowEvent = this.util().createEvent(this.config.boxClass);\n }\n\n WOW.prototype.init = function() {\n var ref;\n this.element = window.document.documentElement;\n if ((ref = document.readyState) === \"interactive\" || ref === \"complete\") {\n this.start();\n } else {\n this.util().addEvent(document, 'DOMContentLoaded', this.start);\n }\n return this.finished = [];\n };\n\n WOW.prototype.start = function() {\n var box, j, len, ref;\n this.stopped = false;\n this.boxes = (function() {\n var j, len, ref, results;\n ref = this.element.querySelectorAll(\".\" + this.config.boxClass);\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n box = ref[j];\n results.push(box);\n }\n return results;\n }).call(this);\n this.all = (function() {\n var j, len, ref, results;\n ref = this.boxes;\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n box = ref[j];\n results.push(box);\n }\n return results;\n }).call(this);\n if (this.boxes.length) {\n if (this.disabled()) {\n this.resetStyle();\n } else {\n ref = this.boxes;\n for (j = 0, len = ref.length; j < len; j++) {\n box = ref[j];\n this.applyStyle(box, true);\n }\n }\n }\n if (!this.disabled()) {\n this.util().addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);\n this.util().addEvent(window, 'resize', this.scrollHandler);\n this.interval = setInterval(this.scrollCallback, 50);\n }\n if (this.config.live) {\n return new MutationObserver((function(_this) {\n return function(records) {\n var k, len1, node, record, results;\n results = [];\n for (k = 0, len1 = records.length; k < len1; k++) {\n record = records[k];\n results.push((function() {\n var l, len2, ref1, results1;\n ref1 = record.addedNodes || [];\n results1 = [];\n for (l = 0, len2 = ref1.length; l < len2; l++) {\n node = ref1[l];\n results1.push(this.doSync(node));\n }\n return results1;\n }).call(_this));\n }\n return results;\n };\n })(this)).observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n };\n\n WOW.prototype.stop = function() {\n this.stopped = true;\n this.util().removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);\n this.util().removeEvent(window, 'resize', this.scrollHandler);\n if (this.interval != null) {\n return clearInterval(this.interval);\n }\n };\n\n WOW.prototype.sync = function(element) {\n if (MutationObserver.notSupported) {\n return this.doSync(this.element);\n }\n };\n\n WOW.prototype.doSync = function(element) {\n var box, j, len, ref, results;\n if (element == null) {\n element = this.element;\n }\n if (element.nodeType !== 1) {\n return;\n }\n element = element.parentNode || element;\n ref = element.querySelectorAll(\".\" + this.config.boxClass);\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n box = ref[j];\n if (indexOf.call(this.all, box) < 0) {\n this.boxes.push(box);\n this.all.push(box);\n if (this.stopped || this.disabled()) {\n this.resetStyle();\n } else {\n this.applyStyle(box, true);\n }\n results.push(this.scrolled = true);\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n WOW.prototype.show = function(box) {\n this.applyStyle(box);\n box.className = box.className + \" \" + this.config.animateClass;\n if (this.config.callback != null) {\n this.config.callback(box);\n }\n this.util().emitEvent(box, this.wowEvent);\n this.util().addEvent(box, 'animationend', this.resetAnimation);\n this.util().addEvent(box, 'oanimationend', this.resetAnimation);\n this.util().addEvent(box, 'webkitAnimationEnd', this.resetAnimation);\n this.util().addEvent(box, 'MSAnimationEnd', this.resetAnimation);\n return box;\n };\n\n WOW.prototype.applyStyle = function(box, hidden) {\n var delay, duration, iteration;\n duration = box.getAttribute('data-wow-duration');\n delay = box.getAttribute('data-wow-delay');\n iteration = box.getAttribute('data-wow-iteration');\n return this.animate((function(_this) {\n return function() {\n return _this.customStyle(box, hidden, duration, delay, iteration);\n };\n })(this));\n };\n\n WOW.prototype.animate = (function() {\n if ('requestAnimationFrame' in window) {\n return function(callback) {\n return window.requestAnimationFrame(callback);\n };\n } else {\n return function(callback) {\n return callback();\n };\n }\n })();\n\n WOW.prototype.resetStyle = function() {\n var box, j, len, ref, results;\n ref = this.boxes;\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n box = ref[j];\n results.push(box.style.visibility = 'visible');\n }\n return results;\n };\n\n WOW.prototype.resetAnimation = function(event) {\n var target;\n if (event.type.toLowerCase().indexOf('animationend') >= 0) {\n target = event.target || event.srcElement;\n return target.className = target.className.replace(this.config.animateClass, '').trim();\n }\n };\n\n WOW.prototype.customStyle = function(box, hidden, duration, delay, iteration) {\n if (hidden) {\n this.cacheAnimationName(box);\n }\n box.style.visibility = hidden ? 'hidden' : 'visible';\n if (duration) {\n this.vendorSet(box.style, {\n animationDuration: duration\n });\n }\n if (delay) {\n this.vendorSet(box.style, {\n animationDelay: delay\n });\n }\n if (iteration) {\n this.vendorSet(box.style, {\n animationIterationCount: iteration\n });\n }\n this.vendorSet(box.style, {\n animationName: hidden ? 'none' : this.cachedAnimationName(box)\n });\n return box;\n };\n\n WOW.prototype.vendors = [\"moz\", \"webkit\"];\n\n WOW.prototype.vendorSet = function(elem, properties) {\n var name, results, value, vendor;\n results = [];\n for (name in properties) {\n value = properties[name];\n elem[\"\" + name] = value;\n results.push((function() {\n var j, len, ref, results1;\n ref = this.vendors;\n results1 = [];\n for (j = 0, len = ref.length; j < len; j++) {\n vendor = ref[j];\n results1.push(elem[\"\" + vendor + (name.charAt(0).toUpperCase()) + (name.substr(1))] = value);\n }\n return results1;\n }).call(this));\n }\n return results;\n };\n\n WOW.prototype.vendorCSS = function(elem, property) {\n var j, len, ref, result, style, vendor;\n style = getComputedStyle(elem);\n result = style.getPropertyCSSValue(property);\n ref = this.vendors;\n for (j = 0, len = ref.length; j < len; j++) {\n vendor = ref[j];\n result = result || style.getPropertyCSSValue(\"-\" + vendor + \"-\" + property);\n }\n return result;\n };\n\n WOW.prototype.animationName = function(box) {\n var animationName, error;\n try {\n animationName = this.vendorCSS(box, 'animation-name').cssText;\n } catch (error) {\n animationName = getComputedStyle(box).getPropertyValue('animation-name');\n }\n if (animationName === 'none') {\n return '';\n } else {\n return animationName;\n }\n };\n\n WOW.prototype.cacheAnimationName = function(box) {\n return this.animationNameCache.set(box, this.animationName(box));\n };\n\n WOW.prototype.cachedAnimationName = function(box) {\n return this.animationNameCache.get(box);\n };\n\n WOW.prototype.scrollHandler = function() {\n return this.scrolled = true;\n };\n\n WOW.prototype.scrollCallback = function() {\n var box;\n if (this.scrolled) {\n this.scrolled = false;\n this.boxes = (function() {\n var j, len, ref, results;\n ref = this.boxes;\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n box = ref[j];\n if (!(box)) {\n continue;\n }\n if (this.isVisible(box)) {\n this.show(box);\n continue;\n }\n results.push(box);\n }\n return results;\n }).call(this);\n if (!(this.boxes.length || this.config.live)) {\n return this.stop();\n }\n }\n };\n\n WOW.prototype.offsetTop = function(element) {\n var top;\n while (element.offsetTop === void 0) {\n element = element.parentNode;\n }\n top = element.offsetTop;\n while (element = element.offsetParent) {\n top += element.offsetTop;\n }\n return top;\n };\n\n WOW.prototype.isVisible = function(box) {\n var bottom, offset, top, viewBottom, viewTop;\n offset = box.getAttribute('data-wow-offset') || this.config.offset;\n viewTop = (this.config.scrollContainer && this.config.scrollContainer.scrollTop) || window.pageYOffset;\n viewBottom = viewTop + Math.min(this.element.clientHeight, this.util().innerHeight()) - offset;\n top = this.offsetTop(box);\n bottom = top + box.clientHeight;\n return top <= viewBottom && bottom >= viewTop;\n };\n\n WOW.prototype.util = function() {\n return this._util != null ? this._util : this._util = new Util();\n };\n\n WOW.prototype.disabled = function() {\n return !this.config.mobile && this.util().isMobile(navigator.userAgent);\n };\n\n return WOW;\n\n })();\n\n}).call(this);\n\n\n//# sourceURL=webpack://startup-tailwind/./node_modules/wowjs/dist/wow.js?");})});var __webpack_module_cache__={};function __webpack_require__(moduleId){var cachedModule=__webpack_module_cache__[moduleId];if(cachedModule!==undefined){return cachedModule.exports;} +var module=__webpack_module_cache__[moduleId]={exports:{}};__webpack_modules__[moduleId].call(module.exports,module,module.exports,__webpack_require__);return module.exports;} +(()=>{__webpack_require__.n=(module)=>{var getter=module&&module.__esModule?()=>(module['default']):()=>(module);__webpack_require__.d(getter,{a:getter});return getter;};})();(()=>{__webpack_require__.d=(exports,definition)=>{for(var key in definition){if(__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports,key)){Object.defineProperty(exports,key,{enumerable:true,get:definition[key]});}}};})();(()=>{__webpack_require__.o=(obj,prop)=>(Object.prototype.hasOwnProperty.call(obj,prop))})();(()=>{__webpack_require__.r=(exports)=>{if(typeof Symbol!=='undefined'&&Symbol.toStringTag){Object.defineProperty(exports,Symbol.toStringTag,{value:'Module'});} +Object.defineProperty(exports,'__esModule',{value:true});};})();var __webpack_exports__=__webpack_require__("./src/js/index.js");})(); diff --git a/app-rappaurio/public/js/custom.js b/app-rappaurio/public/js/custom.js new file mode 100644 index 0000000..b3aa895 --- /dev/null +++ b/app-rappaurio/public/js/custom.js @@ -0,0 +1,368 @@ + +// === SCROLL MENU === +const pageLink = document.querySelectorAll('.menu-scroll'); + +pageLink.forEach((elem) => { + elem.addEventListener('click', (e) => { + e.preventDefault(); + document.querySelector(elem.getAttribute('href')).scrollIntoView({ + behavior: 'smooth', + offsetTop: 1 - 60, + }); + }); +}); + +// section menu active +function onScroll(event) { + const sections = document.querySelectorAll('.menu-scroll'); + const scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; + + for (let i = 0; i < sections.length; i++) { + const currLink = sections[i]; + const val = currLink.getAttribute('href'); + const refElement = document.querySelector(val); + const scrollTopMinus = scrollPos + 73; + if (refElement.offsetTop <= scrollTopMinus && refElement.offsetTop + refElement.offsetHeight > scrollTopMinus) { + document.querySelector('.menu-scroll').classList.remove('active'); + currLink.classList.add('active'); + } else { + currLink.classList.remove('active'); + } + } +} + +window.document.addEventListener('scroll', onScroll); + +// === FOOTER DYNAMIC === + +// Sélectionnez le footer par son ID +const footer = document.getElementById('leFooter'); + +// Fonction pour positionner le footer en bas de la page +function positionFooter() { + const windowHeight = window.innerHeight; + const bodyHeight = document.body.clientHeight; + const footerHeight = footer.clientHeight; + + if (bodyHeight < windowHeight) { + footer.style.position = 'absolute'; + footer.style.bottom = '0'; + } else { + footer.style.position = 'static'; + } +} + +// Appelez la fonction lors du chargement de la page et lorsque la fenêtre est redimensionnée +window.addEventListener('load', positionFooter); +window.addEventListener('resize', positionFooter); + + +// === MODE SOMBRE +> LOCAL STORAGE === + +// Fonction pour lire la valeur du thème depuis localStorage +function getThemeLocalStorage() { + return localStorage.getItem('theme'); +} + +// Fonction pour définir le thème dans localStorage +function setThemeLocalStorage(theme) { + localStorage.setItem('theme', theme); +} + +// Fonction pour mettre à jour la classe sur le en fonction du thème +function updateThemeClass() { + const darkTogglerCheckbox = document.querySelector('#darkToggler'); + const html = document.querySelector('html'); + const theme = getThemeLocalStorage(); + + // Appliquer la classe en fonction de la valeur de localStorage + if (theme === 'dark') { + darkTogglerCheckbox.checked = true; + html.classList.add('dark'); + } else { + darkTogglerCheckbox.checked = false; + html.classList.remove('dark'); + } +} + +// Appeler la fonction d'initialisation de la gestion du thème +updateThemeClass(); + +// Gérer le changement de thème lorsque l'utilisateur clique sur la case à cocher +const darkTogglerCheckbox = document.querySelector('#darkToggler'); +darkTogglerCheckbox.addEventListener('click', function () { + if (darkTogglerCheckbox.checked) { + setThemeLocalStorage('dark'); + } else { + setThemeLocalStorage('light'); + } +}); + +// === ENVOIE FORMULAIRE AVEC AJAX === + +// Attendre que le document soit prêt +$(document).ready(function () { + + // Sélectionnez le formulaire de COMPARAISON par son ID + $('#formulaire-comp').submit(function (e) { + + // Fait scroll une fois le formulaire envoyé + $(document).ready(function () { + // Sélectionnez le lien par son ID + + $('html, body').animate({ + scrollTop: $('#resultat').offset().top + }, 1000); // 1000 millisecondes (1 seconde) pour l'animation + }); + + // Empêchez la soumission normale du formulaire + e.preventDefault(); + + // Affiche le chargement + $('#loading').removeClass('hidden'); + + $('#articleIntrouvable').addClass('hidden'); + $('#articleContainer1').addClass('hidden'); + $('#articleContainer2').addClass('hidden'); + + // Reste du code pour gérer la soumission du formulaire + //console.log('Formulaire soumis !'); + + // Récupérez les valeurs des champs du formulaire + const articleTitle1 = $('#articleTitle1').val(); + const articleTitle2 = $('#articleTitle2').val(); + + // Créez un objet JavaScript avec les données à envoyer au serveur + const formData = { + articleTitle1: articleTitle1, + articleTitle2: articleTitle2 + }; + + // Utilisez AJAX pour envoyer les données au serveur + $.ajax({ + type: 'POST', + url: '/search', + data: formData, + dataType: 'json', + success: function (response) { + console.log(response); + + $('#loading').addClass('hidden'); + $('#articleIntrouvable').removeClass('hidden'); + + // Mettez à jour la section HTML avec les données reçues ici + + // Vérifiez si response.articleInfo1 existe et contient les informations nécessaires + if (response.articleInfo1) { + $('#articleInfo1Title').html(response.articleInfo1.title); + + // Article 1 + $('#articleInfo1Title').html(response.articleInfo1.title); + $('#articleInfo1url').attr('href', response.articleInfo1.url); + $('#articleInfo1extract').html(response.articleInfo1.extract); + $('#articleInfo1lastEdit').html(response.articleInfo1.lastEdit); + $('#articleInfo1numRevisions').html(response.articleInfo1.numRevisions); + $('#articleInfo1pageSize').html(response.articleInfo1.pageSize); + $('#articleInfo1firstRevisionUser').html(response.articleInfo1.firstRevisionUser); + $('#articleInfo1latestRevisionId').html(response.articleInfo1.latestRevisionId); + $('#articleInfo1pageId').html(response.articleInfo1.pageId); + $('#articleInfo1latestVersion').html(response.articleInfo1.latestVersion); + $('#articleInfo1wordCount').html(response.articleInfo1.wordCount); + $('#articleInfo1charCount').html(response.articleInfo1.charCount); + $('#articleInfo1lastContributor').html(response.articleInfo1.lastContributor); + $('#articleInfo1image').attr('href', response.articleInfo1.image); + $('#articleInfo1image img').attr('src', response.articleInfo1.image); + + // Récupérez la valeur de l'image + const articleInfo1ImageValue = response.articleInfo1.image; + + // Récupérez l'élément image par son ID + const articleInfo1Image = document.getElementById("articleInfo1image"); + + if (articleInfo1ImageValue === "Non disponible") { + // Si la valeur est "Non disponible", masquez l'élément + articleInfo1Image.style.display = "none"; + } else { + // Sinon, affichez l'élément + articleInfo1Image.style.display = "block"; // Vous pouvez utiliser "inline" si nécessaire + // Assurez-vous de définir la source de l'image ici en fonction de votre logique + articleInfo1Image.src = articleInfo1ImageValue; + } + + + const infoboxContainer1 = document.getElementById("infoboxcontainer1"); + // Supprimer le contenu précédent de l'infobox + while (infoboxContainer1.firstChild) { + infoboxContainer1.removeChild(infoboxContainer1.firstChild); + } + // Ajouter les nouvelles informations pour articleInfo1 + const infoboxData1 = response.articleInfo1.infobox; + Object.entries(infoboxData1).forEach(([key, value]) => { + const ligne = document.createElement("tr"); + ligne.innerHTML = `${key} ${value}`; + infoboxContainer1.appendChild(ligne); + }); + } else { + // Traitez le cas où response.articleInfo1 n'existe pas + } + + + // Vérifiez si response.articleInfo2 existe et contient les informations nécessaires + if (response.articleInfo2) { + $('#articleInfo2Title').html(response.articleInfo2.title); + + // Article 2 + $('#articleInfo2Title').html(response.articleInfo2.title); + $('#articleInfo2url').attr('href', response.articleInfo2.url); + $('#articleInfo2extract').html(response.articleInfo2.extract); + $('#articleInfo2lastEdit').html(response.articleInfo2.lastEdit); + $('#articleInfo2numRevisions').html(response.articleInfo2.numRevisions); + $('#articleInfo2pageSize').html(response.articleInfo2.pageSize); + $('#articleInfo2firstRevisionUser').html(response.articleInfo2.firstRevisionUser); + $('#articleInfo2latestRevisionId').html(response.articleInfo2.latestRevisionId); + $('#articleInfo2pageId').html(response.articleInfo2.pageId); + $('#articleInfo2latestVersion').html(response.articleInfo2.latestVersion); + $('#articleInfo2wordCount').html(response.articleInfo2.wordCount); + $('#articleInfo2charCount').html(response.articleInfo2.charCount); + $('#articleInfo2lastContributor').html(response.articleInfo2.lastContributor); + $('#articleInfo2image').attr('href', response.articleInfo2.image); + $('#articleInfo2image img').attr('src', response.articleInfo2.image); + + + // Récupérez la valeur de l'image + const articleInfo2ImageValue = response.articleInfo2.image; + + // Récupérez l'élément image par son ID + const articleInfo2Image = document.getElementById("articleInfo2image"); + + if (articleInfo2ImageValue === "Non disponible") { + // Si la valeur est "Non disponible", masquez l'élément + articleInfo2Image.style.display = "none"; + } else { + // Sinon, affichez l'élément + articleInfo2Image.style.display = "block"; // Vous pouvez utiliser "inline" si nécessaire + // Assurez-vous de définir la source de l'image ici en fonction de votre logique + articleInfo2Image.src = articleInfo2ImageValue; + } + + const infoboxContainer2 = document.getElementById("infoboxcontainer2"); + // Supprimer le contenu précédent de l'infobox + while (infoboxContainer2.firstChild) { + infoboxContainer2.removeChild(infoboxContainer2.firstChild); + } + // Ajouter les nouvelles informations pour articleInfo2 + const infoboxData2 = response.articleInfo2.infobox; + Object.entries(infoboxData2).forEach(([key, value]) => { + const ligne = document.createElement("tr"); + ligne.innerHTML = `${key} ${value}`; + infoboxContainer2.appendChild(ligne); + }); + } else { + // Traitez le cas où response.articleInfo2 n'existe pas + } + + // Vérifiez si toutes les informations nécessaires sont disponibles + const allInfoAvailable = checkIfAllInfoAvailable(response); + + if (allInfoAvailable) { + $('#articleContainer1').removeClass('hidden'); + $('#articleContainer2').removeClass('hidden'); + $('#articleIntrouvable').addClass('hidden'); + + $(document).ready(function () { + // Sélectionnez le lien par son ID + $('html, body').animate({ + scrollTop: $('#resultat').offset().top + }, 1000); // 1000 millisecondes (1 seconde) pour l'animation + }); + + } else { + // Traitez le cas où certaines informations ne sont pas disponibles + const articleIntrouvable = document.getElementById("articleIntrouvable"); + let errorMessage = ""; + + if (!response.articleInfo1 && !response.articleInfo2) { + errorMessage += "Les articles " + + '' + articleTitle1 + " et " + + '' + articleTitle2 + " sont introuvables."; + } + else { + + if (!response.articleInfo1) { + errorMessage += "L'article " + '' + articleTitle1 + " est introuvable."; + } + + if (!response.articleInfo2) { + errorMessage += "L'article " + '' + articleTitle2 + " est introuvable."; + } + } + + articleIntrouvable.innerHTML = errorMessage; + } + + }, + + error: function (error) { + console.error('Erreur lors de la recherche d\'informations sur les articles :', error); + + // Ajoutez une console.log pour vérifier si cette partie du code est exécutée + console.log('Erreur AJAX'); + + // Sélectionnez le div d'erreur par son ID + const articleIntrouvable = document.getElementById("articleIntrouvable"); + + // Mettez à jour le contenu du div avec un message d'erreur + articleIntrouvable.textContent = "Aucun article n'a été trouvé."; + + // Assurez-vous de masquer les conteneurs d'articles + $('#articleContainer1').addClass('hidden'); + $('#articleContainer2').addClass('hidden'); + } + + }); + }); + +}); + +function checkIfAllInfoAvailable(response) { + // Vérifiez si response.articleInfo1 contient toutes les informations nécessaires + const articleInfo1 = response.articleInfo1; + if (!articleInfo1) { + return false; // Si articleInfo1 est absent, retournez false + } + // Ajoutez ici des vérifications spécifiques pour les propriétés nécessaires dans articleInfo1 + if (!articleInfo1.title || !articleInfo1.url || !articleInfo1.extract || !articleInfo1.lastEdit) { + return false; // Si l'une des propriétés nécessaires est absente, retournez false + } + + // Vérifiez si response.articleInfo2 contient toutes les informations nécessaires + const articleInfo2 = response.articleInfo2; + if (!articleInfo2) { + return false; // Si articleInfo2 est absent, retournez false + } + // Ajoutez ici des vérifications spécifiques pour les propriétés nécessaires dans articleInfo2 + if (!articleInfo2.title || !articleInfo2.url || !articleInfo2.extract || !articleInfo2.lastEdit) { + return false; // Si l'une des propriétés nécessaires est absente, retournez false + } + + // Si toutes les vérifications sont passées, cela signifie que toutes les informations nécessaires sont disponibles + return true; +} + +// === SMOOTH SCROLL ~(^^)~ + +// Fait scroll jusqu'au formulaire de comparaison +$(document).ready(function () { + // Sélectionnez le lien par son ID + $('#letzgooo').click(function (e) { + e.preventDefault(); // Empêchez le comportement de clic par défaut + + $('html, body').animate({ + scrollTop: $('#comparaison').offset().top + }, 1000); // 1000 millisecondes (1 seconde) pour l'animation + }); +}); + + + + diff --git a/app-rappaurio/public/stylesheets/style.css b/app-rappaurio/public/stylesheets/style.css new file mode 100644 index 0000000..f35fe85 --- /dev/null +++ b/app-rappaurio/public/stylesheets/style.css @@ -0,0 +1,3867 @@ +/*!***************************************************************************************************************!*\ +!*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/css/style.css ***! +\***************************************************************************************************************/ +@import "https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"; + +/*!***********************************************************************************************************************************************!*\ +!*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./node_modules/glightbox/dist/css/glightbox.min.css ***! +\***********************************************************************************************************************************************/ +.glightbox-container { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: 999999 !important; + overflow: hidden; + touch-action: none; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + text-size-adjust: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + outline: 0 +} + +.glightbox-container.inactive { + display: none +} + +.glightbox-container .gcontainer { + position: relative; + width: 100%; + height: 100%; + z-index: 9999; + overflow: hidden +} + +.glightbox-container .gslider { + transition: transform .4s ease; + height: 100%; + left: 0; + top: 0; + width: 100%; + position: relative; + overflow: hidden; + display: flex !important; + justify-content: center; + align-items: center; + transform: translate3d(0, 0, 0) +} + +.glightbox-container .gslide { + width: 100%; + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: flex; + align-items: center; + justify-content: center; + opacity: 0 +} + +.glightbox-container .gslide.current { + opacity: 1; + z-index: 99999; + position: relative +} + +.glightbox-container .gslide.prev { + opacity: 1; + z-index: 9999 +} + +.glightbox-container .gslide-inner-content { + width: 100% +} + +.glightbox-container .ginner-container { + position: relative; + width: 100%; + display: flex; + justify-content: center; + flex-direction: column; + max-width: 100%; + margin: auto; + height: 100vh +} + +.glightbox-container .ginner-container.gvideo-container { + width: 100% +} + +.glightbox-container .ginner-container.desc-bottom, +.glightbox-container .ginner-container.desc-top { + flex-direction: column +} + +.glightbox-container .ginner-container.desc-left, +.glightbox-container .ginner-container.desc-right { + max-width: 100% !important +} + +.gslide iframe, +.gslide video { + outline: 0 !important; + border: none; + min-height: 165px; + -webkit-overflow-scrolling: touch; + touch-action: auto +} + +.gslide:not(.current) { + pointer-events: none +} + +.gslide-image { + align-items: center +} + +.gslide-image img { + max-height: 100vh; + display: block; + padding: 0; + float: none; + outline: 0; + border: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + max-width: 100vw; + width: auto; + height: auto; + -o-object-fit: cover; + object-fit: cover; + touch-action: none; + margin: auto; + min-width: 200px +} + +.desc-bottom .gslide-image img, +.desc-top .gslide-image img { + width: auto +} + +.desc-left .gslide-image img, +.desc-right .gslide-image img { + width: auto; + max-width: 100% +} + +.gslide-image img.zoomable { + position: relative +} + +.gslide-image img.dragging { + cursor: grabbing !important; + transition: none +} + +.gslide-video { + position: relative; + max-width: 100vh; + width: 100% !important +} + +.gslide-video .plyr__poster-enabled.plyr--loading .plyr__poster { + display: none +} + +.gslide-video .gvideo-wrapper { + width: 100%; + margin: auto +} + +.gslide-video::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + background: rgba(255, 0, 0, .34); + display: none +} + +.gslide-video.playing::before { + display: none +} + +.gslide-video.fullscreen { + max-width: 100% !important; + min-width: 100%; + height: 75vh +} + +.gslide-video.fullscreen video { + max-width: 100% !important; + width: 100% !important +} + +.gslide-inline { + background: #fff; + text-align: left; + max-height: calc(100vh - 40px); + overflow: auto; + max-width: 100%; + margin: auto +} + +.gslide-inline .ginlined-content { + padding: 20px; + width: 100% +} + +.gslide-inline .dragging { + cursor: grabbing !important; + transition: none +} + +.ginlined-content { + overflow: auto; + display: block !important; + opacity: 1 +} + +.gslide-external { + display: flex; + width: 100%; + min-width: 100%; + background: #fff; + padding: 0; + overflow: auto; + max-height: 75vh; + height: 100% +} + +.gslide-media { + display: flex; + width: auto +} + +.zoomed .gslide-media { + box-shadow: none !important +} + +.desc-bottom .gslide-media, +.desc-top .gslide-media { + margin: 0 auto; + flex-direction: column +} + +.gslide-description { + position: relative; + flex: 1 0 100% +} + +.gslide-description.description-left, +.gslide-description.description-right { + max-width: 100% +} + +.gslide-description.description-bottom, +.gslide-description.description-top { + margin: 0 auto; + width: 100% +} + +.gslide-description p { + margin-bottom: 12px +} + +.gslide-description p:last-child { + margin-bottom: 0 +} + +.zoomed .gslide-description { + display: none +} + +.glightbox-button-hidden { + display: none +} + +.glightbox-mobile .glightbox-container .gslide-description { + height: auto !important; + width: 100%; + position: absolute; + bottom: 0; + padding: 19px 11px; + max-width: 100vw !important; + order: 2 !important; + max-height: 78vh; + overflow: auto !important; + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, .75) 100%); + transition: opacity .3s linear; + padding-bottom: 50px +} + +.glightbox-mobile .glightbox-container .gslide-title { + color: #fff; + font-size: 1em +} + +.glightbox-mobile .glightbox-container .gslide-desc { + color: #a1a1a1 +} + +.glightbox-mobile .glightbox-container .gslide-desc a { + color: #fff; + font-weight: 700 +} + +.glightbox-mobile .glightbox-container .gslide-desc * { + color: inherit +} + +.glightbox-mobile .glightbox-container .gslide-desc .desc-more { + color: #fff; + opacity: .4 +} + +.gdesc-open .gslide-media { + transition: opacity .5s ease; + opacity: .4 +} + +.gdesc-open .gdesc-inner { + padding-bottom: 30px +} + +.gdesc-closed .gslide-media { + transition: opacity .5s ease; + opacity: 1 +} + +.greset { + transition: all .3s ease +} + +.gabsolute { + position: absolute +} + +.grelative { + position: relative +} + +.glightbox-desc { + display: none !important +} + +.glightbox-open { + overflow: hidden +} + +.gloader { + height: 25px; + width: 25px; + animation: lightboxLoader .8s infinite linear; + border: 2px solid #fff; + border-right-color: transparent; + border-radius: 50%; + position: absolute; + display: block; + z-index: 9999; + left: 0; + right: 0; + margin: 0 auto; + top: 47% +} + +.goverlay { + width: 100%; + height: calc(100vh + 1px); + position: fixed; + top: -1px; + left: 0; + background: #000; + will-change: opacity +} + +.glightbox-mobile .goverlay { + background: #000 +} + +.gclose, +.gnext, +.gprev { + z-index: 99999; + cursor: pointer; + width: 26px; + height: 44px; + border: none; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column +} + +.gclose svg, +.gnext svg, +.gprev svg { + display: block; + width: 25px; + height: auto; + margin: 0; + padding: 0 +} + +.gclose.disabled, +.gnext.disabled, +.gprev.disabled { + opacity: .1 +} + +.gclose .garrow, +.gnext .garrow, +.gprev .garrow { + stroke: #fff +} + +.gbtn.focused { + outline: 2px solid #0f3d81 +} + +iframe.wait-autoplay { + opacity: 0 +} + +.glightbox-closing .gclose, +.glightbox-closing .gnext, +.glightbox-closing .gprev { + opacity: 0 !important +} + +.glightbox-clean .gslide-description { + background: #fff +} + +.glightbox-clean .gdesc-inner { + padding: 22px 20px +} + +.glightbox-clean .gslide-title { + font-size: 1em; + font-weight: 400; + font-family: arial; + color: #000; + margin-bottom: 19px; + line-height: 1.4em +} + +.glightbox-clean .gslide-desc { + font-size: .86em; + margin-bottom: 0; + font-family: arial; + line-height: 1.4em +} + +.glightbox-clean .gslide-video { + background: #000 +} + +.glightbox-clean .gclose, +.glightbox-clean .gnext, +.glightbox-clean .gprev { + background-color: rgba(0, 0, 0, .75); + border-radius: 4px +} + +.glightbox-clean .gclose path, +.glightbox-clean .gnext path, +.glightbox-clean .gprev path { + fill: #fff +} + +.glightbox-clean .gprev { + position: absolute; + top: -100%; + left: 30px; + width: 40px; + height: 50px +} + +.glightbox-clean .gnext { + position: absolute; + top: -100%; + right: 30px; + width: 40px; + height: 50px +} + +.glightbox-clean .gclose { + width: 35px; + height: 35px; + top: 15px; + right: 10px; + position: absolute +} + +.glightbox-clean .gclose svg { + width: 18px; + height: auto +} + +.glightbox-clean .gclose:hover { + opacity: 1 +} + +.gfadeIn { + animation: gfadeIn .5s ease +} + +.gfadeOut { + animation: gfadeOut .5s ease +} + +.gslideOutLeft { + animation: gslideOutLeft .3s ease +} + +.gslideInLeft { + animation: gslideInLeft .3s ease +} + +.gslideOutRight { + animation: gslideOutRight .3s ease +} + +.gslideInRight { + animation: gslideInRight .3s ease +} + +.gzoomIn { + animation: gzoomIn .5s ease +} + +.gzoomOut { + animation: gzoomOut .5s ease +} + +@keyframes lightboxLoader { + 0% { + transform: rotate(0) + } + + 100% { + transform: rotate(360deg) + } +} + +@keyframes gfadeIn { + from { + opacity: 0 + } + + to { + opacity: 1 + } +} + +@keyframes gfadeOut { + from { + opacity: 1 + } + + to { + opacity: 0 + } +} + +@keyframes gslideInLeft { + from { + opacity: 0; + transform: translate3d(-60%, 0, 0) + } + + to { + visibility: visible; + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes gslideOutLeft { + from { + opacity: 1; + visibility: visible; + transform: translate3d(0, 0, 0) + } + + to { + transform: translate3d(-60%, 0, 0); + opacity: 0; + visibility: hidden + } +} + +@keyframes gslideInRight { + from { + opacity: 0; + visibility: visible; + transform: translate3d(60%, 0, 0) + } + + to { + transform: translate3d(0, 0, 0); + opacity: 1 + } +} + +@keyframes gslideOutRight { + from { + opacity: 1; + visibility: visible; + transform: translate3d(0, 0, 0) + } + + to { + transform: translate3d(60%, 0, 0); + opacity: 0 + } +} + +@keyframes gzoomIn { + from { + opacity: 0; + transform: scale3d(.3, .3, .3) + } + + to { + opacity: 1 + } +} + +@keyframes gzoomOut { + from { + opacity: 1 + } + + 50% { + opacity: 0; + transform: scale3d(.3, .3, .3) + } + + to { + opacity: 0 + } +} + +@media(min-width:769px) { + .glightbox-container .ginner-container { + width: auto; + height: auto; + flex-direction: row + } + + .glightbox-container .ginner-container.desc-top .gslide-description { + order: 0 + } + + .glightbox-container .ginner-container.desc-top .gslide-image, + .glightbox-container .ginner-container.desc-top .gslide-image img { + order: 1 + } + + .glightbox-container .ginner-container.desc-left .gslide-description { + order: 0 + } + + .glightbox-container .ginner-container.desc-left .gslide-image { + order: 1 + } + + .gslide-image img { + max-height: 97vh; + max-width: 100% + } + + .gslide-image img.zoomable { + cursor: zoom-in + } + + .zoomed .gslide-image img.zoomable { + cursor: grab + } + + .gslide-inline { + max-height: 95vh + } + + .gslide-external { + max-height: 100vh + } + + .gslide-description.description-left, + .gslide-description.description-right { + max-width: 275px + } + + .glightbox-open { + height: auto + } + + .goverlay { + background: rgba(0, 0, 0, .92) + } + + .glightbox-clean .gslide-media { + box-shadow: 1px 2px 9px 0 rgba(0, 0, 0, .65) + } + + .glightbox-clean .description-left .gdesc-inner, + .glightbox-clean .description-right .gdesc-inner { + position: absolute; + height: 100%; + overflow-y: auto + } + + .glightbox-clean .gclose, + .glightbox-clean .gnext, + .glightbox-clean .gprev { + background-color: rgba(0, 0, 0, .32) + } + + .glightbox-clean .gclose:hover, + .glightbox-clean .gnext:hover, + .glightbox-clean .gprev:hover { + background-color: rgba(0, 0, 0, .7) + } + + .glightbox-clean .gprev { + top: 45% + } + + .glightbox-clean .gnext { + top: 45% + } +} + +@media(min-width:992px) { + .glightbox-clean .gclose { + opacity: .7; + right: 20px + } +} + +@media screen and (max-height:420px) { + .goverlay { + background: #000 + } +} + +/*!*****************************************************************************************************************!*\ +!*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/css/animate.css ***! +\*****************************************************************************************************************/ +@charset "UTF-8"; + +/*!* animate.css -https://daneden.github.io/animate.css/ +* Version - 3.7.2 +* Licensed under the MIT license - http://opensource.org/licenses/MIT +* +* Copyright (c) 2019 Daniel Eden*/ +@keyframes fadeIn { + from { + opacity: 0 + } + + to { + opacity: 1 + } +} + +.fadeIn { + animation-name: fadeIn +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translate3d(0, -20px, 0) + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0) + } +} + +.fadeInDown { + animation-name: fadeInDown +} + +@keyframes fadeInLeft { + from { + opacity: 0; + transform: translate3d(-20px, 0, 0) + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0) + } +} + +.fadeInLeft { + animation-name: fadeInLeft +} + +@keyframes fadeInRight { + from { + opacity: 0; + transform: translate3d(20px, 0, 0) + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0) + } +} + +.fadeInRight { + animation-name: fadeInRight +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translate3d(0, 20px, 0) + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0) + } +} + +.fadeInUp { + animation-name: fadeInUp +} + +.animated { + animation-duration: 1s; + animation-fill-mode: both +} + +.animated.infinite { + animation-iteration-count: infinite +} + +.animated.delay-1s { + animation-delay: 1s +} + +.animated.delay-2s { + animation-delay: 2s +} + +.animated.delay-3s { + animation-delay: 3s +} + +.animated.delay-4s { + animation-delay: 4s +} + +.animated.delay-5s { + animation-delay: 5s +} + +.animated.fast { + animation-duration: 800ms +} + +.animated.faster { + animation-duration: 500ms +} + +.animated.slow { + animation-duration: 2s +} + +.animated.slower { + animation-duration: 3s +} + +@media(print), +(prefers-reduced-motion:reduce) { + .animated { + animation-duration: 1ms !important; + transition-duration: 1ms !important; + animation-iteration-count: 1 !important + } +} + +/*!*******************************************************************************************************************!*\ +!*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/css/style.css (1) ***! +\*******************************************************************************************************************/ +*, +::before, +::after { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: currentColor +} + +::before, +::after { + --tw-content: '' +} + +html { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji +} + +body { + margin: 0; + line-height: inherit +} + +hr { + height: 0; + color: inherit; + border-top-width: 1px +} + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit +} + +a { + color: inherit; + text-decoration: inherit +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, liberation mono, courier new, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + width: 100%; + color: #ffffffbe; + font-family: Arial, sans-serif; + font-size: 14px; + text-align: left; + border-radius: 10px; + border-bottom: 4px solid #1d214400; + overflow: hidden; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); + margin: auto; + margin-top: 50px; + margin-bottom: 50px; +} + +table th { + background-color: #313d46; + padding-left: 8px; + color: #ffffff; + font-weight: bold; + border-top: 1px solid #ffffff00; + border-bottom: 1px solid #1D2144; + border-width: 10%; + text-transform: uppercase; + padding: 10px; +} + + +table td { + background-color: #3b4857; + padding: 10px; + border-bottom: 1px solid #1D2144; + font-weight: bold; + width: 65%; + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: break-word; +} + + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + font-weight: inherit; + line-height: inherit; + color: inherit; + margin: 0; + padding: 0 +} + +button, +select { + text-transform: none +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; + background-color: transparent; + background-image: none +} + +:-moz-focusring { + outline: auto +} + +:-moz-ui-invalid { + box-shadow: none +} + +progress { + vertical-align: baseline +} + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +summary { + display: list-item +} + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0 +} + +fieldset { + margin: 0; + padding: 0 +} + +legend { + padding: 0 +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0 +} + +textarea { + resize: vertical +} + +input::-moz-placeholder, +textarea::-moz-placeholder { + opacity: 1; + color: #9ca3af +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + opacity: 1; + color: #9ca3af +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + color: #9ca3af +} + +button, +[role=button] { + cursor: pointer +} + +:disabled { + cursor: default +} + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + vertical-align: middle +} + +img, +video { + max-width: 100%; + height: auto +} + +body { + font-family: inter, sans-serif +} + +*, +::before, +::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: +} + +.container { + width: 100%; + margin-right: auto; + margin-left: auto; + padding-right: 1rem; + padding-left: 1rem +} + +@media(min-width:540px) { + .container { + max-width: 540px + } +} + +@media(min-width:720px) { + .container { + max-width: 720px + } +} + +@media(min-width:960px) { + .container { + max-width: 960px + } +} + +@media(min-width:1140px) { + .container { + max-width: 1140px + } +} + +@media(min-width:1320px) { + .container { + max-width: 1320px + } +} + +input[type=checkbox]:checked~label span svg { + display: inline-flex +} + +.sticky { + position: fixed !important; + z-index: 9999 !important; + background-color: rgb(255 255 255/var(--tw-bg-opacity)) !important; + --tw-bg-opacity: 0.8 !important; + transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter !important; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter !important; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter !important; + transition-timing-function: cubic-bezier(.4, 0, .2, 1) !important; + transition-duration: 150ms !important +} + +.dark .sticky { + background-color: rgb(74 108 247/var(--tw-bg-opacity)) !important; + --tw-bg-opacity: 0.2 !important +} + +.sticky { + -webkit-backdrop-filter: blur(5px); + backdrop-filter: blur(5px); + box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, .1) +} + +.sticky .header-logo { + padding-top: 1.25rem; + padding-bottom: 1.25rem +} + +@media(min-width:960px) { + .sticky .header-logo { + padding-top: .5rem; + padding-bottom: .5rem + } +} + +.sticky .menu-scroll.active { + opacity: .7 +} + +.navbarTogglerActive>span:nth-child(1) { + top: 7px; + --tw-rotate: 45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.navbarTogglerActive>span:nth-child(2) { + opacity: 0 +} + +.navbarTogglerActive>span:nth-child(3) { + top: -8px; + --tw-rotate: 135deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +input#togglePlan:checked~.dot { + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +input#checkboxLabel:checked~.box span { + opacity: 1 +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0 +} + +.fixed { + position: fixed +} + +.absolute { + position: absolute +} + +.relative { + position: relative +} + +.sticky { + position: sticky +} + +.top-0 { + top: 0 +} + +.left-0 { + left: 0 +} + +.right-4 { + right: 1rem +} + +.top-1\/2 { + top: 50% +} + +.top-full { + top: 100% +} + +.bottom-0 { + bottom: 0 +} + +.right-0 { + right: 0 +} + +.top-14 { + top: 3.5rem +} + +.bottom-24 { + bottom: 6rem +} + +.bottom-8 { + bottom: 2rem +} + +.right-8 { + right: 2rem +} + +.left-auto { + left: auto +} + +.top-6 { + top: 1.5rem +} + +.right-6 { + right: 1.5rem +} + +.top-5 { + top: 1.25rem +} + +.bottom-5 { + bottom: 1.25rem +} + +.top-\[-4px\] { + top: -4px +} + +.z-40 { + z-index: 40 +} + +.z-10 { + z-index: 10 +} + +.z-\[-1\] { + z-index: -1 +} + +.z-\[999\] { + z-index: 999 +} + +.m-0 { + margin: 0 +} + +.mx-\[-16px\] { + margin-left: -16px; + margin-right: -16px +} + +.my-\[6px\] { + margin-top: 6px; + margin-bottom: 6px +} + +.mx-8 { + margin-left: 2rem; + margin-right: 2rem +} + +.mx-auto { + margin-left: auto; + margin-right: auto +} + +.-mx-3 { + margin-left: -.75rem; + margin-right: -.75rem +} + +.mx-1 { + margin-left: .25rem; + margin-right: .25rem +} + +.mx-2 { + margin-left: .5rem; + margin-right: .5rem +} + +.mx-3 { + margin-left: .75rem; + margin-right: .75rem +} + +.mx-\[-12px\] { + margin-left: -12px; + margin-right: -12px +} + +.mb-9 { + margin-bottom: 2.25rem +} + +.mb-4 { + margin-bottom: 1rem +} + +.mb-10 { + margin-bottom: 2.5rem +} + +.mb-16 { + margin-bottom: 4rem +} + +.mb-8 { + margin-bottom: 2rem +} + +.mr-6 { + margin-right: 1.5rem +} + +.mt-\[6px\] { + margin-top: 6px +} + +.mb-12 { + margin-bottom: 3rem +} + +.mb-5 { + margin-bottom: 1.25rem +} + +.mr-3 { + margin-right: .75rem +} + +.mb-6 { + margin-bottom: 1.5rem +} + +.mb-11 { + margin-bottom: 2.75rem +} + +.mr-4 { + margin-right: 1rem +} + +.mb-1 { + margin-bottom: .25rem +} + +.mr-10 { + margin-right: 2.5rem +} + +.mr-5 { + margin-right: 1.25rem +} + +.mb-2 { + margin-bottom: .5rem +} + +.mb-3 { + margin-bottom: .75rem +} + +.ml-3 { + margin-left: .75rem +} + +.mt-12 { + margin-top: 3rem +} + +.mb-\[6px\] { + margin-bottom: 6px +} + +.mb-\[100px\] { + margin-bottom: 100px +} + +.mb-\[70px\] { + margin-bottom: 70px +} + +.mb-20 { + margin-bottom: 5rem +} + +.mr-1 { + margin-right: .25rem +} + +.ml-4 { + margin-left: 1rem +} + +.mb-7 { + margin-bottom: 1.75rem +} + +.mt-1 { + margin-top: .25rem +} + +.block { + display: block +} + +.inline-block { + display: inline-block +} + +.flex { + display: flex +} + +.inline-flex { + display: inline-flex +} + +.hidden { + display: none +} + +.h-\[2px\] { + height: 2px +} + +.h-9 { + height: 2.25rem +} + +.h-5 { + height: 1.25rem +} + +.h-10 { + height: 2.5rem +} + +.h-3 { + height: .75rem +} + +.h-2 { + height: .5rem +} + +.h-\[30px\] { + height: 30px +} + +.h-\[40px\] { + height: 40px +} + +.h-full { + height: 100% +} + +.h-\[50px\] { + height: 50px +} + +.h-\[75px\] { + height: 75px +} + +.h-\[70px\] { + height: 70px +} + +.h-7 { + height: 1.75rem +} + +.h-4 { + height: 1rem +} + +.h-\[18px\] { + height: 18px +} + +.h-\[1px\] { + height: 1px +} + +.w-full { + width: 100% +} + +.w-60 { + width: 15rem +} + +.w-\[30px\] { + width: 30px +} + +.w-\[250px\] { + width: 250px +} + +.w-9 { + width: 2.25rem +} + +.w-5 { + width: 1.25rem +} + +.w-10 { + width: 2.5rem +} + +.w-3 { + width: .75rem +} + +.w-2 { + width: .5rem +} + +.w-\[70px\] { + width: 70px +} + +.w-14 { + width: 3.5rem +} + +.w-7 { + width: 1.75rem +} + +.w-4 { + width: 1rem +} + +.min-w-\[36px\] { + min-width: 36px +} + +.max-w-full { + max-width: 100% +} + +.max-w-\[250px\] { + max-width: 250px +} + +.max-w-\[530px\] { + max-width: 530px +} + +.max-w-\[360px\] { + max-width: 360px +} + +.max-w-\[570px\] { + max-width: 570px +} + +.max-w-\[470px\] { + max-width: 470px +} + +.max-w-\[40px\] { + max-width: 40px +} + +.max-w-\[50px\] { + max-width: 50px +} + +.max-w-\[85px\] { + max-width: 85px +} + +.max-w-\[770px\] { + max-width: 770px +} + +.max-w-\[655px\] { + max-width: 655px +} + +.max-w-\[18px\] { + max-width: 18px +} + +.max-w-\[500px\] { + max-width: 500px +} + +.max-w-\[70px\] { + max-width: 70px +} + +.max-w-\[60px\] { + max-width: 60px +} + +.translate-y-\[-50\%\] { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.rotate-45 { + --tw-rotate: 45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.cursor-pointer { + cursor: pointer +} + +.cursor-not-allowed { + cursor: not-allowed +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none +} + +.resize-none { + resize: none +} + +.list-inside { + list-style-position: inside +} + +.list-disc { + list-style-type: disc +} + +.flex-wrap { + flex-wrap: wrap +} + +.items-center { + align-items: center +} + +.justify-end { + justify-content: flex-end +} + +.justify-center { + justify-content: center +} + +.justify-between { + justify-content: space-between +} + +.overflow-hidden { + overflow: hidden +} + +.rounded-lg { + border-radius: .5rem +} + +.rounded-md { + border-radius: .375rem +} + +.rounded { + border-radius: .25rem +} + +.rounded-full { + border-radius: 9999px +} + +.border { + border-width: 1px +} + +.border-t { + border-top-width: 1px +} + +.border-l { + border-left-width: 1px +} + +.border-t-2 { + border-top-width: 2px +} + +.border-r-2 { + border-right-width: 2px +} + +.border-b { + border-bottom-width: 1px +} + +.border-r { + border-right-width: 1px +} + +.border-white { + --tw-border-opacity: 1; + border-color: rgb(255 255 255/var(--tw-border-opacity)) +} + +.border-body-color { + --tw-border-opacity: 1; + border-color: rgb(149 156 177/var(--tw-border-opacity)) +} + +.border-transparent { + border-color: transparent +} + +.border-primary { + --tw-border-opacity: 1; + border-color: rgb(74 108 247/var(--tw-border-opacity)) +} + +.border-opacity-\[\.15\] { + --tw-border-opacity: .15 +} + +.border-opacity-10 { + --tw-border-opacity: 0.1 +} + +.border-opacity-25 { + --tw-border-opacity: 0.25 +} + +.border-opacity-20 { + --tw-border-opacity: 0.2 +} + +.bg-transparent { + background-color: transparent +} + +.bg-dark { + --tw-bg-opacity: 1; + background-color: rgb(29 33 68/var(--tw-bg-opacity)) +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255/var(--tw-bg-opacity)) +} + +.bg-primary { + --tw-bg-opacity: 1; + background-color: rgb(74 108 247/var(--tw-bg-opacity)) +} + +.bg-body-color { + --tw-bg-opacity: 1; + background-color: rgb(149 156 177/var(--tw-bg-opacity)) +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(9 14 52/var(--tw-bg-opacity)) +} + +.bg-\[\#1D2144\] { + --tw-bg-opacity: 1; + background-color: rgb(29 33 68/var(--tw-bg-opacity)) +} + +.bg-opacity-5 { + --tw-bg-opacity: 0.05 +} + +.bg-opacity-10 { + --tw-bg-opacity: 0.1 +} + +.bg-opacity-\[15\%\] { + --tw-bg-opacity: 15% +} + +.bg-opacity-\[3\%\] { + --tw-bg-opacity: 3% +} + +.bg-opacity-75 { + --tw-bg-opacity: 0.75 +} + +.fill-current { + fill: currentColor +} + +.stroke-current { + stroke: currentColor +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover +} + +.object-center { + -o-object-position: center; + object-position: center +} + +.p-4 { + padding: 1rem +} + +.p-8 { + padding: 2rem +} + +.p-6 { + padding: 1.5rem +} + +.p-11 { + padding: 2.75rem +} + +.p-3 { + padding: .75rem +} + +.p-12 { + padding: 3rem +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem +} + +.px-3 { + padding-left: .75rem; + padding-right: .75rem +} + +.py-\[6px\] { + padding-top: 6px; + padding-bottom: 6px +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem +} + +.py-2 { + padding-top: .5rem; + padding-bottom: .5rem +} + +.py-\[10px\] { + padding-top: 10px; + padding-bottom: 10px +} + +.py-3 { + padding-top: .75rem; + padding-bottom: .75rem +} + +.px-7 { + padding-left: 1.75rem; + padding-right: 1.75rem +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem +} + +.px-9 { + padding-left: 2.25rem; + padding-right: 2.25rem +} + +.py-\[120px\] { + padding-top: 120px; + padding-bottom: 120px +} + +.py-\[15px\] { + padding-top: 15px; + padding-bottom: 15px +} + +.py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem +} + +.pr-16 { + padding-right: 4rem +} + +.pt-\[180px\] { + padding-top: 180px +} + +.pb-\[120px\] { + padding-bottom: 120px +} + +.pt-\[100px\] { + padding-top: 100px +} + +.pt-\[150px\] { + padding-top: 150px +} + +.pr-1 { + padding-right: .25rem +} + +.pt-\[120px\] { + padding-top: 120px +} + +.pb-\[100px\] { + padding-bottom: 100px +} + +.pb-4 { + padding-bottom: 1rem +} + +.pb-6 { + padding-bottom: 1.5rem +} + +.pr-5 { + padding-right: 1.25rem +} + +.pt-8 { + padding-top: 2rem +} + +.pb-11 { + padding-bottom: 2.75rem +} + +.pb-20 { + padding-bottom: 5rem +} + +.pb-\[110px\] { + padding-bottom: 110px +} + +.pb-\[50px\] { + padding-bottom: 50px +} + +.pr-\[10px\] { + padding-right: 10px +} + +.pt-16 { + padding-top: 4rem +} + +.pb-8 { + padding-bottom: 2rem +} + +.text-center { + text-align: center +} + +.text-alert{ + color: #ff0000; + background-color: #fd00001c; +} + +.text-info{ + color: #148f33; + background-color: #14eb0027; +} + +.bienvenu-msg{ + padding: 20px; + width: 40%; + margin-bottom: 60px; + font-weight: bold; + font-size:larger; + min-width: 160px; +} + +.mt-6{ + margin-top: 30px; +} + +.text-end { + text-align: end +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem +} + +.text-sm { + font-size: .875rem; + line-height: 1.25rem +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem +} + +.text-xs { + font-size: .75rem; + line-height: 1rem +} + +.font-bold { + font-weight: 700 +} + +.font-medium { + font-weight: 500 +} + +.font-semibold { + font-weight: 600 +} + +.italic { + font-style: italic +} + +.leading-relaxed { + line-height: 1.625 +} + +.leading-tight { + line-height: 1.25 +} + +.leading-snug { + line-height: 1.375 +} + +.text-dark { + --tw-text-opacity: 1; + color: rgb(29 33 68/var(--tw-text-opacity)) +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255/var(--tw-text-opacity)) +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(9 14 52/var(--tw-text-opacity)) +} + +.text-body-color { + --tw-text-opacity: 1; + color: rgb(149 156 177/var(--tw-text-opacity)) +} + +.text-\[\#CED3F6\] { + --tw-text-opacity: 1; + color: rgb(206 211 246/var(--tw-text-opacity)) +} + +.text-primary { + --tw-text-opacity: 1; + color: rgb(74 108 247/var(--tw-text-opacity)) +} + +.text-yellow { + --tw-text-opacity: 1; + color: rgb(251 176 64/var(--tw-text-opacity)) +} + +.underline { + -webkit-text-decoration-line: underline; + text-decoration-line: underline +} + +.placeholder-body-color::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(149 156 177/var(--tw-placeholder-opacity)) +} + +.placeholder-body-color:-ms-input-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(149 156 177/var(--tw-placeholder-opacity)) +} + +.placeholder-body-color::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(149 156 177/var(--tw-placeholder-opacity)) +} + +.opacity-70 { + opacity: .7 +} + +.opacity-0 { + opacity: 0 +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.shadow-signUp { + --tw-shadow: 0px 5px 10px rgba(4, 10, 34, 0.2); + --tw-shadow-colored: 0px 5px 10px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.shadow-one { + --tw-shadow: 0px 2px 3px rgba(7, 7, 77, 0.05); + --tw-shadow-colored: 0px 2px 3px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.shadow-inner { + --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px +} + +.ring-primary { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(74 108 247 / var(--tw-ring-opacity)) +} + +.grayscale { + --tw-grayscale: grayscale(100%); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) +} + +.transition-\[top\] { + transition-property: top; + transition-timing-function: cubic-bezier(.4, 0, .2, 1); + transition-duration: 150ms +} + +.transition { + transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(.4, 0, .2, 1); + transition-duration: 150ms +} + +.duration-300 { + transition-duration: 300ms +} + +.ease-in-out { + transition-timing-function: cubic-bezier(.4, 0, .2, 1) +} + +.after\:absolute::after { + content: var(--tw-content); + position: absolute +} + +.after\:right-1::after { + content: var(--tw-content); + right: .25rem +} + +.after\:top-1\/2::after { + content: var(--tw-content); + top: 50% +} + +.after\:mt-\[-2px\]::after { + content: var(--tw-content); + margin-top: -2px +} + +.after\:h-2::after { + content: var(--tw-content); + height: .5rem +} + +.after\:w-2::after { + content: var(--tw-content); + width: .5rem +} + +.after\:translate-y-\[-50\%\]::after { + content: var(--tw-content); + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.after\:rotate-45::after { + content: var(--tw-content); + --tw-rotate: 45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) +} + +.after\:border-b-2::after { + content: var(--tw-content); + border-bottom-width: 2px +} + +.after\:border-r-2::after { + content: var(--tw-content); + border-right-width: 2px +} + +.after\:border-current::after { + content: var(--tw-content); + border-color: currentColor +} + +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255/var(--tw-bg-opacity)) +} + +.hover\:bg-primary:hover { + --tw-bg-opacity: 1; + background-color: rgb(74 108 247/var(--tw-bg-opacity)) +} + +.hover\:bg-opacity-90:hover { + --tw-bg-opacity: 0.9 +} + +.hover\:bg-opacity-80:hover { + --tw-bg-opacity: 0.8 +} + +.hover\:bg-opacity-100:hover { + --tw-bg-opacity: 1 +} + +.hover\:bg-opacity-20:hover { + --tw-bg-opacity: 0.2 +} + +.hover\:text-primary:hover { + --tw-text-opacity: 1; + color: rgb(74 108 247/var(--tw-text-opacity)) +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255/var(--tw-text-opacity)) +} + +.hover\:underline:hover { + -webkit-text-decoration-line: underline; + text-decoration-line: underline +} + +.hover\:opacity-70:hover { + opacity: .7 +} + +.hover\:opacity-100:hover { + opacity: 1 +} + +.hover\:shadow-signUp:hover { + --tw-shadow: 0px 5px 10px rgba(4, 10, 34, 0.2); + --tw-shadow-colored: 0px 5px 10px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.hover\:grayscale-0:hover { + --tw-grayscale: grayscale(0); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) +} + +.focus\:border-primary:focus { + --tw-border-opacity: 1; + border-color: rgb(74 108 247/var(--tw-border-opacity)) +} + +.focus\:border-opacity-100:focus { + --tw-border-opacity: 1 +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) +} + +.focus-visible\:shadow-none:focus-visible { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.group:hover .group-hover\:opacity-70 { + opacity: .7 +} + +.group:hover .group-hover\:opacity-100 { + opacity: 1 +} + +.dark .dark\:block { + display: block +} + +.dark .dark\:hidden { + display: none +} + +.dark .dark\:border-white { + --tw-border-opacity: 1; + border-color: rgb(255 255 255/var(--tw-border-opacity)) +} + +.dark .dark\:border-opacity-10 { + --tw-border-opacity: 0.1 +} + +.dark .dark\:border-opacity-25 { + --tw-border-opacity: 0.25 +} + +.dark .dark\:bg-black { + --tw-bg-opacity: 1; + background-color: rgb(9 14 52/var(--tw-bg-opacity)) +} + +.dark .dark\:bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255/var(--tw-bg-opacity)) +} + +.dark .dark\:bg-dark { + --tw-bg-opacity: 1; + background-color: rgb(29 33 68/var(--tw-bg-opacity)) +} + +.dark .dark\:bg-\[\#242B51\] { + --tw-bg-opacity: 1; + background-color: rgb(36 43 81/var(--tw-bg-opacity)) +} + +.dark .dark\:bg-primary { + --tw-bg-opacity: 1; + background-color: rgb(74 108 247/var(--tw-bg-opacity)) +} + +.dark .dark\:bg-\[\#1D2144\] { + --tw-bg-opacity: 1; + background-color: rgb(29 33 68/var(--tw-bg-opacity)) +} + +.dark .dark\:bg-opacity-5 { + --tw-bg-opacity: 0.05 +} + +.dark .dark\:bg-opacity-10 { + --tw-bg-opacity: 0.1 +} + +.dark .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255/var(--tw-text-opacity)) +} + +.dark .dark\:text-body-color { + --tw-text-opacity: 1; + color: rgb(149 156 177/var(--tw-text-opacity)) +} + +.dark .dark\:opacity-90 { + opacity: .9 +} + +.dark .dark\:opacity-60 { + opacity: .6 +} + +.dark .dark\:shadow-signUp { + --tw-shadow: 0px 5px 10px rgba(4, 10, 34, 0.2); + --tw-shadow-colored: 0px 5px 10px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) +} + +.dark .dark\:hover\:bg-opacity-20:hover { + --tw-bg-opacity: 0.2 +} + +.dark .dark\:hover\:text-primary:hover { + --tw-text-opacity: 1; + color: rgb(74 108 247/var(--tw-text-opacity)) +} + +.dark .dark\:hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255/var(--tw-text-opacity)) +} + +.dark .dark\:hover\:opacity-100:hover { + opacity: 1 +} + +@media(min-width:540px) { + .sm\:mx-4 { + margin-left: 1rem; + margin-right: 1rem + } + + .sm\:ml-3 { + margin-left: .75rem + } + + .sm\:block { + display: block + } + + .sm\:flex { + display: flex + } + + .sm\:w-1\/2 { + width: 50% + } + + .sm\:justify-end { + justify-content: flex-end + } + + .sm\:p-8 { + padding: 2rem + } + + .sm\:p-11 { + padding: 2.75rem + } + + .sm\:p-\[55px\] { + padding: 55px + } + + .sm\:p-\[60px\] { + padding: 60px + } + + .sm\:px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem + } + + .sm\:text-right { + text-align: right + } + + .sm\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem + } + + .sm\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem + } + + .sm\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem + } + + .sm\:text-2xl { + font-size: 1.5rem; + line-height: 2rem + } + + .sm\:leading-relaxed { + line-height: 1.625 + } + + .sm\:leading-tight { + line-height: 1.25 + } +} + +@media(min-width:720px) { + .md\:mb-0 { + margin-bottom: 0 + } + + .md\:block { + display: block + } + + .md\:h-14 { + height: 3.5rem + } + + .md\:h-6 { + height: 1.5rem + } + + .md\:w-14 { + width: 3.5rem + } + + .md\:w-6 { + width: 1.5rem + } + + .md\:w-1\/2 { + width: 50% + } + + .md\:w-8\/12 { + width: 66.666667% + } + + .md\:w-4\/12 { + width: 33.333333% + } + + .md\:w-2\/3 { + width: 66.666667% + } + + .md\:justify-end { + justify-content: flex-end + } + + .md\:p-9 { + padding: 2.25rem + } + + .md\:px-9 { + padding-left: 2.25rem; + padding-right: 2.25rem + } + + .md\:py-8 { + padding-top: 2rem; + padding-bottom: 2rem + } + + .md\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem + } + + .md\:py-\[40px\] { + padding-top: 40px; + padding-bottom: 40px + } + + .md\:px-\[50px\] { + padding-left: 50px; + padding-right: 50px + } + + .md\:pt-\[150px\] { + padding-top: 150px + } + + .md\:pb-\[120px\] { + padding-bottom: 120px + } + + .md\:text-\[45px\] { + font-size: 45px + } + + .md\:text-5xl { + font-size: 3rem; + line-height: 1 + } + + .md\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem + } + + .md\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem + } + + .md\:leading-tight { + line-height: 1.25 + } + + .md\:leading-relaxed { + line-height: 1.625 + } +} + +@media(min-width:960px) { + .lg\:invisible { + visibility: hidden + } + + .lg\:static { + position: static + } + + .lg\:absolute { + position: absolute + } + + .lg\:top-\[110\%\] { + top: 110% + } + + .lg\:mr-0 { + margin-right: 0 + } + + .lg\:ml-8 { + margin-left: 2rem + } + + .lg\:mb-0 { + margin-bottom: 0 + } + + .lg\:ml-0 { + margin-left: 0 + } + + .lg\:mt-0 { + margin-top: 0 + } + + .lg\:mb-3 { + margin-bottom: .75rem + } + + .lg\:mb-5 { + margin-bottom: 1.25rem + } + + .lg\:block { + display: block + } + + .lg\:flex { + display: flex + } + + .lg\:inline-flex { + display: inline-flex + } + + .lg\:hidden { + display: none + } + + .lg\:w-full { + width: 100% + } + + .lg\:w-4\/12 { + width: 33.333333% + } + + .lg\:w-2\/12 { + width: 16.666667% + } + + .lg\:w-7\/12 { + width: 58.333333% + } + + .lg\:w-5\/12 { + width: 41.666667% + } + + .lg\:w-1\/2 { + width: 50% + } + + .lg\:w-8\/12 { + width: 66.666667% + } + + .lg\:w-1\/3 { + width: 33.333333% + } + + .lg\:max-w-full { + max-width: 100% + } + + .lg\:max-w-\[130px\] { + max-width: 130px + } + + .lg\:bg-transparent { + background-color: transparent + } + + .lg\:p-8 { + padding: 2rem + } + + .lg\:p-11 { + padding: 2.75rem + } + + .lg\:py-0 { + padding-top: 0; + padding-bottom: 0 + } + + .lg\:px-4 { + padding-left: 1rem; + padding-right: 1rem + } + + .lg\:py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem + } + + .lg\:px-0 { + padding-left: 0; + padding-right: 0 + } + + .lg\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem + } + + .lg\:px-8 { + padding-left: 2rem; + padding-right: 2rem + } + + .lg\:px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem + } + + .lg\:pl-0 { + padding-left: 0 + } + + .lg\:pr-4 { + padding-right: 1rem + } + + .lg\:pr-0 { + padding-right: 0 + } + + .lg\:text-left { + text-align: left + } + + .lg\:text-right { + text-align: right + } + + .lg\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem + } + + .lg\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem + } + + .lg\:text-base { + font-size: 1rem; + line-height: 1.5rem + } + + .lg\:text-2xl { + font-size: 1.5rem; + line-height: 2rem + } + + .lg\:leading-tight { + line-height: 1.25 + } + + .lg\:leading-relaxed { + line-height: 1.625 + } + + .lg\:opacity-0 { + opacity: 0 + } + + .lg\:shadow-none { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) + } + + .lg\:shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) + } + + .lg\:after\:right-0::after { + content: var(--tw-content); + right: 0 + } + + .group:hover .lg\:group-hover\:visible { + visibility: visible + } + + .group:hover .lg\:group-hover\:top-full { + top: 100% + } + + .dark .lg\:dark\:bg-transparent { + background-color: transparent + } +} + +@media(min-width:1140px) { + .xl\:mx-6 { + margin-left: 1.5rem; + margin-right: 1.5rem + } + + .xl\:ml-12 { + margin-left: 3rem + } + + .xl\:mr-3 { + margin-right: .75rem + } + + .xl\:mb-0 { + margin-bottom: 0 + } + + .xl\:flex { + display: flex + } + + .xl\:w-5\/12 { + width: 41.666667% + } + + .xl\:w-2\/12 { + width: 16.666667% + } + + .xl\:w-3\/12 { + width: 25% + } + + .xl\:w-1\/2 { + width: 50% + } + + .xl\:w-1\/3 { + width: 33.333333% + } + + .xl\:max-w-\[150px\] { + max-width: 150px + } + + .xl\:p-9 { + padding: 2.25rem + } + + .xl\:p-11 { + padding: 2.75rem + } + + .xl\:p-\[55px\] { + padding: 55px + } + + .xl\:p-\[50px\] { + padding: 50px + } + + .xl\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem + } + + .xl\:px-9 { + padding-left: 2.25rem; + padding-right: 2.25rem + } + + .xl\:py-8 { + padding-top: 2rem; + padding-bottom: 2rem + } + + .xl\:px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem + } + + .xl\:px-8 { + padding-left: 2rem; + padding-right: 2rem + } + + .xl\:pr-3 { + padding-right: .75rem + } + + .xl\:pt-\[180px\] { + padding-top: 180px + } + + .xl\:pb-\[160px\] { + padding-bottom: 160px + } + + .xl\:text-\[45px\] { + font-size: 45px + } + + .xl\:text-2xl { + font-size: 1.5rem; + line-height: 2rem + } + + .xl\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem + } + + .xl\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem + } + + .xl\:leading-tight { + line-height: 1.25 + } + + .xl\:leading-relaxed { + line-height: 1.625 + } +} + +@media(min-width:1320px) { + .\32xl\:mx-8 { + margin-left: 2rem; + margin-right: 2rem + } + + .\32xl\:mr-5 { + margin-right: 1.25rem + } + + .\32xl\:max-w-\[160px\] { + max-width: 160px + } + + .\32xl\:p-8 { + padding: 2rem + } + + .\32xl\:py-\[60px\] { + padding-top: 60px; + padding-bottom: 60px + } + + .\32xl\:px-\[70px\] { + padding-left: 70px; + padding-right: 70px + } + + .\32xl\:pr-5 { + padding-right: 1.25rem + } + + .\32xl\:pt-\[210px\] { + padding-top: 210px + } + + .\32xl\:pb-\[200px\] { + padding-bottom: 200px + } +} + + +@keyframes ldio-jzq166pp4c { + 0% { + transform: rotate(0) + } + + 100% { + transform: rotate(360deg) + } +} + +.ldio-jzq166pp4c div { + box-sizing: border-box !important +} + +.ldio-jzq166pp4c>div { + position: absolute; + width: 72px; + height: 72px; + top: 14px; + left: 14px; + border-radius: 50%; + border: 8px solid #000; + border-color: #6677e4 transparent #6677e4 transparent; + animation: ldio-jzq166pp4c 1.4492753623188404s linear infinite; +} + +.ldio-jzq166pp4c>div:nth-child(2) { + border-color: transparent +} + +.ldio-jzq166pp4c>div:nth-child(2) div { + position: absolute; + width: 100%; + height: 100%; + transform: rotate(45deg); +} + +.ldio-jzq166pp4c>div:nth-child(2) div:before, +.ldio-jzq166pp4c>div:nth-child(2) div:after { + content: ""; + display: block; + position: absolute; + width: 8px; + height: 8px; + top: -8px; + left: 24px; + background: #6677e4; + border-radius: 50%; + box-shadow: 0 64px 0 0 #6677e4; +} + +.ldio-jzq166pp4c>div:nth-child(2) div:after { + left: -8px; + top: 24px; + box-shadow: 64px 0 0 0 #6677e4; +} + +.loadingio-spinner-dual-ring-4e7xs5jqq4d { + width: 84px; + height: 84px; + display: inline-block; + overflow: hidden; + background: transparent; +} + +.ldio-jzq166pp4c { + width: 100%; + height: 100%; + position: relative; + transform: translateZ(0) scale(0.84); + backface-visibility: hidden; + transform-origin: 0 0; +} + +.ldio-jzq166pp4c div { + box-sizing: content-box; +} + + +@import url(https://fonts.googleapis.com/css2?family=Poppins:wght@400;500&display=swap); + +:root { + --cookieBannerLight: #ffffff; + --cookieBannerDark: #393d4d +} + +#cookieBanner * { + margin: 0; + padding: 0; + text-decoration: none; + list-style: none; + font-family: Poppins, sans-serif; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +#cookieBanner a, +#cookieBanner button { + cursor: pointer; + color: inherit; + font-family: inherit +} + +#cookieBanner button { + outline: 0; + border: none; + -moz-appearance: none; + appearance: none; + -webkit-appearance: none; + appearance: none +} + +#cookieBanner em, +#cookieBanner strong { + font-weight: 700; + font-family: inherit +} + +#cookieBanner a:hover { + text-decoration: none; + cursor: pointer +} + +#cookieBanner a:focus, +#cookieBanner input:focus { + outline: 0; + list-style: none +} + +#cookieBanner.light { + background-color: #fff; + background-color: var(--cookieBannerLight); + color: #393d4d; + color: var(--cookieBannerDark) +} + +#cookieBanner.light p, +#cookieBanner.light ul { + color: #393d4d; + color: var(--cookieBannerDark) +} + +#cookieBanner.light h5 { + color: var(--cookieBannerDark) +} + +#cookieBanner.light button#cookieReject { + background: #fff; + background: var(--cookieBannerLight) +} + +#cookieBanner.dark { + background-color: #393d4d; + background-color: var(--cookieBannerDark); + color: #fff; + color: var(--cookieBannerLight) +} + +#cookieBanner.dark p, +#cookieBanner.dark ul { + color: #fff; + color: var(--cookieBannerLight) +} + +#cookieBanner.dark h5 { + color: #fff; + color: var(--cookieBannerLight) +} + +#cookieBanner.dark button#cookieReject { + background: 0 0; + color: #fff; + color: var(--cookieBannerLight); + border: 1px solid #fff; + border: 1px solid var(--cookieBannerLight) +} + +#cookieBanner { + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: fixed; + padding: 20px; + border-radius: 10px; + -webkit-box-shadow: 0 6px 6px rgba(0, 0, 0, .25); + box-shadow: 0 6px 6px rgba(0, 0, 0, .25); + font-family: inherit; + z-index: 999997 +} + +#cookieBanner #closeIcon { + width: 20px; + height: 20px; + cursor: pointer; + color: #bfb9b9; + overflow: hidden; + opacity: .85; + z-index: 999999; + position: absolute; + top: 4px; + right: 4px +} + +#cookieBanner svg { + display: block +} + +#cookieBanner.display-left { + left: 30px; + bottom: 30px; + max-width: 395px +} + +#cookieBanner.display-right { + right: 30px; + bottom: 30px; + max-width: 395px +} + +#cookieBanner.display-top { + top: 30px; + width: 800px; + left: 50%; + margin-left: -400px +} + +#cookieBanner.display-bottom { + bottom: 30px; + width: 800px; + left: 50%; + margin-left: -400px +} + +#cookieBanner.display-bottom .content-wrap, +#cookieBanner.display-top .content-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +#cookieBanner.display-bottom .msg-wrap, +#cookieBanner.display-top .msg-wrap { + max-width: 65%; + width: 100% +} + +#cookieBanner.display-bottom .msg-wrap, +#cookieBanner.display-top .msg-wrap { + margin-bottom: 0 +} + +#cookieBanner.display-bottom #cookieSettings, +#cookieBanner.display-top #cookieSettings { + margin-bottom: 0 +} + +#cookieBanner.display-bottom #cookieTypes, +#cookieBanner.display-top #cookieTypes { + margin-top: 20px +} + +#cookieBanner .btn-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + font-weight: 700; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin: 0 -5px 0 -5px; + -ms-flex-wrap: wrap; + flex-wrap: wrap +} + +#cookieBanner .btn-wrap button { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + padding: 0 7px; + margin: 0 5px 10px 5px; + border-radius: 20px; + cursor: pointer; + white-space: nowrap; + min-width: 130px; + line-height: 36px; + border: none; + font-family: inherit; + font-size: 16px; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + -o-transition: box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s +} + +#cookieBanner .btn-wrap button:hover { + -webkit-transition: -webkit-box-shadow .4s cubic-bezier(.25, .8, .25, 1), -webkit-transform .4s cubic-bezier(.25, .8, .25, 1); + transition: -webkit-box-shadow .4s cubic-bezier(.25, .8, .25, 1), -webkit-transform .4s cubic-bezier(.25, .8, .25, 1); + -o-transition: box-shadow .4s cubic-bezier(.25, .8, .25, 1), transform .4s cubic-bezier(.25, .8, .25, 1); + transition: box-shadow .4s cubic-bezier(.25, .8, .25, 1), transform .4s cubic-bezier(.25, .8, .25, 1); + transition: box-shadow .4s cubic-bezier(.25, .8, .25, 1), transform .4s cubic-bezier(.25, .8, .25, 1), -webkit-box-shadow .4s cubic-bezier(.25, .8, .25, 1), -webkit-transform .4s cubic-bezier(.25, .8, .25, 1); + -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .3); + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .3); + -webkit-transform: translate3d(0, -1px, 0); + transform: translate3d(0, -1px, 0) +} + +#cookieBanner #cookieSettings { + font-size: 12px; + font-weight: 700; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + text-transform: uppercase; + cursor: pointer; + font-weight: 400; + margin-bottom: 20px +} + +#cookieBanner #cookieSettings svg { + vertical-align: middle; + margin-right: 8px +} + +#cookieBanner h4 { + font-family: inherit; + font-weight: 700; + font-size: 18px +} + +#cookieBanner .title-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 10px +} + +#cookieBanner .title-wrap svg { + margin-right: 10px +} + +#cookieBanner h5 { + font-family: inherit; + font-weight: 700; + font-size: 12px; + margin-bottom: 10px; + text-transform: uppercase +} + +#cookieBanner p, +#cookieBanner ul { + font-size: 14px; + margin-bottom: 20px +} + +#cookieBanner p:last-child { + margin-bottom: 0; + text-align: left +} + +#cookieBanner li { + width: 49%; + display: inline-block +} + +#cookieBanner a { + text-decoration: none; + font-size: 14px; + padding-bottom: 2px; + border-bottom: 1px dotted rgba(255, 255, 255, .75); + -webkit-transition: all .3s ease-in; + -o-transition: all .3s ease-in; + transition: all .3s ease-in +} + +#cookieTypes label { + text-transform: uppercase; + font-size: 13px +} + +#cookieBanner button:disabled { + opacity: .3 +} + +#cookieBanner input[type=checkbox] { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeSpeed; + width: 14px; + height: 14px; + margin: 4px 10px 0 0; + display: block; + float: left; + position: relative; + outline: 0; + border: none +} + +#cookieBanner input[type=checkbox]:checked:after { + background: #d3d3d3; + content: "\2714"; + color: grey +} + +#cookieBanner input[type=checkbox]:after { + content: ""; + vertical-align: middle; + text-align: center; + line-height: 13px; + position: absolute; + cursor: pointer; + height: 14px; + width: 14px; + left: 0; + top: 0; + font-size: 10px; + background: #d3d3d3 +} + +#cookieBanner.display-bottom.full-width-true, +#cookieBanner.display-top.full-width-true { + width: 100%; + max-width: 100%; + left: auto; + right: auto; + bottom: auto; + top: 0; + border-radius: 0; + margin: auto +} + +#cookieBanner.display-bottom.full-width-true { + bottom: 0; + top: auto; + -webkit-box-shadow: 0 -3px 3px rgb(0 0 0 / 25%); + box-shadow: 0 -3px 3px rgb(0 0 0 / 25%) +} + +#cookieBanner.display-bottom.full-width-true .title-wrap, +#cookieBanner.display-top.full-width-true .title-wrap { + display: none +} + +#cookieBanner.display-bottom.full-width-true .btn-wrap button, +#cookieBanner.display-top.full-width-true .btn-wrap button { + margin-bottom: 10px +} + +@media only screen and (max-width:800px) { + + #cookieBanner.display-bottom, + #cookieBanner.display-top { + width: 100%; + max-width: 100%; + left: auto; + right: auto; + bottom: auto; + top: 0; + border-radius: 0; + margin: auto + } + + #cookieBanner.display-bottom { + bottom: 0; + top: auto; + -webkit-box-shadow: 0 -3px 3px rgb(0 0 0 / 25%); + box-shadow: 0 -3px 3px rgb(0 0 0 / 25%) + } + + #cookieBanner.display-bottom .btn-wrap button, + #cookieBanner.display-top .btn-wrap button { + margin-bottom: 10px + } + + #cookieBanner.display-bottom .msg-wrap, + #cookieBanner.display-top .msg-wrap { + margin-right: 20px + } +} + +@media only screen and (max-width:600px) { + + #cookieBanner.display-left, + #cookieBanner.display-right { + width: 100%; + max-width: 100%; + left: auto; + right: auto; + bottom: 0; + border-radius: 0; + -webkit-box-shadow: 0 -3px 3px rgb(0 0 0 / 25%); + box-shadow: 0 -3px 3px rgb(0 0 0 / 25%) + } + + #cookieBanner.display-bottom .content-wrap, + #cookieBanner.display-top .content-wrap { + display: block + } + + #cookieBanner.display-bottom .msg-wrap, + #cookieBanner.display-top .msg-wrap { + max-width: 100% + } + + #cookieBanner.display-bottom #cookieSettings, + #cookieBanner.display-top #cookieSettings { + margin-bottom: 20px + } +} + +#cookieBlur { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.87); + z-index: 9999; + transition: opacity 0.3s ease-in-out; + opacity: 1; + pointer-events: all; +} \ No newline at end of file diff --git a/app-rappaurio/server/controllers/auth.js b/app-rappaurio/server/controllers/auth.js new file mode 100644 index 0000000..d775cea --- /dev/null +++ b/app-rappaurio/server/controllers/auth.js @@ -0,0 +1,162 @@ +const mysql = require('mysql'); +const jwt = require('jsonwebtoken'); +const bcrypt = require('bcryptjs'); +const { promisify } = require('util'); + +const db = mysql.createConnection({ + host: process.env.DATABASE_HOST, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE +}); + +exports.login = async (req, res) => { + try { + const { email, password } = req.body; + if (!email || !password) { + return res.status(400).render('contains/connexion', { + message: 'Veuillez entrer un email et un mot de passe' + }) + } + + db.query('SELECT * FROM users WHERE email = ?', [email], async (error, result) => { + console.log(result) + if (!result || result.length == 0 || !(await bcrypt.compare(password, result[0].password))) { + res.status(401).render('contains/connexion', { + message: 'Email ou Mot de passe incorrect' + }) + } + else { + const id = result[0].id; + // creating a token + const token = jwt.sign({ id: id }, process.env.JWT_SECRET, { + expiresIn: process.env.JWT_EXPIRES_IN + }); + + console.log("The token is : " + token); + + // when does our token expires + const cookieOptions = { + expires: new Date( + Date.now() + process.env.JWT_COOKIE_EXPIRES_IN * 24 * 60 * 60 * 1000 + ), + // just to prevent if someone is not messing with our cookies + httpOnly: true + } + // we can use any name here in res.cookie(name , token , cookieoptions ) ; + // after a user is loged in we put cookie in browser + res.cookie('jwt', token, cookieOptions); + res.status(200).redirect('/'); + } + }) + } catch (error) { + console.log(error); + } + +} + +exports.register = (req, res) => { + console.log(req.body); + + // de-structuring in javaScript.... + const { name, email, password } = req.body; + + db.query('SELECT email FROM users WHERE email = ?', [email], async (error, result) => { + if (error) { + console.log(error); + } + if (result.length > 0) { + return res.render('contains/inscription', { + message: 'Cet email est déjà utilisé' + }) + } + + let hashedPassword = await bcrypt.hash(password, 8); + + console.log(hashedPassword); + + db.query('INSERT INTO users SET ?', { name: name, email: email, password: hashedPassword }, (error, result) => { + if (error) { + console.log(error); + } + else { + console.log(result); + + db.query('SELECT * FROM users WHERE email = ?', [email], async (error, result) => { + console.log(result) + + const id = result[0].id; + // creating a token + const token = jwt.sign({ id: id }, process.env.JWT_SECRET, { + expiresIn: process.env.JWT_EXPIRES_IN + }); + + console.log("The token is : " + token); + + // when does our token expires + const cookieOptions = { + expires: new Date( + Date.now() + process.env.JWT_COOKIE_EXPIRES_IN * 24 * 60 * 60 * 1000 + ), + // just to prevent if someone is not messing with our cookies + httpOnly: true + } + // we can use any name here in res.cookie(name , token , cookieoptions ) ; + // after a user is loged in we put cookie in browser + res.cookie('jwt', token, cookieOptions); + res.status(200).redirect('/'); + + }) + + + } + }); + }) + +} + +exports.isLoggedIn = async (req, res, next) => { + + console.log(req.cookies); + if (req.cookies.jwt) { + try { + // step 1 : Verify the token + const decoded = await promisify(jwt.verify)( + req.cookies.jwt, + process.env.JWT_SECRET + ) + + //console.log(decoded); + + const userId = decoded.id; + req.userId = userId; + + // step 2: check if the user still exists + db.query('SELECT * FROM users WHERE id = ?', [decoded.id], (error, result) => { + console.log(result); + + if (!result) { + return next(); + } + req.user = result[0]; + return next(); + }); + + } catch (error) { + console.log(error); + return next(); + } + } + else { + next(); + } +} + + +exports.logout = async (req, res) => { + res.cookie('jwt', 'déconnecté', { + expires: new Date(Date.now() + 2 * 1000), + httpOnly: true + }); + res.status(200).redirect('/'); +} \ No newline at end of file diff --git a/app-rappaurio/server/controllers/historiqueController.js b/app-rappaurio/server/controllers/historiqueController.js new file mode 100644 index 0000000..a0a2088 --- /dev/null +++ b/app-rappaurio/server/controllers/historiqueController.js @@ -0,0 +1,21 @@ +const mysql = require('mysql'); + +// Créez une connexion à la base de données +const db = mysql.createConnection({ + host: process.env.DATABASE_HOST, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE +}); + +// Fonction pour récupérer les données depuis la base de données +exports.getHistoriqueData = (userId, callback) => { + db.query('SELECT * FROM search WHERE id = ? LIMIT 50', [userId], (error, results) => { + if (error) { + console.error('Erreur lors de la récupération des données depuis la base de données :', error); + callback(error, null); + } else { + callback(null, results); + } + }); +}; diff --git a/app-rappaurio/server/controllers/searchController.js b/app-rappaurio/server/controllers/searchController.js new file mode 100644 index 0000000..efae80e --- /dev/null +++ b/app-rappaurio/server/controllers/searchController.js @@ -0,0 +1,27 @@ +// searchController.js + +const mysql = require('mysql'); + +// Créez une connexion à la base de données +const db = mysql.createConnection({ + host: process.env.DATABASE_HOST, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE +}); + +// Fonction pour insérer les données de recherche dans la base de données +exports.insertSearchData = (userId, articleTitle1, articleTitle2, callback) => { + db.query('INSERT INTO search (id, article1, article2) VALUES (?, ?, ?)', [userId, articleTitle1, articleTitle2], (error, result) => { + if (error) { + console.error('Erreur lors de l\'insertion des données dans la base de données :', error); + // Vous pouvez gérer l'erreur en appelant le callback avec l'erreur + callback(error, null); + } else { + // Les données ont été insérées avec succès + console.log('Données insérées avec succès dans la base de données.'); + // Appelez le callback avec succès + callback(null, result); + } + }); +}; diff --git a/app-rappaurio/server/functions/compare.js b/app-rappaurio/server/functions/compare.js new file mode 100644 index 0000000..122e70f --- /dev/null +++ b/app-rappaurio/server/functions/compare.js @@ -0,0 +1,165 @@ +const Wikiapi = require('wikiapi'); +const wiki = new Wikiapi('fr'); +const axios = require('axios'); + + +// == Functions + +// Fonction de nettoyage personnalisée (pour infobox) +function cleanInfoboxText(text) { + // Supprimer les balises HTML + const cleanedText = text.replace(/<\/?[^>]+(>|$)/g, ""); + + // Supprimer les caractères '{' et '}' + const cleanedTextWithoutBraces = cleanedText.replace(/[{}]/g, ""); + + // Supprimer le caractère '|' + const cleanedTextWithoutPipe = cleanedTextWithoutBraces.replace(/\|/g, ""); + + // Supprimer les caractères '[' et ']' + const finalText = cleanedTextWithoutPipe.replace(/[\[\]]/g, ""); + + return finalText.trim(); +} + +// Fonction pour récupérer les informations d'un article depuis l'API MediaWiki +async function fetchArticleInfoFromAPI(articleTitle) { + try { + // Définir les paramètres de la requête pour obtenir les suggestions de titre + const suggestionParams = new URLSearchParams({ + action: 'opensearch', + search: articleTitle, + format: 'json', + }); + + // Effectuer la requête GET pour obtenir les suggestions de titre + const suggestionResponse = await axios.get(`https://fr.wikipedia.org/w/api.php?${suggestionParams.toString()}`); + const suggestionData = suggestionResponse.data; + + // Vérifier s'il y a des suggestions de titre + if (Array.isArray(suggestionData[1]) && suggestionData[1].length > 0) { + // Utiliser le premier titre suggéré comme titre de l'article + articleTitle = suggestionData[1][0]; + } + + // Répéter la requête pour obtenir les informations de l'article avec le titre corrigé ou suggéré + const params = new URLSearchParams({ + action: 'query', + titles: articleTitle, + format: 'json', + prop: 'extracts|info|revisions|pageimages', // Ajoutez 'pageimages' pour obtenir les informations sur l'image + inprop: 'url', + explaintext: true, + rvprop: 'timestamp|user|size|ids', + rvlimit: 1, + piprop: 'original', // Spécifiez 'original' pour obtenir l'URL de l'image originale + }); + + // Effectuer la requête GET à l'API MediaWiki + const response = await axios.get(`https://fr.wikipedia.org/w/api.php?${params.toString()}`); + const data = response.data; + + // ==== RECHERCHE INFOBOX ==== + + let infobox = {}; + + // Vérifiez si articleTitle est défini et non vide + if (articleTitle) { + const page_data = await wiki.page(articleTitle); + const parsed = page_data.parse(); + + // Filtre des données compliquée à représentée + const variablesExclues = ['image', 'blason', 'drapeau', 'logo', 'légende', 'carte', 'légende-carte', '_', 'statut', 1, 2, 3, 4, 5, 6, 7, 8, 9]; + + // Lire les modèles Infobox, les convertir en JSON. + parsed.each('template', (template_token) => { + if (template_token.name.startsWith('Infobox')) { + const parameters = template_token.parameters; + for (const key of Object.keys(parameters)) { + const value = parameters[key]; + if (value !== '' && !variablesExclues.some(excluded => key.includes(excluded))) { + infobox[key] = cleanInfoboxText(value.toString()); // Appliquer la fonction de nettoyage ici + } + } + return parsed.each.exit; + } + }); + + // Vérifiez si l'infobox est vide + if (Object.keys(infobox).length === 0) { + console.log("Warning : Pas d'infobox"); + infobox = { + Erreur: "Pas d'infobox sur wikipédia" + }; + } + + } else { + return null; + } + + // ------------------------------------------------------------ + + // Vérifier si 'query' existe dans les données + if (data.query) { + // Obtenir la première page (il peut y avoir plusieurs résultats, nous prenons le premier) + const page = Object.values(data.query.pages)[0]; + + if (page.missing !== undefined) { + console.log(`Warning : l'article "${articleTitle}" n'a pas été trouvé.`); + return null; + } else { + + // Fonction pour limiter le texte à 300 caractères et s'arrêter au dernier point + function limitTextTo300Chars(text) { + if (text.length <= 300) { + // Si le texte est déjà inférieur ou égal à 300 caractères, retournez-le tel quel + return text; + } else { + // Trouvez le dernier point dans les 300 premiers caractères + const truncatedText = text.substring(0, 300); + const lastPeriodIndex = truncatedText.lastIndexOf('.'); + + if (lastPeriodIndex !== -1) { + // S'il y a un point dans les 300 premiers caractères, coupez le texte jusqu'à ce point + return truncatedText.substring(0, lastPeriodIndex + 1); + } else { + // S'il n'y a pas de point, retournez simplement les 200 premiers caractères + return truncatedText; + } + } + } + + // Extraire les informations + const articleInfo = { + url: page.fullurl, + title: page.title, + extract: page.extract ? limitTextTo300Chars(page.extract) : 'Non disponible', + lastEdit: page.revisions ? new Date(page.revisions[0].timestamp).toLocaleString() : 'Non disponible', + numRevisions: page.revisions ? page.revisions[0].revid : 'Non disponible', + pageSize: page.revisions ? page.revisions[0].size : 'Non disponible', + firstRevisionUser: page.revisions ? page.revisions[0].user : 'Non disponible', + latestRevisionId: page.revisions ? page.revisions[0].revid : 'Non disponible', + pageId: page.pageid ? page.pageid : 'Non disponible', + latestVersion: page.revisions ? page.revisions[0].parentid : 'Non disponible', + wordCount: page.extract ? page.extract.split(/\s+/).length : 'Non disponible', + charCount: page.extract ? page.extract.length : 'Non disponible', + lastContributor: page.revisions ? page.revisions[0].user : 'Non disponible', + image: page.original ? page.original.source : 'Non disponible', + infobox, + }; + + return articleInfo; + } + } else { + console.log(`Warning : l'article "${articleTitle}" n'a pas été trouvé.`); + return null; + } + } catch (error) { + console.error('Erreur : lors de la récupération des informations depuis l\'API :', error); + return null; + } +} + +module.exports = { + fetchArticleInfoFromAPI + }; \ No newline at end of file diff --git a/app-rappaurio/server/routes/auth.js b/app-rappaurio/server/routes/auth.js new file mode 100644 index 0000000..14c2a41 --- /dev/null +++ b/app-rappaurio/server/routes/auth.js @@ -0,0 +1,14 @@ +const express = require('express'); +const authController = require('../controllers/auth'); +const router = express.Router(); + + + +router.post('/inscription' , authController.register); + +router.post('/connexion' , authController.login); + +router.get('/deconnexion' , authController.logout) + + +module.exports = router ; \ No newline at end of file diff --git a/app-rappaurio/server/routes/index.js b/app-rappaurio/server/routes/index.js new file mode 100644 index 0000000..8bf10f6 --- /dev/null +++ b/app-rappaurio/server/routes/index.js @@ -0,0 +1,83 @@ +var express = require('express'); +const authController = require('../controllers/auth') +const searchController = require('../controllers/searchController'); +const historiqueController = require('../controllers/historiqueController'); +const { fetchArticleInfoFromAPI } = require('../functions/compare'); + +var router = express.Router(); + +/* GET home page. */ +router.get('/', authController.isLoggedIn, (req, res, next) => { + res.render('contains/index', { user_details: req.user }); +}); + + +// inscription page +router.get('/inscription', (req, res) => { + res.render('contains/inscription') +}); + +router.get('/connexion', (req, res) => { + res.render('contains/connexion') +}); + + +router.get('/historique', authController.isLoggedIn, (req, res) => { + console.log(req.user); + + if (req.user) { + const userId = req.user.id; + historiqueController.getHistoriqueData(userId, (error, historiqueData) => { + if (error) { + console.error('Erreur lors de la récupération des données depuis la base de données :', error); + res.status(500).json({ error: 'Une erreur s\'est produite lors de la récupération des données.' }); + } else { + + res.render('contains/historique', { + user_details: req.user, + historiqueData: historiqueData + }); + } + }); + } else { + res.redirect('/connexion'); + } +}); + + +// Send search for articles +router.post('/search', authController.isLoggedIn, async (req, res) => { + try { + // Récupérez les données du formulaire depuis req.body + const articleTitle1 = req.body.articleTitle1; + const articleTitle2 = req.body.articleTitle2; + + // Utilisez la fonction pour récupérer les informations des articles + const articleInfo1 = await fetchArticleInfoFromAPI(articleTitle1); + const articleInfo2 = await fetchArticleInfoFromAPI(articleTitle2); + + // Récupérez l'ID de l'utilisateur + const userId = req.userId; + + // Utilisez la fonction du contrôleur pour insérer les données + + if (userId) { + searchController.insertSearchData(userId, articleTitle1, articleTitle2, (error, result) => { + if (error) { + console.error('Erreur lors de l\'insertion des données dans la base de données :', error); + res.status(500).json({ error: 'Une erreur s\'est produite lors de l\'enregistrement des données.' }); + } else { + } + }); + } + + // Renvoyez la réponse au format JSON + res.json({ articleInfo1, articleInfo2 }); + } catch (error) { + console.error('Erreur lors de la recherche d\'informations sur les articles :', error); + res.status(500).json({ error: 'Une erreur s\'est produite lors de la recherche d\'informations sur les articles.' }); + } +}); + + +module.exports = router; diff --git a/app-rappaurio/views/contains/404.hbs b/app-rappaurio/views/contains/404.hbs new file mode 100644 index 0000000..aa95a3f --- /dev/null +++ b/app-rappaurio/views/contains/404.hbs @@ -0,0 +1,71 @@ + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Oups ! La page n'a pas été trouvée. +

+

+ La page que vous avez demandée peut avoir été déplacée, supprimée ou n'a jamais existé. Vous avez peut-être suivi un lien incorrect ou une URL mal orthographiée. +

+ + page d'accueil + +
+
+
+
+
+ diff --git a/app-rappaurio/views/contains/connexion.hbs b/app-rappaurio/views/contains/connexion.hbs new file mode 100644 index 0000000..e624041 --- /dev/null +++ b/app-rappaurio/views/contains/connexion.hbs @@ -0,0 +1,90 @@ +
+
+
+
+
+

+ Connexion à votre compte +

+ + +
+
+ + +
+
+ + +
+
+ * champs obligatoires +
+ + +
+ + +
+ + +
+ +
+ +
+ + + +

+ Vous n'avez pas de compte? + Inscription +

+ + {{#if message }} +

{{message}}

+ {{/if}} + +
+
+
+
+
\ No newline at end of file diff --git a/app-rappaurio/views/contains/historique.hbs b/app-rappaurio/views/contains/historique.hbs new file mode 100644 index 0000000..0007421 --- /dev/null +++ b/app-rappaurio/views/contains/historique.hbs @@ -0,0 +1,34 @@ +
+
+
+
+ + + + + + + + + + + + + + + {{#each historiqueData }} + + + + + {{/each}} + +
Article 1Article 2
{{this.article1}}{{this.article2}}
+ + + +
+
+
+
\ No newline at end of file diff --git a/app-rappaurio/views/contains/index.hbs b/app-rappaurio/views/contains/index.hbs new file mode 100644 index 0000000..854114b --- /dev/null +++ b/app-rappaurio/views/contains/index.hbs @@ -0,0 +1,455 @@ + + +
+
+
+
+
+

+ Comparateur d'articles Wikipédia +

+ logo wikipedia + +

+ Bienvenue sur notre outil de comparaison d'articles Wikipédia ! Cet outil permet de comparer les + données contenues dans les infoboîtes ainsi que les statistiques liées aux utilisateurs tels que + les + vues et le nombre de contributions. +

+ +
+
+
+
+
+ + + + +
+ + +
+
+
+
+ +

+ Articles à Comparer +

+

+ Completer les champs suivant : +

+ + +
+
+
+
+ + + + +
+
+
+
+ + +
+
+ +
+ +
+ * champs obligatoires +
+
+ +
+
+ +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + \ No newline at end of file diff --git a/app-rappaurio/views/contains/inscription.hbs b/app-rappaurio/views/contains/inscription.hbs new file mode 100644 index 0000000..d2c29a3 --- /dev/null +++ b/app-rappaurio/views/contains/inscription.hbs @@ -0,0 +1,94 @@ +
+
+
+
+
+

+ Créez votre compte +

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ * champs obligatoires +
+ + + + + +
+ +
+ +
+

+ Déjà un compte? + Connexion +

+ + {{#if message }} +

{{message}}

+ {{/if}} + +
+
+
+
+
\ No newline at end of file diff --git a/app-rappaurio/views/layout.hbs b/app-rappaurio/views/layout.hbs new file mode 100644 index 0000000..6fa14fd --- /dev/null +++ b/app-rappaurio/views/layout.hbs @@ -0,0 +1,202 @@ + + + + + + + + + + Rappaurio - Wiki + + + + + + + + + + + +
+
+
+ +
+
+ + +
+ + +
+ {{#if user_details }} + + {{else}} + + + {{/if}} +
+ +
+
+ + +
+
+
+
+ + + {{{body}}} + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c934177 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,44 @@ +version: "3.8" +services: + nodejs: # Service pour nodejs + networks: + - rappaurio-net + build: + context: ./app-rappaurio + volumes: + - ./app-rappaurio:/user/src/app + ports: + - "5000:5000" + restart: unless-stopped + + nginx: # Service serveur web + networks: + - rappaurio-net + build: + context: ./nginx + volumes: + - ./nginx/default.conf:/etc/nginx/conf.d/default.conf + ports: + - "8888:80" + restart: unless-stopped + + + db: + image: mariadb:latest + networks: + - rappaurio-net + env_file: + - .env # fichier contenant les mot de passes + environment: + MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD} + MYSQL_DATABASE: ${DATABASE} + MYSQL_USER: ${DATABASE_USER} + MYSQL_PASSWORD: ${DATABASE_PASSWORD} + volumes: + - ./mariadb/mysql:/var/lib/mysql + - ./mariadb:/docker-entrypoint-initdb.d + command: --init-file /docker-entrypoint-initdb.d/rappaurio.sql + restart: unless-stopped + +networks: + rappaurio-net: \ No newline at end of file diff --git a/img/.gitkeep b/img/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/img/Diagramme_architecture.png b/img/Diagramme_architecture.png new file mode 100644 index 0000000..67b80e0 Binary files /dev/null and b/img/Diagramme_architecture.png differ diff --git a/img/Diagramme_exigence.vpd_v1.png b/img/Diagramme_exigence.vpd_v1.png new file mode 100644 index 0000000..122937d Binary files /dev/null and b/img/Diagramme_exigence.vpd_v1.png differ diff --git a/img/demo.gif b/img/demo.gif new file mode 100644 index 0000000..52eb9e4 Binary files /dev/null and b/img/demo.gif differ diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 0000000..c277e3a --- /dev/null +++ b/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mariadb/rappaurio.sql b/mariadb/rappaurio.sql new file mode 100644 index 0000000..435f107 --- /dev/null +++ b/mariadb/rappaurio.sql @@ -0,0 +1,29 @@ + +/* +By Dario Weinberger & Raphael Payet +©2023 +*/ + +-- Utiliser la base de données +USE rappaurio; + +-- Créer la table "User" +CREATE TABLE `users` ( + `id` int(255) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +); + +-- Créer la table "Search" +CREATE TABLE `search` ( + `id_search` int(11) NOT NULL AUTO_INCREMENT, + `id` int(11) DEFAULT NULL, + `article1` varchar(255) NOT NULL, + `article2` varchar(255) NOT NULL, + `date` timestamp NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id_search`), + KEY `id` (`id`), + CONSTRAINT `search_ibfk_1` FOREIGN KEY (`id`) REFERENCES `users` (`id`) +); diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 0000000..ce14e86 --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx +COPY default.conf /etc/nginx/conf.d/default.conf diff --git a/nginx/default.conf b/nginx/default.conf new file mode 100644 index 0000000..9261b65 --- /dev/null +++ b/nginx/default.conf @@ -0,0 +1,10 @@ +server { + location / { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_pass http://nodejs:5000; + } +}