В YouTube роликах ThisIsHorosho с недавних пор стали появляться ключи к Diablo III Beta. В 7-ми минутном ролике на секунду показывается ключ, кто его первый активирует, то и выигрывает. Вот так на стоп кадре выглядит ключ:

Вы подумали о том же, о чем и я?


Всего 10 ключей.

Ключ 1
О первом ключе я не знал и, наверное, никто не знал. Кому-то повезло.

Ключ 2
Ко второму видео был готов самый простой бот, который раз в 10 секунд обновляет страницу с добавленным видео и, если появилось новое видео, то модальное окно в виде алерта сообщает об этом. Выяснилось, что через 4 часа youtube обнаруживает бота и просит его ввести recaptcha, а потом еще каждый час просит ее вводить. Очень не удобно, но я не особо хотел тратить время и писать по-нормальному, так как ожидал, что второй ключ появится как-нибудь по-другому, ну например, хотя бы зелеными буквами. Второй ключ я проморгал, но когда я увидел те же серые цифры и буквы, тем же шрифтом, того же размера, на том же белом фоне и даже размером в те же три строчки, я решил сделать нормального бота.

Ключ 3
К третьему видео бот использовал youtube api, квота на кол-во запросов к которому позволяла сканирование раз в 5 секунд на протяжении 12 часов.

Алгоритм был простой:

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


Я его ввел и… он оказался уже использованым. Анализ ошибок показал, что данные через youtube api обновляются с задержкой до 5 минут! Когда бот обнаружил новое видео, уже было слишком поздно. Кому-то из других ботов или пользователей жмущих F5 повезло.

Ключ 4
К четвертому видео, бот был доработан: сейчас он использует порядка 100 прокси серверов (по 1 потоку на каждый прокси сервер), которые сканируют каждые 5 секунд gdata. Тесты показали, что около 20 прокси просто мгновенно сообщают о выходе нового видео, остальные подтягиваются в течении минуты, это было отлично. В отличии от gdata прямые ссылки появляются сразу для любого IP, поэтому тут без прокси бот просто качает видео в 20 потоков (работало даже в 1000 потоков, youtube оказывается позволяет). Скорость закачки возросла. Алгоритм сканирования был доработан: бот вначале в 4 потока сканирует вторую часть ролика (во всех предыдущих видео серийный ключ появлялся в конце ролика), а потом в 4 потока первую часть. Для надежности шаг сканирования был уменьшен до 500 мс, другие параметры так же были немного ослаблены.

Итак, выскочил алерт, сообщающий о выходе нового видео. Не успел я зайти в battle.net как уже скачалось видео (10 секунд) и появился скриншот с серийным номером:

Я порадовался, что учел возможность его появления в две строчки. Трясущимися руками я его кое-как написал и активировал! На все ушло секунд 20. Очень повезло со сканированием, алгоритм практически сразу показал серийный номер при том, что полное сканирование продолжалось 30 секунд. В этом ролике, как оказалось, было два ключа, которые показались последовательно, я ввел второй. Поздравляю того, кто активировал первый!

Осталось еще 5 ключей
Можно доработать алгоритм: запускать сканирование вместе с началом старта скачивания, алгоритм усложнится, но выигрышь будет секунд 10. Можно еще сделать распознование серийного номера и его автоматический ввод в battle.net. Тогда ключик можно будет ввести даже за 5 секунд.

Все писалось на Java, используя HttpComponents (http-протокол) и VLCj (обработка видео)

P.S. Diablo III клевая

UPDATE
Интересно было писать самого бота, поэтому затраченные 20 часов я расцениваю как время потраченное на развлечение, а не как 20 часов, за которые можно было бы заработать гораздо больше денег, чем стоит сам ключ. В свободное время я отдыхаю или изучаю что-то новое, а не работаю, а тут приятное с полезным. Игру еще не прошел.

