Тихон | Помогаю разработчикам устроиться в BigTech
14.6K subscribers
455 photos
16 videos
1 file
236 links
Senior-разработчик, ментор
🫂Записаться на консультацию по трудоустройству или задать вопрос @codepunks_bro
Отзывы https://t.me/bestitteam
Download Telegram
Промежуточные итоги апреля в группе

+ 128 собеседований
+ 12 офферов (у разных разработчиков)

C опытом 2500$ gross (React): страны СНГ
C опытом 3000$ gross (React): международка
С опытом 4500$ gross (React): международка
С опытом 280 net (Angular): @nargiz_dev
С опытом 250 net (Angular)
C опытом 200 net (Vue)
С опытом 230 net (Vue)
C опытом 240 net (React)
C опытом 250 net (React)
C опытом 255 net (React)
C опытом 295 net (React)
C опытом 300 net (React)

Средний оффер по рынку: 253 тысячи рублей.

Пока никаких существенных изменений в кол-ве собеседований по сравнению с мартом и февралем

Из приятного, три оффера в зарубежные компании, сейчас вводим регулярные встречи на английском и планируем наращивать обьем зарубежных собеседований и офферов в валюте.

p.s. получил много вопросов, что соотношение собеседований к офферу 1 к 10, тут надо учитывать, что в одну компанию проходит 2-4 собеседования, в среднем 2.5, поэтому реальное соотношение собеседований в одну компанию к офферу: 1 к 4

По любым вопросам по поиску работы, если что, отвечаю тут) @codepunks_bro
🔥248👍7🍾51
Вопросы с собеседования в IT_One на middle(250), которое мы проходили три недели назад.

Для IT_One решили не разбивать вопросы по группам, и оставить порядок таким, какой был на лайв-собеседовании.


1. Что такое Map и Set
2. Какая разница между WeakMap и WeakSet
3. Какие области видимости есть
4. Способы объявления переменной
5. Что такое всплытие
6. Что такое замыкание
7. Расскажи про Event Loop
8. Какие статические методы у промисов
9. All и AllSettled чем отличаются
10. Что такое unknown в TypeScript
11. Почему any плохо
12. Этапы жизненного цикла
13. Чем отличаются useEffect от useLayoutEffect
14. Расскажи про useMemo
15. Когда применяют useCallback

Далее 6 задач в таком порядке, если расписывать подробное решение на каждую, то скорее всего задачи не поместились бы в пост, но можно при желании решить в комментариях, а мы поделимся своими решениями 👍

Задача 1:
// С сервера получены данные о цене товара числом вида:
// 12345678 (цена может быть любой но в диапазоне от 1 до 1 000 000 000)
// необходимо написать функцию, которая будет преобразовывать цену к форматированной строке вида: 1.000.000

Задача 2:
const a = {}
a[1] = 'test'
for (key in a) console.log(typeof key)

Задача 3:
// Какие значения будут у foo и bar?
const { foo: [bar], bar: [{ baz: foo }] } = { foo: [1], bar: [{ baz: 3 }] }

Задача 4:
setTimeout(() => {
console.log("timeOut");
}, 0)

console.log(1);

new Promise(resolve => {
console.log("Promise");
setTimeout(() => {
console.log("777");
resolve()
}, 0)
}).then(() => {
console.log("then1");
})
.then(console.log('tratata'))
.then(() => {
console.log("then2");
})

console.log(4);

setTimeout(() => {
console.log("timeOut2");
}, 0)

Задача 5:
const X = { a: 1, b: 2, c: 3, d: 4 }

function getProperty(obj, key) { // Задача типизировать функцию
return obj[key]
}

getProperty(X, 'a') // нет ошибки
getProperty(X, 'm') // ошибка ключ m не является ключом для объекта X
getProperty({ name: 'Sergey' }, 'name') // нет ошибки


В целом задачи хорошо проверяют все темы в разработке, от асинхронности до ts и реакта. При успешном прохождении собеседования предлагают оффер 250 на руки + премии, от которого мы отказались в пользу другой компании.

Если задачи были полезными, ставьте 👍 или пишите в комментариях какую компанию смотрим следующей)

p.s. 6-я задача на React будет в комментариях, в пост не влезла)

