bug fixes and UI improvements
This commit is contained in:
parent
fb13c81991
commit
71e382d150
45
css/main.css
45
css/main.css
@ -60,6 +60,14 @@ button {
|
|||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.flex-wrap {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gap-0-5 {
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.align-items-center {
|
.align-items-center {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
@ -76,6 +84,10 @@ button {
|
|||||||
hyphens: auto;
|
hyphens: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.margin-left-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.observe-empty-state:empty {
|
.observe-empty-state:empty {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -155,6 +167,30 @@ button {
|
|||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0.4rem 0.8rem;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 3rem;
|
||||||
|
margin-left: auto;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--accent-color);
|
||||||
|
gap: 0.3rem;
|
||||||
|
}
|
||||||
|
.button--primary {
|
||||||
|
background-color: var(--accent-color);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.button--primary .icon {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
.button:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: saturate(0);
|
||||||
|
}
|
||||||
|
|
||||||
.cert-card {
|
.cert-card {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.6rem;
|
gap: 0.6rem;
|
||||||
@ -173,15 +209,6 @@ button {
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
color: rgba(var(--text-color), 0.9);
|
color: rgba(var(--text-color), 0.9);
|
||||||
}
|
}
|
||||||
.cert-card a {
|
|
||||||
padding: 0.6rem 1rem;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: var(--accent-color);
|
|
||||||
color: white;
|
|
||||||
border-radius: 3rem;
|
|
||||||
margin-left: auto;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
.cert-card .tag {
|
.cert-card .tag {
|
||||||
padding: 0.3rem 0.5rem;
|
padding: 0.3rem 0.5rem;
|
||||||
border-radius: 0.3rem;
|
border-radius: 0.3rem;
|
||||||
|
|||||||
2
css/main.min.css
vendored
2
css/main.min.css
vendored
@ -1 +1 @@
|
|||||||
*{padding:0;margin:0;box-sizing:border-box;font-family:"Roboto slab",serif}:root{font-size:clamp(1rem,1.2vmax,1.2rem)}html,body{height:100%}body{--accent-color: rgb(231, 44, 55);--secondary-color: #ffac2e;--text-color: 34, 34, 34;--foreground-color: 252, 253, 255;--background-color: 241, 243, 248;--danger-color: rgb(255, 75, 75);--green: rgb(91, 33, 255);--yellow: rgb(220, 165, 0);color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1)}body[data-theme=dark]{--accent-color: #92a2ff;--secondary-color: #d60739;--text-color: 200, 200, 200;--foreground-color: 27, 28, 29;--background-color: 21, 22, 22;--danger-color: rgb(255, 106, 106);--green: #00e676;--yellow: rgb(255, 213, 5)}body[data-theme=dark] ::-webkit-calendar-picker-indicator{filter:invert(1)}button{padding:1rem;font-size:inherit;background-color:var(--accent-color);border:none;border-radius:.3rem;color:#fff;font-weight:500;cursor:pointer}.capitalize{text-transform:capitalize}.flex{display:flex}.align-items-center{align-items:center}.space-between{justify-content:space-between}.wrap-around{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)~.empty-state{display:none}#loader{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:1rem}#home>*{width:min(100%,56rem);margin:0 auto}#home h1{padding:1rem;padding-top:10vmax;font-size:max(1.8rem,4vw);text-align:center;color:var(--accent-color)}@-webkit-keyframes gradient{0%{background-position:0% 50%}100%{background-position:100% 50%}}@keyframes gradient{0%{background-position:0% 50%}100%{background-position:100% 50%}}#home header{width:100%;background-color:rgba(var(--text-color), 0.06);padding-bottom:3rem;margin-bottom:-2rem}#cert_sec{padding:1.5rem;font-family:"intern"}#search_certificates{position:-webkit-sticky;position:sticky;top:1rem;width:min(24rem,100% - 2rem);margin:0 auto;--border-radius: 0.5rem;border-radius:.5rem;--padding: 1rem 1.2rem;background-color:rgba(var(--foreground-color), 1);box-shadow:0 .5rem 1.5rem rgba(0,0,0,.1);border:solid thin rgba(var(--text-color), 0.2)}#issued_cert_list{display:flex;flex-direction:column;gap:.5rem;padding:1rem;padding-bottom:4rem;margin-top:1rem}.cert-card{display:grid;gap:.6rem;padding:1rem;background-color:rgba(var(--text-color), 0.03);border-radius:.5rem}.cert-card h4{font-size:1.2rem}.cert-card time{font-size:.9rem;color:rgba(var(--text-color), 0.8)}.cert-card p{font-size:.9rem;color:rgba(var(--text-color), 0.9)}.cert-card a{padding:.6rem 1rem;text-decoration:none;background-color:var(--accent-color);color:#fff;border-radius:3rem;margin-left:auto;font-weight:500}.cert-card .tag{padding:.3rem .5rem;border-radius:.3rem;font-size:.9rem;font-weight:500;color:rgba(var(--text-color), 0.9);background-color:rgba(var(--text-color), 0.06);margin-right:auto}.cert-card .tag::first-letter{text-transform:uppercase}@media(max-width: 768px){.cert-card{margin:0 -1rem;gap:1rem}}.hidden{display:none !important}
|
*{padding:0;margin:0;box-sizing:border-box;font-family:"Roboto slab",serif}:root{font-size:clamp(1rem,1.2vmax,1.2rem)}html,body{height:100%}body{--accent-color: rgb(231, 44, 55);--secondary-color: #ffac2e;--text-color: 34, 34, 34;--foreground-color: 252, 253, 255;--background-color: 241, 243, 248;--danger-color: rgb(255, 75, 75);--green: rgb(91, 33, 255);--yellow: rgb(220, 165, 0);color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1)}body[data-theme=dark]{--accent-color: #92a2ff;--secondary-color: #d60739;--text-color: 200, 200, 200;--foreground-color: 27, 28, 29;--background-color: 21, 22, 22;--danger-color: rgb(255, 106, 106);--green: #00e676;--yellow: rgb(255, 213, 5)}body[data-theme=dark] ::-webkit-calendar-picker-indicator{filter:invert(1)}button{padding:1rem;font-size:inherit;background-color:var(--accent-color);border:none;border-radius:.3rem;color:#fff;font-weight:500;cursor:pointer}.capitalize{text-transform:capitalize}.flex{display:flex}.flex-wrap{flex-wrap:wrap}.gap-0-5{gap:.5rem}.align-items-center{align-items:center}.space-between{justify-content:space-between}.wrap-around{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.margin-left-auto{margin-left:auto}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)~.empty-state{display:none}#loader{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:1rem}#home>*{width:min(100%,56rem);margin:0 auto}#home h1{padding:1rem;padding-top:10vmax;font-size:max(1.8rem,4vw);text-align:center;color:var(--accent-color)}@-webkit-keyframes gradient{0%{background-position:0% 50%}100%{background-position:100% 50%}}@keyframes gradient{0%{background-position:0% 50%}100%{background-position:100% 50%}}#home header{width:100%;background-color:rgba(var(--text-color), 0.06);padding-bottom:3rem;margin-bottom:-2rem}#cert_sec{padding:1.5rem;font-family:"intern"}#search_certificates{position:-webkit-sticky;position:sticky;top:1rem;width:min(24rem,100% - 2rem);margin:0 auto;--border-radius: 0.5rem;border-radius:.5rem;--padding: 1rem 1.2rem;background-color:rgba(var(--foreground-color), 1);box-shadow:0 .5rem 1.5rem rgba(0,0,0,.1);border:solid thin rgba(var(--text-color), 0.2)}#issued_cert_list{display:flex;flex-direction:column;gap:.5rem;padding:1rem;padding-bottom:4rem;margin-top:1rem}.button{display:flex;align-items:center;padding:.4rem .8rem;text-decoration:none;border-radius:3rem;margin-left:auto;font-weight:500;color:var(--accent-color);gap:.3rem}.button--primary{background-color:var(--accent-color);color:#fff}.button--primary .icon{fill:#fff}.button:disabled{opacity:.5;cursor:not-allowed;filter:saturate(0)}.cert-card{display:grid;gap:.6rem;padding:1rem;background-color:rgba(var(--text-color), 0.03);border-radius:.5rem}.cert-card h4{font-size:1.2rem}.cert-card time{font-size:.9rem;color:rgba(var(--text-color), 0.8)}.cert-card p{font-size:.9rem;color:rgba(var(--text-color), 0.9)}.cert-card .tag{padding:.3rem .5rem;border-radius:.3rem;font-size:.9rem;font-weight:500;color:rgba(var(--text-color), 0.9);background-color:rgba(var(--text-color), 0.06);margin-right:auto}.cert-card .tag::first-letter{text-transform:uppercase}@media(max-width: 768px){.cert-card{margin:0 -1rem;gap:1rem}}.hidden{display:none !important}
|
||||||
@ -57,6 +57,12 @@ button {
|
|||||||
.flex {
|
.flex {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
.flex-wrap {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.gap-0-5 {
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
.align-items-center {
|
.align-items-center {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
@ -69,6 +75,9 @@ button {
|
|||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
hyphens: auto;
|
hyphens: auto;
|
||||||
}
|
}
|
||||||
|
.margin-left-auto {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.observe-empty-state:empty {
|
.observe-empty-state:empty {
|
||||||
display: none;
|
display: none;
|
||||||
@ -136,6 +145,29 @@ button {
|
|||||||
padding-bottom: 4rem;
|
padding-bottom: 4rem;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
.button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0.4rem 0.8rem;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 3rem;
|
||||||
|
margin-left: auto;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--accent-color);
|
||||||
|
gap: 0.3rem;
|
||||||
|
&--primary {
|
||||||
|
background-color: var(--accent-color);
|
||||||
|
color: white;
|
||||||
|
.icon {
|
||||||
|
fill: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: saturate(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
.cert-card {
|
.cert-card {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.6rem;
|
gap: 0.6rem;
|
||||||
@ -153,15 +185,6 @@ button {
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
color: rgba(var(--text-color), 0.9);
|
color: rgba(var(--text-color), 0.9);
|
||||||
}
|
}
|
||||||
a {
|
|
||||||
padding: 0.6rem 1rem;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: var(--accent-color);
|
|
||||||
color: white;
|
|
||||||
border-radius: 3rem;
|
|
||||||
margin-left: auto;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
.tag {
|
.tag {
|
||||||
padding: 0.3rem 0.5rem;
|
padding: 0.3rem 0.5rem;
|
||||||
border-radius: 0.3rem;
|
border-radius: 0.3rem;
|
||||||
|
|||||||
62
index.html
62
index.html
@ -260,40 +260,40 @@
|
|||||||
}
|
}
|
||||||
const render = {
|
const render = {
|
||||||
issuedCertCard(details) {
|
issuedCertCard(details) {
|
||||||
const { floData, txid, name, floId, certType, time } = details
|
const { floData, txid, name, floId, certType, time, verificationLink } = details
|
||||||
return html`
|
return html`
|
||||||
<li class="cert-card">
|
<li class="cert-card">
|
||||||
<div class="flex align-items-center space-between">
|
<div class="flex align-items-center space-between">
|
||||||
<h4 class="capitalize">${name.toLowerCase()}</h4>
|
<span class="tag">${certType.toLowerCase()}</span>
|
||||||
<time>${getFormattedTime(time, 'date-only')}</time>
|
<time>${getFormattedTime(time, 'date-only')}</time>
|
||||||
</div>
|
</div>
|
||||||
|
<h4 class="capitalize">${name.toLowerCase()}</h4>
|
||||||
<p class="wrap-around">${floId}</p>
|
<p class="wrap-around">${floId}</p>
|
||||||
<div class="flex align-items-center space-between">
|
<div class="flex align-items-center gap-0-5 margin-left-auto">
|
||||||
<span class="tag">${certType.toLowerCase()}</span>
|
<a href=${verificationLink} target="_blank" class="button">Verify</a>
|
||||||
<a href=${`#/home/download?id=${txid}`}>Download</a>
|
<button class="download-button button button--primary" data-txid=${txid}>
|
||||||
</div>
|
<svg class="icon" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><rect fill="none" height="24" width="24"/></g><g><path d="M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z"/></g></svg>
|
||||||
|
Download
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
`;
|
`;
|
||||||
},
|
},
|
||||||
certificate(txid) {
|
certificate(txid, downloadButton) {
|
||||||
const { floData, time, name, floId, certType, isNewer, certPara } = floGlobals.validCerts.get(txid)
|
const { floData, time, name, floId, certType, isNewer, certPara, verificationLink } = floGlobals.validCerts.get(txid)
|
||||||
let paraSplitWord
|
let paraSplitWord
|
||||||
let certificateVerification = ''
|
let certificateVerification = ''
|
||||||
switch (certType) {
|
switch (certType) {
|
||||||
case "CERTIFICATE OF INTERNSHIP":
|
case "CERTIFICATE OF INTERNSHIP":
|
||||||
certificateVerification = 'internCertificate';
|
|
||||||
paraSplitWord = 'worked'
|
paraSplitWord = 'worked'
|
||||||
break;
|
break;
|
||||||
case "CERTIFICATE OF EMPLOYMENT":
|
case "CERTIFICATE OF EMPLOYMENT":
|
||||||
certificateVerification = 'employeeCertificate';
|
|
||||||
paraSplitWord = 'was employed'
|
paraSplitWord = 'was employed'
|
||||||
break;
|
break;
|
||||||
case "CERTIFICATE OF VOLUNTEERSHIP":
|
case "CERTIFICATE OF VOLUNTEERSHIP":
|
||||||
certificateVerification = 'volunteerCertificate';
|
|
||||||
paraSplitWord = 'was employed'
|
paraSplitWord = 'was employed'
|
||||||
break;
|
break;
|
||||||
case "CERTIFICATE OF PARTICIPATION":
|
case "CERTIFICATE OF PARTICIPATION":
|
||||||
certificateVerification = 'participationCertificate';
|
|
||||||
paraSplitWord = 'participated'
|
paraSplitWord = 'participated'
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -338,7 +338,7 @@
|
|||||||
certPdf.text("Scan to verify this certificate", 700, 850, { align: 'center' });
|
certPdf.text("Scan to verify this certificate", 700, 850, { align: 'center' });
|
||||||
// jspdf add svg
|
// jspdf add svg
|
||||||
let svgNode = QRCode({
|
let svgNode = QRCode({
|
||||||
msg: `https://www.ranchimall.net/verify/?${certificateVerification}=${txid}`,
|
msg: verificationLink,
|
||||||
dim: 160
|
dim: 160
|
||||||
});
|
});
|
||||||
const svgData = new XMLSerializer().serializeToString(svgNode);
|
const svgData = new XMLSerializer().serializeToString(svgNode);
|
||||||
@ -352,6 +352,10 @@
|
|||||||
const imgData = canvas.toDataURL('image/png');
|
const imgData = canvas.toDataURL('image/png');
|
||||||
certPdf.addImage(imgData, 'PNG', 620, 670, 160, 160);
|
certPdf.addImage(imgData, 'PNG', 620, 670, 160, 160);
|
||||||
certPdf.save(`RanchiMall ${certType.toLowerCase()} for ${name}.pdf`);
|
certPdf.save(`RanchiMall ${certType.toLowerCase()} for ${name}.pdf`);
|
||||||
|
if (downloadButton) {
|
||||||
|
downloadButton.disabled = false;
|
||||||
|
downloadButton.lastChild.textContent = "Download";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -362,7 +366,7 @@
|
|||||||
floBlockchainAPI.readAllTxs('FFCpiaZi31TpbYw5q5VNk8qJMeDiTLgsrE').then(res => {
|
floBlockchainAPI.readAllTxs('FFCpiaZi31TpbYw5q5VNk8qJMeDiTLgsrE').then(res => {
|
||||||
// res.unshift({ floData: 'CERTIFICATE OF INTERNSHIP|FPFeL5PXzW9bGosUjQYCxTHSMHidnygvvd|Sairaj mote|worked as an intern on projects for RanchiMall from 11th September 2020 to 2nd February 2021: Twitter Marketing and Peer-to-Peer Content Collaboration on FLO Blockchain. She contributed mostly to Twitter marketing and also collaborated with other content writers on writing articles for RanchiMall Times. She performed well under the guidance of the RIBC team of RanchiMall.', time: Date.now() })
|
// res.unshift({ floData: 'CERTIFICATE OF INTERNSHIP|FPFeL5PXzW9bGosUjQYCxTHSMHidnygvvd|Sairaj mote|worked as an intern on projects for RanchiMall from 11th September 2020 to 2nd February 2021: Twitter Marketing and Peer-to-Peer Content Collaboration on FLO Blockchain. She contributed mostly to Twitter marketing and also collaborated with other content writers on writing articles for RanchiMall Times. She performed well under the guidance of the RIBC team of RanchiMall.', time: Date.now() })
|
||||||
for (tx of res) {
|
for (tx of res) {
|
||||||
const { vin, vout, time, floData } = tx
|
const { vin, vout, time, floData, txid } = tx
|
||||||
if (!vin.some(i => i.addr === floGlobals.RM_CertificateIssuer_id)) continue;
|
if (!vin.some(i => i.addr === floGlobals.RM_CertificateIssuer_id)) continue;
|
||||||
if (!vout.some(o => [floGlobals.RMincorporationID, floGlobals.RIBC_id].includes(o.scriptPubKey.addresses[0]))) continue;
|
if (!vout.some(o => [floGlobals.RMincorporationID, floGlobals.RIBC_id].includes(o.scriptPubKey.addresses[0]))) continue;
|
||||||
if (!floData.startsWith('CERTIFICATE OF')) continue;
|
if (!floData.startsWith('CERTIFICATE OF')) continue;
|
||||||
@ -373,12 +377,28 @@
|
|||||||
[certType, floId, name, certPara] = floData.split('|')
|
[certType, floId, name, certPara] = floData.split('|')
|
||||||
} else {
|
} else {
|
||||||
floId = floData.match(/\b\w{30,36}\b/)?.[0].trim()
|
floId = floData.match(/\b\w{30,36}\b/)?.[0].trim()
|
||||||
name = getBetween(floData, 'certifies that', 'FLO ID').trim()
|
name = getBetween(floData, 'certifies that', 'FLO ID').replace(/(,|\s)+$/, '')
|
||||||
certType = getFirstThreeWords(floData).trim()
|
certType = getFirstThreeWords(floData).trim()
|
||||||
isNewer = false
|
isNewer = false
|
||||||
}
|
}
|
||||||
if (!floId) continue;
|
if (!floId) continue;
|
||||||
floGlobals.validCerts.set(tx.txid, { name, ...tx, floId, certType, isNewer, certPara })
|
let certificateVerification = ''
|
||||||
|
switch (certType) {
|
||||||
|
case "CERTIFICATE OF INTERNSHIP":
|
||||||
|
certificateVerification = 'internCertificate';
|
||||||
|
break;
|
||||||
|
case "CERTIFICATE OF EMPLOYMENT":
|
||||||
|
certificateVerification = 'employeeCertificate';
|
||||||
|
break;
|
||||||
|
case "CERTIFICATE OF VOLUNTEERSHIP":
|
||||||
|
certificateVerification = 'volunteerCertificate';
|
||||||
|
break;
|
||||||
|
case "CERTIFICATE OF PARTICIPATION":
|
||||||
|
certificateVerification = 'participationCertificate';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const verificationLink = `https://www.ranchimall.net/verify/?${certificateVerification}=${txid}`
|
||||||
|
floGlobals.validCerts.set(txid, { name, ...tx, floId, certType, isNewer, certPara, verificationLink })
|
||||||
}
|
}
|
||||||
resolve()
|
resolve()
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
@ -386,6 +406,16 @@
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
getRef('issued_cert_list').addEventListener('click', e => {
|
||||||
|
if (e.target.closest('.download-button')) {
|
||||||
|
const downloadButton = e.target.closest('.download-button')
|
||||||
|
downloadButton.disabled = true;
|
||||||
|
downloadButton.lastChild.textContent = 'downloading...';
|
||||||
|
setTimeout(() => {
|
||||||
|
render.certificate(downloadButton.dataset.txid, downloadButton)
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user