diff --git a/Makefile b/Makefile index f84cdc1..40570fc 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ index: git clone --depth=1 https://github.com/SheetJS/js-xlsx cd js-xlsx; grip --title "SheetJS Community Edition" --export README.md; cd .. mv js-xlsx/README.html index.html - git add index.html + mv js-xlsx/*.png . + git add index.html *.png #mv js-xlsx/README.md . #git add README.md diff --git a/formats.png b/formats.png new file mode 100644 index 0000000..60ece9b Binary files /dev/null and b/formats.png differ diff --git a/index.html b/index.html index 2dd62fb..77a50fe 100644 --- a/index.html +++ b/index.html @@ -27,7 +27,7 @@ * http://primer.github.io * * Released under MIT license. Copyright (c) 2018 GitHub Inc. - */.alt-mono-font{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.alt-h0,.alt-h1,.alt-h2,.alt-h3,.alt-h4,.alt-h5,.alt-h6,.alt-lead{-webkit-font-smoothing:antialiased;font-family:Roboto,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI","Oxygen","Ubuntu","Cantarell","Open Sans",sans-serif}.alt-h0{font-size:48px;font-weight:300}@media (min-width: 768px){.alt-h0{font-size:54px}}@media (min-width: 1012px){.alt-h0{font-size:72px}}.alt-h1{font-size:36px;font-weight:300}@media (min-width: 768px){.alt-h1{font-size:48px}}@media (min-width: 1012px){.alt-h1{font-size:54px}}.alt-h2{font-size:28px;font-weight:300}@media (min-width: 768px){.alt-h2{font-size:34px}}@media (min-width: 1012px){.alt-h2{font-size:38px}}.alt-h3{font-size:18px;font-weight:400}@media (min-width: 768px){.alt-h3{font-size:20px}}@media (min-width: 1012px){.alt-h3{font-size:22px}}.alt-h4{font-size:16px;font-weight:500}.alt-h5{font-size:14px;font-weight:500}.alt-h6{font-size:12px;font-weight:500}.alt-lead{-webkit-font-smoothing:antialiased;font-size:21px;font-weight:300}@media (min-width: 768px){.alt-lead{font-size:24px}}@media (min-width: 1012px){.alt-lead{font-size:26px}}.alt-text-small{font-size:14px !important}.pullquote{padding-top:0;padding-bottom:0;padding-left:8px;margin-bottom:24px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px;line-height:1.4;color:#586069;border-left:3px solid #e1e4e8}@media (min-width: 768px){.pullquote{padding-left:12px;margin-bottom:32px;margin-left:-15px;font-size:18px;line-height:1.5}}.btn-orange{color:#fff;background-color:#d25a08;background-image:linear-gradient(-180deg, #f7802f 0%, #d25a08 90%)}.btn-orange:focus,.btn-orange.focus{box-shadow:0 0 0 0.2em rgba(247,128,47,0.4)}.btn-orange:hover,.btn-orange.hover{background-color:#c85607;background-image:linear-gradient(-180deg, #f77a25 0%, #c85607 90%);background-position:-.5em;border-color:rgba(27,31,35,0.5)}.btn-orange:active,.btn-orange.selected,[open]>.btn-orange{background-color:#c65e17;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-orange:disabled,.btn-orange.disabled{color:rgba(255,255,255,0.75);background-color:#e9ad83;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-orange .Counter{color:#f46909;background-color:#fff}.btn-outline-purple{color:#6f42c1;background-color:#fff;background-image:none}.btn-outline-purple .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-purple:hover,.btn-outline-purple:active,.btn-outline-purple.selected,[open]>.btn-outline-purple{color:#fff;background-color:#6f42c1;background-image:none;border-color:#6f42c1}.btn-outline-purple:hover .Counter,.btn-outline-purple:active .Counter,.btn-outline-purple.selected .Counter,[open]>.btn-outline-purple .Counter{color:#6f42c1;background-color:#fff}.btn-outline-purple:focus{border-color:#6f42c1;box-shadow:0 0 0 0.2em rgba(111,66,193,0.4)}.btn-outline-purple:disabled,.btn-outline-purple.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-outline-orange{color:#f66a0a;background-color:#fff;background-image:none}.btn-outline-orange .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-orange:hover,.btn-outline-orange:active,.btn-outline-orange.selected,[open]>.btn-outline-orange{color:#fff;background-color:#f66a0a;background-image:none;border-color:#f66a0a}.btn-outline-orange:hover .Counter,.btn-outline-orange:active .Counter,.btn-outline-orange.selected .Counter,[open]>.btn-outline-orange .Counter{color:#f66a0a;background-color:#fff}.btn-outline-orange:focus{border-color:#f66a0a;box-shadow:0 0 0 0.2em rgba(246,106,10,0.4)}.btn-outline-orange:disabled,.btn-outline-orange.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-outline-green{color:#28a745;background-color:#fff;background-image:none}.btn-outline-green .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-green:hover,.btn-outline-green:active,.btn-outline-green.selected,[open]>.btn-outline-green{color:#fff;background-color:#28a745;background-image:none;border-color:#28a745}.btn-outline-green:hover .Counter,.btn-outline-green:active .Counter,.btn-outline-green.selected .Counter,[open]>.btn-outline-green .Counter{color:#28a745;background-color:#fff}.btn-outline-green:focus{border-color:#28a745;box-shadow:0 0 0 0.2em rgba(40,167,69,0.4)}.btn-outline-green:disabled,.btn-outline-green.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-transparent{color:#fff;background-color:transparent;background-image:none;border:1px solid rgba(255,255,255,0.5)}.btn-transparent:hover,.btn-transparent:active{color:#2f363d;background-color:#fff;background-image:none;border-color:#fff}.jumbotron{position:relative;padding-top:40px;padding-bottom:40px}@media (min-width: 544px){.jumbotron{padding-top:60px;padding-bottom:60px}}@media (min-width: 1280px){.jumbotron{padding-top:120px;padding-bottom:120px}}@media (min-width: 1012px){.jumbotron-supertron{height:45vw;min-height:590px;max-height:55vh;padding-top:80px;padding-bottom:80px}}.jumbotron-minitron{padding-top:24px;padding-bottom:24px}@media (min-width: 544px){.jumbotron-minitron{padding-top:32px;padding-bottom:32px}}.jumbotron-shadow::after{position:absolute;bottom:0;left:0;width:100%;height:30px;content:" ";background-color:transparent;background-image:linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.05));background-repeat:repeat-x;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.05)}.jumbotron-photo{position:relative;background-color:#24292e;background-size:cover}.jumbotron-photo::before{position:absolute;bottom:0;left:0;display:block;width:100%;height:100%;content:"";background-color:rgba(0,0,0,0.25)}.page-section{padding:32px 0;margin-top:0}@media (min-width: 768px){.page-section{padding:56px 0}}.page-section-jumplink:target{padding-top:112px}@media (min-width: 768px){.page-section-jumplink:target{padding-top:80px}}.data-table{width:100%;margin-top:16px;border-collapse:collapse;border:1px #e1e4e8 solid;box-shadow:0 1px 1px rgba(27,31,35,0.05)}.data-table th{font-weight:400;text-align:left}.data-table td,.data-table th{padding:16px;border-right:1px #e1e4e8 solid;border-bottom:1px #e1e4e8 solid}.data-table tbody th{width:25%}.data-table tbody th,.data-table tbody td{border-bottom-color:#e1e4e8}.data-table tbody tr:last-child th,.data-table tbody tr:last-child td{border-bottom:1px #e1e4e8 solid}.grayscale{filter:grayscale(100%)}@media (min-width: 544px){.border-sm-top{border-top:1px #e1e4e8 solid !important}.border-sm-right{border-right:1px #e1e4e8 solid !important}.border-sm-bottom{border-bottom:1px #e1e4e8 solid !important}.border-sm-left{border-left:1px #e1e4e8 solid !important}.border-sm-top-0{border-top:0 !important}.border-sm-right-0{border-right:0 !important}.border-sm-bottom-0{border-bottom:0 !important}.border-sm-left-0{border-left:0 !important}}@media (min-width: 768px){.border-md-top{border-top:1px #e1e4e8 solid !important}.border-md-right{border-right:1px #e1e4e8 solid !important}.border-md-bottom{border-bottom:1px #e1e4e8 solid !important}.border-md-left{border-left:1px #e1e4e8 solid !important}.border-md-top-0{border-top:0 !important}.border-md-right-0{border-right:0 !important}.border-md-bottom-0{border-bottom:0 !important}.border-md-left-0{border-left:0 !important}}@media (min-width: 1012px){.border-lg-top{border-top:1px #e1e4e8 solid !important}.border-lg-right{border-right:1px #e1e4e8 solid !important}.border-lg-bottom{border-bottom:1px #e1e4e8 solid !important}.border-lg-left{border-left:1px #e1e4e8 solid !important}.border-lg-top-0{border-top:0 !important}.border-lg-right-0{border-right:0 !important}.border-lg-bottom-0{border-bottom:0 !important}.border-lg-left-0{border-left:0 !important}}@media (min-width: 1280px){.border-xl-top{border-top:1px #e1e4e8 solid !important}.border-xl-right{border-right:1px #e1e4e8 solid !important}.border-xl-bottom{border-bottom:1px #e1e4e8 solid !important}.border-xl-left{border-left:1px #e1e4e8 solid !important}.border-xl-top-0{border-top:0 !important}.border-xl-right-0{border-right:0 !important}.border-xl-bottom-0{border-bottom:0 !important}.border-xl-left-0{border-left:0 !important}}.border-white-fade{border-color:rgba(255,255,255,0.15) !important}@media (min-width: 544px){.position-sm-relative{position:relative !important}.position-sm-absolute{position:absolute !important}.position-sm-fixed{position:fixed !important}}@media (min-width: 768px){.position-md-relative{position:relative !important}.position-md-absolute{position:absolute !important}.position-md-fixed{position:fixed !important}}@media (min-width: 1012px){.position-lg-relative{position:relative !important}.position-lg-absolute{position:absolute !important}.position-lg-fixed{position:fixed !important}}@media (min-width: 1280px){.position-xl-relative{position:relative !important}.position-xl-absolute{position:absolute !important}.position-xl-fixed{position:fixed !important}}.mt-7{margin-top:48px !important}.mb-7{margin-bottom:48px !important}.my-7{margin-top:48px !important;margin-bottom:48px !important}.mt-8{margin-top:64px !important}.mb-8{margin-bottom:64px !important}.my-8{margin-top:64px !important;margin-bottom:64px !important}.mt-9{margin-top:80px !important}.mb-9{margin-bottom:80px !important}.my-9{margin-top:80px !important;margin-bottom:80px !important}.mt-10{margin-top:96px !important}.mb-10{margin-bottom:96px !important}.my-10{margin-top:96px !important;margin-bottom:96px !important}.mt-11{margin-top:112px !important}.mb-11{margin-bottom:112px !important}.my-11{margin-top:112px !important;margin-bottom:112px !important}.mt-12{margin-top:128px !important}.mb-12{margin-bottom:128px !important}.my-12{margin-top:128px !important;margin-bottom:128px !important}@media (min-width: 544px){.mt-sm-7{margin-top:48px !important}.mb-sm-7{margin-bottom:48px !important}.my-sm-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 544px){.mt-sm-8{margin-top:64px !important}.mb-sm-8{margin-bottom:64px !important}.my-sm-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 544px){.mt-sm-9{margin-top:80px !important}.mb-sm-9{margin-bottom:80px !important}.my-sm-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 544px){.mt-sm-10{margin-top:96px !important}.mb-sm-10{margin-bottom:96px !important}.my-sm-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 544px){.mt-sm-11{margin-top:112px !important}.mb-sm-11{margin-bottom:112px !important}.my-sm-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 544px){.mt-sm-12{margin-top:128px !important}.mb-sm-12{margin-bottom:128px !important}.my-sm-12{margin-top:128px !important;margin-bottom:128px !important}}@media (min-width: 768px){.mt-md-7{margin-top:48px !important}.mb-md-7{margin-bottom:48px !important}.my-md-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 768px){.mt-md-8{margin-top:64px !important}.mb-md-8{margin-bottom:64px !important}.my-md-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 768px){.mt-md-9{margin-top:80px !important}.mb-md-9{margin-bottom:80px !important}.my-md-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 768px){.mt-md-10{margin-top:96px !important}.mb-md-10{margin-bottom:96px !important}.my-md-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 768px){.mt-md-11{margin-top:112px !important}.mb-md-11{margin-bottom:112px !important}.my-md-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 768px){.mt-md-12{margin-top:128px !important}.mb-md-12{margin-bottom:128px !important}.my-md-12{margin-top:128px !important;margin-bottom:128px !important}}@media (min-width: 1012px){.mt-lg-7{margin-top:48px !important}.mb-lg-7{margin-bottom:48px !important}.my-lg-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 1012px){.mt-lg-8{margin-top:64px !important}.mb-lg-8{margin-bottom:64px !important}.my-lg-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 1012px){.mt-lg-9{margin-top:80px !important}.mb-lg-9{margin-bottom:80px !important}.my-lg-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 1012px){.mt-lg-10{margin-top:96px !important}.mb-lg-10{margin-bottom:96px !important}.my-lg-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 1012px){.mt-lg-11{margin-top:112px !important}.mb-lg-11{margin-bottom:112px !important}.my-lg-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 1012px){.mt-lg-12{margin-top:128px !important}.mb-lg-12{margin-bottom:128px !important}.my-lg-12{margin-top:128px !important;margin-bottom:128px !important}}@media (min-width: 1280px){.mt-xl-7{margin-top:48px !important}.mb-xl-7{margin-bottom:48px !important}.my-xl-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 1280px){.mt-xl-8{margin-top:64px !important}.mb-xl-8{margin-bottom:64px !important}.my-xl-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 1280px){.mt-xl-9{margin-top:80px !important}.mb-xl-9{margin-bottom:80px !important}.my-xl-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 1280px){.mt-xl-10{margin-top:96px !important}.mb-xl-10{margin-bottom:96px !important}.my-xl-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 1280px){.mt-xl-11{margin-top:112px !important}.mb-xl-11{margin-bottom:112px !important}.my-xl-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 1280px){.mt-xl-12{margin-top:128px !important}.mb-xl-12{margin-bottom:128px !important}.my-xl-12{margin-top:128px !important;margin-bottom:128px !important}}.pt-7{padding-top:48px !important}.pb-7{padding-bottom:48px !important}.py-7{padding-top:48px !important;padding-bottom:48px !important}.pt-8{padding-top:64px !important}.pb-8{padding-bottom:64px !important}.py-8{padding-top:64px !important;padding-bottom:64px !important}.pt-9{padding-top:80px !important}.pb-9{padding-bottom:80px !important}.py-9{padding-top:80px !important;padding-bottom:80px !important}.pt-10{padding-top:96px !important}.pb-10{padding-bottom:96px !important}.py-10{padding-top:96px !important;padding-bottom:96px !important}.pt-11{padding-top:112px !important}.pb-11{padding-bottom:112px !important}.py-11{padding-top:112px !important;padding-bottom:112px !important}.pt-12{padding-top:128px !important}.pb-12{padding-bottom:128px !important}.py-12{padding-top:128px !important;padding-bottom:128px !important}@media (min-width: 544px){.pt-sm-7{padding-top:48px !important}.pb-sm-7{padding-bottom:48px !important}.py-sm-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 544px){.pt-sm-8{padding-top:64px !important}.pb-sm-8{padding-bottom:64px !important}.py-sm-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 544px){.pt-sm-9{padding-top:80px !important}.pb-sm-9{padding-bottom:80px !important}.py-sm-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 544px){.pt-sm-10{padding-top:96px !important}.pb-sm-10{padding-bottom:96px !important}.py-sm-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 544px){.pt-sm-11{padding-top:112px !important}.pb-sm-11{padding-bottom:112px !important}.py-sm-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 544px){.pt-sm-12{padding-top:128px !important}.pb-sm-12{padding-bottom:128px !important}.py-sm-12{padding-top:128px !important;padding-bottom:128px !important}}@media (min-width: 768px){.pt-md-7{padding-top:48px !important}.pb-md-7{padding-bottom:48px !important}.py-md-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 768px){.pt-md-8{padding-top:64px !important}.pb-md-8{padding-bottom:64px !important}.py-md-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 768px){.pt-md-9{padding-top:80px !important}.pb-md-9{padding-bottom:80px !important}.py-md-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 768px){.pt-md-10{padding-top:96px !important}.pb-md-10{padding-bottom:96px !important}.py-md-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 768px){.pt-md-11{padding-top:112px !important}.pb-md-11{padding-bottom:112px !important}.py-md-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 768px){.pt-md-12{padding-top:128px !important}.pb-md-12{padding-bottom:128px !important}.py-md-12{padding-top:128px !important;padding-bottom:128px !important}}@media (min-width: 1012px){.pt-lg-7{padding-top:48px !important}.pb-lg-7{padding-bottom:48px !important}.py-lg-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 1012px){.pt-lg-8{padding-top:64px !important}.pb-lg-8{padding-bottom:64px !important}.py-lg-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 1012px){.pt-lg-9{padding-top:80px !important}.pb-lg-9{padding-bottom:80px !important}.py-lg-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 1012px){.pt-lg-10{padding-top:96px !important}.pb-lg-10{padding-bottom:96px !important}.py-lg-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 1012px){.pt-lg-11{padding-top:112px !important}.pb-lg-11{padding-bottom:112px !important}.py-lg-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 1012px){.pt-lg-12{padding-top:128px !important}.pb-lg-12{padding-bottom:128px !important}.py-lg-12{padding-top:128px !important;padding-bottom:128px !important}}@media (min-width: 1280px){.pt-xl-7{padding-top:48px !important}.pb-xl-7{padding-bottom:48px !important}.py-xl-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 1280px){.pt-xl-8{padding-top:64px !important}.pb-xl-8{padding-bottom:64px !important}.py-xl-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 1280px){.pt-xl-9{padding-top:80px !important}.pb-xl-9{padding-bottom:80px !important}.py-xl-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 1280px){.pt-xl-10{padding-top:96px !important}.pb-xl-10{padding-bottom:96px !important}.py-xl-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 1280px){.pt-xl-11{padding-top:112px !important}.pb-xl-11{padding-bottom:112px !important}.py-xl-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 1280px){.pt-xl-12{padding-top:128px !important}.pb-xl-12{padding-bottom:128px !important}.py-xl-12{padding-top:128px !important;padding-bottom:128px !important}}hr{border-bottom-color:#eee}.img-responsive{display:block;width:100%;max-width:100%;height:auto}@font-face{font-family:InterUI;font-style:normal;font-weight:400;src:local("InterUI"),local("InterUI-Regular"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff")}@font-face{font-family:InterUI;font-style:normal;font-weight:500;src:local("InterUI Medium"),local("InterUI-Medium"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuICBJZiB5b3UgZW50ZXJlZCB0aGUgVVJMIG1hbnVhbGx5IHBsZWFzZSBjaGVjayB5b3VyIHNwZWxsaW5nIGFuZCB0cnkgYWdhaW4uPC9wPgo=) format("woff")}.bg-blue-dark{background-color:#032f62 !important}.text-blue-mktg{color:#1277eb !important}.text-blue-light{color:#79b8ff !important}.text-white-fade{color:rgba(255,255,255,0.7) !important}.h000-mktg,.h00-mktg,.h0-mktg,.h1-mktg,.h2-mktg,.h3-mktg,.h4-mktg,.h5-mktg,.h6-mktg,.lead-mktg{font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif;font-weight:500}.lead-mktg{font-size:21px !important;font-weight:normal !important}.h000-mktg,.h000{font-size:48px !important}@media (min-width: 768px){.h000-mktg,.h000{font-size:64px !important}}.h00-mktg{font-size:40px !important}@media (min-width: 768px){.h00-mktg{font-size:48px !important}}.h0-mktg{font-size:32px !important}@media (min-width: 768px){.h0-mktg{font-size:40px !important}}.h1-mktg{font-size:26px !important}@media (min-width: 768px){.h1-mktg{font-size:32px !important}}.h2-mktg{font-size:22px !important}@media (min-width: 768px){.h2-mktg{font-size:24px !important}}.h3-mktg{font-size:18px !important}@media (min-width: 768px){.h3-mktg{font-size:20px !important}}.h4-mktg{font-size:16px !important}.h5-mktg{font-size:14px !important}.h6-mktg{font-size:12px !important}.text-gray-light-ultra{font-style:normal;font-weight:400;color:#808891}.underline-dashed{display:inline;padding-bottom:4px;background-image:linear-gradient(to right, #d1d5da 50%, rgba(255,255,255,0) 0%);background-repeat:repeat-x;background-position:bottom;background-size:10px 2px}.link-mktg{color:#1277eb;text-decoration:none !important;box-shadow:0 1px 0 0 rgba(18,119,235,0.5);transition:.2s}.link-mktg:hover{color:#0366d6;box-shadow:0 1px 0 0 #1277eb}.Tile{position:relative;display:block;min-height:250px;background-color:#f6f8fa;border-radius:3px;transition:.4s}.Tile:hover{background-color:#fff;box-shadow:0 4px 14px rgba(0,0,0,0.1)}.Tile:active{box-shadow:0 2px 7px rgba(0,0,0,0.1)}.Tile--dots::before{position:absolute;top:0;left:0;z-index:-1;width:180px;height:180px;content:"";background:url("/images/modules/site/patterns/dots-small.svg");opacity:0;transition:.4s}.Tile--dots::after{position:absolute;right:0;bottom:0;z-index:-1;width:180px;height:180px;content:"";background:url("/images/modules/site/patterns/dots-small.svg");opacity:0;transition:.4s}.Tile--dots:hover::before{opacity:1;transform:translate3d(-18px, -18px, 0)}.Tile--dots:hover::after{opacity:1;transform:translate3d(23px, 23px, 0)}.Tile--dots:active::before{opacity:0.5;transform:translate3d(-10px, -10px, 0)}.Tile--dots:active::after{opacity:0.5;transform:translate3d(18px, 18px, 0)}.Tile--symbol::before{position:absolute;top:16px;right:24px;font-size:24px;content:"→";opacity:0;transition:.4s,color 0s;transform:rotate(-45deg) translateX(-3px)}.Tile--symbol:hover::before{opacity:1;transform:rotate(-45deg) translateX(0)}.Tile--symbol:active::before{opacity:1;transition:.2s;transform:rotate(-45deg) translateX(-5px)}.Tile-date{position:absolute;bottom:24px;left:24px;margin-bottom:0;line-height:1;color:#959da5}.dots-4{position:relative}.dots-4::before{position:absolute;top:-31px;left:-31px;z-index:-1;width:75%;height:75%;content:"";background:url("/images/modules/site/patterns/dots-small.svg")}.dots-3{position:relative}.dots-3::before{position:absolute;top:-21px;left:-21px;z-index:-1;width:75%;height:75%;content:"";background:url("/images/modules/site/patterns/dots-small.svg")}.Point:hover .Point-symbol{transform:translateY(-5px)}.Point-symbol{transition:.2s;transform:translateY(0)}.Bump-link-symbol{display:inline-block;transition:.2s;transform:translateX(0)}.Bump-link:hover .Bump-link-symbol{transform:translateX(3px)}.Bump-link--hover .Bump-link-symbol{color:inherit;opacity:0;transition:.2s;transform:translateX(0)}.Bump-link--hover:hover .Bump-link-symbol{opacity:1;transform:translateX(3px)}.btn-mktg{display:inline-block;padding:16px 24px;font-size:14px;font-weight:500;color:#fff;background-color:#1277eb;border:0;border-radius:3px;transition:.2s}.btn-mktg:hover{text-decoration:none;background-color:#0366d6}.btn-primary-mktg{background-color:#2ebc4f}.btn-primary-mktg:hover{background-color:#28a745}.btn-large-mktg{padding:20px 32px;font-size:16px}.btn-outline-mktg{color:#1277eb !important;background-color:transparent !important;box-shadow:0 0 0 1px rgba(18,119,235,0.5) inset}.btn-outline-mktg:hover{color:#0366d6 !important;text-decoration:none;box-shadow:0 0 0 1px #1277eb inset}.top-0{top:0 !important}.right-0{right:0 !important}.bottom-0{bottom:0 !important}.left-0{left:0 !important}.top-n0{top:-0 !important}.right-n0{right:-0 !important}.bottom-n0{bottom:-0 !important}.left-n0{left:-0 !important}.top-1{top:4px !important}.right-1{right:4px !important}.bottom-1{bottom:4px !important}.left-1{left:4px !important}.top-n1{top:-4px !important}.right-n1{right:-4px !important}.bottom-n1{bottom:-4px !important}.left-n1{left:-4px !important}.top-2{top:8px !important}.right-2{right:8px !important}.bottom-2{bottom:8px !important}.left-2{left:8px !important}.top-n2{top:-8px !important}.right-n2{right:-8px !important}.bottom-n2{bottom:-8px !important}.left-n2{left:-8px !important}.top-3{top:16px !important}.right-3{right:16px !important}.bottom-3{bottom:16px !important}.left-3{left:16px !important}.top-n3{top:-16px !important}.right-n3{right:-16px !important}.bottom-n3{bottom:-16px !important}.left-n3{left:-16px !important}.top-4{top:24px !important}.right-4{right:24px !important}.bottom-4{bottom:24px !important}.left-4{left:24px !important}.top-n4{top:-24px !important}.right-n4{right:-24px !important}.bottom-n4{bottom:-24px !important}.left-n4{left:-24px !important}.top-5{top:32px !important}.right-5{right:32px !important}.bottom-5{bottom:32px !important}.left-5{left:32px !important}.top-n5{top:-32px !important}.right-n5{right:-32px !important}.bottom-n5{bottom:-32px !important}.left-n5{left:-32px !important}.top-6{top:40px !important}.right-6{right:40px !important}.bottom-6{bottom:40px !important}.left-6{left:40px !important}.top-n6{top:-40px !important}.right-n6{right:-40px !important}.bottom-n6{bottom:-40px !important}.left-n6{left:-40px !important}.top-7{top:48px !important}.right-7{right:48px !important}.bottom-7{bottom:48px !important}.left-7{left:48px !important}.top-n7{top:-48px !important}.right-n7{right:-48px !important}.bottom-n7{bottom:-48px !important}.left-n7{left:-48px !important}.top-8{top:64px !important}.right-8{right:64px !important}.bottom-8{bottom:64px !important}.left-8{left:64px !important}.top-n8{top:-64px !important}.right-n8{right:-64px !important}.bottom-n8{bottom:-64px !important}.left-n8{left:-64px !important}.top-9{top:80px !important}.right-9{right:80px !important}.bottom-9{bottom:80px !important}.left-9{left:80px !important}.top-n9{top:-80px !important}.right-n9{right:-80px !important}.bottom-n9{bottom:-80px !important}.left-n9{left:-80px !important}.top-10{top:96px !important}.right-10{right:96px !important}.bottom-10{bottom:96px !important}.left-10{left:96px !important}.top-n10{top:-96px !important}.right-n10{right:-96px !important}.bottom-n10{bottom:-96px !important}.left-n10{left:-96px !important}.top-11{top:112px !important}.right-11{right:112px !important}.bottom-11{bottom:112px !important}.left-11{left:112px !important}.top-n11{top:-112px !important}.right-n11{right:-112px !important}.bottom-n11{bottom:-112px !important}.left-n11{left:-112px !important}.top-12{top:128px !important}.right-12{right:128px !important}.bottom-12{bottom:128px !important}.left-12{left:128px !important}.top-n12{top:-128px !important}.right-n12{right:-128px !important}.bottom-n12{bottom:-128px !important}.left-n12{left:-128px !important}@media (min-width: 544px){.top-sm-0{top:0 !important}.right-sm-0{right:0 !important}.bottom-sm-0{bottom:0 !important}.left-sm-0{left:0 !important}.top-sm-n0{top:-0 !important}.right-sm-n0{right:-0 !important}.bottom-sm-n0{bottom:-0 !important}.left-sm-n0{left:-0 !important}}@media (min-width: 544px){.top-sm-1{top:4px !important}.right-sm-1{right:4px !important}.bottom-sm-1{bottom:4px !important}.left-sm-1{left:4px !important}.top-sm-n1{top:-4px !important}.right-sm-n1{right:-4px !important}.bottom-sm-n1{bottom:-4px !important}.left-sm-n1{left:-4px !important}}@media (min-width: 544px){.top-sm-2{top:8px !important}.right-sm-2{right:8px !important}.bottom-sm-2{bottom:8px !important}.left-sm-2{left:8px !important}.top-sm-n2{top:-8px !important}.right-sm-n2{right:-8px !important}.bottom-sm-n2{bottom:-8px !important}.left-sm-n2{left:-8px !important}}@media (min-width: 544px){.top-sm-3{top:16px !important}.right-sm-3{right:16px !important}.bottom-sm-3{bottom:16px !important}.left-sm-3{left:16px !important}.top-sm-n3{top:-16px !important}.right-sm-n3{right:-16px !important}.bottom-sm-n3{bottom:-16px !important}.left-sm-n3{left:-16px !important}}@media (min-width: 544px){.top-sm-4{top:24px !important}.right-sm-4{right:24px !important}.bottom-sm-4{bottom:24px !important}.left-sm-4{left:24px !important}.top-sm-n4{top:-24px !important}.right-sm-n4{right:-24px !important}.bottom-sm-n4{bottom:-24px !important}.left-sm-n4{left:-24px !important}}@media (min-width: 544px){.top-sm-5{top:32px !important}.right-sm-5{right:32px !important}.bottom-sm-5{bottom:32px !important}.left-sm-5{left:32px !important}.top-sm-n5{top:-32px !important}.right-sm-n5{right:-32px !important}.bottom-sm-n5{bottom:-32px !important}.left-sm-n5{left:-32px !important}}@media (min-width: 544px){.top-sm-6{top:40px !important}.right-sm-6{right:40px !important}.bottom-sm-6{bottom:40px !important}.left-sm-6{left:40px !important}.top-sm-n6{top:-40px !important}.right-sm-n6{right:-40px !important}.bottom-sm-n6{bottom:-40px !important}.left-sm-n6{left:-40px !important}}@media (min-width: 544px){.top-sm-7{top:48px !important}.right-sm-7{right:48px !important}.bottom-sm-7{bottom:48px !important}.left-sm-7{left:48px !important}.top-sm-n7{top:-48px !important}.right-sm-n7{right:-48px !important}.bottom-sm-n7{bottom:-48px !important}.left-sm-n7{left:-48px !important}}@media (min-width: 544px){.top-sm-8{top:64px !important}.right-sm-8{right:64px !important}.bottom-sm-8{bottom:64px !important}.left-sm-8{left:64px !important}.top-sm-n8{top:-64px !important}.right-sm-n8{right:-64px !important}.bottom-sm-n8{bottom:-64px !important}.left-sm-n8{left:-64px !important}}@media (min-width: 544px){.top-sm-9{top:80px !important}.right-sm-9{right:80px !important}.bottom-sm-9{bottom:80px !important}.left-sm-9{left:80px !important}.top-sm-n9{top:-80px !important}.right-sm-n9{right:-80px !important}.bottom-sm-n9{bottom:-80px !important}.left-sm-n9{left:-80px !important}}@media (min-width: 544px){.top-sm-10{top:96px !important}.right-sm-10{right:96px !important}.bottom-sm-10{bottom:96px !important}.left-sm-10{left:96px !important}.top-sm-n10{top:-96px !important}.right-sm-n10{right:-96px !important}.bottom-sm-n10{bottom:-96px !important}.left-sm-n10{left:-96px !important}}@media (min-width: 544px){.top-sm-11{top:112px !important}.right-sm-11{right:112px !important}.bottom-sm-11{bottom:112px !important}.left-sm-11{left:112px !important}.top-sm-n11{top:-112px !important}.right-sm-n11{right:-112px !important}.bottom-sm-n11{bottom:-112px !important}.left-sm-n11{left:-112px !important}}@media (min-width: 544px){.top-sm-12{top:128px !important}.right-sm-12{right:128px !important}.bottom-sm-12{bottom:128px !important}.left-sm-12{left:128px !important}.top-sm-n12{top:-128px !important}.right-sm-n12{right:-128px !important}.bottom-sm-n12{bottom:-128px !important}.left-sm-n12{left:-128px !important}}@media (min-width: 768px){.top-md-0{top:0 !important}.right-md-0{right:0 !important}.bottom-md-0{bottom:0 !important}.left-md-0{left:0 !important}.top-md-n0{top:-0 !important}.right-md-n0{right:-0 !important}.bottom-md-n0{bottom:-0 !important}.left-md-n0{left:-0 !important}}@media (min-width: 768px){.top-md-1{top:4px !important}.right-md-1{right:4px !important}.bottom-md-1{bottom:4px !important}.left-md-1{left:4px !important}.top-md-n1{top:-4px !important}.right-md-n1{right:-4px !important}.bottom-md-n1{bottom:-4px !important}.left-md-n1{left:-4px !important}}@media (min-width: 768px){.top-md-2{top:8px !important}.right-md-2{right:8px !important}.bottom-md-2{bottom:8px !important}.left-md-2{left:8px !important}.top-md-n2{top:-8px !important}.right-md-n2{right:-8px !important}.bottom-md-n2{bottom:-8px !important}.left-md-n2{left:-8px !important}}@media (min-width: 768px){.top-md-3{top:16px !important}.right-md-3{right:16px !important}.bottom-md-3{bottom:16px !important}.left-md-3{left:16px !important}.top-md-n3{top:-16px !important}.right-md-n3{right:-16px !important}.bottom-md-n3{bottom:-16px !important}.left-md-n3{left:-16px !important}}@media (min-width: 768px){.top-md-4{top:24px !important}.right-md-4{right:24px !important}.bottom-md-4{bottom:24px !important}.left-md-4{left:24px !important}.top-md-n4{top:-24px !important}.right-md-n4{right:-24px !important}.bottom-md-n4{bottom:-24px !important}.left-md-n4{left:-24px !important}}@media (min-width: 768px){.top-md-5{top:32px !important}.right-md-5{right:32px !important}.bottom-md-5{bottom:32px !important}.left-md-5{left:32px !important}.top-md-n5{top:-32px !important}.right-md-n5{right:-32px !important}.bottom-md-n5{bottom:-32px !important}.left-md-n5{left:-32px !important}}@media (min-width: 768px){.top-md-6{top:40px !important}.right-md-6{right:40px !important}.bottom-md-6{bottom:40px !important}.left-md-6{left:40px !important}.top-md-n6{top:-40px !important}.right-md-n6{right:-40px !important}.bottom-md-n6{bottom:-40px !important}.left-md-n6{left:-40px !important}}@media (min-width: 768px){.top-md-7{top:48px !important}.right-md-7{right:48px !important}.bottom-md-7{bottom:48px !important}.left-md-7{left:48px !important}.top-md-n7{top:-48px !important}.right-md-n7{right:-48px !important}.bottom-md-n7{bottom:-48px !important}.left-md-n7{left:-48px !important}}@media (min-width: 768px){.top-md-8{top:64px !important}.right-md-8{right:64px !important}.bottom-md-8{bottom:64px !important}.left-md-8{left:64px !important}.top-md-n8{top:-64px !important}.right-md-n8{right:-64px !important}.bottom-md-n8{bottom:-64px !important}.left-md-n8{left:-64px !important}}@media (min-width: 768px){.top-md-9{top:80px !important}.right-md-9{right:80px !important}.bottom-md-9{bottom:80px !important}.left-md-9{left:80px !important}.top-md-n9{top:-80px !important}.right-md-n9{right:-80px !important}.bottom-md-n9{bottom:-80px !important}.left-md-n9{left:-80px !important}}@media (min-width: 768px){.top-md-10{top:96px !important}.right-md-10{right:96px !important}.bottom-md-10{bottom:96px !important}.left-md-10{left:96px !important}.top-md-n10{top:-96px !important}.right-md-n10{right:-96px !important}.bottom-md-n10{bottom:-96px !important}.left-md-n10{left:-96px !important}}@media (min-width: 768px){.top-md-11{top:112px !important}.right-md-11{right:112px !important}.bottom-md-11{bottom:112px !important}.left-md-11{left:112px !important}.top-md-n11{top:-112px !important}.right-md-n11{right:-112px !important}.bottom-md-n11{bottom:-112px !important}.left-md-n11{left:-112px !important}}@media (min-width: 768px){.top-md-12{top:128px !important}.right-md-12{right:128px !important}.bottom-md-12{bottom:128px !important}.left-md-12{left:128px !important}.top-md-n12{top:-128px !important}.right-md-n12{right:-128px !important}.bottom-md-n12{bottom:-128px !important}.left-md-n12{left:-128px !important}}@media (min-width: 1012px){.top-lg-0{top:0 !important}.right-lg-0{right:0 !important}.bottom-lg-0{bottom:0 !important}.left-lg-0{left:0 !important}.top-lg-n0{top:-0 !important}.right-lg-n0{right:-0 !important}.bottom-lg-n0{bottom:-0 !important}.left-lg-n0{left:-0 !important}}@media (min-width: 1012px){.top-lg-1{top:4px !important}.right-lg-1{right:4px !important}.bottom-lg-1{bottom:4px !important}.left-lg-1{left:4px !important}.top-lg-n1{top:-4px !important}.right-lg-n1{right:-4px !important}.bottom-lg-n1{bottom:-4px !important}.left-lg-n1{left:-4px !important}}@media (min-width: 1012px){.top-lg-2{top:8px !important}.right-lg-2{right:8px !important}.bottom-lg-2{bottom:8px !important}.left-lg-2{left:8px !important}.top-lg-n2{top:-8px !important}.right-lg-n2{right:-8px !important}.bottom-lg-n2{bottom:-8px !important}.left-lg-n2{left:-8px !important}}@media (min-width: 1012px){.top-lg-3{top:16px !important}.right-lg-3{right:16px !important}.bottom-lg-3{bottom:16px !important}.left-lg-3{left:16px !important}.top-lg-n3{top:-16px !important}.right-lg-n3{right:-16px !important}.bottom-lg-n3{bottom:-16px !important}.left-lg-n3{left:-16px !important}}@media (min-width: 1012px){.top-lg-4{top:24px !important}.right-lg-4{right:24px !important}.bottom-lg-4{bottom:24px !important}.left-lg-4{left:24px !important}.top-lg-n4{top:-24px !important}.right-lg-n4{right:-24px !important}.bottom-lg-n4{bottom:-24px !important}.left-lg-n4{left:-24px !important}}@media (min-width: 1012px){.top-lg-5{top:32px !important}.right-lg-5{right:32px !important}.bottom-lg-5{bottom:32px !important}.left-lg-5{left:32px !important}.top-lg-n5{top:-32px !important}.right-lg-n5{right:-32px !important}.bottom-lg-n5{bottom:-32px !important}.left-lg-n5{left:-32px !important}}@media (min-width: 1012px){.top-lg-6{top:40px !important}.right-lg-6{right:40px !important}.bottom-lg-6{bottom:40px !important}.left-lg-6{left:40px !important}.top-lg-n6{top:-40px !important}.right-lg-n6{right:-40px !important}.bottom-lg-n6{bottom:-40px !important}.left-lg-n6{left:-40px !important}}@media (min-width: 1012px){.top-lg-7{top:48px !important}.right-lg-7{right:48px !important}.bottom-lg-7{bottom:48px !important}.left-lg-7{left:48px !important}.top-lg-n7{top:-48px !important}.right-lg-n7{right:-48px !important}.bottom-lg-n7{bottom:-48px !important}.left-lg-n7{left:-48px !important}}@media (min-width: 1012px){.top-lg-8{top:64px !important}.right-lg-8{right:64px !important}.bottom-lg-8{bottom:64px !important}.left-lg-8{left:64px !important}.top-lg-n8{top:-64px !important}.right-lg-n8{right:-64px !important}.bottom-lg-n8{bottom:-64px !important}.left-lg-n8{left:-64px !important}}@media (min-width: 1012px){.top-lg-9{top:80px !important}.right-lg-9{right:80px !important}.bottom-lg-9{bottom:80px !important}.left-lg-9{left:80px !important}.top-lg-n9{top:-80px !important}.right-lg-n9{right:-80px !important}.bottom-lg-n9{bottom:-80px !important}.left-lg-n9{left:-80px !important}}@media (min-width: 1012px){.top-lg-10{top:96px !important}.right-lg-10{right:96px !important}.bottom-lg-10{bottom:96px !important}.left-lg-10{left:96px !important}.top-lg-n10{top:-96px !important}.right-lg-n10{right:-96px !important}.bottom-lg-n10{bottom:-96px !important}.left-lg-n10{left:-96px !important}}@media (min-width: 1012px){.top-lg-11{top:112px !important}.right-lg-11{right:112px !important}.bottom-lg-11{bottom:112px !important}.left-lg-11{left:112px !important}.top-lg-n11{top:-112px !important}.right-lg-n11{right:-112px !important}.bottom-lg-n11{bottom:-112px !important}.left-lg-n11{left:-112px !important}}@media (min-width: 1012px){.top-lg-12{top:128px !important}.right-lg-12{right:128px !important}.bottom-lg-12{bottom:128px !important}.left-lg-12{left:128px !important}.top-lg-n12{top:-128px !important}.right-lg-n12{right:-128px !important}.bottom-lg-n12{bottom:-128px !important}.left-lg-n12{left:-128px !important}}@media (min-width: 1280px){.top-xl-0{top:0 !important}.right-xl-0{right:0 !important}.bottom-xl-0{bottom:0 !important}.left-xl-0{left:0 !important}.top-xl-n0{top:-0 !important}.right-xl-n0{right:-0 !important}.bottom-xl-n0{bottom:-0 !important}.left-xl-n0{left:-0 !important}}@media (min-width: 1280px){.top-xl-1{top:4px !important}.right-xl-1{right:4px !important}.bottom-xl-1{bottom:4px !important}.left-xl-1{left:4px !important}.top-xl-n1{top:-4px !important}.right-xl-n1{right:-4px !important}.bottom-xl-n1{bottom:-4px !important}.left-xl-n1{left:-4px !important}}@media (min-width: 1280px){.top-xl-2{top:8px !important}.right-xl-2{right:8px !important}.bottom-xl-2{bottom:8px !important}.left-xl-2{left:8px !important}.top-xl-n2{top:-8px !important}.right-xl-n2{right:-8px !important}.bottom-xl-n2{bottom:-8px !important}.left-xl-n2{left:-8px !important}}@media (min-width: 1280px){.top-xl-3{top:16px !important}.right-xl-3{right:16px !important}.bottom-xl-3{bottom:16px !important}.left-xl-3{left:16px !important}.top-xl-n3{top:-16px !important}.right-xl-n3{right:-16px !important}.bottom-xl-n3{bottom:-16px !important}.left-xl-n3{left:-16px !important}}@media (min-width: 1280px){.top-xl-4{top:24px !important}.right-xl-4{right:24px !important}.bottom-xl-4{bottom:24px !important}.left-xl-4{left:24px !important}.top-xl-n4{top:-24px !important}.right-xl-n4{right:-24px !important}.bottom-xl-n4{bottom:-24px !important}.left-xl-n4{left:-24px !important}}@media (min-width: 1280px){.top-xl-5{top:32px !important}.right-xl-5{right:32px !important}.bottom-xl-5{bottom:32px !important}.left-xl-5{left:32px !important}.top-xl-n5{top:-32px !important}.right-xl-n5{right:-32px !important}.bottom-xl-n5{bottom:-32px !important}.left-xl-n5{left:-32px !important}}@media (min-width: 1280px){.top-xl-6{top:40px !important}.right-xl-6{right:40px !important}.bottom-xl-6{bottom:40px !important}.left-xl-6{left:40px !important}.top-xl-n6{top:-40px !important}.right-xl-n6{right:-40px !important}.bottom-xl-n6{bottom:-40px !important}.left-xl-n6{left:-40px !important}}@media (min-width: 1280px){.top-xl-7{top:48px !important}.right-xl-7{right:48px !important}.bottom-xl-7{bottom:48px !important}.left-xl-7{left:48px !important}.top-xl-n7{top:-48px !important}.right-xl-n7{right:-48px !important}.bottom-xl-n7{bottom:-48px !important}.left-xl-n7{left:-48px !important}}@media (min-width: 1280px){.top-xl-8{top:64px !important}.right-xl-8{right:64px !important}.bottom-xl-8{bottom:64px !important}.left-xl-8{left:64px !important}.top-xl-n8{top:-64px !important}.right-xl-n8{right:-64px !important}.bottom-xl-n8{bottom:-64px !important}.left-xl-n8{left:-64px !important}}@media (min-width: 1280px){.top-xl-9{top:80px !important}.right-xl-9{right:80px !important}.bottom-xl-9{bottom:80px !important}.left-xl-9{left:80px !important}.top-xl-n9{top:-80px !important}.right-xl-n9{right:-80px !important}.bottom-xl-n9{bottom:-80px !important}.left-xl-n9{left:-80px !important}}@media (min-width: 1280px){.top-xl-10{top:96px !important}.right-xl-10{right:96px !important}.bottom-xl-10{bottom:96px !important}.left-xl-10{left:96px !important}.top-xl-n10{top:-96px !important}.right-xl-n10{right:-96px !important}.bottom-xl-n10{bottom:-96px !important}.left-xl-n10{left:-96px !important}}@media (min-width: 1280px){.top-xl-11{top:112px !important}.right-xl-11{right:112px !important}.bottom-xl-11{bottom:112px !important}.left-xl-11{left:112px !important}.top-xl-n11{top:-112px !important}.right-xl-n11{right:-112px !important}.bottom-xl-n11{bottom:-112px !important}.left-xl-n11{left:-112px !important}}@media (min-width: 1280px){.top-xl-12{top:128px !important}.right-xl-12{right:128px !important}.bottom-xl-12{bottom:128px !important}.left-xl-12{left:128px !important}.top-xl-n12{top:-128px !important}.right-xl-n12{right:-128px !important}.bottom-xl-n12{bottom:-128px !important}.left-xl-n12{left:-128px !important}}.z-n1{z-index:-1}.z-n2{z-index:-2}.site-subheader{position:relative;z-index:2;padding-top:16px;padding-bottom:16px}.site-subheader-overlay{margin-bottom:-96px}@media (min-width: 1012px){.site-subheader-overlay{margin-bottom:-72px}}.site-subheader-sticky{position:-webkit-sticky;position:sticky;top:0;z-index:21}.site-subheader-sticky.is-stuck{background-color:#fff;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.1)}.site-subheader-sticky.is-stuck::after{position:absolute;right:0;bottom:-12px;left:0;z-index:-1;display:block;height:12px;content:"";background:linear-gradient(rgba(0,0,0,0.075), rgba(0,0,0,0.001)) repeat-x 0 0}.subheader-title{display:block;margin-bottom:10px;font-weight:400;text-align:center}@media (min-width: 1012px){.subheader-title{float:left;text-align:left}}.subheader-nav{font-size:14px}@media (min-width: 768px){.subheader-nav{font-size:16px}}.subheader-nav .btn-outline-purple{font-size:inherit}.subheader-nav .nav-item.selected{color:#24292e}.site-subheader-business{margin-bottom:0;border-bottom:1px solid rgba(0,0,0,0.1)}.site-subheader-pricing{background-color:#fafbfc}.subheader-nav-business .nav-item{color:#6a737d}.subheader-nav-business .nav-item:hover{color:#586069}.plans-cards{display:flex;flex:0 1 100%;flex-direction:column;align-items:center}@media (min-width: 768px){.plans-cards{align-items:stretch;flex-flow:row wrap;justify-content:center}}@media (min-width: 1012px){.plans-cards{flex-wrap:nowrap}}.plans-card{display:flex;margin-right:10px;margin-bottom:20px;margin-left:10px;font-size:14px;flex-direction:column}.plans-card-pricing-footnote{display:inline-block;margin-left:-0.5em}.plans-card-btn{padding:16px;border-color:#e1e4e8;border-width:1px 0 0;border-radius:0 0 2px 2px}.plans-card-btn:hover,.plans-card-btn:active,.plans-card-btn.selected{border-color:transparent}.plans-card-text{display:flex;flex-direction:column;flex:1 1 auto}.pricing-table{text-align:center}.pricing-table thead th{border-bottom:1px #e1e4e8 solid}.pricing-table .pricing-table-spacer{height:5px;border:0}.pricing-table td:first-child{font-weight:500;text-align:left}.pricing-table td,.pricing-table th{width:18%;padding:8px 16px}.pricing-table td:first-child,.pricing-table th:first-child{width:28%;padding-left:0}.pricing-table td:last-child,.pricing-table th:last-child{padding-right:0}.pricing-table td{border-bottom:1px solid #eaecef}.pricing-table td+td{border-left:1px solid #eaecef}.pricing-table-responsive{display:block;width:100%;min-height:0.01%;overflow-x:auto}@media (min-width: 768px){.pricing-table-responsive{display:table}}.pricing-table-header .octicon-link{visibility:hidden}.pricing-table-header:hover .octicon-link{visibility:visible}.jumbotron-codelines{color:rgba(255,255,255,0.6);background:url("/images/modules/site/heroes/simple-codelines.svg"),#2b3137;background-position:center 10%;background-size:cover}.jumbotron-netneutrality{background:#24292e}@media (min-width: 768px){.jumbotron-netneutrality{background:url("/images/modules/site/netneutrality/netneutrality.png"),#24292e;background-position:center top;background-size:150% auto}}@media (min-width: 1012px){.jumbotron-netneutrality{background-size:130% auto}}@media (min-width: 1280px){.jumbotron-netneutrality{background-size:cover}}.jumbotron-integrations{background-image:url("/images/modules/site/heroes/features-hero-integrations.svg");background-repeat:no-repeat;background-position:top center;background-size:110% auto}.jumbotron-endpoints{background-image:url("/images/modules/site/heroes/features-hero-integrations-endpoints.svg");background-repeat:no-repeat;background-position:center;background-size:100%}.jumbotron-projects{background-image:url("/images/modules/site/heroes/features-hero-project-management.svg");background-position:top center, 0 0;background-size:110% auto}.jumbotron-code-review{background-image:url("/images/modules/site/heroes/features-hero-code-review.svg");background-position:top center, 0 0;background-size:110% auto}.jumbotron-updates{margin-bottom:40px;background-color:#2f363d;background-image:url("/images/modules/marketplace/bg-hero.svg");background-repeat:repeat-y;background-position:center top;background-size:110% auto}@media (min-width: 768px){.jumbotron-updates{background-repeat:no-repeat}}.jumbotron-updates .updates-video{bottom:-40px}.jumbotron-link{font-weight:400;border-bottom:1px solid rgba(255,255,255,0.125)}.jumbotron-link:hover{text-decoration:none;border-bottom-color:rgba(255,255,255,0.75)}.jumbotron-video{position:relative;margin-top:24px;margin-bottom:-24px}@media (min-width: 544px){.jumbotron-video{margin-top:32px;margin-bottom:-32px}}@media (min-width: 1012px){.jumbotron-video{margin-top:48px;margin-bottom:-48px}}@media (min-width: 1280px){.jumbotron-video{margin-top:64px;margin-bottom:-64px}}.jumbotron-video-close{position:absolute;top:0;right:-40px}.jumbotron-link-followup{position:relative;z-index:1;display:inline-block;padding:4px;margin:0 auto;line-height:1;white-space:normal}.jumbotron-link-followup:hover{text-decoration:none}@media (min-width: 768px){.jumbotron-link-followup{display:block;margin:0}}.jumbotron-link-followup .jumbotron-link-followup-icon{position:relative;left:-4px;width:25px;height:25px;margin-left:-30px;vertical-align:middle}@media (min-width: 768px){.jumbotron-link-followup .jumbotron-link-followup-icon{width:30px;height:30px;margin-top:-2px;margin-left:-40px}}.featurette-heading{text-align:center}@media (min-width: 768px){.featurette-heading{text-align:inherit}}.featurette-benefit-img{width:50px;vertical-align:top}@media (min-width: 768px){.featurette-benefit-img{width:60px}}.featurette-icon{width:100%;height:auto}.featurette-illo{padding:0 5%}@media (min-width: 768px){.featurette-illo{padding:0}}.business-security-cta{padding-top:40px;padding-bottom:40px;border-top:1px solid #eee}.business-security-cta .container{width:500px;max-width:90%}@media (min-width: 1012px){.business-security-cta{height:690px;padding-top:290px;padding-bottom:0;background-image:url("/images/modules/site/business-security-billboard-bg.svg");background-repeat:no-repeat;background-position:center 20px;background-size:1850px 675px;border-top:0}}@media (min-width: 768px){.illflow{height:600px;background-image:url("/images/modules/site/illflow_window_ui.png");background-repeat:no-repeat;background-position:top center;background-size:795px auto}}@media (min-width: 768px){.illflow-purple .selected{background-color:#f5f0ff}.illflow-purple .selected::after{border-color:transparent transparent #f5f0ff}.illflow-purple .illflow-item .illflow-item-heading{color:#6f42c1}}@media (min-width: 768px){.illflow-blue .selected{background-color:#f1f8ff}.illflow-blue .selected::after{border-color:transparent transparent #f1f8ff}.illflow-blue .illflow-item .illflow-item-heading{color:#0366d6}}@media (min-width: 768px){.illflow-no-bg{background-image:none}}.illflow-no-bg .illflow-item::before{background-image:none}@media (min-width: 768px){.illflow-steps{margin-top:24px;margin-right:-24px;margin-left:-24px}.illflow-steps::before{display:table;content:""}.illflow-steps::after{display:table;clear:both;content:""}}.illflow-step{display:none}@media (min-width: 768px){.illflow-step.active{display:block}}.illflow-item{position:relative;padding:0 10%;margin-bottom:40px;text-align:center}.illflow-item::before{position:absolute;top:10%;left:-6%;z-index:-1;display:block;padding-top:200%;padding-left:110%;content:"";background-image:url("/images/modules/site/illflow_window_ui.png");background-repeat:no-repeat;background-size:100% auto}@media (min-width: 768px){.illflow-item::before{display:none}}.illflow-item .illflow-item-heading{position:relative;color:#444d56}@media (min-width: 768px){.illflow-item{float:left;width:33.333333%;padding:24px;margin-bottom:0;cursor:pointer;border-radius:6px}.illflow-item:not(.selected):hover{background-color:#fafbfc}.illflow-item.selected .illflow-item-heading{color:#24292e}.illflow-item.selected::after{position:absolute;top:-30px;left:50%;display:block;width:0;height:0;margin-left:-15px;pointer-events:none;content:" ";border-style:outset solid solid;border-width:15px}.illflow-item.selected:first-child::after{left:75%}.illflow-item.selected:last-child::after{left:25%}}.illflow-item-description{margin-top:0}.illflow-img{display:block;width:400px;height:auto;margin:0 auto}@media (min-width: 768px){.illflow-bizsecurity{height:auto;background-image:url("/images/modules/site/business-security-illflow-bg.png");background-size:1000px auto}}.illflow-bizsecurity .img-responsive{max-width:400px}.illflow-bizsecurity .illflow-item::before{display:none}.IconNav{font-size:12px;transition:transform ease 0.4s}@media (min-width: 1012px){.IconNav{font-size:14px}}.IconNav-item{border-bottom:3px solid transparent}.IconNav-item .IconNav-img{max-height:60px;transition:transform ease-in-out 0.25s}.IconNav-item:hover .IconNav-img{transform:translateY(-10px)}.IconNav-item.selected{border-color:#444d56}.IconNav.is-stuck{transform:translateY(-70px)}.IconNav.is-stuck .IconNav-img{opacity:0;transition:opacity ease-in-out 0.4s, transform ease-in-out 0.25s}.IconNav.is-stuck:hover{transform:translateY(0)}.IconNav.is-stuck:hover .IconNav-img{opacity:1}.home-hero-signup .form-label{display:block;margin-bottom:5px;font-size:16px;font-weight:inherit;text-align:left}.home-hero-signup .form-control-lg{width:100%;min-height:46px;padding:10px;font-size:16px;border-radius:5px}.home-hero-signup .form-control-lg:-ms-input-placeholder{color:#24292e}.home-hero-signup .form-control-lg::-ms-input-placeholder{color:#24292e}.home-hero-signup .form-control-lg::placeholder{color:#24292e}.home-hero-signup .form-control-lg:focus{box-shadow:0 0 0 0.2em rgba(255,255,255,0.3)}.home-hero-signup .form-control-note{margin-top:5px;margin-bottom:0;font-size:12px;color:#6a737d}.home-hero-signup .form-control-note .notice-highlight{color:#959da5}.casestudy-hero{background-position:center;background-size:cover}.casestudy-square::after,.casestudy-rectangle::after{display:block;content:"";transition:padding-bottom 0.3s}.casestudy-square::after{padding-bottom:100%}.casestudy-rectangle::after{padding-bottom:50%}.casestudy-hero-btn{position:absolute;top:16px;right:16px;z-index:2;opacity:0;transform:translate3d(-5px, 5px, 0) scale(0.95)}.casestudy-hero-btn,.casestudy-header,.casestudy-facts{transition:.4s}.casestudy-controls{transition:transform .4s}.casestudy-link{flex:1;background-position:center;background-size:cover;transition:transform 0.3s, box-shadow 0.3s}.casestudy-link .casestudy-facts{opacity:0}.casestudy-link:hover{text-decoration:none}@media (min-width: 544px){.casestudy-link:hover .casestudy-controls{transform:scale(1.08)}}.casestudy-link:hover .casestudy-title{color:#1277eb !important}@media (min-width: 544px){.casestudy-link:hover .casestudy-header{opacity:0}}@media (min-width: 544px){.casestudy-link:hover .casestudy-hero-btn,.casestudy-link:hover .casestudy-facts{opacity:1 !important;transform:translate3d(0, 0, 0) scale(1)}}.is-expanded .casestudy-link:hover{transform:scale(1)}.col-12 .casestudy-link .casestudy-square::after{padding-bottom:25%}.col-12 .casestudy-link .casestudy-facts{display:none !important}.col-12 .casestudy-link .casestudy-header{opacity:1 !important}.MarketingBody{font-size:16px}.MarketingBody>p{margin-bottom:24px;color:#586069}.MarketingBody h2,.MarketingBody h3{margin-bottom:8px;font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif;font-weight:400}.MarketingBody blockquote{padding-top:0;padding-bottom:0;padding-left:8px;margin-bottom:24px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px;line-height:1.4;color:#586069;border-left:3px solid #e1e4e8;padding:0;font-size:20px !important;color:#1277eb;border:0}@media (min-width: 768px){.MarketingBody blockquote{padding-left:12px;margin-bottom:32px;margin-left:-15px;font-size:18px;line-height:1.5}}.MarketingBody ul,.MarketingBody ol{padding-left:1.25em;margin-bottom:24px;overflow:hidden;color:#586069}.MarketingBody p+ul{margin-top:-8px}.MarketingBody .video-responsive{margin-right:16px;margin-bottom:16px;margin-left:16px}.MarketingBody-lead{font-family:InterUI, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Segoe UI", Oxygen, Ubuntu, Cantarell, "Open Sans", sans-serif}.MarketingBody-lead>p:first-child{-webkit-font-smoothing:antialiased;font-size:21px;font-weight:300;color:#24292e !important}@media (min-width: 768px){.MarketingBody-lead>p:first-child{font-size:24px}}@media (min-width: 1012px){.MarketingBody-lead>p:first-child{font-size:26px}}.MarketingBody-lead a{color:#1277eb;text-decoration:none !important;box-shadow:0 1px 0 0 rgba(18,119,235,0.5);transition:.2s}.MarketingBody-lead a:hover{color:#0366d6;box-shadow:0 1px 0 0 #1277eb}.Story{min-width:280px}@media (min-width: 1012px){.Story--large{min-width:330px;max-width:400px}}.Story--stagger:nth-child(even){margin-top:-16px}.Story--stagger:nth-child(odd){margin-bottom:-16px}.Story-link{transition:transform 0.3s}.Story-link:hover{text-decoration:none;transform:scale(1.025)}.Story-link:hover .Story-title{color:#e36209 !important;text-decoration:underline}.Story-link--customer:hover .Story-title{color:#6f42c1 !important}.Story-title{transition:color 0.3s}.summarylink .summarylink-illustration{display:none;transition:opacity 0.7s}@media (min-width: 544px){.summarylink .summarylink-illustration{top:-50%;display:block;opacity:0}}.summarylink:hover,.summarylink:active{text-decoration:none}.summarylink:hover .circle,.summarylink:active .circle{text-decoration:none;transform:scale(1.05)}@media (min-width: 544px){.summarylink:hover .summarylink-illustration,.summarylink:active .summarylink-illustration{top:24px;opacity:1}}@media (min-width: 544px){.summarylink:hover .summarylink-btn,.summarylink:active .summarylink-btn{border-color:#d1d5da;box-shadow:0 1px 15px rgba(27,31,35,0.15)}}.summarylink:hover .summarylink-btn .octicon,.summarylink:active .summarylink-btn .octicon{filter:grayscale(0%)}.summarylink-btn{border:solid 1px transparent;transition:box-shadow 0.3s, border-color 0.3s}@media (min-width: 544px){.summarylink-btn .octicon{filter:grayscale(100%);transition:filter 0.3s}}@media (min-width: 544px){.summarylink-illustration{position:absolute;top:0;right:40px;width:25%}}@media (min-width: 1012px){.summarylink-illustration{top:16px;right:auto;left:40%;width:15%}}@media (min-width: 768px){.communitystats{padding-left:50%}}.communitystats .summarylink:nth-child(1) .circle{width:225px;height:225px}.communitystats .summarylink:nth-child(2) .circle{left:20%;width:175px;height:175px}@media (min-width: 1012px){.communitystats .summarylink:nth-child(2) .circle{top:40px;left:25%}}.communitystats .summarylink:nth-child(3) .circle{left:10%;width:140px;height:140px}@media (min-width: 1012px){.communitystats .summarylink:nth-child(3) .circle{left:16%}}.communitystats .circle{transition:transform 0.3s}.communitystats .circle.bg-orange{background-color:#fb8532 !important}@media (min-width: 768px){.communitystats .circle{position:absolute;left:0}}@media (min-width: 768px){.communitystats .summarylink-btn{max-width:400px}}.logo-img{position:relative;display:inline-block;width:auto;height:25px;margin:10px;vertical-align:middle}@media (min-width: 768px){.logo-img{width:auto;height:30px;margin:10px}}@media (min-width: 1012px){.logo-img{height:35px;margin:10px 20px}}.logo-img-sm{position:relative;display:inline-block;width:auto;height:20px;margin:10px;vertical-align:middle}@media (min-width: 768px){.logo-img-sm{width:auto;height:25px;margin:10px}}.logo-img-lg{width:auto;height:35px;margin:5px 15px}@media (min-width: 768px){.logo-img-lg{width:auto;height:40px;margin:10px 15px}}@media (min-width: 1012px){.logo-img-lg{height:50px;margin:10px 25px}}.tooltipped-logo{display:inline-block}.tooltipped-logo.tooltipped-s::after,.tooltipped-logo.tooltipped-se::after,.tooltipped-logo.tooltipped-sw::after{font-size:14px}.Slots{height:1.5em;margin-bottom:-0.15em}.Slots-item{height:2em;padding-top:5px}@keyframes RotateSlot{0%{margin-top:0}3%{margin-top:-2em}20%{margin-top:-2em}23%{margin-top:-4em}40%{margin-top:-4em}43%{margin-top:-6em}60%{margin-top:-6em}63%{margin-top:-8em}90%{margin-top:-8em}93%{margin-top:0}100%{margin-top:0}}.Slots-item:first-of-type{animation-name:RotateSlot;animation-duration:15s;animation-timing-function:ease-in;animation-delay:2.5s;animation-iteration-count:infinite}.jumbotron-updates-universe{background:#2f363d url("/images/modules/site/updates/stars-sm.svg") center center repeat;background-size:contain}.btn-outline-transparent{color:#fff;background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,0.3)}.btn-outline-transparent:hover,.btn-outline-transparent:active{color:#0366d6;background:#fff;border-color:#fff}.waves{background:#fff url("/images/modules/site/updates/waves.svg") top center no-repeat;background-size:cover}@media (min-width: 1640px){.waves{background-repeat:repeat-x;background-size:contain}}.hr-darker{border-bottom-color:#d1d5da}.octoverse{padding-top:80px;padding-bottom:80px;background-color:#30363d;background-image:url("/images/modules/site/updates/octoverse-bg.png");background-repeat:no-repeat;background-position:bottom right;background-size:contain}@media (min-width: 768px){.octoverse{padding-top:120px;padding-bottom:120px;background-position:center right}}.i-am-a-developer-link{background-position:center center;background-size:cover}.i-am-a-developer-link::before{position:absolute;top:0;display:block;width:100%;height:100%;content:"";background:#24292e;opacity:0.8;transition:opacity 0.3s ease-in-out}.i-am-a-developer-link:hover::before{opacity:0.1}.coming-soon{position:relative;background-color:#2f363d;background-image:linear-gradient(145deg, #e46e65 0%, #db5070 50%, #98649f 100%);background-repeat:no-repeat;background-position:center center}@media (min-width: 768px){.pt-md-biggo{padding-top:160px}}.stars-rainbow{background:#fafbfc url("/images/modules/site/updates/stars-color.png") center top repeat-x;background-size:80% auto}.featurette-video{margin-bottom:40px;background-color:#2f363d;background-repeat:repeat-y;background-position:center top;background-size:110% auto}@media (min-width: 768px){.featurette-video{background-repeat:no-repeat}}.featurette-video .updates-video{bottom:-40px}.btn-outline-desktop{color:#9f7be1;background:#24292e;border-color:rgba(159,123,225,0.5)}.btn-outline-desktop:hover,.btn-outline-desktop:active{color:#fff;background:#9f7be1;background-image:linear-gradient(to bottom, #8241f9, #4e277b);border-color:#9f7be1;border-color:#150a27}.btn-outline-desktop:active{background-image:linear-gradient(to top, #8241f9, #7038cd)}.btn-outline-atom{color:#4de0c1;background:#24292e;border-color:rgba(77,224,193,0.5)}.btn-outline-atom:hover,.btn-outline-atom:active{color:#fff;background:rgba(77,224,193,0.5);background-image:linear-gradient(to bottom, #3fb69c, #2b7e6c);border-color:#3fb69c;border-color:#150a27}.btn-outline-atom:active{background-image:linear-gradient(to top, #3fb69c, #2b7e6c)}.featurette-desktop{background-color:#24292e;background-image:url("/images/modules/site/heroes/star-bg.svg"),linear-gradient(#191c20, #24292e 15%);background-repeat:repeat-x;background-position:center 0, 0 0, 0 0;background-size:100% auto}.apps-cluster .CircleBadge{margin:16px}@media (min-width: 1012px){.apps-cluster .CircleBadge{position:relative}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(odd){margin-top:-24px;animation-delay:1.5s;animation-direction:reverse}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(even){margin-top:24px;animation-duration:6s}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(1){animation-delay:2.1s}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(4){animation-delay:0.7s;animation-direction:reverse}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(6){animation-delay:0.3s}}.apps-cluster .CircleBadge.tooltipped:hover{box-shadow:0 3px 8px 0 rgba(0,0,0,0.2)}@keyframes appsClusterFloat{0%{top:0}40%{top:8px}100%{top:0}}.apps-quadrangle{position:relative;width:280px;height:280px}.apps-quadrangle .CircleBadge{position:absolute}.apps-quadrangle .CircleBadge::after{position:absolute;top:50%;left:0;z-index:-1;display:inline-block;height:3px;content:"";background-color:#e1e4e8;animation:2s ease-in-out infinite alternate forwards connect_four}.apps-quadrangle .CircleBadge:nth-child(1){top:0;left:0}.apps-quadrangle .CircleBadge:nth-child(2){top:0;right:0}.apps-quadrangle .CircleBadge:nth-child(2)::after{margin-top:32px;margin-left:-40px;transform:rotate(-45deg) scale(-1, 1);transform-origin:96px 96px;animation-delay:0.7s}.apps-quadrangle .CircleBadge:nth-child(3){top:auto;bottom:0;left:0}.apps-quadrangle .CircleBadge:nth-child(3)::after{animation-delay:1.7s}.apps-quadrangle .CircleBadge:nth-child(4){top:auto;right:0;bottom:0}.apps-quadrangle .CircleBadge:nth-child(4)::after{content:none}@keyframes connect_four{from{width:0}to{width:280px}}.video-responsive{position:relative;max-width:100%;height:0;padding-bottom:56.25%}.video-responsive iframe,.video-responsive object,.video-responsive embed{position:absolute;top:0;left:0;width:100%;height:100%}.togglevideo .togglevideo-hidewhencollapsed{display:none}.togglevideo.is-expanded .togglevideo-hidewhenexpanded{display:none}.togglevideo.is-expanded .togglevideo-showwhenexpanded{display:block}@media (min-width: 768px){.togglevideo.is-expanded .togglevideo-hidewhenexpanded-md{display:none}}.DeveloperVideo-data{right:0;bottom:0;left:0;z-index:0;background:#24292e}@media (min-width: 768px){.DeveloperVideo-data{padding-top:30%;background:none;background-image:linear-gradient(rgba(0,0,0,0), rgba(27,31,35,0.95))}}.DeveloperVideoData-play{top:calc(50% - 40px);left:calc(50% - 40px);z-index:1}@media (min-width: 768px){.DeveloperVideoData-play{top:20%}}@media (min-width: 1012px){.DeveloperVideoData-play{top:calc(50% - 40px)}}.TenYearNav{top:calc(50% - 175px);z-index:10}.TenYearNav-digits{opacity:0}.TenYearNav-year{display:block;border-left:8px solid #d1d5da;transition:border 0.3s ease-in-out}.TenYearNav-year.blue{color:#2188ff !important;border-color:#2188ff}.TenYearNav-year.purple{color:#8a63d2 !important;border-color:#8a63d2}.TenYearNav-year.yellow{color:#ffd33d !important;border-color:#ffd33d}.TenYearNav-year.green{color:#34d058 !important;border-color:#34d058}.TenYearNav-year.red{color:#ea4a5a !important;border-color:#ea4a5a}.TenYearNav-year.orange{color:#fb8532 !important;border-color:#fb8532}.TenYearNav-year.selected,.TenYearNav-year:hover{border-left-width:16px}.TenYearNav-year.selected .TenYearNav-digits,.TenYearNav-year:hover .TenYearNav-digits{background:#fff;opacity:1}.TenYears-hero{margin-top:-15%}@media (min-height: 720px){.TenYears-hero{margin-top:0}}.TenYears-year{font-size:60px;font-weight:500;line-height:0.9}@media (min-width: 768px){.TenYears-year{font-size:80px}}.btn-tenyear{border:2px solid #0366d6;box-shadow:6px 6px 0 0 #0366d6;transition:box-shadow 0.15s, margin 0.15s}.btn-tenyear:hover{box-shadow:0 0 0 0 #0366d6}.tentpole-purple{border:2px solid #6f42c1;box-shadow:10px 10px 0 0 #6f42c1}.tentpole-blue{border:2px solid #0366d6;box-shadow:10px 10px 0 0 #0366d6}.tentpole-green{border:2px solid #28a745;box-shadow:10px 10px 0 0 #28a745}.tentpole-yellow{border:2px solid #dbab09;box-shadow:10px 10px 0 0 #dbab09}.tentpole-date{top:-20px}.TenYearsImg-lowerleft{bottom:0;left:4%}@media (min-width: 1280px){.TenYearsImg-lowerleft{left:-5%}}.TenYearsImg-lowerright{right:4%;bottom:0}@media (min-width: 1280px){.TenYearsImg-lowerright{right:-10%}}.TenYearsImg-midright{top:10%;right:0}@media (min-width: 1012px){.TenYearsImg-midright{right:-6%}}.alt-mono-font{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace !important}.text-yellow-700{color:#dbab09}.text-yellow-800{color:#b08800}.bg-yellow-700{background-color:#dbab09}.text-orange-600{color:#e36209}@media (min-width: 768px){.mt-md-n10{margin-top:-96px !important}}@media (min-width: 1012px){.mt-lg-n10{margin-top:-96px !important}}.z-n1{z-index:-1}.rotated{transform:rotate(15deg)}@media (min-width: 768px){.px-md-8{padding-right:64px !important;padding-left:64px !important}}.library-collection-card-header{height:300px;background-color:#24292e;background-position:center center;background-size:cover;border-top-left-radius:6px;border-top-right-radius:6px}.library-resource-border{border-top:1px #e1e4e8 solid}.server-stats .container{width:auto;max-width:1012px;padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto}@media (min-width: 544px){.server-stats .container{padding-right:40px;padding-left:40px}}@media (min-width: 1012px){.server-stats .container{padding-right:16px;padding-left:16px}}.icon-cta{padding-left:24px}.icon-cta>.octicon{float:left;width:16px;margin-top:0.1em;margin-left:-24px;color:#6a737d;text-align:center}.signup-prompt{border:1px solid rgba(27,31,35,0.075)}@media (min-width: 768px){.signup-prompt{background:url("/images/modules/site/site-signup-prompt.png");background-position:center 10%;background-size:cover}}@media (min-width: 1012px){.signup-prompt{background-position:center 30%;background-size:100% auto}}.signup-prompt-bg{background-image:linear-gradient(180deg, rgba(255,255,255,0) 50%, #fff),linear-gradient(70deg, #eaf5ff 32%, #f6fff8)}@media (min-width: 1012px){.enterprise-prompt{background:url("/images/modules/site/patterns/dots-large.svg");background-position:center 10%}} + */.alt-mono-font{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace}.alt-h0,.alt-h1,.alt-h2,.alt-h3,.alt-h4,.alt-h5,.alt-h6,.alt-lead{-webkit-font-smoothing:antialiased;font-family:Roboto,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI","Oxygen","Ubuntu","Cantarell","Open Sans",sans-serif}.alt-h0{font-size:48px;font-weight:300}@media (min-width: 768px){.alt-h0{font-size:54px}}@media (min-width: 1012px){.alt-h0{font-size:72px}}.alt-h1{font-size:36px;font-weight:300}@media (min-width: 768px){.alt-h1{font-size:48px}}@media (min-width: 1012px){.alt-h1{font-size:54px}}.alt-h2{font-size:28px;font-weight:300}@media (min-width: 768px){.alt-h2{font-size:34px}}@media (min-width: 1012px){.alt-h2{font-size:38px}}.alt-h3{font-size:18px;font-weight:400}@media (min-width: 768px){.alt-h3{font-size:20px}}@media (min-width: 1012px){.alt-h3{font-size:22px}}.alt-h4{font-size:16px;font-weight:500}.alt-h5{font-size:14px;font-weight:500}.alt-h6{font-size:12px;font-weight:500}.alt-lead{-webkit-font-smoothing:antialiased;font-size:21px;font-weight:300}@media (min-width: 768px){.alt-lead{font-size:24px}}@media (min-width: 1012px){.alt-lead{font-size:26px}}.alt-text-small{font-size:14px !important}.pullquote{padding-top:0;padding-bottom:0;padding-left:8px;margin-bottom:24px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px;line-height:1.4;color:#586069;border-left:3px solid #e1e4e8}@media (min-width: 768px){.pullquote{padding-left:12px;margin-bottom:32px;margin-left:-15px;font-size:18px;line-height:1.5}}.btn-orange{color:#fff;background-color:#d25a08;background-image:linear-gradient(-180deg, #f7802f 0%, #d25a08 90%)}.btn-orange:focus,.btn-orange.focus{box-shadow:0 0 0 0.2em rgba(247,128,47,0.4)}.btn-orange:hover,.btn-orange.hover{background-color:#c85607;background-image:linear-gradient(-180deg, #f77a25 0%, #c85607 90%);background-position:-.5em;border-color:rgba(27,31,35,0.5)}.btn-orange:active,.btn-orange.selected,[open]>.btn-orange{background-color:#c65e17;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-orange:disabled,.btn-orange.disabled{color:rgba(255,255,255,0.75);background-color:#e9ad83;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-orange .Counter{color:#f46909;background-color:#fff}.btn-outline-purple{color:#6f42c1;background-color:#fff;background-image:none}.btn-outline-purple .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-purple:hover,.btn-outline-purple:active,.btn-outline-purple.selected,[open]>.btn-outline-purple{color:#fff;background-color:#6f42c1;background-image:none;border-color:#6f42c1}.btn-outline-purple:hover .Counter,.btn-outline-purple:active .Counter,.btn-outline-purple.selected .Counter,[open]>.btn-outline-purple .Counter{color:#6f42c1;background-color:#fff}.btn-outline-purple:focus{border-color:#6f42c1;box-shadow:0 0 0 0.2em rgba(111,66,193,0.4)}.btn-outline-purple:disabled,.btn-outline-purple.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-outline-orange{color:#f66a0a;background-color:#fff;background-image:none}.btn-outline-orange .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-orange:hover,.btn-outline-orange:active,.btn-outline-orange.selected,[open]>.btn-outline-orange{color:#fff;background-color:#f66a0a;background-image:none;border-color:#f66a0a}.btn-outline-orange:hover .Counter,.btn-outline-orange:active .Counter,.btn-outline-orange.selected .Counter,[open]>.btn-outline-orange .Counter{color:#f66a0a;background-color:#fff}.btn-outline-orange:focus{border-color:#f66a0a;box-shadow:0 0 0 0.2em rgba(246,106,10,0.4)}.btn-outline-orange:disabled,.btn-outline-orange.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-outline-green{color:#28a745;background-color:#fff;background-image:none}.btn-outline-green .Counter{background-color:rgba(27,31,35,0.07)}.btn-outline-green:hover,.btn-outline-green:active,.btn-outline-green.selected,[open]>.btn-outline-green{color:#fff;background-color:#28a745;background-image:none;border-color:#28a745}.btn-outline-green:hover .Counter,.btn-outline-green:active .Counter,.btn-outline-green.selected .Counter,[open]>.btn-outline-green .Counter{color:#28a745;background-color:#fff}.btn-outline-green:focus{border-color:#28a745;box-shadow:0 0 0 0.2em rgba(40,167,69,0.4)}.btn-outline-green:disabled,.btn-outline-green.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(27,31,35,0.15);box-shadow:none}.btn-transparent{color:#fff;background-color:transparent;background-image:none;border:1px solid rgba(255,255,255,0.5)}.btn-transparent:hover,.btn-transparent:active{color:#2f363d;background-color:#fff;background-image:none;border-color:#fff}.jumbotron{position:relative;padding-top:40px;padding-bottom:40px}@media (min-width: 544px){.jumbotron{padding-top:60px;padding-bottom:60px}}@media (min-width: 1280px){.jumbotron{padding-top:120px;padding-bottom:120px}}@media (min-width: 1012px){.jumbotron-supertron{height:45vw;min-height:590px;max-height:55vh;padding-top:80px;padding-bottom:80px}}.jumbotron-minitron{padding-top:24px;padding-bottom:24px}@media (min-width: 544px){.jumbotron-minitron{padding-top:32px;padding-bottom:32px}}.jumbotron-shadow::after{position:absolute;bottom:0;left:0;width:100%;height:30px;content:" ";background-color:transparent;background-image:linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.05));background-repeat:repeat-x;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.05)}.jumbotron-photo{position:relative;background-color:#24292e;background-size:cover}.jumbotron-photo::before{position:absolute;bottom:0;left:0;display:block;width:100%;height:100%;content:"";background-color:rgba(0,0,0,0.25)}.page-section{padding:32px 0;margin-top:0}@media (min-width: 768px){.page-section{padding:56px 0}}.page-section-jumplink:target{padding-top:112px}@media (min-width: 768px){.page-section-jumplink:target{padding-top:80px}}.data-table{width:100%;margin-top:16px;border-collapse:collapse;border:1px #e1e4e8 solid;box-shadow:0 1px 1px rgba(27,31,35,0.05)}.data-table th{font-weight:400;text-align:left}.data-table td,.data-table th{padding:16px;border-right:1px #e1e4e8 solid;border-bottom:1px #e1e4e8 solid}.data-table tbody th{width:25%}.data-table tbody th,.data-table tbody td{border-bottom-color:#e1e4e8}.data-table tbody tr:last-child th,.data-table tbody tr:last-child td{border-bottom:1px #e1e4e8 solid}.grayscale{filter:grayscale(100%)}@media (min-width: 544px){.border-sm-top{border-top:1px #e1e4e8 solid !important}.border-sm-right{border-right:1px #e1e4e8 solid !important}.border-sm-bottom{border-bottom:1px #e1e4e8 solid !important}.border-sm-left{border-left:1px #e1e4e8 solid !important}.border-sm-top-0{border-top:0 !important}.border-sm-right-0{border-right:0 !important}.border-sm-bottom-0{border-bottom:0 !important}.border-sm-left-0{border-left:0 !important}}@media (min-width: 768px){.border-md-top{border-top:1px #e1e4e8 solid !important}.border-md-right{border-right:1px #e1e4e8 solid !important}.border-md-bottom{border-bottom:1px #e1e4e8 solid !important}.border-md-left{border-left:1px #e1e4e8 solid !important}.border-md-top-0{border-top:0 !important}.border-md-right-0{border-right:0 !important}.border-md-bottom-0{border-bottom:0 !important}.border-md-left-0{border-left:0 !important}}@media (min-width: 1012px){.border-lg-top{border-top:1px #e1e4e8 solid !important}.border-lg-right{border-right:1px #e1e4e8 solid !important}.border-lg-bottom{border-bottom:1px #e1e4e8 solid !important}.border-lg-left{border-left:1px #e1e4e8 solid !important}.border-lg-top-0{border-top:0 !important}.border-lg-right-0{border-right:0 !important}.border-lg-bottom-0{border-bottom:0 !important}.border-lg-left-0{border-left:0 !important}}@media (min-width: 1280px){.border-xl-top{border-top:1px #e1e4e8 solid !important}.border-xl-right{border-right:1px #e1e4e8 solid !important}.border-xl-bottom{border-bottom:1px #e1e4e8 solid !important}.border-xl-left{border-left:1px #e1e4e8 solid !important}.border-xl-top-0{border-top:0 !important}.border-xl-right-0{border-right:0 !important}.border-xl-bottom-0{border-bottom:0 !important}.border-xl-left-0{border-left:0 !important}}.border-white-fade{border-color:rgba(255,255,255,0.15) !important}@media (min-width: 544px){.position-sm-relative{position:relative !important}.position-sm-absolute{position:absolute !important}.position-sm-fixed{position:fixed !important}}@media (min-width: 768px){.position-md-relative{position:relative !important}.position-md-absolute{position:absolute !important}.position-md-fixed{position:fixed !important}}@media (min-width: 1012px){.position-lg-relative{position:relative !important}.position-lg-absolute{position:absolute !important}.position-lg-fixed{position:fixed !important}}@media (min-width: 1280px){.position-xl-relative{position:relative !important}.position-xl-absolute{position:absolute !important}.position-xl-fixed{position:fixed !important}}.mt-7{margin-top:48px !important}.mb-7{margin-bottom:48px !important}.my-7{margin-top:48px !important;margin-bottom:48px !important}.mt-8{margin-top:64px !important}.mb-8{margin-bottom:64px !important}.my-8{margin-top:64px !important;margin-bottom:64px !important}.mt-9{margin-top:80px !important}.mb-9{margin-bottom:80px !important}.my-9{margin-top:80px !important;margin-bottom:80px !important}.mt-10{margin-top:96px !important}.mb-10{margin-bottom:96px !important}.my-10{margin-top:96px !important;margin-bottom:96px !important}.mt-11{margin-top:112px !important}.mb-11{margin-bottom:112px !important}.my-11{margin-top:112px !important;margin-bottom:112px !important}.mt-12{margin-top:128px !important}.mb-12{margin-bottom:128px !important}.my-12{margin-top:128px !important;margin-bottom:128px !important}@media (min-width: 544px){.mt-sm-7{margin-top:48px !important}.mb-sm-7{margin-bottom:48px !important}.my-sm-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 544px){.mt-sm-8{margin-top:64px !important}.mb-sm-8{margin-bottom:64px !important}.my-sm-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 544px){.mt-sm-9{margin-top:80px !important}.mb-sm-9{margin-bottom:80px !important}.my-sm-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 544px){.mt-sm-10{margin-top:96px !important}.mb-sm-10{margin-bottom:96px !important}.my-sm-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 544px){.mt-sm-11{margin-top:112px !important}.mb-sm-11{margin-bottom:112px !important}.my-sm-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 544px){.mt-sm-12{margin-top:128px !important}.mb-sm-12{margin-bottom:128px !important}.my-sm-12{margin-top:128px !important;margin-bottom:128px !important}}@media (min-width: 768px){.mt-md-7{margin-top:48px !important}.mb-md-7{margin-bottom:48px !important}.my-md-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 768px){.mt-md-8{margin-top:64px !important}.mb-md-8{margin-bottom:64px !important}.my-md-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 768px){.mt-md-9{margin-top:80px !important}.mb-md-9{margin-bottom:80px !important}.my-md-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 768px){.mt-md-10{margin-top:96px !important}.mb-md-10{margin-bottom:96px !important}.my-md-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 768px){.mt-md-11{margin-top:112px !important}.mb-md-11{margin-bottom:112px !important}.my-md-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 768px){.mt-md-12{margin-top:128px !important}.mb-md-12{margin-bottom:128px !important}.my-md-12{margin-top:128px !important;margin-bottom:128px !important}}@media (min-width: 1012px){.mt-lg-7{margin-top:48px !important}.mb-lg-7{margin-bottom:48px !important}.my-lg-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 1012px){.mt-lg-8{margin-top:64px !important}.mb-lg-8{margin-bottom:64px !important}.my-lg-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 1012px){.mt-lg-9{margin-top:80px !important}.mb-lg-9{margin-bottom:80px !important}.my-lg-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 1012px){.mt-lg-10{margin-top:96px !important}.mb-lg-10{margin-bottom:96px !important}.my-lg-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 1012px){.mt-lg-11{margin-top:112px !important}.mb-lg-11{margin-bottom:112px !important}.my-lg-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 1012px){.mt-lg-12{margin-top:128px !important}.mb-lg-12{margin-bottom:128px !important}.my-lg-12{margin-top:128px !important;margin-bottom:128px !important}}@media (min-width: 1280px){.mt-xl-7{margin-top:48px !important}.mb-xl-7{margin-bottom:48px !important}.my-xl-7{margin-top:48px !important;margin-bottom:48px !important}}@media (min-width: 1280px){.mt-xl-8{margin-top:64px !important}.mb-xl-8{margin-bottom:64px !important}.my-xl-8{margin-top:64px !important;margin-bottom:64px !important}}@media (min-width: 1280px){.mt-xl-9{margin-top:80px !important}.mb-xl-9{margin-bottom:80px !important}.my-xl-9{margin-top:80px !important;margin-bottom:80px !important}}@media (min-width: 1280px){.mt-xl-10{margin-top:96px !important}.mb-xl-10{margin-bottom:96px !important}.my-xl-10{margin-top:96px !important;margin-bottom:96px !important}}@media (min-width: 1280px){.mt-xl-11{margin-top:112px !important}.mb-xl-11{margin-bottom:112px !important}.my-xl-11{margin-top:112px !important;margin-bottom:112px !important}}@media (min-width: 1280px){.mt-xl-12{margin-top:128px !important}.mb-xl-12{margin-bottom:128px !important}.my-xl-12{margin-top:128px !important;margin-bottom:128px !important}}.pt-7{padding-top:48px !important}.pb-7{padding-bottom:48px !important}.py-7{padding-top:48px !important;padding-bottom:48px !important}.pt-8{padding-top:64px !important}.pb-8{padding-bottom:64px !important}.py-8{padding-top:64px !important;padding-bottom:64px !important}.pt-9{padding-top:80px !important}.pb-9{padding-bottom:80px !important}.py-9{padding-top:80px !important;padding-bottom:80px !important}.pt-10{padding-top:96px !important}.pb-10{padding-bottom:96px !important}.py-10{padding-top:96px !important;padding-bottom:96px !important}.pt-11{padding-top:112px !important}.pb-11{padding-bottom:112px !important}.py-11{padding-top:112px !important;padding-bottom:112px !important}.pt-12{padding-top:128px !important}.pb-12{padding-bottom:128px !important}.py-12{padding-top:128px !important;padding-bottom:128px !important}@media (min-width: 544px){.pt-sm-7{padding-top:48px !important}.pb-sm-7{padding-bottom:48px !important}.py-sm-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 544px){.pt-sm-8{padding-top:64px !important}.pb-sm-8{padding-bottom:64px !important}.py-sm-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 544px){.pt-sm-9{padding-top:80px !important}.pb-sm-9{padding-bottom:80px !important}.py-sm-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 544px){.pt-sm-10{padding-top:96px !important}.pb-sm-10{padding-bottom:96px !important}.py-sm-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 544px){.pt-sm-11{padding-top:112px !important}.pb-sm-11{padding-bottom:112px !important}.py-sm-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 544px){.pt-sm-12{padding-top:128px !important}.pb-sm-12{padding-bottom:128px !important}.py-sm-12{padding-top:128px !important;padding-bottom:128px !important}}@media (min-width: 768px){.pt-md-7{padding-top:48px !important}.pb-md-7{padding-bottom:48px !important}.py-md-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 768px){.pt-md-8{padding-top:64px !important}.pb-md-8{padding-bottom:64px !important}.py-md-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 768px){.pt-md-9{padding-top:80px !important}.pb-md-9{padding-bottom:80px !important}.py-md-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 768px){.pt-md-10{padding-top:96px !important}.pb-md-10{padding-bottom:96px !important}.py-md-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 768px){.pt-md-11{padding-top:112px !important}.pb-md-11{padding-bottom:112px !important}.py-md-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 768px){.pt-md-12{padding-top:128px !important}.pb-md-12{padding-bottom:128px !important}.py-md-12{padding-top:128px !important;padding-bottom:128px !important}}@media (min-width: 1012px){.pt-lg-7{padding-top:48px !important}.pb-lg-7{padding-bottom:48px !important}.py-lg-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 1012px){.pt-lg-8{padding-top:64px !important}.pb-lg-8{padding-bottom:64px !important}.py-lg-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 1012px){.pt-lg-9{padding-top:80px !important}.pb-lg-9{padding-bottom:80px !important}.py-lg-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 1012px){.pt-lg-10{padding-top:96px !important}.pb-lg-10{padding-bottom:96px !important}.py-lg-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 1012px){.pt-lg-11{padding-top:112px !important}.pb-lg-11{padding-bottom:112px !important}.py-lg-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 1012px){.pt-lg-12{padding-top:128px !important}.pb-lg-12{padding-bottom:128px !important}.py-lg-12{padding-top:128px !important;padding-bottom:128px !important}}@media (min-width: 1280px){.pt-xl-7{padding-top:48px !important}.pb-xl-7{padding-bottom:48px !important}.py-xl-7{padding-top:48px !important;padding-bottom:48px !important}}@media (min-width: 1280px){.pt-xl-8{padding-top:64px !important}.pb-xl-8{padding-bottom:64px !important}.py-xl-8{padding-top:64px !important;padding-bottom:64px !important}}@media (min-width: 1280px){.pt-xl-9{padding-top:80px !important}.pb-xl-9{padding-bottom:80px !important}.py-xl-9{padding-top:80px !important;padding-bottom:80px !important}}@media (min-width: 1280px){.pt-xl-10{padding-top:96px !important}.pb-xl-10{padding-bottom:96px !important}.py-xl-10{padding-top:96px !important;padding-bottom:96px !important}}@media (min-width: 1280px){.pt-xl-11{padding-top:112px !important}.pb-xl-11{padding-bottom:112px !important}.py-xl-11{padding-top:112px !important;padding-bottom:112px !important}}@media (min-width: 1280px){.pt-xl-12{padding-top:128px !important}.pb-xl-12{padding-bottom:128px !important}.py-xl-12{padding-top:128px !important;padding-bottom:128px !important}}hr{border-bottom-color:#eee}.img-responsive{display:block;width:100%;max-width:100%;height:auto}@font-face{font-family:InterUI;font-style:normal;font-weight:400;src:local("InterUI"),local("InterUI-Regular"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuIElmIHlvdSBlbnRlcmVkIHRoZSBVUkwgbWFudWFsbHkgcGxlYXNlIGNoZWNrIHlvdXIgc3BlbGxpbmcgYW5kIHRyeSBhZ2Fpbi48L3A+Cg==) format("woff")}@font-face{font-family:InterUI;font-style:normal;font-weight:500;src:local("InterUI Medium"),local("InterUI-Medium"),url(data:font/woff;base64,PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjxoMT5Ob3QgRm91bmQ8L2gxPgo8cD5UaGUgcmVxdWVzdGVkIFVSTCB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2ZXIuIElmIHlvdSBlbnRlcmVkIHRoZSBVUkwgbWFudWFsbHkgcGxlYXNlIGNoZWNrIHlvdXIgc3BlbGxpbmcgYW5kIHRyeSBhZ2Fpbi48L3A+Cg==) format("woff")}.bg-blue-dark{background-color:#032f62 !important}.text-blue-mktg{color:#1277eb !important}.text-blue-light{color:#79b8ff !important}.text-white-fade{color:rgba(255,255,255,0.7) !important}.h000-mktg,.h00-mktg,.h0-mktg,.h1-mktg,.h2-mktg,.h3-mktg,.h4-mktg,.h5-mktg,.h6-mktg,.lead-mktg{font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif;font-weight:500}.lead-mktg{font-size:21px !important;font-weight:normal !important}.h000-mktg,.h000{font-size:48px !important}@media (min-width: 768px){.h000-mktg,.h000{font-size:64px !important}}.h00-mktg{font-size:40px !important}@media (min-width: 768px){.h00-mktg{font-size:48px !important}}.h0-mktg{font-size:32px !important}@media (min-width: 768px){.h0-mktg{font-size:40px !important}}.h1-mktg{font-size:26px !important}@media (min-width: 768px){.h1-mktg{font-size:32px !important}}.h2-mktg{font-size:22px !important}@media (min-width: 768px){.h2-mktg{font-size:24px !important}}.h3-mktg{font-size:18px !important}@media (min-width: 768px){.h3-mktg{font-size:20px !important}}.h4-mktg{font-size:16px !important}.h5-mktg{font-size:14px !important}.h6-mktg{font-size:12px !important}.text-gray-light-ultra{font-style:normal;font-weight:400;color:#808891}.underline-dashed{display:inline;padding-bottom:4px;background-image:linear-gradient(to right, #d1d5da 50%, rgba(255,255,255,0) 0%);background-repeat:repeat-x;background-position:bottom;background-size:10px 2px}.link-mktg{color:#1277eb;text-decoration:none !important;box-shadow:0 1px 0 0 rgba(18,119,235,0.5);transition:.2s}.link-mktg:hover{color:#0366d6;box-shadow:0 1px 0 0 #1277eb}.Tile{position:relative;display:block;min-height:250px;background-color:#f6f8fa;border-radius:3px;transition:.4s}.Tile:hover{background-color:#fff;box-shadow:0 4px 14px rgba(0,0,0,0.1)}.Tile:active{box-shadow:0 2px 7px rgba(0,0,0,0.1)}.Tile--dots::before{position:absolute;top:0;left:0;z-index:-1;width:180px;height:180px;content:"";background:url("/images/modules/site/patterns/dots-small.svg");opacity:0;transition:.4s}.Tile--dots::after{position:absolute;right:0;bottom:0;z-index:-1;width:180px;height:180px;content:"";background:url("/images/modules/site/patterns/dots-small.svg");opacity:0;transition:.4s}.Tile--dots:hover::before{opacity:1;transform:translate3d(-18px, -18px, 0)}.Tile--dots:hover::after{opacity:1;transform:translate3d(23px, 23px, 0)}.Tile--dots:active::before{opacity:0.5;transform:translate3d(-10px, -10px, 0)}.Tile--dots:active::after{opacity:0.5;transform:translate3d(18px, 18px, 0)}.Tile--symbol::before{position:absolute;top:16px;right:24px;font-size:24px;content:"→";opacity:0;transition:.4s,color 0s;transform:rotate(-45deg) translateX(-3px)}.Tile--symbol:hover::before{opacity:1;transform:rotate(-45deg) translateX(0)}.Tile--symbol:active::before{opacity:1;transition:.2s;transform:rotate(-45deg) translateX(-5px)}.Tile-date{position:absolute;bottom:24px;left:24px;margin-bottom:0;line-height:1;color:#959da5}.dots-4{position:relative}.dots-4::before{position:absolute;top:-31px;left:-31px;z-index:-1;width:75%;height:75%;content:"";background:url("/images/modules/site/patterns/dots-small.svg")}.dots-3{position:relative}.dots-3::before{position:absolute;top:-21px;left:-21px;z-index:-1;width:75%;height:75%;content:"";background:url("/images/modules/site/patterns/dots-small.svg")}.Point:hover .Point-symbol{transform:translateY(-5px)}.Point-symbol{transition:.2s;transform:translateY(0)}.Bump-link-symbol{display:inline-block;transition:.2s;transform:translateX(0)}.Bump-link:hover .Bump-link-symbol{transform:translateX(3px)}.Bump-link--hover .Bump-link-symbol{color:inherit;opacity:0;transition:.2s;transform:translateX(0)}.Bump-link--hover:hover .Bump-link-symbol{opacity:1;transform:translateX(3px)}.btn-mktg{display:inline-block;padding:16px 24px;font-size:14px;font-weight:500;color:#fff;background-color:#1277eb;border:0;border-radius:3px;transition:.2s}.btn-mktg:hover{text-decoration:none;background-color:#0366d6}.btn-primary-mktg{background-color:#2ebc4f}.btn-primary-mktg:hover{background-color:#28a745}.btn-large-mktg{padding:20px 32px;font-size:16px}.btn-outline-mktg{color:#1277eb !important;background-color:transparent !important;box-shadow:0 0 0 1px rgba(18,119,235,0.5) inset}.btn-outline-mktg:hover{color:#0366d6 !important;text-decoration:none;box-shadow:0 0 0 1px #1277eb inset}.top-0{top:0 !important}.right-0{right:0 !important}.bottom-0{bottom:0 !important}.left-0{left:0 !important}.top-n0{top:-0 !important}.right-n0{right:-0 !important}.bottom-n0{bottom:-0 !important}.left-n0{left:-0 !important}.top-1{top:4px !important}.right-1{right:4px !important}.bottom-1{bottom:4px !important}.left-1{left:4px !important}.top-n1{top:-4px !important}.right-n1{right:-4px !important}.bottom-n1{bottom:-4px !important}.left-n1{left:-4px !important}.top-2{top:8px !important}.right-2{right:8px !important}.bottom-2{bottom:8px !important}.left-2{left:8px !important}.top-n2{top:-8px !important}.right-n2{right:-8px !important}.bottom-n2{bottom:-8px !important}.left-n2{left:-8px !important}.top-3{top:16px !important}.right-3{right:16px !important}.bottom-3{bottom:16px !important}.left-3{left:16px !important}.top-n3{top:-16px !important}.right-n3{right:-16px !important}.bottom-n3{bottom:-16px !important}.left-n3{left:-16px !important}.top-4{top:24px !important}.right-4{right:24px !important}.bottom-4{bottom:24px !important}.left-4{left:24px !important}.top-n4{top:-24px !important}.right-n4{right:-24px !important}.bottom-n4{bottom:-24px !important}.left-n4{left:-24px !important}.top-5{top:32px !important}.right-5{right:32px !important}.bottom-5{bottom:32px !important}.left-5{left:32px !important}.top-n5{top:-32px !important}.right-n5{right:-32px !important}.bottom-n5{bottom:-32px !important}.left-n5{left:-32px !important}.top-6{top:40px !important}.right-6{right:40px !important}.bottom-6{bottom:40px !important}.left-6{left:40px !important}.top-n6{top:-40px !important}.right-n6{right:-40px !important}.bottom-n6{bottom:-40px !important}.left-n6{left:-40px !important}.top-7{top:48px !important}.right-7{right:48px !important}.bottom-7{bottom:48px !important}.left-7{left:48px !important}.top-n7{top:-48px !important}.right-n7{right:-48px !important}.bottom-n7{bottom:-48px !important}.left-n7{left:-48px !important}.top-8{top:64px !important}.right-8{right:64px !important}.bottom-8{bottom:64px !important}.left-8{left:64px !important}.top-n8{top:-64px !important}.right-n8{right:-64px !important}.bottom-n8{bottom:-64px !important}.left-n8{left:-64px !important}.top-9{top:80px !important}.right-9{right:80px !important}.bottom-9{bottom:80px !important}.left-9{left:80px !important}.top-n9{top:-80px !important}.right-n9{right:-80px !important}.bottom-n9{bottom:-80px !important}.left-n9{left:-80px !important}.top-10{top:96px !important}.right-10{right:96px !important}.bottom-10{bottom:96px !important}.left-10{left:96px !important}.top-n10{top:-96px !important}.right-n10{right:-96px !important}.bottom-n10{bottom:-96px !important}.left-n10{left:-96px !important}.top-11{top:112px !important}.right-11{right:112px !important}.bottom-11{bottom:112px !important}.left-11{left:112px !important}.top-n11{top:-112px !important}.right-n11{right:-112px !important}.bottom-n11{bottom:-112px !important}.left-n11{left:-112px !important}.top-12{top:128px !important}.right-12{right:128px !important}.bottom-12{bottom:128px !important}.left-12{left:128px !important}.top-n12{top:-128px !important}.right-n12{right:-128px !important}.bottom-n12{bottom:-128px !important}.left-n12{left:-128px !important}@media (min-width: 544px){.top-sm-0{top:0 !important}.right-sm-0{right:0 !important}.bottom-sm-0{bottom:0 !important}.left-sm-0{left:0 !important}.top-sm-n0{top:-0 !important}.right-sm-n0{right:-0 !important}.bottom-sm-n0{bottom:-0 !important}.left-sm-n0{left:-0 !important}}@media (min-width: 544px){.top-sm-1{top:4px !important}.right-sm-1{right:4px !important}.bottom-sm-1{bottom:4px !important}.left-sm-1{left:4px !important}.top-sm-n1{top:-4px !important}.right-sm-n1{right:-4px !important}.bottom-sm-n1{bottom:-4px !important}.left-sm-n1{left:-4px !important}}@media (min-width: 544px){.top-sm-2{top:8px !important}.right-sm-2{right:8px !important}.bottom-sm-2{bottom:8px !important}.left-sm-2{left:8px !important}.top-sm-n2{top:-8px !important}.right-sm-n2{right:-8px !important}.bottom-sm-n2{bottom:-8px !important}.left-sm-n2{left:-8px !important}}@media (min-width: 544px){.top-sm-3{top:16px !important}.right-sm-3{right:16px !important}.bottom-sm-3{bottom:16px !important}.left-sm-3{left:16px !important}.top-sm-n3{top:-16px !important}.right-sm-n3{right:-16px !important}.bottom-sm-n3{bottom:-16px !important}.left-sm-n3{left:-16px !important}}@media (min-width: 544px){.top-sm-4{top:24px !important}.right-sm-4{right:24px !important}.bottom-sm-4{bottom:24px !important}.left-sm-4{left:24px !important}.top-sm-n4{top:-24px !important}.right-sm-n4{right:-24px !important}.bottom-sm-n4{bottom:-24px !important}.left-sm-n4{left:-24px !important}}@media (min-width: 544px){.top-sm-5{top:32px !important}.right-sm-5{right:32px !important}.bottom-sm-5{bottom:32px !important}.left-sm-5{left:32px !important}.top-sm-n5{top:-32px !important}.right-sm-n5{right:-32px !important}.bottom-sm-n5{bottom:-32px !important}.left-sm-n5{left:-32px !important}}@media (min-width: 544px){.top-sm-6{top:40px !important}.right-sm-6{right:40px !important}.bottom-sm-6{bottom:40px !important}.left-sm-6{left:40px !important}.top-sm-n6{top:-40px !important}.right-sm-n6{right:-40px !important}.bottom-sm-n6{bottom:-40px !important}.left-sm-n6{left:-40px !important}}@media (min-width: 544px){.top-sm-7{top:48px !important}.right-sm-7{right:48px !important}.bottom-sm-7{bottom:48px !important}.left-sm-7{left:48px !important}.top-sm-n7{top:-48px !important}.right-sm-n7{right:-48px !important}.bottom-sm-n7{bottom:-48px !important}.left-sm-n7{left:-48px !important}}@media (min-width: 544px){.top-sm-8{top:64px !important}.right-sm-8{right:64px !important}.bottom-sm-8{bottom:64px !important}.left-sm-8{left:64px !important}.top-sm-n8{top:-64px !important}.right-sm-n8{right:-64px !important}.bottom-sm-n8{bottom:-64px !important}.left-sm-n8{left:-64px !important}}@media (min-width: 544px){.top-sm-9{top:80px !important}.right-sm-9{right:80px !important}.bottom-sm-9{bottom:80px !important}.left-sm-9{left:80px !important}.top-sm-n9{top:-80px !important}.right-sm-n9{right:-80px !important}.bottom-sm-n9{bottom:-80px !important}.left-sm-n9{left:-80px !important}}@media (min-width: 544px){.top-sm-10{top:96px !important}.right-sm-10{right:96px !important}.bottom-sm-10{bottom:96px !important}.left-sm-10{left:96px !important}.top-sm-n10{top:-96px !important}.right-sm-n10{right:-96px !important}.bottom-sm-n10{bottom:-96px !important}.left-sm-n10{left:-96px !important}}@media (min-width: 544px){.top-sm-11{top:112px !important}.right-sm-11{right:112px !important}.bottom-sm-11{bottom:112px !important}.left-sm-11{left:112px !important}.top-sm-n11{top:-112px !important}.right-sm-n11{right:-112px !important}.bottom-sm-n11{bottom:-112px !important}.left-sm-n11{left:-112px !important}}@media (min-width: 544px){.top-sm-12{top:128px !important}.right-sm-12{right:128px !important}.bottom-sm-12{bottom:128px !important}.left-sm-12{left:128px !important}.top-sm-n12{top:-128px !important}.right-sm-n12{right:-128px !important}.bottom-sm-n12{bottom:-128px !important}.left-sm-n12{left:-128px !important}}@media (min-width: 768px){.top-md-0{top:0 !important}.right-md-0{right:0 !important}.bottom-md-0{bottom:0 !important}.left-md-0{left:0 !important}.top-md-n0{top:-0 !important}.right-md-n0{right:-0 !important}.bottom-md-n0{bottom:-0 !important}.left-md-n0{left:-0 !important}}@media (min-width: 768px){.top-md-1{top:4px !important}.right-md-1{right:4px !important}.bottom-md-1{bottom:4px !important}.left-md-1{left:4px !important}.top-md-n1{top:-4px !important}.right-md-n1{right:-4px !important}.bottom-md-n1{bottom:-4px !important}.left-md-n1{left:-4px !important}}@media (min-width: 768px){.top-md-2{top:8px !important}.right-md-2{right:8px !important}.bottom-md-2{bottom:8px !important}.left-md-2{left:8px !important}.top-md-n2{top:-8px !important}.right-md-n2{right:-8px !important}.bottom-md-n2{bottom:-8px !important}.left-md-n2{left:-8px !important}}@media (min-width: 768px){.top-md-3{top:16px !important}.right-md-3{right:16px !important}.bottom-md-3{bottom:16px !important}.left-md-3{left:16px !important}.top-md-n3{top:-16px !important}.right-md-n3{right:-16px !important}.bottom-md-n3{bottom:-16px !important}.left-md-n3{left:-16px !important}}@media (min-width: 768px){.top-md-4{top:24px !important}.right-md-4{right:24px !important}.bottom-md-4{bottom:24px !important}.left-md-4{left:24px !important}.top-md-n4{top:-24px !important}.right-md-n4{right:-24px !important}.bottom-md-n4{bottom:-24px !important}.left-md-n4{left:-24px !important}}@media (min-width: 768px){.top-md-5{top:32px !important}.right-md-5{right:32px !important}.bottom-md-5{bottom:32px !important}.left-md-5{left:32px !important}.top-md-n5{top:-32px !important}.right-md-n5{right:-32px !important}.bottom-md-n5{bottom:-32px !important}.left-md-n5{left:-32px !important}}@media (min-width: 768px){.top-md-6{top:40px !important}.right-md-6{right:40px !important}.bottom-md-6{bottom:40px !important}.left-md-6{left:40px !important}.top-md-n6{top:-40px !important}.right-md-n6{right:-40px !important}.bottom-md-n6{bottom:-40px !important}.left-md-n6{left:-40px !important}}@media (min-width: 768px){.top-md-7{top:48px !important}.right-md-7{right:48px !important}.bottom-md-7{bottom:48px !important}.left-md-7{left:48px !important}.top-md-n7{top:-48px !important}.right-md-n7{right:-48px !important}.bottom-md-n7{bottom:-48px !important}.left-md-n7{left:-48px !important}}@media (min-width: 768px){.top-md-8{top:64px !important}.right-md-8{right:64px !important}.bottom-md-8{bottom:64px !important}.left-md-8{left:64px !important}.top-md-n8{top:-64px !important}.right-md-n8{right:-64px !important}.bottom-md-n8{bottom:-64px !important}.left-md-n8{left:-64px !important}}@media (min-width: 768px){.top-md-9{top:80px !important}.right-md-9{right:80px !important}.bottom-md-9{bottom:80px !important}.left-md-9{left:80px !important}.top-md-n9{top:-80px !important}.right-md-n9{right:-80px !important}.bottom-md-n9{bottom:-80px !important}.left-md-n9{left:-80px !important}}@media (min-width: 768px){.top-md-10{top:96px !important}.right-md-10{right:96px !important}.bottom-md-10{bottom:96px !important}.left-md-10{left:96px !important}.top-md-n10{top:-96px !important}.right-md-n10{right:-96px !important}.bottom-md-n10{bottom:-96px !important}.left-md-n10{left:-96px !important}}@media (min-width: 768px){.top-md-11{top:112px !important}.right-md-11{right:112px !important}.bottom-md-11{bottom:112px !important}.left-md-11{left:112px !important}.top-md-n11{top:-112px !important}.right-md-n11{right:-112px !important}.bottom-md-n11{bottom:-112px !important}.left-md-n11{left:-112px !important}}@media (min-width: 768px){.top-md-12{top:128px !important}.right-md-12{right:128px !important}.bottom-md-12{bottom:128px !important}.left-md-12{left:128px !important}.top-md-n12{top:-128px !important}.right-md-n12{right:-128px !important}.bottom-md-n12{bottom:-128px !important}.left-md-n12{left:-128px !important}}@media (min-width: 1012px){.top-lg-0{top:0 !important}.right-lg-0{right:0 !important}.bottom-lg-0{bottom:0 !important}.left-lg-0{left:0 !important}.top-lg-n0{top:-0 !important}.right-lg-n0{right:-0 !important}.bottom-lg-n0{bottom:-0 !important}.left-lg-n0{left:-0 !important}}@media (min-width: 1012px){.top-lg-1{top:4px !important}.right-lg-1{right:4px !important}.bottom-lg-1{bottom:4px !important}.left-lg-1{left:4px !important}.top-lg-n1{top:-4px !important}.right-lg-n1{right:-4px !important}.bottom-lg-n1{bottom:-4px !important}.left-lg-n1{left:-4px !important}}@media (min-width: 1012px){.top-lg-2{top:8px !important}.right-lg-2{right:8px !important}.bottom-lg-2{bottom:8px !important}.left-lg-2{left:8px !important}.top-lg-n2{top:-8px !important}.right-lg-n2{right:-8px !important}.bottom-lg-n2{bottom:-8px !important}.left-lg-n2{left:-8px !important}}@media (min-width: 1012px){.top-lg-3{top:16px !important}.right-lg-3{right:16px !important}.bottom-lg-3{bottom:16px !important}.left-lg-3{left:16px !important}.top-lg-n3{top:-16px !important}.right-lg-n3{right:-16px !important}.bottom-lg-n3{bottom:-16px !important}.left-lg-n3{left:-16px !important}}@media (min-width: 1012px){.top-lg-4{top:24px !important}.right-lg-4{right:24px !important}.bottom-lg-4{bottom:24px !important}.left-lg-4{left:24px !important}.top-lg-n4{top:-24px !important}.right-lg-n4{right:-24px !important}.bottom-lg-n4{bottom:-24px !important}.left-lg-n4{left:-24px !important}}@media (min-width: 1012px){.top-lg-5{top:32px !important}.right-lg-5{right:32px !important}.bottom-lg-5{bottom:32px !important}.left-lg-5{left:32px !important}.top-lg-n5{top:-32px !important}.right-lg-n5{right:-32px !important}.bottom-lg-n5{bottom:-32px !important}.left-lg-n5{left:-32px !important}}@media (min-width: 1012px){.top-lg-6{top:40px !important}.right-lg-6{right:40px !important}.bottom-lg-6{bottom:40px !important}.left-lg-6{left:40px !important}.top-lg-n6{top:-40px !important}.right-lg-n6{right:-40px !important}.bottom-lg-n6{bottom:-40px !important}.left-lg-n6{left:-40px !important}}@media (min-width: 1012px){.top-lg-7{top:48px !important}.right-lg-7{right:48px !important}.bottom-lg-7{bottom:48px !important}.left-lg-7{left:48px !important}.top-lg-n7{top:-48px !important}.right-lg-n7{right:-48px !important}.bottom-lg-n7{bottom:-48px !important}.left-lg-n7{left:-48px !important}}@media (min-width: 1012px){.top-lg-8{top:64px !important}.right-lg-8{right:64px !important}.bottom-lg-8{bottom:64px !important}.left-lg-8{left:64px !important}.top-lg-n8{top:-64px !important}.right-lg-n8{right:-64px !important}.bottom-lg-n8{bottom:-64px !important}.left-lg-n8{left:-64px !important}}@media (min-width: 1012px){.top-lg-9{top:80px !important}.right-lg-9{right:80px !important}.bottom-lg-9{bottom:80px !important}.left-lg-9{left:80px !important}.top-lg-n9{top:-80px !important}.right-lg-n9{right:-80px !important}.bottom-lg-n9{bottom:-80px !important}.left-lg-n9{left:-80px !important}}@media (min-width: 1012px){.top-lg-10{top:96px !important}.right-lg-10{right:96px !important}.bottom-lg-10{bottom:96px !important}.left-lg-10{left:96px !important}.top-lg-n10{top:-96px !important}.right-lg-n10{right:-96px !important}.bottom-lg-n10{bottom:-96px !important}.left-lg-n10{left:-96px !important}}@media (min-width: 1012px){.top-lg-11{top:112px !important}.right-lg-11{right:112px !important}.bottom-lg-11{bottom:112px !important}.left-lg-11{left:112px !important}.top-lg-n11{top:-112px !important}.right-lg-n11{right:-112px !important}.bottom-lg-n11{bottom:-112px !important}.left-lg-n11{left:-112px !important}}@media (min-width: 1012px){.top-lg-12{top:128px !important}.right-lg-12{right:128px !important}.bottom-lg-12{bottom:128px !important}.left-lg-12{left:128px !important}.top-lg-n12{top:-128px !important}.right-lg-n12{right:-128px !important}.bottom-lg-n12{bottom:-128px !important}.left-lg-n12{left:-128px !important}}@media (min-width: 1280px){.top-xl-0{top:0 !important}.right-xl-0{right:0 !important}.bottom-xl-0{bottom:0 !important}.left-xl-0{left:0 !important}.top-xl-n0{top:-0 !important}.right-xl-n0{right:-0 !important}.bottom-xl-n0{bottom:-0 !important}.left-xl-n0{left:-0 !important}}@media (min-width: 1280px){.top-xl-1{top:4px !important}.right-xl-1{right:4px !important}.bottom-xl-1{bottom:4px !important}.left-xl-1{left:4px !important}.top-xl-n1{top:-4px !important}.right-xl-n1{right:-4px !important}.bottom-xl-n1{bottom:-4px !important}.left-xl-n1{left:-4px !important}}@media (min-width: 1280px){.top-xl-2{top:8px !important}.right-xl-2{right:8px !important}.bottom-xl-2{bottom:8px !important}.left-xl-2{left:8px !important}.top-xl-n2{top:-8px !important}.right-xl-n2{right:-8px !important}.bottom-xl-n2{bottom:-8px !important}.left-xl-n2{left:-8px !important}}@media (min-width: 1280px){.top-xl-3{top:16px !important}.right-xl-3{right:16px !important}.bottom-xl-3{bottom:16px !important}.left-xl-3{left:16px !important}.top-xl-n3{top:-16px !important}.right-xl-n3{right:-16px !important}.bottom-xl-n3{bottom:-16px !important}.left-xl-n3{left:-16px !important}}@media (min-width: 1280px){.top-xl-4{top:24px !important}.right-xl-4{right:24px !important}.bottom-xl-4{bottom:24px !important}.left-xl-4{left:24px !important}.top-xl-n4{top:-24px !important}.right-xl-n4{right:-24px !important}.bottom-xl-n4{bottom:-24px !important}.left-xl-n4{left:-24px !important}}@media (min-width: 1280px){.top-xl-5{top:32px !important}.right-xl-5{right:32px !important}.bottom-xl-5{bottom:32px !important}.left-xl-5{left:32px !important}.top-xl-n5{top:-32px !important}.right-xl-n5{right:-32px !important}.bottom-xl-n5{bottom:-32px !important}.left-xl-n5{left:-32px !important}}@media (min-width: 1280px){.top-xl-6{top:40px !important}.right-xl-6{right:40px !important}.bottom-xl-6{bottom:40px !important}.left-xl-6{left:40px !important}.top-xl-n6{top:-40px !important}.right-xl-n6{right:-40px !important}.bottom-xl-n6{bottom:-40px !important}.left-xl-n6{left:-40px !important}}@media (min-width: 1280px){.top-xl-7{top:48px !important}.right-xl-7{right:48px !important}.bottom-xl-7{bottom:48px !important}.left-xl-7{left:48px !important}.top-xl-n7{top:-48px !important}.right-xl-n7{right:-48px !important}.bottom-xl-n7{bottom:-48px !important}.left-xl-n7{left:-48px !important}}@media (min-width: 1280px){.top-xl-8{top:64px !important}.right-xl-8{right:64px !important}.bottom-xl-8{bottom:64px !important}.left-xl-8{left:64px !important}.top-xl-n8{top:-64px !important}.right-xl-n8{right:-64px !important}.bottom-xl-n8{bottom:-64px !important}.left-xl-n8{left:-64px !important}}@media (min-width: 1280px){.top-xl-9{top:80px !important}.right-xl-9{right:80px !important}.bottom-xl-9{bottom:80px !important}.left-xl-9{left:80px !important}.top-xl-n9{top:-80px !important}.right-xl-n9{right:-80px !important}.bottom-xl-n9{bottom:-80px !important}.left-xl-n9{left:-80px !important}}@media (min-width: 1280px){.top-xl-10{top:96px !important}.right-xl-10{right:96px !important}.bottom-xl-10{bottom:96px !important}.left-xl-10{left:96px !important}.top-xl-n10{top:-96px !important}.right-xl-n10{right:-96px !important}.bottom-xl-n10{bottom:-96px !important}.left-xl-n10{left:-96px !important}}@media (min-width: 1280px){.top-xl-11{top:112px !important}.right-xl-11{right:112px !important}.bottom-xl-11{bottom:112px !important}.left-xl-11{left:112px !important}.top-xl-n11{top:-112px !important}.right-xl-n11{right:-112px !important}.bottom-xl-n11{bottom:-112px !important}.left-xl-n11{left:-112px !important}}@media (min-width: 1280px){.top-xl-12{top:128px !important}.right-xl-12{right:128px !important}.bottom-xl-12{bottom:128px !important}.left-xl-12{left:128px !important}.top-xl-n12{top:-128px !important}.right-xl-n12{right:-128px !important}.bottom-xl-n12{bottom:-128px !important}.left-xl-n12{left:-128px !important}}.z-n1{z-index:-1}.z-n2{z-index:-2}.site-subheader{position:relative;z-index:2;padding-top:16px;padding-bottom:16px}.site-subheader-overlay{margin-bottom:-96px}@media (min-width: 1012px){.site-subheader-overlay{margin-bottom:-72px}}.site-subheader-sticky{position:-webkit-sticky;position:sticky;top:0;z-index:21}.site-subheader-sticky.is-stuck{background-color:#fff;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.1)}.site-subheader-sticky.is-stuck::after{position:absolute;right:0;bottom:-12px;left:0;z-index:-1;display:block;height:12px;content:"";background:linear-gradient(rgba(0,0,0,0.075), rgba(0,0,0,0.001)) repeat-x 0 0}.subheader-title{display:block;margin-bottom:10px;font-weight:400;text-align:center}@media (min-width: 1012px){.subheader-title{float:left;text-align:left}}.subheader-nav{font-size:14px}@media (min-width: 768px){.subheader-nav{font-size:16px}}.subheader-nav .btn-outline-purple{font-size:inherit}.subheader-nav .nav-item.selected{color:#24292e}.site-subheader-business{margin-bottom:0;border-bottom:1px solid rgba(0,0,0,0.1)}.site-subheader-pricing{background-color:#fafbfc}.subheader-nav-business .nav-item{color:#6a737d}.subheader-nav-business .nav-item:hover{color:#586069}.plans-cards{display:flex;flex:0 1 100%;flex-direction:column;align-items:center}@media (min-width: 768px){.plans-cards{align-items:stretch;flex-flow:row wrap;justify-content:center}}@media (min-width: 1012px){.plans-cards{flex-wrap:nowrap}}.plans-card{display:flex;margin-right:10px;margin-bottom:20px;margin-left:10px;font-size:14px;flex-direction:column}.plans-card-pricing-footnote{display:inline-block;margin-left:-0.5em}.plans-card-btn{padding:16px;border-color:#e1e4e8;border-width:1px 0 0;border-radius:0 0 2px 2px}.plans-card-btn:hover,.plans-card-btn:active,.plans-card-btn.selected{border-color:transparent}.plans-card-text{display:flex;flex-direction:column;flex:1 1 auto}.pricing-table{text-align:center}.pricing-table thead th{border-bottom:1px #e1e4e8 solid}.pricing-table .pricing-table-spacer{height:5px;border:0}.pricing-table td:first-child{font-weight:500;text-align:left}.pricing-table td,.pricing-table th{width:18%;padding:8px 16px}.pricing-table td:first-child,.pricing-table th:first-child{width:28%;padding-left:0}.pricing-table td:last-child,.pricing-table th:last-child{padding-right:0}.pricing-table td{border-bottom:1px solid #eaecef}.pricing-table td+td{border-left:1px solid #eaecef}.pricing-table-responsive{display:block;width:100%;min-height:0.01%;overflow-x:auto}@media (min-width: 768px){.pricing-table-responsive{display:table}}.pricing-table-header .octicon-link{visibility:hidden}.pricing-table-header:hover .octicon-link{visibility:visible}.jumbotron-codelines{color:rgba(255,255,255,0.6);background:url("/images/modules/site/heroes/simple-codelines.svg"),#2b3137;background-position:center 10%;background-size:cover}.jumbotron-netneutrality{background:#24292e}@media (min-width: 768px){.jumbotron-netneutrality{background:url("/images/modules/site/netneutrality/netneutrality.png"),#24292e;background-position:center top;background-size:150% auto}}@media (min-width: 1012px){.jumbotron-netneutrality{background-size:130% auto}}@media (min-width: 1280px){.jumbotron-netneutrality{background-size:cover}}.jumbotron-integrations{background-image:url("/images/modules/site/heroes/features-hero-integrations.svg");background-repeat:no-repeat;background-position:top center;background-size:110% auto}.jumbotron-endpoints{background-image:url("/images/modules/site/heroes/features-hero-integrations-endpoints.svg");background-repeat:no-repeat;background-position:center;background-size:100%}.jumbotron-projects{background-image:url("/images/modules/site/heroes/features-hero-project-management.svg");background-position:top center, 0 0;background-size:110% auto}.jumbotron-code-review{background-image:url("/images/modules/site/heroes/features-hero-code-review.svg");background-position:top center, 0 0;background-size:110% auto}.jumbotron-updates{margin-bottom:40px;background-color:#2f363d;background-image:url("/images/modules/marketplace/bg-hero.svg");background-repeat:repeat-y;background-position:center top;background-size:110% auto}@media (min-width: 768px){.jumbotron-updates{background-repeat:no-repeat}}.jumbotron-updates .updates-video{bottom:-40px}.jumbotron-link{font-weight:400;border-bottom:1px solid rgba(255,255,255,0.125)}.jumbotron-link:hover{text-decoration:none;border-bottom-color:rgba(255,255,255,0.75)}.jumbotron-video{position:relative;margin-top:24px;margin-bottom:-24px}@media (min-width: 544px){.jumbotron-video{margin-top:32px;margin-bottom:-32px}}@media (min-width: 1012px){.jumbotron-video{margin-top:48px;margin-bottom:-48px}}@media (min-width: 1280px){.jumbotron-video{margin-top:64px;margin-bottom:-64px}}.jumbotron-video-close{position:absolute;top:0;right:-40px}.jumbotron-link-followup{position:relative;z-index:1;display:inline-block;padding:4px;margin:0 auto;line-height:1;white-space:normal}.jumbotron-link-followup:hover{text-decoration:none}@media (min-width: 768px){.jumbotron-link-followup{display:block;margin:0}}.jumbotron-link-followup .jumbotron-link-followup-icon{position:relative;left:-4px;width:25px;height:25px;margin-left:-30px;vertical-align:middle}@media (min-width: 768px){.jumbotron-link-followup .jumbotron-link-followup-icon{width:30px;height:30px;margin-top:-2px;margin-left:-40px}}.featurette-heading{text-align:center}@media (min-width: 768px){.featurette-heading{text-align:inherit}}.featurette-benefit-img{width:50px;vertical-align:top}@media (min-width: 768px){.featurette-benefit-img{width:60px}}.featurette-icon{width:100%;height:auto}.featurette-illo{padding:0 5%}@media (min-width: 768px){.featurette-illo{padding:0}}.business-security-cta{padding-top:40px;padding-bottom:40px;border-top:1px solid #eee}.business-security-cta .container{width:500px;max-width:90%}@media (min-width: 1012px){.business-security-cta{height:690px;padding-top:290px;padding-bottom:0;background-image:url("/images/modules/site/business-security-billboard-bg.svg");background-repeat:no-repeat;background-position:center 20px;background-size:1850px 675px;border-top:0}}@media (min-width: 768px){.illflow{height:600px;background-image:url("/images/modules/site/illflow_window_ui.png");background-repeat:no-repeat;background-position:top center;background-size:795px auto}}@media (min-width: 768px){.illflow-purple .selected{background-color:#f5f0ff}.illflow-purple .selected::after{border-color:transparent transparent #f5f0ff}.illflow-purple .illflow-item .illflow-item-heading{color:#6f42c1}}@media (min-width: 768px){.illflow-blue .selected{background-color:#f1f8ff}.illflow-blue .selected::after{border-color:transparent transparent #f1f8ff}.illflow-blue .illflow-item .illflow-item-heading{color:#0366d6}}@media (min-width: 768px){.illflow-no-bg{background-image:none}}.illflow-no-bg .illflow-item::before{background-image:none}@media (min-width: 768px){.illflow-steps{margin-top:24px;margin-right:-24px;margin-left:-24px}.illflow-steps::before{display:table;content:""}.illflow-steps::after{display:table;clear:both;content:""}}.illflow-step{display:none}@media (min-width: 768px){.illflow-step.active{display:block}}.illflow-item{position:relative;padding:0 10%;margin-bottom:40px;text-align:center}.illflow-item::before{position:absolute;top:10%;left:-6%;z-index:-1;display:block;padding-top:200%;padding-left:110%;content:"";background-image:url("/images/modules/site/illflow_window_ui.png");background-repeat:no-repeat;background-size:100% auto}@media (min-width: 768px){.illflow-item::before{display:none}}.illflow-item .illflow-item-heading{position:relative;color:#444d56}@media (min-width: 768px){.illflow-item{float:left;width:33.333333%;padding:24px;margin-bottom:0;cursor:pointer;border-radius:6px}.illflow-item:not(.selected):hover{background-color:#fafbfc}.illflow-item.selected .illflow-item-heading{color:#24292e}.illflow-item.selected::after{position:absolute;top:-30px;left:50%;display:block;width:0;height:0;margin-left:-15px;pointer-events:none;content:" ";border-style:outset solid solid;border-width:15px}.illflow-item.selected:first-child::after{left:75%}.illflow-item.selected:last-child::after{left:25%}}.illflow-item-description{margin-top:0}.illflow-img{display:block;width:400px;height:auto;margin:0 auto}@media (min-width: 768px){.illflow-bizsecurity{height:auto;background-image:url("/images/modules/site/business-security-illflow-bg.png");background-size:1000px auto}}.illflow-bizsecurity .img-responsive{max-width:400px}.illflow-bizsecurity .illflow-item::before{display:none}.IconNav{font-size:12px;transition:transform ease 0.4s}@media (min-width: 1012px){.IconNav{font-size:14px}}.IconNav-item{border-bottom:3px solid transparent}.IconNav-item .IconNav-img{max-height:60px;transition:transform ease-in-out 0.25s}.IconNav-item:hover .IconNav-img{transform:translateY(-10px)}.IconNav-item.selected{border-color:#444d56}.IconNav.is-stuck{transform:translateY(-70px)}.IconNav.is-stuck .IconNav-img{opacity:0;transition:opacity ease-in-out 0.4s, transform ease-in-out 0.25s}.IconNav.is-stuck:hover{transform:translateY(0)}.IconNav.is-stuck:hover .IconNav-img{opacity:1}.home-hero-signup .form-label{display:block;margin-bottom:5px;font-size:16px;font-weight:inherit;text-align:left}.home-hero-signup .form-control-lg{width:100%;min-height:46px;padding:10px;font-size:16px;border-radius:5px}.home-hero-signup .form-control-lg:-ms-input-placeholder{color:#24292e}.home-hero-signup .form-control-lg::-ms-input-placeholder{color:#24292e}.home-hero-signup .form-control-lg::placeholder{color:#24292e}.home-hero-signup .form-control-lg:focus{box-shadow:0 0 0 0.2em rgba(255,255,255,0.3)}.home-hero-signup .form-control-note{margin-top:5px;margin-bottom:0;font-size:12px;color:#6a737d}.home-hero-signup .form-control-note .notice-highlight{color:#959da5}.casestudy-hero{background-position:center;background-size:cover}.casestudy-square::after,.casestudy-rectangle::after{display:block;content:"";transition:padding-bottom 0.3s}.casestudy-square::after{padding-bottom:100%}.casestudy-rectangle::after{padding-bottom:50%}.casestudy-hero-btn{position:absolute;top:16px;right:16px;z-index:2;opacity:0;transform:translate3d(-5px, 5px, 0) scale(0.95)}.casestudy-hero-btn,.casestudy-header,.casestudy-facts{transition:.4s}.casestudy-controls{transition:transform .4s}.casestudy-link{flex:1;background-position:center;background-size:cover;transition:transform 0.3s, box-shadow 0.3s}.casestudy-link .casestudy-facts{opacity:0}.casestudy-link:hover{text-decoration:none}@media (min-width: 544px){.casestudy-link:hover .casestudy-controls{transform:scale(1.08)}}.casestudy-link:hover .casestudy-title{color:#1277eb !important}@media (min-width: 544px){.casestudy-link:hover .casestudy-header{opacity:0}}@media (min-width: 544px){.casestudy-link:hover .casestudy-hero-btn,.casestudy-link:hover .casestudy-facts{opacity:1 !important;transform:translate3d(0, 0, 0) scale(1)}}.is-expanded .casestudy-link:hover{transform:scale(1)}.col-12 .casestudy-link .casestudy-square::after{padding-bottom:25%}.col-12 .casestudy-link .casestudy-facts{display:none !important}.col-12 .casestudy-link .casestudy-header{opacity:1 !important}.MarketingBody{font-size:16px}.MarketingBody>p{margin-bottom:24px;color:#586069}.MarketingBody h2,.MarketingBody h3{margin-bottom:8px;font-family:InterUI,-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Oxygen,Ubuntu,Cantarell,"Open Sans",sans-serif;font-weight:400}.MarketingBody blockquote{padding-top:0;padding-bottom:0;padding-left:8px;margin-bottom:24px;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px;line-height:1.4;color:#586069;border-left:3px solid #e1e4e8;padding:0;font-size:20px !important;color:#1277eb;border:0}@media (min-width: 768px){.MarketingBody blockquote{padding-left:12px;margin-bottom:32px;margin-left:-15px;font-size:18px;line-height:1.5}}.MarketingBody ul,.MarketingBody ol{padding-left:1.25em;margin-bottom:24px;overflow:hidden;color:#586069}.MarketingBody p+ul{margin-top:-8px}.MarketingBody .video-responsive{margin-right:16px;margin-bottom:16px;margin-left:16px}.MarketingBody-lead{font-family:InterUI, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Segoe UI", Oxygen, Ubuntu, Cantarell, "Open Sans", sans-serif}.MarketingBody-lead>p:first-child{-webkit-font-smoothing:antialiased;font-size:21px;font-weight:300;color:#24292e !important}@media (min-width: 768px){.MarketingBody-lead>p:first-child{font-size:24px}}@media (min-width: 1012px){.MarketingBody-lead>p:first-child{font-size:26px}}.MarketingBody-lead a{color:#1277eb;text-decoration:none !important;box-shadow:0 1px 0 0 rgba(18,119,235,0.5);transition:.2s}.MarketingBody-lead a:hover{color:#0366d6;box-shadow:0 1px 0 0 #1277eb}.Story{min-width:280px}@media (min-width: 1012px){.Story--large{min-width:330px;max-width:400px}}.Story--stagger:nth-child(even){margin-top:-16px}.Story--stagger:nth-child(odd){margin-bottom:-16px}.Story-link{transition:transform 0.3s}.Story-link:hover{text-decoration:none;transform:scale(1.025)}.Story-link:hover .Story-title{color:#e36209 !important;text-decoration:underline}.Story-link--customer:hover .Story-title{color:#6f42c1 !important}.Story-title{transition:color 0.3s}.summarylink .summarylink-illustration{display:none;transition:opacity 0.7s}@media (min-width: 544px){.summarylink .summarylink-illustration{top:-50%;display:block;opacity:0}}.summarylink:hover,.summarylink:active{text-decoration:none}.summarylink:hover .circle,.summarylink:active .circle{text-decoration:none;transform:scale(1.05)}@media (min-width: 544px){.summarylink:hover .summarylink-illustration,.summarylink:active .summarylink-illustration{top:24px;opacity:1}}@media (min-width: 544px){.summarylink:hover .summarylink-btn,.summarylink:active .summarylink-btn{border-color:#d1d5da;box-shadow:0 1px 15px rgba(27,31,35,0.15)}}.summarylink:hover .summarylink-btn .octicon,.summarylink:active .summarylink-btn .octicon{filter:grayscale(0%)}.summarylink-btn{border:solid 1px transparent;transition:box-shadow 0.3s, border-color 0.3s}@media (min-width: 544px){.summarylink-btn .octicon{filter:grayscale(100%);transition:filter 0.3s}}@media (min-width: 544px){.summarylink-illustration{position:absolute;top:0;right:40px;width:25%}}@media (min-width: 1012px){.summarylink-illustration{top:16px;right:auto;left:40%;width:15%}}@media (min-width: 768px){.communitystats{padding-left:50%}}.communitystats .summarylink:nth-child(1) .circle{width:225px;height:225px}.communitystats .summarylink:nth-child(2) .circle{left:20%;width:175px;height:175px}@media (min-width: 1012px){.communitystats .summarylink:nth-child(2) .circle{top:40px;left:25%}}.communitystats .summarylink:nth-child(3) .circle{left:10%;width:140px;height:140px}@media (min-width: 1012px){.communitystats .summarylink:nth-child(3) .circle{left:16%}}.communitystats .circle{transition:transform 0.3s}.communitystats .circle.bg-orange{background-color:#fb8532 !important}@media (min-width: 768px){.communitystats .circle{position:absolute;left:0}}@media (min-width: 768px){.communitystats .summarylink-btn{max-width:400px}}.logo-img{position:relative;display:inline-block;width:auto;height:25px;margin:10px;vertical-align:middle}@media (min-width: 768px){.logo-img{width:auto;height:30px;margin:10px}}@media (min-width: 1012px){.logo-img{height:35px;margin:10px 20px}}.logo-img-sm{position:relative;display:inline-block;width:auto;height:20px;margin:10px;vertical-align:middle}@media (min-width: 768px){.logo-img-sm{width:auto;height:25px;margin:10px}}.logo-img-lg{width:auto;height:35px;margin:5px 15px}@media (min-width: 768px){.logo-img-lg{width:auto;height:40px;margin:10px 15px}}@media (min-width: 1012px){.logo-img-lg{height:50px;margin:10px 25px}}.tooltipped-logo{display:inline-block}.tooltipped-logo.tooltipped-s::after,.tooltipped-logo.tooltipped-se::after,.tooltipped-logo.tooltipped-sw::after{font-size:14px}.Slots{height:1.5em;margin-bottom:-0.15em}.Slots-item{height:2em;padding-top:5px}@keyframes RotateSlot{0%{margin-top:0}3%{margin-top:-2em}20%{margin-top:-2em}23%{margin-top:-4em}40%{margin-top:-4em}43%{margin-top:-6em}60%{margin-top:-6em}63%{margin-top:-8em}90%{margin-top:-8em}93%{margin-top:0}100%{margin-top:0}}.Slots-item:first-of-type{animation-name:RotateSlot;animation-duration:15s;animation-timing-function:ease-in;animation-delay:2.5s;animation-iteration-count:infinite}.jumbotron-updates-universe{background:#2f363d url("/images/modules/site/updates/stars-sm.svg") center center repeat;background-size:contain}.btn-outline-transparent{color:#fff;background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,0.3)}.btn-outline-transparent:hover,.btn-outline-transparent:active{color:#0366d6;background:#fff;border-color:#fff}.waves{background:#fff url("/images/modules/site/updates/waves.svg") top center no-repeat;background-size:cover}@media (min-width: 1640px){.waves{background-repeat:repeat-x;background-size:contain}}.hr-darker{border-bottom-color:#d1d5da}.octoverse{padding-top:80px;padding-bottom:80px;background-color:#30363d;background-image:url("/images/modules/site/updates/octoverse-bg.png");background-repeat:no-repeat;background-position:bottom right;background-size:contain}@media (min-width: 768px){.octoverse{padding-top:120px;padding-bottom:120px;background-position:center right}}.i-am-a-developer-link{background-position:center center;background-size:cover}.i-am-a-developer-link::before{position:absolute;top:0;display:block;width:100%;height:100%;content:"";background:#24292e;opacity:0.8;transition:opacity 0.3s ease-in-out}.i-am-a-developer-link:hover::before{opacity:0.1}.coming-soon{position:relative;background-color:#2f363d;background-image:linear-gradient(145deg, #e46e65 0%, #db5070 50%, #98649f 100%);background-repeat:no-repeat;background-position:center center}@media (min-width: 768px){.pt-md-biggo{padding-top:160px}}.stars-rainbow{background:#fafbfc url("/images/modules/site/updates/stars-color.png") center top repeat-x;background-size:80% auto}.featurette-video{margin-bottom:40px;background-color:#2f363d;background-repeat:repeat-y;background-position:center top;background-size:110% auto}@media (min-width: 768px){.featurette-video{background-repeat:no-repeat}}.featurette-video .updates-video{bottom:-40px}.btn-outline-desktop{color:#9f7be1;background:#24292e;border-color:rgba(159,123,225,0.5)}.btn-outline-desktop:hover,.btn-outline-desktop:active{color:#fff;background:#9f7be1;background-image:linear-gradient(to bottom, #8241f9, #4e277b);border-color:#9f7be1;border-color:#150a27}.btn-outline-desktop:active{background-image:linear-gradient(to top, #8241f9, #7038cd)}.btn-outline-atom{color:#4de0c1;background:#24292e;border-color:rgba(77,224,193,0.5)}.btn-outline-atom:hover,.btn-outline-atom:active{color:#fff;background:rgba(77,224,193,0.5);background-image:linear-gradient(to bottom, #3fb69c, #2b7e6c);border-color:#3fb69c;border-color:#150a27}.btn-outline-atom:active{background-image:linear-gradient(to top, #3fb69c, #2b7e6c)}.featurette-desktop{background-color:#24292e;background-image:url("/images/modules/site/heroes/star-bg.svg"),linear-gradient(#191c20, #24292e 15%);background-repeat:repeat-x;background-position:center 0, 0 0, 0 0;background-size:100% auto}.apps-cluster .CircleBadge{margin:16px}@media (min-width: 1012px){.apps-cluster .CircleBadge{position:relative}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(odd){margin-top:-24px;animation-delay:1.5s;animation-direction:reverse}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(even){margin-top:24px;animation-duration:6s}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(1){animation-delay:2.1s}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(4){animation-delay:0.7s;animation-direction:reverse}}@media (min-width: 1012px){.apps-cluster .CircleBadge:nth-child(6){animation-delay:0.3s}}.apps-cluster .CircleBadge.tooltipped:hover{box-shadow:0 3px 8px 0 rgba(0,0,0,0.2)}@keyframes appsClusterFloat{0%{top:0}40%{top:8px}100%{top:0}}.apps-quadrangle{position:relative;width:280px;height:280px}.apps-quadrangle .CircleBadge{position:absolute}.apps-quadrangle .CircleBadge::after{position:absolute;top:50%;left:0;z-index:-1;display:inline-block;height:3px;content:"";background-color:#e1e4e8;animation:2s ease-in-out infinite alternate forwards connect_four}.apps-quadrangle .CircleBadge:nth-child(1){top:0;left:0}.apps-quadrangle .CircleBadge:nth-child(2){top:0;right:0}.apps-quadrangle .CircleBadge:nth-child(2)::after{margin-top:32px;margin-left:-40px;transform:rotate(-45deg) scale(-1, 1);transform-origin:96px 96px;animation-delay:0.7s}.apps-quadrangle .CircleBadge:nth-child(3){top:auto;bottom:0;left:0}.apps-quadrangle .CircleBadge:nth-child(3)::after{animation-delay:1.7s}.apps-quadrangle .CircleBadge:nth-child(4){top:auto;right:0;bottom:0}.apps-quadrangle .CircleBadge:nth-child(4)::after{content:none}@keyframes connect_four{from{width:0}to{width:280px}}.video-responsive{position:relative;max-width:100%;height:0;padding-bottom:56.25%}.video-responsive iframe,.video-responsive object,.video-responsive embed{position:absolute;top:0;left:0;width:100%;height:100%}.togglevideo .togglevideo-hidewhencollapsed{display:none}.togglevideo.is-expanded .togglevideo-hidewhenexpanded{display:none}.togglevideo.is-expanded .togglevideo-showwhenexpanded{display:block}@media (min-width: 768px){.togglevideo.is-expanded .togglevideo-hidewhenexpanded-md{display:none}}.DeveloperVideo-data{right:0;bottom:0;left:0;z-index:0;background:#24292e}@media (min-width: 768px){.DeveloperVideo-data{padding-top:30%;background:none;background-image:linear-gradient(rgba(0,0,0,0), rgba(27,31,35,0.95))}}.DeveloperVideoData-play{top:calc(50% - 40px);left:calc(50% - 40px);z-index:1}@media (min-width: 768px){.DeveloperVideoData-play{top:20%}}@media (min-width: 1012px){.DeveloperVideoData-play{top:calc(50% - 40px)}}.TenYearNav{top:calc(50% - 175px);z-index:10}.TenYearNav-digits{opacity:0}.TenYearNav-year{display:block;border-left:8px solid #d1d5da;transition:border 0.3s ease-in-out}.TenYearNav-year.blue{color:#2188ff !important;border-color:#2188ff}.TenYearNav-year.purple{color:#8a63d2 !important;border-color:#8a63d2}.TenYearNav-year.yellow{color:#ffd33d !important;border-color:#ffd33d}.TenYearNav-year.green{color:#34d058 !important;border-color:#34d058}.TenYearNav-year.red{color:#ea4a5a !important;border-color:#ea4a5a}.TenYearNav-year.orange{color:#fb8532 !important;border-color:#fb8532}.TenYearNav-year.selected,.TenYearNav-year:hover{border-left-width:16px}.TenYearNav-year.selected .TenYearNav-digits,.TenYearNav-year:hover .TenYearNav-digits{background:#fff;opacity:1}.TenYears-hero{margin-top:-15%}@media (min-height: 720px){.TenYears-hero{margin-top:0}}.TenYears-year{font-size:60px;font-weight:500;line-height:0.9}@media (min-width: 768px){.TenYears-year{font-size:80px}}.btn-tenyear{border:2px solid #0366d6;box-shadow:6px 6px 0 0 #0366d6;transition:box-shadow 0.15s, margin 0.15s}.btn-tenyear:hover{box-shadow:0 0 0 0 #0366d6}.tentpole-purple{border:2px solid #6f42c1;box-shadow:10px 10px 0 0 #6f42c1}.tentpole-blue{border:2px solid #0366d6;box-shadow:10px 10px 0 0 #0366d6}.tentpole-green{border:2px solid #28a745;box-shadow:10px 10px 0 0 #28a745}.tentpole-yellow{border:2px solid #dbab09;box-shadow:10px 10px 0 0 #dbab09}.tentpole-date{top:-20px}.TenYearsImg-lowerleft{bottom:0;left:4%}@media (min-width: 1280px){.TenYearsImg-lowerleft{left:-5%}}.TenYearsImg-lowerright{right:4%;bottom:0}@media (min-width: 1280px){.TenYearsImg-lowerright{right:-10%}}.TenYearsImg-midright{top:10%;right:0}@media (min-width: 1012px){.TenYearsImg-midright{right:-6%}}.alt-mono-font{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace !important}.text-yellow-700{color:#dbab09}.text-yellow-800{color:#b08800}.bg-yellow-700{background-color:#dbab09}.text-orange-600{color:#e36209}@media (min-width: 768px){.mt-md-n10{margin-top:-96px !important}}@media (min-width: 1012px){.mt-lg-n10{margin-top:-96px !important}}.z-n1{z-index:-1}.rotated{transform:rotate(15deg)}@media (min-width: 768px){.px-md-8{padding-right:64px !important;padding-left:64px !important}}.library-collection-card-header{height:300px;background-color:#24292e;background-position:center center;background-size:cover;border-top-left-radius:6px;border-top-right-radius:6px}.library-resource-border{border-top:1px #e1e4e8 solid}.server-stats .container{width:auto;max-width:1012px;padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto}@media (min-width: 544px){.server-stats .container{padding-right:40px;padding-left:40px}}@media (min-width: 1012px){.server-stats .container{padding-right:16px;padding-left:16px}}.icon-cta{padding-left:24px}.icon-cta>.octicon{float:left;width:16px;margin-top:0.1em;margin-left:-24px;color:#6a737d;text-align:center}.signup-prompt{border:1px solid rgba(27,31,35,0.075)}@media (min-width: 768px){.signup-prompt{background:url("/images/modules/site/site-signup-prompt.png");background-position:center 10%;background-size:cover}}@media (min-width: 1012px){.signup-prompt{background-position:center 30%;background-size:100% auto}}.signup-prompt-bg{background-image:linear-gradient(180deg, rgba(255,255,255,0) 50%, #fff),linear-gradient(70deg, #eaf5ff 32%, #f6fff8)}@media (min-width: 1012px){.enterprise-prompt{background:url("/images/modules/site/patterns/dots-large.svg");background-position:center 10%}} /*# sourceMappingURL=site-73680c8bae9d90e48e18affb463ea2cd.css.map */ /*! @@ -73,7 +73,7 @@