@codepunks_bro
34👍28🔥16🏆2
#отзыв

Хочу оставить отзыв о комьюнити Тихона и описать свой опыт смены работы.
Небольшая предыстория:
На последнем месте работы я был более 4 лет. Несмотря на то, что за это время я принимал участие в разных командах и проектах, было ощущение застревания на одном месте и профессиональной стагнации. В том числе перестали удовлетворять условия работы, а кризис в компании не давал возможности их пересмотреть.

В 2025 я периодически предпринимал попытки самостоятельного поиска работы, но резюме оставляло желать лучшего + я сильно отвык от собеседований. По итогу за весь год я попал всего на 5 собесов. 5 собесов, Карл... Забегу вперёд и скажу, что за месяц активного участия в сообществе Тихона количество собеседований выросло до 15!

Узнал я о сообществе ещё в начале осени 2025, но взял время на подумать. Только в начале 2026 я всё-таки решился написать Тихону.

Участие в комьюнити:
Мы с Тихоном обсудили опыт, условия, и я присоединился к сообществу. Сразу скажу – это ценный и полезный опыт для каждого разработчика, который перестал ориентироваться на рынке трудоустройства по тем или иным причинам.

Важным этапом подготовки к поиску работы было составление резюме, которое бы подчёркивало твои ценность и экспертность как разработчика и проходило бы hr-фильтры.
Вместе с моим ментором Никитой мы выделили ключевые достижения из моего опыта и описали их выигрышным образом.

Также в ходе работы с Никитой удалось вдумчиво и подробно пройтись по моему прошлому опыту и преобразовать его в уверенную самопрезентацию.

База знаний, регулярные онлайн-встречи с решением задач, коммуникация внутри сообщества между участниками и менторами помогают не только качественно подготовиться к собеседованиям, но и действительно подтянуть знания и свою уверенность в них.
Также коммьюнити не стоит на месте: добавляются новые полезные активности, инструменты, подходы и решения дабы подходить к поиску работы всеобъемлюще и не отставая от реалий рынка.

В сообществе царит атмосфера поддержки и радости успехам других участников, ты не остаёшься один на один со своими переживаниями, а разделяешь их с коллегами.

В чём именно мне помогло сообщество – это чувствовать себя спокойно и уверенно на собеседовании, не "сыпаться" на практических задачах и уверенно рассказывать о своем предыдущем опыте, быть способным ответить на каверзные вопросы hr.
В том числе за короткое время удалось прокачаться в решении задач – спасибо за это нашему куратору и лектору Сергею!

Бонусом ко всему вышеперечисленному являются тёплые встречи с участниками и менторами сообщества для обмена опытом, нетворкинга и просто приятного общения 🙂

Итоги:
За 1.5 месяца активной работы с ментором Никитой удалось подготовить резюме, которое стали замечать эйчары, и отрепетировать самопрезентацию, чтобы она отскакивала от зубов 🤓
За последующие 1.5 месяца активного поиска работы удалось получить 3 оффера со значительным приростом в зарплате 🔥
Я очень рад, что в своё время присоединился к комьюнити, и надеюсь, что после прохождения испытательного срока на новой работе смогу оставаться его активным участником 😌

Огромная благодарность Тихону, Никите и Сергею за помощь и за само сообщество! 🫡
🔥319🏆7👏3👍2🤩1
Го тренировать livecoding!

Сегодня делаем стрим по решению задач с собеседований, которые были в апреле

Будем решать вместе с вами примеры на темы замыканий, event loop, react и конструкций языка, а затем обсуждать подходы к решению таких же задач на собеседовании

🗓 Четверг
20:00
📍 Ссылка придет в 🔺бота (там нет ничего лишнего, только ссылки на стримы)

Главное — решать вместе с нами, так будет максимально интересно и полезно для реальных собеседований 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍741👨‍💻1
Завезу немного мотивации

Смена работы, даже если вы знаете о ней за 3-6 месяцев, это стресс наравне со сменой квартиры или даже города, где вы живете

Я проходил это много раз, и каждый раз волновался как не в себя

Самое неприятное это страх неизвестности, непонятно что с рынком, получится ли устроиться на большее или придется соглашаться на меньшее

