[
  {
    "path": ".github/workflows/deploy.yml",
    "content": "on:\n    push:\n        branches:\n            - main\nname: 🚀 Deploy website on push\njobs:\n    web-deploy:\n        name: 🎉 Deploy\n        runs-on: ubuntu-latest\n        steps:\n            - name: 🚚 Get latest code\n              uses: actions/checkout@v2\n\n            - name: 📂 Sync files\n              uses: SamKirkland/FTP-Deploy-Action@4.3.0\n              with:\n                  server: ${{ secrets.ftp_server }}\n                  username: ${{ secrets.ftp_username }}\n                  password: ${{ secrets.ftp_password }}"
  },
  {
    "path": ".gitignore",
    "content": "# Created by https://www.toptal.com/developers/gitignore/api/flask\n# Edit at https://www.toptal.com/developers/gitignore?templates=flask\nmigrations/\n__pycache__/\napplication/__pycache__/\napplication/public/__pycache__/\n*/*/__pycache__/\n*/*/*/__pycache__/\n*/*/*/*/__pycache__/\n*/*/*/*/*/__pycache__/\n.idea/\nvenv/\nenv/\n.code/\n.vscode/    \n.pytest_cache/\ntempCodeRunnerFile.py\n\n### Flask ###\ninstance/*\n!instance/.gitignore\n.webassets-cache\n.env\n\n### Flask.Python Stack ###\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n#.idea/\n\n# End of https://www.toptal.com/developers/gitignore/api/flask"
  },
  {
    "path": "application/CohereAI/GenerateBlog.py",
    "content": "import os\nimport time\nimport cohere\nfrom dotenv import find_dotenv, load_dotenv\n\nload_dotenv(find_dotenv())\n\n# Cohere AI API setup\nco = cohere.Client(os.getenv('API_KEY'))\n\ndef max_likely(prediction):\n    output = prediction.generations[0].text\n    return output\n\n# Generate blog posts for each keyword\ndef generate_letter(gender):\n        letter_generate = co.generate(\n            model='command',\n            prompt= \"You are a poet, you are known for your unique romantic, flirting words and today is valentines day. Write one very short sentence within 65 character romantic, loving, caring message for my \" + gender,\n            max_tokens=70,\n            temperature=0.9,\n            stop_sequences=[\"---\"]\n        )\n\n        letter = max_likely(letter_generate)\n\n        return letter"
  },
  {
    "path": "application/CohereAI/Utils.py",
    "content": "import uuid\n\ndef linkid():\n    link = uuid.uuid4().hex[:8]\n    return link"
  },
  {
    "path": "application/__init__.py",
    "content": "from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_bcrypt import Bcrypt\nfrom flask_login import LoginManager\nfrom flask_migrate import Migrate\nfrom flask_moment import Moment\nfrom application.config import Config\n\nfrom flask_mail import Mail\n\ndb = SQLAlchemy()\nbcrypt = Bcrypt()\nlogin_manager = LoginManager()\nmigrate = Migrate()\nmoment = Moment()\nmail = Mail()\n\nlogin_manager.login_view = 'auth.login'\n\nlogin_manager.login_message_category = 'info'\n\ndef create_app(config_class=Config):\n    app = Flask(__name__)\n    app.config.from_object(Config)\n    \n    db.init_app(app)\n    bcrypt.init_app(app)\n    login_manager.init_app(app)\n    moment.init_app(app)\n    migrate.init_app(app, db)\n    mail.init_app(app)\n\n    from application.models import User\n    from application.models import Visitor\n\n    from application.auth.views import auth\n    app.register_blueprint(auth)\n    \n    from application.public.views import public\n    app.register_blueprint(public)\n    \n    from application.superadmin.views import superadmin\n    app.register_blueprint(superadmin)\n\n    from application.user.views import user\n    app.register_blueprint(user)\n\n    return app"
  },
  {
    "path": "application/auth/__init__.py",
    "content": ""
  },
  {
    "path": "application/auth/forms.py",
    "content": "from flask_wtf import FlaskForm\n\nfrom wtforms import StringField\nfrom wtforms import PasswordField\nfrom wtforms import IntegerField\nfrom wtforms import SubmitField\nfrom wtforms import BooleanField\nfrom wtforms import TextAreaField\nfrom wtforms import SelectField\nfrom wtforms import DateField\n\nfrom flask_wtf.file import FileField\nfrom flask_wtf.file import FileAllowed\n\nfrom wtforms.validators import DataRequired\nfrom wtforms.validators import NumberRange\nfrom wtforms.validators import Optional\nfrom wtforms.validators import Length\nfrom wtforms.validators import Email\nfrom wtforms.validators import EqualTo\nfrom wtforms.validators import ValidationError\n\nfrom flask_login import current_user\nfrom application.models import User\n\nclass RegistrationForm(FlaskForm):\n    name = StringField(\n        'Your Name',\n        validators = [\n            DataRequired(),\n            Length(2, 50)\n        ]\n    )\n\n    phone = StringField(\n        'Phone',\n        validators=[\n            DataRequired(),\n            Length(min=5, max=15, message='Phone number must be between 5 and 15.')\n        ]\n    )\n\n    email = StringField(\n        'E-mail',\n        validators = [\n            DataRequired(),\n            Email()\n        ]\n    )\n\n    password = PasswordField(\n        'Password',\n        validators = [ DataRequired() ]\n    )\n\n    confirm_password = PasswordField(\n        'Confirm Password',\n        validators = [\n            DataRequired(),\n            EqualTo('password')\n        ]\n    )\n\n    submit = SubmitField('Join Now')\n    \n    def validate_phone(self, phone):\n        user_phone = User.query.filter_by(phone=phone.data).first()\n        if user_phone:\n            raise ValidationError('This Phone is alredy registerd. Please choose a different one.')\n\n    def validate_email(self, email):\n        user_email = User.query.filter_by(email=email.data).first()\n        if user_email:\n            raise ValidationError('That email is taken/already registered. Please choose a different one.')\n            \n\n\nclass LoginForm(FlaskForm):\n    phone = StringField(\n        'Phone',\n        validators=[\n            DataRequired(),\n            Length(min=5, max=15, message='Phone number must be between 5 and 15.')\n        ]\n    )\n\n    password = PasswordField(\n        'Password', \n        validators = [DataRequired()]\n    )\n\n    remember = BooleanField('Remember Me')\n\n    submit = SubmitField('Login')\n\n\n# UPDATE PASSWORD FORM\nclass UpdatePasswordForm(FlaskForm):\n    currentPassword = PasswordField(\n        'Current Password', \n        validators=[ DataRequired() ]\n    )\n\n    newPassword = PasswordField(\n        'New Password', \n        # validators=[ DataRequired() ]\n    )\n\n    confirmnewPassword = PasswordField(\n        'Confirm New Password', \n        # validators=[ DataRequired() ]\n    )\n\n    submit = SubmitField('Save')\n\n\n#   FORGET PASSWORD FORM\nclass ForgetPasswordForm(FlaskForm):\n    email = StringField(\n        'Email',\n        validators = [\n            Email()\n        ]\n    )\n\n    submit = SubmitField('Get Password Reset Link')\n\n\n#   CHANGE PASSWORD TOKEN\nclass ResetPasswordForm(FlaskForm):\n    password = PasswordField(\n            'Password',\n            validators=[ DataRequired() ]\n    )\n\n    confirm_password = PasswordField(\n            'Confirm Password',\n            validators = [\n                DataRequired(),\n                EqualTo('password')\n            ]\n    )\n\n    submit = SubmitField('Reset Password')"
  },
  {
    "path": "application/auth/views.py",
    "content": "#   importing basic flask module\nfrom flask import Blueprint\nfrom flask import redirect\nfrom flask import render_template\nfrom flask import request\nfrom flask import url_for\nfrom flask import flash\nfrom flask import abort\nfrom flask import jsonify\nfrom flask import make_response\nfrom flask import current_app\n\n#   importing module from flask login\nfrom flask_login import current_user\nfrom flask_login import login_required\nfrom flask_login import login_user\nfrom flask_login import logout_user\n\nfrom application import db\nfrom application import bcrypt\nfrom application.models import User\nfrom application.auth.forms import LoginForm \nfrom application.auth.forms import RegistrationForm\nfrom application.auth.forms import UpdatePasswordForm\nfrom application.auth.forms import ForgetPasswordForm\nfrom application.auth.forms import ResetPasswordForm\n\nfrom application.utils.SendEmail import send_reset_email\n\nauth = Blueprint('auth', __name__)\n\n# @auth.route('/join/admin/', methods=['GET', 'POST'])\n# def join_superadmin():\n#     current_ip = request.remote_addr\n#     if current_user.is_authenticated:\n#         current_user.ip = current_ip\n#         db.session.commit()\n#         return redirect(url_for('user.dashboard'))\n#     form = RegistrationForm()\n#     if form.validate_on_submit():\n#         hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')\n#         if form.middle_name.data:\n#             user = User(\n#                 first_name=form.first_name.data.strip(), \n#                 middle_name=form.middle_name.data.strip(), \n#                 last_name=form.last_name.data.strip(), \n#                 phone=form.phone.data, \n#                 password=hashed_password, \n#                 email=form.email.data.strip(), address=form.address.data.strip(), \n#                 user_role='superadmin', is_active=True\n#             )\n#         else:\n#             user = User(\n#                 first_name=form.first_name.data.strip(), \n#                 last_name=form.last_name.data.strip(), \n#                 phone=form.phone.data, \n#                 password=hashed_password, \n#                 email=form.email.data.strip(), address=form.address.data.strip(), \n#                 user_role='superadmin', is_active=True\n#             )\n#         db.session.add(user)\n#         db.session.commit()\n#         send_activation_email(user)\n#         send_admin_contact_alert_email(user)\n#         flash('Check your email, we have sent you a confirmation link to activate your account', 'info')\n#         return redirect(url_for('auth.login'))\n#     return render_template('auth/join.html', form=form)\n\n#   NEW USER JOIN PAGE\n@auth.route('/join/', methods=['GET', 'POST'])\ndef join():\n    current_ip = request.remote_addr\n    if current_user.is_authenticated:\n        current_user.ip = current_ip\n        db.session.commit()\n        return redirect(url_for('user.dashboard'))\n    form = RegistrationForm()\n    if form.validate_on_submit():\n        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')\n\n        user = User(\n            name=form.name.data.strip(),\n            phone=form.phone.data, \n            password=hashed_password, \n            email=form.email.data.strip(), \n            user_role='user', \n            is_active=True\n        )\n        db.session.add(user)\n        db.session.commit()\n        flash('Account created successfully', 'info')\n        return redirect(url_for('auth.login'))\n    return render_template('auth/join.html', form=form)\n\n\n\n# Activate account route\n@auth.route('/activate/<token>')\ndef activate(token):\n    # Activate a user's account\n    user = User.query.filter_by(activation_token=token, is_active=False).first()\n    if user:\n        user_verified = user.verify_reset_token(token)\n        if user_verified:\n            user.is_active = True\n            db.session.commit()\n            flash('Your account has been activated! You are now able to log in ✅', 'success')\n        return redirect(url_for('auth.login'))\n    else:\n        flash('The activation link is invalid or has expired.', 'warning')\n        return redirect(url_for('auth.join'))\n\n\n#   USER LOGIN PAGE\n@auth.route('/login/', methods=['GET', 'POST'])\ndef login():\n    form = LoginForm()\n    current_ip = request.remote_addr\n    if current_user.is_authenticated:\n        current_user.ip = current_ip\n        db.session.commit()\n        return redirect(url_for('user.dashboard'))\n\n    if form.validate_on_submit():\n        user = User.query.filter_by(phone=form.phone.data).first_or_404()\n        if user and user.is_active and bcrypt.check_password_hash(user.password, form.password.data):\n            login_user(user, remember=form.remember.data)\n            next_page = request.args.get('next')\n            flash('✅ Login success', 'success')\n            return redirect(next_page) if next_page else redirect(url_for('user.dashboard'))\n        elif user and not user.is_active:\n            flash('⚠️ Please check your email and activate your account, untill you can not login', 'info')\n        else:\n            flash('⚠️ Login Unsuccessful. Please check phone number and password', 'danger')\n    return render_template('auth/login.html', form=form)\n\n\n#   USER LOGOUT\n@auth.route(\"/logout/\")\n@login_required\ndef logout():\n    logout_user()\n    flash('Logout successfully ✅', 'success')\n    return redirect(url_for('auth.login'))\n\n\n#   RESET PASSWORD FOR USER\n@auth.route('/user/resetpassword/', methods=['GET', 'POST'])\n@login_required\ndef user_resetpassword():\n    form = UpdatePasswordForm()\n    if form.validate_on_submit():\n        newpass = form.newPassword.data\n        confirmpass = form.confirmnewPassword.data\n        currentpass_hash = bcrypt.check_password_hash(current_user.password, form.currentPassword.data)\n        if currentpass_hash and newpass==confirmpass:\n            hashed_password = bcrypt.generate_password_hash(newpass).decode('utf-8')\n            current_user.password = hashed_password\n            db.session.commit()\n            flash('Your password has been updated!', 'success')\n            return redirect(url_for('user.dashboard'))\n        else:\n            flash('Password Not Matched', 'danger')\n            return redirect(url_for('user.user_resetpassword'))\n\n    return render_template('user/change_password.html', title='Change Password', form=form)\n\n# VERIFY USER EMAIL IS REGISTERED IN OUR SYSTEM\n@auth.route('/password/recover/', methods=['GET', 'POST'])\ndef forgetpassword():\n    form = ForgetPasswordForm()\n    if current_user.is_authenticated:\n        return redirect(url_for('user.dashboard'))\n    if form.validate_on_submit():\n        user = User.query.filter_by(email=form.email.data).first()\n        send_reset_email(user)\n        flash('If you have an account with this email, an email has been sent with instructions to reset your password.', 'info')\n        return redirect(url_for('auth.login'))\n\n    return render_template('auth/forgetpassword.html', title='Reset Password', form=form)\n\n\n#   PASSWORD RESET TOKEN\n@auth.route(\"/reset-password/<token>\", methods=['GET', 'POST'])\ndef reset_token(token):\n    if current_user.is_authenticated:\n        return redirect(url_for('user.index'))\n    user = User.verify_reset_token(token)\n    if user is None:\n        flash('That is an invalid or expired token', 'warning')\n        return redirect(url_for('user.reset_request'))\n    form = ResetPasswordForm()\n    if form.validate_on_submit():\n        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')\n        user.password = hashed_password\n        db.session.commit()\n        flash('Your password has been updated! You are now able to log in', 'success')\n        return redirect(url_for('auth.login'))\n    return render_template('auth/reset_token.html', title='Reset Password', form=form)"
  },
  {
    "path": "application/config.py",
    "content": "import os\nfrom dotenv import find_dotenv, load_dotenv\n\nload_dotenv(find_dotenv())\n\nproduction=True \n# production=False\n\nclass Config:\n    SECRET_KEY='248fb9a5bdffa13c0bc136504ebf75c2'\n    if production is True:\n        SQLALCHEMY_DATABASE_URI=os.getenv('SQLALCHEMY_DATABASE_URI')\n    else:\n        SQLALCHEMY_DATABASE_URI='sqlite:///valentine.db'\n\n    # SQLALCHEMY_TRACK_MODIFICATIONS=True\n    MAIL_SERVER = os.getenv('SMTP_SERVER')\n    MAIL_DEFAULT_SENDER = 'amazonkdp@binomatrix.com'\n    MAIL_PORT = 465\n    MAIL_USE_SSL = True\n    MAIL_USERNAME = os.getenv('EMAIL_USERNAME')\n    MAIL_PASSWORD = os.getenv('EMAIL_PASSWORD')"
  },
  {
    "path": "application/models.py",
    "content": "import secrets\n#   importing  necessary module\nfrom datetime import datetime\nfrom flask import current_app\n\n#   importing dataase\nfrom application import db\n\n#   importing login manager\nfrom application import login_manager\nfrom flask_login import UserMixin\n\nfrom itsdangerous import TimedJSONWebSignatureSerializer as Serializer\n\n\n#   making sure that the user is logged in\n@login_manager.user_loader\ndef load_user(user_id):\n    return User.query.get(int(user_id))\n\nclass User(db.Model, UserMixin):\n    __tablename__ = 'user'\n    id = db.Column(db.Integer, primary_key=True)\n    name = db.Column(db.String(300))\n    phone = db.Column(db.String(15), unique=True)\n    email = db.Column(db.String(120), unique=True)\n    img = db.Column(db.String(500), default='default.jpg')\n    password = db.Column(db.String(800), nullable=False)\n    address = db.Column(db.String(900))\n    user_role = db.Column(db.String(60), default=\"user\")\n    letter_sender = db.relationship('Letter', backref='sender', lazy=True)\n    join_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\n    ip = db.Column(db.String(60))\n    # ACCOUNT ACTIVATION\n    activation_token = db.Column(db.String(500), unique=True)\n    is_active = db.Column(db.Boolean(), default=False)\n\n    # GENERATE ACTIVATION TOKEN\n    def generate_activation_token(self, expires_sec=3600):\n        s = Serializer(current_app.config['SECRET_KEY'], expires_sec)\n        return s.dumps({'user_id': self.id}).decode('utf-8')\n\n    #   GENERATING PASSWORD RESET TOKEN\n    def get_reset_token(self, expires_sec=1800):\n        s = Serializer(current_app.config['SECRET_KEY'], expires_sec)\n        return s.dumps({'user_id': self.id}).decode('utf-8')\n\n    #  verify the token if the token has exprired or invalid\n    @staticmethod\n    def verify_reset_token(token):\n        s = Serializer(current_app.config['SECRET_KEY'])\n        try:\n            user_id = s.loads(token)['user_id']\n        except:\n            return None\n        return User.query.get(user_id)\n    \n    #  verify the token if the token has exprired or invalid\n    @staticmethod\n    def verify_activation_token(token):\n        s = Serializer(current_app.config['SECRET_KEY'])\n        try:\n            user_id = s.loads(token)['user_id']\n        except:\n            return None\n        return User.query.get(user_id)\n\n\nclass Letter(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    receiver_name = db.Column(db.String(100), nullable=False)\n    email=db.Column(db.String(100), nullable=False)\n    gender=db.Column(db.String(100), nullable=False)\n    message=db.Column(db.String(900))\n    link=db.Column(db.String(100), unique=True)\n    is_hidden = db.Column(db.Boolean(), default=False)\n    created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\n    sender_id = db.Column(db.Integer, db.ForeignKey('user.id'))\n\n\nclass Visitor(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    ip = db.Column(db.String(100), nullable=False)\n    first_name=db.Column(db.String(100))\n    middle_name=db.Column(db.String(100))\n    last_name=db.Column(db.String(100))\n    email=db.Column(db.String(100))\n    phone=db.Column(db.String(100))\n    message=db.Column(db.String(100))\n    date_visit = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\n"
  },
  {
    "path": "application/public/__init__.py",
    "content": ""
  },
  {
    "path": "application/public/views.py",
    "content": "#   importing basic flask module\nfrom flask import Blueprint\nfrom flask import redirect\nfrom flask import render_template\nfrom flask import request\nfrom flask import url_for\nfrom flask import flash\nfrom flask import abort\nfrom flask import jsonify\nfrom flask import make_response\nfrom flask import current_app\n\nfrom datetime import date\nfrom datetime import datetime\n\nfrom application import db\nfrom application.models import User\nfrom application.models import Letter\nfrom application.models import Visitor\n\nfrom application.utils.Location import getLocation\n\n\npublic = Blueprint('public', __name__)\n\n# LANDING PAGE\n@public.route('/')\ndef index():\n    # GETTING IP OF USER\n    ip_request = request.remote_addr\n    \n    # GET TODAY\n    today = datetime.utcnow().date()\n\n    # GET VISITORS\n    visitor = Visitor.query.filter_by(ip=ip_request).filter(Visitor.date_visit.like(f'{today}%')).first()\n\n    if visitor:\n        # visitor has already visited today, don't count as a new visit\n        pass\n    else:\n        visitor = Visitor(ip=ip_request)\n        db.session.add(visitor)\n        db.session.commit()\n\n    return render_template(\n        'public/landing.html'\n    )\n\n\n# LETTER PAGE\n@public.route('/letter/<string:link>/')\ndef letter(link):\n    letter = Letter.query.filter_by(link=link).order_by(Letter.created_at.desc()).first_or_404()\n    return render_template('public/letter.html', letter=letter)"
  },
  {
    "path": "application/static/assets/css/custom.css",
    "content": "/* ================ CLOCK ================ */\n.clock-container h4,\n.clock-container h5,\n.clock-container p {\n    margin-bottom: 0;\n    color: #fff !important;\n}\n\n.clock-container .clock {\n    color: var(--bs-white);\n    text-align: center;\n    position: fixed;\n    bottom: 0;\n    padding: 0.2rem 1.5rem;\n    margin: 0.5rem;\n    border-radius: 16px;\n    background-color: var(--bs-light);\n    z-index: 1025;\n}\n\n.clock-container .clock h4,\n.clock-container .clock h5 {\n    color: var(--bs-white);\n}\n\n.clock-container .clock-right {\n    right: 0;\n    background: linear-gradient(131deg, rgb(252, 171, 1), rgb(254, 33, 79) 100%);\n}\n\n.clock-container .clock-left {\n    left: 0;\n    background: linear-gradient(117deg, rgb(30, 42, 120), rgb(255, 46, 76) 100%);\n}\n\n\n/* ================ TEXT ================ */\n.text__justify {\n    text-align: justify;\n}\n\n/* ================ END TEXT ================ */"
  },
  {
    "path": "application/static/assets/js/clock.js",
    "content": "function updateClock1() {\n\tlet date = new Date();\n\tlet nyWeekday = date.toLocaleString(\"en-US\", {\n\t\ttimeZone: \"America/New_York\",\n\t\tweekday: \"long\",\n\t});\n\tlet nyTime = date.toLocaleString(\"en-US\", {\n\t\ttimeZone: \"America/New_York\",\n\t\thour: \"numeric\",\n\t\tminute: \"numeric\",\n\t\tsecond: \"numeric\",\n\t\thour12: true,\n\t});\n\tdocument.getElementById(\"nyWeekday\").innerHTML = nyWeekday;\n\tdocument.getElementById(\"nytime\").innerHTML = nyTime;\n}\n\nfunction updateClock2() {\n\tlet date = new Date();\n\tlet bdWeekday = date.toLocaleString(\"en-US\", {\n\t\ttimeZone: \"Asia/Dhaka\",\n\t\tweekday: \"long\",\n\t});\n\tlet bdTime = date.toLocaleString(\"en-US\", {\n\t\ttimeZone: \"Asia/Dhaka\",\n\t\thour: \"numeric\",\n\t\tminute: \"numeric\",\n\t\tsecond: \"numeric\",\n\t\thour12: true,\n\t});\n\tdocument.getElementById(\"bdWeekday\").innerHTML = bdWeekday;\n\tdocument.getElementById(\"bdtime\").innerHTML = bdTime;\n}\n\nsetInterval(updateClock1, 1000);\nsetInterval(updateClock2, 1000);\n"
  },
  {
    "path": "application/static/assets/js/theme.js",
    "content": "function _typeof(e) {\n\treturn (_typeof =\n\t\t\"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n\t\t\t? function (e) {\n\t\t\t\t\treturn typeof e;\n\t\t\t  }\n\t\t\t: function (e) {\n\t\t\t\t\treturn e &&\n\t\t\t\t\t\t\"function\" == typeof Symbol &&\n\t\t\t\t\t\te.constructor === Symbol &&\n\t\t\t\t\t\te !== Symbol.prototype\n\t\t\t\t\t\t? \"symbol\"\n\t\t\t\t\t\t: typeof e;\n\t\t\t  })(e);\n}\nfunction ownKeys(t, e) {\n\tvar r,\n\t\ta = Object.keys(t);\n\treturn (\n\t\tObject.getOwnPropertySymbols &&\n\t\t\t((r = Object.getOwnPropertySymbols(t)),\n\t\t\te &&\n\t\t\t\t(r = r.filter(function (e) {\n\t\t\t\t\treturn Object.getOwnPropertyDescriptor(t, e).enumerable;\n\t\t\t\t})),\n\t\t\ta.push.apply(a, r)),\n\t\ta\n\t);\n}\nfunction _objectSpread(t) {\n\tfor (var e = 1; e < arguments.length; e++) {\n\t\tvar r = null != arguments[e] ? arguments[e] : {};\n\t\te % 2\n\t\t\t? ownKeys(Object(r), !0).forEach(function (e) {\n\t\t\t\t\t_defineProperty(t, e, r[e]);\n\t\t\t  })\n\t\t\t: Object.getOwnPropertyDescriptors\n\t\t\t? Object.defineProperties(t, Object.getOwnPropertyDescriptors(r))\n\t\t\t: ownKeys(Object(r)).forEach(function (e) {\n\t\t\t\t\tObject.defineProperty(\n\t\t\t\t\t\tt,\n\t\t\t\t\t\te,\n\t\t\t\t\t\tObject.getOwnPropertyDescriptor(r, e)\n\t\t\t\t\t);\n\t\t\t  });\n\t}\n\treturn t;\n}\nfunction _defineProperty(e, t, r) {\n\treturn (\n\t\t(t = _toPropertyKey(t)) in e\n\t\t\t? Object.defineProperty(e, t, {\n\t\t\t\t\tvalue: r,\n\t\t\t\t\tenumerable: !0,\n\t\t\t\t\tconfigurable: !0,\n\t\t\t\t\twritable: !0,\n\t\t\t  })\n\t\t\t: (e[t] = r),\n\t\te\n\t);\n}\nfunction _toPropertyKey(e) {\n\te = _toPrimitive(e, \"string\");\n\treturn \"symbol\" === _typeof(e) ? e : String(e);\n}\nfunction _toPrimitive(e, t) {\n\tif (\"object\" !== _typeof(e) || null === e) return e;\n\tvar r = e[Symbol.toPrimitive];\n\tif (void 0 === r) return (\"string\" === t ? String : Number)(e);\n\tt = r.call(e, t || \"default\");\n\tif (\"object\" !== _typeof(t)) return t;\n\tthrow new TypeError(\"@@toPrimitive must return a primitive value.\");\n}\n/**\n * Silicon | Multipurpose Bootstrap 5 Template & UI Kit\n * Copyright 2023 Createx Studio\n * Theme core scripts\n *\n * @author Createx Studio\n * @version 1.5.0\n */\n!(function () {\n\t\"use strict\";\n\tvar t, e, r, a, n, o;\n\tnull !== (e = document.querySelector('[data-bs-toggle=\"mode\"]')) &&\n\t\t((t = e.querySelector(\".form-check-input\")),\n\t\t\"dark\" === mode\n\t\t\t? (root.classList.add(\"dark-mode\"), (t.checked = !0))\n\t\t\t: (root.classList.remove(\"dark-mode\"), (t.checked = !1)),\n\t\te.addEventListener(\"click\", function (e) {\n\t\t\tt.checked\n\t\t\t\t? (root.classList.add(\"dark-mode\"),\n\t\t\t\t  window.localStorage.setItem(\"mode\", \"dark\"))\n\t\t\t\t: (root.classList.remove(\"dark-mode\"),\n\t\t\t\t  window.localStorage.setItem(\"mode\", \"light\"));\n\t\t})),\n\t\tnull != (a = document.querySelector(\".navbar-sticky\")) &&\n\t\t\t((e = a.classList),\n\t\t\t(r = a.offsetHeight),\n\t\t\te.contains(\"position-absolute\")\n\t\t\t\t? window.addEventListener(\"scroll\", function (e) {\n\t\t\t\t\t\t500 < e.currentTarget.pageYOffset\n\t\t\t\t\t\t\t? a.classList.add(\"navbar-stuck\")\n\t\t\t\t\t\t\t: a.classList.remove(\"navbar-stuck\");\n\t\t\t\t  })\n\t\t\t\t: window.addEventListener(\"scroll\", function (e) {\n\t\t\t\t\t\t500 < e.currentTarget.pageYOffset\n\t\t\t\t\t\t\t? ((document.body.style.paddingTop = r + \"px\"),\n\t\t\t\t\t\t\t  a.classList.add(\"navbar-stuck\"))\n\t\t\t\t\t\t\t: ((document.body.style.paddingTop = \"\"),\n\t\t\t\t\t\t\t  a.classList.remove(\"navbar-stuck\"));\n\t\t\t\t  })),\n\t\tnew SmoothScroll(\"[data-scroll]\", {\n\t\t\tspeed: 800,\n\t\t\tspeedAsDuration: !0,\n\t\t\toffset: function (e, t) {\n\t\t\t\treturn t.dataset.scrollOffset || 40;\n\t\t\t},\n\t\t\theader: \"[data-scroll-header]\",\n\t\t\tupdateURL: !1,\n\t\t}),\n\t\tnull != (o = document.querySelector(\".btn-scroll-top\")) &&\n\t\t\t((n = parseInt(600, 10)),\n\t\t\twindow.addEventListener(\"scroll\", function (e) {\n\t\t\t\te.currentTarget.pageYOffset > n\n\t\t\t\t\t? o.classList.add(\"show\")\n\t\t\t\t\t: o.classList.remove(\"show\");\n\t\t\t})),\n\t\t(function () {\n\t\t\tfor (\n\t\t\t\tvar e = document.querySelectorAll(\".password-toggle\"), r = 0;\n\t\t\t\tr < e.length;\n\t\t\t\tr++\n\t\t\t)\n\t\t\t\t!(function () {\n\t\t\t\t\tvar t = e[r].querySelector(\".form-control\");\n\t\t\t\t\te[r].querySelector(\".password-toggle-btn\").addEventListener(\n\t\t\t\t\t\t\"click\",\n\t\t\t\t\t\tfunction (e) {\n\t\t\t\t\t\t\t\"checkbox\" === e.target.type &&\n\t\t\t\t\t\t\t\t(e.target.checked\n\t\t\t\t\t\t\t\t\t? (t.type = \"text\")\n\t\t\t\t\t\t\t\t\t: (t.type = \"password\"));\n\t\t\t\t\t\t},\n\t\t\t\t\t\t!1\n\t\t\t\t\t);\n\t\t\t\t})();\n\t\t})(),\n\t\tnull !== document.querySelector(\".rellax\") &&\n\t\t\tnew Rellax(\".rellax\", { horizontal: !0 }),\n\t\t(function () {\n\t\t\tfor (\n\t\t\t\tvar e = document.querySelectorAll(\".parallax\"), t = 0;\n\t\t\t\tt < e.length;\n\t\t\t\tt++\n\t\t\t)\n\t\t\t\tnew Parallax(e[t]);\n\t\t})(),\n\t\t(function (e, t, r) {\n\t\t\tfor (var a = 0; a < e.length; a++) t.call(r, a, e[a]);\n\t\t})(document.querySelectorAll(\".swiper\"), function (e, t) {\n\t\t\tvar r;\n\t\t\t(r =\n\t\t\t\tnull != t.dataset.swiperOptions\n\t\t\t\t\t? JSON.parse(t.dataset.swiperOptions)\n\t\t\t\t\t: r).pager &&\n\t\t\t\t(a = {\n\t\t\t\t\tpagination: {\n\t\t\t\t\t\tel: \".pagination .list-unstyled\",\n\t\t\t\t\t\tclickable: !0,\n\t\t\t\t\t\tbulletActiveClass: \"active\",\n\t\t\t\t\t\tbulletClass: \"page-item\",\n\t\t\t\t\t\trenderBullet: function (e, t) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t'<li class=\"' +\n\t\t\t\t\t\t\t\tt +\n\t\t\t\t\t\t\t\t'\"><a href=\"#\" class=\"page-link btn-icon btn-sm\">' +\n\t\t\t\t\t\t\t\t(e + 1) +\n\t\t\t\t\t\t\t\t\"</a></li>\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\tvar a = _objectSpread(_objectSpread({}, r), a),\n\t\t\t\ta = new Swiper(t, a);\n\t\t\tr.tabs &&\n\t\t\t\ta.on(\"activeIndexChange\", function (e) {\n\t\t\t\t\tvar t = document.querySelector(\n\t\t\t\t\t\te.slides[e.activeIndex].dataset.swiperTab\n\t\t\t\t\t);\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelector(\n\t\t\t\t\t\t\te.slides[e.previousIndex].dataset.swiperTab\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.classList.remove(\"active\"),\n\t\t\t\t\t\tt.classList.add(\"active\");\n\t\t\t\t});\n\t\t}),\n\t\t(function () {\n\t\t\tvar e = document.querySelectorAll(\".gallery\");\n\t\t\tif (e.length)\n\t\t\t\tfor (var t = 0; t < e.length; t++) {\n\t\t\t\t\tvar r = !!e[t].dataset.thumbnails,\n\t\t\t\t\t\ta = !!e[t].dataset.video,\n\t\t\t\t\t\tn = [lgZoom, lgFullscreen],\n\t\t\t\t\t\ta = a ? [lgVideo] : [],\n\t\t\t\t\t\tr = r ? [lgThumbnail] : [],\n\t\t\t\t\t\tr = [].concat(n, a, r);\n\t\t\t\t\tlightGallery(e[t], {\n\t\t\t\t\t\tselector: \".gallery-item\",\n\t\t\t\t\t\tplugins: r,\n\t\t\t\t\t\tlicenseKey: \"D4194FDD-48924833-A54AECA3-D6F8E646\",\n\t\t\t\t\t\tdownload: !1,\n\t\t\t\t\t\tautoplayVideoOnSlide: !0,\n\t\t\t\t\t\tzoomFromOrigin: !1,\n\t\t\t\t\t\tyoutubePlayerParams: {\n\t\t\t\t\t\t\tmodestbranding: 1,\n\t\t\t\t\t\t\tshowinfo: 0,\n\t\t\t\t\t\t\trel: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvimeoPlayerParams: {\n\t\t\t\t\t\t\tbyline: 0,\n\t\t\t\t\t\t\tportrait: 0,\n\t\t\t\t\t\t\tcolor: \"6366f1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t})(),\n\t\t(function () {\n\t\t\tfor (\n\t\t\t\tvar n = document.querySelectorAll(\".range-slider\"), o = 0;\n\t\t\t\to < n.length;\n\t\t\t\to++\n\t\t\t)\n\t\t\t\t!(function () {\n\t\t\t\t\tvar e = n[o].querySelector(\".range-slider-ui\"),\n\t\t\t\t\t\tr = n[o].querySelector(\".range-slider-value-min\"),\n\t\t\t\t\t\ta = n[o].querySelector(\".range-slider-value-max\"),\n\t\t\t\t\t\tt = {\n\t\t\t\t\t\t\tdataStartMin: parseInt(n[o].dataset.startMin, 10),\n\t\t\t\t\t\t\tdataStartMax: parseInt(n[o].dataset.startMax, 10),\n\t\t\t\t\t\t\tdataMin: parseInt(n[o].dataset.min, 10),\n\t\t\t\t\t\t\tdataMax: parseInt(n[o].dataset.max, 10),\n\t\t\t\t\t\t\tdataStep: parseInt(n[o].dataset.step, 10),\n\t\t\t\t\t\t\tdataPips: n[o].dataset.pips,\n\t\t\t\t\t\t};\n\t\t\t\t\tnoUiSlider.create(e, {\n\t\t\t\t\t\tstart: t.dataStartMax\n\t\t\t\t\t\t\t? [t.dataStartMin, t.dataStartMax]\n\t\t\t\t\t\t\t: [t.dataStartMin],\n\t\t\t\t\t\tconnect: !!t.dataStartMax || \"lower\",\n\t\t\t\t\t\tstep: t.dataStep,\n\t\t\t\t\t\tpips: !!t.dataPips && { mode: \"count\", values: 5 },\n\t\t\t\t\t\ttooltips: !0,\n\t\t\t\t\t\trange: { min: t.dataMin, max: t.dataMax },\n\t\t\t\t\t\tformat: {\n\t\t\t\t\t\t\tto: function (e) {\n\t\t\t\t\t\t\t\treturn \"$\" + parseInt(e, 10);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfrom: function (e) {\n\t\t\t\t\t\t\t\treturn Number(e);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t\te.noUiSlider.on(\"update\", function (e, t) {\n\t\t\t\t\t\t\te = (e = e[t]).replace(/\\D/g, \"\");\n\t\t\t\t\t\t\tt\n\t\t\t\t\t\t\t\t? a && (a.value = Math.round(e))\n\t\t\t\t\t\t\t\t: r && (r.value = Math.round(e));\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tr &&\n\t\t\t\t\t\t\tr.addEventListener(\"change\", function () {\n\t\t\t\t\t\t\t\te.noUiSlider.set([this.value, null]);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\ta &&\n\t\t\t\t\t\t\ta.addEventListener(\"change\", function () {\n\t\t\t\t\t\t\t\te.noUiSlider.set([null, this.value]);\n\t\t\t\t\t\t\t});\n\t\t\t\t})();\n\t\t})(),\n\t\twindow.addEventListener(\n\t\t\t\"load\",\n\t\t\tfunction () {\n\t\t\t\tvar e = document.getElementsByClassName(\"needs-validation\");\n\t\t\t\tArray.prototype.filter.call(e, function (t) {\n\t\t\t\t\tt.addEventListener(\n\t\t\t\t\t\t\"submit\",\n\t\t\t\t\t\tfunction (e) {\n\t\t\t\t\t\t\t!1 === t.checkValidity() &&\n\t\t\t\t\t\t\t\t(e.preventDefault(), e.stopPropagation()),\n\t\t\t\t\t\t\t\tt.classList.add(\"was-validated\");\n\t\t\t\t\t\t},\n\t\t\t\t\t\t!1\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t\t!1\n\t\t),\n\t\t(function () {\n\t\t\tvar a = document.querySelectorAll(\"[data-format]\");\n\t\t\tif (0 !== a.length)\n\t\t\t\tfor (var n = 0; n < a.length; n++)\n\t\t\t\t\t!(function () {\n\t\t\t\t\t\tvar e,\n\t\t\t\t\t\t\tt = a[n],\n\t\t\t\t\t\t\tr = t.parentNode.querySelector(\".credit-card-icon\");\n\t\t\t\t\t\tnull != t.dataset.format &&\n\t\t\t\t\t\t\t(e = JSON.parse(t.dataset.format)),\n\t\t\t\t\t\t\tr\n\t\t\t\t\t\t\t\t? new Cleave(\n\t\t\t\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\t\t\t\t_objectSpread(\n\t\t\t\t\t\t\t\t\t\t\t_objectSpread({}, e),\n\t\t\t\t\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tonCreditCardTypeChanged:\n\t\t\t\t\t\t\t\t\t\t\t\t\tfunction (e) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tr.className =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"credit-card-icon \" +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te;\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t  )\n\t\t\t\t\t\t\t\t: new Cleave(t, e);\n\t\t\t\t\t})();\n\t\t})(),\n\t\t[].slice\n\t\t\t.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n\t\t\t.map(function (e) {\n\t\t\t\treturn new bootstrap.Tooltip(e, { trigger: \"hover\" });\n\t\t\t}),\n\t\t[].slice\n\t\t\t.call(document.querySelectorAll('[data-bs-toggle=\"popover\"]'))\n\t\t\t.map(function (e) {\n\t\t\t\treturn new bootstrap.Popover(e);\n\t\t\t}),\n\t\t[].slice.call(document.querySelectorAll(\".toast\")).map(function (e) {\n\t\t\treturn new bootstrap.Toast(e);\n\t\t}),\n\t\t(function () {\n\t\t\tvar e = document.querySelectorAll('[data-bs-toggle=\"video\"]');\n\t\t\tif (e.length)\n\t\t\t\tfor (var t = 0; t < e.length; t++)\n\t\t\t\t\tlightGallery(e[t], {\n\t\t\t\t\t\tselector: \"this\",\n\t\t\t\t\t\tplugins: [lgVideo],\n\t\t\t\t\t\tlicenseKey: \"D4194FDD-48924833-A54AECA3-D6F8E646\",\n\t\t\t\t\t\tdownload: !1,\n\t\t\t\t\t\tyoutubePlayerParams: {\n\t\t\t\t\t\t\tmodestbranding: 1,\n\t\t\t\t\t\t\tshowinfo: 0,\n\t\t\t\t\t\t\trel: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvimeoPlayerParams: {\n\t\t\t\t\t\t\tbyline: 0,\n\t\t\t\t\t\t\tportrait: 0,\n\t\t\t\t\t\t\tcolor: \"6366f1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t})(),\n\t\t(function () {\n\t\t\tvar e = document.querySelectorAll(\".price-switch-wrapper\");\n\t\t\tif (!(e.length <= 0))\n\t\t\t\tfor (var t = 0; t < e.length; t++)\n\t\t\t\t\te[t]\n\t\t\t\t\t\t.querySelector('[data-bs-toggle=\"price\"]')\n\t\t\t\t\t\t.addEventListener(\"change\", function (e) {\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tvar t = e.currentTarget.querySelector(\n\t\t\t\t\t\t\t\t\t\t'input[type=\"checkbox\"]'\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tr = e.currentTarget\n\t\t\t\t\t\t\t\t\t\t.closest(\".price-switch-wrapper\")\n\t\t\t\t\t\t\t\t\t\t.querySelectorAll(\n\t\t\t\t\t\t\t\t\t\t\t\"[data-monthly-price]\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\ta = e.currentTarget\n\t\t\t\t\t\t\t\t\t\t.closest(\".price-switch-wrapper\")\n\t\t\t\t\t\t\t\t\t\t.querySelectorAll(\n\t\t\t\t\t\t\t\t\t\t\t\"[data-annual-price]\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tn = 0;\n\t\t\t\t\t\t\t\tn < r.length;\n\t\t\t\t\t\t\t\tn++\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t1 == t.checked\n\t\t\t\t\t\t\t\t\t? r[n].classList.add(\"d-none\")\n\t\t\t\t\t\t\t\t\t: r[n].classList.remove(\"d-none\");\n\t\t\t\t\t\t\tfor (var o = 0; o < r.length; o++)\n\t\t\t\t\t\t\t\t1 == t.checked\n\t\t\t\t\t\t\t\t\t? a[o].classList.remove(\"d-none\")\n\t\t\t\t\t\t\t\t\t: a[o].classList.add(\"d-none\");\n\t\t\t\t\t\t});\n\t\t})(),\n\t\t(function () {\n\t\t\tvar n,\n\t\t\t\tr = document.querySelectorAll(\".masonry-grid\");\n\t\t\tif (null !== r)\n\t\t\t\tfor (var o = 0; o < r.length; o++) {\n\t\t\t\t\tvar e = (function () {\n\t\t\t\t\t\t(n = new Shuffle(r[o], {\n\t\t\t\t\t\t\titemSelector: \".masonry-grid-item\",\n\t\t\t\t\t\t\tsizer: \".masonry-grid-item\",\n\t\t\t\t\t\t})),\n\t\t\t\t\t\t\timagesLoaded(r[o]).on(\"progress\", function () {\n\t\t\t\t\t\t\t\tn.layout();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tvar a = r[o].closest(\".masonry-filterable\");\n\t\t\t\t\t\tif (null === a) return { v: void 0 };\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tvar e = a.querySelectorAll(\n\t\t\t\t\t\t\t\t\t\".masonry-filters [data-group]\"\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tt = 0;\n\t\t\t\t\t\t\tt < e.length;\n\t\t\t\t\t\t\tt++\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\te[t].addEventListener(\"click\", function (e) {\n\t\t\t\t\t\t\t\tvar t = a.querySelector(\n\t\t\t\t\t\t\t\t\t\t\".masonry-filters .active\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tr = this.dataset.group;\n\t\t\t\t\t\t\t\tnull !== t && t.classList.remove(\"active\"),\n\t\t\t\t\t\t\t\t\tthis.classList.add(\"active\"),\n\t\t\t\t\t\t\t\t\tn.filter(r),\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t})();\n\t\t\t\t\tif (\"object\" === _typeof(e)) return e.v;\n\t\t\t\t}\n\t\t})(),\n\t\t(function () {\n\t\t\tvar e = document.querySelectorAll(\".subscription-form\");\n\t\t\tif (null !== e) {\n\t\t\t\tfor (var l = 0; l < e.length; l++)\n\t\t\t\t\t!(function () {\n\t\t\t\t\t\tvar t = e[l].querySelector('button[type=\"submit\"]'),\n\t\t\t\t\t\t\tr = t.innerHTML,\n\t\t\t\t\t\t\ta = e[l].querySelector(\".form-control\"),\n\t\t\t\t\t\t\tn = e[l].querySelector(\n\t\t\t\t\t\t\t\t\".subscription-form-antispam\"\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\to = e[l].querySelector(\".subscription-status\");\n\t\t\t\t\t\te[l].addEventListener(\"submit\", function (e) {\n\t\t\t\t\t\t\te && e.preventDefault(),\n\t\t\t\t\t\t\t\t\"\" === n.value && i(this, t, a, r, o);\n\t\t\t\t\t\t});\n\t\t\t\t\t})();\n\t\t\t\tvar i = function (e, t, r, a, n) {\n\t\t\t\t\tt.innerHTML = \"Sending...\";\n\t\t\t\t\tvar o = e.action.replace(\"/post?\", \"/post-json?\"),\n\t\t\t\t\t\te = \"&\" + r.name + \"=\" + encodeURIComponent(r.value),\n\t\t\t\t\t\tl = document.createElement(\"script\");\n\t\t\t\t\t(l.src = o + \"&c=callback\" + e),\n\t\t\t\t\t\tdocument.body.appendChild(l);\n\t\t\t\t\tvar i = \"callback\";\n\t\t\t\t\twindow[i] = function (e) {\n\t\t\t\t\t\tdelete window[i],\n\t\t\t\t\t\t\tdocument.body.removeChild(l),\n\t\t\t\t\t\t\t(t.innerHTML = a),\n\t\t\t\t\t\t\t\"success\" == e.result\n\t\t\t\t\t\t\t\t? (r.classList.remove(\"is-invalid\"),\n\t\t\t\t\t\t\t\t  r.classList.add(\"is-valid\"),\n\t\t\t\t\t\t\t\t  n.classList.remove(\"status-error\"),\n\t\t\t\t\t\t\t\t  n.classList.add(\"status-success\"),\n\t\t\t\t\t\t\t\t  (n.innerHTML = e.msg),\n\t\t\t\t\t\t\t\t  setTimeout(function () {\n\t\t\t\t\t\t\t\t\t\tr.classList.remove(\"is-valid\"),\n\t\t\t\t\t\t\t\t\t\t\t(n.innerHTML = \"\"),\n\t\t\t\t\t\t\t\t\t\t\tn.classList.remove(\n\t\t\t\t\t\t\t\t\t\t\t\t\"status-success\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t  }, 6e3))\n\t\t\t\t\t\t\t\t: (r.classList.remove(\"is-valid\"),\n\t\t\t\t\t\t\t\t  r.classList.add(\"is-invalid\"),\n\t\t\t\t\t\t\t\t  n.classList.remove(\"status-success\"),\n\t\t\t\t\t\t\t\t  n.classList.add(\"status-error\"),\n\t\t\t\t\t\t\t\t  (n.innerHTML = e.msg.substring(4)),\n\t\t\t\t\t\t\t\t  setTimeout(function () {\n\t\t\t\t\t\t\t\t\t\tr.classList.remove(\"is-invalid\"),\n\t\t\t\t\t\t\t\t\t\t\t(n.innerHTML = \"\"),\n\t\t\t\t\t\t\t\t\t\t\tn.classList.remove(\"status-error\");\n\t\t\t\t\t\t\t\t  }, 6e3));\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\t\t})(),\n\t\tdocument.querySelectorAll(\".animation-on-hover\").forEach(function (e) {\n\t\t\te.addEventListener(\"mouseover\", function () {\n\t\t\t\te.querySelectorAll(\"lottie-player\").forEach(function (e) {\n\t\t\t\t\te.setDirection(1), e.play();\n\t\t\t\t});\n\t\t\t}),\n\t\t\t\te.addEventListener(\"mouseleave\", function () {\n\t\t\t\t\te.querySelectorAll(\"lottie-player\").forEach(function (e) {\n\t\t\t\t\t\te.setDirection(-1), e.play();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}),\n\t\t(function () {\n\t\t\tvar v = document.querySelectorAll(\".audio-player\");\n\t\t\tif (0 !== v.length)\n\t\t\t\tfor (\n\t\t\t\t\tvar e = function () {\n\t\t\t\t\t\t\tvar t = v[y],\n\t\t\t\t\t\t\t\tr = t.querySelector(\"audio\"),\n\t\t\t\t\t\t\t\te = t.querySelector(\".ap-play-button\"),\n\t\t\t\t\t\t\t\ta = t.querySelector(\".ap-seek-slider\"),\n\t\t\t\t\t\t\t\tn = t.querySelector(\".ap-volume-slider\"),\n\t\t\t\t\t\t\t\to = t.querySelector(\".ap-duration\"),\n\t\t\t\t\t\t\t\tl = t.querySelector(\".ap-current-time\"),\n\t\t\t\t\t\t\t\ti = \"play\",\n\t\t\t\t\t\t\t\ts = null;\n\t\t\t\t\t\t\te.addEventListener(\"click\", function (e) {\n\t\t\t\t\t\t\t\ti =\n\t\t\t\t\t\t\t\t\t\"play\" === i\n\t\t\t\t\t\t\t\t\t\t? (e.currentTarget.classList.add(\n\t\t\t\t\t\t\t\t\t\t\t\t\"ap-pause\"\n\t\t\t\t\t\t\t\t\t\t  ),\n\t\t\t\t\t\t\t\t\t\t  r.play(),\n\t\t\t\t\t\t\t\t\t\t  requestAnimationFrame(m),\n\t\t\t\t\t\t\t\t\t\t  \"pause\")\n\t\t\t\t\t\t\t\t\t\t: (e.currentTarget.classList.remove(\n\t\t\t\t\t\t\t\t\t\t\t\t\"ap-pause\"\n\t\t\t\t\t\t\t\t\t\t  ),\n\t\t\t\t\t\t\t\t\t\t  r.pause(),\n\t\t\t\t\t\t\t\t\t\t  cancelAnimationFrame(s),\n\t\t\t\t\t\t\t\t\t\t  \"play\");\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tfunction c(e) {\n\t\t\t\t\t\t\t\te === a\n\t\t\t\t\t\t\t\t\t? t.style.setProperty(\n\t\t\t\t\t\t\t\t\t\t\t\"--seek-before-width\",\n\t\t\t\t\t\t\t\t\t\t\t(e.value / e.max) * 100 + \"%\"\n\t\t\t\t\t\t\t\t\t  )\n\t\t\t\t\t\t\t\t\t: t.style.setProperty(\n\t\t\t\t\t\t\t\t\t\t\t\"--volume-before-width\",\n\t\t\t\t\t\t\t\t\t\t\t(e.value / e.max) * 100 + \"%\"\n\t\t\t\t\t\t\t\t\t  );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta.addEventListener(\"input\", function (e) {\n\t\t\t\t\t\t\t\tc(e.target);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tn.addEventListener(\"input\", function (e) {\n\t\t\t\t\t\t\t\t\tc(e.target);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tfunction u(e) {\n\t\t\t\t\t\t\t\tvar t = Math.floor(e / 60),\n\t\t\t\t\t\t\t\t\te = (\n\t\t\t\t\t\t\t\t\t\t(e = Math.floor(e % 60)) < 10 ? \"0\" : \"\"\n\t\t\t\t\t\t\t\t\t).concat(e);\n\t\t\t\t\t\t\t\treturn \"\".concat(t, \":\").concat(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfunction d() {\n\t\t\t\t\t\t\t\to.textContent = u(r.duration);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfunction p() {\n\t\t\t\t\t\t\t\ta.max = Math.floor(r.duration);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfunction f() {\n\t\t\t\t\t\t\t\tvar e = Math.floor(\n\t\t\t\t\t\t\t\t\tr.buffered.end(r.buffered.length - 1)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tt.style.setProperty(\n\t\t\t\t\t\t\t\t\t\"--buffered-width\",\n\t\t\t\t\t\t\t\t\t\"\".concat((e / a.max) * 100, \"%\")\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar m = function e() {\n\t\t\t\t\t\t\t\t(a.value = Math.floor(r.currentTime)),\n\t\t\t\t\t\t\t\t\t(l.textContent = u(a.value)),\n\t\t\t\t\t\t\t\t\tt.style.setProperty(\n\t\t\t\t\t\t\t\t\t\t\"--seek-before-width\",\n\t\t\t\t\t\t\t\t\t\t\"\".concat((a.value / a.max) * 100, \"%\")\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t(s = requestAnimationFrame(e));\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t0 < r.readyState\n\t\t\t\t\t\t\t\t? (d(), p(), f())\n\t\t\t\t\t\t\t\t: r.addEventListener(\n\t\t\t\t\t\t\t\t\t\t\"loadedmetadata\",\n\t\t\t\t\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t\t\t\t\td(), p(), f();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t  ),\n\t\t\t\t\t\t\t\tr.addEventListener(\"progress\", f),\n\t\t\t\t\t\t\t\ta.addEventListener(\"input\", function () {\n\t\t\t\t\t\t\t\t\t(l.textContent = u(a.value)),\n\t\t\t\t\t\t\t\t\t\tr.paused || cancelAnimationFrame(s);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ta.addEventListener(\"change\", function () {\n\t\t\t\t\t\t\t\t\t(r.currentTime = a.value),\n\t\t\t\t\t\t\t\t\t\tr.paused || requestAnimationFrame(m);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tn.addEventListener(\"input\", function (e) {\n\t\t\t\t\t\t\t\t\te = e.target.value;\n\t\t\t\t\t\t\t\t\tr.volume = e / 100;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\ty < v.length;\n\t\t\t\t\ty++\n\t\t\t\t)\n\t\t\t\t\te();\n\t\t})();\n})();\n"
  },
  {
    "path": "application/static/assets/vendor/prismjs/plugins/line-numbers/prism-line-numbers.css",
    "content": "pre[class*=\"language-\"].line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre[class*=\"language-\"].line-numbers > code {\n\tposition: relative;\n\twhite-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n}\n\n\t.line-numbers-rows > span {\n\t\tdisplay: block;\n\t\tcounter-increment: linenumber;\n\t}\n\n\t\t.line-numbers-rows > span:before {\n\t\t\tcontent: counter(linenumber);\n\t\t\tcolor: #999;\n\t\t\tdisplay: block;\n\t\t\tpadding-right: 0.8em;\n\t\t\ttext-align: right;\n\t\t}\n"
  },
  {
    "path": "application/static/assets/vendor/prismjs/plugins/toolbar/prism-toolbar.css",
    "content": "div.code-toolbar {\n\tposition: relative;\n}\n\ndiv.code-toolbar > .toolbar {\n\tposition: absolute;\n\tz-index: 10;\n\ttop: .3em;\n\tright: .2em;\n\ttransition: opacity 0.3s ease-in-out;\n\topacity: 0;\n}\n\ndiv.code-toolbar:hover > .toolbar {\n\topacity: 1;\n}\n\n/* Separate line b/c rules are thrown out if selector is invalid.\n   IE11 and old Edge versions don't support :focus-within. */\ndiv.code-toolbar:focus-within > .toolbar {\n\topacity: 1;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item {\n\tdisplay: inline-block;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a {\n\tcursor: pointer;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > button {\n\tbackground: none;\n\tborder: 0;\n\tcolor: inherit;\n\tfont: inherit;\n\tline-height: normal;\n\toverflow: visible;\n\tpadding: 0;\n\t-webkit-user-select: none; /* for button */\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a,\ndiv.code-toolbar > .toolbar > .toolbar-item > button,\ndiv.code-toolbar > .toolbar > .toolbar-item > span {\n\tcolor: #bbb;\n\tfont-size: .8em;\n\tpadding: 0 .5em;\n\tbackground: #f5f2f0;\n\tbackground: rgba(224, 224, 224, 0.2);\n\tbox-shadow: 0 2px 0 0 rgba(0,0,0,0.2);\n\tborder-radius: .5em;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > a:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:focus {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n"
  },
  {
    "path": "application/static/assets/vendor/prismjs/themes/prism.css",
    "content": "/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.token.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor: #9a6e3a;\n\t/* This background color was intended by the author of this theme. */\n\tbackground: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #07a;\n}\n\n.token.function,\n.token.class-name {\n\tcolor: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"
  },
  {
    "path": "application/superadmin/__init__.py",
    "content": ""
  },
  {
    "path": "application/superadmin/forms.py",
    "content": "from flask_wtf import FlaskForm\n\nfrom wtforms import StringField\nfrom wtforms import PasswordField\nfrom wtforms import IntegerField\nfrom wtforms import SubmitField\nfrom wtforms import BooleanField\nfrom wtforms import TextAreaField\nfrom wtforms import SelectField\nfrom wtforms import DateField\n\nfrom flask_wtf.file import FileField\nfrom flask_wtf.file import FileAllowed\n\nfrom wtforms.validators import DataRequired \nfrom wtforms.validators import Optional\nfrom wtforms.validators import NumberRange\nfrom wtforms.validators import Length\nfrom wtforms.validators import Email\nfrom wtforms.validators import EqualTo\nfrom wtforms.validators import ValidationError\n\nfrom flask_login import current_user\nfrom application.models import User\n\n\n# FUNDS ANALYTICS DATE RANGE\n# class FundsAnalyticsDateRangeForm(FlaskForm):\n#     submit = SubmitField('Submit')"
  },
  {
    "path": "application/superadmin/views.py",
    "content": "import os\nfrom datetime import datetime\n#   importing basic flask module\nfrom flask import Blueprint\nfrom flask import redirect\nfrom flask import render_template\nfrom flask import request\nfrom flask import url_for\nfrom flask import flash\nfrom flask import abort\nfrom flask import jsonify\nfrom flask import make_response\nfrom flask import current_app\nfrom sqlalchemy import func\n#   importing module from flask login\nfrom flask_login import current_user\nfrom flask_login import login_required\nfrom flask_login import login_user\nfrom flask_login import logout_user\n\nfrom application import db\nfrom application import bcrypt\n# from application.superadmin.forms import aksjdlkf\n\nfrom application.models import User\n\nfrom application.utils.Utils import applicationID\nfrom application.utils.CutomAuth import superadmin_required\n\nsuperadmin = Blueprint('superadmin', __name__)\n\n#   USER PROFILE\n@superadmin.route('/superadmin/dashboard/', methods=['GET', 'POST'])\n@login_required\n@superadmin_required\ndef superadmin_dashboard():\n\n    return render_template(\n        'superadmin/dashboard.html', \n        title='Admin Dashboard',\n    )"
  },
  {
    "path": "application/templates/auth/activation_link_email.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Reset Your Password</title>\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/theme.min.css') }}\" />\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/custom.css') }}\" />\n  </head>\n  <body style=\"font-family: sans-serif; margin: 1rem 0.5rem; background-color: #6366f1; text-align: center;\">\n    <div style=\"background-color: #fff; padding: 0.5rem;\">\n      <table>\n        <tbody>\n          <tr>\n            <td>\n              <a href=\"https://rabeyabaten.com/\" style=\"text-decoration: none;\">\n                <img src=\"https://rabeyabaten.com/static/assets/images/logo.jpg\" width=\"80\"\n                  alt=\"Rabeya Baten Foundation\">\n              </a>\n            </td>\n            <td>\n              <a href=\"https://rabeyabaten.com/\" style=\"text-decoration: none;\">\n                <span style=\"margin-left: 10px; font-size: 1.5rem; color: #000; font-weight: 700;\">\n                  Rabeya Baten Foundation\n                </span>\n              </a>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n      <p style=\"text-align: left; margin-top: 20px;\">\n        As Salamu Alaikum, Thank you for registering with the Rabeya Baten Foundation. This email confirms that we have received your registration and the information provided by you.\n      </p>\n      <p style=\"margin-top: 50px; margin-bottom: 50px; text-align: center;\">\n        <a href=\"{{ activation_link }}\"\n          style=\"background: #6366f1; padding: 15px 40px; color: #fff; border-radius: 0.35rem; text-decoration: none;\">\n          Activate your account\n        </a>\n      </p>\n      <p style=\"text-align: left;\">\n        If you are unable to click the link, please copy and paste it into your browser's address bar.\n        <br>\n        <a href=\"{{ activation_link }}\"> {{ activation_link }} </a>\n      </p>\n        <br>\n      <p style=\"text-align: left;\">\n        Your account has been created successfully, and you can now access our website and start exploring our services. \n\n        If you have any questions or need further assistance, please contact us at\n        <a href=\"mailto:rabeyabatenfoundation@gmail.com\">rabeyabatenfoundation@gmail.com</a>.\n      </p>\n\n      <p style=\"text-align: left;\">\n        Zazak Allahu Khairan and Thank you for joining our community and supporting our mission to make a positive impact on society.\n      </p>\n      <p style=\"text-align: left;\">\n        Best Regards,<br>\n        Rabeya Baten Foundation Team\n      </p>\n      <address style=\"text-align: left; background-color: #dfe6e9; color: #000; padding: 2rem;\">\n        <small>\n          Mobile: +8801765-914159 <br>\n          Address: Rabeya Monjil, Padmapukur Par, Saiyadpur,<br>\n          Post Office: Duttapara. Thana: Chandraganj,<br>\n          District: Lakshmipur, Country: Bangladesh.<br>\n          Email: rabeyabatenfoundation@gmail.com<br>\n          YouTube: <a href=\"https://www.youtube.com/@RabeyaBatenFoundation\">@RabeyaBatenFoundation</a>\n          <br>\n          Facebook: <a href=\"https://www.facebook.com/rabeyabatenfoundation\">@rabeyabatenfoundation</a>\n          <br><br>\n        </small>\n      </address>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "application/templates/auth/forgetpassword.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<main style=\"margin-top: 100px\">\n    <section class=\"position-relative pt-5 pb-5\">\n\n        <div class=\"container d-flex flex-wrap justify-content-center justify-content-xl-start h-100\">\n            <div class=\"w-100 align-self-end pt-1 pt-md-4 pb-4\" style=\"max-width: 526px;\">\n                <h1 class=\"text-center text-xl-start\">\n                    Forget your password?\n                </h1>\n\n                <form method=\"POST\" action=\"\" class=\"needs-validation mb-2\" novalidate=\"\">\n                    {{ form.hidden_tag() }}\n            \n                    <div class=\"position-relative my-4\">\n                        {{ form.email.label(class=\"form-label fs-base\") }}\n                        \n                        {{ form.email(\n                            class=\"form-control form-control-lg\",\n                            placeholder=\"Email\"\n                        ) }}\n                        <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                        {% if form.email.errors %}\n                            {% for error in form.email.errors %}\n                            <span>{{ error }}</span>\n                            {% endfor %}                  \n                        {% else %}\n                            <span>Please enter valid Email!</span>    \n                        {% endif %}\n                        </div>\n                    </div>\n\n                    {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                </form>\n            </div>\n\n            <!-- Background -->\n            <div class=\"position-absolute top-0 end-0 w-50 h-100 bg-position-center bg-repeat-0 bg-size-cover d-none d-xl-block\"\n                style=\"background-image: url(https://silicon.createx.studio/assets/img/account/signin-bg.jpg);\"></div>\n        </div>\n    </section>\n</main>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/auth/join.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<main style=\"margin-top: 20px\">\n    <section class=\"position-relative pt-5 pb-5\">\n\n        <!-- Sign in form -->\n        <div class=\"container d-flex flex-wrap justify-content-center justify-content-xl-start h-100\">\n            <div class=\"w-100 align-self-end pt-1 pt-md-4 pb-4\" style=\"max-width: 826px;\">\n                <h1 class=\"text-center text-xl-start\">Create Account</h1>\n                <p class=\"text-center text-xl-start pb-3 mb-3\">Already have an account?<a\n                        href=\"{{ url_for('auth.login') }}\"> Login here.</a></p>\n                \n                <!-- FORM VALIDATION ERROR -->\n                {% for field in [form.name, form.phone, form.email, form.password, form.confirm_password] %}\n                    {% if field.errors %}\n                    <div class=\"row my-1\">\n                        <div class=\"col-12\">\n                            <div class=\"toast align-items-center bg-danger fade show\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" data-bs-autohide=\"flase\" style=\"width: 100%\">\n                                <div class=\"toast-body\">\n                                    {% for error in field.errors %}\n                                        <sapn class=\"text-white mb-0\">{{ field.label }}: {{ error }}</sapn>\n                                    {% endfor %}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    {% endif %}\n                {% endfor %}\n                    \n                <form action=\"\" method=\"POST\" class=\"needs-validation my-2\" novalidate=\"\">\n                    {{ form.hidden_tag() }}\n                    <div class=\"row\">\n                        <!-- START - NAME -->\n                        <div class=\"col-12\">\n                            <div class=\"position-relative mb-4\">\n                                {{ form.name.label(class=\"form-label fs-base\") }}\n                                {{ form.name(\n                                    class=\"form-control form-control-lg\",\n                                    placeholder=\"Your Name\"\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.name.errors %}\n                                    {% for error in form.name.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}\n                                {% else %}\n                                <span>Please enter a valid first name!</span>\n                                {% endif %}\n                                </div>\n                            </div>\n                        </div>\n                        <!-- END - NAME -->\n                    </div>\n              \n                    <div class=\"row\">\n                        <div class=\"col-md-6\">\n                            <div class=\"position-relative mb-4\">\n                                {{ form.email.label(class=\"form-label fs-base\") }}\n                                {{ form.email(\n                                    class=\"form-control form-control-lg\",\n                                    placeholder=\"Email\"\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.email.errors %}\n                                    {% for error in form.email.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}\n                                {% else %}\n                                    <span>Please enter a valid Email!</span>\n                                {% endif %}\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"col-md-6\">\n                            <div class=\"position-relative mb-4\">\n                                {{ form.phone.label(class=\"form-label fs-base\") }}\n                                {{ form.phone(\n                                    class=\"form-control form-control-lg\",\n                                    placeholder=\"Phone number\"\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.phone.errors %}\n                                    {% for error in form.phone.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}\n                                {% else %}\n                                    <span>Please enter a valid phone number!</span>\n                                {% endif %}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                \n                    <div class=\"row\">\n                        <div class=\"col-sm-12\">\n                            <div class=\"mb-4\">\n                                {{ form.password.label(class=\"form-label fs-base\") }}\n                                <div class=\"password-toggle\">\n                                    {{ form.password(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Password\"\n                                    ) }}\n                                    <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                        <input class=\"password-toggle-check\" type=\"checkbox\">\n                                        <span class=\"password-toggle-indicator\"></span>\n                                    </label>\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.password.errors %}\n                                        {% for error in form.password.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                        <span>Please enter a valid password!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    \n                    <div class=\"row\">\n                        <div class=\"col-sm-12\">\n                            <div class=\"mb-4\">\n                                {{ form.confirm_password.label(class=\"form-label fs-base\") }}\n                                <div class=\"password-toggle\">\n                                    {{ form.confirm_password(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Confirm Password\"\n                                    ) }}\n                                    <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                        <input class=\"password-toggle-check\" type=\"checkbox\">\n                                        <span class=\"password-toggle-indicator\"></span>\n                                    </label>\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.confirm_password.errors %}\n                                        {% for error in form.confirm_password.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                        <span>Please enter a valid password!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    \n                    {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                </form>       \n                <!-- <h6 class=\"text-center mb-4\">Or sign in with your social network</h6>\n                <div class=\"row row-cols-1 row-cols-sm-2\">\n                    <div class=\"col mb-3\">\n                        <a href=\"#\" class=\"btn btn-icon btn-secondary btn-google btn-lg w-100\">\n                            <i class=\"bx bxl-google fs-xl me-2\"></i>\n                            Google\n                        </a>\n                    </div>\n                    <div class=\"col mb-3\">\n                        <a href=\"#\" class=\"btn btn-icon btn-secondary btn-facebook btn-lg w-100\">\n                            <i class=\"bx bxl-facebook fs-xl me-2\"></i>\n                            Facebook\n                        </a>\n                    </div>\n                </div> -->\n            </div>\n        </div>\n\n        <!-- Background -->\n        <div class=\"position-absolute top-0 end-0 w-33 h-100 bg-position-center bg-repeat-0 bg-size-cover d-none d-xl-block\"\n            style=\"background-image: url(https://silicon.createx.studio/assets/img/account/signin-bg.jpg);\"></div>\n    </section>\n</main>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/auth/login.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<main style=\"margin-top: 20px\">\n    <section class=\"position-relative pt-5 pb-5\">\n\n        <!-- Sign in form -->\n        <div class=\"container d-flex flex-wrap justify-content-center justify-content-xl-start h-100\">\n            <div class=\"w-100 align-self-end pt-1 pt-md-4 pb-4\" style=\"max-width: 526px;\">\n                <h1 class=\"text-center text-xl-start\">Welcome Back</h1>\n                <p class=\"text-center text-xl-start pb-3 mb-3\">Don’t have an account yet? <a\n                        href=\"{{ url_for('auth.join') }}\">Register here.</a></p>\n                \n                <!-- FORM VALIDATION ERROR -->\n                {% for field in [form.phone, form.password] %}\n                    {% if field.errors %}\n                    <div class=\"row my-1\">\n                        <div class=\"col-12\">\n                            <div class=\"toast align-items-center bg-danger fade show\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" data-bs-autohide=\"flase\" style=\"width: 100%\">\n                                <div class=\"toast-body\">\n                                    {% for error in field.errors %}\n                                        <sapn class=\"text-white mb-0\">{{ field.label }}: {{ error }}</sapn>\n                                    {% endfor %}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    {% endif %}\n                {% endfor %}\n\n                <form action=\"\" method=\"POST\" class=\"needs-validation mb-2\" novalidate=\"\">\n                    {{ form.hidden_tag() }}\n                    <div class=\"position-relative mb-4\">\n                        {{ form.phone.label(class=\"form-label fs-base\") }}\n                        \n                        {{ form.phone(\n                            class=\"form-control form-control-lg\",\n                            placeholder=\"Phone number\"\n                        ) }}\n                        <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                        {% if form.phone.errors %}\n                            {% for error in form.phone.errors %}\n                            <span>{{ error }}</span>\n                            {% endfor %}                  \n                        {% else %}\n                            <span>Please enter valid phone number!</span>    \n                        {% endif %}\n                        </div>\n                    </div>\n                    <div class=\"mb-4\">\n                        {{ form.password.label(class=\"form-label fs-base\") }}\n                        <div class=\"password-toggle\">\n                            {{ form.password(\n                                class=\"form-control form-control-lg\",\n                                placeholder=\"Password\"\n                            ) }}\n                            <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                <input class=\"password-toggle-check\" type=\"checkbox\">\n                                <span class=\"password-toggle-indicator\"></span>\n                            </label>\n                            <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                            {% if form.password.errors %}\n                                {% for error in form.password.errors %}\n                                <span>{{ error }}</span>\n                                {% endfor %}\n                            {% else %}\n                                <span>Please enter a valid password</span>\n                            {% endif %}\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"mb-4\">\n                        <div class=\"form-check\">\n                            {{ form.remember(class=\"form-check-input\") }}\n                            {{ form.remember.label(class=\"form-check-label fs-base\") }}\n                        </div>\n                    </div>\n                    {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                </form>\n                <a href=\"{{ url_for('auth.forgetpassword') }}\" class=\"btn btn-link btn-lg w-100\">Forgot your password?</a>           \n                <!-- <h6 class=\"text-center mb-4\">Or sign in with your social network</h6>\n                <div class=\"row row-cols-1 row-cols-sm-2\">\n                    <div class=\"col mb-3\">\n                        <a href=\"#\" class=\"btn btn-icon btn-secondary btn-google btn-lg w-100\">\n                            <i class=\"bx bxl-google fs-xl me-2\"></i>\n                            Google\n                        </a>\n                    </div>\n                    <div class=\"col mb-3\">\n                        <a href=\"#\" class=\"btn btn-icon btn-secondary btn-facebook btn-lg w-100\">\n                            <i class=\"bx bxl-facebook fs-xl me-2\"></i>\n                            Facebook\n                        </a>\n                    </div>\n                </div> -->\n            </div>\n        </div>\n\n        <!-- Background -->\n        <div class=\"position-absolute top-0 end-0 w-50 h-100 bg-position-center bg-repeat-0 bg-size-cover d-none d-xl-block\"\n            style=\"background-image: url(https://silicon.createx.studio/assets/img/account/signin-bg.jpg);\"></div>\n    </section>\n</main>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/auth/password_reset_link_email.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t\t<title>Reset Your Password</title>\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/theme.min.css') }}\" />\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/custom.css') }}\" />\n\t</head>\n\t<body style=\"font-family: sans-serif; margin: 1rem 3rem; background-color: #6366f1;\">\n\t\t<div style=\"background-color: #fff; padding: 2rem;\">\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<!-- <td>\n              <a href=\"https://rabeyabaten.com/\" style=\"text-decoration: none;\">\n                <img src=\"https://rabeyabaten.com/static/assets/images/logo.jpg\" width=\"80\"\n                  alt=\"Rabeya Baten Foundation\">\n              </a>\n            </td> -->\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<a href=\"#\" style=\"text-decoration: none;\">\n\t\t\t\t\t\t\t\t<span style=\"margin-left: 10px; font-size: 1.5rem; color: #000; font-weight: 700;\">\n\t\t\t\t\t\t\t\t\tValentineAI\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\n\t\t\t<p style=\"text-align: left; margin-top: 20px\">\n\t\t\t\tWe received a request to reset the password for your account with the Valentine application.\n\t\t\t\tTo reset your password, please click on the link below\n\t\t\t</p>\n\t\t\t<p style=\"margin-top: 50px; margin-bottom: 50px; text-align: center;\">\n\t\t\t\t<a href=\"{{ password_reset_link }}\"\n\t\t\t\t\tstyle=\"background: #6366f1; padding: 15px 40px; color: #fff; border-radius: 0.35rem; text-decoration: none;\">\n\t\t\t\t\tReset your Password\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tIf you are unable to click the link, please copy and paste it into your browser's address bar.\n\t\t\t\t<br>\n\t\t\t<p style=\"margin-top: 30px; margin-bottom: 20px;\">\n\t\t\t\t<a href=\"{{ password_reset_link }}\"> {{ password_reset_link }} </a>\n\t\t\t</p>\n\t\t\t<br>\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tPlease note that this link is only valid for the next 24 hours. If you do not reset your password within this time frame, you will need to submit a new request.\n\t\t\t</p>\n\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tIf you have any questions or need further assistance, please contact us at\n\t\t\t\t<a href=\"mailto:sayhi@hossainfoysal.com\">sayhi@hossainfoysal.com</a>.\n\t\t\t\t<br>\n\t\t\t\tIf you did not make this request then simply ignore this email and no changes will be made.\n\t\t\t</p>\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tBest Regards,<br>\n\t\t\t\tValentine AI\n\t\t\t</p>\n\t\t\t<address style=\"text-align: left; background-color: #dfe6e9; color: #000; padding: 2rem;\">\n\t\t\t\t<small>\n\t\t\t\t\tIt's a fun project. Made by <a href=\"http://hossainfoysal.com\" target=\"_new\">HossainFoysal.com</a>\n\t\t\t\t\t<br>\n\t\t\t\t\tHosted on <a href=\"http://binomatrix.com\" target=\"_new\">BinoMatrix</a>. Fastest growing software company in Bangladesh.\n\t\t\t\t</small>\n\t\t\t</address>\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "application/templates/auth/reset_token.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<main style=\"margin-top: 100px\">\n    <section class=\"position-relative pt-5 pb-5\">\n\n        <!-- Sign in form -->\n        <div class=\"container d-flex flex-wrap justify-content-center justify-content-xl-start h-100\">\n            <div class=\"w-100 align-self-end pt-1 pt-md-4 pb-4\" style=\"max-width: 526px;\">\n                <h1 class=\"text-center text-xl-start\">Type new password</h1>\n                \n                <!-- FORM VALIDATION ERROR -->\n                {% for field in [form.password, form.confirm_password] %}\n                    {% if field.errors %}\n                    <div class=\"row my-1\">\n                        <div class=\"col-12\">\n                            <div class=\"toast align-items-center bg-danger fade show\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" data-bs-autohide=\"flase\" style=\"width: 100%\">\n                                <div class=\"toast-body\">\n                                    {% for error in field.errors %}\n                                        <sapn class=\"text-white mb-0\">{{ field.label }}: {{ error }}</sapn>\n                                    {% endfor %}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    {% endif %}\n                {% endfor %}\n\n                <form method=\"POST\" action=\"\" class=\"login__register\" id=\"login-in\">\n                    {{ form.hidden_tag() }}\n    \n                    <div class=\"row\">\n                        <div class=\"col-sm-12\">\n                            <div class=\"mb-4\">\n                                {{ form.password.label(class=\"form-label fs-base\") }}\n                                <div class=\"password-toggle\">\n                                    {{ form.password(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Password\"\n                                    ) }}\n                                    <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                        <input class=\"password-toggle-check\" type=\"checkbox\">\n                                        <span class=\"password-toggle-indicator\"></span>\n                                    </label>\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.password.errors %}\n                                        {% for error in form.password.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                        <span>Please enter a valid password!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    \n                    <div class=\"row\">\n                        <div class=\"col-sm-12\">\n                            <div class=\"mb-4\">\n                                {{ form.confirm_password.label(class=\"form-label fs-base\") }}\n                                <div class=\"password-toggle\">\n                                    {{ form.confirm_password(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Confirm Password\"\n                                    ) }}\n                                    <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                        <input class=\"password-toggle-check\" type=\"checkbox\">\n                                        <span class=\"password-toggle-indicator\"></span>\n                                    </label>\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.confirm_password.errors %}\n                                        {% for error in form.confirm_password.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                        <span>Please enter a valid password!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n\n                    {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                </form>\n            </div>\n        </div>\n        \n        <!-- Background -->\n        <div class=\"position-absolute top-0 end-0 w-50 h-100 bg-position-center bg-repeat-0 bg-size-cover d-none d-xl-block\"\n            style=\"background-image: url(https://silicon.createx.studio/assets/img/account/signin-bg.jpg);\"></div>\n    </section>\n</main>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/helpers/_global_footer.html",
    "content": "<!-- ============== START - FOOTER ============== -->\n<footer class=\"footer bg-dark pt-5 pb-4 pb-lg-5\">\n    <div class=\"container dark-mode pt-lg-4\">\n        <div class=\"row pb-5\">\n            <div class=\"col-md-4\">\n                <div class=\"navbar-brand text-gradient-primary p-0 me-0 mb-3 mb-lg-4\">\n                    Contact us\n                </div>\n\n                <ul class=\"nav flex-column pb-lg-1 mb-lg-3\">\n                    <li class=\"nav-item\">\n                        <p class=\"nav-link d-inline-block px-0 pt-1 pb-2\">\n                            It's a fun project. Made by <a href=\"http://hossainfoysal.com\" target=\"_new\">HossainFoysal.com</a>\n                        </p>\n                    </li>\n                    <li class=\"nav-item\">\n                        <p class=\"nav-link d-inline-block px-0 pt-1 pb-2\">\n                            Hosted on <a href=\"http://binomatrix.com\" target=\"_new\">BinoMatrix</a>. Fastest growing software company in Bangladesh.\n                        </p>\n                    </li>\n                </ul>\n            </div>\n            <div class=\"col-md-8 pt-4 pt-md-1 pt-lg-0\">\n                <div class=\"row\">\n                    <div class=\"col-md-5\">\n                        <h6 class=\"navbar-brand fs-md mb-2 text-gradient-primary\">\n                            Sitemap\n                        </h6>\n                        <div class=\"d-block\">\n                            <ul class=\"nav flex-column pb-lg-1 mb-lg-3\">\n                                <li class=\"nav-item\">\n                                    <a href=\"/\" class=\"nav-link d-inline-block px-0 pt-1 pb-2\">\n                                        Home\n                                    </a>\n                                </li>\n                                <!-- <li class=\"nav-item\">\n                                    <a href=\"#\" class=\"nav-link d-inline-block px-0 pt-1 pb-2\">\n                                        Contact\n                                    </a>\n                                </li> -->\n                            </ul>\n                        </div>\n                    </div>\n                    <div class=\"col-md-7\">\n                        <h4 class=\"text-gradient-primary\">\n                            Developed by\n                        </h4>\n                        <a href=\"http://hossainfoysal.com\" target=\"_new\" class=\"fs-lg nav-link\">Hossain Foysal</a>\n                        <p class=\"fs-md mb-0\">Full-Stack Software Engineer</p>\n                        <a href=\"tel:+8801884020619\" class=\"nav-link\">Mobile: +8801884020619</aj>\n                        <a href=\"http://hossainfoysal.com\" target=\"_new\">\n                            <img style=\"border-radius: 20px\"\n                                src=\"https://hossainfoysal.com/static/img/social-media-banner-hossainfoysal.com.jpg\"\n                                alt=\"Hossain Foysal - Full Stack Web Developer, app developer, cybersecurity researcher \" />\n                        </a>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <p class=\"nav d-block fs-xs text-center pb-5 pb-lg-0 mb-5 mb-lg-0\">\n            © All rights reserved by ValentineAI. Hosted with 💙 by\n            <a class=\"nav-link d-inline-block p-0\" href=\"https://binomatrix.com/\" target=\"_blank\">BinoMatrix.com</a>\n        </p>\n    </div>\n</footer>\n<!-- ============== END - FOOTER ============== -->"
  },
  {
    "path": "application/templates/helpers/_nav_top_landing.html",
    "content": "<header class=\"header navbar bg-light navbar-expand-lg position-absolute navbar-sticky shadow-sm  navbar-stuck\">\n    <nav class=\"container px-3\">\n        <a href=\"/\" class=\"navbar-brand\">\n            <!-- <img src=\"{{ url_for('static', filename='assets/images/logo.jpg') }}\"\n                 width=\"80\"\n                 alt=\"Rabeya Baten Foundation Logo\"> -->\n            <span class=\"d-none d-sm-block\">ValentineAI</span>\n        </a>\n        <button class=\"navbar-toggler\"\n                type=\"button\"\n                data-bs-toggle=\"collapse\"\n                data-bs-target=\"#navbarCollapse1\"\n                aria-expanded=\"false\">\n            <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div id=\"navbarCollapse1\" class=\"collapse navbar-collapse\">\n            <hr class=\"d-lg-none mt-3 mb-2\">\n            <ul class=\"navbar-nav ms-auto\">\n                <li class=\"nav-item\">\n                    <a href=\"{{ url_for('public.index') }}\" class=\"nav-link\">Home</a>\n                </li>\n                <!-- <li class=\"nav-item\">\n                    <a href=\"#\" class=\"nav-link\">Contact Us</a>\n                </li> -->\n            </ul>\n            {% if current_user.is_authenticated %}\n                <a href=\"{{ url_for('user.dashboard') }}\"\n                   class=\"btn btn-primary btn-sm fs-sm rounded ms-2 my-3 my-lg-0\">Dashboard</a>\n                <a href=\"{{ url_for('auth.logout') }}\"\n                   class=\"btn btn-danger btn-sm fs-sm rounded ms-2 my-3 my-lg-0\">Logout</a>\n            {% else %}\n                <a href=\"{{ url_for('auth.join') }}\"\n                   class=\"btn btn-primary btn-sm fs-sm rounded my-3 my-lg-0\">Join Us</a>\n                <a href=\"{{ url_for('auth.login') }}\"\n                   class=\"btn btn-outline-primary btn-sm fs-sm rounded ms-2 my-3 my-lg-0\">Login</a>\n            {% endif %}\n        </div>\n    </nav>\n</header>\n"
  },
  {
    "path": "application/templates/helpers/_side_navbar_dashboard.html",
    "content": "<aside class=\"col-lg-3 col-md-4 border-end pb-5 mt-n5\">\n    <div class=\"position-sticky top-0\">\n        <div class=\"text-center py-5\">\n            <div class=\"d-table position-relative mx-auto mt-2 mt-lg-4 pt-5 mb-3\">\n                <!-- <img src=\"{{ url_for('static', filename='assets/images/profile/' + current_user.img) }}\"\n      class=\"d-block rounded-circle\"\n      width=\"120\"\n      alt=\"John Doe\"> -->\n                <div style=\"height: 120px;\n                            width: 120px\" class=\"bg-primary d-block rounded-circle\"></div>\n            </div>\n            <h2 class=\"h5 mb-1\">{{ current_user.name | title }}</h2>\n            <p class=\"mb-4\">Address: {{ current_user.address | title }}</p>\n            <button type=\"button\" class=\"btn btn-secondary w-100 d-md-none mt-n2 mb-3\" data-bs-toggle=\"collapse\"\n                data-bs-target=\"#account-menu\">\n                <i class=\"bx bxs-user-detail fs-xl me-2\"></i>\n                Account menu\n                <i class=\"bx bx-chevron-down fs-lg ms-1\"></i>\n            </button>\n            <div id=\"account-menu\" class=\"list-group list-group-flush collapse d-md-block\">\n                <a href=\"{{ url_for(\"user.dashboard\") }}\"\n                    class=\"list-group-item list-group-item-action d-flex align-items-center\">\n                    <i class=\"bx bxs-dashboard fs-xl opacity-60 me-2\"></i>\n                    Dashboard\n                </a>\n                <a href=\"{{ url_for(\"user.letters\") }}\"\n                    class=\"list-group-item list-group-item-action d-flex align-items-center\">\n                    <i class=\"bx bxs-envelope fs-xl opacity-60 me-2\"></i>\n                    All Letters\n                </a>\n                <a href=\"{{ url_for(\"user.account\") }}\"\n                    class=\"list-group-item list-group-item-action d-flex align-items-center\">\n                    <i class=\"bx bx-cog fs-xl opacity-60 me-2\"></i>\n                    Account\n                </a>\n                <a href=\"{{ url_for(\"user.account_password\") }}\"\n                    class=\"list-group-item list-group-item-action d-flex align-items-center\">\n                    <i class=\"bx bx-lock-alt fs-xl opacity-60 me-2\"></i>\n                    Password\n                </a>\n                <a href=\"{{ url_for(\"auth.logout\") }}\"\n                    class=\"list-group-item list-group-item-action d-flex align-items-center\">\n                    <i class=\"bx bx-log-out fs-xl opacity-60 me-2\"></i>\n                    Logout\n                </a>\n            </div>\n        </div>\n    </div>\n</aside>"
  },
  {
    "path": "application/templates/layout/root.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>\n\t\t\t{% if title %}\n\t\t\t{{ title }} | Valentines Letter Sender\n\t\t\t{% else %}\n\t\t\tValentines Letter Sender\n\t\t\t{% endif %}\n\t\t</title>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1.0\" />\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\t\t<link rel=\"icon\" href=\"images/favicon.ico\" type=\"image/x-icon\" />\n\t\t<link rel=\"stylesheet\" type=\"text/css\"\n\t\t\thref=\"//fonts.googleapis.com/css2?family=DM+Serif+Display&amp;family=Roboto:wght@300;400;700&amp;display=swap\" />\n\t\t<link href=\"https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css\" rel=\"stylesheet\" />\n\n\n\t\t<!-- Vendor Styles -->\n\t\t<link rel='stylesheet' href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css'>\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/vendor/swiper/swiper-bundle.min.css') }}\" />\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/vendor/prismjs/themes/prism.css') }}\" />\n\t\t<link rel=\"stylesheet\"\n\t\t\thref=\"{{ url_for('static', filename='assets/vendor/prismjs/plugins/toolbar/prism-toolbar.css') }}\" />\n\t\t<link rel=\"stylesheet\"\n\t\t\thref=\"{{ url_for('static', filename='assets/vendor/prismjs/plugins/line-numbers/prism-line-numbers.css') }}\" />\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/theme.min.css') }}\" />\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/custom.css') }}\" />\n\n\t\t{% block head %}\n\t\t{% endblock %}\n\n\t\t<!-- Theme mode -->\n\t\t<script>\n\t\t\tlet mode = window.localStorage.getItem('mode'),\n\t\t\t\troot = document.getElementsByTagName('html')[0];\n\t\t\tif (mode !== null && mode === 'dark') {\n\t\t\t\troot.classList.add('dark-mode');\n\t\t\t} else {\n\t\t\t\troot.classList.remove('dark-mode');\n\t\t\t}\n\t\t</script>\n\t\t{{ moment.include_moment() }}\n\t</head>\n\t<body>\n\t\t<!-- ============== START NAVIGATION SECTION ============== -->\n\t\t{% block nav %}\n\t\t{% endblock %}\n\t\t<!-- ============== END NAVIGATION SECTION ============== -->\n\n\n\t\t<!-- bs-toast toast toast-ex animate__animated my-2 fade bg-primary animate__slideInRight show -->\n\t\t<!-- ============== START FLASH MESSAGE ============== -->\n\t\t{% with messages=get_flashed_messages(with_categories=true)%}\n\t\t{% if messages %}\n\t\t{% for category, message in messages %}\n\t\t<div class=\"alert alert-{{ category }} alert-dismissible fade show\" role=\"alert\"\n\t\t\tstyle=\"margin-bottom: 0; position: absolute; top: 7rem; z-index: 1500;\">\n\t\t\t{{ message }}\n\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n\t\t</div>\n\t\t{% endfor %}\n\t\t{% endif %}\n\t\t{% endwith %}\n\t\t<!-- ============== END FLASH MESSAGE ============== -->\n\n\t\t<!-- ============== START BODY SECTION ============== -->\n\t\t{% block body %}\n\t\t{% endblock %}\n\t\t<!-- ============== END BODY SECTION ============== -->\n\n\t\t<!-- ============== START FOOTER SECTION ============== -->\n\t\t{% block footer %}\n\t\t{% endblock %}\n\t\t<!-- ============== END FOOTER SECTION ============== -->\n\t\t<script>\n\t\t\tconst numberWithCommas = (x) => {\n\t\t\t\treturn x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\t\t\t}\n\t\t</script>\n\t\t<!-- Vendor Scripts -->\n\t\t<script\n\t\t\tsrc=\"{{ url_for('static', filename='assets/vendor/bootstrap/dist/js/bootstrap.bundle.min.js') }}\"></script>\n\t\t<script\n\t\t\tsrc=\"{{ url_for('static', filename='assets/vendor/smooth-scroll/dist/smooth-scroll.polyfills.min.js') }}\"></script>\n\t\t<script src=\"{{ url_for('static', filename='assets/vendor/swiper/swiper-bundle.min.js') }}\"></script>\n\t\t<script src=\"{{ url_for('static', filename='assets/vendor/prismjs/components/prism-core.min.js') }}\"></script>\n\t\t<script src=\"{{ url_for('static', filename='assets/vendor/prismjs/components/prism-markup.min.js') }}\"></script>\n\t\t<script src=\"{{ url_for('static', filename='assets/vendor/prismjs/components/prism-clike.min.js') }}\"></script>\n\t\t<script\n\t\t\tsrc=\"{{ url_for('static', filename='assets/vendor/prismjs/plugins/toolbar/prism-toolbar.min.js') }}\"></script>\n\t\t<script\n\t\t\tsrc=\"{{ url_for('static', filename='assets/vendor/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js') }}\"></script>\n\t\t<script\n\t\t\tsrc=\"{{ url_for('static', filename='assets/vendor/prismjs/plugins/line-numbers/prism-line-numbers.min.js') }}\"></script>\n\n\t\t{% block script %}\n\t\t{% endblock %}\n\t\t<!-- Main Theme Script -->\n\t\t<script src=\"{{ url_for('static', filename='assets/js/theme.js') }}\"></script>\n\t</body>\n</html>"
  },
  {
    "path": "application/templates/public/landing.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<section class=\"jarallax bg-dark min-vh-100\" data-jarallax=\"\" data-speed=\"0.4\" data-bs-theme=\"dark\">\n\t<span class=\"position-absolute top-0 start-0 w-100 h-100\"\n\t\tstyle=\"background: radial-gradient(116.18% 118% at 50% 100%, rgba(99, 102, 241, 0.1) 0%, rgba(218, 70, 239, 0.05) 41.83%, rgba(241, 244, 253, 0.07) 82.52%);\"></span>\n\n\t<div class=\"min-vh-100 d-flex flex-column py-5\">\n\n\t\t<div class=\"container position-relative text-center zindex-5 pt-4 pt-md-5 pb-5 mt-auto\">\n\t\t\t<div class=\"row mt-5\">\n\t\t\t\t<div class=\"col-xl-10 mx-auto\">\n\t\t\t\t\t<h1 class=\"display-1 mb-md-4 pb-3 text-light\">Send your loved person a letter digitally 💌</h1>\n\t\t\t\t\t<p class=\"text-light mx-auto mb-md-4 mb-3 pb-xl-2 pb-md-0 pb-sm-2 fs-3\" style=\"max-width: 36.5rem;\">\n\t\t\t\t\t\tPowered by ValentineAI\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\tHosted on <a href=\"http://binomatrix.com\" target=\"_new\">BinoMatrix</a>\n\t\t\t\t\t</p>\n\t\t\t\t\t<a href=\"{{ url_for('auth.join') }}\" class=\"btn btn-lg btn-primary shadow-primary\">Write your\n\t\t\t\t\t\tvalentine letter</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div id=\"jarallax-container-0\" class=\"jarallax-container\"\n\t\tstyle=\"position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; overflow: hidden; z-index: -100; clip-path: polygon(0px 0px, 100% 0px, 100% 100%, 0px 100%);\">\n\t\t<div class=\"jarallax-img\"\n\t\t\tstyle=\"background-image: url({{ url_for(\"static\", filename=\"assets/images/hero-bg.png\") }}); object-fit: cover; object-position: 50% 50%; max-width: none; position: fixed; top: 0px; left: 0px; overflow: hidden; pointer-events: none; transform-style: preserve-3d; backface-visibility: hidden; margin-top: -4.63125px; transform: translate3d(0px, 4.63125px, 0px);\"\n\t\t\tdata-jarallax-original-styles=\"background-image: url({{ url_for(\"static\", filename=\"assets/images/hero-bg.png\") }});\">\n\t\t</div>\n\t</div>\n</section>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/public/letter.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t\t<title>Letter</title>\n\t\t<style>\n\t\t\t@import url('https://fonts.googleapis.com/css2?family=Pacifico&display=swap');\n\n\t\t\tbody {\n\t\t\t\theight: 100vh;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground-color: #ff758f;\n\t\t\t}\n\n\t\t\t.valentines-day-card {\n\t\t\t\tposition: relative;\n\t\t\t\twidth: 400px;\n\t\t\t\theight: 300px;\n\t\t\t\tbackground-color: #ff8fa3;\n\t\t\t\toverflow: hidden;\n\t\t\t\tborder: 10px solid white;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tbox-shadow: 0 0 100px rgba(0, 0, 0, .4);\n\t\t\t}\n\n\t\t\t.valentines-day-card:before {\n\t\t\t\tcontent: \"\";\n\t\t\t\tposition: absolute;\n\t\t\t\tbackground-color: #ffb3c1;\n\t\t\t\twidth: 100px;\n\t\t\t\theight: 100px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\ttop: 140px;\n\t\t\t\tleft: -25px;\n\t\t\t\tbox-shadow: 60px 20px #ffb3c1, 130px 10px #ffb3c1, 190px 20px #ffb3c1, 260px -5px #ffb3c1, 340px 20px #ffb3c1;\n\t\t\t}\n\n\t\t\t.valentines-day-card:after {\n\t\t\t\tcontent: \"\";\n\t\t\t\tposition: absolute;\n\t\t\t\tbackground-color: #ffccd5;\n\t\t\t\twidth: 100px;\n\t\t\t\theight: 100px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\ttop: 160px;\n\t\t\t\tleft: -40px;\n\t\t\t\tbox-shadow: 50px 20px #ffccd5, 120px 40px #ffccd5, 200px 15px #ffccd5, 260px 30px #ffccd5, 330px 30px #ffccd5, 380px 10px #ffccd5;\n\t\t\t}\n\n\t\t\t.clouds {\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 100px;\n\t\t\t\theight: 100px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground-color: #fff0f3;\n\t\t\t\tz-index: 5;\n\t\t\t\ttop: 210px;\n\t\t\t\tleft: -20px;\n\t\t\t\tbox-shadow: 55px 30px #fff0f3, 125px 10px #fff0f3, 175px 20px #fff0f3, 250px 10px #fff0f3, 320px 5px #fff0f3, 380px 10px #fff0f3;\n\t\t\t}\n\n\t\t\t.hearts {\n\t\t\t\tposition: absolute;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\n\t\t\t.heartOne {\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 100px;\n\t\t\t\ttop: 250px;\n\t\t\t\tanimation: up 4s linear forwards 1s;\n\t\t\t}\n\n\t\t\t.heartTwo {\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 270px;\n\t\t\t\ttop: 230px;\n\t\t\t\tanimation: up 5s linear forwards 1.8s;\n\t\t\t}\n\n\t\t\t.heartThree {\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 85px;\n\t\t\t\ttop: 415px;\n\t\t\t\tanimation: up 5s linear forwards 3s;\n\t\t\t}\n\n\t\t\t.heartFour {\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 320px;\n\t\t\t\ttop: 380px;\n\t\t\t\tanimation: upTwo 9s linear infinite 3.5s;\n\t\t\t}\n\n\t\t\t.heartFive {\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 150px;\n\t\t\t\ttop: 400px;\n\t\t\t\tanimation: upTwo 13s linear infinite 4.5s;\n\t\t\t}\n\n\t\t\t.right-side:before,\n\t\t\t.right-side:after {\n\t\t\t\tposition: absolute;\n\t\t\t\tcontent: \"\";\n\t\t\t\ttransform-origin: left;\n\t\t\t\tanimation: move 1s ease infinite;\n\t\t\t}\n\n\t\t\t.right-side:before {\n\t\t\t\tborder-radius: 50% 50% 50% 0;\n\t\t\t\twidth: 21px;\n\t\t\t\theight: 20px;\n\t\t\t\tbackground-color: #c9184a;\n\t\t\t\tleft: -0.26px;\n\t\t\t}\n\n\t\t\t.right-side:after {\n\t\t\t\theight: 0;\n\t\t\t\twidth: 0;\n\t\t\t\tborder-bottom: 10px solid transparent;\n\t\t\t\tborder-left: 15px solid #c9184a;\n\t\t\t\ttop: 19px;\n\t\t\t\tleft: -0.26px;\n\t\t\t}\n\n\t\t\t@keyframes move {\n\n\t\t\t\t0%,\n\t\t\t\t100% {\n\t\t\t\t\ttransform: rotateY(0);\n\t\t\t\t}\n\n\t\t\t\t50% {\n\t\t\t\t\ttransform: rotateY(-45deg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.left-side:before,\n\t\t\t.left-side:after {\n\t\t\t\tposition: absolute;\n\t\t\t\tcontent: \"\";\n\t\t\t\ttransform-origin: right;\n\t\t\t\tanimation: move 1s ease infinite;\n\t\t\t}\n\n\t\t\t.left-side:before {\n\t\t\t\tborder-radius: 50% 50% 0 50%;\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tleft: -20.7px;\n\t\t\t\tbackground-color: #ff4d6d;\n\t\t\t}\n\n\t\t\t.left-side:after {\n\t\t\t\theight: 0;\n\t\t\t\twidth: 0;\n\t\t\t\tleft: -15px;\n\t\t\t\tborder-bottom: 10px solid transparent;\n\t\t\t\tborder-right: 15px solid #ff4d6d;\n\t\t\t\ttop: 19px;\n\t\t\t}\n\n\t\t\t@keyframes up {\n\t\t\t\t0% {\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t}\n\n\t\t\t\t100% {\n\t\t\t\t\ttransform: translateY(-200px);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes upTwo {\n\t\t\t\t0% {\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t}\n\n\t\t\t\t100% {\n\t\t\t\t\ttransform: translateY(-450px);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.text {\n\t\t\t\tposition: absolute;\n\t\t\t\tcolor: #800f2f;\n\t\t\t\tfont-size: 30px;\n\t\t\t\tfont-family: 'Pacifico', cursive;\n\t\t\t\tline-height: 1;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 380px;\n\t\t\t\tleft: 10px;\n\t\t\t\tz-index: 3;\n\t\t\t\ttop: 280px;\n\t\t\t\tanimation: up 1s ease forwards;\n\t\t\t\ttransition: .2s;\n\t\t\t}\n\n\t\t\t.hover {\n\t\t\t\tcolor: white;\n\t\t\t\tfont-family: 'Pacifico', cursive;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\t.text:hover span {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.text:hover:before {\n\t\t\t\tcontent: \"{{ letter.message }}\";\n\t\t\t\tfont-size: 25px;\n\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"happy-valentines\">\n\t\t\t<div class=\"valentines-day-card\">\n\t\t\t\t<div class=\"clouds\"></div>\n\t\t\t\t<div class=\"hearts\">\n\t\t\t\t\t<div class=\"heartOne\">\n\t\t\t\t\t\t<div class=\"left-side\"></div>\n\t\t\t\t\t\t<div class=\"right-side\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"heartTwo\">\n\t\t\t\t\t\t<div class=\"left-side\"></div>\n\t\t\t\t\t\t<div class=\"right-side\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"heartThree\">\n\t\t\t\t\t\t<div class=\"left-side\"></div>\n\t\t\t\t\t\t<div class=\"right-side\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"heartFour\">\n\t\t\t\t\t\t<div class=\"left-side\"></div>\n\t\t\t\t\t\t<div class=\"right-side\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"heartFive\">\n\t\t\t\t\t\t<div class=\"left-side\"></div>\n\t\t\t\t\t\t<div class=\"right-side\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"text\"><span>Happy Valentine's Day!</br> {{ letter.receiver_name }}</div>\n\t\t\t</div>\n\t\t\t{% if letter.is_hidden %}\n\t\t\t<p class=\"hover\">- Your well wisher -</p>\n\t\t\t{% else %}\n\t\t\t<p class=\"hover\">- Your {{ letter.sender.name }} -</p>\n\t\t\t{% endif %}\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "application/templates/user/account.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<main style=\"margin-top: 100px\">\n    <section class=\"container\">\n        <div class=\"row\">\n            <!-- Sidebar (User info + Account menu) -->\n            {% include 'helpers/_side_navbar_dashboard.html' %}\n\n            <!-- Account details -->\n            <div class=\"col-md-9 pb-5 mb-2 mb-lg-4 mt-3 mt-md-0\">\n                <div class=\"ps-md-3 ps-lg-0 mt-md-2 py-md-4\">\n                    <h1 class=\"h2 pt-xl-1 pb-3\">Profile Details</h1>\n\n                    {% for field in [form.name, form.email, form.phone] %}\n                        {% if field.errors %}\n                        <div class=\"row my-1\">\n                            <div class=\"col-12\">\n                                <div class=\"toast align-items-center bg-danger fade show\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" data-bs-autohide=\"flase\" style=\"width: 100%\">\n                                    <div class=\"toast-body\">\n                                        {% for error in field.errors %}\n                                            <sapn class=\"text-white mb-0\">{{ field.label }}: {{ error }}</sapn>\n                                        {% endfor %}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        {% endif %}\n                    {% endfor %}\n\n\n                    <!-- Basic info -->\n                    <h2 class=\"h5 text-primary mb-4\">Edit info</h2>\n                    <form action=\"\" method=\"POST\" class=\"needs-validation my-2\" novalidate=\"\">\n                        {{ form.hidden_tag() }}\n\n                        <!-- === START - NAME CONTAINER === -->\n                        <div class=\"row\">\n\n                            <!-- START - NAME -->\n                            <div class=\"col-12\">\n                                <div class=\"position-relative mb-4\">\n                                    {{ form.name.label(class=\"form-label fs-base\") }}\n                                    {{ form.name(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Your First Name\"\n                                    ) }}\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.name.errors %}\n                                        {% for error in form.name.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                    <span>Please enter a valid name!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                            <!-- END - NAME -->\n                        </div>\n                        <!-- END - FIRST NAME, MIDDLE NAME, LAST NAME CONTAINER -->\n\n                        <!-- === START - EMAIL, PHONE, ADDRESS CONTAINER === -->\n                        <div class=\"row\">\n\n                            <!-- START - EMAIL -->\n                            <div class=\"col-12\">\n                                <div class=\"position-relative mb-4\">\n                                    {{ form.email.label(class=\"form-label fs-base\") }}\n                                    {{ form.email(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Email\"\n                                    ) }}\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.email.errors %}\n                                        {% for error in form.email.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                        <span>Please enter a valid Email!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                            <!-- END - EMAIL -->\n\n                            <!-- START - PHONE -->\n                            <div class=\"col-12\">\n                                <div class=\"position-relative mb-4\">\n                                    {{ form.phone.label(class=\"form-label fs-base\") }}\n                                    {{ form.phone(\n                                        class=\"form-control form-control-lg\",\n                                        placeholder=\"Phone number\"\n                                    ) }}\n                                    <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                    {% if form.phone.errors %}\n                                        {% for error in form.phone.errors %}\n                                        <span>{{ error }}</span>\n                                        {% endfor %}\n                                    {% else %}\n                                        <span>Please enter a valid phone number!</span>\n                                    {% endif %}\n                                    </div>\n                                </div>\n                            </div>\n                            <!-- END - PHONE -->\n                        </div>\n                        <!-- === END - EMAIL, PHONE, ADDRESS CONTAINER === -->\n                        \n                        \n                        {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                    </form>    \n\n                    <!-- Delete account -->\n                    <!-- <h2 class=\"h5 text-primary pt-1 pt-lg-3 mt-4\">Delete account</h2>\n                    <p>When you delete your account, your public profile will be deactivated immediately. If you change your\n                        mind before the 14 days are up, sign in with your email and password, and we’ll send you a link to\n                        reactivate your account.</p>\n                    <button type=\"button\" class=\"btn btn-danger\">Yes, I want to delete my\n                            account</button> -->\n                </div>\n            </div>\n        </div>\n    </section>\n</main>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/user/account_update_password.html",
    "content": "{% extends 'layout/root.html' %}\n\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n\n{% block body %}\n<main style=\"margin-top: 100px\">\n    <section class=\"container\">\n        <div class=\"row\">\n            <!-- Sidebar (User info + Account menu) -->\n            {% include 'helpers/_side_navbar_dashboard.html' %}\n    \n            <!-- Account details -->\n            <div class=\"col-md-9 pb-5 mb-2 mb-lg-4 mt-3 mt-md-0\">\n                <div class=\"ps-md-3 ps-lg-0 mt-md-2 py-md-4\">\n                    <h1 class=\"h2 pt-xl-1 pb-3\">Account Password</h1>\n    \n                    {% for field in [form.current_password, form.confirm_password, form.new_password] %}\n                    {% if field.errors %}\n                    <div class=\"row my-1\">\n                        <div class=\"col-12\">\n                            <div class=\"toast align-items-center bg-danger fade show\" role=\"alert\" aria-live=\"assertive\"\n                                aria-atomic=\"true\" data-bs-autohide=\"flase\" style=\"width: 100%\">\n                                <div class=\"toast-body\">\n                                    {% for error in field.errors %}\n                                    <sapn class=\"text-white mb-0\">{{ field.label }}: {{ error }}</sapn>\n                                    {% endfor %}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    {% endif %}\n                    {% endfor %}\n    \n    \n                    <!-- Basic info -->\n                    <h2 class=\"h5 text-primary mb-4\">Update Password</h2>\n                    <form action=\"\" method=\"POST\" class=\"needs-validation my-2\" novalidate=\"\">\n                        {{ form.hidden_tag() }}\n    \n                        <div class=\"row\">\n                            <div class=\"col-sm-12\">\n                                <div class=\"mb-4\">\n                                    {{ form.current_password.label(class=\"form-label fs-base\") }}\n                                    <div class=\"password-toggle\">\n                                        {{ form.current_password(\n                                            class=\"form-control form-control-lg\",\n                                            placeholder=\"Current Password\"\n                                        ) }}\n                                        <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                            <input class=\"password-toggle-check\" type=\"checkbox\">\n                                            <span class=\"password-toggle-indicator\"></span>\n                                        </label>\n                                        <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                            <span>Please enter a valid password!</span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        \n                        <div class=\"row\">\n                            <div class=\"col-sm-12\">\n                                <div class=\"mb-4\">\n                                    {{ form.new_password.label(class=\"form-label fs-base\") }}\n                                    <div class=\"password-toggle\">\n                                        {{ form.new_password(\n                                            class=\"form-control form-control-lg\",\n                                            placeholder=\"New Password\"\n                                        ) }}\n                                        <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                            <input class=\"password-toggle-check\" type=\"checkbox\">\n                                            <span class=\"password-toggle-indicator\"></span>\n                                        </label>\n                                        <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                            <span>Please enter a valid password!</span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n    \n                        <div class=\"row\">\n                            <div class=\"col-sm-12\">\n                                <div class=\"mb-4\">\n                                    {{ form.confirm_password.label(class=\"form-label fs-base\") }}\n                                    <div class=\"password-toggle\">\n                                        {{ form.confirm_password(\n                                            class=\"form-control form-control-lg\",\n                                            placeholder=\"Confirm New Password\"\n                                        ) }}\n                                        <label class=\"password-toggle-btn\" aria-label=\"Show/hide password\">\n                                            <input class=\"password-toggle-check\" type=\"checkbox\">\n                                            <span class=\"password-toggle-indicator\"></span>\n                                        </label>\n                                        <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                            <span>Please enter a valid password!</span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n    \n                        {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                    </form>\n                </div>\n            </div>\n        </div>\n    </section>\n</main>\n{% endblock %}\n\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/user/dashboard.html",
    "content": "{% extends 'layout/root.html' %}\n{% block nav %}\n    {% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n{% block body %}\n    <main style=\"margin-top: 100px\">\n        <section class=\"container\">\n            <div class=\"row\">\n                <!-- Sidebar (User info + Account menu) -->\n                {% include 'helpers/_side_navbar_dashboard.html' %}\n\n                <div class=\"col-md-9 pb-5 mb-2 mb-lg-4 mt-n3 mt-md-0\">\n                    <h2>\n                        Send a letter to your loving person 💌\n                    </h2>\n\n\n                    <!-- FORM VALIDATION ERROR -->\n                    {% for field in [form.name, form.email, form.gender, form.letter] %}\n                        {% if field.errors %}\n                        <div class=\"row my-1\">\n                            <div class=\"col-12\">\n                                <div class=\"toast align-items-center bg-danger fade show\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" data-bs-autohide=\"flase\" style=\"width: 100%\">\n                                    <div class=\"toast-body\">\n                                        {% for error in field.errors %}\n                                            <sapn class=\"text-white mb-0\">{{ field.label }}: {{ error }}</sapn>\n                                        {% endfor %}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        {% endif %}\n                    {% endfor %}\n\n\n                    <form action=\"\" method=\"POST\" class=\"needs-validation mb-2 position-relative\" novalidate=\"\">\n\n                        <!-- LOADING SPINNER -->\n                        <div id=\"spinner\" class=\"w-100 text-center d-none\">\n                            <div class=\"spinner-border mt-5\" style=\"width: 3.5rem; height: 3.5rem;\" role=\"status\">\n                                <span class=\"visually-hidden\">Loading...</span>\n                            </div>\n\n                            <p>Loading..</p>\n                        </div>\n                        <div id=\"formel\">\n                            {{ form.hidden_tag() }}\n                            <div class=\"position-relative mb-4\">\n                                {{ form.name.label(class=\"form-label fs-base\") }}\n                                \n                                {{ form.name(\n                                    class=\"form-control form-control-lg\",\n                                    placeholder=\"\"\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.name.errors %}\n                                    {% for error in form.name.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}                  \n                                {% else %}\n                                    <span>Please enter valid name!</span>    \n                                {% endif %}\n                                </div>\n                            </div>\n\n                            <div class=\"mb-4\">\n                                {{ form.email.label(class=\"form-label fs-base\") }}\n                                \n                                {{ form.email(\n                                    class=\"form-control form-control-lg\",\n                                    placeholder=\"\"\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.email.errors %}\n                                    {% for error in form.email.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}                  \n                                {% else %}\n                                    <span>Please enter valid email!</span>    \n                                {% endif %}\n                                </div>\n                            </div>\n\n                            <div class=\"mb-4\">\n                                {{ form.gender.label(class=\"form-label fs-base\") }}\n                                \n                                {{ form.gender(\n                                    class=\"form-select form-select-lg\",\n                                    placeholder=\"\"\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.gender.errors %}\n                                    {% for error in form.gender.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}                  \n                                {% else %}\n                                    <span>Select a valid gender!</span>    \n                                {% endif %}\n                                </div>\n                            </div>\n\n                            <div class=\"position-relative mb-4\">\n                                {{ form.letter.label(class=\"form-label fs-base\") }}\n                                \n                                {{ form.letter(\n                                    class=\"form-control form-control-lg\",\n                                    placeholder=\"\",\n                                    style=\"height: 120px\",\n                                ) }}\n                                <div class=\"invalid-feedback position-absolute start-0 top-100\">\n                                {% if form.letter.errors %}\n                                    {% for error in form.letter.errors %}\n                                    <span>{{ error }}</span>\n                                    {% endfor %}                  \n                                {% else %}\n                                    <span>Please enter a valid letter!</span>    \n                                {% endif %}\n                                </div>\n                            </div>\n\n                            <div class=\"mb-4\">\n                                <div class=\"form-check\">\n                                    {{ form.is_hidden(class=\"form-check-input\") }}\n                                    {{ form.is_hidden.label(class=\"form-check-label\") }}\n                                </div>\n                            </div>\n                            {{ form.submit(class=\"btn btn-primary shadow-primary btn-lg w-100\") }}\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </section>\n    </main>\n\n    <!-- <script>\n        let genderel = document.getElementById(\"gender\");\n        let form = document.querySelector('#formel');\n        let spinner = document.querySelector('#spinner');\n        let submit = document.querySelector('submit');\n\n        genderel.addEventListener('change', () => {\n            form.classList.add('d-none');\n            spinner.classList.remove('d-none');\n            let gender = document.getElementById(\"gender\").value;\n            fetch(`${window.origin}/dashboard/letter/regenerate/`, {\n                method: \"POST\",\n                credentials: \"include\",\n                headers: {\n                    \"Content-Type\": \"application/json\",\n                },\n                body: JSON.stringify({\n                    gender\n                }),\n            }).then((response) => {\n                if (response.status !== 200) {\n                    console.log(`Something went wrong! Reload the page. Status: ${response.status}`);\n                    return;\n                }\n\n                response.json().then((data) => {\n                    spinner.classList.add('d-none');\n                    form.classList.remove('d-none');\n                    console.log(data)\n                })\n            });\n        });\n    </script> -->\n{% endblock %}\n{% block footer %}\n    {% include 'helpers/_global_footer.html' %}\n{% endblock %}\n"
  },
  {
    "path": "application/templates/user/letter_sent.html",
    "content": "{% extends 'layout/root.html' %}\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n{% block body %}\n<main style=\"margin-top: 100px\">\n    <section class=\"container\">\n        <div class=\"row\">\n            <!-- Sidebar (User info + Account menu) -->\n            {% include 'helpers/_side_navbar_dashboard.html' %}\n\n            <div class=\"col-md-9 pb-5 mb-2 mb-lg-4 mt-n3 mt-md-0\">\n                <h2>\n                    💌 Message sent to your love 💝 ✈️\n                </h2>\n\n                <input type=\"text\" id=\"loveLetterLink\" class=\"form-control form-control-lg\" value=\"\" readonly>\n                <button id=\"clipboardEl\" class=\"btn btn-primary mt-3\">\n                    <i class='bx bx-copy fs-lg me-2'></i>\n                    Copy link\n                </button>\n\n                <a href=\"{{ url_for('user.letters') }}\" class=\"btn btn-dark mt-3 ms-2\">\n                    View all letters\n                </a>\n            </div>\n        </div>\n    </section>\n</main>\n\n<script>\nlet clipboardEl = document.querySelector('#clipboardEl');\nlet loveLetterLink = document.querySelector('#loveLetterLink');\nloveLetterLink.value = `${window.origin}/letter/{{ letter.link }}/`\n\n\n//Copy password to clipboard\nclipboardEl.addEventListener('click', () => {\n    const textarea = document.createElement('textarea') ;\n    const letterLink = loveLetterLink.value;\n\n    if (!letterLink){\n        return '' ;\n    }\n\n    textarea.value = letterLink;\n    document.body.appendChild(textarea) ; \n    textarea.select() ;\n    document.execCommand('copy') ;\n    textarea.remove();\n    \n    //Make an alert when password is copied\n    alert('Link copied to clipboard') ;\n});\n</script>\n{% endblock %}\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/user/letters.html",
    "content": "{% extends 'layout/root.html' %}\n{% block nav %}\n{% include 'helpers/_nav_top_landing.html' %}\n{% endblock %}\n{% block body %}\n<main style=\"margin-top: 100px\">\n    <section class=\"container\">\n        <div class=\"row\">\n            <!-- Sidebar (User info + Account menu) -->\n            {% include 'helpers/_side_navbar_dashboard.html' %}\n\n            <div class=\"col-md-9 pb-5 mb-2 mb-lg-4 mt-n3 mt-md-0\">\n                <h2>\n                    💌 Letters you have sent \n                </h2>\n\n                <!-- Light bordered table -->\n                <div class=\"table-responsive\">\n                    <table class=\"table table-bordered\">\n                        <thead>\n                            <tr>\n                                <th scope=\"col\" style=\"width: 5%\">#</th>\n                                <th scope=\"col\">Receiver</th>\n                                <th scope=\"col\">Email</th>\n                                <th scope=\"col\">Gender</th>\n                                <th scope=\"col\" style=\"width: 40%\">Message</th>\n                                <th scope=\"col\" style=\"width: 10%\">Action</th>\n                            </tr>\n                        </thead>\n                        <tbody>\n                            {% for letter in letters.items %}\n                            <tr>\n                                <th scope=\"row\">{{ loop.index }}</th>\n                                <td>{{ letter.receiver_name | title }}</td>\n                                <td>{{ letter.email }}</td>\n                                <td>{{ letter.gender | title }}</td>\n                                <td>{{ letter.message }}</td>\n                                <td>\n                                    <a href=\"{{ url_for('public.letter', link=letter.link) }}\" class=\"btn btn-success\">\n                                        View Letter\n                                    </a>\n                                </td>\n                            </tr>\n                            {% endfor %}\n                        </tbody>\n                    </table>\n                </div>\n\n                <!-- Pagination: Basic example -->\n                <nav aria-label=\"Page navigation example\">\n                    <ul class=\"pagination\">\n                        {% if letters.has_prev %}\n                        <li class=\"page-item\">\n                            <a href=\"{{ url_for('user.letters', page=letters.prev_num) }}\" class=\"page-link\">\n                                <i class=\"bx bx-chevron-left ms-n1 me-1\"></i>\n                                Prev\n                            </a>\n                        </li>    \n                        {% endif %}\n\n                        <!-- START - Iterate through the pagination -->\n                        {% for page_num in letters.iter_pages(left_edge=0, left_current=2, right_current=3, right_edge=0) %}\n                        {% if page_num %}\n                        {% if letters.page == page_num %}\n                        <li class=\"page-item active d-none d-sm-block\" aria-current=\"page\">\n                            <a class=\"page-link\" href=\"{{ url_for('user.letters', page=page_num) }}\">\n                                {{ page_num }}\n                                <span class=\"visually-hidden\">(current)</span>\n                            </a>\n                        </li>\n                        {% else %}\n                        <li class=\"page-item d-none d-sm-block\">\n                            <a href=\"{{ url_for('user.letters', page=page_num) }}\" class=\"page-link\">\n                                {{ page_num }}\n                            </a>\n                        </li>\n                        {% endif %}\n                        {% endif %}\n                        {% endfor %}\n                        <!-- END - Iterate through the pagination -->\n\n                        {% if letters.has_next %}\n                        <li class=\"page-item\">\n                            <a href=\"{{ url_for('user.letters', page=letters.next_num) }}\" class=\"page-link\">\n                                Next\n                                <i class=\"bx bx-chevron-right me-n1 ms-1\"></i>\n                            </a>\n                        </li>\n                        {% endif %}\n                    </ul>\n                </nav>\n            </div>\n        </div>\n    </section>\n</main>\n{% endblock %}\n{% block footer %}\n{% include 'helpers/_global_footer.html' %}\n{% endblock %}"
  },
  {
    "path": "application/templates/user/send_letter_email.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t\t<title>💌 You received a letter to read - ValentineAI</title>\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/theme.min.css') }}\" />\n\t\t<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='assets/css/custom.css') }}\" />\n\t</head>\n\t<body style=\"font-family: sans-serif; margin: 1rem 3rem; background-color: #6366f1;\">\n\t\t<div style=\"background-color: #fff; padding: 2rem;\">\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<!-- <td>\n              <a href=\"https://rabeyabaten.com/\" style=\"text-decoration: none;\">\n                <img src=\"https://rabeyabaten.com/static/assets/images/logo.jpg\" width=\"80\"\n                  alt=\"Rabeya Baten Foundation\">\n              </a>\n            </td> -->\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<a href=\"#\" style=\"text-decoration: none;\">\n\t\t\t\t\t\t\t\t<span style=\"margin-left: 10px; font-size: 1.5rem; color: #000; font-weight: 700;\">\n\t\t\t\t\t\t\t\t\tValentineAI\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\n\t\t\t<p style=\"text-align: left; margin-top: 20px\">\n\t\t\t\tYou have received a new letter from your loved person who really want to surprise you. Check his messages below\n\t\t\t</p>\n\t\t\t<p style=\"margin-top: 50px; margin-bottom: 50px; text-align: center;\">\n\t\t\t\t<a href=\"{{ letter_link }}\"\n\t\t\t\t\tstyle=\"background: #6366f1; padding: 15px 40px; color: #fff; border-radius: 0.35rem; text-decoration: none;\">\n\t\t\t\t\t💌 Read the message\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tIf you are unable to click the link, please copy and paste it into your browser's address bar.\n\t\t\t\t<br>\n\t\t\t<p style=\"margin-top: 30px; margin-bottom: 20px;\">\n\t\t\t\t<a href=\"{{ letter_link }}\"> {{ letter_link }} </a>\n\t\t\t</p>\n\t\t\t<br>\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tIf you have any questions, please contact us at\n\t\t\t\t<a href=\"mailto:sayhi@hossainfoysal.com\">sayhi@hossainfoysal.com</a>. We would love to help answer your question.\n\t\t\t</p>\n\t\t\t<p style=\"text-align: left;\">\n\t\t\t\tBest Regards,<br>\n\t\t\t\tValentine AI\n\t\t\t</p>\n\t\t\t<address style=\"text-align: left; background-color: #dfe6e9; color: #000; padding: 2rem;\">\n\t\t\t\t<small>\n\t\t\t\t\tIt's a fun project. Made by <a href=\"http://hossainfoysal.com\" target=\"_new\">HossainFoysal.com</a>\n\t\t\t\t\t<br>\n\t\t\t\t\tHosted on <a href=\"http://binomatrix.com\" target=\"_new\">BinoMatrix</a>. Fastest growing software company in Bangladesh.\n\t\t\t\t</small>\n\t\t\t</address>\n\t\t</div>\n\t</body>\n</html>"
  },
  {
    "path": "application/user/__init__.py",
    "content": ""
  },
  {
    "path": "application/user/forms.py",
    "content": "from flask_wtf import FlaskForm\n\nfrom wtforms import StringField\nfrom wtforms import PasswordField\nfrom wtforms import IntegerField\nfrom wtforms import SubmitField\nfrom wtforms import BooleanField\nfrom wtforms import TextAreaField\nfrom wtforms import SelectField\nfrom wtforms import DateField\n\nfrom flask_wtf.file import FileField\nfrom flask_wtf.file import FileAllowed\n\nfrom wtforms.validators import DataRequired \nfrom wtforms.validators import Optional\nfrom wtforms.validators import NumberRange\nfrom wtforms.validators import Length\nfrom wtforms.validators import Email\nfrom wtforms.validators import EqualTo\nfrom wtforms.validators import ValidationError\n\nfrom flask_login import current_user\nfrom application.models import User\n\n\n\n# LETTER FORM\nclass LetterForm(FlaskForm):\n    name = StringField(\n        'Receiver Name',\n        validators = [\n            DataRequired(),\n            Length(2, 50)\n        ]\n    )\n\n    email = StringField(\n        'Receiver Email',\n        validators = [\n            DataRequired(),\n            Email()\n        ]\n    )\n\n    gender = SelectField(\n        'To your',\n        choices = [\n            ('girlfriend', 'Girlfriend'),\n            ('boyfriend', 'Boyfriend')\n        ]\n    )\n\n    letter = TextAreaField(\n        'Your message',\n        validators = [\n            DataRequired(),\n            Length(10, 100)\n        ]\n    )\n\n    is_hidden = BooleanField(\n        'No, I don\\'t want to display my name',\n        validators = [DataRequired()]\n    )\n\n    submit = SubmitField('Send your surprise message')\n\n\n# UPDATE PROFILE FORM\nclass UpdateProfileForm(FlaskForm):\n\n    name = StringField(\n        'Your Name',\n        validators = [\n            DataRequired(),\n            Length(2, 50)\n        ]\n    )\n\n    email = StringField(\n        'E-mail',\n        validators = [        \n            DataRequired(),\n            Email()\n        ]\n    )\n\n    phone = StringField(\n        'Phone',\n        validators=[\n            DataRequired(),\n        ]\n    )\n\n    picture = FileField(\n        'Update Profile Picture', \n        validators = [\n            FileAllowed(['jpg','jpeg','png'])\n        ]\n    )\n\n    address = StringField(\n        'Address',\n        validators = [\n            DataRequired(),\n            Length(min=5, max=50)\n        ]\n    )\n\n    submit = SubmitField('Save')\n\n    def validate_phone(self, phone):\n        if phone.data and phone.data != current_user.phone:\n            user_phone = User.query.filter_by(phone=phone.data).first()\n            if user_phone:\n                raise ValidationError('This phone number is already registered. Please choose a different one.')\n\n    def validate_email(self, email):\n        if email.data and  email.data != current_user.email:\n            user_email = User.query.filter_by(email=email.data).first()\n            if user_email:\n                raise ValidationError('That email is already registered. Please choose a different one.')\n\n\n# UPDATE PASSWORD\nclass UpdatePasswordForm(FlaskForm):\n    current_password = PasswordField(\n        'Current Password'\n    )\n\n    new_password = PasswordField(\n        'New Password'\n    )\n\n    confirm_password = PasswordField(\n        'Confirm New Password',\n        validators = [\n            DataRequired(),\n            EqualTo('new_password')\n        ]\n    )\n\n    submit = SubmitField('Save')\n"
  },
  {
    "path": "application/user/views.py",
    "content": "import os\n\n#   importing basic flask module\nfrom flask import Blueprint\nfrom flask import redirect\nfrom flask import render_template\nfrom flask import request\nfrom flask import url_for\nfrom flask import flash\nfrom flask import abort\nfrom flask import jsonify\nfrom flask import make_response\nfrom flask import current_app\n\n#   importing module from flask login\nfrom flask_login import current_user\nfrom flask_login import login_required\nfrom flask_login import login_user\nfrom flask_login import logout_user\n\nfrom application import db\nfrom application import bcrypt\nfrom application.user.forms import UpdateProfileForm\nfrom application.user.forms import UpdatePasswordForm \nfrom application.user.forms import LetterForm\n\nfrom application.models import User\nfrom application.models import Letter\n\nfrom application.CohereAI.Utils import linkid\nfrom application.utils.SendEmail import send_letter_email\n# from application.CohereAI.GenerateBlog import generate_letter\n\nuser = Blueprint('user', __name__)\n\n#   USER PROFILE\n@user.route('/dashboard/', methods=['GET', 'POST'])\n@login_required\ndef dashboard():\n    if current_user.user_role == 'superadmin':\n        return redirect(url_for('superadmin.dashboard'))\n    \n    # letter = generate_letter(gender='girlfriend')\n\n    form = LetterForm()\n\n    if form.validate_on_submit():\n        letter_link = linkid()\n        \n        letter = Letter(\n            receiver_name=form.name.data.strip(),\n            email=form.email.data.strip(),\n            gender=form.gender.data,\n            message=form.letter.data.strip(),\n            link=letter_link,\n            is_hidden=form.is_hidden.data,\n            sender=current_user\n        )\n\n        db.session.add(letter)\n        db.session.commit()\n\n        send_letter_email(letter)\n        flash('Message generated', 'success')\n        return redirect(url_for('user.letter_sent'))\n\n    # if request.method == 'GET':\n    #     form.letter.data = letter\n\n    return render_template(\n        'user/dashboard.html', \n        title='Dashboard', \n        form=form\n    )\n\n#   USER PROFILE\n# @user.route('/dashboard/letter/regenerate/', methods=['GET', 'POST'])\n# @login_required\n# def regenerate_message():\n#     data = request.get_json()\n\n#     gender = data['gender'] \n\n#     letter = generate_letter(gender)\n\n#     res =  make_response(jsonify(letter), 200)\n#     return res  \n\n\n#   USER LETTERS\n@user.route('/dashboard/letter/sent/', methods=['GET', 'POST'])\n@login_required\ndef letter_sent():\n    letter = Letter.query.order_by(Letter.created_at.desc()).first_or_404()\n    return render_template('user/letter_sent.html', letter=letter)\n\n\n#   USER PROFILE\n@user.route('/dashboard/letters/', methods=['GET', 'POST'])\n@login_required\ndef letters():\n    page = request.args.get('page', 1, type=int)\n    letters = Letter.query.order_by(Letter.created_at.desc()).paginate(page=page, per_page=10)\n    return render_template('user/letters.html', letters=letters)\n\n\n#   USER PROFILE\n@user.route('/dashboard/account/', methods=['GET', 'POST'])\n@login_required\ndef account():\n    form = UpdateProfileForm()\n    if form.validate_on_submit():\n        # if form.picture.data:\n        #     picture_file = save_profile(form.picture.data)\n        #     current_user.image_file = picture_file\n        current_user.name = form.name.data.strip()\n        current_user.phone = form.phone.data\n        current_user.email = form.email.data\n        db.session.commit()\n        flash('Your account has been updated!', 'success')\n        return redirect(url_for('user.dashboard'))\n    \n    if request.method == 'GET':\n        form.name.data = current_user.name\n        form.email.data = current_user.email\n        form.phone.data = current_user.phone\n    # image_file = url_for('static', filename='profile/' + current_user.img)\n    return render_template('user/account.html', title='Profile', form=form)\n\n\n#   USER PROFILE\n@user.route('/dashboard/account/password/', methods=['GET', 'POST'])\n@login_required\ndef account_password():\n    form = UpdatePasswordForm()\n    if form.validate_on_submit():\n        # Get form data\n        new_password = form.new_password.data\n        confirm_new_password = form.confirm_password.data\n        current_password = form.current_password.data\n\n        # Check if current password is correct\n        current_password_hash = bcrypt.check_password_hash(current_user.password, current_password)\n        if current_password_hash and new_password == confirm_new_password:\n            # Hash and set new password\n            hashed_password = bcrypt.generate_password_hash(new_password).decode('utf-8')\n            current_user.password = hashed_password\n            db.session.commit()\n\n        elif current_password_hash and new_password != confirm_new_password:\n            flash('New Password and Confirm Password Doesn\\'t Matched ⚠️', 'danger')\n            return redirect(url_for('dashboard.user_profile_edit'))\n\n        elif current_password and current_password_hash == False:\n            flash('Your current password is incorrect', 'danger')\n            return redirect(url_for('user.account_password'))\n    \n        db.session.commit()\n        return redirect(url_for('user.dashboard'))\n\n    return render_template('user/account_update_password.html', title='Password', form=form)"
  },
  {
    "path": "application/utils/CutomAuth.py",
    "content": "from functools import wraps\nfrom flask import abort\nfrom flask_login import current_user\n\ndef superadmin_required(f):\n    @wraps(f)\n    def decorated_function(*args, **kwargs):\n        if not current_user.is_authenticated or current_user.user_role not in [\"superadmin\"]:\n            abort(404)  # Or redirect to an unauthorized page\n        return f(*args, **kwargs)\n    return decorated_function"
  },
  {
    "path": "application/utils/Location.py",
    "content": "import requests\n\ndef getLocation(ip_address):\n    url = 'https://get.geojs.io/v1/ip/geo/'+ip_address+'.json'\n\n    geo_request = requests.get(url)\n    geo_data = geo_request.json()\n\n    return geo_data"
  },
  {
    "path": "application/utils/SendEmail.py",
    "content": "#   importing necessary module\nimport os\nimport random\nimport string\nfrom flask import url_for\nfrom flask import render_template\nfrom flask import current_app\nfrom flask import request\nfrom flask_mail import Message\nfrom application import db\nfrom application import bcrypt\nfrom application import mail\n\nfrom application.utils.Location import getLocation\n\n# Create an email message with an activation link\n# def send_activation_email(user):\n#     token = generate_otp()\n#     user.activation_token = bcrypt.generate_password_hash(token).decode('utf-8')\n#     db.session.commit()\n#     activation_link = url_for('auth.activate_account', token=user.activation_token, _external=True)\n#     msg = Message('Activate Your Account',\n#                   sender=current_app.config['MAIL_DEFAULT_SENDER'],\n#                   recipients=[user.email])\n#     msg.html = render_template('auth/activation_email.html', activation_link=activation_link)\n#     mail.send(msg)\n\n\n# def send_activation_email(user):\n#     otp = generate_otp()\n#     print(f'====== GET THE OTP -> {otp}')\n#     token = bcrypt.generate_password_hash(otp).decode('utf-8')\n#     print(f'====== GET THE TOKEN -> {token}')\n#     user.activation_token = token\n#     print(f'====== GET THE user activation token -> {user.activation_token}')\n#     db.session.commit()\n#     activation_link = url_for('auth.activate_account', token=token, _external=True)\n#     msg = Message('Activate Your Account',\n#                   sender=current_app.config['MAIL_DEFAULT_SENDER'],\n#                   recipients=[user.email])\n#     msg.html = render_template('auth/activation_email.html', activation_link=activation_link)\n    # mail.send(msg)\n\n# ===================================\n#     SEND ACCOUNT ACTIVATION EMAIL\n# ===================================\n# def send_activation_email(user):\n#     token = user.generate_activation_token()\n#     user.activation_token = token\n#     db.session.commit()\n#     activation_url = url_for('auth.activate', token=token, _external=True)\n#     msg = Message('Activate Your Account - Rabeya Baten Foundation',\n#                   sender=current_app.config['MAIL_DEFAULT_SENDER'],\n#                   recipients=[user.email])\n#     msg.html = render_template('auth/activation_link_email.html', activation_link=activation_url)\n#     mail.send(msg)\n\n\n# ===================================\n#     SEND PASSWORD RESET EMAIL\n# ===================================\ndef send_reset_email(user):\n    token = user.get_reset_token()\n    reset_link = url_for('auth.reset_token', token=token, _external=True)\n    msg = Message('Password Reset Request - Valentine',\n                  sender=current_app.config['MAIL_DEFAULT_SENDER'],\n                  recipients=[user.email])\n    msg.html = render_template('auth/password_reset_link_email.html', password_reset_link=reset_link)\n    mail.send(msg)\n\n\n# ===================================\n#     SEND EMAIL TO RECEIVER\n# ===================================\ndef send_letter_email(letter):\n    letter_link = url_for('public.letter', link=letter.link, _external=True)\n    msg = Message('💌 You received a letter to read - ValentineAI',\n                  sender=current_app.config['MAIL_DEFAULT_SENDER'],\n                  recipients=[letter.email])\n    msg.html = render_template('user/send_letter_email.html', letter_link=letter_link)\n    mail.send(msg)"
  },
  {
    "path": "application/utils/Utils.py",
    "content": "import os\nimport uuid\nimport secrets\nimport datetime\n\ndef applicationID():\n    now = datetime.datetime.now()\n    timestamp = now.strftime(\"%Y%m%d%H%M%S\")\n    return timestamp + str(uuid.uuid4().int)[:10]"
  },
  {
    "path": "application/utils/__init__.py",
    "content": ""
  },
  {
    "path": "requirements.txt",
    "content": "alembic==1.7.7\nbcrypt==3.2.2\nblinker==1.4\ncertifi==2022.5.18.1\ncffi==1.15.0\ncharset-normalizer==2.0.12\nclick==8.0.1\ncolorama==0.4.4\ncssbeautifier==1.14.7\ndnspython==2.1.0\nEditorConfig==0.12.3\nemail-validator==1.1.3\nFaker==18.9.0\nFlask==2.0.1\nFlask-Admin==1.6.0\nFlask-Bcrypt==0.7.1\nFlask-CKEditor==0.4.6\nFlask-Login==0.5.0\nFlask-Mail==0.9.1\nFlask-Migrate==3.1.0\nFlask-Moment==1.0.5\nFlask-SQLAlchemy==2.5.1\nFlask-WTF==0.15.1\ngreenlet==1.1.1\nhtml-tag-names==0.1.2\nhtml-void-elements==0.1.0\nidna==3.2\nitsdangerous==2.0.1\nJinja2==3.0.1\njsbeautifier==1.14.7\nMako==1.2.0\nMarkupSafe==2.0.1\nmysqlclient==2.1.0\npackaging==23.1\npathspec==0.11.1\nPillow==8.3.1\npycparser==2.20\npython-dateutil==2.8.2\npython-dotenv==0.21.1\npython-slugify==8.0.1\nPyYAML==6.0\nregex==2023.5.5\nrequests==2.27.1\nsix==1.16.0\nSQLAlchemy==1.4.23\ntext-unidecode==1.3\ntomli==2.0.1\ntqdm==4.65.0\nurllib3==1.26.9\nWerkzeug==2.0.1\nWTForms==2.3.3"
  },
  {
    "path": "run.py",
    "content": "from application import create_app\n\napp = create_app()\n\n# production = False\nproduction = True\n\nif production is False:\n    if __name__ == '__main__':\n        app.run(debug=True)\nelse:\n    if __name__ == '__main__':\n        app.run()"
  }
]