wip
This commit is contained in:
parent
59ab0b7393
commit
933239a52d
60
Cargo.lock
generated
60
Cargo.lock
generated
@ -194,7 +194,9 @@ checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"android-tzdata",
|
"android-tzdata",
|
||||||
"iana-time-zone",
|
"iana-time-zone",
|
||||||
|
"js-sys",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"wasm-bindgen",
|
||||||
"windows-targets",
|
"windows-targets",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -266,6 +268,30 @@ dependencies = [
|
|||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-deque"
|
||||||
|
version = "0.8.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"crossbeam-epoch",
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-epoch"
|
||||||
|
version = "0.9.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"cfg-if",
|
||||||
|
"crossbeam-utils",
|
||||||
|
"memoffset",
|
||||||
|
"scopeguard",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-utils"
|
name = "crossbeam-utils"
|
||||||
version = "0.8.16"
|
version = "0.8.16"
|
||||||
@ -567,15 +593,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "globset"
|
name = "globset"
|
||||||
version = "0.4.13"
|
version = "0.4.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
|
checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"bstr",
|
"bstr",
|
||||||
"fnv",
|
|
||||||
"log",
|
"log",
|
||||||
"regex",
|
"regex-automata 0.4.3",
|
||||||
|
"regex-syntax 0.8.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -735,17 +761,16 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ignore"
|
name = "ignore"
|
||||||
version = "0.4.20"
|
version = "0.4.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
|
checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"crossbeam-deque",
|
||||||
"globset",
|
"globset",
|
||||||
"lazy_static",
|
|
||||||
"log",
|
"log",
|
||||||
"memchr",
|
"memchr",
|
||||||
"regex",
|
"regex-automata 0.4.3",
|
||||||
"same-file",
|
"same-file",
|
||||||
"thread_local",
|
|
||||||
"walkdir",
|
"walkdir",
|
||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
@ -853,9 +878,9 @@ checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libm"
|
name = "libm"
|
||||||
version = "0.2.7"
|
version = "0.2.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
|
checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linux-raw-sys"
|
name = "linux-raw-sys"
|
||||||
@ -909,6 +934,15 @@ version = "2.6.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memoffset"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mime"
|
name = "mime"
|
||||||
version = "0.3.17"
|
version = "0.3.17"
|
||||||
@ -1099,8 +1133,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ovlach_data"
|
name = "ovlach_data"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?tag=v0.0.1#85e59a8c7b2ddf768751a82cde1b70d99ad6147e"
|
source = "git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?branch=add_missing_fields#16c3522851e763b883c1bdc2a235bad039f943d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
"rocket",
|
"rocket",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
@ -1109,6 +1144,7 @@ dependencies = [
|
|||||||
name = "ovlach_frontend"
|
name = "ovlach_frontend"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
"fern",
|
"fern",
|
||||||
"log",
|
"log",
|
||||||
"ovlach_data",
|
"ovlach_data",
|
||||||
|
@ -14,4 +14,5 @@ rocket = { version = "0.5.0", features = ["json"] }
|
|||||||
rocket_dyn_templates = { version = "0.1.0", features = ["tera"]}
|
rocket_dyn_templates = { version = "0.1.0", features = ["tera"]}
|
||||||
reqwest = { version = "0.11", features = ["json"] }
|
reqwest = { version = "0.11", features = ["json"] }
|
||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
ovlach_data = { git = "https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git", tag = "v0.0.1"}
|
ovlach_data = { git = "https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git", branch = "add_missing_fields"}
|
||||||
|
chrono = "0.4.31"
|
@ -4,7 +4,7 @@ use std::collections::HashMap;
|
|||||||
use rocket::{*, fairing::AdHoc};
|
use rocket::{*, fairing::AdHoc};
|
||||||
use rocket_dyn_templates::{Template, tera::Value};
|
use rocket_dyn_templates::{Template, tera::Value};
|
||||||
use ::serde::Deserialize;
|
use ::serde::Deserialize;
|
||||||
use tools::tera::{static_filter, translate_filter};
|
use tools::tera::{static_filter, translate_filter, calculate_age, insert_space_every};
|
||||||
|
|
||||||
pub mod routes;
|
pub mod routes;
|
||||||
pub mod services;
|
pub mod services;
|
||||||
@ -32,6 +32,8 @@ pub fn rocket_builder() -> Rocket<Build> {
|
|||||||
Template::try_custom(|engines| {
|
Template::try_custom(|engines| {
|
||||||
engines.tera.register_filter("static", static_filter);
|
engines.tera.register_filter("static", static_filter);
|
||||||
engines.tera.register_filter("translate", translate_filter);
|
engines.tera.register_filter("translate", translate_filter);
|
||||||
|
engines.tera.register_filter("calculate_age", calculate_age);
|
||||||
|
engines.tera.register_filter("insert_space_every", insert_space_every);
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
).attach(
|
).attach(
|
||||||
|
@ -9,7 +9,8 @@ use crate::{PresentationConfig, services::cv::fetch_cv_data_from_backend, CVBack
|
|||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Debug)]
|
||||||
struct RootPage {
|
struct RootPage {
|
||||||
static_host: String,
|
static_host: String,
|
||||||
cv: CV
|
cv: CV,
|
||||||
|
download_cv_url: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/")]
|
#[get("/")]
|
||||||
@ -17,7 +18,8 @@ pub async fn index(presentation_config: &State<PresentationConfig>, cv_config: &
|
|||||||
let context = match fetch_cv_data_from_backend(cv_config.cv_backend_path.clone()).await {
|
let context = match fetch_cv_data_from_backend(cv_config.cv_backend_path.clone()).await {
|
||||||
Ok(cv) => RootPage {
|
Ok(cv) => RootPage {
|
||||||
static_host: presentation_config.static_route.clone(),
|
static_host: presentation_config.static_route.clone(),
|
||||||
cv
|
cv,
|
||||||
|
download_cv_url: "FIXME!".to_string(),
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("Can't fetch CV data from backend {:?}", e);
|
error!("Can't fetch CV data from backend {:?}", e);
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use chrono::{Utc, Datelike};
|
||||||
|
use log::error;
|
||||||
use rocket_dyn_templates::tera::{Value, Error};
|
use rocket_dyn_templates::tera::{Value, Error};
|
||||||
|
use ovlach_data::cv::chrono::from_string;
|
||||||
|
|
||||||
|
// TODO: tenhle modul je trochu prasacky..
|
||||||
|
|
||||||
pub fn static_filter(
|
pub fn static_filter(
|
||||||
value: &Value,
|
value: &Value,
|
||||||
@ -17,3 +21,47 @@ pub fn translate_filter(
|
|||||||
) -> Result<Value, Error> {
|
) -> Result<Value, Error> {
|
||||||
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", value.as_str().unwrap()))); // TODO: fix-me here!
|
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", value.as_str().unwrap()))); // TODO: fix-me here!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn insert_space_every(
|
||||||
|
value: &Value,
|
||||||
|
args: &HashMap<String, rocket_dyn_templates::tera::Value>
|
||||||
|
) -> Result<Value, Error> {
|
||||||
|
let mut input = value.as_u64().unwrap().to_string();
|
||||||
|
let times = args.get("times").unwrap().as_u64().unwrap();
|
||||||
|
let mut result = String::new();
|
||||||
|
|
||||||
|
for (index, ch) in input.chars().enumerate() {
|
||||||
|
if index > 0 && index as u64 % times == 0 {
|
||||||
|
result.push(' ');
|
||||||
|
}
|
||||||
|
result.push(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(rocket_dyn_templates::tera::Value::String(result))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn calculate_age(
|
||||||
|
value: &Value,
|
||||||
|
args: &HashMap<String, rocket_dyn_templates::tera::Value>
|
||||||
|
) -> Result<Value, Error> {
|
||||||
|
error!("{:?}", value.as_str());
|
||||||
|
//let s = value.to_string().trim_matches('"'); // TODO: unwrap here!
|
||||||
|
let value = from_string(value.as_str().unwrap().into());
|
||||||
|
match value {
|
||||||
|
Ok(value) => {
|
||||||
|
let current_date = Utc::now().naive_utc().date();
|
||||||
|
let mut age = current_date.year() - value.year();
|
||||||
|
|
||||||
|
// Adjust age if the birthday hasn't occurred yet this year
|
||||||
|
age = if current_date.month() < value.month() ||
|
||||||
|
(current_date.month() == value.month() && current_date.day() < value.day()) {
|
||||||
|
age - 1
|
||||||
|
} else {
|
||||||
|
age
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(rocket_dyn_templates::tera::Value::String(age.to_string()))
|
||||||
|
}
|
||||||
|
Err(e) => panic!("Can't parse date: {}", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
<header class="d-print-none">
|
<header class="d-print-none">
|
||||||
<div class="container text-center text-lg-left">
|
<div class="container text-center text-lg-left">
|
||||||
<div class="pt-4 clearfix">
|
<div class="pt-4 clearfix">
|
||||||
<h1 class="site-title mb-0">Walter Patterson</h1>
|
<h1 class="site-title mb-0">{{ cv.person.name }} {{ cv.person.surname }}</h1>
|
||||||
<div class="site-nav">
|
<div class="site-nav">
|
||||||
<nav role="navigation">
|
<nav role="navigation">
|
||||||
<ul class="nav justify-content-center">
|
<ul class="nav justify-content-center">
|
||||||
|
@ -18,18 +18,37 @@
|
|||||||
<div class="header-social mb-3 d-print-none" data-aos="zoom-in" data-aos-delay="200">
|
<div class="header-social mb-3 d-print-none" data-aos="zoom-in" data-aos-delay="200">
|
||||||
<nav role="navigation">
|
<nav role="navigation">
|
||||||
<ul class="nav justify-content-center">
|
<ul class="nav justify-content-center">
|
||||||
<li class="nav-item"><a class="nav-link" href="https://twitter.com/templateflip" title="Twitter"><i class="fab fa-twitter"></i><span class="menu-title sr-only">Twitter</span></a>
|
{% if cv.social.facebook %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ cv.social.facebook }}" title="Facebook"><i class="fab fa-facebook"></i><span class="menu-title sr-only">Facebook</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item"><a class="nav-link" href="https://www.facebook.com/templateflip" title="Facebook"><i class="fab fa-facebook"></i><span class="menu-title sr-only">Facebook</span></a>
|
{% endif %}
|
||||||
|
{% if cv.social.github %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ cv.social.github }}" title="github"><i class="fab fa-github"></i><span class="menu-title sr-only">Github</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item"><a class="nav-link" href="https://www.instagram.com/templateflip" title="Instagram"><i class="fab fa-instagram"></i><span class="menu-title sr-only">Instagram</span></a>
|
{% endif %}
|
||||||
|
{% if cv.social.linkedin %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ cv.social.linkedin }}" title="github"><i class="fab fa-linkedin"></i><span class="menu-title sr-only">Linkedin</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item"><a class="nav-link" href="https://github.com/templateflip" title="Github"><i class="fab fa-github"></i><span class="menu-title sr-only">Github</span></a>
|
{% endif %}
|
||||||
|
{% if cv.social.instagram %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ cv.social.instagram }}" title="github"><i class="fab fa-instagram"></i><span class="menu-title sr-only">Instagram</span></a>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if cv.social.mastodon %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ cv.social.mastodon }}" title="github"><i class="fab fa-mastodon"></i><span class="menu-title sr-only">Mastodon</span></a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-print-none"><a class="btn btn-outline-light btn-lg shadow-sm mt-1 me-3" href="material-resume.pdf" data-aos="fade-right" data-aos-delay="700">Download CV</a><a class="btn btn-info btn-lg shadow-sm mt-1" href="#contact" data-aos="fade-left" data-aos-delay="700">Hire Me</a></div>
|
<div class="d-print-none">
|
||||||
|
<a class="btn btn-outline-light btn-lg shadow-sm mt-1 me-3" href="{{ download_cv_url }}" data-aos="fade-right" data-aos-delay="700">{{ "Download CV" | translate }}</a>
|
||||||
|
<a class="btn btn-info btn-lg shadow-sm mt-1" href="#contact" data-aos="fade-left" data-aos-delay="700"> {{ "Hire me" | translate }} </a></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -40,9 +59,8 @@
|
|||||||
<div class="about-section">
|
<div class="about-section">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h2 class="h2 fw-light mb-4">About Me</h2>
|
<h2 class="h2 fw-light mb-4">{{ "About Me" | translate }} </h2>
|
||||||
<p>Hello! I’m Walter Patterson. I am passionate about UI/UX design and Web Design. I am a skilled <strong>front-end developer</strong> and master of graphic design tools such as Photoshop and Sketch. I am a quick learner and a team worker that gets the job done.</p>
|
<p>LoremIPSUM chat gpt pomuze!</p>
|
||||||
<p>I can easily capitalize on low hanging fruits and quickly maximize timely deliverables for real-time schemas.</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-5 offset-lg-1">
|
<div class="col-md-5 offset-lg-1">
|
||||||
<div class="row mt-2">
|
<div class="row mt-2">
|
||||||
@ -51,32 +69,28 @@
|
|||||||
<div class="pb-2 fw-bolder"><i class="far fa-calendar-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Age</div>
|
<div class="pb-2 fw-bolder"><i class="far fa-calendar-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Age</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<div class="pb-2">28</div>
|
<div class="pb-2">{{ cv.person.birthday | calculate_age }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<div class="pb-2 fw-bolder"><i class="far fa-envelope pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Email</div>
|
<div class="pb-2 fw-bolder"><i class="far fa-envelope pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Email</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<div class="pb-2">walter@company.com</div>
|
<div class="pb-2"> {{ cv.person.email }} </div>
|
||||||
</div>
|
|
||||||
<div class="col-sm-5">
|
|
||||||
<div class="pb-2 fw-bolder"><i class="fab fa-skype pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Skype</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-7">
|
|
||||||
<div class="pb-2">username@skype.com</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<div class="pb-2 fw-bolder"><i class="fas fa-phone pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Phone</div>
|
<div class="pb-2 fw-bolder"><i class="fas fa-phone pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Phone</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<div class="pb-2">+0718-111-0011</div>
|
<div class="pb-2">+ {{cv.person.phone | insert_space_every(times=3) }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% if cv.person.address %}
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<div class="pb-2 fw-bolder"><i class="fas fa-map-marker-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Address</div>
|
<div class="pb-2 fw-bolder"><i class="fas fa-map-marker-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Address</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<div class="pb-2">131 W, City Center, New York, U.S.A</div>
|
<div class="pb-2">{{ cv.person.address }} </div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user