extend _components/base.pug

block pagetitle
    | Resources  

block css 
    link(rel="stylesheet", href="../css/native-persistence.css")
    link(rel="stylesheet", href="../css/download.css")
    link(rel="stylesheet", href="../js/vendor/highlight/default.min.css")
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css")
    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/highlight/xml.min.js")
    //- script(src="../js/vendor/highlight/bash.min.js")

block main
    - global.pageHref = "download"
    - config.hdrClassName = "hdr__blue"
    include ./_components/header.pug

    mixin downloadRow(params)
        tr 
            td !{params.ver}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
                if(params.javadoc)
                    a(href=params.javadoc, target="_blank") javadoc
                if(params.scaladoc)
                    a(href=params.scaladoc, target="_blank") scaladoc
            td
                if(params.notes)
                    a(href=params.notes, target="_blank") release notes
            td !{params.date}
            td 
                
                if(params.sourcelink)
                    - let fileNameArr = params.sourcelink.split("/");
                    - let fileName = fileNameArr[fileNameArr.length - 1];
                    a.sourcelink(href=params.sourcelink, target="_blank") !{fileName}
                    |  (
                    a(href=params.sourcelink + ".asc", target="_blank") pgp
                    a(href=params.sourcelink + ".sha512", target="_blank") sha512
                    | )






    section.innerhero.innerhero--download
        .container.innerhero__cont
            .innerhero__main
                .innerhero__pre.pb-3 Apache Ignite
                h1.h1.innerhero__h1.innerhero__mega Downloads
            img.innerhero__pic.innerhero__pic--download(src="/public/img/downloads/hero.svg", alt="Downloads")
    // /.innerhero



    section.downloadtitle.container.pb-5
        h2 Download Apache Ignite® and install in your environment. <br>Select from one of the available options.

    section.cmtynavblock.jsNavBlock.cmtynavblock--downwrap
        .container
            ul.cmtynavblock__list.flexi.cmtynavblock--down
                li
                    a.cmtynavblock__active(href="#source") Source Releases
                li
                    a(href="#binary") Binary Releases
                li
                    a(href="#docker") Docker and <br>Cloud Images
                li
                    a(href="#git") Git Repository
                li
                    a(href="#extensions") Extensions
                li
                    a(href="#party3rd") 3rd Party Binaries 
    // /.cmtynavblock

    section.download-src#source.container
        .capstext.pb-5 SOURCE RELEASES

        include ./_components/tabletest.pug
        .download-src__bottom.flexi.pt-5
            .download-src__left
                p.
                    If you are looking for an earlier version of Apache Ignite, please find it in the archive. If you encounter a problem with the selected mirror, please choose another one. If primary mirrors are not reachable, switch to backup servers added to the end of the list.
            .download-src__right 
                .download-choser.flexi 
                    .download-choser__label Selected mirror:
                    .download-choser__select.flexi
                        select(name="download_domain").jsDownloadDomenSelect
                            option(value="https://dlcdn.apache.org") https://dlcdn.apache.org
                            option(value="https://dlcdn.apache.org") https://dlcdn.apache.org
                        a.download-choser__button(href="#")  Change
    // /.download-src





    section.download-bin.container#binary
        .capstext BINARY RELEASES

        .download-bin__header.pt-4.pb-5
            p.
                Binary release packages are provided for your convenience and not considered as primary release artifacts of the ASF. It's recommended to verify a release downloadable, following <a href="#verification">this guidelines.</a> For more information about Apache release policy see <a href="http://www.apache.org/dev/release.html#what" target="_blank">What is a Release?</a>

        include ./_components/tabletest.pug
        // /.downtable__wrap
        p.pt-5 f you are looking for previous release versions of Apache Ignite, please have a look in the <a href="https://archive.apache.org/dist/ignite" target="_blank">archive</a>.
    // /.download-bin





    


    section.downloadslim.container 
        h3.h5.pb-2 Slim binary releases
        include ./_components/tabletest.pug
    // /.downloadslim



    section.download-docker.container#docker
        h3.capstext.pb-5 DOCKER AND CLOUD IMAGES
        include ./_components/tabletest.pug
    // /.download-docker




    section.downverify.container#verify.pt-5
        h3.h5 How to verify
        .downverify__wrap.flexi.pt-4
            .downverify__left
                p The PGP signatures can be verified using PGP or GPG. First download the <a href="https://downloads.apache.org/ignite/KEYS" target="_blank">Apache Ignite KEYS</a> file as well as the .asc signature files for the desired release version. Make sure you get these files from the main distribution directory, rather than from a mirror. Then verify the signatures.
            aside.downverify__right 
                p Please check <a href="https://www.apache.org/info/verification.html" target="_blank">How to Verify Downloaded Files</a> for more information on how and why you should verify Apache Ignite releases.
                downverify.downverify__code
                    p.pb-1 % gpg --import KEYS
                    p % gpg --verify apache-ignite-2.9.1-src.zip.asc apache-ignite-2.9.1-src.zip
    // /.downverify



    section.downfooter.container#git
        p.capstext.pb-3 GIT REPOSITORY
        pre.nativecode__codebox.nomargin
            code.bash.
                $ git clone https://gitbox.apache.org/repos/asf/ignite
        
        .downfooter__spacer.pt-5.pb-5
        p.capstext.pb-3#extensions EXTENSIONS

        -
            var xmlCode = `<dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-thin-client-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>`;

        pre.nativecode__codebox.nomargin
            code.xml #{xmlCode}



    section.party3rd#party3rd.container
        p.capstext 3RD PARTY BINARIES
        .party3rd__wrap.pt-5.flexi
            .party3rd__left
                p.pb-2 This is a list of 3rd party binary packages based on Apache Ignite. The Apache Ignite project does not endorse or maintain any 3rd party binary packages.
                p <a href="https://www.gridgain.com/resources/download#communityEdition" target="_blank">GridGain Community Edition</a> is a binary build of Apache Ignite created by GridGain, which includes optional LGPL dependencies, such as Hibernate L2 cache integration and Geospatial Indexing, as well as bug fixes and features which may be included into the future official Apache Ignite releases.
            .party3rd__right
                p GridGain also provides his own <a href="http://www.gridgainsystems.com/nexus/content/repositories/external" target="_blank">GridGain Maven Repository</a> containing Apache Ignite LGPL artifacts such as ignite-hibernate.
                p Please note that artifacts located at GridGain Maven Repository provided for convenience and are NOT official Apache Ignite artifacts.
                p If you would like to provide your own edition of Apache Ignite here, please send email to <a href="mailto:dev@ignite.apache.org">Ignite dev list.</a>






