extend _components/base.pug

block pagetitle
    | Events 

block css 
    link(rel="stylesheet", href="../css/events.css")

block main
    - global.pageHref = "events.html"
    include ./_components/header.pug



    section.eventhero
        .container
            .eventhero__main
                h2.h2.
                    Join The Apache Ignite <br>
                    Community At&nbsp;Conferences, <br>
                    Summits And Other Events
                .h5.pt-3.
                    The community meets online and offline regularly. <br>
                    Join our meetup groups and events to learn from <br>Ignite experts or to share your Ignite experience.
            img.eventhero__img(src="/public/img/events/b1-mainpic.svg", alt="Join the Apache Ignite Community at Conferences, Summits and Other Events")
    // /.eventhero


    section.cmtynavblock 
        .container
            ul.cmtynavblock__list.flexi 
                li
                    a.cmtynavblock__active(href="#summit")  Ignite Summit
                li
                    a(href="#meetups") Meetups Worldwide
                li
                    a(href="#upcoming") Upcoming Events
                li
                    a(href="#past") Past Events
    // /.cmtynavblock



    section.event-featured.container 
        p.capstext Featured Event
        a(href="https://ignite-summit.org/schedule/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/public/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/public/img/events/event-banner.jpg", alt="")
            //- .event-featured__placeholder(style="background:#E8F2FA; height:340px;")
    // /.event-featured



    section.evsummit.container#summit
        .evsummit__date.flexi 
            .evsummit__day 16
            .evsummit__month.h5 NOVEMBER <br>2021
        .evsummit__info.flexi.pt-5
            .evsummit__logo 
                img(src="/public/img/events/b2-summit.svg", alt="")
            .evsummit__descr
                h3.h3 Apache Ignite Summit
                p.h5.pt-2.
                    This virtual conference will feature speakers from industry-leading companies <br>
                    and hundreds of participants from all over the world. 
        .evsummit__blocks.pt-5.flexi 
            a(href="https://hopin.com/events/ignite-summit-cloud-edition", target="_blank").evsummblock.evsummblock--speaker
                p.h4.evsummblock__title Become a speaker
                p.fz20.pt-1x.evsummblock__descr Submit a talk by October 15
                p.evsummblock__listtitle.pt-4
                    strong We are looking for:
                ul.evsummblock__list.dashlist.pt-1
                    li Ignite cloud-related deployment stories
                    li technical deep dives
                    li integration experiences
            .evsummblock.evsummblock--join
                p.h4.evsummblock__title Join Summit online
                p.fz20.pt-1x.evsummblock__descr.
                    Become a&nbsp;part of&nbsp;a&nbsp;true community event 
                    and learn more about up-to-date<br>
                    in-memory computing solutions.
    // /.evsummit
        

    section.event-planet#meetups
        .container
            .event-planet__wrap.flexi 
                .event-planet__main 
                    h3.h3.pb-1 Apache Ignite Meetups Worldwide
                    p.h5.pt-5 Meet the community&nbsp;&mdash; developers, experts, and practitioners&nbsp;&mdash; face-to-face, virtually, or&nbsp;onsite in&nbsp;your city.
                .event-planet__pic 
                    img(src="/public/img/events/b4-world.svg", alt="")
    // /.event-planet
        


    section.event-virtual.container#virtual
        .eventvirt.flexi 
            .eventvirt__left 
                h3.h4 Virtual Apache Ignite Meetup
                p.pt-2 Join Ignite users, developers, committers, contributors, and architects from all over the world and&nbsp;get access to&nbsp;the online-talks and presentations by&nbsp;Apache Ignite experts and practitioners.
            .eventvirt__right 
                a.button(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/", target="_blank") Join Virtual Meetup

        .event-virtbot
            .event-virtbot__col
                h4.h4 Recordings Of Past Meetups
                p.pt-2 Find a collection of past Virtual Apache Ignite Meetup <br>presentations, talks, and webinars.
            .event-virtbot__col
                h4.h4 Upcoming Virtual Meetup
                p.pt-2.event-virtbot__gray November 16, 2021
            .event-virtbot__col
                .event-recording.pb-2
                    a(href="https://www.youtube.com/watch?v=f2ArcJPH4iU&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=1", target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/f2ArcJPH4iU/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=lCiZ3x8IRvI&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=2" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/lCiZ3x8IRvI/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=7UjENQBFvIQ&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=3" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/7UjENQBFvIQ/maxresdefault.jpg", alt="")
                a.event-recbutton.button.button--shadow(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ", target="_blank")
                    <i><svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <path d="M8.71423 4.99993L0.142805 9.94865L0.142805 0.0512134L8.71423 4.99993Z"/>
                    </svg></i>
                    span Watch Virtual Meetup videos 
            .event-dynamicsect
                h3.h5.pb-1x Ignite Summit: Cloud Edition
                p Ignite Summit: Cloud Edition is the premier event for developers who use Apache Ignite® and in-memory computing to tackle speed and scale challenges in cloud environments.
                a.button.button--shadow.event-recmorebutton(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/events/280383112/", target="_blank") Learn more
    // /.event-virtual



    section.eventyoucity.container 
        h2.h4 Apache Ignite Meetups In Your City
        .eventyoucity__wrap.pt-5
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-uk.svg", alt="")
                .eventyoucity__town.h5
                    strong London
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/Apache-Ignite-London/" target="_blank")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong St.Petersburg
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/St-Petersburg-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong Moscow
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/Moscow-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join
            article.eventyoucity__last
                p.fz20.pb-3 Start an onsite Apache Ignite Meetup in your city.
                small Take the first step.
                small Send us a note to <br><a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a> <br>and we'll see what can be done.
    // /.eventyoucity



    section.eventupcoming.container#upcoming 
        .capstext.pb-1 Upcoming Events Schedule
        .eventupcoming__wrap.pt-4
            h2.h4.eventupcoming__head.pb-5 Online events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 9
                    p.eventcomingitem__month November 
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Apache Ignite 2.11: Improvements and .NET Upgrades, Apache Ignite 3 Alpha 3: The Journey Continues
                    p.eventcomingitem__descr.pt-1 A quick overview of Apache Ignite 2.11. This release resolved a number of issues, problems with the internal architecture and technical bugs. Plus we will discuss Apache Ignite 2.11 updates related to .NET. Just now, the Apache Ignite community released the latest version of Ignite 3—Alpha 3! Val Kulichenko, the Ignite 3.0 Release manager, will demonstrate the updates and the latest API changes.
                    a.eventcomingitem__more(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup/events/281596817", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker.
                            Maxim Muzafarov<br>
                            Pavel Tupitsyn<br>
                            Val Kulichenko
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/meetup.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 15-16
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 On November 15 and 16, 2021a free virtual event—Ignite Summit: Cloud Edition will be held. The conference is for architects and developers who use or are interested in using Apache Ignite in the cloud. On November 15, 2021, free training sessions for EMEA and the Americas will be offered. On November 16, 2021, Ignite experts will share architectural insights and practical tips for solving challenges in cloud environments.
                    a.eventcomingitem__more(href="https://ignite-summit.org/", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Cloud Edition
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/summit.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

        .eventupcoming__wrap.pt-4
            h2.h4.py-4 Offline events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 13
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Backward compatibility on the example of Apache Ignite. Why does it hurt so much?
                    p.eventcomingitem__descr.pt-1 I am developing an Apache Ignite distributed database. Our product provides backward compatibility between versions. What do you need to think about for backward compatibility? What is Backward Compatibility for Developers? How do I test it? Why does it hurt so much? How to relieve pain? I will tell you about all this with the code examples.
                    a.eventcomingitem__more(href="https://mergeconf.ru/development/opensource/izhikov", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker  Nikolay Izhikov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/merge.svg", alt="")
                        .eventcomingitem__address Innopolis, Russia
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 18
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 The report will present the concept of historical rebalancing, implemented in the Apache Ignite distributed database.
                    a.eventcomingitem__more(href="https://www.highload.ru/moscow/2021/abstracts/7989", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Vlad Pyatkov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/hl++.svg", alt="")
                        .eventcomingitem__address Moscow, Russia
            // /.eventcomingitem
    // /.eventupcoming




    section.eventspast#past.container.jsTabWrap
        h3.capstext.pb-5 Past Events
        .eventspast__tablinks.flexi 
            button.eventpast__link(data-tablink="e2021").active 2021
            button.eventpast__link(data-tablink="e2020") 2020
            button.eventpast__link(data-tablink="e2019") 2019
            button.eventpast__link(data-tablink="e2018") 2018
            button.eventpast__link(data-tablink="e2017") 2017
            button.eventpast__link(data-tablink="e2016") 2016
            button.eventpast__link(data-tablink="e2015") 2015
            button.eventpast__link(data-tablink="e2014") 2014
        .eventspast__tabs
            .eventspast__tabwrap(data-tab="e2021").active
                include ./_components/events/2021.pug
            // /.eventspast__tabwrap 2021
            
            .eventspast__tabwrap(data-tab="e2020")
                include ./_components/events/2020.pug
            // /.eventspast__tabwrap 2020

            .eventspast__tabwrap(data-tab="e2019")
                include ./_components/events/2019.pug
            // /.eventspast__tabwrap 2019

            .eventspast__tabwrap(data-tab="e2018")
                include ./_components/events/2018.pug
            // /.eventspast__tabwrap 2018

            .eventspast__tabwrap(data-tab="e2017")
                include ./_components/events/2017.pug
            // /.eventspast__tabwrap 2017

            .eventspast__tabwrap(data-tab="e2016")
                include ./_components/events/2016.pug
            // /.eventspast__tabwrap 2016

            .eventspast__tabwrap(data-tab="e2015")
                include ./_components/events/2015.pug
            // /.eventspast__tabwrap 2015

            .eventspast__tabwrap(data-tab="e2014")
                include ./_components/events/2014.pug
            // /.eventspast__tabwrap 2014
    // /.eventspast
        



    