Эта проблема и у тех, кто получает сильно выше рынка: «А смогу ли я найти такую же оплачиваемую работу на сегодняшнем рынке?», и у тех, кто получает по низу рынка: «А могу ли я предтендовать на большее?»

Хочу рассказать немного наблюдений после того как мы помогли найти работу для 80-ти разработчиков:

1) Реальная середина рынка сейчас: 240-260 тысяч рублей net.
Что из этого вынести? Что достаточно на среднем уровне подготовиться, и мы видим что статистически у всех, кто реально работает над вопросом трудоустройства и имеет какой-то опыт, получается устраиваться в этом диапазоне.

2) Если идти на бОльшие оклады, то статистика по РФ у нас в группе такая: 20% разработчиков получают выше 300 тысяч рублей net. Возможно устроиться? Точно да, но в среднем надо иметь неплохой опыт и хорошо подготовиться.

3) Количество собеседований в 2026-м никак не проседает, не уменьшается, не увеличивается, с ним ничего не происходит проще говоря. Как звали в 2025-м, так и зовут в этом году.

4) Хорошие компании с приятными коллегами и адекватными процессами — есть, и их много. Есть и случаи, когда мы устраивались в компанию, оффер в которую лучше было бы не принимать, но такую ОС я вижу примерно от 10% выпускников. Это конечно очень много, но все-же большинство компаний адекватные. Статистически вы попадете в такую

Ну и каждый раз я выходил в рынок с мыслью, что все что с нами случается — к лучшему, просто так проекты не закрываются, люди не уходят из компаний.

Все у вас получится
48🙏13👍7🔥3🕊1
А как у вас проходят праздники?)

У нас тут вопросы с собеседования в ozon 😏

В отличии от других компаний, задачи у озона очень часто повторяются. Поэтому мы решили расставить их не в порядке, в котором они были на собеседовании, а в порядке популярности. То есть чем выше задача — тем чаще ее спрашивали на наших собеседованиях.


Открывает наш топ задача на тему два указателя. В целом задачи на два указателя попадаются на собеседованиях довольно часто, но также легчайше решаются, если знать эту тему 👇

Задача 1:
// Написать функцию которая проверяет 
// есть ли в строке указанные символы
// важно чтобы символы шли в строке
// в той же последовательности,
// не обязательно подряд

function needleInHaystack(needle, haystack) {
...
return false;
}

needleInHaystack('whe', 'cartwheel') // true
needleInHaystack('crt', 'cartwheel') // true
needleInHaystack('ctr', 'cartwheel') // false
needleInHaystack('weee', 'cartwheel') // false


Дальше задача на написание метода spyOn, который используется в Jest. Проверяет задача, по сути, контекст и методы его привязки. Мы редко видели ее в других компаниях, но в озоне ее дают почти на каждом собеседовании.

Задача 2:
// Функция должна позволять отслеживать
// вызовы оригинальной функции
// не заменяя при этом её поведение
// Для хранения аргументов отслеживаемых вызовов
// необходимо использовать массив calls.

function spyOn(obj, key) {}

const person = {
firstName: "",
lastName: "",
update(fullName) {
const [firstName, lastName] = fullName.split(" ");
this.firstName = firstName;
this.lastName = lastName;
},
};

const spy = spyOn(person, "update");

person.update("Иван Иванов");

console.log(person.firstName, person.lastName); // Иван Иванов

person.update("Пётр Петров");

console.log(person.firstName, person.lastName); // Пётр Петров

console.log(spy.calls); // ['Иван Иванов', 'Пётр Петров']


Далее задача на написание compose. Немного напоминает школьную математику, когда есть несколько функций, которые вызываются по цепочке, передавая результат выполнения из вложенной функции. Например -> f(g(x)), только написать это нужно на js.

Также можно решить через reduceRight, но не уверен стоит ли решать через него. Разработчики довольно редко используют этот метод, а вот нейронки — спокойно) Поэтому все решения с reduceRight предлагал бы аккуратно.

То же кстати касается регулярок, наизусть синтаксис помнят не все, поэтому могут понять не так.


Задача 3:
// Нужно написать функцию compose, 
// которая принимает функции
// и вызывает их задом наперёд.

const composedFn = compose(
a => a - 8, // Будет выполнена третьей
b => b ** 2, // Будет выполнена второй
(x, y) => y > 0 ? x + 3 : x - 3 // Будет выполнена первой
);