Алгоритм
Алгоритм определения серийника я специально сразу не стал указывать по двум причинам. Узнав абсолютно точный алгоритм, авторы ThisIsHorosho быстро сделают ключ нераспознаваемым, и я окажу медвежью услугу тем, кто тоже пишет бота. Хотя допускаю, что таких людей нет, но как то же, судя по комментариям, за 3 минуты вводят серийники, неужели жмут F5 во время ожидания…

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

  1. Берем картинку из кадра и сохраняем ее с размером 640x320, VLCj позволяет сохранять картинки с любым разрешением, даже, если видео имеет другое. Все точки, близкие к цвету текста делаем черными, все остальное белое. В итоге получаем черно белые картинки. Пару таких картинок вставлены в эту статью.
  2. Для каждого скриншота считаем статистику белых и черных точек. Фоном объявляем те, где количество белых точек больше 92%, в тестах хватало и 94%, но это с запасом. На кадрах с фоном ищем серийник.
  3. Из кадра с краев отступаем по 30 пикселей, так как серийник появляется ближе к центру, а с края - никогда. Оставшееся поле разбиваем на квадраты 20x20, в каждом из которых считаем количество черных точек
  4. Квадраты с количеством черных точек от 10% до 60% объявляем квадратами с буквами - это уже с учетом того, что буква может только на половину попасть в квадрат и с некоторым запасом.
  5. Кадры, на которых есть непрерывная последовательность из как минимум 6 квадратов с буквами по горизонтали и в 3 квадрата по вертикали, объявляем кадрами с серийным номером. Сохраняем их в папку.

В итоге, появляются только картинки с текстом похожим на серийный номер:

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

Работа с VLCj
Работа с VLCj очень простая. Вначале я прочитал документацию www.capricasoftware.co.uk/vlcj/tutorial1.php , потом немного поигрался с классом MediaPlayer, но он как-то глючил, в общем я остановился на вызове прямых функций из библиотеки LibVlc - оно и быстрее и безглючнее.

Вначале создаем библиотеку
LibVlc libvlc = LibVlcFactory.factory().create();

Потом создаем массив из 8 штук AnalyzerThread (типа Runnable) (каждому 1/8 часть времени видео), которые передаем в Executors.newFixedThreadPool(4) в таком порядке: 4, 5, 6, 7, 0, 1, 2, 3. Т.е. вначале будет сканироваться вторая часть видео, а потом первая. В каждом AnalyzerThread такой код:

System.out.println("Run section " + num); libvlc_media_player_t p_mi = null; libvlc_media_t media = null; try { // prepare //libvlc_instance_t instance = libvlc.libvlc_new(0, new String); libvlc_instance_t instance = libvlc.libvlc_new(2, new String{"--vout", "dummy"}); p_mi = libvlc.libvlc_media_player_new(instance); libvlc.libvlc_audio_toggle_mute(p_mi); media = libvlc.libvlc_media_new_path(instance, fileName); libvlc.libvlc_media_player_set_media(p_mi, media); libvlc.libvlc_media_player_play(p_mi); Thread.sleep(msPlayerWait); libvlc.libvlc_media_player_pause(p_mi); // start snapshoting int block = blockFrom; for (long msTime = msFrom; msTime <= msTo; msTime += msInBlock, block++) { String path = snapshotPath + File.separator + "snap-" + String.format("%03d.png", block); libvlc.libvlc_media_player_set_time(p_mi, msTime); int r = libvlc.libvlc_video_take_snapshot(p_mi, 0, path, picWidth, picHeight); if (r != 0) System.out.println("SNAPSHOT FAILED: block=" + block + ", returnCode=" + r); else analyzeImage(path); } } finally { if (p_mi != null) libvlc.libvlc_media_player_stop(p_mi); if (media != null) libvlc.libvlc_media_release(media); if (p_mi != null) libvlc.libvlc_media_player_release(p_mi); System.out.println("Close section " + num); }

Функция analyzeImage как раз определяет, находится ли на скриншоте ключик или нет, если находится, то сохраняет его в специальную папку.

О том как использовать адское устройство и где активировать его вы можете узнать с картинки, нажав на нее.

Для того что бы собрать адское устройство вам понадобится выбить его эскиз и три ключа: разрушения, ненависти и ужаса. А для того чтобы все это могло выпасть на вас ДОЛЖНЫ быть 5 стаков нефалемской доблести , при этом шанс будет равен 5%.

Усилить вероятность выпада ключей можно используя : СМ1-10%, СМ2-20% … СМ10-100%. Таким образом, с СМ10 при убийстви хранителя вы со 100% вероятностью получите ключ.

Учтите, что после использования адское устройство разрушается, а для создания кольца адского пламени вам понадобится от 3-х (СМ10) до 30 штук (СМ1), и не факт что оно будет хорошим.

Перед активацией адское устройство лучше объединится с двумя другими, а то и четырьмя, игроками. Так вы сможете добыть реагенты для кольца адского пламени значительно быстрее, с учетом того что у каждого из вас есть одно устройство и каждый – его использует.

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

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

Двадцать лет минуло с тех пор, как в Санктуарии бесчинствовали орды нежити под предводительством могучих демонов Диабло, Мефисто и Баала, но те, кто сражался против древнего зла, по-прежнему хранят в памяти ужасные события тех дней… В поисках знаний, которые помогут одолеть новые воплощения зла, Декард Каин возвратился на развалины Тристрамского собора. И тогда с небес, объятый пламенем, спустился провозвестник Апокалипсиса: удар пришелся на то самое место, где некогда в мир проник Диабло. Небесное пламя пробудило древнее Зло. Час пробил! Герои Санктуария вновь должны подняться на защиту мира смертных от разбушевавшихся сил преисподней.

ВНИМАНИЕ! Вы покупаете коды (не диск)! Игра скачивается после активации!

Как активировать код Diablo III Standart Edition (RU):

1) Перейдите на eu.battle.net/ru/ и зарегистрируйтесь (если есть аккаунт Battle Net, войдите).
2) После входа выбирайте раздел "Прикрепить ключ игры" (eu.battle.net/account/management/claim-code.html) и введите купленный код Diablo III Standart Edition (RU).

