Compare commits

...

9 Commits

Author SHA1 Message Date
906d6df5ae add docker file 2022-12-22 12:52:29 +03:00
ca0afdad2c redesign auth page 2022-11-12 13:53:25 +03:00
0cf2044506 add login page 2022-11-12 12:07:37 +03:00
2a54b37ead add login logout route 2022-11-11 18:53:57 +03:00
9d9d68e8d4 add requirements.txt 2022-11-11 18:48:50 +03:00
207e22d4f6 add download image button 2022-11-09 19:26:52 +03:00
6cad7d6ed6 main page worked 2022-11-09 19:17:41 +03:00
347f467735 add download func 2022-11-06 23:05:43 +03:00
de3e20e0cb renamed uploaded file 2022-11-06 15:01:37 +03:00
52 changed files with 392 additions and 66 deletions

15
Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM python:3.11-slim-bullseye
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# copy project
COPY . /usr/src/app/
CMD ["python","app.py"]

196
app.py
View File

@@ -1,78 +1,178 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from flask import Flask, render_template, request, flash, redirect, url_for from flask import Flask, render_template, request, flash, redirect, url_for, send_file
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
import os import os
from models import db import secrets
from models import PrintedDetal
import logging import logging
from models import PrintedDetal from models import db, PrintedDetal
from datetime import datetime
logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.DEBUG) logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.DEBUG)
UPLOAD_IMG_FOLDER = os.path.join('static', 'img', 'uploads')
UPLOAD_STL_FOLDER = os.path.join('static', 'stl')
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'stl'}
app = Flask(__name__) app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['UPLOAD_FOLDER'] = UPLOAD_IMG_FOLDER app.config['UPLOAD_IMG_FOLDER'] = os.path.join('static', 'uploads', 'img')
app.config['UPLOAD_FOLDER2'] = UPLOAD_STL_FOLDER app.config['UPLOAD_STL_FOLDER'] = os.path.join('static', 'uploads', 'stl')
app.config['UPLOAD_SRC_FOLDER'] = os.path.join('static', 'uploads', 'src')
db.init_app(app) db.init_app(app)
def getlldb():
allDetals = {}
detalsQuery = PrintedDetal.query.all()
for detal in detalsQuery:
detals = {}
detals['id'] = detal.id
detals['img'] = detal.img
detals['stl'] = detal.stl
detals['src'] = detal.src
detals['isprinted'] = detal.isprinted
detals['date'] = detal.dateadd
allDetals[detal.id] = detals
return allDetals
@app.route("/") @app.route("/")
def index(): def index():
#detals = PrintedDetal.query.all()
return render_template("index.html") # , detals=detals) getall = getlldb()
return render_template("index.html", detals=getall)
@app.route('/login')
def login():
pass
@app.route('/logout')
def logout():
pass
@app.route("/admin", methods=['GET', 'POST']) @app.route("/admin", methods=['GET', 'POST'])
def admipage(): def admipage():
logging.debug("adminpage loaded")
if request.method == 'POST':
logging.debug("POST QUERY loaded")
image_file = request.files['imgfile']
stl_file = request.files['stlfile']
logging.debug(image_file)
logging.debug(stl_file)
image_file.save(os.path.join(
app.config['UPLOAD_FOLDER'], image_file.filename))
stl_file.save(os.path.join(
app.config['UPLOAD_FOLDER2'], stl_file.filename))
if request.form.get('isprinted') == 'on':
isprinered = True
else:
isprinered = False
logging.debug(image_file)
logging.debug(stl_file)
logging.debug(isprinered)
# detal = PrintedDetal(imgpath=image_file.filename,
# stlpath=stl_file.filename,
# isprinted=isprinered)
# db.session.add(detal)
# db.session.commit()
return render_template("adminpage.html")
else:
return render_template("adminpage.html") return render_template("adminpage.html")
@app.route('/uploader', methods=['GET', 'POST']) @app.route('/uploader', methods=['GET', 'POST'])
def upload_file(): def upload_file():
if request.method == 'POST': if request.method == 'POST':
f = request.files['file'] image_file = request.files['img']
f.save(secure_filename(f.filename)) stl_file = request.files['stl']
return 'file uploaded successfully' src_file = request.files['src']
if len(image_file.filename) > 0:
filename = image_file.filename.split('.')
image_file.filename = secrets.token_hex(15) + '.' + filename[-1]
image_file.save(os.path.join(
app.config['UPLOAD_IMG_FOLDER'], image_file.filename))
if len(stl_file.filename) > 0:
filename = stl_file.filename.split('.')
stl_file.filename = secrets.token_hex(15) + '.' + filename[-1]
stl_file.save(os.path.join(
app.config['UPLOAD_STL_FOLDER'], stl_file.filename))
if len(src_file.filename) > 0:
filename = src_file.filename.split('.')
src_file.filename = secrets.token_hex(15) + '.' + filename[-1]
src_file.save(os.path.join(
app.config['UPLOAD_SRC_FOLDER'], src_file.filename))
if request.form.get('isprinted') == 'on':
isprinered = True
else:
isprinered = False
detal = PrintedDetal(img=image_file.filename,
stl=stl_file.filename,
src=src_file.filename,
isprinted=isprinered,
datead=datetime.now().strftime('%d.%m.%Y'))
db.session.add(detal)
db.session.commit()
return redirect(url_for('admipage'))
@app.route('/editcard')
def editcadrd():
allDetals = {}
detalsQuery = PrintedDetal.query.all()
for detal in detalsQuery:
detals = {}
detals['id'] = detal.id
detals['img'] = detal.img
detals['stl'] = detal.stl
detals['src'] = detal.src
detals['isprinted'] = detal.isprinted
detals['date'] = detal.dateadd
allDetals[detal.id] = detals
return render_template('editcard.html', detals=allDetals)
@app.route('/editcard/<id>')
def editcard2(id):
data = PrintedDetal.query.get(id)
print(data.id)
return render_template('cardupdate.html', data=data.id)
@app.route('/updater', methods=['POST'])
def updater():
if request.method == 'POST':
id = request.form.get('dataid')
detal = PrintedDetal.query.get(id)
image_file = request.files['img']
stl_file = request.files['stl']
src_file = request.files['src']
if len(image_file.filename) > 0:
filename = image_file.filename.split('.')
image_file.filename = secrets.token_hex(15) + '.' + filename[-1]
image_file.save(os.path.join(
app.config['UPLOAD_IMG_FOLDER'], image_file.filename))
detal.img = image_file.filename
if len(stl_file.filename) > 0:
filename = stl_file.filename.split('.')
stl_file.filename = secrets.token_hex(15) + '.' + filename[-1]
stl_file.save(os.path.join(
app.config['UPLOAD_STL_FOLDER'], stl_file.filename))
detal.stl = stl_file.filename
if len(src_file.filename) > 0:
filename = src_file.filename.split('.')
src_file.filename = secrets.token_hex(15) + '.' + filename[-1]
src_file.save(os.path.join(
app.config['UPLOAD_SRC_FOLDER'], src_file.filename))
detal.src = src_file.filename
if request.form.get('isprinted') == 'on':
isprinered = True
else:
isprinered = False
detal.isprinted = isprinered
db.session.commit()
return redirect(url_for('editcadrd'))
return "123"
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -6,7 +6,9 @@ db = SQLAlchemy()
class PrintedDetal(db.Model): class PrintedDetal(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
imgpath = db.Column(db.String(3000)) img = db.Column(db.String(3000))
stlpath = db.Column(db.String(3000)) stl = db.Column(db.String(3000))
srcpath = db.Column(db.String(3000)) src = db.Column(db.String(3000))
isprinted = db.Column(db.Boolean()) isprinted = db.Column(db.Boolean())
dateadd = db.Column(db.String(11))

BIN
requirements.txt Normal file

Binary file not shown.

View File

@@ -4,7 +4,7 @@ body {
background-color: #dcf3d0; background-color: #dcf3d0;
} }
header{ header {
box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2); box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2);
} }
@@ -22,7 +22,7 @@ header{
margin-top: 20px; margin-top: 20px;
} }
.col-md-4{ .col-md-4 {
margin-bottom: 25px; margin-bottom: 25px;
} }
@@ -30,8 +30,17 @@ header{
background-color: #fef6dd; background-color: #fef6dd;
border-radius: 12px; border-radius: 12px;
box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2); box-shadow: 0px 5px 10px 2px rgba(34, 60, 80, 0.2);
height: 450px;
} }
.card-edit {
height: 400px;
}
.card-img-top{
height: 250px;
}
.btn { .btn {
@@ -50,19 +59,18 @@ header{
} }
.card-img-top{ .card-img-top {
padding: 10px; padding: 10px;
border-radius: 18px; border-radius: 18px;
} }
h5{ h5 {
font-size: 17px; font-size: 17px;
} }
.mobile-margin{ .mobile-margin {
margin-bottom: 10px; margin-bottom: 10px;
padding: 10px; padding: 10px;
} }

BIN
static/img/Auth.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

56
templates/adduser.html Normal file
View File

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title>
</head>
<body>
<header>
<h1 class="h1header"> Каталог печатных 3д деталей </h1>
</header>
<div class="container">
<div class="row">
<div class="col-md-4 d-flex aligns-items-center mx-auto">
<div class="card card-login mobile-margin">
<img class="card-img-top" src="{{url_for('static', filename='img/Auth.jpg')}}">
<form method="POST" action="/auth">
<div class="col mb-3">
<label for="exampleInputEmail1" class="form-label">Введите логин</label>
<input type="text" class="form-control" name="login">
</div>
<div class="col mb-3">
<label>Введите пароль</label>
<input type="password" class="form-control" name="passwd">
</div>
<button type="submit" class="btn btn-primary">Авторизоваться</button>
</form>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -8,7 +8,7 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous"> integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/adminpage.css')}}"> <link rel="stylesheet" href="{{ url_for('static', filename='css/adminpage.css')}}">
<title>3d Detals</title> <title>3d Detals adminka</title>
</head> </head>
<body> <body>
@@ -18,13 +18,13 @@
<div class="container"> <div class="container">
<div class="row "> <div class="row ">
<form method="post" enctype=multipart/form-data> <form method="post" enctype=multipart/form-data action="/uploader">
<label class=" d-block p-2">Выберите изображение </label> <label class=" d-block p-2">Выберите изображение </label>
<input class=" formblock d-block p-2" type="file" name="imgfile" /> <input class=" formblock d-block p-2" type="file" name="img" />
<label class=" d-block p-2">Выберите исходный file </label> <label class=" d-block p-2">Выберите исходный file </label>
<input class=" formblock d-block p-2" type="file" name="origfile" /> <input class=" formblock d-block p-2" type="file" name="src" />
<label class=" d-block p-2">Выберите stl file </label> <label class=" d-block p-2">Выберите stl file </label>
<input class=" formblock d-block p-2" type="file" name="stlfile" /> <input class=" formblock d-block p-2" type="file" name="stl" />
<label > Напечатано </label> <label > Напечатано </label>
<input type="checkbox" class="bxigchekcbox" id="printed" name="isprinted"> <input type="checkbox" class="bxigchekcbox" id="printed" name="isprinted">
<input class="btn d-block p-2" type="submit" value="Upload"> <input class="btn d-block p-2" type="submit" value="Upload">

40
templates/cardupdate.html Normal file
View File

@@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static', filename='css/adminpage.css')}}">
<title>3d Detals adminka</title>
</head>
<body>
<header>
<h1 class="h1header"> Обновление карточки {{data['id']}}</h1>
</header>
<div class="container">
<div class="row ">
<form method="post" enctype=multipart/form-data action="/updater">
<label class=" d-block p-2">Выберите изображение </label>
<input class=" formblock d-block p-2" type="file" name="img" />
<label class=" d-block p-2">Выберите исходный file </label>
<input class=" formblock d-block p-2" type="file" name="src" />
<label class=" d-block p-2">Выберите stl file </label>
<input class=" formblock d-block p-2" type="file" name="stl" />
<label > Напечатано </label>
<input type="checkbox" class="bxigchekcbox" id="printed" name="isprinted">
<input class="btn d-block p-2" type="submit" value="Обновить">
<input name="dataid" type="hidden" value="{{data}}" >
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

48
templates/editcard.html Normal file
View File

@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title>
</head>
<body>
<header>
<h1 class="h1header"> Каталог печатных 3д деталей </h1>
</header>
<div class="container">
<div class="row">
{% for key, value in detals.items() %}
<div class="col-md-4">
<div class="card card-edit mobile-margin">
<img class="card-img-top" src="{{url_for('static', filename='uploads/img/' + value['img'])}}">
<div class="card-body">
<dv class="row">
<div class="col">
<a href="/editcard/{{value['id']}}" class="btn btn-block mobile-margin"> Изменить </a>
</div>
<div class="row">
</div>
</div>
</div>
</div>
{%endfor%}
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -17,28 +17,30 @@
<div class="container"> <div class="container">
<div class="row"> <div class="row">
{% for i in range(10) %} {% for key, value in detals.items() %}
<div class="col-md-4"> <div class="col-md-4">
<div class="card mobile-margin"> <div class="card mobile-margin">
<img class="card-img-top" src="{{url_for('static', filename='img/1.jpg')}}" alt="1 image"> <img class="card-img-top" src="{{url_for('static', filename='uploads/img/' + value['img'])}}">
<div class="card-body"> <div class="card-body">
<dv class="row"> <dv class="row">
<div class="col"> <div class="col">
<button class="btn btn-block mobile-margin">Скачать исходник</button> <a href="{{url_for('static', filename='uploads/img/' + value['img'])}}" class="btn btn-block mobile-margin" download>Скачать изображение </a>
</div> </div>
<div class="col"> <div class="col">
<button class="btn btn-block mobile-margin">Скачать stl </button> <a href="{{url_for('static', filename='uploads/src/' + value['src'])}}" class="btn btn-block mobile-margin" download >Скачать исходник</a>
</div>
<div class="col">
<a href="{{url_for('static', filename='uploads/stl/' + value['stl'])}}" class="btn btn-block mobile-margin" download>Скачать stl </a>
</div> </div>
<div class="row"> <div class="row">
<div class="col d-flex justify-content-center"> <div class="col d-flex justify-content-center">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDefault" disabled> <input class="form-check-input" type="checkbox" {{'checked="checked"' if value['isprinted']==1 else ""}} id="flexCheckDefault" disabled>
<label class="form-check-label" for="flexCheckDefault"> <label> Напечатано </label>
Напечатано
</label>
</div> </div>
<div class="col d-flex justify-content-center"> <div class="col d-flex justify-content-center">
<h5> 22.10.2022</h5> <h5> {{value['dateadd']}}</h5>
</div> </div>
</div> </div>
</div> </div>

55
templates/login.html Normal file
View File

@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}">
<title>3d Detals</title>
</head>
<body>
<header>
<h1 class="h1header"> Каталог печатных 3д деталей </h1>
</header>
<div class="container container-login d-flex h-100 ">
<div class="row d-flex justify-content-center ">
<div class="col-md-4">
<div class="card align-middle mobile-margin">
<div class="card-body text-center">
<dv class="row">
<h2 class="fw-bold mb-2 text-uppercase">Авторизация</h2>
<p class="mb-5">Введите логин и пароль</p>
<div class="form-outline form-white mb-4">
<input type="email" id="typeEmailX" class="form-control form-control-lg" />
<label class="form-label" for="typeEmailX">Email</label>
</div>
<div class="form-outline form-white mb-4">
<input type="password" id="typePasswordX" class="form-control form-control-lg" />
<label class="form-label" for="typePasswordX">Password</label>
</div>
<div class="col">
<a href="" class="btn btn-block mobile-margin" download>Авторизоваться </a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
crossorigin="anonymous"></script>
</body>
</html>