console.log(composeFn("3", 1)) // 1081
console.log(composeFn("3", 1)) // -8


Также в задаче есть небольшой трюк с приведением типов..)

Еще в комментариях добавлю небольшую задачу на верстку, чтобы пост не получился слишком большим 👋
На ней на можно отдохнуть и перевести дух, после предыдущих)

Если задачи были полезными, ставьте 👍 или пишите в комментариях какую компанию смотрим следующей)

@codepunks_bro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🔥149
Софты на собеседовании. Часть 1.

1. Вопросы иногда запоминаются больше, чем ответы

После точных вопросов про проект остаётся ощущение, что человеку интересно. Он уже в контексте проекта. С ним просто по-человечески хочется работать.

При этом вопросы должны быть не шаблонные, а с попыткой понять как действительно все работает в компании глобально, и локально в команде:
— Постараться представить компанию целиком, что она делает? Зачем нужна?)
— Понять место продукта в компании, что именно он делает?
— Если продукт зарабатывает, то на чем?
— Если не зарабатывает, то зачем собрались? 🤔
— Какая проблема сейчас, какие точные ожидания от человека на эту позицию
— Какой стек и опыт нужен им? Что для них важно?
— А что дальше, через год? Какие планы, проблемы, вызовы?

Это создает впечатление какой-то осознанности, что ли. Сознательного намерения прийти на собеседование, понять как все устроено, понять подходишь ли ты сам для решения их проблемы, а не перекладывать решение на компанию. В общем со-трудничество :)

Наверное у многих были друзья, которые ооочень много говорили, но мало слушали и интересовались, как у вас дела :)

Вот тут ощущение очень похожее, человек может быть сам по себе крутой, но какие-то важные для вас вопросы и проблемы лучше обсудить с тем, кто будет внимательно слушать.


2. Не всегда стоит угадывать ответ, когда не знаешь

Кажется это идет со школы и универа. Но это ж не экзамен, и мы не пытаемся произвести впечатление или получить хороший балл.

В работе просто большой шанс, что мы потом не будем понимать друг друга, пытаясь скрыть какие-то недопонимания и произвести хорошее впечатление.

Признаваться что «я не знаю» или «не работал с этим» — это сила, точно не слабость.


3. Анти-командная работа

Тут пойду от обратного)

Недавно был участником разговора в кафе, где тимлид команды рассказывал историю, как он одного сотрудника дословно: "сломал" а другого уволил. Это все было как одна длинная и интересная история, как будто из книги.

Но кто тогда нанимал этих разработчиков, что все так закончилось? Потому что крутость руководителя — не в том, что он такой сильный, что люди рядом не справляются. А в том, что неопытные люди рядом становятся опытными.

На позициях с командой очень важно:
1. Умеете ли вы проводить собеседования так, чтобы людей потом не нужно было увольнять?
2. Умеете ли вы объяснить задачу так, чтобы человек сделал её хорошо?
3. Можете ли вы взять человека сильнее себя — и не бояться, что он вас заменит?
4. Растут ли люди рядом с вами, или выгорают?

И если в этом списке были бы все пункты, истории выше точно можно было бы избежать)

Скорее всего, человек который в каком-то виде занимается менторством или помогает онбордить людей, работает со стажерами, нацелен на помощь и сотрудничество, а не на авторитарный контроль в команде и защиту своего места в компании.


Тема очень большая и неочевидная, поэтому если в посте было для вас что-то полезное или новое, поставьте 🔥, и постараюсь собрать второй пост про торги и позиционирование себя на собеседованиях, потому что там слишком много ошибочных моментов и тактик, которые в один пост не вмещаются)

@codepunks_bro
🔥497👍61❤‍🔥1
С начала года мы тестировали новую активность: моковые собеседования между участниками комьюнити

И все больше идем к тому, чтобы это было обязательной частью для тех, кто активно ищет работу. Помимо работы с ментором — 4-7 мок-собеседований с другими выпускниками или разработчиками на рынке.

Их можно проходить в любое время, на заранее выбранную вами тему. И именно благодаря тому, что у всех очень разный и интересный опыт, в среднем 3.7 года, мок-собеседования проходят действительно интересно и сложно. И никогда не повторяются по темам и вопросам.