Как активировать код Diablo III Guest Pass (RU):

1) Перейдите на http://www.diablo3.com/guest и зарегистрируйтесь (если есть аккаунт Battle Net, войдите).
2) Введите полученный гостевой ключ
3) Бесплатно загрузите игру (Гостевая версия позволяет играть в Diablo III до момента боя с королем-скилетом в Акте I)

Как активировать код WoW Guest Pass (RU):

1) Перейдите на http://www.warcraft.com/guest и введите полученный гостевой ключ
2) Загрузите бесплатную пробную версию игры
3) Играйте в World of Warcraft бесплатно вплоть до 20-го уровня

О наличии: Много, регулярно, официально (от СофтКлаб). Вы получаете коды активации сразу после оплаты! В комплекте основной код и гостевые на D3 и WoW (Все перепечатываются с "дискового" jewel издания).

Отзывы

2

Отзывов от покупателей не поступало.

В целях противодействия нарушению авторских прав и права собственности, а также исключения необоснованных обвинений в адрес администрации сайта о пособничестве такому нарушению, администрация торговой площадки Plati (http://www.сайт) обращается к Вам с просьбой - в случае обнаружения нарушений на торговой площадке Plati, незамедлительно информировать нас по адресу о факте такого нарушения и предоставить нам достоверную информацию, подтверждающую Ваши авторские права или права собственности. В письме обязательно укажите ваши контактные реквизиты (Ф.И.О., телефон).

В целях исключения необоснованных и заведомо ложных сообщений о фактах нарушения указанных прав, администрация будет отказывать в предоставлении услуг на торговой площадке Plati, только после получения от Вас письменных заявлений о нарушении с приложением копий документов, подтверждающих ваши авторские права или права собственности, по адресу: 123007, г. Москва, Малый Калужский пер. д.4, стр.3, Адвокатский кабинет «АКАР №380».

В целях оперативного реагирования на нарушения Ваших прав и необходимости блокировки действий недобросовестных продавцов, Plati просит Вас направить заверенную телеграмму, которая будет являться основанием для блокировки действий продавца, указанная телеграмма должна содержать указание: вида нарушенных прав, подтверждения ваших прав и ваши контактные данные (организиционно-правовую форму лица, Ф.И.О.). Блокировка будет снята по истечение 15 дней, в случае непредставления Вами в Адвокатский кабинет письменных документов подтверждающих ваши авторские права или права собственности.

Дроп с хранителей ключей

Ключ костей

Переходим в акт I и телепортируемся в Гиблые поля. В данной локации живут неприятные рогатые создания или в простонародье Хазра. Тут потребуется найти первого из нужных боссов – Одиг. Распознать его будет несложно, поскольку он использует довольно неприятные заклинания, которые отталкивают игрока на большое расстояние, затем, замедляя и обездвиживая, закидывает огненными шарами и копьями. Особенно большую опасность он будет представлять классам ближнего боя.

Чревоугодия

Направляемся в следующий акт II и телепортируемся в Далгурский оазис. Здесь Вас будет ожидать второй хранитель ключа – Сокар. Найти его можно иным способом, поскольку его выдает собственная аура, замедляющая снаряды. Внимательно смотрите на края своего экрана, чтобы заметить его ауру, тогда Вы точно не ошибетесь.

Войны

Теперь идем в 3 акт. На территории Каменного форта Вас встретит очередной ключник – За’Рит. Он использует неприятные ледяные умения, которые прилично могут отнять у Вас здоровье, при этом сильно замедляя. Также телепортируется во время боя. Однако найти этого «ключника» гораздо легче, чем предыдущих, поскольку эта зона выполнена в коридорном стиле и Вам не придется долго его искать.

Зла

Последний хранитель ключа находится в 4 акте, а именно на первом уровне территории Серебряный Шпиль. Родители прозвали его Некаратом. Он способен отбросить на большое расстояние, поставить в клетку и дебафнуть на снижение получаемого лечения. Лока, как и предыдущая, тоже небольшая и поиск не отберет много времени.

29 марта 2012 в 01:17

Как я получил ключ к Diablo III Beta

  • Разработка веб-сайтов ,
  • Программирование

В YouTube роликах ThisIsHorosho с недавних пор стали появляться ключи к Diablo III Beta. В 7-ми минутном ролике на секунду показывается ключ, кто его первый активирует, то и выигрывает. Вот так на стоп кадре выглядит ключ:

Вы подумали о том же, о чем и я?


Всего 10 ключей.

Ключ 1
О первом ключе я не знал и, наверное, никто не знал. Кому-то повезло.

Ключ 2
Ко второму видео был готов самый простой бот, который раз в 10 секунд обновляет страницу с добавленным видео и, если появилось новое видео, то модальное окно в виде алерта сообщает об этом. Выяснилось, что через 4 часа youtube обнаруживает бота и просит его ввести recaptcha, а потом еще каждый час просит ее вводить. Очень не удобно, но я не особо хотел тратить время и писать по-нормальному, так как ожидал, что второй ключ появится как-нибудь по-другому, ну например, хотя бы зелеными буквами. Второй ключ я проморгал, но когда я увидел те же серые цифры и буквы, тем же шрифтом, того же размера, на том же белом фоне и даже размером в те же три строчки, я решил сделать нормального бота.

Ключ 3
К третьему видео бот использовал youtube api, квота на кол-во запросов к которому позволяла сканирование раз в 5 секунд на протяжении 12 часов.

Алгоритм был простой:

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


Я его ввел и… он оказался уже использованым. Анализ ошибок показал, что данные через youtube api обновляются с задержкой до 5 минут! Когда бот обнаружил новое видео, уже было слишком поздно. Кому-то из других ботов или пользователей жмущих F5 повезло.

Ключ 4
К четвертому видео, бот был доработан: сейчас он использует порядка 100 прокси серверов (по 1 потоку на каждый прокси сервер), которые сканируют каждые 5 секунд gdata. Тесты показали, что около 20 прокси просто мгновенно сообщают о выходе нового видео, остальные подтягиваются в течении минуты, это было отлично. В отличии от gdata прямые ссылки появляются сразу для любого IP, поэтому тут без прокси бот просто качает видео в 20 потоков (работало даже в 1000 потоков, youtube оказывается позволяет). Скорость закачки возросла. Алгоритм сканирования был доработан: бот вначале в 4 потока сканирует вторую часть ролика (во всех предыдущих видео серийный ключ появлялся в конце ролика), а потом в 4 потока первую часть. Для надежности шаг сканирования был уменьшен до 500 мс, другие параметры так же были немного ослаблены.

Итак, выскочил алерт, сообщающий о выходе нового видео. Не успел я зайти в battle.net как уже скачалось видео (10 секунд) и появился скриншот с серийным номером:

Я порадовался, что учел возможность его появления в две строчки. Трясущимися руками я его кое-как написал и активировал! На все ушло секунд 20. Очень повезло со сканированием, алгоритм практически сразу показал серийный номер при том, что полное сканирование продолжалось 30 секунд. В этом ролике, как оказалось, было два ключа, которые показались последовательно, я ввел второй. Поздравляю того, кто активировал первый!

Осталось еще 5 ключей
Можно доработать алгоритм: запускать сканирование вместе с началом старта скачивания, алгоритм усложнится, но выигрышь будет секунд 10. Можно еще сделать распознование серийного номера и его автоматический ввод в battle.net. Тогда ключик можно будет ввести даже за 5 секунд.

Все писалось на Java, используя HttpComponents (http-протокол) и VLCj (обработка видео)

P.S. Diablo III клевая

UPDATE
Интересно было писать самого бота, поэтому затраченные 20 часов я расцениваю как время потраченное на развлечение, а не как 20 часов, за которые можно было бы заработать гораздо больше денег, чем стоит сам ключ. В свободное время я отдыхаю или изучаю что-то новое, а не работаю, а тут приятное с полезным. Игру еще не прошел.

Алгоритм
Алгоритм определения серийника я специально сразу не стал указывать по двум причинам. Узнав абсолютно точный алгоритм, авторы ThisIsHorosho быстро сделают ключ нераспознаваемым, и я окажу медвежью услугу тем, кто тоже пишет бота. Хотя допускаю, что таких людей нет, но как то же, судя по комментариям, за 3 минуты вводят серийники, неужели жмут F5 во время ожидания…

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

  1. Берем картинку из кадра и сохраняем ее с размером 640x320, VLCj позволяет сохранять картинки с любым разрешением, даже, если видео имеет другое. Все точки, близкие к цвету текста делаем черными, все остальное белое. В итоге получаем черно белые картинки. Пару таких картинок вставлены в эту статью.
  2. Для каждого скриншота считаем статистику белых и черных точек. Фоном объявляем те, где количество белых точек больше 92%, в тестах хватало и 94%, но это с запасом. На кадрах с фоном ищем серийник.
  3. Из кадра с краев отступаем по 30 пикселей, так как серийник появляется ближе к центру, а с края - никогда. Оставшееся поле разбиваем на квадраты 20x20, в каждом из которых считаем количество черных точек
  4. Квадраты с количеством черных точек от 10% до 60% объявляем квадратами с буквами - это уже с учетом того, что буква может только на половину попасть в квадрат и с некоторым запасом.
  5. Кадры, на которых есть непрерывная последовательность из как минимум 6 квадратов с буквами по горизонтали и в 3 квадрата по вертикали, объявляем кадрами с серийным номером. Сохраняем их в папку.

В итоге, появляются только картинки с текстом похожим на серийный номер:

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

Работа с VLCj
Работа с VLCj очень простая. Вначале я прочитал документацию www.capricasoftware.co.uk/vlcj/tutorial1.php , потом немного поигрался с классом MediaPlayer, но он как-то глючил, в общем я остановился на вызове прямых функций из библиотеки LibVlc - оно и быстрее и безглючнее.

Вначале создаем библиотеку
LibVlc libvlc = LibVlcFactory.factory().create();

Потом создаем массив из 8 штук AnalyzerThread (типа Runnable) (каждому 1/8 часть времени видео), которые передаем в Executors.newFixedThreadPool(4) в таком порядке: 4, 5, 6, 7, 0, 1, 2, 3. Т.е. вначале будет сканироваться вторая часть видео, а потом первая. В каждом AnalyzerThread такой код:

System.out.println("Run section " + num); libvlc_media_player_t p_mi = null; libvlc_media_t media = null; try { // prepare //libvlc_instance_t instance = libvlc.libvlc_new(0, new String); libvlc_instance_t instance = libvlc.libvlc_new(2, new String{"--vout", "dummy"}); p_mi = libvlc.libvlc_media_player_new(instance); libvlc.libvlc_audio_toggle_mute(p_mi); media = libvlc.libvlc_media_new_path(instance, fileName); libvlc.libvlc_media_player_set_media(p_mi, media); libvlc.libvlc_media_player_play(p_mi); Thread.sleep(msPlayerWait); libvlc.libvlc_media_player_pause(p_mi); // start snapshoting int block = blockFrom; for (long msTime = msFrom; msTime <= msTo; msTime += msInBlock, block++) { String path = snapshotPath + File.separator + "snap-" + String.format("%03d.png", block); libvlc.libvlc_media_player_set_time(p_mi, msTime); int r = libvlc.libvlc_video_take_snapshot(p_mi, 0, path, picWidth, picHeight); if (r != 0) System.out.println("SNAPSHOT FAILED: block=" + block + ", returnCode=" + r); else analyzeImage(path); } } finally { if (p_mi != null) libvlc.libvlc_media_player_stop(p_mi); if (media != null) libvlc.libvlc_media_release(media); if (p_mi != null) libvlc.libvlc_media_player_release(p_mi); System.out.println("Close section " + num); }

Функция analyzeImage как раз определяет, находится ли на скриншоте ключик или нет, если находится, то сохраняет его в специальную папку.

Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png