-SheetJS js-xlsx +SheetJS

Parser and writer for various spreadsheet formats. Pure-JS cleanroom implementation from official specifications, related documents, and test files. @@ -94,13 +94,12 @@ enhancements, additional features like styling, and dedicated support.

graph legend

Browser Test

-

Build Status

-

Build Status -Build Status -Coverage Status -Dependencies Status -npm Downloads -Analytics

+

Build Status

+

Build Status +Coverage Status +Dependencies Status +npm Downloads +Analytics

Table of Contents

@@ -281,7 +280,7 @@ enhancements, additional features like styling, and dedicated support.

Installation

In the browser, just add a script tag:

-
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
+
<script lang="javascript" src="dist/xlsx.full.min.js"></script>
CDN Availability (click to show) @@ -311,7 +310,7 @@ enhancements, additional features like styling, and dedicated support.

unpkg makes the latest version available at:

-
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
+
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>

With npm:

$ npm install xlsx
@@ -352,6 +351,7 @@ enhancements, additional features like styling, and dedicated support.

  • Adobe ExtendScript
  • Headless Browsers
  • canvas-datagrid
  • +
  • x-spreadsheet
  • Swift JSC and other engines
  • "serverless" functions
  • internet explorer
  • @@ -365,27 +365,27 @@ enhancements, additional features like styling, and dedicated support.

    of these modules are rather large in size and are only needed in special circumstances, so they do not ship with the core. For browser use, they must be included directly:

    -
    <!-- international support from js-codepage -->
    -<script src="dist/cpexcel.js"></script>
    +
    <!-- international support from js-codepage -->
    +<script src="dist/cpexcel.js"></script>

    An appropriate version for each dependency is included in the dist/ directory.

    The complete single-file version is generated at dist/xlsx.full.min.js

    A slimmer build with XLSX / HTML support is generated at dist/xlsx.mini.min.js

    Webpack and Browserify builds include optional modules by default. Webpack can be configured to remove support with resolve.alias:

    -
      /* uncomment the lines below to remove support */
    -  resolve: {
    -    alias: { "./dist/cpexcel.js": "" } // <-- omit international support
    -  }
    +
      /* uncomment the lines below to remove support */
    +  resolve: {
    +    alias: { "./dist/cpexcel.js": "" } // <-- omit international support
    +  }

    ECMAScript 5 Compatibility

    Since the library uses functions like Array#forEach, older browsers require -shims to provide missing functions.

    +shims to provide missing functions.

    To use the shim, add the shim before the script tag that loads xlsx.js:

    -
    <!-- add the shim first -->
    -<script type="text/javascript" src="shim.min.js"></script>
    -<!-- after the shim is referenced, add the library -->
    -<script type="text/javascript" src="xlsx.full.min.js"></script>
    +
    <!-- add the shim first -->
    +<script type="text/javascript" src="shim.min.js"></script>
    +<!-- after the shim is referenced, add the library -->
    +<script type="text/javascript" src="xlsx.full.min.js"></script>

    The script also includes IE_LoadFile and IE_SaveFile for loading and saving files in Internet Explorer versions 6-9. The xlsx.extendscript.js script bundles the shim in a format suitable for Photoshop and other Adobe products.

    @@ -397,11 +397,11 @@ bundles the shim in a format suitable for Photoshop and other Adobe products.

    -

    To promote a format-agnostic view, js-xlsx starts from a pure-JS representation +

    To promote a format-agnostic view, SheetJS starts from a pure-JS representation that we call the "Common Spreadsheet Format". Emphasizing a uniform object representation enables new features like format -conversion (reading an XLSX template and saving as XLS) and circumvents the -"class trap". By abstracting the complexities of the various formats, tools +conversion (reading an XLSX template and saving as XLS) and circumvents the mess +of classes. By abstracting the complexities of the various formats, tools need not worry about the specific file type!

    A simple object representation combined with careful coding practices enables use cases in older browsers and in alternative environments like ExtendScript @@ -428,97 +428,97 @@ data and feeding it into the library. Here are a few common scenarios:

    nodejs read a file (click to show)

    readFile is only available in server environments. Browsers have no API for reading arbitrary files given a path, so another strategy must be used.

    -
    if(typeof require !== 'undefined') XLSX = require('xlsx');
    -var workbook = XLSX.readFile('test.xlsx');
    -/* DO SOMETHING WITH workbook HERE */
    +
    if(typeof require !== 'undefined') XLSX = require('xlsx');
    +var workbook = XLSX.readFile('test.xlsx');
    +/* DO SOMETHING WITH workbook HERE */
    Photoshop ExtendScript read a file (click to show)

    readFile wraps the File logic in Photoshop and other ExtendScript targets. The specified path should be an absolute path:

    -
    #include "xlsx.extendscript.js"
    -/* Read test.xlsx from the Documents folder */
    -var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx');
    -/* DO SOMETHING WITH workbook HERE */
    +
    #include "xlsx.extendscript.js"
    +/* Read test.xlsx from the Documents folder */
    +var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx');
    +/* DO SOMETHING WITH workbook HERE */

    The extendscript demo includes a more complex example.

    Browser read TABLE element from page (click to show)

    The table_to_book and table_to_sheet utility functions take a DOM TABLE element and iterate through the child nodes.

    -
    var workbook = XLSX.utils.table_to_book(document.getElementById('tableau'));
    -/* DO SOMETHING WITH workbook HERE */
    +
    var workbook = XLSX.utils.table_to_book(document.getElementById('tableau'));
    +/* DO SOMETHING WITH workbook HERE */

    Multiple tables on a web page can be converted to individual worksheets:

    -
    /* create new workbook */
    -var workbook = XLSX.utils.book_new();
    +
    /* create new workbook */
    +var workbook = XLSX.utils.book_new();
     
    -/* convert table 'table1' to worksheet named "Sheet1" */
    -var ws1 = XLSX.utils.table_to_sheet(document.getElementById('table1'));
    -XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
    +/* convert table 'table1' to worksheet named "Sheet1" */
    +var ws1 = XLSX.utils.table_to_sheet(document.getElementById('table1'));
    +XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
     
    -/* convert table 'table2' to worksheet named "Sheet2" */
    -var ws2 = XLSX.utils.table_to_sheet(document.getElementById('table2'));
    -XLSX.utils.book_append_sheet(workbook, ws2, "Sheet2");
    +/* convert table 'table2' to worksheet named "Sheet2" */
    +var ws2 = XLSX.utils.table_to_sheet(document.getElementById('table2'));
    +XLSX.utils.book_append_sheet(workbook, ws2, "Sheet2");
     
    -/* workbook now has 2 worksheets */
    +/* workbook now has 2 worksheets */

    Alternatively, the HTML code can be extracted and parsed:

    -
    var htmlstr = document.getElementById('tableau').outerHTML;
    -var workbook = XLSX.read(htmlstr, {type:'string'});
    +
    var htmlstr = document.getElementById('tableau').outerHTML;
    +var workbook = XLSX.read(htmlstr, {type:'string'});
    Browser download file (ajax) (click to show)

    Note: for a more complete example that works in older browsers, check the demo -at http://oss.sheetjs.com/js-xlsx/ajax.html. The xhr demo +at http://oss.sheetjs.com/sheetjs/ajax.html. The xhr demo includes more examples with XMLHttpRequest and fetch.

    -
    var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
    +
    var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
     
    -/* set up async GET request */
    -var req = new XMLHttpRequest();
    -req.open("GET", url, true);
    -req.responseType = "arraybuffer";
    +/* set up async GET request */
    +var req = new XMLHttpRequest();
    +req.open("GET", url, true);
    +req.responseType = "arraybuffer";
     
    -req.onload = function(e) {
    -  var data = new Uint8Array(req.response);
    -  var workbook = XLSX.read(data, {type:"array"});
    +req.onload = function(e) {
    +  var data = new Uint8Array(req.response);
    +  var workbook = XLSX.read(data, {type:"array"});
     
    -  /* DO SOMETHING WITH workbook HERE */
    -}
    +  /* DO SOMETHING WITH workbook HERE */
    +}
     
    -req.send();
    +req.send();
    Browser drag-and-drop (click to show)

    Drag-and-drop uses the HTML5 FileReader API.

    -
    function handleDrop(e) {
    -  e.stopPropagation(); e.preventDefault();
    -  var files = e.dataTransfer.files, f = files[0];
    -  var reader = new FileReader();
    -  reader.onload = function(e) {
    -    var data = new Uint8Array(e.target.result);
    -    var workbook = XLSX.read(data, {type: 'array'});
    +
    function handleDrop(e) {
    +  e.stopPropagation(); e.preventDefault();
    +  var files = e.dataTransfer.files, f = files[0];
    +  var reader = new FileReader();
    +  reader.onload = function(e) {
    +    var data = new Uint8Array(e.target.result);
    +    var workbook = XLSX.read(data, {type: 'array'});
     
    -    /* DO SOMETHING WITH workbook HERE */
    -  };
    -  reader.readAsArrayBuffer(f);
    -}
    -drop_dom_element.addEventListener('drop', handleDrop, false);
    + /* DO SOMETHING WITH workbook HERE */ + }; + reader.readAsArrayBuffer(f); +} +drop_dom_element.addEventListener('drop', handleDrop, false);
    Browser file upload form element (click to show)

    Data from file input elements can be processed using the same FileReader API as in the drag-and-drop example:

    -
    function handleFile(e) {
    -  var files = e.target.files, f = files[0];
    -  var reader = new FileReader();
    -  reader.onload = function(e) {
    -    var data = new Uint8Array(e.target.result);
    -    var workbook = XLSX.read(data, {type: 'array'});
    +
    function handleFile(e) {
    +  var files = e.target.files, f = files[0];
    +  var reader = new FileReader();
    +  reader.onload = function(e) {
    +    var data = new Uint8Array(e.target.result);
    +    var workbook = XLSX.read(data, {type: 'array'});
     
    -    /* DO SOMETHING WITH workbook HERE */
    -  };
    -  reader.readAsArrayBuffer(f);
    -}
    -input_dom_element.addEventListener('change', handleFile, false);
    + /* DO SOMETHING WITH workbook HERE */ + }; + reader.readAsArrayBuffer(f); +} +input_dom_element.addEventListener('change', handleFile, false);

    The oldie demo shows an IE-compatible fallback scenario.

    More specialized cases, including mobile app file processing, are covered in the @@ -527,7 +527,7 @@ as in the drag-and-drop example:

    Parsing Examples

    Note that older versions of IE do not support HTML5 File API, so the Base64 mode is used for testing.

    @@ -541,7 +541,7 @@ is used for testing.

    Streaming Read

    @@ -560,39 +560,39 @@ and process the whole thing at the end. This can be done with a temporary file or by explicitly concatenating the stream:

    Explicitly concatenating streams (click to show) -
    var fs = require('fs');
    -var XLSX = require('xlsx');
    -function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
    -  var buffers = [];
    -  stream.on('data', function(data) { buffers.push(data); });
    -  stream.on('end', function() {
    -    var buffer = Buffer.concat(buffers);
    -    var workbook = XLSX.read(buffer, {type:"buffer"});
    +
    var fs = require('fs');
    +var XLSX = require('xlsx');
    +function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
    +  var buffers = [];
    +  stream.on('data', function(data) { buffers.push(data); });
    +  stream.on('end', function() {
    +    var buffer = Buffer.concat(buffers);
    +    var workbook = XLSX.read(buffer, {type:"buffer"});
     
    -    /* DO SOMETHING WITH workbook IN THE CALLBACK */
    -    cb(workbook);
    -  });
    -}
    + /* DO SOMETHING WITH workbook IN THE CALLBACK */ + cb(workbook); + }); +}

    More robust solutions are available using modules like concat-stream.

    Writing to filesystem first (click to show)

    This example uses tempfile to generate file names:

    -
    var fs = require('fs'), tempfile = require('tempfile');
    -var XLSX = require('xlsx');
    -function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
    -  var fname = tempfile('.sheetjs');
    -  console.log(fname);
    -  var ostream = fs.createWriteStream(fname);
    -  stream.pipe(ostream);
    -  ostream.on('finish', function() {
    -    var workbook = XLSX.readFile(fname);
    -    fs.unlinkSync(fname);
    +
    var fs = require('fs'), tempfile = require('tempfile');
    +var XLSX = require('xlsx');
    +function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
    +  var fname = tempfile('.sheetjs');
    +  console.log(fname);
    +  var ostream = fs.createWriteStream(fname);
    +  stream.pipe(ostream);
    +  ostream.on('finish', function() {
    +    var workbook = XLSX.readFile(fname);
    +    fs.unlinkSync(fname);
     
    -    /* DO SOMETHING WITH workbook IN THE CALLBACK */
    -    cb(workbook);
    -  });
    -}
    + /* DO SOMETHING WITH workbook IN THE CALLBACK */ + cb(workbook); + }); +}

    Working with the Workbook

    @@ -600,41 +600,41 @@ or by explicitly concatenating the stream:

    Reading a specific cell (click to show)

    This example extracts the value stored in cell A1 from the first worksheet:

    -
    var first_sheet_name = workbook.SheetNames[0];
    -var address_of_cell = 'A1';
    +
    var first_sheet_name = workbook.SheetNames[0];
    +var address_of_cell = 'A1';
     
    -/* Get worksheet */
    -var worksheet = workbook.Sheets[first_sheet_name];
    +/* Get worksheet */
    +var worksheet = workbook.Sheets[first_sheet_name];
     
    -/* Find desired cell */
    -var desired_cell = worksheet[address_of_cell];
    +/* Find desired cell */
    +var desired_cell = worksheet[address_of_cell];
     
    -/* Get the value */
    -var desired_value = (desired_cell ? desired_cell.v : undefined);
    +/* Get the value */ +var desired_value = (desired_cell ? desired_cell.v : undefined);
    Adding a new worksheet to a workbook (click to show)

    This example uses XLSX.utils.aoa_to_sheet to make a sheet and XLSX.utils.book_append_sheet to append the sheet to the workbook:

    -
    var ws_name = "SheetJS";
    +
    var ws_name = "SheetJS";
     
    -/* make worksheet */
    -var ws_data = [
    -  [ "S", "h", "e", "e", "t", "J", "S" ],
    -  [  1 ,  2 ,  3 ,  4 ,  5 ]
    -];
    -var ws = XLSX.utils.aoa_to_sheet(ws_data);
    +/* make worksheet */
    +var ws_data = [
    +  [ "S", "h", "e", "e", "t", "J", "S" ],
    +  [  1 ,  2 ,  3 ,  4 ,  5 ]
    +];
    +var ws = XLSX.utils.aoa_to_sheet(ws_data);
     
    -/* Add the worksheet to the workbook */
    -XLSX.utils.book_append_sheet(wb, ws, ws_name);
    +/* Add the worksheet to the workbook */ +XLSX.utils.book_append_sheet(wb, ws, ws_name);
    Creating a new workbook from scratch (click to show)

    The workbook object contains a SheetNames array of names and a Sheets object mapping sheet names to sheet objects. The XLSX.utils.book_new utility function creates a new workbook object:

    -
    /* create a new blank workbook */
    -var wb = XLSX.utils.book_new();
    +
    /* create a new blank workbook */
    +var wb = XLSX.utils.book_new();

    The new workbook is blank and contains no worksheets. The write functions will error if the workbook is empty.

    @@ -645,7 +645,7 @@ error if the workbook is empty.

    http://sheetjs.com/demos/modify.html read + modify + write files

  • -

    https://github.com/SheetJS/js-xlsx/blob/master/bin/xlsx.njs node

    +

    https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs node

  • The node version installs a command line tool xlsx which can read spreadsheet @@ -673,45 +673,45 @@ Assuming workbook is a workbook object:

    nodejs write a file (click to show)

    XLSX.writeFile uses fs.writeFileSync in server environments:

    -
    if(typeof require !== 'undefined') XLSX = require('xlsx');
    -/* output format determined by filename */
    -XLSX.writeFile(workbook, 'out.xlsb');
    -/* at this point, out.xlsb is a file that you can distribute */
    +
    if(typeof require !== 'undefined') XLSX = require('xlsx');
    +/* output format determined by filename */
    +XLSX.writeFile(workbook, 'out.xlsb');
    +/* at this point, out.xlsb is a file that you can distribute */
    Photoshop ExtendScript write a file (click to show)

    writeFile wraps the File logic in Photoshop and other ExtendScript targets. The specified path should be an absolute path:

    -
    #include "xlsx.extendscript.js"
    -/* output format determined by filename */
    -XLSX.writeFile(workbook, 'out.xlsx');
    -/* at this point, out.xlsx is a file that you can distribute */
    +
    #include "xlsx.extendscript.js"
    +/* output format determined by filename */
    +XLSX.writeFile(workbook, 'out.xlsx');
    +/* at this point, out.xlsx is a file that you can distribute */

    The extendscript demo includes a more complex example.

    Browser add TABLE element to page (click to show)

    The sheet_to_html utility function generates HTML code that can be added to any DOM element.

    -
    var worksheet = workbook.Sheets[workbook.SheetNames[0]];
    -var container = document.getElementById('tableau');
    -container.innerHTML = XLSX.utils.sheet_to_html(worksheet);
    +
    var worksheet = workbook.Sheets[workbook.SheetNames[0]];
    +var container = document.getElementById('tableau');
    +container.innerHTML = XLSX.utils.sheet_to_html(worksheet);
    Browser upload file (ajax) (click to show)

    A complete example using XHR is included in the XHR demo, along with examples for fetch and wrapper libraries. This example assumes the server can handle Base64-encoded files (see the demo for a basic nodejs server):

    -
    /* in this example, send a base64 string to the server */
    -var wopts = { bookType:'xlsx', bookSST:false, type:'base64' };
    +
    /* in this example, send a base64 string to the server */
    +var wopts = { bookType:'xlsx', bookSST:false, type:'base64' };
     
    -var wbout = XLSX.write(workbook,wopts);
    +var wbout = XLSX.write(workbook,wopts);
     
    -var req = new XMLHttpRequest();
    -req.open("POST", "/upload", true);
    -var formdata = new FormData();
    -formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name
    -formdata.append('data', wbout); // <-- `data` holds the base64-encoded data
    -req.send(formdata);
    +var req = new XMLHttpRequest(); +req.open("POST", "/upload", true); +var formdata = new FormData(); +formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name +formdata.append('data', wbout); // <-- `data` holds the base64-encoded data +req.send(formdata);
    Browser save file (click to show) @@ -727,9 +727,9 @@ by creating a link and forcing a click. It is supported in modern browsers. XP and Windows 7. The shim must be included in the containing HTML page.

    There is no standard way to determine if the actual file has been downloaded.

    -
    /* output format determined by filename */
    -XLSX.writeFile(workbook, 'out.xlsb');
    -/* at this point, out.xlsb will have been downloaded */
    +
    /* output format determined by filename */
    +XLSX.writeFile(workbook, 'out.xlsb');
    +/* at this point, out.xlsb will have been downloaded */
    Browser save file (compatibility) (click to show) @@ -737,22 +737,22 @@ XP and Windows 7. The shim must be included in the containing HTML page. For much older browsers, there are workarounds implemented by wrapper libraries.

    FileSaver.js implements saveAs. Note: XLSX.writeFile will automatically call saveAs if available.

    -
    /* bookType can be any supported output type */
    -var wopts = { bookType:'xlsx', bookSST:false, type:'array' };
    +
    /* bookType can be any supported output type */
    +var wopts = { bookType:'xlsx', bookSST:false, type:'array' };
     
    -var wbout = XLSX.write(workbook,wopts);
    +var wbout = XLSX.write(workbook,wopts);
     
    -/* the saveAs call downloads a file on the local machine */
    -saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx");
    +/* the saveAs call downloads a file on the local machine */ +saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx");

    Downloadify uses a Flash SWF button to generate local files, suitable for environments where ActiveX is unavailable:

    -
    Downloadify.create(id,{
    -	/* other options are required! read the downloadify docs for more info */
    -	filename: "test.xlsx",
    -	data: function() { return XLSX.write(wb, {bookType:"xlsx", type:'base64'}); },
    -	append: false,
    -	dataType: 'base64'
    -});
    +
    Downloadify.create(id,{
    +	/* other options are required! read the downloadify docs for more info */
    +	filename: "test.xlsx",
    +	data: function() { return XLSX.write(wb, {bookType:"xlsx", type:'base64'}); },
    +	append: false,
    +	dataType: 'base64'
    +});

    The oldie demo shows an IE-compatible fallback scenario.

    The included demos cover mobile apps and other special deployments.

    @@ -779,20 +779,20 @@ Stream. They are only exposed in NodeJS.

    nodejs convert to CSV and write file (click to show) -
    var output_file_name = "out.csv";
    -var stream = XLSX.stream.to_csv(worksheet);
    -stream.pipe(fs.createWriteStream(output_file_name));
    +
    var output_file_name = "out.csv";
    +var stream = XLSX.stream.to_csv(worksheet);
    +stream.pipe(fs.createWriteStream(output_file_name));
    nodejs write JSON stream to screen (click to show) -
    /* to_json returns an object-mode stream */
    -var stream = XLSX.stream.to_json(worksheet, {raw:true});
    +
    /* to_json returns an object-mode stream */
    +var stream = XLSX.stream.to_json(worksheet, {raw:true});
     
    -/* the following stream converts JS objects to text via JSON.stringify */
    -var conv = new Transform({writableObjectMode:true});
    -conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };
    +/* the following stream converts JS objects to text via JSON.stringify */
    +var conv = new Transform({writableObjectMode:true});
    +conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };
     
    -stream.pipe(conv); conv.pipe(process.stdout);
    +stream.pipe(conv); conv.pipe(process.stdout);

    https://github.com/sheetjs/sheetaki pipes write streams to nodejs response.

    @@ -859,7 +859,7 @@ If o is omitted, the writer will use the third argument as the call

    Common Spreadsheet Format

    -

    js-xlsx conforms to the Common Spreadsheet Format (CSF):

    +

    SheetJS conforms to the Common Spreadsheet Format (CSF):

    General Structures

    Cell address objects are stored as {c:C, r:R} where C and R are 0-indexed @@ -869,13 +869,13 @@ represented by the object {c:1, r:4}.

    E is the last cell in the range. The ranges are inclusive. For example, the range A3:B7 is represented by the object {s:{c:0, r:2}, e:{c:1, r:6}}. Utility functions perform a row-major order walk traversal of a sheet range:

    -
    for(var R = range.s.r; R <= range.e.r; ++R) {
    -  for(var C = range.s.c; C <= range.e.c; ++C) {
    -    var cell_address = {c:C, r:R};
    -    /* if an A1-style address is needed, encode the address */
    -    var cell_ref = XLSX.utils.encode_cell(cell_address);
    -  }
    -}
    +
    for(var R = range.s.r; R <= range.e.r; ++R) {
    +  for(var C = range.s.c; C <= range.e.c; ++C) {
    +    var cell_address = {c:C, r:R};
    +    /* if an A1-style address is needed, encode the address */
    +    var cell_ref = XLSX.utils.encode_cell(cell_address);
    +  }
    +}

    Cell Object

    Cell objects are plain JS objects with keys and values following the convention:

    @@ -1067,7 +1067,7 @@ local time zone. Excel limitations prevent specifying true absolute dates.

    "1900 vs. 1904 Date System" article. The workbook's epoch can be determined by examining the workbook's wb.Workbook.WBProps.date1904 property:

    -
    !!(((wb.Workbook||{}).WBProps||{}).date1904)
    +
    !!(((wb.Workbook||{}).WBProps||{}).date1904)

    Sheet Objects

    @@ -1151,12 +1151,12 @@ but they are stored as raw measurements. The main properties are listed below: -
    /* Set worksheet sheet to "normal" */
    -ws["!margins"]={left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
    -/* Set worksheet sheet to "wide" */
    -ws["!margins"]={left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
    -/* Set worksheet sheet to "narrow" */
    -ws["!margins"]={left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}
    +
    /* Set worksheet sheet to "normal" */
    +ws["!margins"]={left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
    +/* Set worksheet sheet to "wide" */
    +ws["!margins"]={left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
    +/* Set worksheet sheet to "narrow" */
    +ws["!margins"]={left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}

    Worksheet Object

    @@ -1180,12 +1180,38 @@ will write all cells in the merge range if they exist, so be sure that only the first cell (upper-left) in the range is set.

  • -

    ws['!protect']: object of write sheet protection properties. The password +

    ws['!outline']: configure how outlines should behave. Options default to +the default settings in Excel 2019:

    +
  • + + + + + + + + + + + + + + + + + + + + + +
    keyExcel featuredefault
    aboveUncheck "Summary rows below detail"false
    leftUncheck "Summary rows to the right of detail"false
    +
    Worksheet Protection Details (click to show) @@ -1280,9 +1306,9 @@ sheet is locked or set to true to disable a feature:

  • ws['!autofilter']: AutoFilter object following the schema:
  • -
    type AutoFilter = {
    -  ref:string; // A-1 based range representing the AutoFilter table range
    -}
    +
    type AutoFilter = {
    +  ref:string; // A-1 based range representing the AutoFilter table range
    +}

    Chartsheet Object

    Chartsheets are represented as standard sheets. They are distinguished with the @@ -1363,14 +1389,14 @@ workbook Props object normalizes the names:

    For example, to set the workbook title property:

    -
    if(!wb.Props) wb.Props = {};
    -wb.Props.Title = "Insert Title Here";
    +
    if(!wb.Props) wb.Props = {};
    +wb.Props.Title = "Insert Title Here";

    Custom properties are added in the workbook Custprops object:

    -
    if(!wb.Custprops) wb.Custprops = {};
    -wb.Custprops["Custom Property"] = "Custom Value";
    +
    if(!wb.Custprops) wb.Custprops = {};
    +wb.Custprops["Custom Property"] = "Custom Value";

    Writers will process the Props key of the options object:

    -
    /* force the Author to be "SheetJS" */
    -XLSX.write(wb, {Props:{Author:"SheetJS"}});
    +
    /* force the Author to be "SheetJS" */
    +XLSX.write(wb, {Props:{Author:"SheetJS"}});

    Workbook-Level Attributes

    wb.Workbook stores workbook-level attributes.

    @@ -1465,12 +1491,12 @@ Even though some formats store formulae with a leading equal sign, CSF formulae do not start with =.

    Representation of A1=1, A2=2, A3=A1+A2 (click to show) -
    {
    -  "!ref": "A1:A3",
    -  A1: { t:'n', v:1 },
    -  A2: { t:'n', v:2 },
    -  A3: { t:'n', v:3, f:'A1+A2' }
    -}
    +
    {
    +  "!ref": "A1:A3",
    +  A1: { t:'n', v:1 },
    +  A2: { t:'n', v:2 },
    +  A3: { t:'n', v:3, f:'A1+A2' }
    +}

    Shared formulae are decompressed and each cell has the formula corresponding to its cell. Writers generally do not attempt to generate shared formulae.

    @@ -1479,12 +1505,12 @@ and other spreadsheet tools will recognize. This library will not automatically compute formula results! For example, to compute BESSELJ in a worksheet:

    Formula without known value (click to show) -
    {
    -  "!ref": "A1:A3",
    -  A1: { t:'n', v:3.14159 },
    -  A2: { t:'n', v:2 },
    -  A3: { t:'n', f:'BESSELJ(A1,A2)' }
    -}
    +
    {
    +  "!ref": "A1:A3",
    +  A1: { t:'n', v:3.14159 },
    +  A2: { t:'n', v:2 },
    +  A3: { t:'n', f:'BESSELJ(A1,A2)' }
    +}

    Array Formulae

    Array formulae are stored in the top-left cell of the array block. All cells @@ -1493,12 +1519,12 @@ formula can be distinguished from a plain formula by the presence of F

    Array Formula examples (click to show)

    For example, setting the cell C1 to the array formula {=SUM(A1:A3*B1:B3)}:

    -
    worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };
    +
    worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };

    For a multi-cell array formula, every cell has the same array range but only the first cell specifies the formula. Consider D1:D3=A1:A3*B1:B3:

    -
    worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
    -worksheet['D2'] = { t:'n', F:"D1:D3" };
    -worksheet['D3'] = { t:'n', F:"D1:D3" };
    +
    worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
    +worksheet['D2'] = { t:'n', F:"D1:D3" };
    +worksheet['D3'] = { t:'n', F:"D1:D3" };

    Utilities and writers are expected to check for the presence of a F field and ignore any possible formula element f in cells other than the starting cell. @@ -1525,26 +1551,26 @@ prefixed with an apostrophe ', consistent with Excel's formula bar A1-style strings XLSX -⭕️ -⭕️ + + RC-style strings XLML and plain text -⭕️ -⭕️ + + BIFF Parsed formulae XLSB and all XLS formats -⭕️ + OpenFormula formulae ODS/FODS/UOS -⭕️ -⭕️ + + @@ -1557,18 +1583,18 @@ with regular expressions.

    Column Properties

    The !cols array in each worksheet, if present, is a collection of ColInfo objects which have the following properties:

    -
    type ColInfo = {
    -  /* visibility */
    -  hidden?: boolean; // if true, the column is hidden
    +
    type ColInfo = {
    +  /* visibility */
    +  hidden?: boolean; // if true, the column is hidden
     
    -  /* column width is specified in one of the following ways: */
    -  wpx?:    number;  // width in screen pixels
    -  width?:  number;  // width in Excel's "Max Digit Width", width*256 is integral
    -  wch?:    number;  // width in characters
    +  /* column width is specified in one of the following ways: */
    +  wpx?:    number;  // width in screen pixels
    +  width?:  number;  // width in Excel's "Max Digit Width", width*256 is integral
    +  wch?:    number;  // width in characters
     
    -  /* other fields for preserving features from files */
    -  MDW?:    number;  // Excel's "Max Digit Width" unit, always integral
    -};
    + /* other fields for preserving features from files */ + MDW?: number; // Excel's "Max Digit Width" unit, always integral +};
    Why are there three width types? (click to show)

    There are three different width types corresponding to the three different ways @@ -1609,16 +1635,16 @@ follow the priority order:

    Row Properties

    The !rows array in each worksheet, if present, is a collection of RowInfo objects which have the following properties:

    -
    type RowInfo = {
    -  /* visibility */
    -  hidden?: boolean; // if true, the row is hidden
    +
    type RowInfo = {
    +  /* visibility */
    +  hidden?: boolean; // if true, the row is hidden
     
    -  /* row height is specified in one of the following ways: */
    -  hpx?:    number;  // height in screen pixels
    -  hpt?:    number;  // height in points
    +  /* row height is specified in one of the following ways: */
    +  hpx?:    number;  // height in screen pixels
    +  hpt?:    number;  // height in points
     
    -  level?:  number;  // 0-indexed outline / group level
    -};
    + level?: number; // 0-indexed outline / group level +};

    Note: Excel UI displays the base outline level as 1 and the max level as 8. The level field stores the base outline as 0 and the max level as 7.

    @@ -1645,17 +1671,17 @@ somewhere in the table. Excel convention mandates that the custom formats start at index 164. The following example creates a custom format from scratch:

    New worksheet with custom format (click to show) -
    var wb = {
    -  SheetNames: ["Sheet1"],
    -  Sheets: {
    -    Sheet1: {
    -      "!ref":"A1:C1",
    -      A1: { t:"n", v:10000 },                    // <-- General format
    -      B1: { t:"n", v:10000, z: "0%" },           // <-- Builtin format
    -      C1: { t:"n", v:10000, z: "\"T\"\ #0.00" }  // <-- Custom format
    -    }
    -  }
    -}
    +
    var wb = {
    +  SheetNames: ["Sheet1"],
    +  Sheets: {
    +    Sheet1: {
    +      "!ref":"A1:C1",
    +      A1: { t:"n", v:10000 },                    // <-- General format
    +      B1: { t:"n", v:10000, z: "0%" },           // <-- Builtin format
    +      C1: { t:"n", v:10000, z: "\"T\"\ #0.00" }  // <-- Custom format
    +    }
    +  }
    +}

    The rules are slightly different from how Excel displays custom number formats. In particular, literal characters must be wrapped in double quotes or preceded @@ -1802,12 +1828,12 @@ are stored in the Tooltip field and are displayed when you move you over the text.

    For example, the following snippet creates a link from cell A3 to http://sheetjs.com with the tip "Find us @ SheetJS.com!":

    -
    ws['A3'].l = { Target:"http://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };
    +
    ws['A3'].l = { Target:"http://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

    Note that Excel does not automatically style hyperlinks -- they will generally be displayed as normal text.

    Links where the target is a cell or range or defined name in the same workbook ("Internal Links") are marked with a leading hash character:

    -
    ws['A2'].l = { Target:"#E2" }; /* link to cell E2 */
    +
    ws['A2'].l = { Target:"#E2" }; /* link to cell E2 */

    Cell Comments

    Cell comments are objects stored in the c array of cell objects. The actual @@ -1815,17 +1841,17 @@ contents of the comment are split into blocks based on the comment author. The a field of each comment object is the author of the comment and the t field is the plain text representation.

    For example, the following snippet appends a cell comment into cell A1:

    -
    if(!ws.A1.c) ws.A1.c = [];
    -ws.A1.c.push({a:"SheetJS", t:"I'm a little comment, short and stout!"});
    +
    if(!ws.A1.c) ws.A1.c = [];
    +ws.A1.c.push({a:"SheetJS", t:"I'm a little comment, short and stout!"});

    Note: XLSB enforces a 54 character limit on the Author name. Names longer than 54 characters may cause issues with other formats.

    To mark a comment as normally hidden, set the hidden property:

    -
    if(!ws.A1.c) ws.A1.c = [];
    -ws.A1.c.push({a:"SheetJS", t:"This comment is visible"});
    +
    if(!ws.A1.c) ws.A1.c = [];
    +ws.A1.c.push({a:"SheetJS", t:"This comment is visible"});
     
    -if(!ws.A2.c) ws.A2.c = [];
    -ws.A2.c.hidden = true;
    -ws.A2.c.push({a:"SheetJS", t:"This comment will be hidden"});
    +if(!ws.A2.c) ws.A2.c = []; +ws.A2.c.hidden = true; +ws.A2.c.push({a:"SheetJS", t:"This comment will be hidden"});

    Sheet Visibility

    Excel enables hiding sheets in the lower tab bar. The sheet data is stored in @@ -1857,13 +1883,13 @@ cannot be revealed in the menu. It is only accessible in the VB Editor!

    -

    With https://rawgit.com/SheetJS/test_files/master/sheet_visibility.xlsx:

    -
    > wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
    -[ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]
    +

    With https://rawgit.com/SheetJS/test_files/HEAD/sheet_visibility.xlsx:

    +
    > wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
    +[ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]

    Non-Excel formats do not support the Very Hidden state. The best way to test if a sheet is visible is to check if the Hidden property is logical truth:

    -
    > wb.Workbook.Sheets.map(function(x) { return [x.name, !x.Hidden] })
    -[ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]
    +
    > wb.Workbook.Sheets.map(function(x) { return [x.name, !x.Hidden] })
    +[ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]

    VBA and Macros

    @@ -1890,11 +1916,11 @@ property set to "macro".

    Detecting macros in workbooks (click to show)

    The vbaraw field will only be set if macros are present, so testing is simple:

    -
    function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
    -	if(!!wb.vbaraw) return true;
    -	const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
    -	return sheets.some((ws) => !!ws && ws['!type']=='macro');
    -}
    +
    function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
    +	if(!!wb.vbaraw) return true;
    +	const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
    +	return sheets.some((ws) => !!ws && ws['!type']=='macro');
    +}

    Parsing Options

    @@ -2008,6 +2034,16 @@ property set to "macro".

    If specified, only parse specified sheets ** + +PRN +false +If true, allow parsing of PRN files ** + + +xlfn +false +If true, preserve _xlfn. prefixes in formulae ** +
      @@ -2049,11 +2085,15 @@ new XLSB-compatible blob from the XLS CFB container.
    • codepage is applied to BIFF2 - BIFF5 files without CodePage records and to CSV files without BOM in type:"binary". BIFF8 XLS always defaults to 1200.
    • +
    • +PRN affects parsing of text files without a common delimiter character.
    • Currently only XOR encryption is supported. Unsupported error will be thrown for files employing other encryption methods.
    • +
    • Newer Excel functions are serialized with the _xlfn. prefix, hidden from the +user. SheetJS will strip _xlfn. normally. The xlfn option preserves them.
    • WTF is mainly for development. By default, the parser will suppress read errors on single worksheets, allowing you to read from the worksheets that do -parse properly. Setting WTF:1 forces those errors to be thrown.
    • +parse properly. Setting WTF:true forces those errors to be thrown.

    Input Type

    @@ -2248,8 +2288,8 @@ Excel into thinking that the file is potentially a CSV or TSV file, even if it is only one column! This library attempts to replicate that behavior.

    The best approach is to validate the desired worksheet and ensure it has the expected number of rows or columns. Extracting the range is extremely simple:

    -
    var range = XLSX.utils.decode_range(worksheet['!ref']);
    -var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;
    +
    var range = XLSX.utils.decode_range(worksheet['!ref']);
    +var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;

    Writing Options

    @@ -2566,11 +2606,11 @@ other values are stored as strings. The function takes an options argument:

    Examples (click to show)

    To generate the example sheet:

    -
    var ws = XLSX.utils.aoa_to_sheet([
    -  "SheetJS".split(""),
    -  [1,2,3,4,5,6,7],
    -  [2,3,4,5,6,7,8]
    -]);
    +
    var ws = XLSX.utils.aoa_to_sheet([
    +  "SheetJS".split(""),
    +  [1,2,3,4,5,6,7],
    +  [2,3,4,5,6,7,8]
    +]);

    XLSX.utils.sheet_add_aoa takes an array of arrays of JS values and updates an existing worksheet object. It follows the same process as aoa_to_sheet and @@ -2649,17 +2689,17 @@ accepts an options argument:

    5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |

    This worksheet can be built up in the order A1:G1, A2:B4, E2:G4, A5:G5:

    -
    /* Initial row */
    -var ws = XLSX.utils.aoa_to_sheet([ "SheetJS".split("") ]);
    +
    /* Initial row */
    +var ws = XLSX.utils.aoa_to_sheet([ "SheetJS".split("") ]);
     
    -/* Write data starting at A2 */
    -XLSX.utils.sheet_add_aoa(ws, [[1,2], [2,3], [3,4]], {origin: "A2"});
    +/* Write data starting at A2 */
    +XLSX.utils.sheet_add_aoa(ws, [[1,2], [2,3], [3,4]], {origin: "A2"});
     
    -/* Write data starting at E2 */
    -XLSX.utils.sheet_add_aoa(ws, [[5,6,7], [6,7,8], [7,8,9]], {origin:{r:1, c:4}});
    +/* Write data starting at E2 */
    +XLSX.utils.sheet_add_aoa(ws, [[5,6,7], [6,7,8], [7,8,9]], {origin:{r:1, c:4}});
     
    -/* Append row */
    -XLSX.utils.sheet_add_aoa(ws, [[4,5,6,7,8,9,0]], {origin: -1});
    +/* Append row */ +XLSX.utils.sheet_add_aoa(ws, [[4,5,6,7,8,9,0]], {origin: -1});

    Array of Objects Input

    @@ -2702,16 +2742,16 @@ default column order is determined by the first appearance of the field using Examples (click to show)

    The original sheet cannot be reproduced using plain objects since JS object keys must be unique. After replacing the second e and S with e_1 and S_1:

    -
    var ws = XLSX.utils.json_to_sheet([
    -  { S:1, h:2, e:3, e_1:4, t:5, J:6, S_1:7 },
    -  { S:2, h:3, e:4, e_1:5, t:6, J:7, S_1:8 }
    -], {header:["S","h","e","e_1","t","J","S_1"]});
    +
    var ws = XLSX.utils.json_to_sheet([
    +  { S:1, h:2, e:3, e_1:4, t:5, J:6, S_1:7 },
    +  { S:2, h:3, e:4, e_1:5, t:6, J:7, S_1:8 }
    +], {header:["S","h","e","e_1","t","J","S_1"]});

    Alternatively, the header row can be skipped:

    -
    var ws = XLSX.utils.json_to_sheet([
    -  { A:"S", B:"h", C:"e", D:"e", E:"t", F:"J", G:"S" },
    -  { A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
    -  { A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
    -], {header:["A","B","C","D","E","F","G"], skipHeader:true});
    +
    var ws = XLSX.utils.json_to_sheet([
    +  { A:"S", B:"h", C:"e", D:"e", E:"t", F:"J", G:"S" },
    +  { A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
    +  { A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
    +], {header:["A","B","C","D","E","F","G"], skipHeader:true});

    XLSX.utils.sheet_add_json takes an array of objects and updates an existing worksheet object. It follows the same process as json_to_sheet and accepts @@ -2795,25 +2835,25 @@ an options argument:

    5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |

    This worksheet can be built up in the order A1:G1, A2:B4, E2:G4, A5:G5:

    -
    /* Initial row */
    -var ws = XLSX.utils.json_to_sheet([
    -  { A: "S", B: "h", C: "e", D: "e", E: "t", F: "J", G: "S" }
    -], {header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true});
    +
    /* Initial row */
    +var ws = XLSX.utils.json_to_sheet([
    +  { A: "S", B: "h", C: "e", D: "e", E: "t", F: "J", G: "S" }
    +], {header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true});
     
    -/* Write data starting at A2 */
    -XLSX.utils.sheet_add_json(ws, [
    -  { A: 1, B: 2 }, { A: 2, B: 3 }, { A: 3, B: 4 }
    -], {skipHeader: true, origin: "A2"});
    +/* Write data starting at A2 */
    +XLSX.utils.sheet_add_json(ws, [
    +  { A: 1, B: 2 }, { A: 2, B: 3 }, { A: 3, B: 4 }
    +], {skipHeader: true, origin: "A2"});
     
    -/* Write data starting at E2 */
    -XLSX.utils.sheet_add_json(ws, [
    -  { A: 5, B: 6, C: 7 }, { A: 6, B: 7, C: 8 }, { A: 7, B: 8, C: 9 }
    -], {skipHeader: true, origin: { r: 1, c: 4 }, header: [ "A", "B", "C" ]});
    +/* Write data starting at E2 */
    +XLSX.utils.sheet_add_json(ws, [
    +  { A: 5, B: 6, C: 7 }, { A: 6, B: 7, C: 8 }, { A: 7, B: 8, C: 9 }
    +], {skipHeader: true, origin: { r: 1, c: 4 }, header: [ "A", "B", "C" ]});
     
    -/* Append row */
    -XLSX.utils.sheet_add_json(ws, [
    -  { A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 }
    -], {header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true, origin: -1});
    +/* Append row */ +XLSX.utils.sheet_add_json(ws, [ + { A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 } +], {header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true, origin: -1});

    HTML Table Input

    @@ -2861,16 +2901,106 @@ as strings.

    Examples (click to show)

    To generate the example sheet, start with the HTML table:

    -
    <table id="sheetjs">
    -<tr><td>S</td><td>h</td><td>e</td><td>e</td><td>t</td><td>J</td><td>S</td></tr>
    -<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
    -<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr>
    -</table>
    +
    <table id="sheetjs">
    +<tr><td>S</td><td>h</td><td>e</td><td>e</td><td>t</td><td>J</td><td>S</td></tr>
    +<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
    +<tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr>
    +</table>

    To process the table:

    -
    var tbl = document.getElementById('sheetjs');
    -var wb = XLSX.utils.table_to_book(tbl);
    +
    var tbl = document.getElementById('sheetjs');
    +var wb = XLSX.utils.table_to_book(tbl);

    Note: XLSX.read can handle HTML represented as strings.

    +

    XLSX.utils.sheet_add_dom takes a table DOM element and updates an existing +worksheet object. It follows the same process as table_to_sheet and accepts +an options argument:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Option NameDefaultDescription
    rawIf true, every cell will hold raw strings
    dateNFFMT 14Use specified date format in string output
    cellDatesfalseStore dates as type d (default is n)
    sheetRows0If >0, read the first sheetRows rows of the table
    displayfalseIf true, hidden rows and cells will not be parsed
    +

    origin is expected to be one of:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    originDescription
    (cell object)Use specified cell (cell object)
    (string)Use specified cell (A1-style cell)
    (number >= 0)Start from the first column at specified row (0-indexed)
    -1Append to bottom of worksheet starting on first column
    (default)Start from cell A1
    +
    + Examples (click to show) +

    A small helper function can create gap rows between tables:

    +
    function create_gap_rows(ws, nrows) {
    +  var ref = XLSX.utils.decode_range(ws["!ref"]);       // get original range
    +  ref.e.r += nrows;                                    // add to ending row
    +  ws["!ref"] = XLSX.utils.encode_range(ref);           // reassign row
    +}
    +
    +/* first table */
    +var ws = XLSX.utils.table_to_sheet(document.getElementById('table1'));
    +create_gap_rows(ws, 1); // one row gap after first table
    +
    +/* second table */
    +XLSX.utils.sheet_add_dom(ws, document.getElementById('table2'), {origin: -1});
    +create_gap_rows(ws, 3); // three rows gap after second table
    +
    +/* third table */
    +XLSX.utils.sheet_add_dom(ws, document.getElementById('table3'), {origin: -1});
    +

    Formulae Output

    XLSX.utils.sheet_to_formulae generates an array of commands that represent @@ -2880,9 +3010,9 @@ accordance with Excel.

    Examples (click to show)

    For the example sheet:

    -
    > var o = XLSX.utils.sheet_to_formulae(ws);
    -> [o[0], o[5], o[10], o[15], o[20]];
    -[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]
    +
    > var o = XLSX.utils.sheet_to_formulae(ws);
    +> [o[0], o[5], o[10], o[15], o[20]];
    +[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]

    Delimiter-Separated Output

    @@ -2927,6 +3057,11 @@ produces CSV output. The function takes an options argument:

    false Skips hidden rows/columns in the CSV output + +forceQuotes +false +Force quotes around fields +
    Examples (click to show)

    For the example sheet:

    -
    > console.log(XLSX.utils.sheet_to_csv(ws));
    -S,h,e,e,t,J,S
    -1,2,3,4,5,6,7
    -2,3,4,5,6,7,8
    -> console.log(XLSX.utils.sheet_to_csv(ws, {FS:"\t"}));
    -S	h	e	e	t	J	S
    +
    > console.log(XLSX.utils.sheet_to_csv(ws));
    +S,h,e,e,t,J,S
    +1,2,3,4,5,6,7
    +2,3,4,5,6,7,8
    +> console.log(XLSX.utils.sheet_to_csv(ws, {FS:"\t"}));
    +S	h	e	e	t	J	S
     1	2	3	4	5	6	7
     2	3	4	5	6	7	8
    -> console.log(XLSX.utils.sheet_to_csv(ws,{FS:":",RS:"|"}));
    -S:h:e:e:t:J:S|1:2:3:4:5:6:7|2:3:4:5:6:7:8|
    +> console.log(XLSX.utils.sheet_to_csv(ws,{FS:":",RS:"|"})); +S:h:e:e:t:J:S|1:2:3:4:5:6:7|2:3:4:5:6:7:8|

    UTF-16 Unicode Text

    @@ -2994,8 +3131,8 @@ produces HTML output. The function takes an options argument:

    Examples (click to show)

    For the example sheet:

    -
    > console.log(XLSX.utils.sheet_to_html(ws));
    -// ...
    +
    > console.log(XLSX.utils.sheet_to_html(ws));
    +// ...

    JSON

    @@ -3117,36 +3254,36 @@ be true to generate blank rows
    Examples (click to show)

    For the example sheet:

    -
    > XLSX.utils.sheet_to_json(ws);
    -[ { S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
    -  { S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ]
    +
    > XLSX.utils.sheet_to_json(ws);
    +[ { S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
    +  { S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ]
     
    -> XLSX.utils.sheet_to_json(ws, {header:"A"});
    -[ { A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' },
    -  { A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' },
    -  { A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ]
    +> XLSX.utils.sheet_to_json(ws, {header:"A"});
    +[ { A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' },
    +  { A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' },
    +  { A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ]
     
    -> XLSX.utils.sheet_to_json(ws, {header:["A","E","I","O","U","6","9"]});
    -[ { '6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' },
    -  { '6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' },
    -  { '6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ]
    +> XLSX.utils.sheet_to_json(ws, {header:["A","E","I","O","U","6","9"]});
    +[ { '6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' },
    +  { '6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' },
    +  { '6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ]
     
    -> XLSX.utils.sheet_to_json(ws, {header:1});
    -[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
    -  [ '1', '2', '3', '4', '5', '6', '7' ],
    -  [ '2', '3', '4', '5', '6', '7', '8' ] ]
    +> XLSX.utils.sheet_to_json(ws, {header:1}); +[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ], + [ '1', '2', '3', '4', '5', '6', '7' ], + [ '2', '3', '4', '5', '6', '7', '8' ] ]

    Example showing the effect of raw:

    -
    > ws['A2'].w = "3";                          // set A2 formatted string value
    +
    > ws['A2'].w = "3";                          // set A2 formatted string value
     
    -> XLSX.utils.sheet_to_json(ws, {header:1, raw:false});
    -[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
    -  [ '3', '2', '3', '4', '5', '6', '7' ],     // <-- A2 uses the formatted string
    -  [ '2', '3', '4', '5', '6', '7', '8' ] ]
    +> XLSX.utils.sheet_to_json(ws, {header:1, raw:false});
    +[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
    +  [ '3', '2', '3', '4', '5', '6', '7' ],     // <-- A2 uses the formatted string
    +  [ '2', '3', '4', '5', '6', '7', '8' ] ]
     
    -> XLSX.utils.sheet_to_json(ws, {header:1});
    -[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
    -  [ 1, 2, 3, 4, 5, 6, 7 ],                   // <-- A2 uses the raw value
    -  [ 2, 3, 4, 5, 6, 7, 8 ] ]
    +> XLSX.utils.sheet_to_json(ws, {header:1}); +[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ], + [ 1, 2, 3, 4, 5, 6, 7 ], // <-- A2 uses the raw value + [ 2, 3, 4, 5, 6, 7, 8 ] ]

    File Formats

    @@ -3167,43 +3304,43 @@ be true to generate blank rows Excel 2007+ XML Formats (XLSX/XLSM) -⭕️ -⭕️ + + Excel 2007+ Binary Format (XLSB BIFF12) -⭕️ -⭕️ + + Excel 2003-2004 XML Format (XML "SpreadsheetML") -⭕️ -⭕️ + + Excel 97-2004 (XLS BIFF8) -⭕️ -⭕️ + + Excel 5.0/95 (XLS BIFF5) -⭕️ -⭕️ + + Excel 4.0 (XLS/XLW BIFF4) -⭕️ + Excel 3.0 (XLS BIFF3) -⭕️ + Excel 2.0/2.1 (XLS BIFF2) -⭕️ -⭕️ + + Excel Supported Text Formats @@ -3212,28 +3349,28 @@ be true to generate blank rows Delimiter-Separated Values (CSV/TXT) -⭕️ -⭕️ + + Data Interchange Format (DIF) -⭕️ -⭕️ + + Symbolic Link (SYLK/SLK) -⭕️ -⭕️ + + Lotus Formatted Text (PRN) -⭕️ -⭕️ + + UTF-16 Unicode Text (TXT) -⭕️ -⭕️ + + Other Workbook/Worksheet Formats @@ -3242,32 +3379,32 @@ be true to generate blank rows OpenDocument Spreadsheet (ODS) -⭕️ -⭕️ + + Flat XML ODF Spreadsheet (FODS) -⭕️ -⭕️ + + Uniform Office Format Spreadsheet (标文通 UOS1/UOS2) -⭕️ + dBASE II/III/IV / Visual FoxPro (DBF) -⭕️ -⭕️ + + Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123) -⭕️ + Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW) -⭕️ + @@ -3277,18 +3414,18 @@ be true to generate blank rows HTML Tables -⭕️ -⭕️ + + Rich Text Format tables (RTF) -⭕️ + Ethercalc Record Format (ETH) -⭕️ -⭕️ + + @@ -3581,18 +3718,12 @@ $ open -a Chromium.app http://localhost:8000/stress.html
  • Safari 6+ (iOS and Desktop)
  • Edge 13+, FF 18+, and Opera 12+
  • -

    Tests utilize the mocha testing framework. Travis-CI and Sauce Labs links:

    +

    Tests utilize the mocha testing framework.

    -

    The Travis-CI test suite also includes tests for various time zones. To change +

    The test suite also includes tests for various time zones. To change the timezone locally, set the TZ environment variable:

    $ env TZ="Asia/Kolkata" WTF=1 make test_misc
    diff --git a/legend.png b/legend.png new file mode 100644 index 0000000..9719f96 Binary files /dev/null and b/legend.png differ