Шаг за шагом, мы набирали обороты с 10, 20, и вот в апреле поставили текущий рекорд: 59 мок-собеседований в группе.
От двух до шести участников на каждом.

Не путать со статистикой реальных собеседований, календарь очень похож)
Полевых собеседований в апреле прошло 151, "тестовых" — 59


У всех разный опыт, разные компании, и возможность собеседоваться и помогать друг другу хоть каждый день — это очень круто.

Главное качество, которое мне хочется, чтобы было у программистов, да и просто у людей в IT, это готовность помогать друг другу.

И в комьюнити собрались идеальные для этого люди 👋
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥1910🔥6👍3👨‍💻1
*когда на собеседовании ищешь пропавшую скобку)

Сегодня проведем стрим с решением лайвкодинг задач, майские праздники конечно играют не на нашей стороне, потому что эта неделя вопринимается рекуртерами как праздничная, что-ли)

Но тем не менее у нас прошло 22 интересных собеседования, задачи с которых мы будем смотреть на стриме и решать вместе с вами 👋

Будем решать вместе с чатом, и брать все более интересные задачи в зависимости от того, сколько будет правильных ответов.

nextTask = allCorrect ? harderTask() : repeat()


🗓 Четверг
20:00
📍 Ссылка придет в 🔺бота (там нет ничего лишнего, только ссылки на стримы)

Главное — решать вместе с нами, так будет интереснее всего 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍75😈1
*когда не проходит один из тестов на литкоде 😅

Типы задач на livecoding. Часть 1.

В прошлом посте с задачами с озона, мы немного коснулись темы два указателя. А в этом посте хотим разобрать ее полностью. 😎


Два указателя — одна из самых популярных тем из алго-секции на фронт-собеседованиях, и пока не теряет обороты.

Какие задачи в целом часто дают на фронт-собеседованиях?
- Алгоритмические (два указателя, скользящее окно, хэш-таблица, стек)
- Особенности языка (асинхронность, контекст, замыкания, метод промиса или массива)
- Основы фреймворка (рефакторинг, асинхронность, особенности)

В этой серии, мы посмотрим решения самых частых алгоритмических задач, потому что задачи на JS мы многократно решали на стримах, и наверняка вы и так их помните) 👇

Заметка: без знания алгоритмической сложности тема может быть непонятной.


Что в может указывать на то, что задача решается указателями?


— Отсортированный массив
— Два массива
— Палиндром

Задача 1. Вариация на TwoSum.

Наверняка все, кто заходил на литкод ее знают.

Дан массив чисел и target, нужно найти в массиве два числа, которые в сумме дают target.

Например: [1, 3, 5, 7, 9, 13]

Решение 1.

Если массив не отсортирован, то оптимальное решение -> обьект, где будут храниться все значения, которые мы уже прошли. Но про этот случай мы поговорим чуть позже.

Но если массив отсортирован, то это уже не будет лучшим решением по памяти, потому что нужно создавать обьект, который займет больше места чем указатели. Если поставить один указатель на первый элемент массива, а второй на последний, и в зависимости от того, больше их сумма чем target, или меньше, мы двигаем один из указателей.

function twoSumSorted(arr, target) {
let left = 0;
let right = arr.length - 1;

while (left < right) {
const sum = arr[left] + arr[right];

if (sum === target) {
return [left, right];
} else if (sum < target) {
left++;
} else {
right--;
}
}

return null;
}


Задача 2. Обьединить два отсортированных массива в один.

Частое решение в JS — собрать массивы через spread оператор, и далее отсортировать через sort(). И оно неверное 😅

Надо помнить, что sort() имеет линейно-логарифмическую сложность, то есть работает дольше, чем если мы просто пройдемся указателями по массивам: линейная сложность.


Решение 2.

У задачи есть два варианта. Базовый и более интересный.

Если разрешено создавать новый массив, то просто ставим указатели на первые элементы массивов. Далее сравниваем их, какой меньше, такой и кладем в новый массив. Если элементы в одном из массивов закончились, то оставшиеся элементы во втором массиве просто добавляем в конец.

Но в классическом варианте, все элементы нужно сложить в первый массив, не создавая дополнительных структур.


Если начать с первых элементов, можно затереть первый элемент, и получится не тот результат, который мы ожидаем)

Поэтому фишка этого варианта — делать все тоже самое, но начинать с последних элементов массива. Ну и само собой, записывать элементы тоже в конец. 🌚

function mergeSortedArraysInPlace(arr1, m, arr2, n) {
let i = m - 1;
let j = n - 1;
let k = m + n - 1;

while (i >= 0 && j >= 0) {
if (arr1[i] >= arr2[j]) {
arr1[k] = arr1[i];
i--;
} else {
arr1[k] = arr2[j];
j--;
}
k--;
}

// если в arr2 остался остаток
while (j >= 0) {
arr1[k] = arr2[j];
j--;
k--;
}
}


Эта тема одна из самых популярных, следующая за ней по частоте и популярности -> скользящее окно, которая плавно выходит из темы указателей.

Если было интересно и такой формат разборов полезен — ставьте 👍, и мы сделаем следующие посты на оставшиеся частые темы с фронт-собеседований: скользящее окно, хэш-таблица.

@codepunks_bro
👍5014🔥91🤝1
Майские праздники конечно сильно влияют на найм, за одну неделю мая удалось собрать 26 собеседований в группе, что чуть меньше чем в обычные рабочие периоды.

А также три оффера:

6 800 долларов и релокация
306 тысяч net по ИП
1 100 000 тенге(176 тысяч рублей)

Кстати, офферы в тенге и в долларах получили два разработчика из Казахстана. Но разница в крупнейшем банке КЗ и на международном рынке конечно огромная.

Не густо, но для праздничной недели результаты хорошие) 🌚
🔥24👍1293
Почему сейчас фундаментальные знания важнее всего

Эту мысль подчеркивает Matt Pocock, создатель самых подробных разборов по TS, на конференции AI Engineer 👇
Главная проблема замещения программистов — контекст проекта, бизнеса, который сложно передать через .md файл

90% разработчиков не доверяют, и проверяют по несколько раз код после генерации, оставаясь главным проводником качества и ответственности за проект

Еще кто-то должен нанимать, обучать людей, и планировать рост проекта на большом масштабе


А также на фото анализ от Citadel Securities на основе данных Indeed

Это касается мирового рынка, но тренд положительный, и это видно по валютным офферам в мае и апреле, которые в группе занимают все больший процент с каждым месяцем

Поэтому я только хотел подчеркнуть важность не впадать в стадию "оцепенения" или стагнации на кризисах и неоднозначной экономике, такие периоды были всегда

За каждым спадом всегда идет рост

Не теряем хватку, забираем лучшее 👋
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍16🔥2
Как удобнее всего оплачивать зарубежные сервисы?

Вообще вариантов очень много, самый базовый и на все случаи: eResidency Казахстана и карта Freedom Bank. Я сам им пользуюсь, но чтобы получить резиденство КЗ нужно будет отдать 120$, зато оформление карты бесплатное. Пластиковую карту можно доставить в любой город России.

На втором месте, карта ByBit, также можно заказать пластиковую карту, но чуть менее удобно пополнять, и это не банк, поэтому доверия чуть меньше. Но думаю что это нормальный вариант для небольших сумм и тоже ей пользуюсь.

И дальше, для меня, идут виртуальные карты, например WantToPayBot, но в итоге с комиссиями при регулярных переводах выходит дороже, чем если сделать свою карту в банке. Также этим способом оплатить можно не все сервисы, например с claude очень сложно.

А как вы оплачиваете сервисы?
7👍3🔥3🙏1
*когда решал задачу на стриме, но на собеседовании делаешь вид, что видишь ее в первый раз

Сегодня четверг, а значит мы по традиции собираемся решать задачи с livecoding секций 🤓

В этом месяце это последний стрим по livecoding, потому что у нас в подготовке еще несколько стримов с hr и много всего интересного

Будем решать все задачи вместе с вами в чате, и разбирать решения пока все ответы не будут правильными) 👇

nextTask = allCorrect ? harderTask() : repeat()


🗓 Четверг
20:00
📍 Ссылка придет в 🔺бота (там нет ничего лишнего, только ссылки на стримы)

@codepunks_bro
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19🤓98👍6🆒1